diff --git a/src/worker/async-store.js b/src/worker/async-store.js index 82a9e8688..552466b99 100644 --- a/src/worker/async-store.js +++ b/src/worker/async-store.js @@ -1864,11 +1864,9 @@ const factory = (ApiConfig = {}, Sortify, UserObject, ProxyManager, postMessage(clientId, "PAD_CACHE"); }, onCacheReady: function () { - console.error('PAD CACHE READY'); postMessage(clientId, "PAD_CACHE_READY"); }, onReady: function (pad) { - console.error('PAD READY'); var padData = pad.metadata || {}; channel.data = padData; if (padData && padData.validateKey && store.messenger) { @@ -2780,7 +2778,6 @@ const factory = (ApiConfig = {}, Sortify, UserObject, ProxyManager, addSharedFolderHandler(); userObject.migrate(waitFor()); }).nThen(function (waitFor) { - console.error('START LOADING SF'); var network = store.network || store.networkPromise; SF.loadSharedFolders(Store, network, store, drive.proxy, userObject, waitFor, obj => { @@ -2791,11 +2788,8 @@ const factory = (ApiConfig = {}, Sortify, UserObject, ProxyManager, postMessage(clientId, 'LOADING_DRIVE', data); }, true); }).nThen(function (waitFor) { - console.error('SF CACHE READY'); - loadUniversal(Team, 'team', waitFor, clientId); }).nThen(function (waitFor) { - console.error('TEAM CACHE READY'); loadUniversal(Calendar, 'calendar', waitFor); }).nThen(function () { cb(); @@ -2877,7 +2871,6 @@ const factory = (ApiConfig = {}, Sortify, UserObject, ProxyManager, if (store.modules['team']) { store.modules['team'].onReady(waitFor); } loadUniversal(Support, 'support', waitFor); }).nThen(function () { - console.error('SF & TEAM READY'); var requestLogin = function () { broadcast([], "REQUEST_LOGIN"); }; diff --git a/src/worker/components/drive.ts b/src/worker/components/drive.ts index d5afb7aed..ce9c43ec4 100644 --- a/src/worker/components/drive.ts +++ b/src/worker/components/drive.ts @@ -23,7 +23,6 @@ const init = (config) => { const drive = store.drive = store.drive || {}; let data = store.proxy?.drive; - console.error(data, store.proxy); const hash:string = data?.hash || Hash.createRandomHash('drive'); // Update loading screen status diff --git a/src/worker/core/sw-connector.js b/src/worker/core/sw-connector.js index 9f8a19af7..1a371cffe 100644 --- a/src/worker/core/sw-connector.js +++ b/src/worker/core/sw-connector.js @@ -16,11 +16,9 @@ let start = (setConfig) => { }; globalThis.window = globalThis; addEventListener('connect', (e) => { - console.error("TEST"); console.debug('New SharedWorker client'); const port = e.ports[0]; const postMsg = (data) => { port.postMessage(data); }; - console.error(port); let connected = false; let onMsg; let onClose = () => {}; diff --git a/src/worker/store.ts b/src/worker/store.ts index 2d2e32227..1ca4ce566 100644 --- a/src/worker/store.ts +++ b/src/worker/store.ts @@ -78,55 +78,18 @@ let start = (cfg: StoreConfig):void => { dep.setCustomize(cfg); } }); - - /* - const AppConfig = cfg.AppConfig; - const ApiConfig = cfg.ApiConfig; - - let test = TestModule.init({ - emit: () => {} - }, () => { - console.log('Test initialized'); - }); - let b64 = test.toBase64('pewpewPEZPEZ'); - console.error(b64); - console.error(AppConfig.minimumPasswordLength, AppConfig.degradedLimit); - console.error(Hash.getSecrets); - console.error(Util.mkEvent); - console.error(Messaging.createData); - console.log('UO & UOSetter:'); - console.error(UO.getDefaultName({type:'pad'})); - console.error(UO.getDefaultName); - console.error(UOSetter.init); - console.error(ProxyManager.createInner); - console.log('Pinpad'); - console.error(Pinpad.create); - console.error(LoginBlock.getBlockUrl); - console.error(Mailbox.init, Cursor.init, Support.init, Integration.init); - console.error(Profile.init, OnlyOffice.init, Team.init, Messenger.init); - console.error(History.init, Calendar.init); - //Util.fetchApi(ApiConfig.httpUnsafeOrigin, 'config', true, console.error); - //Util.fetchApi(ApiConfig.httpUnsafeOrigin, 'config', false, console.error); - console.error(Store); - //let StoreObj = Store.create({}); - //console.error(StoreObj); - */ }; let inWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope; let inSharedWorker = typeof SharedWorkerGlobalScope !== 'undefined' && self instanceof SharedWorkerGlobalScope; let store = {}; if (inSharedWorker) { - console.error('SHAREDWORKER'); SWConnector.start(start); } else if (inWorker) { - console.error("WEBWORKER"); WWConnector.start(start); } else if (typeof module !== 'undefined' && typeof module.exports) { - console.error('NODEJS'); store = AsyncConnector.start(start); } else { - console.error('BROWSER'); store = AsyncConnector.start(start); } diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index c6f5ef6c3..62db751d6 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -2381,7 +2381,6 @@ define([ $displayName.text(newName); if ((accountName && oldUrl !== url) || !accountName && uid !== oldUid || oldName !== newName) { $avatar.html(''); - if (newName) { console.error("AVATAR IN TOOLBAR", newName); } // XXX Common.displayAvatar($avatar, url, newName, function ($img) { oldUrl = url; oldUid = uid; diff --git a/www/common/cryptpad-common.js b/www/common/cryptpad-common.js index 934c02e43..2c2ead859 100644 --- a/www/common/cryptpad-common.js +++ b/www/common/cryptpad-common.js @@ -2727,7 +2727,6 @@ define([ console.log('Posting CONNECT'); postMessage('CONNECT', cfg, function (data) { - console.error('CC CALLED BACK'); // FIXME data should always exist // this indicates a false condition in sharedWorker // got here via a reference error: diff --git a/www/common/worker.bundle.js b/www/common/worker.bundle.js deleted file mode 100644 index a69ec50ba..000000000 --- a/www/common/worker.bundle.js +++ /dev/null @@ -1,36399 +0,0 @@ -(function(global, factory) { - typeof exports === "object" && typeof module !== "undefined" ? factory(exports) : typeof define === "function" && define.amd ? define([ "exports" ], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, - factory(global["cryptpad-worker"] = {})); -})(this, (function(exports) { - "use strict"; - function _mergeNamespaces(n, m) { - m.forEach((function(e) { - e && typeof e !== "string" && !Array.isArray(e) && Object.keys(e).forEach((function(k) { - if (k !== "default" && !(k in n)) { - var d = Object.getOwnPropertyDescriptor(e, k); - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: function() { - return e[k]; - } - }); - } - })); - })); - return Object.freeze(n); - } - var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {}; - function getDefaultExportFromCjs(x) { - return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; - } - function getAugmentedNamespace(n) { - if (n.__esModule) return n; - var f = n.default; - if (typeof f == "function") { - var a = function a() { - if (this instanceof a) { - return Reflect.construct(f, arguments, this.constructor); - } - return f.apply(this, arguments); - }; - a.prototype = f.prototype; - } else a = {}; - Object.defineProperty(a, "__esModule", { - value: true - }); - Object.keys(n).forEach((function(k) { - var d = Object.getOwnPropertyDescriptor(n, k); - Object.defineProperty(a, k, d.get ? d : { - enumerable: true, - get: function() { - return n[k]; - } - }); - })); - return a; - } - var chainpadListmap = { - exports: {} - }; - var chainpadNetflux = { - exports: {} - }; - var netfluxClient = { - exports: {} - }; - var hasRequiredNetfluxClient; - function requireNetfluxClient() { - if (hasRequiredNetfluxClient) return netfluxClient.exports; - hasRequiredNetfluxClient = 1; - (function(module) { - (function() { - var factory = function() { - var MAX_LAG_BEFORE_PING = 15e3; - var MAX_LAG_BEFORE_DISCONNECT = 6e4; - var PING_CYCLE = 5e3; - var REQUEST_TIMEOUT = 3e4; - var FORCE_CLOSE_TIMEOUT = 1e4; - var RECONNECT_LOOP_CYCLE = 7e3; - var NOFUNC = function() {}; - var now = function now() { - return (new Date).getTime(); - }; - var getLag = function(ctx) { - if (!ctx.ws) { - return null; - } - if (!ctx.pingOutstanding) { - return ctx.lastObservedLag; - } - return Math.max(now() - ctx.timeOfLastPingSent, ctx.lastObservedLag); - }; - var setTimeoutX = function(ctx, func, time) { - ctx.timeouts.push(setTimeout(func, time)); - }; - var closeWebsocket = function(ctx, offline) { - if (!ctx.ws) { - return; - } - ctx.ws.onmessage = NOFUNC; - ctx.ws.onopen = NOFUNC; - ctx.ws.close(); - if (offline) { - ctx.ws.onclose({ - reason: "offline" - }); - return; - } - setTimeoutX(ctx, (function() { - if (!ctx.ws) { - return; - } - ctx.ws.onclose({ - reason: "forced closed because websocket failed to close" - }); - }), FORCE_CLOSE_TIMEOUT); - }; - var send = function(ctx, content) { - if (!ctx.ws) { - return false; - } - ctx.ws.send(JSON.stringify(content)); - return true; - }; - var networkSendTo = function networkSendTo(ctx, peerId, content) { - var seq = ctx.seq++; - var message = [ seq, "MSG", peerId, content ]; - var sent = send(ctx, message); - return new Promise((function(res, rej) { - if (!sent) { - return void rej({ - type: "DISCONNECTED", - message: JSON.stringify(message) - }); - } - ctx.requests[seq] = { - reject: rej, - resolve: res, - time: now() - }; - })); - }; - var channelBcast = function channelBcast(ctx, chanId, content) { - var chan = ctx.channels[chanId]; - var seq = ctx.seq++; - var message = [ seq, "MSG", chanId, content ]; - if (!chan) { - return new Promise((function(res, rej) { - rej({ - type: "NO_SUCH_CHANNEL", - message: JSON.stringify(message) - }); - })); - } - var sent = send(ctx, message); - return new Promise((function(res, rej) { - if (!sent) { - return void rej({ - type: "DISCONNECTED", - message: JSON.stringify(message) - }); - } - ctx.requests[seq] = { - reject: rej, - resolve: res, - time: now() - }; - })); - }; - var channelLeave = function channelLeave(ctx, chanId, reason) { - var chan = ctx.channels[chanId]; - if (!chan) { - return void console.debug("no such channel", chanId); - } - delete ctx.channels[chanId]; - if (!ctx.ws || ctx.ws.readyState !== 1) { - return; - } - var seq = ctx.seq++; - send(ctx, [ seq, "LEAVE", chanId, reason ]); - var emptyFunction = function() {}; - ctx.requests[seq] = { - reject: emptyFunction, - resolve: emptyFunction, - time: now() - }; - }; - var makeEventHandlers = function makeEventHandlers(ctx, mappings) { - return function(name, handler) { - var handlers = mappings[name]; - if (!handlers) { - throw new Error("no such event " + name); - } - handlers.push(handler); - }; - }; - var removeEventHandler = function(ctx, name, handler, mappings) { - var handlers = mappings[name]; - if (!handlers) { - throw new Error("no such event " + name); - } - var idx = handlers.indexOf(handler); - if (idx === -1) { - return; - } - handlers.splice(idx, 1); - }; - var mkChannel = function mkChannel(ctx, id, priority) { - if (ctx.channels[id]) { - return new Promise((function(res) { - res(ctx.channels[id]); - })); - } - var q = ctx.queues.p2; - if (priority === 1) { - q = ctx.queues.p1; - } else if (priority === 3) { - q = ctx.queues.p3; - } - var internal = { - queue: q, - onMessage: [], - onJoin: [], - onLeave: [], - members: [], - jSeq: ctx.seq++ - }; - var mappings = { - message: internal.onMessage, - join: internal.onJoin, - leave: internal.onLeave - }; - var chan = { - _: internal, - time: now(), - id, - members: internal.members, - bcast: function bcast(msg) { - return channelBcast(ctx, chan.id, msg); - }, - leave: function leave(reason) { - return channelLeave(ctx, chan.id, reason); - }, - on: makeEventHandlers(ctx, mappings), - off: function(name, handler) { - removeEventHandler(ctx, name, handler, mappings); - } - }; - ctx.requests[internal.jSeq] = chan; - var message = [ internal.jSeq, "JOIN", id ]; - var sent = send(ctx, message); - return new Promise((function(res, rej) { - if (!sent) { - return void rej({ - type: "DISCONNECTED", - message: JSON.stringify(message) - }); - } - chan._.resolve = res; - chan._.reject = rej; - })); - }; - var disconnect = function(ctx) { - if (ctx.ws) { - var onclose = ctx.ws.onclose; - ctx.ws.onclose = NOFUNC; - ctx.ws.close(); - onclose({ - reason: "network.disconnect() called" - }); - } - ctx.timeouts.forEach(clearTimeout); - ctx.timeouts = []; - }; - var mkNetwork = function mkNetwork(ctx) { - var mappings = { - message: ctx.onMessage, - disconnect: ctx.onDisconnect, - reconnect: ctx.onReconnect - }; - var network = { - webChannels: ctx.channels, - getLag: function _getLag() { - return getLag(ctx); - }, - sendto: function sendto(peerId, content) { - return networkSendTo(ctx, peerId, content); - }, - join: function join(chanId, priority) { - return mkChannel(ctx, chanId, priority); - }, - disconnect: function() { - return disconnect(ctx); - }, - on: makeEventHandlers(ctx, mappings), - off: function(name, handler) { - removeEventHandler(ctx, name, handler, mappings); - } - }; - network.__defineGetter__("webChannels", (function() { - return Object.keys(ctx.channels).map((function(k) { - return ctx.channels[k]; - })); - })); - return network; - }; - var process = function(ctx) { - if (ctx.queues.busy) { - return; - } - var next = function() { - var obj = ctx.queues.p1.shift() || ctx.queues.p2.shift() || ctx.queues.p3.shift(); - if (!obj) { - ctx.queues.busy = false; - return; - } - ctx.queues.busy = true; - var handlers = obj.h; - var msg = obj.msg; - handlers.forEach((function(h) { - setTimeout((function() { - try { - h(msg[4], msg[1]); - } catch (e) { - console.error(e); - } - })); - })); - setTimeout((function() { - next(); - })); - }; - next(); - }; - var onMessage = function onMessage(ctx, evt) { - var msg = void 0; - try { - msg = JSON.parse(evt.data); - } catch (e) { - console.log(e.stack); - return; - } - ctx.timeOfLastMsgReceived = now(); - if (msg[0] !== 0) { - var req = ctx.requests[msg[0]]; - if (!req) { - console.log("error: " + JSON.stringify(msg)); - return; - } - delete ctx.requests[msg[0]]; - if (msg[1] === "ACK") { - if (req.ping) { - ctx.lastObservedLag = now() - Number(req.ping); - ctx.timeOfLastPingReceived = now(); - ctx.pingOutstanding--; - return; - } - req.resolve(); - } else if (msg[1] === "JACK") { - if (req._) { - if (!msg[2]) { - throw new Error("wrong type of ACK for channel join"); - } - req.id = msg[2]; - ctx.channels[req.id] = req; - return; - } - req.resolve(); - } else if (msg[1] === "ERROR") { - if (typeof req.reject === "function") { - req.reject({ - type: msg[2], - message: msg[3] - }); - } else if (req._ && typeof req._.reject === "function") { - if (msg[2] === "EJOINED" && !ctx.channels[msg[3]]) { - req.id = msg[3]; - ctx.channels[req.id] = req; - return; - } - req._.reject({ - type: msg[2], - message: msg[3] - }); - } else { - console.error(msg); - } - } else { - req.reject({ - type: "UNKNOWN", - message: JSON.stringify(msg) - }); - } - return; - } - if (msg[2] === "IDENT") { - ctx.uid = msg[3]; - ctx.ws._onident(); - ctx.pingInterval = setInterval((function() { - if (now() - ctx.timeOfLastPingReceived < MAX_LAG_BEFORE_PING) { - return; - } - if (now() - ctx.timeOfLastMsgReceived > MAX_LAG_BEFORE_DISCONNECT) { - closeWebsocket(ctx); - } - if (ctx.pingOutstanding) { - return; - } - var seq = ctx.seq++; - var currentDate = now(); - ctx.timeOfLastPingSent = currentDate; - ctx.pingOutstanding++; - ctx.requests[seq] = { - time: currentDate, - ping: currentDate - }; - send(ctx, [ seq, "PING" ]); - }), PING_CYCLE); - return; - } else if (!ctx.uid) { - return; - } - if (msg[2] === "PING") { - msg[2] = "PONG"; - send(ctx, msg); - return; - } - if (msg[2] === "MSG") { - var handlers = void 0; - var q = ctx.queues.p2; - if (msg[3] === ctx.uid) { - handlers = ctx.onMessage; - if (typeof msg[5] === "number") { - if (msg[5] === 1) { - q = ctx.queues.p1; - } - if (msg[5] === 3) { - q = ctx.queues.p3; - } - } - } else { - var chan = ctx.channels[msg[3]]; - if (!chan) { - console.log("message to non-existent chan " + JSON.stringify(msg)); - return; - } - handlers = chan._.onMessage; - if (chan._.queue) { - q = chan._.queue; - } - } - q.push({ - msg, - h: handlers - }); - process(ctx); - } - if (msg[2] === "LEAVE") { - var _chan = ctx.channels[msg[3]]; - if (!_chan) { - if (msg[1] !== ctx.uid) { - console.log("leaving non-existent chan " + JSON.stringify(msg)); - } - return; - } - var leaveIdx = _chan._.members.indexOf(msg[1]); - if (leaveIdx !== -1) { - _chan._.members.splice(leaveIdx, 1); - } - _chan._.onLeave.forEach((function(h) { - try { - h(msg[1], msg[4]); - } catch (e) { - console.log(e.stack); - } - })); - } - if (msg[2] === "JOIN") { - var _chan2 = ctx.channels[msg[3]]; - if (!_chan2) { - console.log("ERROR: join to non-existent chan " + JSON.stringify(msg)); - return; - } - if (_chan2._.members.indexOf(msg[1]) !== -1) { - return; - } - var synced = _chan2._.members.indexOf(ctx.uid) !== -1; - _chan2._.members.push(msg[1]); - if (!synced && msg[1] === ctx.uid) { - _chan2.myID = ctx.uid; - _chan2._.resolve(_chan2); - } - if (synced) { - _chan2._.onJoin.forEach((function(h) { - try { - h(msg[1]); - } catch (e) { - console.log(e.stack); - } - })); - } - } - }; - var connect = function connect(websocketURL, makeWebsocket) { - makeWebsocket = makeWebsocket || function(url) { - return new window.WebSocket(url); - }; - var ctx = { - ws: null, - seq: 1, - uid: null, - network: null, - channels: {}, - onMessage: [], - onDisconnect: [], - onReconnect: [], - timeouts: [], - requests: {}, - pingInterval: null, - queues: { - p1: [], - p2: [], - p3: [] - }, - timeOfLastPingSent: -1, - timeOfLastPingReceived: -1, - timeOfLastMsgReceived: -1, - lastObservedLag: 0, - pingOutstanding: 0 - }; - ctx.network = mkNetwork(ctx); - var promiseResolve = NOFUNC; - var promiseReject = NOFUNC; - if (typeof window !== "undefined") { - window.addEventListener("offline", (function() { - if ([ "localhost", "127.0.0.1", "" ].indexOf(window.location.hostname) !== -1) { - return; - } - closeWebsocket(ctx, true); - })); - } - var connectWs = function() { - var ws = ctx.ws = makeWebsocket(websocketURL); - ctx.timeOfLastPingSent = ctx.timeOfLastPingReceived = now(); - ctx.timeOfLastMsgReceived = now(); - ws.onmessage = function(msg) { - return onMessage(ctx, msg); - }; - ws.onclose = function(evt) { - ws.onclose = NOFUNC; - clearInterval(ctx.pingInterval); - ctx.timeouts.forEach(clearTimeout); - ctx.ws = null; - if (ctx.uid) { - ctx.uid = null; - ctx.onDisconnect.forEach((function(h) { - try { - h(evt.reason); - } catch (e) { - console.log(e.stack); - } - })); - } - setTimeoutX(ctx, connectWs, ctx.uid ? 0 : RECONNECT_LOOP_CYCLE); - }; - ws.onopen = function() { - setTimeoutX(ctx, (function() { - if (ctx.uid) { - return; - } - promiseReject({ - type: "TIMEOUT", - message: "waited " + REQUEST_TIMEOUT + "ms" - }); - promiseResolve = promiseReject = NOFUNC; - closeWebsocket(ctx); - }), REQUEST_TIMEOUT); - }; - ctx.ws._onident = function() { - ctx.timeOfLastPingReceived = now(); - ctx.timeOfLastMsgReceived = now(); - ctx.lastObservedLag = now() - ctx.timeOfLastPingSent; - if (promiseResolve !== NOFUNC) { - promiseResolve(ctx.network); - promiseResolve = promiseReject = NOFUNC; - } else { - ctx.channels = {}; - ctx.requests = {}; - ctx.pingOutstanding = 0; - ctx.onReconnect.forEach((function(h) { - try { - h(ctx.uid); - } catch (e) { - console.log(e.stack); - } - })); - } - }; - }; - return new Promise((function(resolve, reject) { - promiseResolve = resolve; - promiseReject = reject; - connectWs(); - })); - }; - return { - connect - }; - }; - if (module.exports) { - module.exports = factory(); - } else { - window.netflux_websocket = factory(); - } - })(); - })(netfluxClient); - return netfluxClient.exports; - } - var hasRequiredChainpadNetflux; - function requireChainpadNetflux() { - if (hasRequiredChainpadNetflux) return chainpadNetflux.exports; - hasRequiredChainpadNetflux = 1; - (function(module) { - (function() { - var factory = function(Netflux) { - var USE_HISTORY = true; - var CPNF = {}; - var verbose = function(x) { - console.log(x); - }; - verbose = function() {}; - var unBencode = function(str) { - return str.replace(/^\d+:/, ""); - }; - var removeCp = CPNF.removeCp = function(str) { - return str.replace(/^cp\|([A-Za-z0-9+\/=]{0,20}\|)?/, ""); - }; - CPNF.start = function(config) { - config = config || {}; - var network = config.network; - var websocketUrl = config.websocketURL; - var userName = config.userName; - var channel = config.channel; - var Crypto = config.crypto; - var readOnly = config.readOnly || false; - var ChainPad = !config.noChainPad && (config.ChainPad || window.ChainPad); - var useHistory = typeof config.useHistory === "undefined" ? USE_HISTORY : !!config.useHistory; - var stopped = false; - var lastKnownHash = config.lastKnownHash; - var lastSent = {}; - var messagesQueue = []; - var priority = config.priority || 2; - var Cache = config.Cache; - var channelCache; - var initialCache = false; - var txid = Math.floor(Math.random() * 1e6); - var metadata = config.metadata || {}; - var validateKey = metadata.validateKey = config.validateKey || metadata.validateKey; - metadata.owners = config.owners || metadata.owners; - metadata.expire = config.expire || metadata.expire; - var initializing = true; - var toReturn = { - setReadOnly: function(state, crypto) { - readOnly = state; - if (crypto) { - Crypto = crypto; - } - } - }; - var joinSession = function() {}; - var realtime; - var lastKnownHistoryKeeper; - var historyKeeperChange = []; - var wcObject = { - send: function() {} - }; - var createRealtime = function() { - if (realtime && typeof realtime.abort === "function") { - realtime.abort(); - } - var chainpad = ChainPad.create({ - userName, - initialState: config.initialState, - transformFunction: config.transformFunction, - patchTransformer: config.patchTransformer, - validateContent: config.validateContent, - avgSyncMilliseconds: config.avgSyncMilliseconds, - logLevel: typeof config.logLevel !== "undefined" ? config.logLevel : 1 - }); - if (Cache && Array.isArray(channelCache) && channelCache.length) { - channelCache.forEach((function(obj) { - var patch = obj.patch; - if (!/^\[/.test(patch)) { - try { - patch = Crypto.decrypt(patch, validateKey, true); - } catch (err) { - console.error(patch, validateKey, channel); - console.error(err); - } - patch = unBencode(patch); - } - chainpad.message(patch); - })); - var doc = chainpad.getUserDoc(); - if (doc === "") { - chainpad.abort(); - channelCache = []; - Cache.clearChannel(channel); - return createRealtime(); - } - } - chainpad.onMessage((function(msg, cb, curve) { - wcObject.send(msg, cb, curve); - })); - chainpad.onPatch((function(patch) { - if (config.onRemote) { - config.onRemote({ - realtime: chainpad, - patch - }); - } - })); - return chainpad; - }; - var userList = { - change: [], - onChange: function(newData) { - userList.change.forEach((function(el) { - el(newData); - })); - }, - users: [] - }; - var onJoining = function(peer) { - if (config.onJoin) { - config.onJoin(peer); - } - if (peer.length !== 32) { - return; - } - var list = userList.users; - var index = list.indexOf(peer); - if (index === -1) { - userList.users.push(peer); - } - userList.onChange(); - }; - var connectTo = function() {}; - var onLeaving = function(peer) { - if (config.onLeave) { - config.onLeave(peer); - } - var list = userList.users; - var index = list.indexOf(peer); - if (index !== -1) { - userList.users.splice(index, 1); - } - userList.onChange(); - }; - var onReady = function(wc, network) { - if (!initializing) { - return; - } - try { - var doc = realtime && realtime.getUserDoc(); - if (initialCache && realtime && (doc === "" || doc === config.initialState)) { - return void toReturn.resetCache(); - } - } catch (e) { - console.error(e); - } - if (realtime) { - realtime.start(); - } - if (config.setMyID) { - config.setMyID({ - myID: wc.myID - }); - } - initializing = false; - if (config.onReady) { - config.onReady({ - realtime, - network, - userList, - myId: wc.myID, - leave: wc.leave, - metadata - }); - } - if (messagesQueue.length) { - messagesQueue.forEach((function(f) { - if (typeof f !== "function") { - return; - } - f(); - })); - messagesQueue = []; - } - }; - var onChannelError = function(parsed, wc) { - if (config.onChannelError) { - config.onChannelError({ - channel: wc.id, - type: parsed.error, - loaded: !initializing, - error: parsed.error, - message: parsed.message - }); - } - if (parsed.error === "EUNKNOWN") { - lastKnownHash = undefined; - if (wc) { - wc.leave(); - } - if (Cache) { - channelCache = []; - Cache.clearChannel(channel, (function() { - if (ChainPad) { - toReturn.realtime = realtime = createRealtime(); - } - joinSession(network, connectTo); - })); - return; - } - joinSession(network, connectTo); - return; - } - if (typeof toReturn.stop === "function") { - try { - toReturn.stop(); - } catch (e) {} - } - }; - var firstFillCache = true; - var fillCache = function(obj) { - if (!Cache) { - return; - } - if (channelCache.length && channelCache[channelCache.length - 1].hash === obj.hash) { - return; - } - if (!channelCache.length && firstFillCache) { - obj.isCheckpoint = true; - firstFillCache = false; - } - if (!channelCache.length && !obj.isCheckpoint) { - return; - } - channelCache.push(obj); - Cache.storeCache(channel, validateKey, channelCache, (function(err) { - if (err) { - Cache.clearChannel(channel, (function() { - console.warn("Cache cleared", channel); - })); - var _cache = channelCache; - channelCache = []; - return void console.error(err, channel, _cache, validateKey); - } - })); - }; - var onMessage = function(peer, msg, wc, network, direct) { - var hk = network.historyKeeper; - var isHk = peer === hk; - if (wc && (msg === 0 || msg === "0")) { - return void onReady(wc, network); - } - if (direct && peer !== hk) { - return; - } - if (direct) { - var parsed = JSON.parse(msg); - if (parsed.txid && parsed.txid !== txid) { - return; - } - if (parsed.validateKey && parsed.channel) { - if (parsed.channel === wc.id && !validateKey) { - validateKey = parsed.validateKey; - } - if (parsed.channel === wc.id) { - metadata = parsed; - if (config.onMetadataUpdate && !initializing) { - config.onMetadataUpdate(metadata); - } - } - return; - } - if (parsed.state && parsed.state === 1 && parsed.channel) { - if (parsed.channel === wc.id) { - Object.keys(lastSent).forEach((function(h) { - if (typeof lastSent[h] === "function") { - lastSent[h]("FAILED"); - } - })); - lastSent = {}; - onReady(wc, network); - } - return; - } - } - if (isHk) { - var parsed1 = JSON.parse(msg); - if (Array.isArray(parsed1) && parsed1[0] && parsed1[0] !== txid) { - return; - } - if (parsed1.channel === wc.id && parsed1.error) { - onChannelError(parsed1, wc); - return; - } - msg = parsed1[4]; - if (parsed1[3] !== wc.id) { - return; - } - } - lastKnownHash = msg.slice(0, 64); - if (typeof lastSent[lastKnownHash] === "function") { - lastSent[lastKnownHash](null, lastKnownHash); - delete lastSent[lastKnownHash]; - return; - } - var isCp = /^cp\|/.test(msg); - msg = removeCp(msg); - try { - msg = Crypto.decrypt(msg, validateKey, isHk); - } catch (err) { - console.error(msg, validateKey, channel); - console.error(err); - } - var senderCurve; - var isString = typeof msg === "string"; - if (!isString && msg.content) { - senderCurve = msg.author; - msg = msg.content; - } - verbose(msg); - if (!initializing) { - if (config.onLocal) { - config.onLocal(true); - } - } - var message = isString ? unBencode(msg) : msg; - var apply = function() { - try { - if (realtime && isString) { - realtime.message(message); - } - if (config.onMessage) { - var obj = { - time: parsed1 ? parsed1[5] : +new Date - }; - config.onMessage(message, peer, validateKey, isCp, lastKnownHash, senderCurve, obj); - } - var isCacheCp = isCp; - if (config.isCacheCheckpoint) { - isCacheCp = config.isCacheCheckpoint(message, senderCurve); - } - fillCache({ - patch: message, - hash: lastKnownHash, - isCheckpoint: isCacheCp, - author: senderCurve, - time: parsed1 ? parsed1[5] : +new Date - }); - } catch (e) { - console.error(e); - } - }; - if (initializing && peer !== hk) { - messagesQueue.push(apply); - return; - } - apply(); - }; - var msgOut = function(msg, curvePublic) { - if (readOnly) { - return; - } - try { - var cmsg = Crypto.encrypt(msg, curvePublic); - if (msg.indexOf("[4") === 0) { - var id = ""; - if (window.nacl) { - var hash = window.nacl.hash(window.nacl.util.decodeUTF8(msg)); - id = window.nacl.util.encodeBase64(hash.slice(0, 8)) + "|"; - } else { - console.log("Checkpoint sent without an ID. Nacl is missing."); - } - cmsg = "cp|" + id + cmsg; - } - return cmsg; - } catch (err) { - console.log(msg); - throw err; - } - }; - var onOpen = function(wc, network, firstConnection) { - wcObject.wc = wc; - channel = wc.id; - wc.members.forEach(onJoining); - var onMessageHandler = function(msg, sender) { - onMessage(sender, msg, wc, network); - }; - wc.on("message", onMessageHandler); - wc.on("join", onJoining); - wc.on("leave", onLeaving); - wcObject.stop = function() { - wc.off("message", onMessageHandler); - wc.off("join", onJoining); - wc.off("leave", onLeaving); - wc.leave(); - if (realtime) { - realtime.abort(); - } - }; - if (firstConnection) { - wcObject.send = function(_message, cb, curvePublic) { - var message = msgOut(_message, curvePublic); - if (message) { - var hash = message.slice(0, 64); - var isCacheCp = /^cp\|/.test(message); - if (config.isCacheCheckpoint) { - isCacheCp = config.isCacheCheckpoint(_message, curvePublic); - } - lastSent[hash] = function(err, _hash) { - if (!err && _hash) { - fillCache({ - patch: removeCp(_message), - hash, - isCheckpoint: isCacheCp, - author: curvePublic, - time: +new Date - }); - } - cb(err, _hash); - }; - wcObject.wc.bcast(message).then((function() { - lastKnownHash = hash; - delete lastSent[hash]; - fillCache({ - patch: removeCp(_message), - hash, - isCheckpoint: isCacheCp, - author: curvePublic, - time: +new Date - }); - cb(null, hash); - }), (function(err) { - console.error(err); - if (err && (err.type === "enoent" || err.type === "ENOENT")) { - wcObject.wc.leave(); - if (stopped) { - delete lastSent[hash]; - return void cb("STOPPED"); - } - initializing = true; - network.join(channel, priority).then((function(wc) { - onOpen(wc, network, false); - wcObject.send(_message, cb, curvePublic); - })); - } else { - delete lastSent[hash]; - cb(err && err.type || err); - } - })); - } - }; - if (ChainPad && !realtime) { - toReturn.realtime = realtime = createRealtime(); - } - if (config.onInit) { - config.onInit({ - myID: wc.myID, - realtime, - getLag: network.getLag, - userList, - network, - channel - }); - } - } - if (config.onConnect) { - config.onConnect(wc, wcObject.send); - } - if (useHistory) { - var hk; - wc.members.forEach((function(p) { - if (p.length === 16) { - hk = p; - } - })); - if (lastKnownHistoryKeeper !== hk) { - network.historyKeeper = hk; - lastKnownHistoryKeeper = hk; - historyKeeperChange.forEach((function(f) { - f(hk); - })); - } - var sendGetHistory = function() { - var cfg = { - txid, - priority, - lastKnownHash, - metadata - }; - if (Cache && Array.isArray(channelCache) && channelCache.length) { - cfg.lastKnownHash = channelCache[channelCache.length - 1].hash; - } - messagesQueue = []; - var msg = [ "GET_HISTORY", wc.id, cfg ]; - if (hk) { - network.sendto(hk, JSON.stringify(msg)); - } - }; - sendGetHistory(); - toReturn.resetCache = function() { - initializing = true; - channelCache = []; - if (Cache) { - Cache.clearChannel(channel); - } - txid = Math.floor(Math.random() * 1e6); - onChannelError({ - error: "EUNKNOWN", - message: "Corrupted cache" - }, wc); - }; - } else { - onReady(wc, network); - } - }; - var isIntentionallyLeaving = false; - if (typeof window !== "undefined") { - window.addEventListener("beforeunload", (function() { - isIntentionallyLeaving = true; - })); - } - var findChannelById = function(webChannels, channelId) { - var webChannel; - webChannels.some((function(chan) { - if (chan.id === channelId) { - webChannel = chan; - return true; - } - })); - return webChannel; - }; - var onConnectError = function(err) { - if (config.onError) { - config.onError({ - type: err.type || err, - message: err.message, - error: err.type, - loaded: !initializing - }); - } - }; - joinSession = function(endPoint, cb) { - var promise; - if (typeof endPoint === "string") { - promise = Netflux.connect(endPoint); - } - var join = function() { - if (typeof endPoint === "string") { - promise.then(cb, onConnectError); - } else if (typeof endPoint.then === "function") { - endPoint.then(cb, onConnectError); - } else { - cb(endPoint); - } - }; - if (Cache) { - Cache.getChannelCache(channel, (function(err, cache) { - validateKey = cache ? cache.k : undefined; - channelCache = cache ? cache.c : []; - if (!channelCache.length) { - return void join(); - } - initialCache = true; - if (config.onCacheStart) { - config.onCacheStart(); - } - if (ChainPad) { - toReturn.realtime = realtime = createRealtime(); - } - if (!channelCache.length) { - return void join(); - } - if (config.onMessage) { - channelCache.forEach((function(obj) { - var _obj = { - time: obj.time - }; - config.onMessage(obj.patch, "cache", validateKey, obj.isCheckpoint, obj.hash, obj.author, _obj); - })); - } - if (config.onCacheReady) { - config.onCacheReady({ - id: channel, - realtime, - networkPromise: promise - }); - } - join(); - })); - toReturn.resetCache = function() { - if (Cache) { - Cache.clearChannel(channel); - } - channelCache = []; - }; - return; - } - join(); - }; - var firstConnection = true; - connectTo = function(network, first) { - if (stopped) { - return; - } - network.join(channel || null, priority).then((function(wc) { - if (stopped) { - try { - wc.leave(); - } catch (e) {} - return; - } - onOpen(wc, network, first); - }), (function(error) { - if (error && error.type === "ERESTRICTED" && Array.isArray(error.message)) { - if (config.onRejected) { - return void config.onRejected(error.message, (function(err) { - if (err) { - return void onConnectError(error); - } - connectTo(network, first); - })); - } - } - onConnectError(error); - })); - }; - toReturn.stop = function() { - stopped = true; - }; - joinSession(network || websocketUrl, (function(_network) { - network = _network; - if (firstConnection) { - firstConnection = false; - if (stopped) { - return; - } - var onDisconnectHandler = function(reason) { - if (isIntentionallyLeaving) { - return; - } - if (reason === "network.disconnect() called") { - return; - } - if (config.onConnectionChange) { - config.onConnectionChange({ - state: false - }); - return; - } - if (config.onAbort) { - config.onAbort({ - reason - }); - } - }; - var onReconnectHandler = function(uid) { - if (config.onConnectionChange) { - config.onConnectionChange({ - state: true, - myId: uid - }); - var afterReconnecting = function() { - initializing = true; - userList.users = []; - joinSession(network, connectTo); - }; - if (config.beforeReconnecting) { - config.beforeReconnecting((function(newKey, newContent) { - channel = newKey; - config.initialState = newContent; - afterReconnecting(); - })); - return; - } - afterReconnecting(); - } - }; - var onMessageHandler = function(msg, sender) { - var wchan = findChannelById(network.webChannels, channel); - if (wchan) { - onMessage(sender, msg, wchan, network, true); - } - }; - network.on("disconnect", onDisconnectHandler); - network.on("reconnect", onReconnectHandler); - network.on("message", onMessageHandler); - toReturn.network = network; - toReturn.stop = function() { - if (wcObject && wcObject.stop) { - wcObject.stop(); - } - var wchan = findChannelById(network.webChannels, channel); - if (wchan) { - try { - wchan.leave(""); - } catch (e) {} - } - network.off("disconnect", onDisconnectHandler); - network.off("reconnect", onReconnectHandler); - network.off("message", onMessageHandler); - stopped = true; - }; - network.onHistoryKeeperChange = function(todo) { - historyKeeperChange.push(todo); - }; - } - connectTo(network, true); - })); - return toReturn; - }; - return CPNF; - }; - if (module.exports) { - module.exports = factory(requireNetfluxClient()); - } - })(); - })(chainpadNetflux); - return chainpadNetflux.exports; - } - /*! - * Copyright 2015-2016 Thomas Rosenau - * - * 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. - */ var lib; - var hasRequiredLib; - function requireLib() { - if (hasRequiredLib) return lib; - hasRequiredLib = 1; - const sortKeys = o => { - if (Array.isArray(o)) { - return o.map(sortKeys); - } else if (o instanceof Object) { - let numeric = []; - let nonNumeric = []; - Object.keys(o).forEach((key => { - if (/^(0|[1-9][0-9]*)$/.test(key)) { - numeric.push(+key); - } else { - nonNumeric.push(key); - } - })); - return numeric.sort((function(a, b) { - return a - b; - })).concat(nonNumeric.sort()).reduce(((result, key) => { - result[key] = sortKeys(o[key]); - return result; - }), {}); - } - return o; - }; - const jsonStringify = JSON.stringify.bind(JSON); - const sortify = (value, replacer, space) => { - let native = jsonStringify(value, replacer, 0); - if (!native || native[0] !== "{" && native[0] !== "[") { - return native; - } - let cleanObj = JSON.parse(native); - return jsonStringify(sortKeys(cleanObj), null, space); - }; - lib = sortify; - return lib; - } - var json_sortify; - var hasRequiredJson_sortify; - function requireJson_sortify() { - if (hasRequiredJson_sortify) return json_sortify; - hasRequiredJson_sortify = 1; - json_sortify = requireLib(); - return json_sortify; - } - var hasRequiredChainpadListmap; - function requireChainpadListmap() { - if (hasRequiredChainpadListmap) return chainpadListmap.exports; - hasRequiredChainpadListmap = 1; - (function(module) { - (function() { - var factory = function(Realtime, Sortify) { - const window = globalThis; - var api = {}; - var ChainPad; - var isFakeProxy = typeof window.Proxy === "undefined"; - var DeepProxy = api.DeepProxy = function() { - var deepProxy = {}; - var isArray = deepProxy.isArray = Array.isArray || function(obj) { - return Object.toString(obj) === "[object Array]"; - }; - var type = deepProxy.type = function(dat) { - return dat === null ? "null" : isArray(dat) ? "array" : typeof dat; - }; - var isProxyable = deepProxy.isProxyable = function(obj, forceCheck) { - if (typeof forceCheck === "undefined" && isFakeProxy) { - return false; - } - return [ "object", "array" ].indexOf(type(obj)) !== -1; - }; - var setter = deepProxy.set = function(cb) { - return function(obj, prop, value) { - if (prop === "on") { - throw new Error("'on' is a reserved attribute name for realtime lists and maps"); - } - if (isProxyable(value)) { - obj[prop] = deepProxy.create(value, cb); - } else { - obj[prop] = value; - } - cb(); - return obj[prop] || true; - }; - }; - var pathMatches = deepProxy.pathMatches = function(path, pattern) { - return !pattern.some((function(x, i) { - return x !== path[i]; - })); - }; - var lengthDescending = function(a, b) { - return b.pattern.length - a.pattern.length; - }; - var on = function(events) { - return function(evt, pattern, f) { - switch (evt) { - case "change": - pattern = type(pattern) === "array" ? pattern : [ pattern ]; - events.change.push({ - cb: function(oldval, newval, path, root) { - if (pathMatches(path, pattern)) { - return f(oldval, newval, path, root); - } - }, - pattern - }); - events.change.sort(lengthDescending); - break; - - case "remove": - pattern = type(pattern) === "array" ? pattern : [ pattern ]; - events.remove.push({ - cb: function(oldval, path, root) { - if (pathMatches(path, pattern)) { - return f(oldval, path, root); - } - }, - pattern - }); - events.remove.sort(lengthDescending); - break; - - case "ready": - events.ready.push({ - cb: function(info) { - pattern(info); - } - }); - break; - - case "cacheready": - events.cacheready.push({ - cb: function(info) { - pattern(info); - } - }); - break; - - case "disconnect": - events.disconnect.push({ - cb: function(info) { - pattern(info); - } - }); - break; - - case "reconnect": - events.reconnect.push({ - cb: function(info) { - pattern(info); - } - }); - break; - - case "create": - events.create.push({ - cb: function(info) { - pattern(info); - } - }); - break; - - case "error": - events.error.push({ - cb: function(info) { - pattern(info); - } - }); - break; - } - return this; - }; - }; - var getter = deepProxy.get = function() { - var events = { - cacheready: [], - disconnect: [], - reconnect: [], - change: [], - ready: [], - remove: [], - create: [], - error: [] - }; - return function(obj, prop) { - if (prop === "on") { - return on(events); - } else if (prop === "_isProxy") { - return true; - } else if (prop === "_events") { - return events; - } - return obj[prop]; - }; - }; - var deleter = deepProxy.delete = function(cb) { - return function(obj, prop) { - if (typeof obj[prop] === "undefined") { - return true; - } - delete obj[prop]; - cb(); - return true; - }; - }; - var handlers = deepProxy.handlers = function(cb, isRoot) { - if (!isRoot) { - return { - set: setter(cb), - get: function(obj, prop) { - if (prop === "_isProxy") { - return true; - } - return obj[prop]; - }, - deleteProperty: deleter(cb) - }; - } - return { - set: setter(cb), - get: getter(cb), - deleteProperty: deleter(cb) - }; - }; - var remoteChangeFlag = deepProxy.remoteChangeFlag = false; - var stringifyFakeProxy = deepProxy.stringifyFakeProxy = function(proxy) { - var copy = JSON.parse(Sortify(proxy)); - delete copy._events; - delete copy._isProxy; - return Sortify(copy); - }; - deepProxy.checkLocalChange = function(obj, cb) { - if (!isFakeProxy) { - return; - } - if (deepProxy.interval) { - return; - } - var oldObj = stringifyFakeProxy(obj); - deepProxy.interval = window.setInterval((function() { - var newObj = stringifyFakeProxy(obj); - if (newObj !== oldObj) { - oldObj = newObj; - if (remoteChangeFlag) { - remoteChangeFlag = false; - } else { - cb(); - } - } - }), 300); - }; - var create = deepProxy.create = function(obj, opt, isRoot) { - var methods = type(opt) === "function" ? handlers(opt, isRoot) : opt; - switch (type(obj)) { - case "object": - var keys = Object.keys(obj); - keys.forEach((function(k) { - if (isProxyable(obj[k]) && !obj[k]._isProxy) { - obj[k] = create(obj[k], opt); - } - })); - break; - - case "array": - obj.forEach((function(o, i) { - if (isProxyable(o) && !o._isProxy) { - obj[i] = create(obj[i], opt); - } - })); - break; - - default: - throw new Error("attempted to make a proxy of an unproxyable object"); - } - if (!isFakeProxy) { - if (obj._isProxy) { - return obj; - } - return new window.Proxy(obj, methods); - } - var proxy = JSON.parse(JSON.stringify(obj)); - if (isRoot) { - var events = { - cacheready: [], - disconnect: [], - reconnect: [], - change: [], - ready: [], - remove: [], - create: [], - error: [] - }; - proxy.on = on(events); - proxy._events = events; - } - return proxy; - }; - var onChange = function(path, key, root, oldval, newval) { - var P = path.slice(0); - P.push(key); - root._events.change.some((function(handler) { - return handler.cb(oldval, newval, P, root) === false; - })); - }; - var find = deepProxy.find = function(map, path) { - var l = path.length; - for (var i = 0; i < l; i++) { - if (typeof map[path[i]] === "undefined") { - return; - } - map = map[path[i]]; - } - return map; - }; - var onRemove = function(path, key, root, old, top) { - var newpath = path.concat(key); - var X = find(root, newpath); - var t_X = type(X); - switch (t_X) { - case "array": - if (top) { - onChange(path, key, root, old, undefined); - } else { - root._events.remove.forEach((function(handler) { - return handler.cb(X, newpath, root); - })); - } - X.forEach((function(x, i) { - onRemove(newpath, i, root); - })); - break; - - case "object": - if (top) { - onChange(path, key, root, old, undefined); - } else { - root._events.remove.forEach((function(handler) { - return handler.cb(X, newpath, root, old, false); - })); - } - Object.keys(X).forEach((function(key) { - onRemove(newpath, key, root, X[key], false); - })); - break; - - default: - root._events.remove.forEach((function(handler) { - return handler.cb(X, newpath, root); - })); - break; - } - }; - var objects = deepProxy.objects = function(A, B, f, path, root) { - var Akeys = Object.keys(A); - var Bkeys = Object.keys(B); - Bkeys.forEach((function(b) { - var t_b = type(B[b]); - var old = A[b]; - if (Akeys.indexOf(b) === -1) { - switch (t_b) { - case "undefined": - throw new Error("undefined type has key. this shouldn't happen?"); - - case "array": - case "object": - A[b] = f(B[b]); - break; - - default: - A[b] = B[b]; - } - onChange(path, b, root, old, B[b]); - return; - } - var t_a = type(A[b]); - if (t_a !== t_b) { - console.log("type changed from [%s] to [%s]", t_a, t_b); - switch (t_b) { - case "undefined": - throw new Error("first pass should never reveal undefined keys"); - - case "array": - A[b] = f(B[b]); - break; - - case "object": - A[b] = f(B[b]); - break; - - default: - A[b] = B[b]; - break; - } - onChange(path, b, root, old, B[b]); - return; - } - if ([ "array", "object" ].indexOf(t_a) === -1) { - if (A[b] !== B[b]) { - A[b] = B[b]; - onChange(path, b, root, old, B[b]); - } - return; - } - var nextPath = path.slice(0).concat(b); - if (t_a === "object") { - objects.call(root, A[b], B[b], f, nextPath, root); - } else { - deepProxy.arrays.call(root, A[b], B[b], f, nextPath, root); - } - })); - Akeys.forEach((function(a) { - var old = A[a]; - if (a === "on" || a === "_events") { - return; - } - if (Bkeys.indexOf(a) === -1 || type(B[a]) === "undefined") { - onRemove(path, a, root, old, true); - delete A[a]; - } - })); - return; - }; - var arrays = deepProxy.arrays = function(A, B, f, path, root) { - var l_A = A.length; - var l_B = B.length; - if (l_A !== l_B) { - B.forEach((function(b, i) { - var t_a = type(A[i]); - var t_b = type(b); - var old = A[i]; - if (t_a !== t_b) { - switch (t_b) { - case "undefined": - throw new Error("this should never happen"); - - case "object": - A[i] = f(b); - break; - - case "array": - A[i] = f(b); - break; - - default: - A[i] = b; - break; - } - onChange(path, i, root, old, b); - } else { - var nextPath = path.slice(0).concat(i); - switch (t_b) { - case "object": - objects.call(root, A[i], b, f, nextPath, root); - break; - - case "array": - if (arrays.call(root, A[i], b, f, nextPath, root)) { - onChange(path, i, root, old, b); - } - break; - - default: - if (b !== A[i]) { - A[i] = b; - onChange(path, i, root, old, b); - } - break; - } - } - })); - if (l_A > l_B) { - var i = l_B; - var old; - for (;i <= l_B; i++) { - old = A[i]; - onRemove(path, i, root, old, true); - } - } - A.length = l_B; - return; - } - A.forEach((function(a, i) { - var t_a = type(a); - var t_b = type(B[i]); - var old = a; - if (t_a !== t_b) { - switch (t_b) { - case "undefined": - onRemove(path, i, root, old, true); - break; - - case "object": - case "array": - A[i] = f(B[i]); - break; - - default: - A[i] = B[i]; - break; - } - onChange(path, i, root, old, B[i]); - return; - } - var nextPath = path.slice(0).concat(i); - switch (t_b) { - case "undefined": - throw new Error("existing key had type `undefined`. this should never happen"); - - case "object": - if (objects.call(root, A[i], B[i], f, nextPath, root)) { - onChange(path, i, root, old, B[i]); - } - break; - - case "array": - if (arrays.call(root, A[i], B[i], f, nextPath, root)) { - onChange(path, i, root, old, B[i]); - } - break; - - default: - if (A[i] !== B[i]) { - A[i] = B[i]; - onChange(path, i, root, old, B[i]); - } - break; - } - })); - return; - }; - deepProxy.update = function(A, B, cb) { - var t_A = type(A); - var t_B = type(B); - if (t_A !== t_B) { - throw new Error("Proxy updates can't result in type changes"); - } - switch (t_B) { - case "array": - arrays.call(A, A, B, (function(obj) { - return create(obj, cb); - }), [], A); - break; - - case "object": - objects.call(A, A, B, (function(obj) { - return create(obj, cb); - }), [], A); - break; - - default: - throw new Error("unsupported realtime datatype:" + t_B); - } - }; - return deepProxy; - }(); - api.create = function(cfg) { - if (!DeepProxy.isProxyable(cfg.data, true)) { - throw new Error("unsupported datatype: " + DeepProxy.type(cfg.data)); - } - ChainPad = cfg.ChainPad || window.ChainPad; - if (typeof ChainPad.SmartJSONTransformer !== "function") { - throw new Error("Please update ChainPad"); - } - if (cfg.classic && !cfg.crypto) { - console.error("[chainpad-listmap] no crypto module provided. messages will not be encrypted"); - cfg.crypto = { - encrypt: function(msg) { - return msg; - }, - decrypt: function(msg) { - return msg; - } - }; - } - var readOnly = cfg.readOnly; - var config = { - initialState: Sortify(cfg.data), - patchTransformer: ChainPad.SmartJSONTransformer, - validateContent: cfg.validateContent || function(content) { - try { - JSON.parse(content); - return true; - } catch (e) { - console.log(content); - console.error("Failed to parse, rejecting patch"); - return false; - } - }, - readOnly: cfg.readOnly, - userName: cfg.userName || "listmap", - Cache: cfg.Cache, - logLevel: typeof cfg.logLevel === "undefined" ? 0 : cfg.logLevel - }; - if (cfg.classic) { - config.channel = cfg.channel; - config.crypto = cfg.crypto; - config.network = cfg.network; - config.websocketURL = cfg.websocketURL; - config.metadata = cfg.metadata || { - validateKey: cfg.validateKey, - owners: cfg.owners, - expire: cfg.expire - }; - config.onRejected = cfg.onRejected; - } - var rt = {}; - rt.metadata = {}; - var realtime; - var proxy; - var initializing = true; - var ready = false; - var localTo; - var stringifier = isFakeProxy ? DeepProxy.stringifyFakeProxy : Sortify; - var onLocalFollowUp = function() { - var strung = stringifier(proxy); - try { - realtime.contentUpdate(strung); - } catch (e) { - proxy._events.error.forEach((function(handler) { - handler.cb({ - type: "CHAINPAD", - error: e.message - }); - })); - } - if (cfg.onLocal) { - cfg.onLocal(); - } - }; - var onLocal = config.onLocal = function(remote) { - if (initializing) { - return; - } - if (readOnly) { - return; - } - clearTimeout(localTo); - if (remote) { - return void onLocalFollowUp(); - } - localTo = setTimeout(onLocalFollowUp); - }; - var setterCb = function() { - if (!DeepProxy.remoteChangeFlag) { - onLocal(); - } - }; - proxy = DeepProxy.create(cfg.data, setterCb, true); - config.onInit = function(info) { - proxy._events.create.forEach((function(handler) { - handler.cb(info); - })); - }; - config.onCacheReady = function(info) { - if (!realtime || realtime !== info.realtime) { - realtime = rt.realtime = info.realtime; - } - var userDoc = realtime.getUserDoc(); - var parsed = JSON.parse(userDoc); - DeepProxy.update(proxy, parsed, setterCb); - DeepProxy.checkLocalChange(proxy, onLocal); - if (ready) { - return; - } - proxy._events.cacheready.forEach((function(handler) { - handler.cb(info); - })); - }; - var idx = 0; - config.onReady = function(info) { - idx = -1; - if (ready) { - initializing = false; - config.onRemote(); - proxy._events.reconnect.forEach((function(handler) { - handler.cb(info); - })); - return; - } - if (!realtime || realtime !== info.realtime) { - realtime = rt.realtime = info.realtime; - } - rt.metadata = info.metadata; - var userDoc = realtime.getUserDoc(); - var parsed = JSON.parse(userDoc); - DeepProxy.update(proxy, parsed, setterCb); - DeepProxy.checkLocalChange(proxy, onLocal); - initializing = false; - ready = true; - proxy._events.ready.forEach((function(handler) { - handler.cb(info); - })); - }; - config.onRemote = function() { - if (initializing) { - return; - } - var userDoc = realtime.getUserDoc(); - var parsed = JSON.parse(userDoc); - DeepProxy.remoteChangeFlag = true; - DeepProxy.update(proxy, parsed, setterCb); - DeepProxy.remoteChangeFlag = false; - }; - config.onMessage = function() { - if (idx === -1) { - return; - } - if (cfg.updateProgress) { - cfg.updateProgress({ - progress: idx++ - }); - } - }; - config.onAbort = function(info) { - proxy._events.disconnect.forEach((function(handler) { - handler.cb(info); - })); - }; - config.onConnectionChange = function(info) { - if (info.state) { - initializing = true; - return; - } - proxy._events.disconnect.forEach((function(handler) { - handler.cb(info); - })); - }; - config.onMetadataUpdate = function(metadata) { - rt.metadata = metadata; - if (typeof cfg.onMetadataUpdate === "function") { - cfg.onMetadataUpdate(metadata); - } - }; - config.onError = function(info) { - proxy._events.error.forEach((function(handler) { - handler.cb(info); - })); - }; - config.onChannelError = function(info) { - proxy._events.error.forEach((function(handler) { - handler.cb(info); - })); - }; - if (cfg.common && typeof cfg.common.startRealtime === "function") { - realtime = rt.cpCnInner = cfg.common.startRealtime(config); - } else { - rt = Realtime.start(config); - } - rt.proxy = proxy; - rt.realtime = realtime; - var _setReadOnly = rt.setReadOnly; - rt.setReadOnly = function(state, crypto) { - readOnly = state; - if (_setReadOnly) { - _setReadOnly(state, crypto); - } - }; - return rt; - }; - return api; - }; - if (module.exports) { - module.exports = factory(requireChainpadNetflux(), requireJson_sortify()); - } - })(); - })(chainpadListmap); - return chainpadListmap.exports; - } - var chainpadListmapExports = requireChainpadListmap(); - function commonjsRequire(path) { - throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.'); - } - var chainpad_dist$1 = { - exports: {} - }; - var hasRequiredChainpad_dist; - function requireChainpad_dist() { - if (hasRequiredChainpad_dist) return chainpad_dist$1.exports; - hasRequiredChainpad_dist = 1; - (function(module, exports) { - (function() { - var r = function() { - var e = "function" == typeof commonjsRequire && commonjsRequire, r = function(i, o, u) { - o || (o = 0); - var n = r.resolve(i, o), t = r.m[o][n]; - if (!t && e) { - if (t = e(n)) return t; - } else if (t && t.c && (o = t.c, n = t.m, t = r.m[o][t.m], !t)) throw new Error('failed to require "' + n + '" from ' + o); - if (!t) throw new Error('failed to require "' + i + '" from ' + u); - return t.exports || (t.exports = {}, t.call(t.exports, t, t.exports, r.relative(n, o))), - t.exports; - }; - return r.resolve = function(e, n) { - var i = e, t = e + ".js", o = e + "/index.js"; - return r.m[n][t] && t ? t : r.m[n][o] && o ? o : i; - }, r.relative = function(e, t) { - return function(n) { - if ("." != n.charAt(0)) return r(n, t, e); - var o = e.split("/"), f = n.split("/"); - o.pop(); - for (var i = 0; i < f.length; i++) { - var u = f[i]; - ".." == u ? o.pop() : "." != u && o.push(u); - } - return r(o.join("/"), t, e); - }; - }, r; - }(); - r.m = []; - r.m[0] = { - "json.sortify": { - c: 1, - m: "dist/JSON.sortify.js" - }, - "fast-diff": { - c: 2, - m: "diff.js" - }, - "Diff.js": function(module, exports, require) { - var FastDiff = require("fast-diff"); - var transform = function(matches) { - var out = []; - var offset = 0; - var first = true; - var current = { - offset: 0, - toInsert: "", - toRemove: 0, - type: "Operation" - }; - matches.forEach((function(el, i) { - if (el[0] === 0) { - if (!first) { - out.push(current); - offset = current.offset + current.toRemove; - current = { - offset, - toInsert: "", - toRemove: 0, - type: "Operation" - }; - } - offset += el[1].length; - current.offset = offset; - } else if (el[0] === 1) { - current.toInsert = el[1]; - } else { - current.toRemove = el[1].length; - } - if (i === matches.length - 1 && el[0] !== 0) { - out.push(current); - } - if (first) { - first = false; - } - })); - return out; - }; - module.exports.diff = function(oldS, newS) { - return transform(FastDiff(oldS, newS)); - }; - }, - "Patch.js": function(module, exports, require) { - var Common = require("./Common"); - var Operation = require("./Operation"); - var Sha = require("./sha256"); - var Patch = module.exports; - var create = Patch.create = function(parentHash, isCheckpoint) { - var out = Object.freeze({ - type: "Patch", - operations: [], - parentHash, - isCheckpoint: !!isCheckpoint, - mut: { - inverseOf: undefined - } - }); - if (isCheckpoint) { - out.mut.inverseOf = out; - } - return out; - }; - var check = Patch.check = function(patch, docLength_opt) { - Common.assert(patch.type === "Patch"); - Common.assert(Array.isArray(patch.operations)); - Common.assert(/^[0-9a-f]{64}$/.test(patch.parentHash)); - for (var i = patch.operations.length - 1; i >= 0; i--) { - Operation.check(patch.operations[i], docLength_opt); - if (i > 0) { - Common.assert(!Operation.shouldMerge(patch.operations[i], patch.operations[i - 1])); - } - if (typeof docLength_opt === "number") { - docLength_opt += Operation.lengthChange(patch.operations[i]); - } - } - if (patch.isCheckpoint) { - Common.assert(patch.operations.length === 1); - Common.assert(patch.operations[0].offset === 0); - if (typeof docLength_opt === "number") { - Common.assert(!docLength_opt || patch.operations[0].toRemove === docLength_opt); - } - } - return patch; - }; - Patch.toObj = function(patch) { - if (Common.PARANOIA) { - check(patch); - } - var out = new Array(patch.operations.length + 1); - var i; - for (i = 0; i < patch.operations.length; i++) { - out[i] = Operation.toObj(patch.operations[i]); - } - out[i] = patch.parentHash; - return out; - }; - Patch.fromObj = function(obj, isCheckpoint) { - Common.assert(Array.isArray(obj) && obj.length > 0); - var patch = create(Sha.check(obj[obj.length - 1]), isCheckpoint); - var i; - for (i = 0; i < obj.length - 1; i++) { - patch.operations[i] = Operation.fromObj(obj[i]); - } - if (Common.PARANOIA) { - check(patch); - } - return patch; - }; - var hash = function(text) { - return Sha.hex_sha256(text); - }; - var addOperation = Patch.addOperation = function(patch, op) { - if (Common.PARANOIA) { - check(patch); - Operation.check(op); - } - for (var i = 0; i < patch.operations.length; i++) { - if (Operation.shouldMerge(patch.operations[i], op)) { - var maybeOp = Operation.merge(patch.operations[i], op); - patch.operations.splice(i, 1); - if (maybeOp === null) { - return; - } - op = maybeOp; - i--; - } else { - var out = Operation.rebase(patch.operations[i], op); - if (out === op) { - patch.operations.splice(i, 0, op); - return; - } else { - op = out; - } - } - } - patch.operations.push(op); - if (Common.PARANOIA) { - check(patch); - } - }; - Patch.createCheckpoint = function(parentContent, checkpointContent, parentContentHash_opt) { - var op = Operation.create(0, parentContent.length, checkpointContent); - if (Common.PARANOIA && parentContentHash_opt) { - Common.assert(parentContentHash_opt === hash(parentContent)); - } - parentContentHash_opt = parentContentHash_opt || hash(parentContent); - var out = create(parentContentHash_opt, true); - out.operations[0] = op; - return out; - }; - var clone = Patch.clone = function(patch) { - if (Common.PARANOIA) { - check(patch); - } - var out = create(patch.parentHash, patch.isCheckpoint); - for (var i = 0; i < patch.operations.length; i++) { - out.operations[i] = patch.operations[i]; - } - return out; - }; - Patch.merge = function(oldPatch, newPatch) { - if (Common.PARANOIA) { - check(oldPatch); - check(newPatch); - } - if (oldPatch.isCheckpoint) { - Common.assert(newPatch.parentHash === oldPatch.parentHash); - if (newPatch.isCheckpoint) { - return create(oldPatch.parentHash); - } - return clone(newPatch); - } else if (newPatch.isCheckpoint) { - return clone(oldPatch); - } - oldPatch = clone(oldPatch); - for (var i = newPatch.operations.length - 1; i >= 0; i--) { - addOperation(oldPatch, newPatch.operations[i]); - } - return oldPatch; - }; - Patch.apply = function(patch, doc) { - if (Common.PARANOIA) { - check(patch); - Common.assert(typeof doc === "string"); - Common.assert(Sha.hex_sha256(doc) === patch.parentHash); - } - var newDoc = doc; - for (var i = patch.operations.length - 1; i >= 0; i--) { - newDoc = Operation.apply(patch.operations[i], newDoc); - } - return newDoc; - }; - Patch.lengthChange = function(patch) { - if (Common.PARANOIA) { - check(patch); - } - var out = 0; - for (var i = 0; i < patch.operations.length; i++) { - out += Operation.lengthChange(patch.operations[i]); - } - return out; - }; - Patch.invert = function(patch, doc) { - if (Common.PARANOIA) { - check(patch); - Common.assert(typeof doc === "string"); - Common.assert(Sha.hex_sha256(doc) === patch.parentHash); - } - var newDoc = doc; - var operations = new Array(patch.operations.length); - for (var i = patch.operations.length - 1; i >= 0; i--) { - operations[i] = Operation.invert(patch.operations[i], newDoc); - newDoc = Operation.apply(patch.operations[i], newDoc); - } - var opOffsets = new Array(patch.operations.length); - (function() { - for (var i = operations.length - 1; i >= 0; i--) { - opOffsets[i] = operations[i].offset; - for (var j = i - 1; j >= 0; j--) { - opOffsets[i] += operations[j].toRemove - operations[j].toInsert.length; - } - } - })(); - var rpatch = create(Sha.hex_sha256(newDoc), patch.isCheckpoint); - rpatch.operations.splice(0, rpatch.operations.length); - for (var j = 0; j < operations.length; j++) { - rpatch.operations[j] = Operation.create(opOffsets[j], operations[j].toRemove, operations[j].toInsert); - } - if (Common.PARANOIA) { - check(rpatch); - } - return rpatch; - }; - Patch.simplify = function(patch, doc, operationSimplify) { - if (Common.PARANOIA) { - check(patch); - Common.assert(typeof doc === "string"); - Common.assert(Sha.hex_sha256(doc) === patch.parentHash); - } - var spatch = create(patch.parentHash); - var newDoc = doc; - var outOps = []; - var j = 0; - for (var i = patch.operations.length - 1; i >= 0; i--) { - var outOp = operationSimplify(patch.operations[i], newDoc, Operation.simplify); - if (outOp) { - newDoc = Operation.apply(outOp, newDoc); - outOps[j++] = outOp; - } - } - Array.prototype.push.apply(spatch.operations, outOps.reverse()); - if (!spatch.operations[0]) { - spatch.operations.shift(); - } - if (Common.PARANOIA) { - check(spatch); - } - return spatch; - }; - Patch.equals = function(patchA, patchB) { - if (patchA.operations.length !== patchB.operations.length) { - return false; - } - for (var i = 0; i < patchA.operations.length; i++) { - if (!Operation.equals(patchA.operations[i], patchB.operations[i])) { - return false; - } - } - return true; - }; - var isCheckpointOp = function(op, text) { - return op.offset === 0 && op.toRemove === text.length && op.toInsert === text; - }; - Patch.transform = function(toTransform, transformBy, doc, patchTransformer) { - if (Common.PARANOIA) { - check(toTransform, doc.length); - check(transformBy, doc.length); - if (Sha.hex_sha256(doc) !== toTransform.parentHash) { - throw new Error("wrong hash"); - } - } - if (toTransform.parentHash !== transformBy.parentHash) { - throw new Error; - } - var afterTransformBy = Patch.apply(transformBy, doc); - var out = create(transformBy.mut.inverseOf ? transformBy.mut.inverseOf.parentHash : Sha.hex_sha256(afterTransformBy), toTransform.isCheckpoint); - if (transformBy.operations.length === 0) { - return clone(toTransform); - } - if (toTransform.operations.length === 0) { - if (toTransform.isCheckpoint) { - throw new Error; - } - return out; - } - if (toTransform.isCheckpoint || toTransform.operations.length === 1 && isCheckpointOp(toTransform.operations[0], doc)) { - throw new Error("Attempting to transform a checkpoint, this should not happen"); - } - if (transformBy.operations.length === 1 && isCheckpointOp(transformBy.operations[0], doc)) { - if (!transformBy.isCheckpoint) { - throw new Error; - } - return toTransform; - } - if (transformBy.isCheckpoint) { - throw new Error; - } - var ops = patchTransformer(toTransform.operations, transformBy.operations, doc); - Array.prototype.push.apply(out.operations, ops); - if (Common.PARANOIA) { - check(out, afterTransformBy.length); - } - return out; - }; - Patch.random = function(doc, opCount) { - Common.assert(typeof doc === "string"); - opCount = opCount || Math.floor(Math.random() * 30) + 1; - var patch = create(Sha.hex_sha256(doc)); - var docLength = doc.length; - while (opCount-- > 0) { - var op = Operation.random(docLength); - docLength += Operation.lengthChange(op); - addOperation(patch, op); - } - check(patch); - return patch; - }; - Object.freeze(module.exports); - }, - "SHA256.js": function(module, exports, require) { - (function() { - var chrsz = 8; - function safe_add(x, y) { - var lsw = (x & 65535) + (y & 65535); - var msw = (x >> 16) + (y >> 16) + (lsw >> 16); - return msw << 16 | lsw & 65535; - } - function S(X, n) { - return X >>> n | X << 32 - n; - } - function R(X, n) { - return X >>> n; - } - function Ch(x, y, z) { - return x & y ^ ~x & z; - } - function Maj(x, y, z) { - return x & y ^ x & z ^ y & z; - } - function Sigma0256(x) { - return S(x, 2) ^ S(x, 13) ^ S(x, 22); - } - function Sigma1256(x) { - return S(x, 6) ^ S(x, 11) ^ S(x, 25); - } - function Gamma0256(x) { - return S(x, 7) ^ S(x, 18) ^ R(x, 3); - } - function Gamma1256(x) { - return S(x, 17) ^ S(x, 19) ^ R(x, 10); - } - function newArray(n) { - var a = []; - for (;n > 0; n--) { - a.push(undefined); - } - return a; - } - function core_sha256(m, l) { - var K = [ 1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298 ]; - var HASH = [ 1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635, 1541459225 ]; - var W = newArray(64); - var a, b, c, d, e, f, g, h, i, j; - var T1, T2; - m[l >> 5] |= 128 << 24 - l % 32; - m[(l + 64 >> 9 << 4) + 15] = l; - for (var i = 0; i < m.length; i += 16) { - a = HASH[0]; - b = HASH[1]; - c = HASH[2]; - d = HASH[3]; - e = HASH[4]; - f = HASH[5]; - g = HASH[6]; - h = HASH[7]; - for (var j = 0; j < 64; j++) { - if (j < 16) { - W[j] = m[j + i]; - } else { - W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]); - } - T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]); - T2 = safe_add(Sigma0256(a), Maj(a, b, c)); - h = g; - g = f; - f = e; - e = safe_add(d, T1); - d = c; - c = b; - b = a; - a = safe_add(T1, T2); - } - HASH[0] = safe_add(a, HASH[0]); - HASH[1] = safe_add(b, HASH[1]); - HASH[2] = safe_add(c, HASH[2]); - HASH[3] = safe_add(d, HASH[3]); - HASH[4] = safe_add(e, HASH[4]); - HASH[5] = safe_add(f, HASH[5]); - HASH[6] = safe_add(g, HASH[6]); - HASH[7] = safe_add(h, HASH[7]); - } - return HASH; - } - function str2binb(str) { - var bin = Array(); - var mask = (1 << chrsz) - 1; - for (var i = 0; i < str.length * chrsz; i += chrsz) bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << 24 - i % 32; - return bin; - } - function binb2hex(binarray) { - var hex_tab = "0123456789abcdef"; - var str = ""; - for (var i = 0; i < binarray.length * 4; i++) { - str += hex_tab.charAt(binarray[i >> 2] >> (3 - i % 4) * 8 + 4 & 15) + hex_tab.charAt(binarray[i >> 2] >> (3 - i % 4) * 8 & 15); - } - return str; - } - function hex_sha256(s) { - return binb2hex(core_sha256(str2binb(s), s.length * chrsz)); - } - module.exports.hex_sha256 = hex_sha256; - })(); - }, - "Common.js": function(module, exports, require) { - module.exports.global = function() { - if (typeof self !== "undefined") { - return self; - } - if (typeof commonjsGlobal !== "undefined") { - return commonjsGlobal; - } - if (typeof window !== "undefined") { - return window; - } - throw new Error("no self, nor global, nor window"); - }(); - var cfg = function(name) { - if (typeof localStorage !== "undefined" && localStorage[name]) { - return localStorage[name]; - } - return module.exports.global[name]; - }; - var PARANOIA = module.exports.PARANOIA = cfg("ChainPad_PARANOIA"); - module.exports.VALIDATE_ENTIRE_CHAIN_EACH_MSG = cfg("ChainPad_VALIDATE_ENTIRE_CHAIN_EACH_MSG"); - module.exports.TESTING = cfg("ChainPad_TESTING"); - module.exports.assert = function(expr) { - if (!expr) { - throw new Error("Failed assertion"); - } - }; - module.exports.isUint = function(integer) { - return typeof integer === "number" && Math.floor(integer) === integer && integer >= 0; - }; - module.exports.randomASCII = function(length) { - var content = []; - for (var i = 0; i < length; i++) { - content[i] = String.fromCharCode(Math.floor(Math.random() * 256) % 57 + 65); - } - return content.join(""); - }; - module.exports.strcmp = function(a, b) { - if (PARANOIA && typeof a !== "string") { - throw new Error; - } - if (PARANOIA && typeof b !== "string") { - throw new Error; - } - return a === b ? 0 : a > b ? 1 : -1; - }; - Object.freeze(module.exports); - }, - "sha256.js": function(module, exports, require) { - var asm_sha256 = require("./sha256/exports.js"); - var old = require("./SHA256.js"); - var Common = require("./Common"); - var brokenTextEncode = function(str) { - var out = new Uint8Array(str.length); - for (var i = 0; i < str.length; i++) { - out[i] = str.charCodeAt(i) & 255; - } - return out; - }; - module.exports.check = function(hex) { - if (typeof hex !== "string") { - throw new Error; - } - if (!/[a-f0-9]{64}/.test(hex)) { - throw new Error; - } - return hex; - }; - module.exports.hex_sha256 = function(d) { - d = d + ""; - var ret = asm_sha256.hex(brokenTextEncode(d)); - if (Common.PARANOIA) { - var oldHash = old.hex_sha256(d); - if (oldHash !== ret) { - try { - throw new Error; - } catch (e) { - console.log({ - hashErr: e, - badHash: d, - asmHasher: asm_sha256.hex, - oldHasher: old.hex_sha256 - }); - } - return oldHash; - } - } - return ret; - }; - Object.freeze(module.exports); - }, - "Message.js": function(module, exports, require) { - var Common = require("./Common"); - var Patch = require("./Patch"); - var Sha = require("./sha256"); - var Message = module.exports; - var PATCH = Message.PATCH = 2; - var CHECKPOINT = Message.CHECKPOINT = 4; - var check = Message.check = function(msg) { - Common.assert(msg.type === "Message"); - Common.assert(msg.messageType === PATCH || msg.messageType === CHECKPOINT); - Patch.check(msg.content); - Common.assert(typeof msg.lastMsgHash === "string"); - return msg; - }; - var DUMMY_HASH = ""; - var create = Message.create = function(type, content, lastMsgHash) { - var msg = { - type: "Message", - messageType: type, - content, - lastMsgHash, - hashOf: DUMMY_HASH, - mut: { - parentCount: undefined, - isInitialMessage: false, - isFromMe: false, - parent: undefined, - time: undefined, - author: undefined, - serverHash: undefined - } - }; - msg.hashOf = hashOf(msg); - if (Common.PARANOIA) { - check(msg); - } - return Object.freeze(msg); - }; - var toString = Message.toStr = Message.toString = function(msg) { - if (Common.PARANOIA) { - check(msg); - } - if (msg.messageType === PATCH || msg.messageType === CHECKPOINT) { - if (!msg.content) { - throw new Error; - } - return JSON.stringify([ msg.messageType, Patch.toObj(msg.content), msg.lastMsgHash ]); - } else { - throw new Error; - } - }; - Message.fromString = function(str) { - var obj = {}; - if (typeof str === "object") { - obj = str; - str = str.msg; - } - var m = JSON.parse(str); - if (m[0] !== CHECKPOINT && m[0] !== PATCH) { - throw new Error("invalid message type " + m[0]); - } - var msg = create(m[0], Patch.fromObj(m[1], m[0] === CHECKPOINT), m[2]); - msg.mut.author = obj.author; - msg.mut.time = obj.time && new Date(obj.time); - msg.mut.serverHash = obj.serverHash; - return Object.freeze(msg); - }; - var hashOf = Message.hashOf = function(msg) { - if (Common.PARANOIA) { - check(msg); - } - var hash = Sha.hex_sha256(toString(msg)); - return hash; - }; - Object.freeze(module.exports); - }, - "ChainPad.js": function(module, exports, require) { - var Common = module.exports.Common = require("./Common"); - var Operation = module.exports.Operation = require("./Operation"); - var Patch = module.exports.Patch = require("./Patch"); - var Message = module.exports.Message = require("./Message"); - var Sha = module.exports.Sha = require("./sha256"); - var Diff = module.exports.Diff = require("./Diff"); - var TextTransformer = module.exports.TextTransformer = require("./transform/TextTransformer"); - module.exports.NaiveJSONTransformer = require("./transform/NaiveJSONTransformer"); - module.exports.SmartJSONTransformer = require("./transform/SmartJSONTransformer"); - var EMPTY_STR_HASH = module.exports.EMPTY_STR_HASH = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; - var ZERO = "0000000000000000000000000000000000000000000000000000000000000000"; - var DEFAULT_CHECKPOINT_INTERVAL = 50; - var DEFAULT_AVERAGE_SYNC_MILLISECONDS = 300; - var DEFAULT_STRICT_CHECKPOINT_VALIDATION = false; - var debug = function(realtime, msg) { - if (realtime.logLevel > 1) { - console.log("[" + realtime.userName + "] " + msg); - } - }; - var warn = function(realtime, msg) { - if (realtime.logLevel > 0) { - console.error("[" + realtime.userName + "] " + msg); - } - }; - var schedule = function(realtime, func, timeout) { - if (realtime.aborted) { - return; - } - if (!timeout) { - timeout = Math.floor(Math.random() * 2 * realtime.config.avgSyncMilliseconds); - } - var to = setTimeout((function() { - realtime.schedules.splice(realtime.schedules.indexOf(to), 1); - func(); - }), timeout); - realtime.schedules.push(to); - return to; - }; - var unschedule = function(realtime, schedule) { - var index = realtime.schedules.indexOf(schedule); - if (index > -1) { - realtime.schedules.splice(index, 1); - } - clearTimeout(schedule); - }; - var onMessage = function(realtime, message, callback) { - if (!realtime.messageHandlers.length) { - callback("no onMessage() handler registered"); - } - try { - realtime.messageHandlers.forEach((function(handler) { - handler(message, (function() { - callback.apply(null, arguments); - callback = function() {}; - })); - })); - } catch (e) { - callback(e.stack); - } - }; - var sendMessage = function(realtime, msg, callback, timeSent) { - var strMsg = Message.toStr(msg); - onMessage(realtime, strMsg, (function(err) { - if (err) { - debug(realtime, "Posting to server failed [" + err + "]"); - realtime.pending = null; - realtime.syncSchedule = schedule(realtime, (function() { - sync(realtime); - })); - } else { - var pending = realtime.pending; - realtime.pending = null; - if (!pending) { - throw new Error; - } - Common.assert(pending.hash === msg.hashOf); - if (handleMessage(realtime, strMsg, true)) { - realtime.timeOfLastSuccess = +new Date; - realtime.lag = +new Date - pending.timeSent; - } else { - debug(realtime, "Our message [" + msg.hashOf + "] failed validation"); - } - pending.callback(); - } - })); - if (realtime.pending) { - throw new Error("there is already a pending message"); - } - if (realtime.timeOfLastSuccess === -1) { - realtime.timeOfLastSuccess = +new Date; - } - realtime.pending = { - hash: msg.hashOf, - timeSent: +new Date, - callback: function() { - realtime.syncSchedule = schedule(realtime, (function() { - sync(realtime); - }), 0); - callback(); - } - }; - if (Common.PARANOIA) { - check(realtime); - } - }; - var settle = function(realtime) { - var onSettle = realtime.onSettle; - realtime.onSettle = []; - onSettle.forEach((function(handler) { - try { - handler(); - } catch (e) { - warn(realtime, "Error in onSettle handler [" + e.stack + "]"); - } - })); - }; - var inversePatch = function(patch) { - if (!patch.mut.inverseOf) { - throw new Error; - } - return patch.mut.inverseOf; - }; - var sync = function(realtime, timeSent) { - if (Common.PARANOIA) { - check(realtime); - } - if (realtime.syncSchedule && !realtime.pending) { - unschedule(realtime, realtime.syncSchedule); - realtime.syncSchedule = null; - } else { - return; - } - realtime.uncommitted = Patch.simplify(realtime.uncommitted, realtime.authDoc, realtime.config.operationSimplify); - if (realtime.uncommitted.operations.length === 0) { - settle(realtime); - realtime.timeOfLastSuccess = +new Date; - realtime.syncSchedule = schedule(realtime, (function() { - sync(realtime); - })); - return; - } - var pc = parentCount(realtime, realtime.best) + 1; - if (pc % realtime.config.checkpointInterval === 0) { - var best = realtime.best; - debug(realtime, "Sending checkpoint (interval [" + realtime.config.checkpointInterval + "]) patch no [" + pc + "]"); - debug(realtime, parentCount(realtime, realtime.best)); - if (!best || !best.content || !inversePatch(best.content)) { - throw new Error; - } - var cpp = Patch.createCheckpoint(realtime.authDoc, realtime.authDoc, inversePatch(best.content).parentHash); - var cp = Message.create(Message.CHECKPOINT, cpp, best.hashOf); - sendMessage(realtime, cp, (function() { - debug(realtime, "Checkpoint sent and accepted"); - })); - return; - } - var msg; - if (realtime.setContentPatch) { - msg = realtime.setContentPatch; - } else { - msg = Message.create(Message.PATCH, realtime.uncommitted, realtime.best.hashOf); - } - sendMessage(realtime, msg, (function() { - if (realtime.setContentPatch) { - debug(realtime, "initial Ack received [" + msg.hashOf + "]"); - realtime.setContentPatch = null; - } - })); - }; - var storeMessage = function(realtime, msg) { - Common.assert(msg.lastMsgHash); - Common.assert(msg.hashOf); - realtime.messages[msg.hashOf] = msg; - (realtime.messagesByParent[msg.lastMsgHash] = realtime.messagesByParent[msg.lastMsgHash] || []).push(msg); - }; - var forgetMessage = function(realtime, msg) { - Common.assert(msg.lastMsgHash); - Common.assert(msg.hashOf); - delete realtime.messages[msg.hashOf]; - var list = realtime.messagesByParent[msg.lastMsgHash]; - Common.assert(list.indexOf(msg) > -1); - list.splice(list.indexOf(msg), 1); - if (list.length === 0) { - delete realtime.messagesByParent[msg.lastMsgHash]; - } - var children = realtime.messagesByParent[msg.hashOf]; - if (children) { - for (var i = 0; i < children.length; i++) { - delete children[i].mut.parent; - } - } - }; - var create = function(config) { - var zeroPatch = Patch.create(EMPTY_STR_HASH); - mkInverse(zeroPatch, ""); - var zeroMsg = Message.create(Message.PATCH, zeroPatch, ZERO); - zeroMsg.mut.parentCount = 0; - zeroMsg.mut.isInitialMessage = true; - var best = zeroMsg; - var initMsg; - if (config.initialState !== "") { - var initPatch = Patch.create(EMPTY_STR_HASH); - Patch.addOperation(initPatch, Operation.create(0, 0, config.initialState)); - mkInverse(initPatch, ""); - initMsg = Message.create(Message.PATCH, initPatch, zeroMsg.hashOf); - initMsg.mut.isInitialMessage = true; - best = initMsg; - } - var realtime = { - type: "ChainPad", - authDoc: config.initialState, - config, - logLevel: config.logLevel, - uncommitted: Patch.create(inversePatch(best.content).parentHash), - patchHandlers: [], - changeHandlers: [], - messageHandlers: [], - schedules: [], - aborted: false, - syncSchedule: -2, - userInterfaceContent: config.initialState, - setContentPatch: initMsg, - pending: undefined, - messages: {}, - messagesByParent: {}, - rootMessage: zeroMsg, - onSettle: [], - userName: config.userName, - best, - lag: 0, - timeOfLastSuccess: -1 - }; - storeMessage(realtime, zeroMsg); - if (initMsg) { - storeMessage(realtime, initMsg); - } - return realtime; - }; - var getParent = function(realtime, message) { - var parent = message.mut.parent = message.mut.parent || realtime.messages[message.lastMsgHash]; - return parent; - }; - var check = function(realtime) { - Common.assert(realtime.type === "ChainPad"); - Common.assert(typeof realtime.authDoc === "string"); - Patch.check(realtime.uncommitted, realtime.authDoc.length); - var uiDoc = Patch.apply(realtime.uncommitted, realtime.authDoc); - Common.assert(uiDoc.length === uncommittedDocLength(realtime)); - if (realtime.userInterfaceContent !== "") { - Common.assert(uiDoc === realtime.userInterfaceContent); - } - if (!Common.VALIDATE_ENTIRE_CHAIN_EACH_MSG) { - return; - } - var doc = realtime.authDoc; - var patchMsg = realtime.best; - Common.assert(inversePatch(patchMsg.content).parentHash === realtime.uncommitted.parentHash); - var patches = []; - do { - patches.push(patchMsg); - doc = Patch.apply(inversePatch(patchMsg.content), doc); - } while (patchMsg = getParent(realtime, patchMsg)); - if (realtime.rootMessage.content.isCheckpoint) { - if (doc !== realtime.rootMessage.content.operations[0].toInsert) { - throw new Error; - } - } else if (doc !== "") { - throw new Error; - } - while (patchMsg = patches.pop()) { - doc = Patch.apply(patchMsg.content, doc); - } - Common.assert(doc === realtime.authDoc); - }; - var uncommittedDocLength = function(realtime) { - return realtime.authDoc.length + Patch.lengthChange(realtime.uncommitted); - }; - var doOperation = function(realtime, op) { - if (Common.PARANOIA) { - check(realtime); - realtime.userInterfaceContent = Operation.apply(op, realtime.userInterfaceContent); - } - Operation.check(op, uncommittedDocLength(realtime)); - Patch.addOperation(realtime.uncommitted, op); - }; - var doPatch = function(realtime, patch) { - if (Common.PARANOIA) { - check(realtime); - Common.assert(Patch.invert(realtime.uncommitted, realtime.authDoc).parentHash === patch.parentHash); - realtime.userInterfaceContent = Patch.apply(patch, realtime.userInterfaceContent); - } - Patch.check(patch, uncommittedDocLength(realtime)); - realtime.uncommitted = Patch.merge(realtime.uncommitted, patch); - }; - var isAncestorOf = function(realtime, ancestor, decendent) { - if (!ancestor) { - return false; - } - for (;;) { - if (!decendent) { - return false; - } - if (ancestor === decendent) { - return true; - } - decendent = getParent(realtime, decendent); - } - }; - var parentCount = function(realtime, message) { - if (typeof message.mut.parentCount === "number") { - return message.mut.parentCount; - } - var msgs = []; - for (;typeof message.mut.parentCount !== "number"; message = getParent(realtime, message)) { - if (!message) { - if (message === realtime.rootMessage) { - throw new Error("root message does not have parent count"); - } - throw new Error("parentCount called on unlinked message"); - } - msgs.unshift(message); - } - var pc = message.mut.parentCount; - for (var i = 0; i < msgs.length; i++) { - msgs[i].mut.parentCount = ++pc; - } - return pc; - }; - var applyPatch = function(realtime, isFromMe, patch) { - Common.assert(patch); - var newAuthDoc; - if (isFromMe) { - Common.assert(patch.parentHash === realtime.uncommitted.parentHash); - realtime.uncommitted = Patch.merge(inversePatch(patch), realtime.uncommitted); - } else { - realtime.uncommitted = Patch.transform(realtime.uncommitted, patch, realtime.authDoc, realtime.config.patchTransformer); - if (realtime.config.validateContent) { - newAuthDoc = Patch.apply(patch, realtime.authDoc); - var userDoc = Patch.apply(realtime.uncommitted, newAuthDoc); - if (!realtime.config.validateContent(userDoc)) { - warn(realtime, "Transformed patch is not valid"); - realtime.uncommitted = Patch.create(Sha.hex_sha256(realtime.authDoc)); - } - } - } - Common.assert(realtime.uncommitted.parentHash === inversePatch(patch).parentHash); - realtime.authDoc = newAuthDoc || Patch.apply(patch, realtime.authDoc); - if (Common.PARANOIA) { - Common.assert(realtime.uncommitted.parentHash === inversePatch(patch).parentHash); - Common.assert(Sha.hex_sha256(realtime.authDoc) === realtime.uncommitted.parentHash); - realtime.userInterfaceContent = Patch.apply(realtime.uncommitted, realtime.authDoc); - } - }; - var revertPatch = function(realtime, isFromMe, patch) { - applyPatch(realtime, isFromMe, inversePatch(patch)); - }; - var getBestChild = function(realtime, msg) { - var best = msg; - (realtime.messagesByParent[msg.hashOf] || []).forEach((function(child) { - Common.assert(child.lastMsgHash === msg.hashOf); - child = getBestChild(realtime, child); - if (parentCount(realtime, child) > parentCount(realtime, best)) { - best = child; - } - })); - return best; - }; - var pushUIPatch = function(realtime, patch) { - if (!patch.operations.length) { - return; - } - realtime.patchHandlers.forEach((function(handler) { - handler(patch); - })); - realtime.changeHandlers.forEach((function(handler) { - patch.operations.forEach((function(op) { - handler(op.offset, op.toRemove, op.toInsert); - })); - })); - }; - var validContent = function(realtime, contentGetter) { - try { - return realtime.config.validateContent(contentGetter()); - } catch (e) { - warn(realtime, "Error in content validator [" + e.stack + "]"); - } - return false; - }; - var forEachParent = function(realtime, patch, callback) { - for (var m = getParent(realtime, patch); m; m = getParent(realtime, m)) { - if (callback(m) === false) { - return; - } - } - }; - var mkInverse = function(patch, content) { - if (patch.mut.inverseOf) { - return; - } - var inverse = patch.mut.inverseOf = Patch.invert(patch, content); - inverse.mut.inverseOf = patch; - }; - var handleMessage = function(realtime, msgStr, isFromMe) { - if (Common.PARANOIA) { - check(realtime); - } - var msg = Message.fromString(msgStr); - debug(realtime, JSON.stringify([ msg.hashOf, msg.content.operations ])); - if (realtime.messages[msg.hashOf]) { - if (realtime.setContentPatch && realtime.setContentPatch.hashOf === msg.hashOf) { - realtime.setContentPatch = null; - } else { - if (msg.content.isCheckpoint) { - debug(realtime, "[" + (isFromMe ? "our" : "their") + "] Checkpoint [" + msg.hashOf + "] is already known"); - return true; - } - debug(realtime, "Patch [" + msg.hashOf + "] is already known"); - } - if (Common.PARANOIA) { - check(realtime); - } - return; - } - if (msg.content.isCheckpoint && !validContent(realtime, (function() { - return msg.content.operations[0].toInsert; - }))) { - debug(realtime, "Checkpoint [" + msg.hashOf + "] failed content validation"); - return; - } - storeMessage(realtime, msg); - if (!isAncestorOf(realtime, realtime.rootMessage, msg)) { - if (msg.content.isCheckpoint && realtime.best.mut.isInitialMessage) { - debug(realtime, "applying checkpoint [" + msg.hashOf + "]"); - var userDoc = Patch.apply(realtime.uncommitted, realtime.authDoc); - Common.assert(!Common.PARANOIA || realtime.userInterfaceContent === userDoc); - var fixUserDocPatch = Patch.invert(realtime.uncommitted, realtime.authDoc); - Patch.addOperation(fixUserDocPatch, Operation.create(0, realtime.authDoc.length, msg.content.operations[0].toInsert)); - fixUserDocPatch = Patch.simplify(fixUserDocPatch, userDoc, realtime.config.operationSimplify); - msg.mut.parentCount = 0; - realtime.rootMessage = realtime.best = msg; - realtime.authDoc = msg.content.operations[0].toInsert; - realtime.uncommitted = Patch.create(Sha.hex_sha256(realtime.authDoc)); - pushUIPatch(realtime, fixUserDocPatch); - if (Common.PARANOIA) { - realtime.userInterfaceContent = realtime.authDoc; - } - return true; - } else { - debug(realtime, "Patch [" + msg.hashOf + "] not connected to root (parent: [" + msg.lastMsgHash + "])"); - if (Common.PARANOIA) { - check(realtime); - } - return; - } - } - msg = getBestChild(realtime, msg); - msg.mut.isFromMe = isFromMe; - var patch = msg.content; - var toRevert = []; - var commonAncestor = realtime.best; - if (!isAncestorOf(realtime, realtime.best, msg)) { - var pcBest = parentCount(realtime, realtime.best); - var pcMsg = parentCount(realtime, msg); - if (pcBest < pcMsg || pcBest === pcMsg && Common.strcmp(realtime.best.hashOf, msg.hashOf) > 0) { - while (commonAncestor && !isAncestorOf(realtime, commonAncestor, msg)) { - toRevert.push(commonAncestor); - commonAncestor = getParent(realtime, commonAncestor); - } - Common.assert(commonAncestor); - debug(realtime, "Patch [" + msg.hashOf + "] better than best chain, switching"); - } else { - debug(realtime, "Patch [" + msg.hashOf + "] chain is [" + pcMsg + "] best chain is [" + pcBest + "]"); - if (Common.PARANOIA) { - check(realtime); - } - return true; - } - } - var toApply = []; - var current = msg; - do { - toApply.unshift(current); - current = getParent(realtime, current); - Common.assert(current); - } while (current !== commonAncestor); - var authDocAtTimeOfPatch = realtime.authDoc; - toRevert.forEach((function(tr) { - authDocAtTimeOfPatch = Patch.apply(inversePatch(tr.content), authDocAtTimeOfPatch); - })); - toApply.forEach((function(ta, i) { - if (i === toApply.length - 1) { - return; - } - mkInverse(ta.content, authDocAtTimeOfPatch); - authDocAtTimeOfPatch = Patch.apply(ta.content, authDocAtTimeOfPatch); - })); - var headAtTimeOfPatch = realtime.best; - if (toApply.length > 1) { - headAtTimeOfPatch = toApply[toApply.length - 2]; - Common.assert(headAtTimeOfPatch); - } else if (toRevert.length) { - headAtTimeOfPatch = getParent(realtime, toRevert[toRevert.length - 1]); - Common.assert(headAtTimeOfPatch); - } - Common.assert(inversePatch(headAtTimeOfPatch.content).parentHash); - Common.assert(!Common.PARANOIA || inversePatch(headAtTimeOfPatch.content).parentHash === Sha.hex_sha256(authDocAtTimeOfPatch)); - if (inversePatch(headAtTimeOfPatch.content).parentHash !== patch.parentHash) { - debug(realtime, "patch [" + msg.hashOf + "] parentHash is not valid"); - if (Common.PARANOIA) { - check(realtime); - } - if (Common.TESTING) { - throw new Error; - } - forgetMessage(realtime, msg); - return; - } - if (patch.isCheckpoint && realtime.config.noPrune) ; else if (patch.isCheckpoint) { - var checkpointP; - forEachParent(realtime, msg, (function(m) { - if (m.content.isCheckpoint) { - if (checkpointP) { - checkpointP = m; - return false; - } - checkpointP = m; - } - })); - if (checkpointP && checkpointP !== realtime.rootMessage) { - var point = parentCount(realtime, checkpointP); - if (realtime.config.strictCheckpointValidation && point % realtime.config.checkpointInterval !== 0) { - debug(realtime, "checkpoint [" + msg.hashOf + "] at invalid point [" + point + "]"); - if (Common.PARANOIA) { - check(realtime); - } - if (Common.TESTING) { - throw new Error; - } - forgetMessage(realtime, msg); - return; - } - debug(realtime, "checkpoint [" + msg.hashOf + "]"); - forEachParent(realtime, checkpointP, (function(m) { - debug(realtime, "pruning [" + m.hashOf + "]"); - forgetMessage(realtime, m); - })); - realtime.rootMessage = checkpointP; - } - } else { - var simplePatch = Patch.simplify(patch, authDocAtTimeOfPatch, realtime.config.operationSimplify); - if (!Patch.equals(simplePatch, patch)) { - debug(realtime, "patch [" + msg.hashOf + "] can be simplified"); - if (Common.PARANOIA) { - check(realtime); - } - if (Common.TESTING) { - throw new Error; - } - forgetMessage(realtime, msg); - return; - } - if (!validContent(realtime, (function() { - return Patch.apply(patch, authDocAtTimeOfPatch); - }))) { - debug(realtime, "Patch [" + msg.hashOf + "] failed content validation"); - return; - } - } - mkInverse(patch, authDocAtTimeOfPatch); - realtime.uncommitted = Patch.simplify(realtime.uncommitted, realtime.authDoc, realtime.config.operationSimplify); - var oldUserInterfaceContent = Patch.apply(realtime.uncommitted, realtime.authDoc); - if (Common.PARANOIA) { - Common.assert(oldUserInterfaceContent === realtime.userInterfaceContent); - } - var uncommittedPatch = Patch.invert(realtime.uncommitted, realtime.authDoc); - toRevert.forEach((function(tr) { - debug(realtime, "reverting [" + tr.hashOf + "]"); - if (tr.mut.isFromMe) { - debug(realtime, "reverting patch 'from me' [" + JSON.stringify(tr.content.operations) + "]"); - } - uncommittedPatch = Patch.merge(uncommittedPatch, inversePatch(tr.content)); - revertPatch(realtime, tr.mut.isFromMe, tr.content); - })); - toApply.forEach((function(ta) { - debug(realtime, "applying [" + ta.hashOf + "]"); - uncommittedPatch = Patch.merge(uncommittedPatch, ta.content); - applyPatch(realtime, ta.mut.isFromMe, ta.content); - })); - uncommittedPatch = Patch.merge(uncommittedPatch, realtime.uncommitted); - uncommittedPatch = Patch.simplify(uncommittedPatch, oldUserInterfaceContent, realtime.config.operationSimplify); - realtime.best = msg; - if (Common.PARANOIA) { - var newUserInterfaceContent = Patch.apply(uncommittedPatch, oldUserInterfaceContent); - Common.assert(realtime.userInterfaceContent.length === uncommittedDocLength(realtime)); - Common.assert(newUserInterfaceContent === realtime.userInterfaceContent); - } - pushUIPatch(realtime, uncommittedPatch); - if (!realtime.uncommitted.operations.length) { - settle(realtime); - } - if (Common.PARANOIA) { - check(realtime); - } - return true; - }; - var getDepthOfState = function(content, minDepth, realtime) { - Common.assert(typeof content === "string"); - minDepth = minDepth || 0; - if (minDepth === 0 && realtime.authDoc === content) { - return 0; - } - var hash = Sha.hex_sha256(content); - var patchMsg = realtime.best; - var depth = 0; - do { - if (depth < minDepth) ; else { - if (patchMsg.content.parentHash === hash) { - return depth + 1; - } - } - depth++; - } while (patchMsg = getParent(realtime, patchMsg)); - return -1; - }; - var getContentAtState = function(realtime, msg) { - var patches = [ msg ]; - while (patches[0] !== realtime.rootMessage) { - var parent = getParent(realtime, patches[0]); - if (!parent) { - return { - error: "not connected to root", - doc: undefined - }; - } - patches.unshift(parent); - } - var doc = ""; - if (realtime.rootMessage.content.operations.length) { - Common.assert(realtime.rootMessage.content.operations.length === 1); - doc = realtime.rootMessage.content.operations[0].toInsert; - } - for (var i = 1; i < patches.length; i++) { - doc = Patch.apply(patches[i].content, doc); - } - return { - error: undefined, - doc - }; - }; - var wrapMessage = function(realtime, msg) { - return Object.freeze({ - type: "Block", - hashOf: msg.hashOf, - lastMsgHash: msg.lastMsgHash, - isCheckpoint: !!msg.content.isCheckpoint, - isFromMe: msg.mut && msg.mut.isFromMe, - author: msg.mut && msg.mut.author, - serverHash: msg.mut && msg.mut.serverHash, - time: msg.mut && msg.mut.time, - getParent: function() { - var parentMsg = getParent(realtime, msg); - if (parentMsg) { - return wrapMessage(realtime, parentMsg); - } - }, - getContent: function() { - return getContentAtState(realtime, msg); - }, - getPatch: function() { - return Patch.clone(msg.content); - }, - getInversePatch: function() { - return Patch.clone(inversePatch(msg.content)); - }, - equals: function(block, msgOpt) { - if (msgOpt) { - return msg === msgOpt; - } - if (!block || typeof block !== "object" || block.type !== "Block") { - return false; - } - return block.equals(block, msg); - } - }); - }; - var mkConfig = function(config) { - config = config || {}; - if (config.transformFunction) { - throw new Error("chainpad config transformFunction is nolonger used"); - } - return Object.freeze({ - initialState: config.initialState || "", - checkpointInterval: config.checkpointInterval || DEFAULT_CHECKPOINT_INTERVAL, - avgSyncMilliseconds: config.avgSyncMilliseconds || DEFAULT_AVERAGE_SYNC_MILLISECONDS, - strictCheckpointValidation: config.strictCheckpointValidation || DEFAULT_STRICT_CHECKPOINT_VALIDATION, - operationSimplify: config.operationSimplify || Operation.simplify, - logLevel: typeof config.logLevel === "number" ? config.logLevel : 2, - noPrune: config.noPrune, - patchTransformer: config.patchTransformer || TextTransformer, - userName: config.userName || "anonymous", - validateContent: config.validateContent || function(x) { - return true; - }, - diffFunction: config.diffFunction || function(strA, strB) { - return Diff.diff(strA, strB); - } - }); - }; - module.exports.create = function(conf) { - var realtime = create(mkConfig(conf)); - var out = { - onPatch: function(handler) { - Common.assert(typeof handler === "function"); - realtime.patchHandlers.push(handler); - }, - patch: function(patch, x, y) { - if (typeof patch === "number") { - if (typeof x !== "number" || typeof y !== "string") { - throw new Error; - } - out.change(patch, x, y); - return; - } - doPatch(realtime, patch); - }, - onChange: function(handler) { - Common.assert(typeof handler === "function"); - realtime.changeHandlers.push(handler); - }, - change: function(offset, count, chars) { - if (count === 0 && chars === "") { - return; - } - doOperation(realtime, Operation.create(offset, count, chars)); - }, - contentUpdate: function(newContent) { - var ops = realtime.config.diffFunction(realtime.authDoc, newContent); - var uncommitted = Patch.create(realtime.uncommitted.parentHash); - Array.prototype.push.apply(uncommitted.operations, ops); - realtime.uncommitted = uncommitted; - }, - onMessage: function(handler) { - Common.assert(typeof handler === "function"); - realtime.messageHandlers.push(handler); - }, - message: function(message) { - handleMessage(realtime, message, false); - }, - start: function() { - realtime.aborted = false; - if (realtime.syncSchedule) { - unschedule(realtime, realtime.syncSchedule); - } - realtime.pending = null; - realtime.syncSchedule = schedule(realtime, (function() { - sync(realtime); - })); - }, - abort: function() { - realtime.aborted = true; - realtime.schedules.forEach((function(s) { - clearTimeout(s); - })); - }, - sync: function() { - sync(realtime); - }, - getAuthDoc: function() { - return realtime.authDoc; - }, - getUserDoc: function() { - return Patch.apply(realtime.uncommitted, realtime.authDoc); - }, - getDepthOfState: function(content, minDepth) { - return getDepthOfState(content, minDepth, realtime); - }, - onSettle: function(handler) { - Common.assert(typeof handler === "function"); - realtime.onSettle.push(handler); - }, - getAuthBlock: function() { - return wrapMessage(realtime, realtime.best); - }, - getBlockForHash: function(hash) { - Common.assert(typeof hash === "string"); - var msg = realtime.messages[hash]; - if (msg) { - return wrapMessage(realtime, msg); - } - }, - getLag: function() { - var isPending = !!realtime.pending; - var lag = realtime.lag; - if (realtime.pending) { - lag = +new Date - realtime.timeOfLastSuccess; - } - return { - pending: isPending, - lag, - active: !realtime.aborted && realtime.syncSchedule !== -2 - }; - }, - _: undefined - }; - out._ = realtime; - return Object.freeze(out); - }; - Object.freeze(module.exports); - }, - "Operation.js": function(module, exports, require) { - var Common = require("./Common"); - var Operation = module.exports; - var check = Operation.check = function(op, docLength_opt) { - Common.assert(op.type === "Operation"); - if (!Common.isUint(op.offset)) { - throw new Error; - } - if (!Common.isUint(op.toRemove)) { - throw new Error; - } - if (typeof op.toInsert !== "string") { - throw new Error; - } - if (op.toRemove < 1 && op.toInsert.length < 1) { - throw new Error; - } - Common.assert(typeof docLength_opt !== "number" || op.offset + op.toRemove <= docLength_opt); - return op; - }; - var create = Operation.create = function(offset, toRemove, toInsert) { - var out = { - type: "Operation", - offset: offset || 0, - toRemove: toRemove || 0, - toInsert: toInsert || "" - }; - if (Common.PARANOIA) { - check(out); - } - return Object.freeze(out); - }; - Operation.toObj = function(op) { - if (Common.PARANOIA) { - check(op); - } - return [ op.offset, op.toRemove, op.toInsert ]; - }; - Operation.fromObj = function(obj) { - Common.assert(Array.isArray(obj) && obj.length === 3); - return create(obj[0], obj[1], obj[2]); - }; - var apply = Operation.apply = function(op, doc) { - if (Common.PARANOIA) { - Common.assert(typeof doc === "string"); - check(op, doc.length); - } - return doc.substring(0, op.offset) + op.toInsert + doc.substring(op.offset + op.toRemove); - }; - Operation.applyMulti = function(ops, doc) { - for (var i = ops.length - 1; i >= 0; i--) { - doc = apply(ops[i], doc); - } - return doc; - }; - var invert = Operation.invert = function(op, doc) { - if (Common.PARANOIA) { - check(op); - Common.assert(typeof doc === "string"); - Common.assert(op.offset + op.toRemove <= doc.length); - } - return create(op.offset, op.toInsert.length, (" " + doc.substring(op.offset, op.offset + op.toRemove)).slice(1)); - }; - var surrogatePattern = /[\uD800-\uDBFF]|[\uDC00-\uDFFF]/; - var hasSurrogate = Operation.hasSurrogate = function(str) { - return surrogatePattern.test(str); - }; - Operation.simplify = function(op, doc) { - if (Common.PARANOIA) { - check(op); - Common.assert(typeof doc === "string"); - Common.assert(op.offset + op.toRemove <= doc.length); - } - var rop = invert(op, doc); - var minLen = Math.min(op.toInsert.length, rop.toInsert.length); - var i = 0; - while (i < minLen && rop.toInsert[i] === op.toInsert[i]) { - if (hasSurrogate(rop.toInsert[i]) || hasSurrogate(op.toInsert[i])) { - if (op.toInsert[i + 1] === rop.toInsert[i + 1]) { - i++; - } else { - break; - } - } - i++; - } - var opOffset = op.offset + i; - var opToRemove = op.toRemove - i; - var opToInsert = op.toInsert.substring(i); - var ropToInsert = rop.toInsert.substring(i); - if (ropToInsert.length === opToInsert.length) { - for (i = ropToInsert.length - 1; i >= 0 && ropToInsert[i] === opToInsert[i]; i--) ; - opToInsert = opToInsert.substring(0, i + 1); - opToRemove = i + 1; - } - if (opToRemove === 0 && opToInsert.length === 0) { - return null; - } - return create(opOffset, opToRemove, opToInsert); - }; - Operation.equals = function(opA, opB) { - return opA.toRemove === opB.toRemove && opA.toInsert === opB.toInsert && opA.offset === opB.offset; - }; - Operation.lengthChange = function(op) { - if (Common.PARANOIA) { - check(op); - } - return op.toInsert.length - op.toRemove; - }; - Operation.merge = function(oldOpOrig, newOpOrig) { - if (Common.PARANOIA) { - check(newOpOrig); - check(oldOpOrig); - } - var oldOp_offset = oldOpOrig.offset; - var oldOp_toRemove = oldOpOrig.toRemove; - var oldOp_toInsert = oldOpOrig.toInsert; - var newOp_offset = newOpOrig.offset; - var newOp_toRemove = newOpOrig.toRemove; - var newOp_toInsert = newOpOrig.toInsert; - var offsetDiff = newOp_offset - oldOp_offset; - if (newOp_toRemove > 0) { - var origOldInsert = oldOp_toInsert; - oldOp_toInsert = oldOp_toInsert.substring(0, offsetDiff) + oldOp_toInsert.substring(offsetDiff + newOp_toRemove); - newOp_toRemove -= origOldInsert.length - oldOp_toInsert.length; - if (newOp_toRemove < 0) { - newOp_toRemove = 0; - } - oldOp_toRemove += newOp_toRemove; - newOp_toRemove = 0; - } - if (offsetDiff < 0) { - oldOp_offset += offsetDiff; - oldOp_toInsert = newOp_toInsert + oldOp_toInsert; - } else if (oldOp_toInsert.length === offsetDiff) { - oldOp_toInsert = oldOp_toInsert + newOp_toInsert; - } else if (oldOp_toInsert.length > offsetDiff) { - oldOp_toInsert = oldOp_toInsert.substring(0, offsetDiff) + newOp_toInsert + oldOp_toInsert.substring(offsetDiff); - } else { - throw new Error("should never happen\n" + JSON.stringify([ oldOpOrig, newOpOrig ], null, " ")); - } - if (oldOp_toInsert === "" && oldOp_toRemove === 0) { - return null; - } - return create(oldOp_offset, oldOp_toRemove, oldOp_toInsert); - }; - Operation.shouldMerge = function(oldOp, newOp) { - if (Common.PARANOIA) { - check(oldOp); - check(newOp); - } - if (newOp.offset < oldOp.offset) { - return oldOp.offset <= newOp.offset + newOp.toRemove; - } else { - return newOp.offset <= oldOp.offset + oldOp.toInsert.length; - } - }; - Operation.rebase = function(oldOp, newOp) { - if (Common.PARANOIA) { - check(oldOp); - check(newOp); - } - if (newOp.offset < oldOp.offset) { - return newOp; - } - return create(newOp.offset + oldOp.toRemove - oldOp.toInsert.length, newOp.toRemove, newOp.toInsert); - }; - Operation.random = function(docLength) { - Common.assert(Common.isUint(docLength)); - var offset = Math.floor(Math.random() * 1e8 % docLength) || 0; - var toRemove = Math.floor(Math.random() * 1e8 % (docLength - offset)) || 0; - var toInsert = ""; - do { - toInsert = Common.randomASCII(Math.floor(Math.random() * 20)); - } while (toRemove === 0 && toInsert === ""); - return create(offset, toRemove, toInsert); - }; - Object.freeze(module.exports); - }, - "sha256/hash.js": function(module, exports, require) { - var Utils = require("./utils.js"); - function hash_reset() { - this.result = null; - this.pos = 0; - this.len = 0; - this.asm.reset(); - return this; - } - function hash_process(data) { - if (this.result !== null) throw new IllegalStateError("state must be reset before processing new data"); - if (Utils.is_string(data)) data = Utils.string_to_bytes(data); - if (Utils.is_buffer(data)) data = new Uint8Array(data); - if (!Utils.is_bytes(data)) throw new TypeError("data isn't of expected type"); - var asm = this.asm, heap = this.heap, hpos = this.pos, hlen = this.len, dpos = 0, dlen = data.length, wlen = 0; - while (dlen > 0) { - wlen = Utils._heap_write(heap, hpos + hlen, data, dpos, dlen); - hlen += wlen; - dpos += wlen; - dlen -= wlen; - wlen = asm.process(hpos, hlen); - hpos += wlen; - hlen -= wlen; - if (!hlen) hpos = 0; - } - this.pos = hpos; - this.len = hlen; - return this; - } - function hash_finish() { - if (this.result !== null) throw new IllegalStateError("state must be reset before processing new data"); - this.asm.finish(this.pos, this.len, 0); - this.result = new Uint8Array(this.HASH_SIZE); - this.result.set(this.heap.subarray(0, this.HASH_SIZE)); - this.pos = 0; - this.len = 0; - return this; - } - module.exports.hash_reset = hash_reset; - module.exports.hash_process = hash_process; - module.exports.hash_finish = hash_finish; - }, - "sha256/utils.js": function(module, exports, require) { - var string_to_bytes = module.exports.string_to_bytes = function(str, utf8) { - utf8 = !!utf8; - var len = str.length, bytes = new Uint8Array(utf8 ? 4 * len : len); - for (var i = 0, j = 0; i < len; i++) { - var c = str.charCodeAt(i); - if (utf8 && 55296 <= c && c <= 56319) { - if (++i >= len) throw new Error("Malformed string, low surrogate expected at position " + i); - c = (c ^ 55296) << 10 | 65536 | str.charCodeAt(i) ^ 56320; - } else if (!utf8 && c >>> 8) { - throw new Error("Wide characters are not allowed."); - } - if (!utf8 || c <= 127) { - bytes[j++] = c; - } else if (c <= 2047) { - bytes[j++] = 192 | c >> 6; - bytes[j++] = 128 | c & 63; - } else if (c <= 65535) { - bytes[j++] = 224 | c >> 12; - bytes[j++] = 128 | c >> 6 & 63; - bytes[j++] = 128 | c & 63; - } else { - bytes[j++] = 240 | c >> 18; - bytes[j++] = 128 | c >> 12 & 63; - bytes[j++] = 128 | c >> 6 & 63; - bytes[j++] = 128 | c & 63; - } - } - return bytes.subarray(0, j); - }; - module.exports.hex_to_bytes = function(str) { - var len = str.length; - if (len & 1) { - str = "0" + str; - len++; - } - var bytes = new Uint8Array(len >> 1); - for (var i = 0; i < len; i += 2) { - bytes[i >> 1] = parseInt(str.substr(i, 2), 16); - } - return bytes; - }; - module.exports.base64_to_bytes = function(str) { - return string_to_bytes(atob(str)); - }; - var bytes_to_string = module.exports.bytes_to_string = function(bytes, utf8) { - utf8 = !!utf8; - var len = bytes.length, chars = new Array(len); - for (var i = 0, j = 0; i < len; i++) { - var b = bytes[i]; - if (!utf8 || b < 128) { - chars[j++] = b; - } else if (b >= 192 && b < 224 && i + 1 < len) { - chars[j++] = (b & 31) << 6 | bytes[++i] & 63; - } else if (b >= 224 && b < 240 && i + 2 < len) { - chars[j++] = (b & 15) << 12 | (bytes[++i] & 63) << 6 | bytes[++i] & 63; - } else if (b >= 240 && b < 248 && i + 3 < len) { - var c = (b & 7) << 18 | (bytes[++i] & 63) << 12 | (bytes[++i] & 63) << 6 | bytes[++i] & 63; - if (c <= 65535) { - chars[j++] = c; - } else { - c ^= 65536; - chars[j++] = 55296 | c >> 10; - chars[j++] = 56320 | c & 1023; - } - } else { - throw new Error("Malformed UTF8 character at byte offset " + i); - } - } - var str = "", bs = 16384; - for (var _i = 0; _i < j; _i += bs) { - str += String.fromCharCode.apply(String, chars.slice(_i, _i + bs <= j ? _i + bs : j)); - } - return str; - }; - module.exports.bytes_to_hex = function(arr) { - var str = ""; - for (var i = 0; i < arr.length; i++) { - var h = (arr[i] & 255).toString(16); - if (h.length < 2) str += "0"; - str += h; - } - return str; - }; - module.exports.bytes_to_base64 = function(arr) { - return btoa(bytes_to_string(arr)); - }; - module.exports.pow2_ceil = function(a) { - a -= 1; - a |= a >>> 1; - a |= a >>> 2; - a |= a >>> 4; - a |= a >>> 8; - a |= a >>> 16; - a += 1; - return a; - }; - module.exports.is_number = function(a) { - return typeof a === "number"; - }; - module.exports.is_string = function(a) { - return typeof a === "string"; - }; - module.exports.is_buffer = function(a) { - return a instanceof ArrayBuffer; - }; - module.exports.is_bytes = function(a) { - return a instanceof Uint8Array; - }; - module.exports.is_typed_array = function(a) { - return a instanceof Int8Array || a instanceof Uint8Array || a instanceof Int16Array || a instanceof Uint16Array || a instanceof Int32Array || a instanceof Uint32Array || a instanceof Float32Array || a instanceof Float64Array; - }; - module.exports._heap_init = function(constructor, options) { - var heap = options.heap, size = heap ? heap.byteLength : options.heapSize || 65536; - if (size & 4095 || size <= 0) throw new Error("heap size must be a positive integer and a multiple of 4096"); - heap = heap || new constructor(new ArrayBuffer(size)); - return heap; - }; - module.exports._heap_write = function(heap, hpos, data, dpos, dlen) { - var hlen = heap.length - hpos, wlen = hlen < dlen ? hlen : dlen; - heap.set(data.subarray(dpos, dpos + wlen), hpos); - return wlen; - }; - }, - "sha256/sha256.js": function(module, exports, require) { - var Utils = require("./utils.js"); - var Hash = require("./hash.js"); - var Asm = require("./sha256.asm.js"); - var _sha256_block_size = 64, _sha256_hash_size = 32; - function sha256_constructor(options) { - options = options || {}; - this.heap = Utils._heap_init(Uint8Array, options); - this.asm = options.asm || Asm.sha256_asm({ - Uint8Array - }, null, this.heap.buffer); - this.BLOCK_SIZE = _sha256_block_size; - this.HASH_SIZE = _sha256_hash_size; - this.reset(); - } - sha256_constructor.BLOCK_SIZE = _sha256_block_size; - sha256_constructor.HASH_SIZE = _sha256_hash_size; - var sha256_prototype = sha256_constructor.prototype; - sha256_prototype.reset = Hash.hash_reset; - sha256_prototype.process = Hash.hash_process; - sha256_prototype.finish = Hash.hash_finish; - var sha256_instance = null; - function get_sha256_instance() { - if (sha256_instance === null) sha256_instance = new sha256_constructor({ - heapSize: 1048576 - }); - return sha256_instance; - } - module.exports.get_sha256_instance = get_sha256_instance; - module.exports.sha256_constructor = sha256_constructor; - }, - "sha256/exports.js": function(module, exports, require) { - var Sha256 = require("./sha256.js"); - var Utils = require("./utils.js"); - function sha256_bytes(data) { - if (data === undefined) throw new SyntaxError("data required"); - return Sha256.get_sha256_instance().reset().process(data).finish().result; - } - function sha256_hex(data) { - var result = sha256_bytes(data); - return Utils.bytes_to_hex(result); - } - function sha256_base64(data) { - var result = sha256_bytes(data); - return Utils.bytes_to_base64(result); - } - Sha256.sha256_constructor.bytes = sha256_bytes; - Sha256.sha256_constructor.hex = sha256_hex; - Sha256.sha256_constructor.base64 = sha256_base64; - module.exports = Sha256.sha256_constructor; - }, - "sha256/sha256.asm.js": function(module, exports, require) { - module.exports.sha256_asm = function sha256_asm(stdlib, foreign, buffer) { - "use asm"; - var H0 = 0, H1 = 0, H2 = 0, H3 = 0, H4 = 0, H5 = 0, H6 = 0, H7 = 0, TOTAL0 = 0, TOTAL1 = 0; - var I0 = 0, I1 = 0, I2 = 0, I3 = 0, I4 = 0, I5 = 0, I6 = 0, I7 = 0, O0 = 0, O1 = 0, O2 = 0, O3 = 0, O4 = 0, O5 = 0, O6 = 0, O7 = 0; - var HEAP = new stdlib.Uint8Array(buffer); - function _core(w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15) { - w0 = w0 | 0; - w1 = w1 | 0; - w2 = w2 | 0; - w3 = w3 | 0; - w4 = w4 | 0; - w5 = w5 | 0; - w6 = w6 | 0; - w7 = w7 | 0; - w8 = w8 | 0; - w9 = w9 | 0; - w10 = w10 | 0; - w11 = w11 | 0; - w12 = w12 | 0; - w13 = w13 | 0; - w14 = w14 | 0; - w15 = w15 | 0; - var a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0, h = 0, t = 0; - a = H0; - b = H1; - c = H2; - d = H3; - e = H4; - f = H5; - g = H6; - h = H7; - t = w0 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x428a2f98 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - t = w1 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x71374491 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - t = w2 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xb5c0fbcf | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - t = w3 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xe9b5dba5 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - t = w4 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x3956c25b | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - t = w5 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x59f111f1 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - t = w6 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x923f82a4 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - t = w7 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xab1c5ed5 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - t = w8 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xd807aa98 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - t = w9 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x12835b01 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - t = w10 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x243185be | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - t = w11 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x550c7dc3 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - t = w12 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x72be5d74 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - t = w13 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x80deb1fe | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - t = w14 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x9bdc06a7 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - t = w15 + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xc19bf174 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w0 = t = (w1 >>> 7 ^ w1 >>> 18 ^ w1 >>> 3 ^ w1 << 25 ^ w1 << 14) + (w14 >>> 17 ^ w14 >>> 19 ^ w14 >>> 10 ^ w14 << 15 ^ w14 << 13) + w0 + w9 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xe49b69c1 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w1 = t = (w2 >>> 7 ^ w2 >>> 18 ^ w2 >>> 3 ^ w2 << 25 ^ w2 << 14) + (w15 >>> 17 ^ w15 >>> 19 ^ w15 >>> 10 ^ w15 << 15 ^ w15 << 13) + w1 + w10 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xefbe4786 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w2 = t = (w3 >>> 7 ^ w3 >>> 18 ^ w3 >>> 3 ^ w3 << 25 ^ w3 << 14) + (w0 >>> 17 ^ w0 >>> 19 ^ w0 >>> 10 ^ w0 << 15 ^ w0 << 13) + w2 + w11 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x0fc19dc6 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w3 = t = (w4 >>> 7 ^ w4 >>> 18 ^ w4 >>> 3 ^ w4 << 25 ^ w4 << 14) + (w1 >>> 17 ^ w1 >>> 19 ^ w1 >>> 10 ^ w1 << 15 ^ w1 << 13) + w3 + w12 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x240ca1cc | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w4 = t = (w5 >>> 7 ^ w5 >>> 18 ^ w5 >>> 3 ^ w5 << 25 ^ w5 << 14) + (w2 >>> 17 ^ w2 >>> 19 ^ w2 >>> 10 ^ w2 << 15 ^ w2 << 13) + w4 + w13 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x2de92c6f | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w5 = t = (w6 >>> 7 ^ w6 >>> 18 ^ w6 >>> 3 ^ w6 << 25 ^ w6 << 14) + (w3 >>> 17 ^ w3 >>> 19 ^ w3 >>> 10 ^ w3 << 15 ^ w3 << 13) + w5 + w14 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x4a7484aa | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w6 = t = (w7 >>> 7 ^ w7 >>> 18 ^ w7 >>> 3 ^ w7 << 25 ^ w7 << 14) + (w4 >>> 17 ^ w4 >>> 19 ^ w4 >>> 10 ^ w4 << 15 ^ w4 << 13) + w6 + w15 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x5cb0a9dc | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w7 = t = (w8 >>> 7 ^ w8 >>> 18 ^ w8 >>> 3 ^ w8 << 25 ^ w8 << 14) + (w5 >>> 17 ^ w5 >>> 19 ^ w5 >>> 10 ^ w5 << 15 ^ w5 << 13) + w7 + w0 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x76f988da | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w8 = t = (w9 >>> 7 ^ w9 >>> 18 ^ w9 >>> 3 ^ w9 << 25 ^ w9 << 14) + (w6 >>> 17 ^ w6 >>> 19 ^ w6 >>> 10 ^ w6 << 15 ^ w6 << 13) + w8 + w1 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x983e5152 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w9 = t = (w10 >>> 7 ^ w10 >>> 18 ^ w10 >>> 3 ^ w10 << 25 ^ w10 << 14) + (w7 >>> 17 ^ w7 >>> 19 ^ w7 >>> 10 ^ w7 << 15 ^ w7 << 13) + w9 + w2 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xa831c66d | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w10 = t = (w11 >>> 7 ^ w11 >>> 18 ^ w11 >>> 3 ^ w11 << 25 ^ w11 << 14) + (w8 >>> 17 ^ w8 >>> 19 ^ w8 >>> 10 ^ w8 << 15 ^ w8 << 13) + w10 + w3 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xb00327c8 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w11 = t = (w12 >>> 7 ^ w12 >>> 18 ^ w12 >>> 3 ^ w12 << 25 ^ w12 << 14) + (w9 >>> 17 ^ w9 >>> 19 ^ w9 >>> 10 ^ w9 << 15 ^ w9 << 13) + w11 + w4 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xbf597fc7 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w12 = t = (w13 >>> 7 ^ w13 >>> 18 ^ w13 >>> 3 ^ w13 << 25 ^ w13 << 14) + (w10 >>> 17 ^ w10 >>> 19 ^ w10 >>> 10 ^ w10 << 15 ^ w10 << 13) + w12 + w5 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xc6e00bf3 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w13 = t = (w14 >>> 7 ^ w14 >>> 18 ^ w14 >>> 3 ^ w14 << 25 ^ w14 << 14) + (w11 >>> 17 ^ w11 >>> 19 ^ w11 >>> 10 ^ w11 << 15 ^ w11 << 13) + w13 + w6 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xd5a79147 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w14 = t = (w15 >>> 7 ^ w15 >>> 18 ^ w15 >>> 3 ^ w15 << 25 ^ w15 << 14) + (w12 >>> 17 ^ w12 >>> 19 ^ w12 >>> 10 ^ w12 << 15 ^ w12 << 13) + w14 + w7 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x06ca6351 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w15 = t = (w0 >>> 7 ^ w0 >>> 18 ^ w0 >>> 3 ^ w0 << 25 ^ w0 << 14) + (w13 >>> 17 ^ w13 >>> 19 ^ w13 >>> 10 ^ w13 << 15 ^ w13 << 13) + w15 + w8 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x14292967 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w0 = t = (w1 >>> 7 ^ w1 >>> 18 ^ w1 >>> 3 ^ w1 << 25 ^ w1 << 14) + (w14 >>> 17 ^ w14 >>> 19 ^ w14 >>> 10 ^ w14 << 15 ^ w14 << 13) + w0 + w9 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x27b70a85 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w1 = t = (w2 >>> 7 ^ w2 >>> 18 ^ w2 >>> 3 ^ w2 << 25 ^ w2 << 14) + (w15 >>> 17 ^ w15 >>> 19 ^ w15 >>> 10 ^ w15 << 15 ^ w15 << 13) + w1 + w10 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x2e1b2138 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w2 = t = (w3 >>> 7 ^ w3 >>> 18 ^ w3 >>> 3 ^ w3 << 25 ^ w3 << 14) + (w0 >>> 17 ^ w0 >>> 19 ^ w0 >>> 10 ^ w0 << 15 ^ w0 << 13) + w2 + w11 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x4d2c6dfc | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w3 = t = (w4 >>> 7 ^ w4 >>> 18 ^ w4 >>> 3 ^ w4 << 25 ^ w4 << 14) + (w1 >>> 17 ^ w1 >>> 19 ^ w1 >>> 10 ^ w1 << 15 ^ w1 << 13) + w3 + w12 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x53380d13 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w4 = t = (w5 >>> 7 ^ w5 >>> 18 ^ w5 >>> 3 ^ w5 << 25 ^ w5 << 14) + (w2 >>> 17 ^ w2 >>> 19 ^ w2 >>> 10 ^ w2 << 15 ^ w2 << 13) + w4 + w13 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x650a7354 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w5 = t = (w6 >>> 7 ^ w6 >>> 18 ^ w6 >>> 3 ^ w6 << 25 ^ w6 << 14) + (w3 >>> 17 ^ w3 >>> 19 ^ w3 >>> 10 ^ w3 << 15 ^ w3 << 13) + w5 + w14 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x766a0abb | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w6 = t = (w7 >>> 7 ^ w7 >>> 18 ^ w7 >>> 3 ^ w7 << 25 ^ w7 << 14) + (w4 >>> 17 ^ w4 >>> 19 ^ w4 >>> 10 ^ w4 << 15 ^ w4 << 13) + w6 + w15 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x81c2c92e | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w7 = t = (w8 >>> 7 ^ w8 >>> 18 ^ w8 >>> 3 ^ w8 << 25 ^ w8 << 14) + (w5 >>> 17 ^ w5 >>> 19 ^ w5 >>> 10 ^ w5 << 15 ^ w5 << 13) + w7 + w0 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x92722c85 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w8 = t = (w9 >>> 7 ^ w9 >>> 18 ^ w9 >>> 3 ^ w9 << 25 ^ w9 << 14) + (w6 >>> 17 ^ w6 >>> 19 ^ w6 >>> 10 ^ w6 << 15 ^ w6 << 13) + w8 + w1 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xa2bfe8a1 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w9 = t = (w10 >>> 7 ^ w10 >>> 18 ^ w10 >>> 3 ^ w10 << 25 ^ w10 << 14) + (w7 >>> 17 ^ w7 >>> 19 ^ w7 >>> 10 ^ w7 << 15 ^ w7 << 13) + w9 + w2 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xa81a664b | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w10 = t = (w11 >>> 7 ^ w11 >>> 18 ^ w11 >>> 3 ^ w11 << 25 ^ w11 << 14) + (w8 >>> 17 ^ w8 >>> 19 ^ w8 >>> 10 ^ w8 << 15 ^ w8 << 13) + w10 + w3 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xc24b8b70 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w11 = t = (w12 >>> 7 ^ w12 >>> 18 ^ w12 >>> 3 ^ w12 << 25 ^ w12 << 14) + (w9 >>> 17 ^ w9 >>> 19 ^ w9 >>> 10 ^ w9 << 15 ^ w9 << 13) + w11 + w4 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xc76c51a3 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w12 = t = (w13 >>> 7 ^ w13 >>> 18 ^ w13 >>> 3 ^ w13 << 25 ^ w13 << 14) + (w10 >>> 17 ^ w10 >>> 19 ^ w10 >>> 10 ^ w10 << 15 ^ w10 << 13) + w12 + w5 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xd192e819 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w13 = t = (w14 >>> 7 ^ w14 >>> 18 ^ w14 >>> 3 ^ w14 << 25 ^ w14 << 14) + (w11 >>> 17 ^ w11 >>> 19 ^ w11 >>> 10 ^ w11 << 15 ^ w11 << 13) + w13 + w6 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xd6990624 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w14 = t = (w15 >>> 7 ^ w15 >>> 18 ^ w15 >>> 3 ^ w15 << 25 ^ w15 << 14) + (w12 >>> 17 ^ w12 >>> 19 ^ w12 >>> 10 ^ w12 << 15 ^ w12 << 13) + w14 + w7 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xf40e3585 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w15 = t = (w0 >>> 7 ^ w0 >>> 18 ^ w0 >>> 3 ^ w0 << 25 ^ w0 << 14) + (w13 >>> 17 ^ w13 >>> 19 ^ w13 >>> 10 ^ w13 << 15 ^ w13 << 13) + w15 + w8 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x106aa070 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w0 = t = (w1 >>> 7 ^ w1 >>> 18 ^ w1 >>> 3 ^ w1 << 25 ^ w1 << 14) + (w14 >>> 17 ^ w14 >>> 19 ^ w14 >>> 10 ^ w14 << 15 ^ w14 << 13) + w0 + w9 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x19a4c116 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w1 = t = (w2 >>> 7 ^ w2 >>> 18 ^ w2 >>> 3 ^ w2 << 25 ^ w2 << 14) + (w15 >>> 17 ^ w15 >>> 19 ^ w15 >>> 10 ^ w15 << 15 ^ w15 << 13) + w1 + w10 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x1e376c08 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w2 = t = (w3 >>> 7 ^ w3 >>> 18 ^ w3 >>> 3 ^ w3 << 25 ^ w3 << 14) + (w0 >>> 17 ^ w0 >>> 19 ^ w0 >>> 10 ^ w0 << 15 ^ w0 << 13) + w2 + w11 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x2748774c | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w3 = t = (w4 >>> 7 ^ w4 >>> 18 ^ w4 >>> 3 ^ w4 << 25 ^ w4 << 14) + (w1 >>> 17 ^ w1 >>> 19 ^ w1 >>> 10 ^ w1 << 15 ^ w1 << 13) + w3 + w12 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x34b0bcb5 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w4 = t = (w5 >>> 7 ^ w5 >>> 18 ^ w5 >>> 3 ^ w5 << 25 ^ w5 << 14) + (w2 >>> 17 ^ w2 >>> 19 ^ w2 >>> 10 ^ w2 << 15 ^ w2 << 13) + w4 + w13 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x391c0cb3 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w5 = t = (w6 >>> 7 ^ w6 >>> 18 ^ w6 >>> 3 ^ w6 << 25 ^ w6 << 14) + (w3 >>> 17 ^ w3 >>> 19 ^ w3 >>> 10 ^ w3 << 15 ^ w3 << 13) + w5 + w14 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x4ed8aa4a | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w6 = t = (w7 >>> 7 ^ w7 >>> 18 ^ w7 >>> 3 ^ w7 << 25 ^ w7 << 14) + (w4 >>> 17 ^ w4 >>> 19 ^ w4 >>> 10 ^ w4 << 15 ^ w4 << 13) + w6 + w15 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x5b9cca4f | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w7 = t = (w8 >>> 7 ^ w8 >>> 18 ^ w8 >>> 3 ^ w8 << 25 ^ w8 << 14) + (w5 >>> 17 ^ w5 >>> 19 ^ w5 >>> 10 ^ w5 << 15 ^ w5 << 13) + w7 + w0 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x682e6ff3 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w8 = t = (w9 >>> 7 ^ w9 >>> 18 ^ w9 >>> 3 ^ w9 << 25 ^ w9 << 14) + (w6 >>> 17 ^ w6 >>> 19 ^ w6 >>> 10 ^ w6 << 15 ^ w6 << 13) + w8 + w1 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x748f82ee | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w9 = t = (w10 >>> 7 ^ w10 >>> 18 ^ w10 >>> 3 ^ w10 << 25 ^ w10 << 14) + (w7 >>> 17 ^ w7 >>> 19 ^ w7 >>> 10 ^ w7 << 15 ^ w7 << 13) + w9 + w2 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x78a5636f | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w10 = t = (w11 >>> 7 ^ w11 >>> 18 ^ w11 >>> 3 ^ w11 << 25 ^ w11 << 14) + (w8 >>> 17 ^ w8 >>> 19 ^ w8 >>> 10 ^ w8 << 15 ^ w8 << 13) + w10 + w3 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x84c87814 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w11 = t = (w12 >>> 7 ^ w12 >>> 18 ^ w12 >>> 3 ^ w12 << 25 ^ w12 << 14) + (w9 >>> 17 ^ w9 >>> 19 ^ w9 >>> 10 ^ w9 << 15 ^ w9 << 13) + w11 + w4 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x8cc70208 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w12 = t = (w13 >>> 7 ^ w13 >>> 18 ^ w13 >>> 3 ^ w13 << 25 ^ w13 << 14) + (w10 >>> 17 ^ w10 >>> 19 ^ w10 >>> 10 ^ w10 << 15 ^ w10 << 13) + w12 + w5 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0x90befffa | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w13 = t = (w14 >>> 7 ^ w14 >>> 18 ^ w14 >>> 3 ^ w14 << 25 ^ w14 << 14) + (w11 >>> 17 ^ w11 >>> 19 ^ w11 >>> 10 ^ w11 << 15 ^ w11 << 13) + w13 + w6 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xa4506ceb | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w14 = t = (w15 >>> 7 ^ w15 >>> 18 ^ w15 >>> 3 ^ w15 << 25 ^ w15 << 14) + (w12 >>> 17 ^ w12 >>> 19 ^ w12 >>> 10 ^ w12 << 15 ^ w12 << 13) + w14 + w7 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xbef9a3f7 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - w15 = t = (w0 >>> 7 ^ w0 >>> 18 ^ w0 >>> 3 ^ w0 << 25 ^ w0 << 14) + (w13 >>> 17 ^ w13 >>> 19 ^ w13 >>> 10 ^ w13 << 15 ^ w13 << 13) + w15 + w8 | 0; - t = t + h + (e >>> 6 ^ e >>> 11 ^ e >>> 25 ^ e << 26 ^ e << 21 ^ e << 7) + (g ^ e & (f ^ g)) + 0xc67178f2 | 0; - h = g; - g = f; - f = e; - e = d + t | 0; - d = c; - c = b; - b = a; - a = t + (b & c ^ d & (b ^ c)) + (b >>> 2 ^ b >>> 13 ^ b >>> 22 ^ b << 30 ^ b << 19 ^ b << 10) | 0; - H0 = H0 + a | 0; - H1 = H1 + b | 0; - H2 = H2 + c | 0; - H3 = H3 + d | 0; - H4 = H4 + e | 0; - H5 = H5 + f | 0; - H6 = H6 + g | 0; - H7 = H7 + h | 0; - } - function _core_heap(offset) { - offset = offset | 0; - _core(HEAP[offset | 0] << 24 | HEAP[offset | 1] << 16 | HEAP[offset | 2] << 8 | HEAP[offset | 3], HEAP[offset | 4] << 24 | HEAP[offset | 5] << 16 | HEAP[offset | 6] << 8 | HEAP[offset | 7], HEAP[offset | 8] << 24 | HEAP[offset | 9] << 16 | HEAP[offset | 10] << 8 | HEAP[offset | 11], HEAP[offset | 12] << 24 | HEAP[offset | 13] << 16 | HEAP[offset | 14] << 8 | HEAP[offset | 15], HEAP[offset | 16] << 24 | HEAP[offset | 17] << 16 | HEAP[offset | 18] << 8 | HEAP[offset | 19], HEAP[offset | 20] << 24 | HEAP[offset | 21] << 16 | HEAP[offset | 22] << 8 | HEAP[offset | 23], HEAP[offset | 24] << 24 | HEAP[offset | 25] << 16 | HEAP[offset | 26] << 8 | HEAP[offset | 27], HEAP[offset | 28] << 24 | HEAP[offset | 29] << 16 | HEAP[offset | 30] << 8 | HEAP[offset | 31], HEAP[offset | 32] << 24 | HEAP[offset | 33] << 16 | HEAP[offset | 34] << 8 | HEAP[offset | 35], HEAP[offset | 36] << 24 | HEAP[offset | 37] << 16 | HEAP[offset | 38] << 8 | HEAP[offset | 39], HEAP[offset | 40] << 24 | HEAP[offset | 41] << 16 | HEAP[offset | 42] << 8 | HEAP[offset | 43], HEAP[offset | 44] << 24 | HEAP[offset | 45] << 16 | HEAP[offset | 46] << 8 | HEAP[offset | 47], HEAP[offset | 48] << 24 | HEAP[offset | 49] << 16 | HEAP[offset | 50] << 8 | HEAP[offset | 51], HEAP[offset | 52] << 24 | HEAP[offset | 53] << 16 | HEAP[offset | 54] << 8 | HEAP[offset | 55], HEAP[offset | 56] << 24 | HEAP[offset | 57] << 16 | HEAP[offset | 58] << 8 | HEAP[offset | 59], HEAP[offset | 60] << 24 | HEAP[offset | 61] << 16 | HEAP[offset | 62] << 8 | HEAP[offset | 63]); - } - function _state_to_heap(output) { - output = output | 0; - HEAP[output | 0] = H0 >>> 24; - HEAP[output | 1] = H0 >>> 16 & 255; - HEAP[output | 2] = H0 >>> 8 & 255; - HEAP[output | 3] = H0 & 255; - HEAP[output | 4] = H1 >>> 24; - HEAP[output | 5] = H1 >>> 16 & 255; - HEAP[output | 6] = H1 >>> 8 & 255; - HEAP[output | 7] = H1 & 255; - HEAP[output | 8] = H2 >>> 24; - HEAP[output | 9] = H2 >>> 16 & 255; - HEAP[output | 10] = H2 >>> 8 & 255; - HEAP[output | 11] = H2 & 255; - HEAP[output | 12] = H3 >>> 24; - HEAP[output | 13] = H3 >>> 16 & 255; - HEAP[output | 14] = H3 >>> 8 & 255; - HEAP[output | 15] = H3 & 255; - HEAP[output | 16] = H4 >>> 24; - HEAP[output | 17] = H4 >>> 16 & 255; - HEAP[output | 18] = H4 >>> 8 & 255; - HEAP[output | 19] = H4 & 255; - HEAP[output | 20] = H5 >>> 24; - HEAP[output | 21] = H5 >>> 16 & 255; - HEAP[output | 22] = H5 >>> 8 & 255; - HEAP[output | 23] = H5 & 255; - HEAP[output | 24] = H6 >>> 24; - HEAP[output | 25] = H6 >>> 16 & 255; - HEAP[output | 26] = H6 >>> 8 & 255; - HEAP[output | 27] = H6 & 255; - HEAP[output | 28] = H7 >>> 24; - HEAP[output | 29] = H7 >>> 16 & 255; - HEAP[output | 30] = H7 >>> 8 & 255; - HEAP[output | 31] = H7 & 255; - } - function reset() { - H0 = 0x6a09e667; - H1 = 0xbb67ae85; - H2 = 0x3c6ef372; - H3 = 0xa54ff53a; - H4 = 0x510e527f; - H5 = 0x9b05688c; - H6 = 0x1f83d9ab; - H7 = 0x5be0cd19; - TOTAL0 = TOTAL1 = 0; - } - function init(h0, h1, h2, h3, h4, h5, h6, h7, total0, total1) { - h0 = h0 | 0; - h1 = h1 | 0; - h2 = h2 | 0; - h3 = h3 | 0; - h4 = h4 | 0; - h5 = h5 | 0; - h6 = h6 | 0; - h7 = h7 | 0; - total0 = total0 | 0; - total1 = total1 | 0; - H0 = h0; - H1 = h1; - H2 = h2; - H3 = h3; - H4 = h4; - H5 = h5; - H6 = h6; - H7 = h7; - TOTAL0 = total0; - TOTAL1 = total1; - } - function process(offset, length) { - offset = offset | 0; - length = length | 0; - var hashed = 0; - if (offset & 63) return -1; - while ((length | 0) >= 64) { - _core_heap(offset); - offset = offset + 64 | 0; - length = length - 64 | 0; - hashed = hashed + 64 | 0; - } - TOTAL0 = TOTAL0 + hashed | 0; - if (TOTAL0 >>> 0 < hashed >>> 0) TOTAL1 = TOTAL1 + 1 | 0; - return hashed | 0; - } - function finish(offset, length, output) { - offset = offset | 0; - length = length | 0; - output = output | 0; - var hashed = 0, i = 0; - if (offset & 63) return -1; - if (~output) if (output & 31) return -1; - if ((length | 0) >= 64) { - hashed = process(offset, length) | 0; - if ((hashed | 0) == -1) return -1; - offset = offset + hashed | 0; - length = length - hashed | 0; - } - hashed = hashed + length | 0; - TOTAL0 = TOTAL0 + length | 0; - if (TOTAL0 >>> 0 < length >>> 0) TOTAL1 = TOTAL1 + 1 | 0; - HEAP[offset | length] = 0x80; - if ((length | 0) >= 56) { - for (i = length + 1 | 0; (i | 0) < 64; i = i + 1 | 0) HEAP[offset | i] = 0x00; - _core_heap(offset); - length = 0; - HEAP[offset | 0] = 0; - } - for (i = length + 1 | 0; (i | 0) < 59; i = i + 1 | 0) HEAP[offset | i] = 0; - HEAP[offset | 56] = TOTAL1 >>> 21 & 255; - HEAP[offset | 57] = TOTAL1 >>> 13 & 255; - HEAP[offset | 58] = TOTAL1 >>> 5 & 255; - HEAP[offset | 59] = TOTAL1 << 3 & 255 | TOTAL0 >>> 29; - HEAP[offset | 60] = TOTAL0 >>> 21 & 255; - HEAP[offset | 61] = TOTAL0 >>> 13 & 255; - HEAP[offset | 62] = TOTAL0 >>> 5 & 255; - HEAP[offset | 63] = TOTAL0 << 3 & 255; - _core_heap(offset); - if (~output) _state_to_heap(output); - return hashed | 0; - } - function hmac_reset() { - H0 = I0; - H1 = I1; - H2 = I2; - H3 = I3; - H4 = I4; - H5 = I5; - H6 = I6; - H7 = I7; - TOTAL0 = 64; - TOTAL1 = 0; - } - function _hmac_opad() { - H0 = O0; - H1 = O1; - H2 = O2; - H3 = O3; - H4 = O4; - H5 = O5; - H6 = O6; - H7 = O7; - TOTAL0 = 64; - TOTAL1 = 0; - } - function hmac_init(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15) { - p0 = p0 | 0; - p1 = p1 | 0; - p2 = p2 | 0; - p3 = p3 | 0; - p4 = p4 | 0; - p5 = p5 | 0; - p6 = p6 | 0; - p7 = p7 | 0; - p8 = p8 | 0; - p9 = p9 | 0; - p10 = p10 | 0; - p11 = p11 | 0; - p12 = p12 | 0; - p13 = p13 | 0; - p14 = p14 | 0; - p15 = p15 | 0; - reset(); - _core(p0 ^ 0x5c5c5c5c, p1 ^ 0x5c5c5c5c, p2 ^ 0x5c5c5c5c, p3 ^ 0x5c5c5c5c, p4 ^ 0x5c5c5c5c, p5 ^ 0x5c5c5c5c, p6 ^ 0x5c5c5c5c, p7 ^ 0x5c5c5c5c, p8 ^ 0x5c5c5c5c, p9 ^ 0x5c5c5c5c, p10 ^ 0x5c5c5c5c, p11 ^ 0x5c5c5c5c, p12 ^ 0x5c5c5c5c, p13 ^ 0x5c5c5c5c, p14 ^ 0x5c5c5c5c, p15 ^ 0x5c5c5c5c); - O0 = H0; - O1 = H1; - O2 = H2; - O3 = H3; - O4 = H4; - O5 = H5; - O6 = H6; - O7 = H7; - reset(); - _core(p0 ^ 0x36363636, p1 ^ 0x36363636, p2 ^ 0x36363636, p3 ^ 0x36363636, p4 ^ 0x36363636, p5 ^ 0x36363636, p6 ^ 0x36363636, p7 ^ 0x36363636, p8 ^ 0x36363636, p9 ^ 0x36363636, p10 ^ 0x36363636, p11 ^ 0x36363636, p12 ^ 0x36363636, p13 ^ 0x36363636, p14 ^ 0x36363636, p15 ^ 0x36363636); - I0 = H0; - I1 = H1; - I2 = H2; - I3 = H3; - I4 = H4; - I5 = H5; - I6 = H6; - I7 = H7; - TOTAL0 = 64; - TOTAL1 = 0; - } - function hmac_finish(offset, length, output) { - offset = offset | 0; - length = length | 0; - output = output | 0; - var t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, hashed = 0; - if (offset & 63) return -1; - if (~output) if (output & 31) return -1; - hashed = finish(offset, length, -1) | 0; - t0 = H0, t1 = H1, t2 = H2, t3 = H3, t4 = H4, t5 = H5, t6 = H6, t7 = H7; - _hmac_opad(); - _core(t0, t1, t2, t3, t4, t5, t6, t7, 0x80000000, 0, 0, 0, 0, 0, 0, 768); - if (~output) _state_to_heap(output); - return hashed | 0; - } - function pbkdf2_generate_block(offset, length, block, count, output) { - offset = offset | 0; - length = length | 0; - block = block | 0; - count = count | 0; - output = output | 0; - var h0 = 0, h1 = 0, h2 = 0, h3 = 0, h4 = 0, h5 = 0, h6 = 0, h7 = 0, t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0; - if (offset & 63) return -1; - if (~output) if (output & 31) return -1; - HEAP[offset + length | 0] = block >>> 24; - HEAP[offset + length + 1 | 0] = block >>> 16 & 255; - HEAP[offset + length + 2 | 0] = block >>> 8 & 255; - HEAP[offset + length + 3 | 0] = block & 255; - hmac_finish(offset, length + 4 | 0, -1) | 0; - h0 = t0 = H0, h1 = t1 = H1, h2 = t2 = H2, h3 = t3 = H3, h4 = t4 = H4, h5 = t5 = H5, - h6 = t6 = H6, h7 = t7 = H7; - count = count - 1 | 0; - while ((count | 0) > 0) { - hmac_reset(); - _core(t0, t1, t2, t3, t4, t5, t6, t7, 0x80000000, 0, 0, 0, 0, 0, 0, 768); - t0 = H0, t1 = H1, t2 = H2, t3 = H3, t4 = H4, t5 = H5, t6 = H6, t7 = H7; - _hmac_opad(); - _core(t0, t1, t2, t3, t4, t5, t6, t7, 0x80000000, 0, 0, 0, 0, 0, 0, 768); - t0 = H0, t1 = H1, t2 = H2, t3 = H3, t4 = H4, t5 = H5, t6 = H6, t7 = H7; - h0 = h0 ^ H0; - h1 = h1 ^ H1; - h2 = h2 ^ H2; - h3 = h3 ^ H3; - h4 = h4 ^ H4; - h5 = h5 ^ H5; - h6 = h6 ^ H6; - h7 = h7 ^ H7; - count = count - 1 | 0; - } - H0 = h0; - H1 = h1; - H2 = h2; - H3 = h3; - H4 = h4; - H5 = h5; - H6 = h6; - H7 = h7; - if (~output) _state_to_heap(output); - return 0; - } - return { - reset, - init, - process, - finish, - hmac_reset, - hmac_init, - hmac_finish, - pbkdf2_generate_block - }; - }; - }, - "transform/TextTransformer.js": function(module, exports, require) { - var Operation = require("../Operation"); - var Common = require("../Common"); - var transformOp0 = function(toTransform, transformBy) { - if (toTransform.offset > transformBy.offset) { - if (toTransform.offset > transformBy.offset + transformBy.toRemove) { - return Operation.create(toTransform.offset - transformBy.toRemove + transformBy.toInsert.length, toTransform.toRemove, toTransform.toInsert); - } - var newToRemove = toTransform.toRemove - (transformBy.offset + transformBy.toRemove - toTransform.offset); - if (newToRemove < 0) { - newToRemove = 0; - } - if (newToRemove === 0 && toTransform.toInsert.length === 0) { - return null; - } - return Operation.create(transformBy.offset + transformBy.toInsert.length, newToRemove, toTransform.toInsert); - } - if (toTransform.offset + toTransform.toRemove < transformBy.offset) { - return toTransform; - } - var _newToRemove = transformBy.offset - toTransform.offset; - if (_newToRemove === 0 && toTransform.toInsert.length === 0) { - return null; - } - return Operation.create(toTransform.offset, _newToRemove, toTransform.toInsert); - }; - var transformOp = function(toTransform, transformBy) { - if (Common.PARANOIA) { - Operation.check(toTransform); - Operation.check(transformBy); - } - var result = transformOp0(toTransform, transformBy); - if (Common.PARANOIA && result) { - Operation.check(result); - } - return result; - }; - module.exports = function(opsToTransform, opsTransformBy, doc) { - var resultOfTransformBy = doc; - var i; - for (i = opsTransformBy.length - 1; i >= 0; i--) { - resultOfTransformBy = Operation.apply(opsTransformBy[i], resultOfTransformBy); - } - var out = []; - for (i = opsToTransform.length - 1; i >= 0; i--) { - var tti = opsToTransform[i]; - for (var j = opsTransformBy.length - 1; j >= 0; j--) { - try { - tti = transformOp(tti, opsTransformBy[j]); - } catch (e) { - console.error("The pluggable transform function threw an error, " + "failing operational transformation"); - console.error(e.stack); - return []; - } - if (!tti) { - break; - } - } - if (tti) { - if (Common.PARANOIA) { - Operation.check(tti, resultOfTransformBy.length); - } - out.unshift(tti); - } - } - return out; - }; - }, - "transform/NaiveJSONTransformer.js": function(module, exports, require) { - var TextTransformer = require("./TextTransformer"); - var Operation = require("../Operation"); - var Common = require("../Common"); - module.exports = function(opsToTransform, opsTransformBy, text) { - var DEBUG = Common.global.REALTIME_DEBUG = Common.global.REALTIME_DEBUG || {}; - var resultOps, text2, text3; - try { - resultOps = TextTransformer(opsToTransform, opsTransformBy, text); - text2 = Operation.applyMulti(opsTransformBy, text); - text3 = Operation.applyMulti(resultOps, text2); - try { - JSON.parse(text3); - return resultOps; - } catch (e) { - console.error(e); - DEBUG.ot_parseError = { - type: "resultParseError", - resultOps, - toTransform: opsToTransform, - transformBy: opsTransformBy, - text1: text, - text2, - text3, - error: e - }; - console.log("Debugging info available at `window.REALTIME_DEBUG.ot_parseError`"); - } - } catch (x) { - console.error(x); - DEBUG.ot_applyError = { - type: "resultParseError", - resultOps, - toTransform: opsToTransform, - transformBy: opsTransformBy, - text1: text, - text2, - text3, - error: x - }; - console.log("Debugging info available at `window.REALTIME_DEBUG.ot_applyError`"); - } - return []; - }; - }, - "transform/SmartJSONTransformer.js": function(module, exports, require) { - var Sortify = require("json.sortify"); - var Diff = require("../Diff"); - var Operation = require("../Operation"); - var TextTransformer = require("./TextTransformer"); - var isArray = function(obj) { - return Object.prototype.toString.call(obj) === "[object Array]"; - }; - var type = function(dat) { - return dat === null ? "null" : isArray(dat) ? "array" : typeof dat; - }; - var find = function(map, path) { - var l = path.length; - for (var i = 0; i < l; i++) { - if (typeof map[path[i]] === "undefined") { - return; - } - map = map[path[i]]; - } - return map; - }; - var clone = function(val) { - return JSON.parse(JSON.stringify(val)); - }; - var deepEqual = function(A, B) { - var t_A = type(A); - var t_B = type(B); - if (t_A !== t_B) { - return false; - } - if (t_A === "object") { - var k_A = Object.keys(A); - var k_B = Object.keys(B); - return k_A.length === k_B.length && !k_A.some((function(a) { - return !deepEqual(A[a], B[a]); - })) && !k_B.some((function(b) { - return !(b in A); - })); - } else if (t_A === "array") { - return A.length === B.length && !A.some((function(a, i) { - return !deepEqual(a, B[i]); - })); - } else { - return A === B; - } - }; - var operation = function(type, path, value, prev, other) { - if (type === "replace") { - return { - type: "replace", - path, - value, - prev - }; - } else if (type === "splice") { - if (typeof prev !== "number") { - throw new Error; - } - if (typeof other !== "number") { - throw new Error; - } - return { - type: "splice", - path, - value, - offset: prev, - removals: other - }; - } else if (type !== "remove") { - throw new Error("expected a removal"); - } - return { - type: "remove", - path, - value - }; - }; - var replace = function(ops, path, to, from) { - ops.push(operation("replace", path, to, from)); - }; - var remove = function(ops, path, val) { - ops.push(operation("remove", path, val)); - }; - var splice = function(ops, path, value, offset, removals) { - ops.push(operation("splice", path, value, offset, removals)); - }; - var pathOverlaps = function(A, B) { - return !A.some((function(a, i) { - return a !== B[i]; - })); - }; - var CASES = function() { - var types = [ "replace", "remove", "splice" ]; - var matrix = {}; - var i = 1; - types.forEach((function(a) { - matrix[a] = {}; - return types.forEach((function(b) { - matrix[a][b] = i++; - })); - })); - return matrix; - }(); - var resolve = function(A, B, arbiter) { - if (!(type(A) === "array" && type(B) === "array")) { - throw new Error("[resolve] expected two arrays"); - } - B = B.filter((function(b) { - if (A.some((function(a) { - if (a.type === "remove") { - if (pathOverlaps(a.path, b.path)) { - if (b.path.length - a.path.length > 1) { - return true; - } - } - } - }))) { - return false; - } - if (b.type === "splice" && A.some((function(a) { - if (a.type === "splice" && pathOverlaps(a.path, b.path)) { - if (a.path.length - b.path.length < 0) { - if (!a.removals) { - return; - } - var start = a.offset; - var end = a.offset + a.removals; - for (;start < end; start++) { - if (start === b.path[a.path.length]) { - return true; - } - } - } - } - }))) { - return false; - } - if (!A.some((function(a) { - return b.type === "remove" && deepEqual(a.path, b.path); - }))) { - return true; - } - })).filter((function(b) { - return !A.some((function(a) { - if (b.type === "replace" && a.type === "replace") { - if (deepEqual(a.path, b.path)) { - if (typeof a.value === "string" && typeof b.value === "string") { - if (arbiter && a.prev === b.prev && a.value !== b.value) { - return arbiter(a, b, CASES.replace.replace); - } - return true; - } - return true; - } - } - })); - })).map((function(b) { - A.forEach((function(a) { - if (a.type === "splice") { - if (deepEqual(a.path, b.path)) { - if (b.type === "splice") { - if (b.offset > a.offset + b.removals) { - b.offset += a.value.length - a.removals; - return; - } - if (b.offset < a.offset) { - b.removals = Math.max(a.offset - b.offset, 0); - return; - } - b.removals = Math.max(b.removals - (b.offset + a.removals - b.offset), 0); - b.offset += a.value.length - a.removals; - } - return; - } - if (pathOverlaps(a.path, b.path)) { - var pos = a.path.length; - if (typeof b.path[pos] === "number" && a.offset <= b.path[pos]) { - b.path[pos] += a.value.length - a.removals; - } - } - } - })); - return b; - })); - return B; - }; - var objects = function(A, B, path, ops) { - var Akeys = Object.keys(A); - var Bkeys = Object.keys(B); - Bkeys.forEach((function(b) { - var t_b = type(B[b]); - var old = A[b]; - var nextPath = path.concat(b); - if (Akeys.indexOf(b) === -1) { - if (t_b === "undefined") { - throw new Error("undefined type has key. this shouldn't happen?"); - } - if (old) { - throw new Error("no such key existed in b, so 'old' should be falsey"); - } - replace(ops, nextPath, B[b], old); - return; - } - var t_a = type(old); - if (t_a !== t_b) { - console.log("type changed from [%s] to [%s]", t_a, t_b); - if (t_b === "undefined") { - throw new Error("first pass should never reveal undefined keys"); - } - replace(ops, nextPath, B[b], old); - return; - } - if (t_a === "object") { - objects(A[b], B[b], nextPath, ops); - } else if (t_a === "array") { - arrays(A[b], B[b], nextPath, ops); - } else if (A[b] !== B[b]) { - replace(ops, nextPath, B[b], old); - } - })); - Akeys.forEach((function(a) { - if (Bkeys.indexOf(a) === -1 || type(B[a]) === "undefined") { - remove(ops, path.concat(a), A[a]); - } - })); - }; - var arrayShallowEquality = function(A, B) { - if (A.length !== B.length) { - return false; - } - for (var i = 0; i < A.length; i++) { - if (type(A[i]) !== type(B[i])) { - return false; - } - } - return true; - }; - var arrays = function(A_orig, B, path, ops) { - var A = A_orig.slice(0); - if (A.length === 0) { - splice(ops, path, B, 0, 0); - } else if (arrayShallowEquality(A, B)) { - A.forEach((function(a, i) { - var b = B[i]; - if (b === a) { - return; - } - var old = a; - var nextPath = path.concat(i); - var t_a = type(a); - switch (t_a) { - case "undefined": - throw new Error("existing key had type `undefined`. this should never happen"); - - case "object": - objects(a, b, nextPath, ops); - break; - - case "array": - arrays(a, b, nextPath, ops); - break; - - default: - replace(ops, nextPath, b, old); - } - })); - } else { - var commonStart = 0; - var commonEnd = 0; - while (commonStart < A.length && deepEqual(A[commonStart], B[commonStart])) { - commonStart++; - } - while (deepEqual(A[A.length - 1 - commonEnd], B[B.length - 1 - commonEnd]) && commonEnd + commonStart < A.length && commonEnd + commonStart < B.length) { - commonEnd++; - } - var toRemove = A.length - commonStart - commonEnd; - var toInsert = []; - if (B.length !== commonStart + commonEnd) { - toInsert = B.slice(commonStart, B.length - commonEnd); - } - splice(ops, path, toInsert, commonStart, toRemove); - } - }; - var diff = function(A, B) { - var ops = []; - var t_A = type(A); - var t_B = type(B); - if (t_A !== t_B) { - throw new Error("Can't merge two objects of differing types"); - } - if (t_B === "array") { - arrays(A, B, [], ops); - } else if (t_B === "object") { - objects(A, B, [], ops); - } else { - throw new Error("unsupported datatype" + t_B); - } - return ops; - }; - var applyOp = function(O, op) { - var path; - var key; - var result; - switch (op.type) { - case "replace": - key = op.path[op.path.length - 1]; - path = op.path.slice(0, op.path.length - 1); - var parent = find(O, path); - if (!parent) { - throw new Error("cannot apply change to non-existent element"); - } - parent[key] = op.value; - break; - - case "splice": - var found = find(O, op.path); - if (!found) { - console.error("[applyOp] expected path [%s] to exist in object", op.path.join(",")); - throw new Error("Path did not exist"); - } - if (type(found) !== "array") { - throw new Error("Can't splice non-array"); - } - Array.prototype.splice.apply(found, [ op.offset, op.removals ].concat(op.value)); - break; - - case "remove": - key = op.path[op.path.length - 1]; - path = op.path.slice(0, op.path.length - 1); - result = find(O, path); - if (typeof result !== "undefined") { - delete result[key]; - } - break; - - default: - throw new Error("unsupported operation type"); - } - }; - var patch = function(O, ops) { - ops.forEach((function(op) { - applyOp(O, op); - })); - return O; - }; - var arbiter = function(p_a, p_b, c) { - if (p_a.prev !== p_b.prev) { - throw new Error("Parent values don't match!"); - } - if (c === CASES.splice.splice) { - console.log(p_a); - console.log(p_b); - console.log("\n\n\n\n\n\n\n\n\n"); - return true; - } - var o = p_a.prev; - var ops_a = Diff.diff(o, p_a.value); - var ops_b = Diff.diff(o, p_b.value); - var ops_x = TextTransformer(ops_b, ops_a, o); - var x2 = Operation.applyMulti(ops_a, o); - var x3 = Operation.applyMulti(ops_x, x2); - p_b.value = x3; - }; - module.exports = function(opsToTransform, opsTransformBy, s_orig) { - var o_orig = JSON.parse(s_orig); - var s_transformBy = Operation.applyMulti(opsTransformBy, s_orig); - var o_transformBy = JSON.parse(s_transformBy); - var s_toTransform = Operation.applyMulti(opsToTransform, s_orig); - var o_toTransform = JSON.parse(s_toTransform); - try { - var diffTTF = diff(o_orig, o_toTransform); - var diffTFB = diff(o_orig, o_transformBy); - var newDiffTTF = resolve(diffTFB, diffTTF, arbiter); - patch(o_orig, diffTFB); - patch(o_orig, newDiffTTF); - var result = Sortify(o_orig); - var ret = Diff.diff(s_transformBy, result); - return ret; - } catch (err) { - console.error(err); - } - return []; - }; - module.exports._ = { - clone, - pathOverlaps, - deepEqual, - diff, - resolve, - patch, - arbiter - }; - } - }; - r.m[1] = { - "dist/JSON.sortify.js": function(module, exports, require) { - (function(factory) { - if (typeof module !== "undefined" && module.exports) module.exports = factory(); else JSON.sortify = factory(); - })((function() { - var sortKeys = function sortKeys(o) { - if (Array.isArray(o)) { - return o.map(sortKeys); - } else if (o instanceof Object) { - var _ret = function() { - var numeric = []; - var nonNumeric = []; - Object.keys(o).forEach((function(key) { - if (/^(0|[1-9][0-9]*)$/.test(key)) { - numeric.push(+key); - } else { - nonNumeric.push(key); - } - })); - return { - v: numeric.sort((function(a, b) { - return a - b; - })).concat(nonNumeric.sort()).reduce((function(result, key) { - result[key] = sortKeys(o[key]); - return result; - }), {}) - }; - }(); - if (typeof _ret === "object") return _ret.v; - } - return o; - }; - var jsonStringify = JSON.stringify.bind(JSON); - var sortify = function sortify(value, replacer, space) { - var nativeJson = jsonStringify(value, replacer, 0); - if (!nativeJson || nativeJson[0] !== "{" && nativeJson[0] !== "[") { - return nativeJson; - } - var cleanObj = JSON.parse(nativeJson); - return jsonStringify(sortKeys(cleanObj), null, space); - }; - return sortify; - })); - } - }; - r.m[2] = { - "diff.js": function(module, exports, require) { - var DIFF_DELETE = -1; - var DIFF_INSERT = 1; - var DIFF_EQUAL = 0; - function diff_main(text1, text2, cursor_pos, _fix_unicode) { - if (text1 === text2) { - if (text1) { - return [ [ DIFF_EQUAL, text1 ] ]; - } - return []; - } - if (cursor_pos != null) { - var editdiff = find_cursor_edit_diff(text1, text2, cursor_pos); - if (editdiff) { - return editdiff; - } - } - var commonlength = diff_commonPrefix(text1, text2); - var commonprefix = text1.substring(0, commonlength); - text1 = text1.substring(commonlength); - text2 = text2.substring(commonlength); - commonlength = diff_commonSuffix(text1, text2); - var commonsuffix = text1.substring(text1.length - commonlength); - text1 = text1.substring(0, text1.length - commonlength); - text2 = text2.substring(0, text2.length - commonlength); - var diffs = diff_compute_(text1, text2); - if (commonprefix) { - diffs.unshift([ DIFF_EQUAL, commonprefix ]); - } - if (commonsuffix) { - diffs.push([ DIFF_EQUAL, commonsuffix ]); - } - diff_cleanupMerge(diffs, _fix_unicode); - return diffs; - } - function diff_compute_(text1, text2) { - var diffs; - if (!text1) { - return [ [ DIFF_INSERT, text2 ] ]; - } - if (!text2) { - return [ [ DIFF_DELETE, text1 ] ]; - } - var longtext = text1.length > text2.length ? text1 : text2; - var shorttext = text1.length > text2.length ? text2 : text1; - var i = longtext.indexOf(shorttext); - if (i !== -1) { - diffs = [ [ DIFF_INSERT, longtext.substring(0, i) ], [ DIFF_EQUAL, shorttext ], [ DIFF_INSERT, longtext.substring(i + shorttext.length) ] ]; - if (text1.length > text2.length) { - diffs[0][0] = diffs[2][0] = DIFF_DELETE; - } - return diffs; - } - if (shorttext.length === 1) { - return [ [ DIFF_DELETE, text1 ], [ DIFF_INSERT, text2 ] ]; - } - var hm = diff_halfMatch_(text1, text2); - if (hm) { - var text1_a = hm[0]; - var text1_b = hm[1]; - var text2_a = hm[2]; - var text2_b = hm[3]; - var mid_common = hm[4]; - var diffs_a = diff_main(text1_a, text2_a); - var diffs_b = diff_main(text1_b, text2_b); - return diffs_a.concat([ [ DIFF_EQUAL, mid_common ] ], diffs_b); - } - return diff_bisect_(text1, text2); - } - function diff_bisect_(text1, text2) { - var text1_length = text1.length; - var text2_length = text2.length; - var max_d = Math.ceil((text1_length + text2_length) / 2); - var v_offset = max_d; - var v_length = 2 * max_d; - var v1 = new Array(v_length); - var v2 = new Array(v_length); - for (var x = 0; x < v_length; x++) { - v1[x] = -1; - v2[x] = -1; - } - v1[v_offset + 1] = 0; - v2[v_offset + 1] = 0; - var delta = text1_length - text2_length; - var front = delta % 2 !== 0; - var k1start = 0; - var k1end = 0; - var k2start = 0; - var k2end = 0; - for (var d = 0; d < max_d; d++) { - for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) { - var k1_offset = v_offset + k1; - var x1; - if (k1 === -d || k1 !== d && v1[k1_offset - 1] < v1[k1_offset + 1]) { - x1 = v1[k1_offset + 1]; - } else { - x1 = v1[k1_offset - 1] + 1; - } - var y1 = x1 - k1; - while (x1 < text1_length && y1 < text2_length && text1.charAt(x1) === text2.charAt(y1)) { - x1++; - y1++; - } - v1[k1_offset] = x1; - if (x1 > text1_length) { - k1end += 2; - } else if (y1 > text2_length) { - k1start += 2; - } else if (front) { - var k2_offset = v_offset + delta - k1; - if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] !== -1) { - var x2 = text1_length - v2[k2_offset]; - if (x1 >= x2) { - return diff_bisectSplit_(text1, text2, x1, y1); - } - } - } - } - for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) { - var k2_offset = v_offset + k2; - var x2; - if (k2 === -d || k2 !== d && v2[k2_offset - 1] < v2[k2_offset + 1]) { - x2 = v2[k2_offset + 1]; - } else { - x2 = v2[k2_offset - 1] + 1; - } - var y2 = x2 - k2; - while (x2 < text1_length && y2 < text2_length && text1.charAt(text1_length - x2 - 1) === text2.charAt(text2_length - y2 - 1)) { - x2++; - y2++; - } - v2[k2_offset] = x2; - if (x2 > text1_length) { - k2end += 2; - } else if (y2 > text2_length) { - k2start += 2; - } else if (!front) { - var k1_offset = v_offset + delta - k2; - if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] !== -1) { - var x1 = v1[k1_offset]; - var y1 = v_offset + x1 - k1_offset; - x2 = text1_length - x2; - if (x1 >= x2) { - return diff_bisectSplit_(text1, text2, x1, y1); - } - } - } - } - } - return [ [ DIFF_DELETE, text1 ], [ DIFF_INSERT, text2 ] ]; - } - function diff_bisectSplit_(text1, text2, x, y) { - var text1a = text1.substring(0, x); - var text2a = text2.substring(0, y); - var text1b = text1.substring(x); - var text2b = text2.substring(y); - var diffs = diff_main(text1a, text2a); - var diffsb = diff_main(text1b, text2b); - return diffs.concat(diffsb); - } - function diff_commonPrefix(text1, text2) { - if (!text1 || !text2 || text1.charAt(0) !== text2.charAt(0)) { - return 0; - } - var pointermin = 0; - var pointermax = Math.min(text1.length, text2.length); - var pointermid = pointermax; - var pointerstart = 0; - while (pointermin < pointermid) { - if (text1.substring(pointerstart, pointermid) == text2.substring(pointerstart, pointermid)) { - pointermin = pointermid; - pointerstart = pointermin; - } else { - pointermax = pointermid; - } - pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin); - } - if (is_surrogate_pair_start(text1.charCodeAt(pointermid - 1))) { - pointermid--; - } - return pointermid; - } - function diff_commonSuffix(text1, text2) { - if (!text1 || !text2 || text1.slice(-1) !== text2.slice(-1)) { - return 0; - } - var pointermin = 0; - var pointermax = Math.min(text1.length, text2.length); - var pointermid = pointermax; - var pointerend = 0; - while (pointermin < pointermid) { - if (text1.substring(text1.length - pointermid, text1.length - pointerend) == text2.substring(text2.length - pointermid, text2.length - pointerend)) { - pointermin = pointermid; - pointerend = pointermin; - } else { - pointermax = pointermid; - } - pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin); - } - if (is_surrogate_pair_end(text1.charCodeAt(text1.length - pointermid))) { - pointermid--; - } - return pointermid; - } - function diff_halfMatch_(text1, text2) { - var longtext = text1.length > text2.length ? text1 : text2; - var shorttext = text1.length > text2.length ? text2 : text1; - if (longtext.length < 4 || shorttext.length * 2 < longtext.length) { - return null; - } - function diff_halfMatchI_(longtext, shorttext, i) { - var seed = longtext.substring(i, i + Math.floor(longtext.length / 4)); - var j = -1; - var best_common = ""; - var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b; - while ((j = shorttext.indexOf(seed, j + 1)) !== -1) { - var prefixLength = diff_commonPrefix(longtext.substring(i), shorttext.substring(j)); - var suffixLength = diff_commonSuffix(longtext.substring(0, i), shorttext.substring(0, j)); - if (best_common.length < suffixLength + prefixLength) { - best_common = shorttext.substring(j - suffixLength, j) + shorttext.substring(j, j + prefixLength); - best_longtext_a = longtext.substring(0, i - suffixLength); - best_longtext_b = longtext.substring(i + prefixLength); - best_shorttext_a = shorttext.substring(0, j - suffixLength); - best_shorttext_b = shorttext.substring(j + prefixLength); - } - } - if (best_common.length * 2 >= longtext.length) { - return [ best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b, best_common ]; - } else { - return null; - } - } - var hm1 = diff_halfMatchI_(longtext, shorttext, Math.ceil(longtext.length / 4)); - var hm2 = diff_halfMatchI_(longtext, shorttext, Math.ceil(longtext.length / 2)); - var hm; - if (!hm1 && !hm2) { - return null; - } else if (!hm2) { - hm = hm1; - } else if (!hm1) { - hm = hm2; - } else { - hm = hm1[4].length > hm2[4].length ? hm1 : hm2; - } - var text1_a, text1_b, text2_a, text2_b; - if (text1.length > text2.length) { - text1_a = hm[0]; - text1_b = hm[1]; - text2_a = hm[2]; - text2_b = hm[3]; - } else { - text2_a = hm[0]; - text2_b = hm[1]; - text1_a = hm[2]; - text1_b = hm[3]; - } - var mid_common = hm[4]; - return [ text1_a, text1_b, text2_a, text2_b, mid_common ]; - } - function diff_cleanupMerge(diffs, fix_unicode) { - diffs.push([ DIFF_EQUAL, "" ]); - var pointer = 0; - var count_delete = 0; - var count_insert = 0; - var text_delete = ""; - var text_insert = ""; - var commonlength; - while (pointer < diffs.length) { - if (pointer < diffs.length - 1 && !diffs[pointer][1]) { - diffs.splice(pointer, 1); - continue; - } - switch (diffs[pointer][0]) { - case DIFF_INSERT: - count_insert++; - text_insert += diffs[pointer][1]; - pointer++; - break; - - case DIFF_DELETE: - count_delete++; - text_delete += diffs[pointer][1]; - pointer++; - break; - - case DIFF_EQUAL: - var previous_equality = pointer - count_insert - count_delete - 1; - if (fix_unicode) { - if (previous_equality >= 0 && ends_with_pair_start(diffs[previous_equality][1])) { - var stray = diffs[previous_equality][1].slice(-1); - diffs[previous_equality][1] = diffs[previous_equality][1].slice(0, -1); - text_delete = stray + text_delete; - text_insert = stray + text_insert; - if (!diffs[previous_equality][1]) { - diffs.splice(previous_equality, 1); - pointer--; - var k = previous_equality - 1; - if (diffs[k] && diffs[k][0] === DIFF_INSERT) { - count_insert++; - text_insert = diffs[k][1] + text_insert; - k--; - } - if (diffs[k] && diffs[k][0] === DIFF_DELETE) { - count_delete++; - text_delete = diffs[k][1] + text_delete; - k--; - } - previous_equality = k; - } - } - if (starts_with_pair_end(diffs[pointer][1])) { - var stray = diffs[pointer][1].charAt(0); - diffs[pointer][1] = diffs[pointer][1].slice(1); - text_delete += stray; - text_insert += stray; - } - } - if (pointer < diffs.length - 1 && !diffs[pointer][1]) { - diffs.splice(pointer, 1); - break; - } - if (text_delete.length > 0 || text_insert.length > 0) { - if (text_delete.length > 0 && text_insert.length > 0) { - commonlength = diff_commonPrefix(text_insert, text_delete); - if (commonlength !== 0) { - if (previous_equality >= 0) { - diffs[previous_equality][1] += text_insert.substring(0, commonlength); - } else { - diffs.splice(0, 0, [ DIFF_EQUAL, text_insert.substring(0, commonlength) ]); - pointer++; - } - text_insert = text_insert.substring(commonlength); - text_delete = text_delete.substring(commonlength); - } - commonlength = diff_commonSuffix(text_insert, text_delete); - if (commonlength !== 0) { - diffs[pointer][1] = text_insert.substring(text_insert.length - commonlength) + diffs[pointer][1]; - text_insert = text_insert.substring(0, text_insert.length - commonlength); - text_delete = text_delete.substring(0, text_delete.length - commonlength); - } - } - var n = count_insert + count_delete; - if (text_delete.length === 0 && text_insert.length === 0) { - diffs.splice(pointer - n, n); - pointer = pointer - n; - } else if (text_delete.length === 0) { - diffs.splice(pointer - n, n, [ DIFF_INSERT, text_insert ]); - pointer = pointer - n + 1; - } else if (text_insert.length === 0) { - diffs.splice(pointer - n, n, [ DIFF_DELETE, text_delete ]); - pointer = pointer - n + 1; - } else { - diffs.splice(pointer - n, n, [ DIFF_DELETE, text_delete ], [ DIFF_INSERT, text_insert ]); - pointer = pointer - n + 2; - } - } - if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) { - diffs[pointer - 1][1] += diffs[pointer][1]; - diffs.splice(pointer, 1); - } else { - pointer++; - } - count_insert = 0; - count_delete = 0; - text_delete = ""; - text_insert = ""; - break; - } - } - if (diffs[diffs.length - 1][1] === "") { - diffs.pop(); - } - var changes = false; - pointer = 1; - while (pointer < diffs.length - 1) { - if (diffs[pointer - 1][0] === DIFF_EQUAL && diffs[pointer + 1][0] === DIFF_EQUAL) { - if (diffs[pointer][1].substring(diffs[pointer][1].length - diffs[pointer - 1][1].length) === diffs[pointer - 1][1]) { - diffs[pointer][1] = diffs[pointer - 1][1] + diffs[pointer][1].substring(0, diffs[pointer][1].length - diffs[pointer - 1][1].length); - diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1]; - diffs.splice(pointer - 1, 1); - changes = true; - } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) == diffs[pointer + 1][1]) { - diffs[pointer - 1][1] += diffs[pointer + 1][1]; - diffs[pointer][1] = diffs[pointer][1].substring(diffs[pointer + 1][1].length) + diffs[pointer + 1][1]; - diffs.splice(pointer + 1, 1); - changes = true; - } - } - pointer++; - } - if (changes) { - diff_cleanupMerge(diffs, fix_unicode); - } - } - function is_surrogate_pair_start(charCode) { - return charCode >= 55296 && charCode <= 56319; - } - function is_surrogate_pair_end(charCode) { - return charCode >= 56320 && charCode <= 57343; - } - function starts_with_pair_end(str) { - return is_surrogate_pair_end(str.charCodeAt(0)); - } - function ends_with_pair_start(str) { - return is_surrogate_pair_start(str.charCodeAt(str.length - 1)); - } - function remove_empty_tuples(tuples) { - var ret = []; - for (var i = 0; i < tuples.length; i++) { - if (tuples[i][1].length > 0) { - ret.push(tuples[i]); - } - } - return ret; - } - function make_edit_splice(before, oldMiddle, newMiddle, after) { - if (ends_with_pair_start(before) || starts_with_pair_end(after)) { - return null; - } - return remove_empty_tuples([ [ DIFF_EQUAL, before ], [ DIFF_DELETE, oldMiddle ], [ DIFF_INSERT, newMiddle ], [ DIFF_EQUAL, after ] ]); - } - function find_cursor_edit_diff(oldText, newText, cursor_pos) { - var oldRange = typeof cursor_pos === "number" ? { - index: cursor_pos, - length: 0 - } : cursor_pos.oldRange; - var newRange = typeof cursor_pos === "number" ? null : cursor_pos.newRange; - var oldLength = oldText.length; - var newLength = newText.length; - if (oldRange.length === 0 && (newRange === null || newRange.length === 0)) { - var oldCursor = oldRange.index; - var oldBefore = oldText.slice(0, oldCursor); - var oldAfter = oldText.slice(oldCursor); - var maybeNewCursor = newRange ? newRange.index : null; - editBefore: { - var newCursor = oldCursor + newLength - oldLength; - if (maybeNewCursor !== null && maybeNewCursor !== newCursor) { - break editBefore; - } - if (newCursor < 0 || newCursor > newLength) { - break editBefore; - } - var newBefore = newText.slice(0, newCursor); - var newAfter = newText.slice(newCursor); - if (newAfter !== oldAfter) { - break editBefore; - } - var prefixLength = Math.min(oldCursor, newCursor); - var oldPrefix = oldBefore.slice(0, prefixLength); - var newPrefix = newBefore.slice(0, prefixLength); - if (oldPrefix !== newPrefix) { - break editBefore; - } - var oldMiddle = oldBefore.slice(prefixLength); - var newMiddle = newBefore.slice(prefixLength); - return make_edit_splice(oldPrefix, oldMiddle, newMiddle, oldAfter); - } - editAfter: { - if (maybeNewCursor !== null && maybeNewCursor !== oldCursor) { - break editAfter; - } - var cursor = oldCursor; - var newBefore = newText.slice(0, cursor); - var newAfter = newText.slice(cursor); - if (newBefore !== oldBefore) { - break editAfter; - } - var suffixLength = Math.min(oldLength - cursor, newLength - cursor); - var oldSuffix = oldAfter.slice(oldAfter.length - suffixLength); - var newSuffix = newAfter.slice(newAfter.length - suffixLength); - if (oldSuffix !== newSuffix) { - break editAfter; - } - var oldMiddle = oldAfter.slice(0, oldAfter.length - suffixLength); - var newMiddle = newAfter.slice(0, newAfter.length - suffixLength); - return make_edit_splice(oldBefore, oldMiddle, newMiddle, oldSuffix); - } - } - if (oldRange.length > 0 && newRange && newRange.length === 0) { - replaceRange: { - var oldPrefix = oldText.slice(0, oldRange.index); - var oldSuffix = oldText.slice(oldRange.index + oldRange.length); - var prefixLength = oldPrefix.length; - var suffixLength = oldSuffix.length; - if (newLength < prefixLength + suffixLength) { - break replaceRange; - } - var newPrefix = newText.slice(0, prefixLength); - var newSuffix = newText.slice(newLength - suffixLength); - if (oldPrefix !== newPrefix || oldSuffix !== newSuffix) { - break replaceRange; - } - var oldMiddle = oldText.slice(prefixLength, oldLength - suffixLength); - var newMiddle = newText.slice(prefixLength, newLength - suffixLength); - return make_edit_splice(oldPrefix, oldMiddle, newMiddle, oldSuffix); - } - } - return null; - } - function diff(text1, text2, cursor_pos) { - return diff_main(text1, text2, cursor_pos, true); - } - diff.INSERT = DIFF_INSERT; - diff.DELETE = DIFF_DELETE; - diff.EQUAL = DIFF_EQUAL; - module.exports = diff; - } - }; - function umd(n, f) { - module.exports = n; - var e; - "undefined" != typeof window ? e = window : "undefined" != typeof commonjsGlobal ? e = commonjsGlobal : "undefined" != typeof self && (e = self), - e[f] = n; - } - umd(r("ChainPad.js"), "ChainPad"); - })(); - })(chainpad_dist$1); - return chainpad_dist$1.exports; - } - var chainpad_distExports = requireChainpad_dist(); - var chainpad_dist = getDefaultExportFromCjs(chainpad_distExports); - var ChainPad = _mergeNamespaces({ - __proto__: null, - default: chainpad_dist - }, [ chainpad_distExports ]); - var crypto = { - exports: {} - }; - var naclFast = { - exports: {} - }; - var hasRequiredNaclFast; - function requireNaclFast() { - if (hasRequiredNaclFast) return naclFast.exports; - hasRequiredNaclFast = 1; - (function(module) { - (function(nacl) { - var gf = function(init) { - var i, r = new Float64Array(16); - if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; - return r; - }; - var randombytes = function() { - throw new Error("no PRNG"); - }; - var _0 = new Uint8Array(16); - var _9 = new Uint8Array(32); - _9[0] = 9; - var gf0 = gf(), gf1 = gf([ 1 ]), _121665 = gf([ 56129, 1 ]), D = gf([ 30883, 4953, 19914, 30187, 55467, 16705, 2637, 112, 59544, 30585, 16505, 36039, 65139, 11119, 27886, 20995 ]), D2 = gf([ 61785, 9906, 39828, 60374, 45398, 33411, 5274, 224, 53552, 61171, 33010, 6542, 64743, 22239, 55772, 9222 ]), X = gf([ 54554, 36645, 11616, 51542, 42930, 38181, 51040, 26924, 56412, 64982, 57905, 49316, 21502, 52590, 14035, 8553 ]), Y = gf([ 26200, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214 ]), I = gf([ 41136, 18958, 6951, 50414, 58488, 44335, 6150, 12099, 55207, 15867, 153, 11085, 57099, 20417, 9344, 11139 ]); - function ts64(x, i, h, l) { - x[i] = h >> 24 & 255; - x[i + 1] = h >> 16 & 255; - x[i + 2] = h >> 8 & 255; - x[i + 3] = h & 255; - x[i + 4] = l >> 24 & 255; - x[i + 5] = l >> 16 & 255; - x[i + 6] = l >> 8 & 255; - x[i + 7] = l & 255; - } - function vn(x, xi, y, yi, n) { - var i, d = 0; - for (i = 0; i < n; i++) d |= x[xi + i] ^ y[yi + i]; - return (1 & d - 1 >>> 8) - 1; - } - function crypto_verify_16(x, xi, y, yi) { - return vn(x, xi, y, yi, 16); - } - function crypto_verify_32(x, xi, y, yi) { - return vn(x, xi, y, yi, 32); - } - function core_salsa20(o, p, k, c) { - var j0 = c[0] & 255 | (c[1] & 255) << 8 | (c[2] & 255) << 16 | (c[3] & 255) << 24, j1 = k[0] & 255 | (k[1] & 255) << 8 | (k[2] & 255) << 16 | (k[3] & 255) << 24, j2 = k[4] & 255 | (k[5] & 255) << 8 | (k[6] & 255) << 16 | (k[7] & 255) << 24, j3 = k[8] & 255 | (k[9] & 255) << 8 | (k[10] & 255) << 16 | (k[11] & 255) << 24, j4 = k[12] & 255 | (k[13] & 255) << 8 | (k[14] & 255) << 16 | (k[15] & 255) << 24, j5 = c[4] & 255 | (c[5] & 255) << 8 | (c[6] & 255) << 16 | (c[7] & 255) << 24, j6 = p[0] & 255 | (p[1] & 255) << 8 | (p[2] & 255) << 16 | (p[3] & 255) << 24, j7 = p[4] & 255 | (p[5] & 255) << 8 | (p[6] & 255) << 16 | (p[7] & 255) << 24, j8 = p[8] & 255 | (p[9] & 255) << 8 | (p[10] & 255) << 16 | (p[11] & 255) << 24, j9 = p[12] & 255 | (p[13] & 255) << 8 | (p[14] & 255) << 16 | (p[15] & 255) << 24, j10 = c[8] & 255 | (c[9] & 255) << 8 | (c[10] & 255) << 16 | (c[11] & 255) << 24, j11 = k[16] & 255 | (k[17] & 255) << 8 | (k[18] & 255) << 16 | (k[19] & 255) << 24, j12 = k[20] & 255 | (k[21] & 255) << 8 | (k[22] & 255) << 16 | (k[23] & 255) << 24, j13 = k[24] & 255 | (k[25] & 255) << 8 | (k[26] & 255) << 16 | (k[27] & 255) << 24, j14 = k[28] & 255 | (k[29] & 255) << 8 | (k[30] & 255) << 16 | (k[31] & 255) << 24, j15 = c[12] & 255 | (c[13] & 255) << 8 | (c[14] & 255) << 16 | (c[15] & 255) << 24; - var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, x15 = j15, u; - for (var i = 0; i < 20; i += 2) { - u = x0 + x12 | 0; - x4 ^= u << 7 | u >>> 32 - 7; - u = x4 + x0 | 0; - x8 ^= u << 9 | u >>> 32 - 9; - u = x8 + x4 | 0; - x12 ^= u << 13 | u >>> 32 - 13; - u = x12 + x8 | 0; - x0 ^= u << 18 | u >>> 32 - 18; - u = x5 + x1 | 0; - x9 ^= u << 7 | u >>> 32 - 7; - u = x9 + x5 | 0; - x13 ^= u << 9 | u >>> 32 - 9; - u = x13 + x9 | 0; - x1 ^= u << 13 | u >>> 32 - 13; - u = x1 + x13 | 0; - x5 ^= u << 18 | u >>> 32 - 18; - u = x10 + x6 | 0; - x14 ^= u << 7 | u >>> 32 - 7; - u = x14 + x10 | 0; - x2 ^= u << 9 | u >>> 32 - 9; - u = x2 + x14 | 0; - x6 ^= u << 13 | u >>> 32 - 13; - u = x6 + x2 | 0; - x10 ^= u << 18 | u >>> 32 - 18; - u = x15 + x11 | 0; - x3 ^= u << 7 | u >>> 32 - 7; - u = x3 + x15 | 0; - x7 ^= u << 9 | u >>> 32 - 9; - u = x7 + x3 | 0; - x11 ^= u << 13 | u >>> 32 - 13; - u = x11 + x7 | 0; - x15 ^= u << 18 | u >>> 32 - 18; - u = x0 + x3 | 0; - x1 ^= u << 7 | u >>> 32 - 7; - u = x1 + x0 | 0; - x2 ^= u << 9 | u >>> 32 - 9; - u = x2 + x1 | 0; - x3 ^= u << 13 | u >>> 32 - 13; - u = x3 + x2 | 0; - x0 ^= u << 18 | u >>> 32 - 18; - u = x5 + x4 | 0; - x6 ^= u << 7 | u >>> 32 - 7; - u = x6 + x5 | 0; - x7 ^= u << 9 | u >>> 32 - 9; - u = x7 + x6 | 0; - x4 ^= u << 13 | u >>> 32 - 13; - u = x4 + x7 | 0; - x5 ^= u << 18 | u >>> 32 - 18; - u = x10 + x9 | 0; - x11 ^= u << 7 | u >>> 32 - 7; - u = x11 + x10 | 0; - x8 ^= u << 9 | u >>> 32 - 9; - u = x8 + x11 | 0; - x9 ^= u << 13 | u >>> 32 - 13; - u = x9 + x8 | 0; - x10 ^= u << 18 | u >>> 32 - 18; - u = x15 + x14 | 0; - x12 ^= u << 7 | u >>> 32 - 7; - u = x12 + x15 | 0; - x13 ^= u << 9 | u >>> 32 - 9; - u = x13 + x12 | 0; - x14 ^= u << 13 | u >>> 32 - 13; - u = x14 + x13 | 0; - x15 ^= u << 18 | u >>> 32 - 18; - } - x0 = x0 + j0 | 0; - x1 = x1 + j1 | 0; - x2 = x2 + j2 | 0; - x3 = x3 + j3 | 0; - x4 = x4 + j4 | 0; - x5 = x5 + j5 | 0; - x6 = x6 + j6 | 0; - x7 = x7 + j7 | 0; - x8 = x8 + j8 | 0; - x9 = x9 + j9 | 0; - x10 = x10 + j10 | 0; - x11 = x11 + j11 | 0; - x12 = x12 + j12 | 0; - x13 = x13 + j13 | 0; - x14 = x14 + j14 | 0; - x15 = x15 + j15 | 0; - o[0] = x0 >>> 0 & 255; - o[1] = x0 >>> 8 & 255; - o[2] = x0 >>> 16 & 255; - o[3] = x0 >>> 24 & 255; - o[4] = x1 >>> 0 & 255; - o[5] = x1 >>> 8 & 255; - o[6] = x1 >>> 16 & 255; - o[7] = x1 >>> 24 & 255; - o[8] = x2 >>> 0 & 255; - o[9] = x2 >>> 8 & 255; - o[10] = x2 >>> 16 & 255; - o[11] = x2 >>> 24 & 255; - o[12] = x3 >>> 0 & 255; - o[13] = x3 >>> 8 & 255; - o[14] = x3 >>> 16 & 255; - o[15] = x3 >>> 24 & 255; - o[16] = x4 >>> 0 & 255; - o[17] = x4 >>> 8 & 255; - o[18] = x4 >>> 16 & 255; - o[19] = x4 >>> 24 & 255; - o[20] = x5 >>> 0 & 255; - o[21] = x5 >>> 8 & 255; - o[22] = x5 >>> 16 & 255; - o[23] = x5 >>> 24 & 255; - o[24] = x6 >>> 0 & 255; - o[25] = x6 >>> 8 & 255; - o[26] = x6 >>> 16 & 255; - o[27] = x6 >>> 24 & 255; - o[28] = x7 >>> 0 & 255; - o[29] = x7 >>> 8 & 255; - o[30] = x7 >>> 16 & 255; - o[31] = x7 >>> 24 & 255; - o[32] = x8 >>> 0 & 255; - o[33] = x8 >>> 8 & 255; - o[34] = x8 >>> 16 & 255; - o[35] = x8 >>> 24 & 255; - o[36] = x9 >>> 0 & 255; - o[37] = x9 >>> 8 & 255; - o[38] = x9 >>> 16 & 255; - o[39] = x9 >>> 24 & 255; - o[40] = x10 >>> 0 & 255; - o[41] = x10 >>> 8 & 255; - o[42] = x10 >>> 16 & 255; - o[43] = x10 >>> 24 & 255; - o[44] = x11 >>> 0 & 255; - o[45] = x11 >>> 8 & 255; - o[46] = x11 >>> 16 & 255; - o[47] = x11 >>> 24 & 255; - o[48] = x12 >>> 0 & 255; - o[49] = x12 >>> 8 & 255; - o[50] = x12 >>> 16 & 255; - o[51] = x12 >>> 24 & 255; - o[52] = x13 >>> 0 & 255; - o[53] = x13 >>> 8 & 255; - o[54] = x13 >>> 16 & 255; - o[55] = x13 >>> 24 & 255; - o[56] = x14 >>> 0 & 255; - o[57] = x14 >>> 8 & 255; - o[58] = x14 >>> 16 & 255; - o[59] = x14 >>> 24 & 255; - o[60] = x15 >>> 0 & 255; - o[61] = x15 >>> 8 & 255; - o[62] = x15 >>> 16 & 255; - o[63] = x15 >>> 24 & 255; - } - function core_hsalsa20(o, p, k, c) { - var j0 = c[0] & 255 | (c[1] & 255) << 8 | (c[2] & 255) << 16 | (c[3] & 255) << 24, j1 = k[0] & 255 | (k[1] & 255) << 8 | (k[2] & 255) << 16 | (k[3] & 255) << 24, j2 = k[4] & 255 | (k[5] & 255) << 8 | (k[6] & 255) << 16 | (k[7] & 255) << 24, j3 = k[8] & 255 | (k[9] & 255) << 8 | (k[10] & 255) << 16 | (k[11] & 255) << 24, j4 = k[12] & 255 | (k[13] & 255) << 8 | (k[14] & 255) << 16 | (k[15] & 255) << 24, j5 = c[4] & 255 | (c[5] & 255) << 8 | (c[6] & 255) << 16 | (c[7] & 255) << 24, j6 = p[0] & 255 | (p[1] & 255) << 8 | (p[2] & 255) << 16 | (p[3] & 255) << 24, j7 = p[4] & 255 | (p[5] & 255) << 8 | (p[6] & 255) << 16 | (p[7] & 255) << 24, j8 = p[8] & 255 | (p[9] & 255) << 8 | (p[10] & 255) << 16 | (p[11] & 255) << 24, j9 = p[12] & 255 | (p[13] & 255) << 8 | (p[14] & 255) << 16 | (p[15] & 255) << 24, j10 = c[8] & 255 | (c[9] & 255) << 8 | (c[10] & 255) << 16 | (c[11] & 255) << 24, j11 = k[16] & 255 | (k[17] & 255) << 8 | (k[18] & 255) << 16 | (k[19] & 255) << 24, j12 = k[20] & 255 | (k[21] & 255) << 8 | (k[22] & 255) << 16 | (k[23] & 255) << 24, j13 = k[24] & 255 | (k[25] & 255) << 8 | (k[26] & 255) << 16 | (k[27] & 255) << 24, j14 = k[28] & 255 | (k[29] & 255) << 8 | (k[30] & 255) << 16 | (k[31] & 255) << 24, j15 = c[12] & 255 | (c[13] & 255) << 8 | (c[14] & 255) << 16 | (c[15] & 255) << 24; - var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, x15 = j15, u; - for (var i = 0; i < 20; i += 2) { - u = x0 + x12 | 0; - x4 ^= u << 7 | u >>> 32 - 7; - u = x4 + x0 | 0; - x8 ^= u << 9 | u >>> 32 - 9; - u = x8 + x4 | 0; - x12 ^= u << 13 | u >>> 32 - 13; - u = x12 + x8 | 0; - x0 ^= u << 18 | u >>> 32 - 18; - u = x5 + x1 | 0; - x9 ^= u << 7 | u >>> 32 - 7; - u = x9 + x5 | 0; - x13 ^= u << 9 | u >>> 32 - 9; - u = x13 + x9 | 0; - x1 ^= u << 13 | u >>> 32 - 13; - u = x1 + x13 | 0; - x5 ^= u << 18 | u >>> 32 - 18; - u = x10 + x6 | 0; - x14 ^= u << 7 | u >>> 32 - 7; - u = x14 + x10 | 0; - x2 ^= u << 9 | u >>> 32 - 9; - u = x2 + x14 | 0; - x6 ^= u << 13 | u >>> 32 - 13; - u = x6 + x2 | 0; - x10 ^= u << 18 | u >>> 32 - 18; - u = x15 + x11 | 0; - x3 ^= u << 7 | u >>> 32 - 7; - u = x3 + x15 | 0; - x7 ^= u << 9 | u >>> 32 - 9; - u = x7 + x3 | 0; - x11 ^= u << 13 | u >>> 32 - 13; - u = x11 + x7 | 0; - x15 ^= u << 18 | u >>> 32 - 18; - u = x0 + x3 | 0; - x1 ^= u << 7 | u >>> 32 - 7; - u = x1 + x0 | 0; - x2 ^= u << 9 | u >>> 32 - 9; - u = x2 + x1 | 0; - x3 ^= u << 13 | u >>> 32 - 13; - u = x3 + x2 | 0; - x0 ^= u << 18 | u >>> 32 - 18; - u = x5 + x4 | 0; - x6 ^= u << 7 | u >>> 32 - 7; - u = x6 + x5 | 0; - x7 ^= u << 9 | u >>> 32 - 9; - u = x7 + x6 | 0; - x4 ^= u << 13 | u >>> 32 - 13; - u = x4 + x7 | 0; - x5 ^= u << 18 | u >>> 32 - 18; - u = x10 + x9 | 0; - x11 ^= u << 7 | u >>> 32 - 7; - u = x11 + x10 | 0; - x8 ^= u << 9 | u >>> 32 - 9; - u = x8 + x11 | 0; - x9 ^= u << 13 | u >>> 32 - 13; - u = x9 + x8 | 0; - x10 ^= u << 18 | u >>> 32 - 18; - u = x15 + x14 | 0; - x12 ^= u << 7 | u >>> 32 - 7; - u = x12 + x15 | 0; - x13 ^= u << 9 | u >>> 32 - 9; - u = x13 + x12 | 0; - x14 ^= u << 13 | u >>> 32 - 13; - u = x14 + x13 | 0; - x15 ^= u << 18 | u >>> 32 - 18; - } - o[0] = x0 >>> 0 & 255; - o[1] = x0 >>> 8 & 255; - o[2] = x0 >>> 16 & 255; - o[3] = x0 >>> 24 & 255; - o[4] = x5 >>> 0 & 255; - o[5] = x5 >>> 8 & 255; - o[6] = x5 >>> 16 & 255; - o[7] = x5 >>> 24 & 255; - o[8] = x10 >>> 0 & 255; - o[9] = x10 >>> 8 & 255; - o[10] = x10 >>> 16 & 255; - o[11] = x10 >>> 24 & 255; - o[12] = x15 >>> 0 & 255; - o[13] = x15 >>> 8 & 255; - o[14] = x15 >>> 16 & 255; - o[15] = x15 >>> 24 & 255; - o[16] = x6 >>> 0 & 255; - o[17] = x6 >>> 8 & 255; - o[18] = x6 >>> 16 & 255; - o[19] = x6 >>> 24 & 255; - o[20] = x7 >>> 0 & 255; - o[21] = x7 >>> 8 & 255; - o[22] = x7 >>> 16 & 255; - o[23] = x7 >>> 24 & 255; - o[24] = x8 >>> 0 & 255; - o[25] = x8 >>> 8 & 255; - o[26] = x8 >>> 16 & 255; - o[27] = x8 >>> 24 & 255; - o[28] = x9 >>> 0 & 255; - o[29] = x9 >>> 8 & 255; - o[30] = x9 >>> 16 & 255; - o[31] = x9 >>> 24 & 255; - } - function crypto_core_salsa20(out, inp, k, c) { - core_salsa20(out, inp, k, c); - } - function crypto_core_hsalsa20(out, inp, k, c) { - core_hsalsa20(out, inp, k, c); - } - var sigma = new Uint8Array([ 101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107 ]); - function crypto_stream_salsa20_xor(c, cpos, m, mpos, b, n, k) { - var z = new Uint8Array(16), x = new Uint8Array(64); - var u, i; - for (i = 0; i < 16; i++) z[i] = 0; - for (i = 0; i < 8; i++) z[i] = n[i]; - while (b >= 64) { - crypto_core_salsa20(x, z, k, sigma); - for (i = 0; i < 64; i++) c[cpos + i] = m[mpos + i] ^ x[i]; - u = 1; - for (i = 8; i < 16; i++) { - u = u + (z[i] & 255) | 0; - z[i] = u & 255; - u >>>= 8; - } - b -= 64; - cpos += 64; - mpos += 64; - } - if (b > 0) { - crypto_core_salsa20(x, z, k, sigma); - for (i = 0; i < b; i++) c[cpos + i] = m[mpos + i] ^ x[i]; - } - return 0; - } - function crypto_stream_salsa20(c, cpos, b, n, k) { - var z = new Uint8Array(16), x = new Uint8Array(64); - var u, i; - for (i = 0; i < 16; i++) z[i] = 0; - for (i = 0; i < 8; i++) z[i] = n[i]; - while (b >= 64) { - crypto_core_salsa20(x, z, k, sigma); - for (i = 0; i < 64; i++) c[cpos + i] = x[i]; - u = 1; - for (i = 8; i < 16; i++) { - u = u + (z[i] & 255) | 0; - z[i] = u & 255; - u >>>= 8; - } - b -= 64; - cpos += 64; - } - if (b > 0) { - crypto_core_salsa20(x, z, k, sigma); - for (i = 0; i < b; i++) c[cpos + i] = x[i]; - } - return 0; - } - function crypto_stream(c, cpos, d, n, k) { - var s = new Uint8Array(32); - crypto_core_hsalsa20(s, n, k, sigma); - var sn = new Uint8Array(8); - for (var i = 0; i < 8; i++) sn[i] = n[i + 16]; - return crypto_stream_salsa20(c, cpos, d, sn, s); - } - function crypto_stream_xor(c, cpos, m, mpos, d, n, k) { - var s = new Uint8Array(32); - crypto_core_hsalsa20(s, n, k, sigma); - var sn = new Uint8Array(8); - for (var i = 0; i < 8; i++) sn[i] = n[i + 16]; - return crypto_stream_salsa20_xor(c, cpos, m, mpos, d, sn, s); - } - var poly1305 = function(key) { - this.buffer = new Uint8Array(16); - this.r = new Uint16Array(10); - this.h = new Uint16Array(10); - this.pad = new Uint16Array(8); - this.leftover = 0; - this.fin = 0; - var t0, t1, t2, t3, t4, t5, t6, t7; - t0 = key[0] & 255 | (key[1] & 255) << 8; - this.r[0] = t0 & 8191; - t1 = key[2] & 255 | (key[3] & 255) << 8; - this.r[1] = (t0 >>> 13 | t1 << 3) & 8191; - t2 = key[4] & 255 | (key[5] & 255) << 8; - this.r[2] = (t1 >>> 10 | t2 << 6) & 7939; - t3 = key[6] & 255 | (key[7] & 255) << 8; - this.r[3] = (t2 >>> 7 | t3 << 9) & 8191; - t4 = key[8] & 255 | (key[9] & 255) << 8; - this.r[4] = (t3 >>> 4 | t4 << 12) & 255; - this.r[5] = t4 >>> 1 & 8190; - t5 = key[10] & 255 | (key[11] & 255) << 8; - this.r[6] = (t4 >>> 14 | t5 << 2) & 8191; - t6 = key[12] & 255 | (key[13] & 255) << 8; - this.r[7] = (t5 >>> 11 | t6 << 5) & 8065; - t7 = key[14] & 255 | (key[15] & 255) << 8; - this.r[8] = (t6 >>> 8 | t7 << 8) & 8191; - this.r[9] = t7 >>> 5 & 127; - this.pad[0] = key[16] & 255 | (key[17] & 255) << 8; - this.pad[1] = key[18] & 255 | (key[19] & 255) << 8; - this.pad[2] = key[20] & 255 | (key[21] & 255) << 8; - this.pad[3] = key[22] & 255 | (key[23] & 255) << 8; - this.pad[4] = key[24] & 255 | (key[25] & 255) << 8; - this.pad[5] = key[26] & 255 | (key[27] & 255) << 8; - this.pad[6] = key[28] & 255 | (key[29] & 255) << 8; - this.pad[7] = key[30] & 255 | (key[31] & 255) << 8; - }; - poly1305.prototype.blocks = function(m, mpos, bytes) { - var hibit = this.fin ? 0 : 1 << 11; - var t0, t1, t2, t3, t4, t5, t6, t7, c; - var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9; - var h0 = this.h[0], h1 = this.h[1], h2 = this.h[2], h3 = this.h[3], h4 = this.h[4], h5 = this.h[5], h6 = this.h[6], h7 = this.h[7], h8 = this.h[8], h9 = this.h[9]; - var r0 = this.r[0], r1 = this.r[1], r2 = this.r[2], r3 = this.r[3], r4 = this.r[4], r5 = this.r[5], r6 = this.r[6], r7 = this.r[7], r8 = this.r[8], r9 = this.r[9]; - while (bytes >= 16) { - t0 = m[mpos + 0] & 255 | (m[mpos + 1] & 255) << 8; - h0 += t0 & 8191; - t1 = m[mpos + 2] & 255 | (m[mpos + 3] & 255) << 8; - h1 += (t0 >>> 13 | t1 << 3) & 8191; - t2 = m[mpos + 4] & 255 | (m[mpos + 5] & 255) << 8; - h2 += (t1 >>> 10 | t2 << 6) & 8191; - t3 = m[mpos + 6] & 255 | (m[mpos + 7] & 255) << 8; - h3 += (t2 >>> 7 | t3 << 9) & 8191; - t4 = m[mpos + 8] & 255 | (m[mpos + 9] & 255) << 8; - h4 += (t3 >>> 4 | t4 << 12) & 8191; - h5 += t4 >>> 1 & 8191; - t5 = m[mpos + 10] & 255 | (m[mpos + 11] & 255) << 8; - h6 += (t4 >>> 14 | t5 << 2) & 8191; - t6 = m[mpos + 12] & 255 | (m[mpos + 13] & 255) << 8; - h7 += (t5 >>> 11 | t6 << 5) & 8191; - t7 = m[mpos + 14] & 255 | (m[mpos + 15] & 255) << 8; - h8 += (t6 >>> 8 | t7 << 8) & 8191; - h9 += t7 >>> 5 | hibit; - c = 0; - d0 = c; - d0 += h0 * r0; - d0 += h1 * (5 * r9); - d0 += h2 * (5 * r8); - d0 += h3 * (5 * r7); - d0 += h4 * (5 * r6); - c = d0 >>> 13; - d0 &= 8191; - d0 += h5 * (5 * r5); - d0 += h6 * (5 * r4); - d0 += h7 * (5 * r3); - d0 += h8 * (5 * r2); - d0 += h9 * (5 * r1); - c += d0 >>> 13; - d0 &= 8191; - d1 = c; - d1 += h0 * r1; - d1 += h1 * r0; - d1 += h2 * (5 * r9); - d1 += h3 * (5 * r8); - d1 += h4 * (5 * r7); - c = d1 >>> 13; - d1 &= 8191; - d1 += h5 * (5 * r6); - d1 += h6 * (5 * r5); - d1 += h7 * (5 * r4); - d1 += h8 * (5 * r3); - d1 += h9 * (5 * r2); - c += d1 >>> 13; - d1 &= 8191; - d2 = c; - d2 += h0 * r2; - d2 += h1 * r1; - d2 += h2 * r0; - d2 += h3 * (5 * r9); - d2 += h4 * (5 * r8); - c = d2 >>> 13; - d2 &= 8191; - d2 += h5 * (5 * r7); - d2 += h6 * (5 * r6); - d2 += h7 * (5 * r5); - d2 += h8 * (5 * r4); - d2 += h9 * (5 * r3); - c += d2 >>> 13; - d2 &= 8191; - d3 = c; - d3 += h0 * r3; - d3 += h1 * r2; - d3 += h2 * r1; - d3 += h3 * r0; - d3 += h4 * (5 * r9); - c = d3 >>> 13; - d3 &= 8191; - d3 += h5 * (5 * r8); - d3 += h6 * (5 * r7); - d3 += h7 * (5 * r6); - d3 += h8 * (5 * r5); - d3 += h9 * (5 * r4); - c += d3 >>> 13; - d3 &= 8191; - d4 = c; - d4 += h0 * r4; - d4 += h1 * r3; - d4 += h2 * r2; - d4 += h3 * r1; - d4 += h4 * r0; - c = d4 >>> 13; - d4 &= 8191; - d4 += h5 * (5 * r9); - d4 += h6 * (5 * r8); - d4 += h7 * (5 * r7); - d4 += h8 * (5 * r6); - d4 += h9 * (5 * r5); - c += d4 >>> 13; - d4 &= 8191; - d5 = c; - d5 += h0 * r5; - d5 += h1 * r4; - d5 += h2 * r3; - d5 += h3 * r2; - d5 += h4 * r1; - c = d5 >>> 13; - d5 &= 8191; - d5 += h5 * r0; - d5 += h6 * (5 * r9); - d5 += h7 * (5 * r8); - d5 += h8 * (5 * r7); - d5 += h9 * (5 * r6); - c += d5 >>> 13; - d5 &= 8191; - d6 = c; - d6 += h0 * r6; - d6 += h1 * r5; - d6 += h2 * r4; - d6 += h3 * r3; - d6 += h4 * r2; - c = d6 >>> 13; - d6 &= 8191; - d6 += h5 * r1; - d6 += h6 * r0; - d6 += h7 * (5 * r9); - d6 += h8 * (5 * r8); - d6 += h9 * (5 * r7); - c += d6 >>> 13; - d6 &= 8191; - d7 = c; - d7 += h0 * r7; - d7 += h1 * r6; - d7 += h2 * r5; - d7 += h3 * r4; - d7 += h4 * r3; - c = d7 >>> 13; - d7 &= 8191; - d7 += h5 * r2; - d7 += h6 * r1; - d7 += h7 * r0; - d7 += h8 * (5 * r9); - d7 += h9 * (5 * r8); - c += d7 >>> 13; - d7 &= 8191; - d8 = c; - d8 += h0 * r8; - d8 += h1 * r7; - d8 += h2 * r6; - d8 += h3 * r5; - d8 += h4 * r4; - c = d8 >>> 13; - d8 &= 8191; - d8 += h5 * r3; - d8 += h6 * r2; - d8 += h7 * r1; - d8 += h8 * r0; - d8 += h9 * (5 * r9); - c += d8 >>> 13; - d8 &= 8191; - d9 = c; - d9 += h0 * r9; - d9 += h1 * r8; - d9 += h2 * r7; - d9 += h3 * r6; - d9 += h4 * r5; - c = d9 >>> 13; - d9 &= 8191; - d9 += h5 * r4; - d9 += h6 * r3; - d9 += h7 * r2; - d9 += h8 * r1; - d9 += h9 * r0; - c += d9 >>> 13; - d9 &= 8191; - c = (c << 2) + c | 0; - c = c + d0 | 0; - d0 = c & 8191; - c = c >>> 13; - d1 += c; - h0 = d0; - h1 = d1; - h2 = d2; - h3 = d3; - h4 = d4; - h5 = d5; - h6 = d6; - h7 = d7; - h8 = d8; - h9 = d9; - mpos += 16; - bytes -= 16; - } - this.h[0] = h0; - this.h[1] = h1; - this.h[2] = h2; - this.h[3] = h3; - this.h[4] = h4; - this.h[5] = h5; - this.h[6] = h6; - this.h[7] = h7; - this.h[8] = h8; - this.h[9] = h9; - }; - poly1305.prototype.finish = function(mac, macpos) { - var g = new Uint16Array(10); - var c, mask, f, i; - if (this.leftover) { - i = this.leftover; - this.buffer[i++] = 1; - for (;i < 16; i++) this.buffer[i] = 0; - this.fin = 1; - this.blocks(this.buffer, 0, 16); - } - c = this.h[1] >>> 13; - this.h[1] &= 8191; - for (i = 2; i < 10; i++) { - this.h[i] += c; - c = this.h[i] >>> 13; - this.h[i] &= 8191; - } - this.h[0] += c * 5; - c = this.h[0] >>> 13; - this.h[0] &= 8191; - this.h[1] += c; - c = this.h[1] >>> 13; - this.h[1] &= 8191; - this.h[2] += c; - g[0] = this.h[0] + 5; - c = g[0] >>> 13; - g[0] &= 8191; - for (i = 1; i < 10; i++) { - g[i] = this.h[i] + c; - c = g[i] >>> 13; - g[i] &= 8191; - } - g[9] -= 1 << 13; - mask = (g[9] >>> 2 * 8 - 1) - 1; - for (i = 0; i < 10; i++) g[i] &= mask; - mask = ~mask; - for (i = 0; i < 10; i++) this.h[i] = this.h[i] & mask | g[i]; - this.h[0] = (this.h[0] | this.h[1] << 13) & 65535; - this.h[1] = (this.h[1] >>> 3 | this.h[2] << 10) & 65535; - this.h[2] = (this.h[2] >>> 6 | this.h[3] << 7) & 65535; - this.h[3] = (this.h[3] >>> 9 | this.h[4] << 4) & 65535; - this.h[4] = (this.h[4] >>> 12 | this.h[5] << 1 | this.h[6] << 14) & 65535; - this.h[5] = (this.h[6] >>> 2 | this.h[7] << 11) & 65535; - this.h[6] = (this.h[7] >>> 5 | this.h[8] << 8) & 65535; - this.h[7] = (this.h[8] >>> 8 | this.h[9] << 5) & 65535; - f = this.h[0] + this.pad[0]; - this.h[0] = f & 65535; - for (i = 1; i < 8; i++) { - f = (this.h[i] + this.pad[i] | 0) + (f >>> 16) | 0; - this.h[i] = f & 65535; - } - mac[macpos + 0] = this.h[0] >>> 0 & 255; - mac[macpos + 1] = this.h[0] >>> 8 & 255; - mac[macpos + 2] = this.h[1] >>> 0 & 255; - mac[macpos + 3] = this.h[1] >>> 8 & 255; - mac[macpos + 4] = this.h[2] >>> 0 & 255; - mac[macpos + 5] = this.h[2] >>> 8 & 255; - mac[macpos + 6] = this.h[3] >>> 0 & 255; - mac[macpos + 7] = this.h[3] >>> 8 & 255; - mac[macpos + 8] = this.h[4] >>> 0 & 255; - mac[macpos + 9] = this.h[4] >>> 8 & 255; - mac[macpos + 10] = this.h[5] >>> 0 & 255; - mac[macpos + 11] = this.h[5] >>> 8 & 255; - mac[macpos + 12] = this.h[6] >>> 0 & 255; - mac[macpos + 13] = this.h[6] >>> 8 & 255; - mac[macpos + 14] = this.h[7] >>> 0 & 255; - mac[macpos + 15] = this.h[7] >>> 8 & 255; - }; - poly1305.prototype.update = function(m, mpos, bytes) { - var i, want; - if (this.leftover) { - want = 16 - this.leftover; - if (want > bytes) want = bytes; - for (i = 0; i < want; i++) this.buffer[this.leftover + i] = m[mpos + i]; - bytes -= want; - mpos += want; - this.leftover += want; - if (this.leftover < 16) return; - this.blocks(buffer, 0, 16); - this.leftover = 0; - } - if (bytes >= 16) { - want = bytes - bytes % 16; - this.blocks(m, mpos, want); - mpos += want; - bytes -= want; - } - if (bytes) { - for (i = 0; i < bytes; i++) this.buffer[this.leftover + i] = m[mpos + i]; - this.leftover += bytes; - } - }; - function crypto_onetimeauth(out, outpos, m, mpos, n, k) { - var s = new poly1305(k); - s.update(m, mpos, n); - s.finish(out, outpos); - return 0; - } - function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) { - var x = new Uint8Array(16); - crypto_onetimeauth(x, 0, m, mpos, n, k); - return crypto_verify_16(h, hpos, x, 0); - } - function crypto_secretbox(c, m, d, n, k) { - var i; - if (d < 32) return -1; - crypto_stream_xor(c, 0, m, 0, d, n, k); - crypto_onetimeauth(c, 16, c, 32, d - 32, c); - for (i = 0; i < 16; i++) c[i] = 0; - return 0; - } - function crypto_secretbox_open(m, c, d, n, k) { - var i; - var x = new Uint8Array(32); - if (d < 32) return -1; - crypto_stream(x, 0, 32, n, k); - if (crypto_onetimeauth_verify(c, 16, c, 32, d - 32, x) !== 0) return -1; - crypto_stream_xor(m, 0, c, 0, d, n, k); - for (i = 0; i < 32; i++) m[i] = 0; - return 0; - } - function set25519(r, a) { - var i; - for (i = 0; i < 16; i++) r[i] = a[i] | 0; - } - function car25519(o) { - var i, v, c = 1; - for (i = 0; i < 16; i++) { - v = o[i] + c + 65535; - c = Math.floor(v / 65536); - o[i] = v - c * 65536; - } - o[0] += c - 1 + 37 * (c - 1); - } - function sel25519(p, q, b) { - var t, c = ~(b - 1); - for (var i = 0; i < 16; i++) { - t = c & (p[i] ^ q[i]); - p[i] ^= t; - q[i] ^= t; - } - } - function pack25519(o, n) { - var i, j, b; - var m = gf(), t = gf(); - for (i = 0; i < 16; i++) t[i] = n[i]; - car25519(t); - car25519(t); - car25519(t); - for (j = 0; j < 2; j++) { - m[0] = t[0] - 65517; - for (i = 1; i < 15; i++) { - m[i] = t[i] - 65535 - (m[i - 1] >> 16 & 1); - m[i - 1] &= 65535; - } - m[15] = t[15] - 32767 - (m[14] >> 16 & 1); - b = m[15] >> 16 & 1; - m[14] &= 65535; - sel25519(t, m, 1 - b); - } - for (i = 0; i < 16; i++) { - o[2 * i] = t[i] & 255; - o[2 * i + 1] = t[i] >> 8; - } - } - function neq25519(a, b) { - var c = new Uint8Array(32), d = new Uint8Array(32); - pack25519(c, a); - pack25519(d, b); - return crypto_verify_32(c, 0, d, 0); - } - function par25519(a) { - var d = new Uint8Array(32); - pack25519(d, a); - return d[0] & 1; - } - function unpack25519(o, n) { - var i; - for (i = 0; i < 16; i++) o[i] = n[2 * i] + (n[2 * i + 1] << 8); - o[15] &= 32767; - } - function A(o, a, b) { - for (var i = 0; i < 16; i++) o[i] = a[i] + b[i]; - } - function Z(o, a, b) { - for (var i = 0; i < 16; i++) o[i] = a[i] - b[i]; - } - function M(o, a, b) { - var v, c, t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0, t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0, t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0, b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7], b8 = b[8], b9 = b[9], b10 = b[10], b11 = b[11], b12 = b[12], b13 = b[13], b14 = b[14], b15 = b[15]; - v = a[0]; - t0 += v * b0; - t1 += v * b1; - t2 += v * b2; - t3 += v * b3; - t4 += v * b4; - t5 += v * b5; - t6 += v * b6; - t7 += v * b7; - t8 += v * b8; - t9 += v * b9; - t10 += v * b10; - t11 += v * b11; - t12 += v * b12; - t13 += v * b13; - t14 += v * b14; - t15 += v * b15; - v = a[1]; - t1 += v * b0; - t2 += v * b1; - t3 += v * b2; - t4 += v * b3; - t5 += v * b4; - t6 += v * b5; - t7 += v * b6; - t8 += v * b7; - t9 += v * b8; - t10 += v * b9; - t11 += v * b10; - t12 += v * b11; - t13 += v * b12; - t14 += v * b13; - t15 += v * b14; - t16 += v * b15; - v = a[2]; - t2 += v * b0; - t3 += v * b1; - t4 += v * b2; - t5 += v * b3; - t6 += v * b4; - t7 += v * b5; - t8 += v * b6; - t9 += v * b7; - t10 += v * b8; - t11 += v * b9; - t12 += v * b10; - t13 += v * b11; - t14 += v * b12; - t15 += v * b13; - t16 += v * b14; - t17 += v * b15; - v = a[3]; - t3 += v * b0; - t4 += v * b1; - t5 += v * b2; - t6 += v * b3; - t7 += v * b4; - t8 += v * b5; - t9 += v * b6; - t10 += v * b7; - t11 += v * b8; - t12 += v * b9; - t13 += v * b10; - t14 += v * b11; - t15 += v * b12; - t16 += v * b13; - t17 += v * b14; - t18 += v * b15; - v = a[4]; - t4 += v * b0; - t5 += v * b1; - t6 += v * b2; - t7 += v * b3; - t8 += v * b4; - t9 += v * b5; - t10 += v * b6; - t11 += v * b7; - t12 += v * b8; - t13 += v * b9; - t14 += v * b10; - t15 += v * b11; - t16 += v * b12; - t17 += v * b13; - t18 += v * b14; - t19 += v * b15; - v = a[5]; - t5 += v * b0; - t6 += v * b1; - t7 += v * b2; - t8 += v * b3; - t9 += v * b4; - t10 += v * b5; - t11 += v * b6; - t12 += v * b7; - t13 += v * b8; - t14 += v * b9; - t15 += v * b10; - t16 += v * b11; - t17 += v * b12; - t18 += v * b13; - t19 += v * b14; - t20 += v * b15; - v = a[6]; - t6 += v * b0; - t7 += v * b1; - t8 += v * b2; - t9 += v * b3; - t10 += v * b4; - t11 += v * b5; - t12 += v * b6; - t13 += v * b7; - t14 += v * b8; - t15 += v * b9; - t16 += v * b10; - t17 += v * b11; - t18 += v * b12; - t19 += v * b13; - t20 += v * b14; - t21 += v * b15; - v = a[7]; - t7 += v * b0; - t8 += v * b1; - t9 += v * b2; - t10 += v * b3; - t11 += v * b4; - t12 += v * b5; - t13 += v * b6; - t14 += v * b7; - t15 += v * b8; - t16 += v * b9; - t17 += v * b10; - t18 += v * b11; - t19 += v * b12; - t20 += v * b13; - t21 += v * b14; - t22 += v * b15; - v = a[8]; - t8 += v * b0; - t9 += v * b1; - t10 += v * b2; - t11 += v * b3; - t12 += v * b4; - t13 += v * b5; - t14 += v * b6; - t15 += v * b7; - t16 += v * b8; - t17 += v * b9; - t18 += v * b10; - t19 += v * b11; - t20 += v * b12; - t21 += v * b13; - t22 += v * b14; - t23 += v * b15; - v = a[9]; - t9 += v * b0; - t10 += v * b1; - t11 += v * b2; - t12 += v * b3; - t13 += v * b4; - t14 += v * b5; - t15 += v * b6; - t16 += v * b7; - t17 += v * b8; - t18 += v * b9; - t19 += v * b10; - t20 += v * b11; - t21 += v * b12; - t22 += v * b13; - t23 += v * b14; - t24 += v * b15; - v = a[10]; - t10 += v * b0; - t11 += v * b1; - t12 += v * b2; - t13 += v * b3; - t14 += v * b4; - t15 += v * b5; - t16 += v * b6; - t17 += v * b7; - t18 += v * b8; - t19 += v * b9; - t20 += v * b10; - t21 += v * b11; - t22 += v * b12; - t23 += v * b13; - t24 += v * b14; - t25 += v * b15; - v = a[11]; - t11 += v * b0; - t12 += v * b1; - t13 += v * b2; - t14 += v * b3; - t15 += v * b4; - t16 += v * b5; - t17 += v * b6; - t18 += v * b7; - t19 += v * b8; - t20 += v * b9; - t21 += v * b10; - t22 += v * b11; - t23 += v * b12; - t24 += v * b13; - t25 += v * b14; - t26 += v * b15; - v = a[12]; - t12 += v * b0; - t13 += v * b1; - t14 += v * b2; - t15 += v * b3; - t16 += v * b4; - t17 += v * b5; - t18 += v * b6; - t19 += v * b7; - t20 += v * b8; - t21 += v * b9; - t22 += v * b10; - t23 += v * b11; - t24 += v * b12; - t25 += v * b13; - t26 += v * b14; - t27 += v * b15; - v = a[13]; - t13 += v * b0; - t14 += v * b1; - t15 += v * b2; - t16 += v * b3; - t17 += v * b4; - t18 += v * b5; - t19 += v * b6; - t20 += v * b7; - t21 += v * b8; - t22 += v * b9; - t23 += v * b10; - t24 += v * b11; - t25 += v * b12; - t26 += v * b13; - t27 += v * b14; - t28 += v * b15; - v = a[14]; - t14 += v * b0; - t15 += v * b1; - t16 += v * b2; - t17 += v * b3; - t18 += v * b4; - t19 += v * b5; - t20 += v * b6; - t21 += v * b7; - t22 += v * b8; - t23 += v * b9; - t24 += v * b10; - t25 += v * b11; - t26 += v * b12; - t27 += v * b13; - t28 += v * b14; - t29 += v * b15; - v = a[15]; - t15 += v * b0; - t16 += v * b1; - t17 += v * b2; - t18 += v * b3; - t19 += v * b4; - t20 += v * b5; - t21 += v * b6; - t22 += v * b7; - t23 += v * b8; - t24 += v * b9; - t25 += v * b10; - t26 += v * b11; - t27 += v * b12; - t28 += v * b13; - t29 += v * b14; - t30 += v * b15; - t0 += 38 * t16; - t1 += 38 * t17; - t2 += 38 * t18; - t3 += 38 * t19; - t4 += 38 * t20; - t5 += 38 * t21; - t6 += 38 * t22; - t7 += 38 * t23; - t8 += 38 * t24; - t9 += 38 * t25; - t10 += 38 * t26; - t11 += 38 * t27; - t12 += 38 * t28; - t13 += 38 * t29; - t14 += 38 * t30; - c = 1; - v = t0 + c + 65535; - c = Math.floor(v / 65536); - t0 = v - c * 65536; - v = t1 + c + 65535; - c = Math.floor(v / 65536); - t1 = v - c * 65536; - v = t2 + c + 65535; - c = Math.floor(v / 65536); - t2 = v - c * 65536; - v = t3 + c + 65535; - c = Math.floor(v / 65536); - t3 = v - c * 65536; - v = t4 + c + 65535; - c = Math.floor(v / 65536); - t4 = v - c * 65536; - v = t5 + c + 65535; - c = Math.floor(v / 65536); - t5 = v - c * 65536; - v = t6 + c + 65535; - c = Math.floor(v / 65536); - t6 = v - c * 65536; - v = t7 + c + 65535; - c = Math.floor(v / 65536); - t7 = v - c * 65536; - v = t8 + c + 65535; - c = Math.floor(v / 65536); - t8 = v - c * 65536; - v = t9 + c + 65535; - c = Math.floor(v / 65536); - t9 = v - c * 65536; - v = t10 + c + 65535; - c = Math.floor(v / 65536); - t10 = v - c * 65536; - v = t11 + c + 65535; - c = Math.floor(v / 65536); - t11 = v - c * 65536; - v = t12 + c + 65535; - c = Math.floor(v / 65536); - t12 = v - c * 65536; - v = t13 + c + 65535; - c = Math.floor(v / 65536); - t13 = v - c * 65536; - v = t14 + c + 65535; - c = Math.floor(v / 65536); - t14 = v - c * 65536; - v = t15 + c + 65535; - c = Math.floor(v / 65536); - t15 = v - c * 65536; - t0 += c - 1 + 37 * (c - 1); - c = 1; - v = t0 + c + 65535; - c = Math.floor(v / 65536); - t0 = v - c * 65536; - v = t1 + c + 65535; - c = Math.floor(v / 65536); - t1 = v - c * 65536; - v = t2 + c + 65535; - c = Math.floor(v / 65536); - t2 = v - c * 65536; - v = t3 + c + 65535; - c = Math.floor(v / 65536); - t3 = v - c * 65536; - v = t4 + c + 65535; - c = Math.floor(v / 65536); - t4 = v - c * 65536; - v = t5 + c + 65535; - c = Math.floor(v / 65536); - t5 = v - c * 65536; - v = t6 + c + 65535; - c = Math.floor(v / 65536); - t6 = v - c * 65536; - v = t7 + c + 65535; - c = Math.floor(v / 65536); - t7 = v - c * 65536; - v = t8 + c + 65535; - c = Math.floor(v / 65536); - t8 = v - c * 65536; - v = t9 + c + 65535; - c = Math.floor(v / 65536); - t9 = v - c * 65536; - v = t10 + c + 65535; - c = Math.floor(v / 65536); - t10 = v - c * 65536; - v = t11 + c + 65535; - c = Math.floor(v / 65536); - t11 = v - c * 65536; - v = t12 + c + 65535; - c = Math.floor(v / 65536); - t12 = v - c * 65536; - v = t13 + c + 65535; - c = Math.floor(v / 65536); - t13 = v - c * 65536; - v = t14 + c + 65535; - c = Math.floor(v / 65536); - t14 = v - c * 65536; - v = t15 + c + 65535; - c = Math.floor(v / 65536); - t15 = v - c * 65536; - t0 += c - 1 + 37 * (c - 1); - o[0] = t0; - o[1] = t1; - o[2] = t2; - o[3] = t3; - o[4] = t4; - o[5] = t5; - o[6] = t6; - o[7] = t7; - o[8] = t8; - o[9] = t9; - o[10] = t10; - o[11] = t11; - o[12] = t12; - o[13] = t13; - o[14] = t14; - o[15] = t15; - } - function S(o, a) { - M(o, a, a); - } - function inv25519(o, i) { - var c = gf(); - var a; - for (a = 0; a < 16; a++) c[a] = i[a]; - for (a = 253; a >= 0; a--) { - S(c, c); - if (a !== 2 && a !== 4) M(c, c, i); - } - for (a = 0; a < 16; a++) o[a] = c[a]; - } - function pow2523(o, i) { - var c = gf(); - var a; - for (a = 0; a < 16; a++) c[a] = i[a]; - for (a = 250; a >= 0; a--) { - S(c, c); - if (a !== 1) M(c, c, i); - } - for (a = 0; a < 16; a++) o[a] = c[a]; - } - function crypto_scalarmult(q, n, p) { - var z = new Uint8Array(32); - var x = new Float64Array(80), r, i; - var a = gf(), b = gf(), c = gf(), d = gf(), e = gf(), f = gf(); - for (i = 0; i < 31; i++) z[i] = n[i]; - z[31] = n[31] & 127 | 64; - z[0] &= 248; - unpack25519(x, p); - for (i = 0; i < 16; i++) { - b[i] = x[i]; - d[i] = a[i] = c[i] = 0; - } - a[0] = d[0] = 1; - for (i = 254; i >= 0; --i) { - r = z[i >>> 3] >>> (i & 7) & 1; - sel25519(a, b, r); - sel25519(c, d, r); - A(e, a, c); - Z(a, a, c); - A(c, b, d); - Z(b, b, d); - S(d, e); - S(f, a); - M(a, c, a); - M(c, b, e); - A(e, a, c); - Z(a, a, c); - S(b, a); - Z(c, d, f); - M(a, c, _121665); - A(a, a, d); - M(c, c, a); - M(a, d, f); - M(d, b, x); - S(b, e); - sel25519(a, b, r); - sel25519(c, d, r); - } - for (i = 0; i < 16; i++) { - x[i + 16] = a[i]; - x[i + 32] = c[i]; - x[i + 48] = b[i]; - x[i + 64] = d[i]; - } - var x32 = x.subarray(32); - var x16 = x.subarray(16); - inv25519(x32, x32); - M(x16, x16, x32); - pack25519(q, x16); - return 0; - } - function crypto_scalarmult_base(q, n) { - return crypto_scalarmult(q, n, _9); - } - function crypto_box_keypair(y, x) { - randombytes(x, 32); - return crypto_scalarmult_base(y, x); - } - function crypto_box_beforenm(k, y, x) { - var s = new Uint8Array(32); - crypto_scalarmult(s, x, y); - return crypto_core_hsalsa20(k, _0, s, sigma); - } - var crypto_box_afternm = crypto_secretbox; - var crypto_box_open_afternm = crypto_secretbox_open; - function crypto_box(c, m, d, n, y, x) { - var k = new Uint8Array(32); - crypto_box_beforenm(k, y, x); - return crypto_box_afternm(c, m, d, n, k); - } - function crypto_box_open(m, c, d, n, y, x) { - var k = new Uint8Array(32); - crypto_box_beforenm(k, y, x); - return crypto_box_open_afternm(m, c, d, n, k); - } - var K = [ 1116352408, 3609767458, 1899447441, 602891725, 3049323471, 3964484399, 3921009573, 2173295548, 961987163, 4081628472, 1508970993, 3053834265, 2453635748, 2937671579, 2870763221, 3664609560, 3624381080, 2734883394, 310598401, 1164996542, 607225278, 1323610764, 1426881987, 3590304994, 1925078388, 4068182383, 2162078206, 991336113, 2614888103, 633803317, 3248222580, 3479774868, 3835390401, 2666613458, 4022224774, 944711139, 264347078, 2341262773, 604807628, 2007800933, 770255983, 1495990901, 1249150122, 1856431235, 1555081692, 3175218132, 1996064986, 2198950837, 2554220882, 3999719339, 2821834349, 766784016, 2952996808, 2566594879, 3210313671, 3203337956, 3336571891, 1034457026, 3584528711, 2466948901, 113926993, 3758326383, 338241895, 168717936, 666307205, 1188179964, 773529912, 1546045734, 1294757372, 1522805485, 1396182291, 2643833823, 1695183700, 2343527390, 1986661051, 1014477480, 2177026350, 1206759142, 2456956037, 344077627, 2730485921, 1290863460, 2820302411, 3158454273, 3259730800, 3505952657, 3345764771, 106217008, 3516065817, 3606008344, 3600352804, 1432725776, 4094571909, 1467031594, 275423344, 851169720, 430227734, 3100823752, 506948616, 1363258195, 659060556, 3750685593, 883997877, 3785050280, 958139571, 3318307427, 1322822218, 3812723403, 1537002063, 2003034995, 1747873779, 3602036899, 1955562222, 1575990012, 2024104815, 1125592928, 2227730452, 2716904306, 2361852424, 442776044, 2428436474, 593698344, 2756734187, 3733110249, 3204031479, 2999351573, 3329325298, 3815920427, 3391569614, 3928383900, 3515267271, 566280711, 3940187606, 3454069534, 4118630271, 4000239992, 116418474, 1914138554, 174292421, 2731055270, 289380356, 3203993006, 460393269, 320620315, 685471733, 587496836, 852142971, 1086792851, 1017036298, 365543100, 1126000580, 2618297676, 1288033470, 3409855158, 1501505948, 4234509866, 1607167915, 987167468, 1816402316, 1246189591 ]; - function crypto_hashblocks_hl(hh, hl, m, n) { - var wh = new Int32Array(16), wl = new Int32Array(16), bh0, bh1, bh2, bh3, bh4, bh5, bh6, bh7, bl0, bl1, bl2, bl3, bl4, bl5, bl6, bl7, th, tl, i, j, h, l, a, b, c, d; - var ah0 = hh[0], ah1 = hh[1], ah2 = hh[2], ah3 = hh[3], ah4 = hh[4], ah5 = hh[5], ah6 = hh[6], ah7 = hh[7], al0 = hl[0], al1 = hl[1], al2 = hl[2], al3 = hl[3], al4 = hl[4], al5 = hl[5], al6 = hl[6], al7 = hl[7]; - var pos = 0; - while (n >= 128) { - for (i = 0; i < 16; i++) { - j = 8 * i + pos; - wh[i] = m[j + 0] << 24 | m[j + 1] << 16 | m[j + 2] << 8 | m[j + 3]; - wl[i] = m[j + 4] << 24 | m[j + 5] << 16 | m[j + 6] << 8 | m[j + 7]; - } - for (i = 0; i < 80; i++) { - bh0 = ah0; - bh1 = ah1; - bh2 = ah2; - bh3 = ah3; - bh4 = ah4; - bh5 = ah5; - bh6 = ah6; - bh7 = ah7; - bl0 = al0; - bl1 = al1; - bl2 = al2; - bl3 = al3; - bl4 = al4; - bl5 = al5; - bl6 = al6; - bl7 = al7; - h = ah7; - l = al7; - a = l & 65535; - b = l >>> 16; - c = h & 65535; - d = h >>> 16; - h = (ah4 >>> 14 | al4 << 32 - 14) ^ (ah4 >>> 18 | al4 << 32 - 18) ^ (al4 >>> 41 - 32 | ah4 << 32 - (41 - 32)); - l = (al4 >>> 14 | ah4 << 32 - 14) ^ (al4 >>> 18 | ah4 << 32 - 18) ^ (ah4 >>> 41 - 32 | al4 << 32 - (41 - 32)); - a += l & 65535; - b += l >>> 16; - c += h & 65535; - d += h >>> 16; - h = ah4 & ah5 ^ ~ah4 & ah6; - l = al4 & al5 ^ ~al4 & al6; - a += l & 65535; - b += l >>> 16; - c += h & 65535; - d += h >>> 16; - h = K[i * 2]; - l = K[i * 2 + 1]; - a += l & 65535; - b += l >>> 16; - c += h & 65535; - d += h >>> 16; - h = wh[i % 16]; - l = wl[i % 16]; - a += l & 65535; - b += l >>> 16; - c += h & 65535; - d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - th = c & 65535 | d << 16; - tl = a & 65535 | b << 16; - h = th; - l = tl; - a = l & 65535; - b = l >>> 16; - c = h & 65535; - d = h >>> 16; - h = (ah0 >>> 28 | al0 << 32 - 28) ^ (al0 >>> 34 - 32 | ah0 << 32 - (34 - 32)) ^ (al0 >>> 39 - 32 | ah0 << 32 - (39 - 32)); - l = (al0 >>> 28 | ah0 << 32 - 28) ^ (ah0 >>> 34 - 32 | al0 << 32 - (34 - 32)) ^ (ah0 >>> 39 - 32 | al0 << 32 - (39 - 32)); - a += l & 65535; - b += l >>> 16; - c += h & 65535; - d += h >>> 16; - h = ah0 & ah1 ^ ah0 & ah2 ^ ah1 & ah2; - l = al0 & al1 ^ al0 & al2 ^ al1 & al2; - a += l & 65535; - b += l >>> 16; - c += h & 65535; - d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - bh7 = c & 65535 | d << 16; - bl7 = a & 65535 | b << 16; - h = bh3; - l = bl3; - a = l & 65535; - b = l >>> 16; - c = h & 65535; - d = h >>> 16; - h = th; - l = tl; - a += l & 65535; - b += l >>> 16; - c += h & 65535; - d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - bh3 = c & 65535 | d << 16; - bl3 = a & 65535 | b << 16; - ah1 = bh0; - ah2 = bh1; - ah3 = bh2; - ah4 = bh3; - ah5 = bh4; - ah6 = bh5; - ah7 = bh6; - ah0 = bh7; - al1 = bl0; - al2 = bl1; - al3 = bl2; - al4 = bl3; - al5 = bl4; - al6 = bl5; - al7 = bl6; - al0 = bl7; - if (i % 16 === 15) { - for (j = 0; j < 16; j++) { - h = wh[j]; - l = wl[j]; - a = l & 65535; - b = l >>> 16; - c = h & 65535; - d = h >>> 16; - h = wh[(j + 9) % 16]; - l = wl[(j + 9) % 16]; - a += l & 65535; - b += l >>> 16; - c += h & 65535; - d += h >>> 16; - th = wh[(j + 1) % 16]; - tl = wl[(j + 1) % 16]; - h = (th >>> 1 | tl << 32 - 1) ^ (th >>> 8 | tl << 32 - 8) ^ th >>> 7; - l = (tl >>> 1 | th << 32 - 1) ^ (tl >>> 8 | th << 32 - 8) ^ (tl >>> 7 | th << 32 - 7); - a += l & 65535; - b += l >>> 16; - c += h & 65535; - d += h >>> 16; - th = wh[(j + 14) % 16]; - tl = wl[(j + 14) % 16]; - h = (th >>> 19 | tl << 32 - 19) ^ (tl >>> 61 - 32 | th << 32 - (61 - 32)) ^ th >>> 6; - l = (tl >>> 19 | th << 32 - 19) ^ (th >>> 61 - 32 | tl << 32 - (61 - 32)) ^ (tl >>> 6 | th << 32 - 6); - a += l & 65535; - b += l >>> 16; - c += h & 65535; - d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - wh[j] = c & 65535 | d << 16; - wl[j] = a & 65535 | b << 16; - } - } - } - h = ah0; - l = al0; - a = l & 65535; - b = l >>> 16; - c = h & 65535; - d = h >>> 16; - h = hh[0]; - l = hl[0]; - a += l & 65535; - b += l >>> 16; - c += h & 65535; - d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - hh[0] = ah0 = c & 65535 | d << 16; - hl[0] = al0 = a & 65535 | b << 16; - h = ah1; - l = al1; - a = l & 65535; - b = l >>> 16; - c = h & 65535; - d = h >>> 16; - h = hh[1]; - l = hl[1]; - a += l & 65535; - b += l >>> 16; - c += h & 65535; - d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - hh[1] = ah1 = c & 65535 | d << 16; - hl[1] = al1 = a & 65535 | b << 16; - h = ah2; - l = al2; - a = l & 65535; - b = l >>> 16; - c = h & 65535; - d = h >>> 16; - h = hh[2]; - l = hl[2]; - a += l & 65535; - b += l >>> 16; - c += h & 65535; - d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - hh[2] = ah2 = c & 65535 | d << 16; - hl[2] = al2 = a & 65535 | b << 16; - h = ah3; - l = al3; - a = l & 65535; - b = l >>> 16; - c = h & 65535; - d = h >>> 16; - h = hh[3]; - l = hl[3]; - a += l & 65535; - b += l >>> 16; - c += h & 65535; - d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - hh[3] = ah3 = c & 65535 | d << 16; - hl[3] = al3 = a & 65535 | b << 16; - h = ah4; - l = al4; - a = l & 65535; - b = l >>> 16; - c = h & 65535; - d = h >>> 16; - h = hh[4]; - l = hl[4]; - a += l & 65535; - b += l >>> 16; - c += h & 65535; - d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - hh[4] = ah4 = c & 65535 | d << 16; - hl[4] = al4 = a & 65535 | b << 16; - h = ah5; - l = al5; - a = l & 65535; - b = l >>> 16; - c = h & 65535; - d = h >>> 16; - h = hh[5]; - l = hl[5]; - a += l & 65535; - b += l >>> 16; - c += h & 65535; - d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - hh[5] = ah5 = c & 65535 | d << 16; - hl[5] = al5 = a & 65535 | b << 16; - h = ah6; - l = al6; - a = l & 65535; - b = l >>> 16; - c = h & 65535; - d = h >>> 16; - h = hh[6]; - l = hl[6]; - a += l & 65535; - b += l >>> 16; - c += h & 65535; - d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - hh[6] = ah6 = c & 65535 | d << 16; - hl[6] = al6 = a & 65535 | b << 16; - h = ah7; - l = al7; - a = l & 65535; - b = l >>> 16; - c = h & 65535; - d = h >>> 16; - h = hh[7]; - l = hl[7]; - a += l & 65535; - b += l >>> 16; - c += h & 65535; - d += h >>> 16; - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - hh[7] = ah7 = c & 65535 | d << 16; - hl[7] = al7 = a & 65535 | b << 16; - pos += 128; - n -= 128; - } - return n; - } - function crypto_hash(out, m, n) { - var hh = new Int32Array(8), hl = new Int32Array(8), x = new Uint8Array(256), i, b = n; - hh[0] = 1779033703; - hh[1] = 3144134277; - hh[2] = 1013904242; - hh[3] = 2773480762; - hh[4] = 1359893119; - hh[5] = 2600822924; - hh[6] = 528734635; - hh[7] = 1541459225; - hl[0] = 4089235720; - hl[1] = 2227873595; - hl[2] = 4271175723; - hl[3] = 1595750129; - hl[4] = 2917565137; - hl[5] = 725511199; - hl[6] = 4215389547; - hl[7] = 327033209; - crypto_hashblocks_hl(hh, hl, m, n); - n %= 128; - for (i = 0; i < n; i++) x[i] = m[b - n + i]; - x[n] = 128; - n = 256 - 128 * (n < 112 ? 1 : 0); - x[n - 9] = 0; - ts64(x, n - 8, b / 536870912 | 0, b << 3); - crypto_hashblocks_hl(hh, hl, x, n); - for (i = 0; i < 8; i++) ts64(out, 8 * i, hh[i], hl[i]); - return 0; - } - function add(p, q) { - var a = gf(), b = gf(), c = gf(), d = gf(), e = gf(), f = gf(), g = gf(), h = gf(), t = gf(); - Z(a, p[1], p[0]); - Z(t, q[1], q[0]); - M(a, a, t); - A(b, p[0], p[1]); - A(t, q[0], q[1]); - M(b, b, t); - M(c, p[3], q[3]); - M(c, c, D2); - M(d, p[2], q[2]); - A(d, d, d); - Z(e, b, a); - Z(f, d, c); - A(g, d, c); - A(h, b, a); - M(p[0], e, f); - M(p[1], h, g); - M(p[2], g, f); - M(p[3], e, h); - } - function cswap(p, q, b) { - var i; - for (i = 0; i < 4; i++) { - sel25519(p[i], q[i], b); - } - } - function pack(r, p) { - var tx = gf(), ty = gf(), zi = gf(); - inv25519(zi, p[2]); - M(tx, p[0], zi); - M(ty, p[1], zi); - pack25519(r, ty); - r[31] ^= par25519(tx) << 7; - } - function scalarmult(p, q, s) { - var b, i; - set25519(p[0], gf0); - set25519(p[1], gf1); - set25519(p[2], gf1); - set25519(p[3], gf0); - for (i = 255; i >= 0; --i) { - b = s[i / 8 | 0] >> (i & 7) & 1; - cswap(p, q, b); - add(q, p); - add(p, p); - cswap(p, q, b); - } - } - function scalarbase(p, s) { - var q = [ gf(), gf(), gf(), gf() ]; - set25519(q[0], X); - set25519(q[1], Y); - set25519(q[2], gf1); - M(q[3], X, Y); - scalarmult(p, q, s); - } - function crypto_sign_keypair(pk, sk, seeded) { - var d = new Uint8Array(64); - var p = [ gf(), gf(), gf(), gf() ]; - var i; - if (!seeded) randombytes(sk, 32); - crypto_hash(d, sk, 32); - d[0] &= 248; - d[31] &= 127; - d[31] |= 64; - scalarbase(p, d); - pack(pk, p); - for (i = 0; i < 32; i++) sk[i + 32] = pk[i]; - return 0; - } - var L = new Float64Array([ 237, 211, 245, 92, 26, 99, 18, 88, 214, 156, 247, 162, 222, 249, 222, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16 ]); - function modL(r, x) { - var carry, i, j, k; - for (i = 63; i >= 32; --i) { - carry = 0; - for (j = i - 32, k = i - 12; j < k; ++j) { - x[j] += carry - 16 * x[i] * L[j - (i - 32)]; - carry = x[j] + 128 >> 8; - x[j] -= carry * 256; - } - x[j] += carry; - x[i] = 0; - } - carry = 0; - for (j = 0; j < 32; j++) { - x[j] += carry - (x[31] >> 4) * L[j]; - carry = x[j] >> 8; - x[j] &= 255; - } - for (j = 0; j < 32; j++) x[j] -= carry * L[j]; - for (i = 0; i < 32; i++) { - x[i + 1] += x[i] >> 8; - r[i] = x[i] & 255; - } - } - function reduce(r) { - var x = new Float64Array(64), i; - for (i = 0; i < 64; i++) x[i] = r[i]; - for (i = 0; i < 64; i++) r[i] = 0; - modL(r, x); - } - function crypto_sign(sm, m, n, sk) { - var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64); - var i, j, x = new Float64Array(64); - var p = [ gf(), gf(), gf(), gf() ]; - crypto_hash(d, sk, 32); - d[0] &= 248; - d[31] &= 127; - d[31] |= 64; - var smlen = n + 64; - for (i = 0; i < n; i++) sm[64 + i] = m[i]; - for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i]; - crypto_hash(r, sm.subarray(32), n + 32); - reduce(r); - scalarbase(p, r); - pack(sm, p); - for (i = 32; i < 64; i++) sm[i] = sk[i]; - crypto_hash(h, sm, n + 64); - reduce(h); - for (i = 0; i < 64; i++) x[i] = 0; - for (i = 0; i < 32; i++) x[i] = r[i]; - for (i = 0; i < 32; i++) { - for (j = 0; j < 32; j++) { - x[i + j] += h[i] * d[j]; - } - } - modL(sm.subarray(32), x); - return smlen; - } - function unpackneg(r, p) { - var t = gf(), chk = gf(), num = gf(), den = gf(), den2 = gf(), den4 = gf(), den6 = gf(); - set25519(r[2], gf1); - unpack25519(r[1], p); - S(num, r[1]); - M(den, num, D); - Z(num, num, r[2]); - A(den, r[2], den); - S(den2, den); - S(den4, den2); - M(den6, den4, den2); - M(t, den6, num); - M(t, t, den); - pow2523(t, t); - M(t, t, num); - M(t, t, den); - M(t, t, den); - M(r[0], t, den); - S(chk, r[0]); - M(chk, chk, den); - if (neq25519(chk, num)) M(r[0], r[0], I); - S(chk, r[0]); - M(chk, chk, den); - if (neq25519(chk, num)) return -1; - if (par25519(r[0]) === p[31] >> 7) Z(r[0], gf0, r[0]); - M(r[3], r[0], r[1]); - return 0; - } - function crypto_sign_open(m, sm, n, pk) { - var i, mlen; - var t = new Uint8Array(32), h = new Uint8Array(64); - var p = [ gf(), gf(), gf(), gf() ], q = [ gf(), gf(), gf(), gf() ]; - mlen = -1; - if (n < 64) return -1; - if (unpackneg(q, pk)) return -1; - for (i = 0; i < n; i++) m[i] = sm[i]; - for (i = 0; i < 32; i++) m[i + 32] = pk[i]; - crypto_hash(h, m, n); - reduce(h); - scalarmult(p, q, h); - scalarbase(q, sm.subarray(32)); - add(p, q); - pack(t, p); - n -= 64; - if (crypto_verify_32(sm, 0, t, 0)) { - for (i = 0; i < n; i++) m[i] = 0; - return -1; - } - for (i = 0; i < n; i++) m[i] = sm[i + 64]; - mlen = n; - return mlen; - } - var crypto_secretbox_KEYBYTES = 32, crypto_secretbox_NONCEBYTES = 24, crypto_secretbox_ZEROBYTES = 32, crypto_secretbox_BOXZEROBYTES = 16, crypto_scalarmult_BYTES = 32, crypto_scalarmult_SCALARBYTES = 32, crypto_box_PUBLICKEYBYTES = 32, crypto_box_SECRETKEYBYTES = 32, crypto_box_BEFORENMBYTES = 32, crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES, crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES, crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES, crypto_sign_BYTES = 64, crypto_sign_PUBLICKEYBYTES = 32, crypto_sign_SECRETKEYBYTES = 64, crypto_sign_SEEDBYTES = 32, crypto_hash_BYTES = 64; - nacl.lowlevel = { - crypto_core_hsalsa20, - crypto_stream_xor, - crypto_stream, - crypto_stream_salsa20_xor, - crypto_stream_salsa20, - crypto_onetimeauth, - crypto_onetimeauth_verify, - crypto_verify_16, - crypto_verify_32, - crypto_secretbox, - crypto_secretbox_open, - crypto_scalarmult, - crypto_scalarmult_base, - crypto_box_beforenm, - crypto_box_afternm, - crypto_box, - crypto_box_open, - crypto_box_keypair, - crypto_hash, - crypto_sign, - crypto_sign_keypair, - crypto_sign_open, - crypto_secretbox_KEYBYTES, - crypto_secretbox_NONCEBYTES, - crypto_secretbox_ZEROBYTES, - crypto_secretbox_BOXZEROBYTES, - crypto_scalarmult_BYTES, - crypto_scalarmult_SCALARBYTES, - crypto_box_PUBLICKEYBYTES, - crypto_box_SECRETKEYBYTES, - crypto_box_BEFORENMBYTES, - crypto_box_NONCEBYTES, - crypto_box_ZEROBYTES, - crypto_box_BOXZEROBYTES, - crypto_sign_BYTES, - crypto_sign_PUBLICKEYBYTES, - crypto_sign_SECRETKEYBYTES, - crypto_sign_SEEDBYTES, - crypto_hash_BYTES - }; - function checkLengths(k, n) { - if (k.length !== crypto_secretbox_KEYBYTES) throw new Error("bad key size"); - if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error("bad nonce size"); - } - function checkBoxLengths(pk, sk) { - if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error("bad public key size"); - if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error("bad secret key size"); - } - function checkArrayTypes() { - var type = {}.toString, t; - for (var i = 0; i < arguments.length; i++) { - if ((t = type.call(arguments[i])) !== "[object Uint8Array]") throw new TypeError("unexpected type " + t + ", use Uint8Array"); - } - } - nacl.util = {}; - nacl.util.decodeUTF8 = function(s) { - var i, d = unescape(encodeURIComponent(s)), b = new Uint8Array(d.length); - for (i = 0; i < d.length; i++) b[i] = d.charCodeAt(i); - return b; - }; - nacl.util.encodeUTF8 = function(arr) { - var i, s = []; - for (i = 0; i < arr.length; i++) s.push(String.fromCharCode(arr[i])); - return decodeURIComponent(escape(s.join(""))); - }; - nacl.util.encodeBase64 = function(arr) { - if (typeof btoa === "undefined") { - return new Buffer(arr).toString("base64"); - } else { - var i, s = [], len = arr.length; - for (i = 0; i < len; i++) s.push(String.fromCharCode(arr[i])); - return btoa(s.join("")); - } - }; - nacl.util.decodeBase64 = function(s) { - if (typeof atob === "undefined") { - return new Uint8Array(Array.prototype.slice.call(new Buffer(s, "base64"), 0)); - } else { - var i, d = atob(s), b = new Uint8Array(d.length); - for (i = 0; i < d.length; i++) b[i] = d.charCodeAt(i); - return b; - } - }; - nacl.randomBytes = function(n) { - var b = new Uint8Array(n); - randombytes(b, n); - return b; - }; - nacl.secretbox = function(msg, nonce, key) { - checkArrayTypes(msg, nonce, key); - checkLengths(key, nonce); - var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length); - var c = new Uint8Array(m.length); - for (var i = 0; i < msg.length; i++) m[i + crypto_secretbox_ZEROBYTES] = msg[i]; - crypto_secretbox(c, m, m.length, nonce, key); - return c.subarray(crypto_secretbox_BOXZEROBYTES); - }; - nacl.secretbox.open = function(box, nonce, key) { - checkArrayTypes(box, nonce, key); - checkLengths(key, nonce); - var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length); - var m = new Uint8Array(c.length); - for (var i = 0; i < box.length; i++) c[i + crypto_secretbox_BOXZEROBYTES] = box[i]; - if (c.length < 32) return false; - if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false; - return m.subarray(crypto_secretbox_ZEROBYTES); - }; - nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES; - nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES; - nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES; - nacl.scalarMult = function(n, p) { - checkArrayTypes(n, p); - if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error("bad n size"); - if (p.length !== crypto_scalarmult_BYTES) throw new Error("bad p size"); - var q = new Uint8Array(crypto_scalarmult_BYTES); - crypto_scalarmult(q, n, p); - return q; - }; - nacl.scalarMult.base = function(n) { - checkArrayTypes(n); - if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error("bad n size"); - var q = new Uint8Array(crypto_scalarmult_BYTES); - crypto_scalarmult_base(q, n); - return q; - }; - nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES; - nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES; - nacl.box = function(msg, nonce, publicKey, secretKey) { - var k = nacl.box.before(publicKey, secretKey); - return nacl.secretbox(msg, nonce, k); - }; - nacl.box.before = function(publicKey, secretKey) { - checkArrayTypes(publicKey, secretKey); - checkBoxLengths(publicKey, secretKey); - var k = new Uint8Array(crypto_box_BEFORENMBYTES); - crypto_box_beforenm(k, publicKey, secretKey); - return k; - }; - nacl.box.after = nacl.secretbox; - nacl.box.open = function(msg, nonce, publicKey, secretKey) { - var k = nacl.box.before(publicKey, secretKey); - return nacl.secretbox.open(msg, nonce, k); - }; - nacl.box.open.after = nacl.secretbox.open; - nacl.box.keyPair = function() { - var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); - var sk = new Uint8Array(crypto_box_SECRETKEYBYTES); - crypto_box_keypair(pk, sk); - return { - publicKey: pk, - secretKey: sk - }; - }; - nacl.box.keyPair.fromSecretKey = function(secretKey) { - checkArrayTypes(secretKey); - if (secretKey.length !== crypto_box_SECRETKEYBYTES) throw new Error("bad secret key size"); - var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); - crypto_scalarmult_base(pk, secretKey); - return { - publicKey: pk, - secretKey: new Uint8Array(secretKey) - }; - }; - nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES; - nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES; - nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES; - nacl.box.nonceLength = crypto_box_NONCEBYTES; - nacl.box.overheadLength = nacl.secretbox.overheadLength; - nacl.sign = function(msg, secretKey) { - checkArrayTypes(msg, secretKey); - if (secretKey.length !== crypto_sign_SECRETKEYBYTES) throw new Error("bad secret key size"); - var signedMsg = new Uint8Array(crypto_sign_BYTES + msg.length); - crypto_sign(signedMsg, msg, msg.length, secretKey); - return signedMsg; - }; - nacl.sign.open = function(signedMsg, publicKey) { - if (arguments.length !== 2) throw new Error("nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?"); - checkArrayTypes(signedMsg, publicKey); - if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) throw new Error("bad public key size"); - var tmp = new Uint8Array(signedMsg.length); - var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey); - if (mlen < 0) return null; - var m = new Uint8Array(mlen); - for (var i = 0; i < m.length; i++) m[i] = tmp[i]; - return m; - }; - nacl.sign.detached = function(msg, secretKey) { - var signedMsg = nacl.sign(msg, secretKey); - var sig = new Uint8Array(crypto_sign_BYTES); - for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i]; - return sig; - }; - nacl.sign.detached.verify = function(msg, sig, publicKey) { - checkArrayTypes(msg, sig, publicKey); - if (sig.length !== crypto_sign_BYTES) throw new Error("bad signature size"); - if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) throw new Error("bad public key size"); - var sm = new Uint8Array(crypto_sign_BYTES + msg.length); - var m = new Uint8Array(crypto_sign_BYTES + msg.length); - var i; - for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i]; - for (i = 0; i < msg.length; i++) sm[i + crypto_sign_BYTES] = msg[i]; - return crypto_sign_open(m, sm, sm.length, publicKey) >= 0; - }; - nacl.sign.keyPair = function() { - var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); - var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); - crypto_sign_keypair(pk, sk); - return { - publicKey: pk, - secretKey: sk - }; - }; - nacl.sign.keyPair.fromSecretKey = function(secretKey) { - checkArrayTypes(secretKey); - if (secretKey.length !== crypto_sign_SECRETKEYBYTES) throw new Error("bad secret key size"); - var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); - for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32 + i]; - return { - publicKey: pk, - secretKey: new Uint8Array(secretKey) - }; - }; - nacl.sign.keyPair.fromSeed = function(seed) { - checkArrayTypes(seed); - if (seed.length !== crypto_sign_SEEDBYTES) throw new Error("bad seed size"); - var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); - var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); - for (var i = 0; i < 32; i++) sk[i] = seed[i]; - crypto_sign_keypair(pk, sk, true); - return { - publicKey: pk, - secretKey: sk - }; - }; - nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES; - nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES; - nacl.sign.seedLength = crypto_sign_SEEDBYTES; - nacl.sign.signatureLength = crypto_sign_BYTES; - nacl.hash = function(msg) { - checkArrayTypes(msg); - var h = new Uint8Array(crypto_hash_BYTES); - crypto_hash(h, msg, msg.length); - return h; - }; - nacl.hash.hashLength = crypto_hash_BYTES; - nacl.verify = function(x, y) { - checkArrayTypes(x, y); - if (x.length === 0 || y.length === 0) return false; - if (x.length !== y.length) return false; - return vn(x, 0, y, 0, x.length) === 0 ? true : false; - }; - nacl.setPRNG = function(fn) { - randombytes = fn; - }; - (function() { - var crypto; - if (typeof window !== "undefined") { - if (window.crypto && window.crypto.getRandomValues) { - crypto = window.crypto; - } else if (window.msCrypto && window.msCrypto.getRandomValues) { - crypto = window.msCrypto; - } - if (crypto) { - nacl.setPRNG((function(x, n) { - var i, v = new Uint8Array(n); - crypto.getRandomValues(v); - for (i = 0; i < n; i++) x[i] = v[i]; - })); - } - } else if (typeof commonjsRequire !== "undefined") { - crypto = require("crypto"); - if (crypto) { - nacl.setPRNG((function(x, n) { - var i, v = crypto.randomBytes(n); - for (i = 0; i < n; i++) x[i] = v[i]; - })); - } - } - })(); - })(module.exports ? module.exports : window.nacl = window.nacl || {}); - })(naclFast); - return naclFast.exports; - } - var hasRequiredCrypto; - function requireCrypto() { - if (hasRequiredCrypto) return crypto.exports; - hasRequiredCrypto = 1; - (function(module) { - (function() { - var factory = function(Nacl) { - var Crypto = { - Nacl - }; - var encodeBase64 = Nacl.util.encodeBase64; - var decodeBase64 = Nacl.util.decodeBase64; - var decodeUTF8 = Nacl.util.decodeUTF8; - var encodeUTF8 = Nacl.util.encodeUTF8; - var encodeHex = function(bytes) { - var hexString = ""; - for (var i = 0; i < bytes.length; i++) { - if (bytes[i] < 16) { - hexString += "0"; - } - hexString += bytes[i].toString(16); - } - return hexString; - }; - var encryptStr = function(str, key) { - var array = decodeUTF8(str); - var nonce = Nacl.randomBytes(24); - var packed = Nacl.secretbox(array, nonce, key); - if (!packed) { - throw new Error; - } - return encodeBase64(nonce) + "|" + encodeBase64(packed); - }; - var decryptStr = function(str, key) { - var arr = str.split("|"); - if (arr.length !== 2) { - throw new Error; - } - var nonce = decodeBase64(arr[0]); - var packed = decodeBase64(arr[1]); - var unpacked = Nacl.secretbox.open(packed, nonce, key); - if (!unpacked) { - throw new Error; - } - return encodeUTF8(unpacked); - }; - var encrypt = Crypto.encrypt = function(msg, key) { - return encryptStr(msg, key); - }; - var decrypt = Crypto.decrypt = function(msg, key) { - return decryptStr(msg, key); - }; - var parseKey = Crypto.parseKey = function(str) { - try { - var array = decodeBase64(str); - var hash = Nacl.hash(array); - var lk = hash.subarray(32); - return { - lookupKey: lk, - cryptKey: hash.subarray(0, 32), - channel: encodeBase64(lk).substring(0, 10) - }; - } catch (err) { - console.error("[chainpad-crypto.parseKey] invalid string supplied"); - throw err; - } - }; - var rand64 = Crypto.rand64 = function(bytes) { - return encodeBase64(Nacl.randomBytes(bytes)); - }; - Crypto.genKey = function() { - return rand64(18); - }; - var b64Encode = function(bytes) { - return encodeBase64(bytes).replace(/\//g, "-").replace(/=+$/g, ""); - }; - var b64Decode = function(str) { - return decodeBase64(str.replace(/\-/g, "/")); - }; - Crypto.b64RemoveSlashes = function(str) { - return str.replace(/\//g, "-"); - }; - Crypto.b64AddSlashes = function(str) { - return str.replace(/\-/g, "/"); - }; - Crypto.createEncryptor = function(input) { - var key; - if (typeof input === "object") { - var out = {}; - key = input.cryptKey; - if (!key) { - throw new Error("NO_DECRYPTION_KEY_PROVIDED"); - } - if (input.signKey) { - var signKey = decodeBase64(input.signKey); - out.encrypt = function(msg) { - return encodeBase64(Nacl.sign(decodeUTF8(encrypt(msg, key)), signKey)); - }; - } - out.decrypt = function(msg, validateKey, skipCheck) { - if (!validateKey && !skipCheck) { - throw new Error("UNSUPPORTED_DECRYPTION_CONFIGURATION"); - } - if (validateKey === true && !skipCheck) { - console.error("UNEXPECTED_CONFIGURATION"); - } - var validated = skipCheck || typeof validateKey !== "string" ? decodeBase64(msg).subarray(64) : Nacl.sign.open(decodeBase64(msg), decodeBase64(validateKey)); - if (!validated) { - return; - } - return decrypt(encodeUTF8(validated), key); - }; - return out; - } - key = parseKey(input).cryptKey; - return { - encrypt: function(msg) { - return encrypt(msg, key); - }, - decrypt: function(msg) { - return decrypt(msg, key); - } - }; - }; - Crypto.createEditCryptor = function(keyStr, seed) { - try { - if (!keyStr) { - if (seed && seed.length !== 18) { - throw new Error("expected supplied seed to have length of 18"); - } else if (!seed) { - seed = Nacl.randomBytes(18); - } - keyStr = encodeBase64(seed); - } - var hash = Nacl.hash(decodeBase64(keyStr)); - var signKp = Nacl.sign.keyPair.fromSeed(hash.subarray(0, 32)); - var cryptKey = hash.subarray(32, 64); - return { - editKeyStr: keyStr, - signKey: encodeBase64(signKp.secretKey), - validateKey: encodeBase64(signKp.publicKey), - cryptKey, - viewKeyStr: b64Encode(cryptKey) - }; - } catch (err) { - console.error("[chainpad-crypto.createEditCryptor] invalid string supplied"); - throw err; - } - }; - Crypto.createViewCryptor = function(cryptKeyStr) { - try { - if (!cryptKeyStr) { - throw new Error("Cannot open a new pad in read-only mode!"); - } - return { - cryptKey: decodeBase64(cryptKeyStr), - viewKeyStr: cryptKeyStr - }; - } catch (err) { - console.error("[chainpad-crypto.createViewCryptor] invalid string supplied"); - throw err; - } - }; - var createViewCryptor2 = Crypto.createViewCryptor2 = function(viewKeyStr, password) { - try { - if (!viewKeyStr) { - throw new Error("Cannot open a new pad in read-only mode!"); - } - var seed = b64Decode(viewKeyStr); - var superSeed = seed; - if (password) { - var pwKey = decodeUTF8(password); - superSeed = new Uint8Array(seed.length + pwKey.length); - superSeed.set(pwKey); - superSeed.set(seed, pwKey.length); - } - var hash = Nacl.hash(superSeed); - var chanId = hash.subarray(0, 16); - var cryptKey = hash.subarray(16, 48); - var signKp2 = Nacl.sign.keyPair.fromSeed(hash.subarray(32, 64)); - return { - viewKeyStr, - cryptKey, - chanId: b64Encode(chanId), - secondarySignKey: encodeBase64(signKp2.secretKey), - secondaryValidateKey: encodeBase64(signKp2.publicKey) - }; - } catch (err) { - console.error("[chainpad-crypto.createViewCryptor2] invalid string supplied"); - throw err; - } - }; - Crypto.createEditCryptor2 = function(keyStr, seed, password) { - try { - if (!keyStr) { - if (seed && seed.length !== 18) { - throw new Error("expected supplied seed to have length of 18"); - } else if (!seed) { - seed = Nacl.randomBytes(18); - } - keyStr = b64Encode(seed); - } - if (!seed) { - seed = b64Decode(keyStr); - } - var superSeed = seed; - if (password) { - var pwKey = decodeUTF8(password); - superSeed = new Uint8Array(seed.length + pwKey.length); - superSeed.set(pwKey); - superSeed.set(seed, pwKey.length); - } - var hash = Nacl.hash(superSeed); - var signKp = Nacl.sign.keyPair.fromSeed(hash.subarray(0, 32)); - var secondary = Nacl.hash(signKp.secretKey).subarray(0, Nacl.secretbox.keyLength); - var seed2 = hash.subarray(32, 64); - var viewKeyStr = b64Encode(seed2); - var viewCryptor = createViewCryptor2(viewKeyStr, password); - return { - editKeyStr: keyStr, - viewKeyStr, - signKey: encodeBase64(signKp.secretKey), - validateKey: encodeBase64(signKp.publicKey), - cryptKey: viewCryptor.cryptKey, - secondaryKey: encodeBase64(secondary), - chanId: viewCryptor.chanId, - secondarySignKey: viewCryptor.secondarySignKey, - secondaryValidateKey: viewCryptor.secondaryValidateKey - }; - } catch (err) { - console.error("[chainpad-crypto.createEditCryptor2] invalid string supplied"); - throw err; - } - }; - Crypto.createFileCryptor2 = function(keyStr, password) { - try { - var seed; - if (!keyStr) { - seed = Nacl.randomBytes(18); - keyStr = b64Encode(seed); - } - if (!seed) { - seed = b64Decode(keyStr); - } - var superSeed = seed; - if (password) { - var pwKey = decodeUTF8(password); - superSeed = new Uint8Array(seed.length + pwKey.length); - superSeed.set(pwKey); - superSeed.set(seed, pwKey.length); - } - var hash = Nacl.hash(superSeed); - var chanId = hash.subarray(0, 24); - var cryptKey = hash.subarray(24, 56); - return { - fileKeyStr: keyStr, - cryptKey, - chanId: b64Encode(chanId) - }; - } catch (err) { - console.error("[chainpad-crypto.createFileCryptor2] invalid string supplied"); - throw err; - } - }; - var Curve = Crypto.Curve = {}; - var u8_concat = function(A) { - var length = 0; - A.forEach((function(a) { - length += a.length; - })); - var total = new Uint8Array(length); - var offset = 0; - A.forEach((function(a) { - total.set(a, offset); - offset += a.length; - })); - return total; - }; - Curve.encrypt = function(message, secret) { - var buffer = decodeUTF8(message); - var nonce = Nacl.randomBytes(24); - var box = Nacl.box.after(buffer, nonce, secret); - return encodeBase64(nonce) + "|" + encodeBase64(box); - }; - Curve.decrypt = function(packed, secret) { - var unpacked = packed.split("|"); - var nonce = decodeBase64(unpacked[0]); - var box = decodeBase64(unpacked[1]); - var message = Nacl.box.open.after(box, nonce, secret); - if (message === false) { - return null; - } - return encodeUTF8(message); - }; - Curve.signAndEncrypt = function(msg, cryptKey, signKey) { - var packed = Curve.encrypt(msg, cryptKey); - return encodeBase64(Nacl.sign(decodeUTF8(packed), signKey)); - }; - Curve.openSigned = function(msg, cryptKey) { - var content = decodeBase64(msg).subarray(64); - return Curve.decrypt(encodeUTF8(content), cryptKey); - }; - Curve.deriveKeys = function(theirs, mine) { - try { - var pub = decodeBase64(theirs); - var secret = decodeBase64(mine); - var sharedSecret = Nacl.box.before(pub, secret); - var salt = decodeUTF8("CryptPad.signingKeyGenerationSalt"); - var hash = Nacl.hash(u8_concat([ salt, sharedSecret ])); - var signKp = Nacl.sign.keyPair.fromSeed(hash.subarray(0, 32)); - var cryptKey = hash.subarray(32, 64); - return { - cryptKey: encodeBase64(cryptKey), - signKey: encodeBase64(signKp.secretKey), - validateKey: encodeBase64(signKp.publicKey) - }; - } catch (e) { - console.error("invalid keys or other problem deriving keys"); - console.error(e); - return null; - } - }; - Curve.createEncryptor = function(keys) { - if (!keys || typeof keys !== "object") { - return void console.error("invalid input for createEncryptor"); - } - var cryptKey = decodeBase64(keys.cryptKey); - var signKey = decodeBase64(keys.signKey); - var validateKey = decodeBase64(keys.validateKey); - return { - encrypt: function(msg) { - return Curve.signAndEncrypt(msg, cryptKey, signKey); - }, - decrypt: function(packed) { - return Curve.openSigned(packed, cryptKey, validateKey); - } - }; - }; - var u8_slice = function(A, start, end) { - return new Uint8Array(Array.prototype.slice.call(A, start, end)); - }; - var Mailbox = Crypto.Mailbox = {}; - var asymmetric_encrypt = function(u8_plain, keys) { - var u8_nonce = Nacl.randomBytes(Nacl.box.nonceLength); - var u8_cipher = Nacl.box(u8_plain, u8_nonce, keys.their_public, keys.my_private); - var u8_bundle = u8_concat([ u8_nonce, keys.my_public, u8_cipher ]); - return u8_bundle; - }; - var asymmetric_decrypt = function(u8_bundle, keys) { - var u8_nonce = u8_slice(u8_bundle, 0, Nacl.box.nonceLength); - var u8_sender_public = u8_slice(u8_bundle, Nacl.box.nonceLength, Nacl.box.nonceLength + Nacl.box.publicKeyLength); - var u8_cipher = u8_slice(u8_bundle, Nacl.box.nonceLength + Nacl.box.publicKeyLength); - var u8_plain = Nacl.box.open(u8_cipher, u8_nonce, keys.their_public || u8_sender_public, keys.my_private); - if (!u8_plain) { - throw new Error("E_DECRYPTION_FAILURE"); - } - return { - content: u8_plain, - author: u8_sender_public - }; - }; - var sealSecretLetter = Mailbox.sealSecretLetter = function(plain, keys) { - var u8_plain = decodeUTF8(plain); - var u8_letter = asymmetric_encrypt(u8_plain, { - their_public: keys.their_public, - my_private: keys.my_private, - my_public: keys.my_public - }); - var u8_ephemeral_keypair = keys.ephemeral_keypair || Nacl.box.keyPair(); - var u8_sealed = asymmetric_encrypt(u8_letter, { - their_public: keys.their_public, - my_private: u8_ephemeral_keypair.secretKey, - my_public: u8_ephemeral_keypair.publicKey - }); - if (keys.signingKey) { - u8_sealed = Nacl.sign(u8_sealed, keys.signingKey); - } - return encodeBase64(u8_sealed); - }; - Mailbox.openOwnSecretLetter = function(b64_bundle, keys) { - var u8_bundle = decodeBase64(b64_bundle); - if (keys.validateKey) { - u8_bundle = u8_bundle.subarray(64); - } - var letter = asymmetric_decrypt(u8_bundle, { - my_private: keys.ephemeral_private, - their_public: keys.their_public - }); - var u8_plain = asymmetric_decrypt(letter.content, { - my_private: keys.my_private, - their_public: keys.their_public - }); - return { - content: encodeUTF8(u8_plain.content), - author: encodeBase64(u8_plain.author) - }; - }; - var openSecretLetter = Mailbox.openSecretLetter = function(b64_bundle, keys) { - var u8_bundle = decodeBase64(b64_bundle); - if (keys.validateKey) { - u8_bundle = u8_bundle.subarray(64); - } - var letter = asymmetric_decrypt(u8_bundle, { - my_private: keys.my_private - }); - var u8_plain = asymmetric_decrypt(letter.content, { - my_private: keys.my_private - }); - return { - content: encodeUTF8(u8_plain.content), - author: encodeBase64(u8_plain.author) - }; - }; - Mailbox.createEncryptor = function(keys) { - if (!keys || typeof keys !== "object") { - return void console.error("invalid Mailbox.createEncryptor keys"); - } - [ "curvePublic", "curvePrivate" ].forEach((function(k) { - if (typeof keys[k] !== "string") { - console.log(k); - throw new Error("Expected key was not present"); - } - })); - var u8_my_private = decodeBase64(keys.curvePrivate); - var u8_my_public = decodeBase64(keys.curvePublic); - var signingKey = keys.signingKey ? decodeBase64(keys.signingKey) : undefined; - var validateKey = keys.validateKey ? decodeBase64(keys.validateKey) : undefined; - return { - encrypt: function(plain, recipient) { - var u8_their_public = decodeBase64(recipient); - try { - var sealed = sealSecretLetter(plain, { - signingKey, - ephemeral_keypair: keys.ephemeral_keypair, - their_public: u8_their_public, - my_private: u8_my_private, - my_public: u8_my_public - }); - return sealed; - } catch (e) { - console.error(e); - return null; - } - }, - decrypt: function(cipher) { - try { - return openSecretLetter(cipher, { - validateKey, - my_private: u8_my_private - }); - } catch (e) { - console.error(e); - return null; - } - } - }; - }; - var Team = Crypto.Team = {}; - var encryptForTeam = function(plain, keys) { - var u8_plain = decodeUTF8(plain); - var u8_inner = asymmetric_encrypt(u8_plain, { - their_public: keys.team_curve_public, - my_private: keys.my_curve_private, - my_public: keys.my_curve_public - }); - var u8_ephemeral_keypair = Nacl.box.keyPair(); - var u8_outer = asymmetric_encrypt(u8_inner, { - their_public: keys.team_curve_public, - my_private: u8_ephemeral_keypair.secretKey, - my_public: u8_ephemeral_keypair.publicKey - }); - return encodeBase64(Nacl.sign(u8_outer, keys.team_ed_private)); - }; - var decryptForTeam = function(b64_bundle, keys, skipValidation) { - var u8_bundle = decodeBase64(b64_bundle); - var u8_outer; - if (skipValidation === true) { - u8_outer = u8_slice(u8_bundle, 64); - } else { - u8_outer = Nacl.sign.open(u8_bundle, keys.team_ed_public); - } - if (u8_outer === null) { - throw new Error("E_VALIDATION_FAILURE"); - } - var inner = asymmetric_decrypt(u8_outer, { - my_private: keys.team_curve_private - }); - var u8_plain = asymmetric_decrypt(inner.content, { - my_private: keys.team_curve_private - }); - return { - content: encodeUTF8(u8_plain.content), - author: encodeBase64(u8_plain.author) - }; - }; - var team_key_map = { - teamCurvePublic: "team_curve_public", - teamCurvePrivate: "team_curve_private", - myCurvePublic: "my_curve_public", - myCurvePrivate: "my_curve_private", - teamEdPublic: "team_ed_public", - teamEdPrivate: "team_ed_private" - }; - var team_can_decrypt = function(K) { - return Boolean(K.team_curve_private && K.team_curve_private.length === Nacl.box.secretKeyLength && K.team_ed_public && K.team_ed_public.length === Nacl.sign.publicKeyLength); - }; - var team_can_encrypt = function(K) { - return Boolean(K.my_curve_private && K.my_curve_private.length === Nacl.box.secretKeyLength && K.my_curve_public && K.my_curve_public.length === Nacl.box.publicKeyLength && K.team_curve_public && K.team_curve_public.length === Nacl.box.publicKeyLength && K.team_ed_private && K.team_ed_private.length === Nacl.sign.secretKeyLength); - }; - var team_validate_own_keys = function(K) { - return Boolean(K.curvePublic && decodeBase64(K.curvePublic).length === Nacl.box.publicKeyLength && K.curvePrivate && decodeBase64(K.curvePrivate).length === Nacl.box.secretKeyLength); - }; - var u8_stretch = function(u8) { - var hashed = Nacl.hash(u8); - return [ u8_slice(hashed, 0, 32), u8_slice(hashed, 32) ]; - }; - var merge = function(o1, o2) { - var o3 = JSON.parse(JSON.stringify(o1)); - Object.keys(o2).forEach((function(k) { - o3[k] = o2[k]; - })); - return o3; - }; - var u8_deriveGuestKeys = function(u8_seed2) { - var stretched = u8_stretch(u8_seed2); - var teamCurve = Nacl.box.keyPair.fromSecretKey(stretched[0]); - var u8_channel = u8_slice(stretched[1], 0, 16); - return { - channel: encodeHex(u8_channel), - teamCurvePublic: encodeBase64(teamCurve.publicKey), - teamCurvePrivate: encodeBase64(teamCurve.secretKey), - viewKeyStr: Crypto.b64RemoveSlashes(encodeBase64(u8_seed2)) - }; - }; - Team.deriveGuestKeys = function(seed2) { - return u8_deriveGuestKeys(decodeBase64(Crypto.b64AddSlashes(seed2))); - }; - Team.createSeed = function() { - return Crypto.b64AddSlashes(encodeBase64(Nacl.randomBytes(18))); - }; - Team.deriveMemberKeys = function(seed1, myKeys) { - var u8_seed1; - try { - u8_seed1 = decodeBase64(Crypto.b64AddSlashes(seed1)); - if (u8_seed1.length < 18) { - throw new Error("INVALID_SEED"); - } - } catch (err) { - throw err; - } - if (!team_validate_own_keys(myKeys)) { - throw new Error("INVALID_OWN_KEYS"); - } - var stretched = u8_stretch(u8_seed1); - var teamEd = Nacl.sign.keyPair.fromSeed(stretched[0]); - var guestKeys = u8_deriveGuestKeys(stretched[1]); - return merge({ - myCurvePublic: myKeys.curvePublic, - myCurvePrivate: myKeys.curvePrivate, - teamEdPrivate: encodeBase64(teamEd.secretKey), - teamEdPublic: encodeBase64(teamEd.publicKey) - }, guestKeys); - }; - Team.createEncryptor = function(keys) { - var u8_keys = {}; - Object.keys(team_key_map).forEach((function(k) { - if (!keys[k]) { - return; - } - try { - u8_keys[team_key_map[k]] = decodeBase64(keys[k]); - } catch (err) { - console.log(k); - throw new Error("INVALID_KEY_SUPPLIED"); - } - })); - var out = {}; - if (team_can_encrypt(u8_keys)) { - out.encrypt = function(plain) { - try { - return encryptForTeam(plain, u8_keys); - } catch (e) { - console.error(e); - return null; - } - }; - } - if (team_can_decrypt(u8_keys)) { - out.decrypt = function(cipher, skipValidation) { - try { - return decryptForTeam(cipher, u8_keys, skipValidation); - } catch (e) { - console.error(e); - return null; - } - }; - } - if (Object.keys(out).length === 0) { - throw new Error("INVALID_TEAM_CONFIGURATION"); - } - return out; - }; - return Crypto; - }; - if (module.exports) { - module.exports = factory(requireNaclFast()); - } else { - window.chainpad_crypto = factory(window.nacl); - } - })(); - })(crypto); - return crypto.exports; - } - var cryptoExports = requireCrypto(); - var networkConfig$1 = { - exports: {} - }; - var hasRequiredNetworkConfig; - function requireNetworkConfig() { - if (hasRequiredNetworkConfig) return networkConfig$1.exports; - hasRequiredNetworkConfig = 1; - (function(module) { - (() => { - const factory = (ApiConfig = {}) => { - var Config = {}; - Config.setCustomize = data => { - ApiConfig = data.ApiConfig; - }; - Config.getWebsocketURL = function(origin) { - var path = ApiConfig.websocketPath || "/cryptpad_websocket"; - if (/^ws{1,2}:\/\//.test(path)) { - return path; - } - var l = new URL(origin || self?.location?.href); - if (origin) { - l.href = origin; - } - var protocol = l.protocol.replace(/http/, "ws"); - var host = l.host; - var url = protocol + "//" + host + path; - return url; - }; - return Config; - }; - if (module.exports) { - module.exports = factory(); - } - })(); - })(networkConfig$1); - return networkConfig$1.exports; - } - var networkConfigExports = requireNetworkConfig(); - var networkConfig = getDefaultExportFromCjs(networkConfigExports); - var NetworkConfig = _mergeNamespaces({ - __proto__: null, - default: networkConfig - }, [ networkConfigExports ]); - var commonConstants$1 = { - exports: {} - }; - var hasRequiredCommonConstants; - function requireCommonConstants() { - if (hasRequiredCommonConstants) return commonConstants$1.exports; - hasRequiredCommonConstants = 1; - (function(module) { - (() => { - const factory = function(AppConfig = {}) { - return { - setCustomize: data => { - AppConfig = data.AppConfig; - }, - userHashKey: "User_hash", - userNameKey: "User_name", - blockHashKey: "Block_hash", - fileHashKey: "FS_hash", - sessionJWT: "Session_JWT", - ssoSeed: "SSO_seed", - displayNameKey: "cryptpad.username", - oldStorageKey: "CryptPad_RECENTPADS", - storageKey: "filesData", - tokenKey: "loginToken", - prefersDriveRedirectKey: "prefersDriveRedirect", - isPremiumKey: "isPremiumUser", - displayPadCreationScreen: "displayPadCreationScreen", - deprecatedKey: "deprecated", - MAX_TEAMS_SLOTS: AppConfig.maxTeamsSlots || 5, - MAX_TEAMS_OWNED: AppConfig.maxOwnedTeams || 5, - MAX_PREMIUM_TEAMS_SLOTS: Math.max(AppConfig.maxTeamsSlots || 0, AppConfig.maxPremiumTeamsSlots || 0) || 5, - MAX_PREMIUM_TEAMS_OWNED: Math.max(AppConfig.maxOwnedTeams || 0, AppConfig.maxPremiumTeamsOwned || 0) || 5, - criticalApps: [ "profile", "settings", "debug", "admin", "support", "notifications", "calendar", "moderation", "oldadmin" ], - earlyAccessApps: [] - }; - }; - if (module.exports) { - module.exports = factory(undefined); - } - })(); - })(commonConstants$1); - return commonConstants$1.exports; - } - var commonConstantsExports = requireCommonConstants(); - var commonConstants = getDefaultExportFromCjs(commonConstantsExports); - var Constants = _mergeNamespaces({ - __proto__: null, - default: commonConstants - }, [ commonConstantsExports ]); - var commonHash = { - exports: {} - }; - var commonUtil$1 = { - exports: {} - }; - var commonUtil = commonUtil$1.exports; - var hasRequiredCommonUtil; - function requireCommonUtil() { - if (hasRequiredCommonUtil) return commonUtil$1.exports; - hasRequiredCommonUtil = 1; - (function(module) { - (function(window) { - var Util = {}; - window.atob = window.atob || function(str) { - return Buffer.from(str, "base64").toString("binary"); - }; - window.btoa = window.btoa || function(str) { - return Buffer.from(str, "binary").toString("base64"); - }; - Util.slice = function(A, start, end) { - return Array.prototype.slice.call(A, start, end); - }; - Util.u8ToBase64 = (u8, cb) => { - const reader = new FileReader; - reader.onload = () => { - let res = reader.result; - let trim = res.slice(res.indexOf(",") + 1); - cb(trim); - }; - reader.readAsDataURL(new Blob([ u8 ])); - }; - Util.shuffleArray = function(a) { - for (var i = a.length - 1; i > 0; i--) { - var j = Math.floor(Math.random() * (i + 1)); - var tmp = a[i]; - a[i] = a[j]; - a[j] = tmp; - } - }; - Util.bake = function(f, args) { - if (typeof args === "undefined") { - args = []; - } - if (!Array.isArray(args)) { - args = [ args ]; - } - return function() { - return f.apply(null, args); - }; - }; - Util.both = function(pre, post) { - if (typeof pre !== "function") { - throw new Error("INVALID_USAGE"); - } - if (typeof post !== "function") { - post = function(x) { - return x; - }; - } - return function() { - pre.apply(null, arguments); - return post.apply(null, arguments); - }; - }; - Util.clone = function(o) { - if (o === undefined || o === null) { - return o; - } - return JSON.parse(JSON.stringify(o)); - }; - Util.serializeError = function(err) { - if (!(err instanceof Error)) { - return err; - } - var ser = {}; - Object.getOwnPropertyNames(err).forEach((function(key) { - ser[key] = err[key]; - })); - return ser; - }; - Util.tryParse = function(s) { - try { - return JSON.parse(s); - } catch (e) { - return; - } - }; - Util.mkAsync = function(f, ms) { - if (typeof f !== "function") { - throw new Error("EXPECTED_FUNCTION"); - } - return function() { - var args = Array.prototype.slice.call(arguments); - setTimeout((function() { - f.apply(null, args); - }), ms); - }; - }; - Util.mkEvent = function(once) { - var handlers = []; - var fired = false; - let promiseResolve; - const promise = new Promise((resolve => { - promiseResolve = resolve; - })); - return { - reg: function(cb) { - if (once && fired) { - return void setTimeout(cb); - } - handlers.push(cb); - }, - unreg: function(cb) { - if (handlers.indexOf(cb) === -1) { - return void console.log("event handler was already unregistered"); - } - handlers.splice(handlers.indexOf(cb), 1); - }, - fire: function() { - if (once && fired) { - return; - } - var args = Array.prototype.slice.call(arguments); - if (!fired) { - promiseResolve.apply(null, args); - } - fired = true; - handlers.forEach((function(h) { - h.apply(null, args); - })); - }, - promise - }; - }; - Util.mkTimeout = function(_f, ms) { - ms = ms || 0; - var f = Util.once(_f); - var timeout = setTimeout((function() { - f("TIMEOUT"); - }), ms); - return Util.both(f, (function() { - clearTimeout(timeout); - })); - }; - Util.onClickEnter = function($element, handler, cfg) { - $element.on("click keydown", (function(e) { - var isClick = e.type === "click"; - var isEnter = e.type === "keydown" && e.which === 13; - var isSpace = e.type === "keydown" && e.which === 32 && cfg && cfg.space; - if (!isClick && !isEnter && !isSpace) { - return; - } - if (e.type === "keydown") { - e.preventDefault(); - } - handler(e); - })); - }; - Util.response = function(errorHandler) { - var pending = {}; - var timeouts = {}; - if (typeof errorHandler !== "function") { - errorHandler = function(label) { - throw new Error(label); - }; - } - var clear = function(id) { - clearTimeout(timeouts[id]); - delete timeouts[id]; - delete pending[id]; - }; - var expect = function(id, fn, ms) { - if (typeof id !== "string") { - errorHandler("EXPECTED_STRING"); - } - if (typeof fn !== "function") { - errorHandler("EXPECTED_CALLBACK"); - } - pending[id] = fn; - if (typeof ms === "number" && ms) { - timeouts[id] = setTimeout((function() { - if (typeof pending[id] === "function") { - pending[id]("TIMEOUT"); - } - clear(id); - }), ms); - } - }; - var handle = function(id, args) { - var fn = pending[id]; - if (typeof fn !== "function") { - return void errorHandler("MISSING_CALLBACK", { - id, - args - }); - } - try { - fn.apply(null, Array.isArray(args) ? args : [ args ]); - } catch (err) { - errorHandler("HANDLER_ERROR", { - error: err, - id, - args - }); - } - clear(id); - }; - return { - clear, - expected: function(id) { - return Boolean(pending[id]); - }, - expectation: function(id) { - return pending[id]; - }, - expect, - handle, - _pending: pending - }; - }; - Util.inc = function(map, key, val) { - map[key] = (map[key] || 0) + (typeof val === "number" ? val : 1); - }; - Util.values = function(obj) { - return Object.keys(obj).map((function(k) { - return obj[k]; - })); - }; - Util.find = function(map, path) { - var l = path.length; - for (var i = 0; i < l; i++) { - if (typeof map[path[i]] === "undefined") { - return; - } - map = map[path[i]]; - } - return map; - }; - Util.uid = function() { - return Number(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)).toString(32).replace(/\./g, ""); - }; - Util.guid = function(map) { - var id = Util.uid(); - if (typeof map[id] === "undefined") { - return id; - } - return Util.guid(map); - }; - Util.fixHTML = function(str) { - if (!str) { - return ""; - } - return str.replace(/[<>&"']/g, (function(x) { - return { - "<": "<", - ">": ">", - "&": "&", - '"': """, - "'": "'" - }[x]; - })); - }; - Util.hexToBase64 = function(hex) { - var hexArray = hex.replace(/\r|\n/g, "").replace(/([\da-fA-F]{2}) ?/g, "0x$1 ").replace(/ +$/, "").split(" "); - var byteString = String.fromCharCode.apply(null, hexArray); - return window.btoa(byteString).replace(/\//g, "-").replace(/=+$/, ""); - }; - Util.base64ToHex = function(b64String) { - var hexArray = []; - window.atob(b64String.replace(/-/g, "/")).split("").forEach((function(e) { - var h = e.charCodeAt(0).toString(16); - if (h.length === 1) { - h = "0" + h; - } - hexArray.push(h); - })); - return hexArray.join(""); - }; - Util.uint8ArrayToHex = function(bytes) { - var hexString = ""; - for (var i = 0; i < bytes.length; i++) { - if (bytes[i] < 16) { - hexString += "0"; - } - hexString += bytes[i].toString(16); - } - return hexString; - }; - Util.hexToUint8Array = function(hexString) { - var bytes = new Uint8Array(Math.ceil(hexString.length / 2)); - for (var i = 0; i < bytes.length; i++) { - bytes[i] = parseInt(hexString.substr(i * 2, 2), 16); - } - return bytes; - }; - Util.uint8ArrayJoin = function(AA) { - var l = 0; - var i = 0; - for (;i < AA.length; i++) { - l += AA[i].length; - } - var C = new Uint8Array(l); - i = 0; - for (var offset = 0; i < AA.length; i++) { - C.set(AA[i], offset); - offset += AA[i].length; - } - return C; - }; - Util.escapeKeyCharacters = function(key) { - return key && key.replace && key.replace(/\//g, "-"); - }; - Util.unescapeKeyCharacters = function(key) { - return key.replace(/\-/g, "/"); - }; - Util.deduplicateString = function(array) { - var a = array.slice(); - for (var i = 0; i < a.length; i++) { - for (var j = i + 1; j < a.length; j++) { - if (a[i] === a[j]) { - a.splice(j--, 1); - } - } - } - return a; - }; - Util.fixFileName = function(filename) { - return filename.replace(/ /g, "-").replace(/[\/\?]/g, "_").replace(/_+/g, "_"); - }; - var oneKilobyte = 1024; - var oneMegabyte = 1024 * oneKilobyte; - var oneGigabyte = 1024 * oneMegabyte; - Util.bytesToGigabytes = function(bytes) { - return Math.ceil(bytes / oneGigabyte * 100) / 100; - }; - Util.bytesToMegabytes = function(bytes) { - return Math.ceil(bytes / oneMegabyte * 100) / 100; - }; - Util.bytesToKilobytes = function(bytes) { - return Math.ceil(bytes / oneKilobyte * 100) / 100; - }; - Util.magnitudeOfBytes = function(bytes) { - if (bytes >= oneGigabyte) { - return "GB"; - } else if (bytes >= oneMegabyte) { - return "MB"; - } else { - return "KB"; - } - }; - var getCacheKey = function(src) { - var _src = src.replace(/(\/)*$/, ""); - var idx = _src.lastIndexOf("/"); - var cacheKey = _src.slice(idx + 1); - if (!/^[a-f0-9]{48}$/.test(cacheKey)) { - cacheKey = undefined; - } - return cacheKey; - }; - Util.getBlock = function(src, opt, cb) { - var CB = Util.once(Util.mkAsync(cb)); - var headers = {}; - if (typeof opt.bearer === "string" && opt.bearer) { - headers.authorization = `Bearer ${opt.bearer}`; - } - fetch(src, { - method: "GET", - credentials: "include", - headers - }).then((response => { - if (response.ok) { - return void CB(void 0, response); - } - if (response.status === 401 || response.status === 404) { - response.json().then((data => { - CB(response.status, data); - })).catch((() => { - CB(response.status); - })); - return; - } - CB(response.status, response); - })).catch((error => { - CB(error); - })); - }; - Util.fetchApi = function(origin, type, ignoreCache, cb) { - const url = new URL(origin); - url.pathname = `api/${type}`; - let href = url.href + (ignoreCache ? "?" + +new Date : ""); - if (typeof self !== "undefined" && self.crypto) { - fetch(href).then((res => { - if (!res.ok) { - throw new Error(`Fetch error: ${res.status}`); - } - return res.text(); - })).then((body => { - cb(JSON.parse(body.slice(27, -5))); - })).catch((err => { - console.error(err.message); - cb({}); - })); - } else if (typeof commonjsRequire !== "undefined") { - const H = url.protocol === "http:" ? require("node:http") : require("node:https"); - H.get(url.href, (res => { - let body = ""; - res.on("data", (data => { - body += data; - })); - res.on("end", (() => { - try { - cb(JSON.parse(body.slice(27, -5))); - } catch (e) { - console.error(e); - cb({}); - } - })); - })); - } - }; - Util.fetch = function(src, cb, progress, cache) { - var CB = Util.once(Util.mkAsync(cb)); - var cacheKey = getCacheKey(src); - var getBlobCache = function(id, cb) { - if (!cache || typeof cache.getBlobCache !== "function") { - return void cb("EINVAL"); - } - cache.getBlobCache(id, cb); - }; - var setBlobCache = function(id, u8, cb) { - if (!cache || typeof cache.setBlobCache !== "function") { - return void cb("EINVAL"); - } - cache.setBlobCache(id, u8, cb); - }; - var xhr; - var fetch = function() { - xhr = new XMLHttpRequest; - xhr.open("GET", src, true); - if (progress) { - xhr.addEventListener("progress", (function(evt) { - if (evt.lengthComputable) { - var percentComplete = evt.loaded / evt.total; - progress(percentComplete); - } - }), false); - } - xhr.responseType = "arraybuffer"; - xhr.onerror = function(err) { - CB(err); - }; - xhr.onload = function() { - if (/^4/.test("" + this.status)) { - return CB("XHR_ERROR"); - } - var arrayBuffer = xhr.response; - if (arrayBuffer) { - var u8 = new Uint8Array(arrayBuffer); - if (cacheKey) { - return void setBlobCache(cacheKey, u8, (function() { - CB(null, u8); - })); - } - return void CB(void 0, u8); - } - CB("ENOENT"); - }; - xhr.send(null); - }; - if (!cacheKey) { - return void fetch(); - } - getBlobCache(cacheKey, (function(err, u8) { - if (err || !u8) { - return void fetch(); - } - CB(void 0, u8); - })); - return { - cancel: function() { - if (xhr && xhr.abort) { - xhr.abort(); - } - } - }; - }; - Util.dataURIToBlob = function(dataURI) { - var byteString = atob(dataURI.split(",")[1]); - var mimeString = dataURI.split(",")[0].split(":")[1].split(";")[0]; - var ab = new ArrayBuffer(byteString.length); - var ia = new Uint8Array(ab); - for (var i = 0; i < byteString.length; i++) { - ia[i] = byteString.charCodeAt(i); - } - var bb = new Blob([ ab ], { - type: mimeString - }); - return bb; - }; - Util.throttle = function(f, ms) { - var last = 0; - var to; - var args; - var defer = function(delay) { - to = setTimeout((function() { - to = undefined; - var now = +new Date; - var diff = now - last; - if (diff < ms) { - return void defer(ms - diff); - } - f.apply(null, args); - }), delay); - }; - var g = function() { - last = +new Date; - args = Util.slice(arguments); - if (to) { - return; - } - defer(ms); - }; - g.clear = function() { - clearTimeout(to); - to = undefined; - }; - return g; - }; - Util.notAgainForAnother = function(f, t) { - if (typeof f !== "function" || typeof t !== "number") { - throw new Error("invalid inputs"); - } - var last = null; - return function() { - var now = +new Date; - if (last && now <= last + t) { - return t - (now - last); - } - last = now; - f.apply(null, Util.slice(arguments)); - return null; - }; - }; - Util.createRandomInteger = function() { - return Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); - }; - Util.noop = function() {}; - Util.once = function(f, g) { - return function() { - if (!f) { - return; - } - f.apply(this, Array.prototype.slice.call(arguments)); - f = g; - }; - }; - Util.blobToImage = function(blob, cb) { - var reader = new FileReader; - reader.onloadend = function() { - cb(reader.result); - }; - reader.readAsDataURL(blob); - }; - Util.blobURLToImage = function(url, cb) { - var xhr = new XMLHttpRequest; - xhr.onload = function() { - var reader = new FileReader; - reader.onloadend = function() { - cb(reader.result); - }; - reader.readAsDataURL(xhr.response); - }; - xhr.open("GET", url); - xhr.responseType = "blob"; - xhr.send(); - }; - Util.isObject = function(o) { - return typeof o === "object" && Object.prototype.toString.call(o) === "[object Object]"; - }; - Util.isCircular = function(o) { - try { - JSON.stringify(o); - return false; - } catch (e) { - return true; - } - }; - Util.extend = function(a, b) { - if (!Util.isObject(a) || !Util.isObject(b)) { - return void console.log("Extend only works with 2 objects"); - } - if (Util.isCircular(b)) { - return void console.log("Extend doesn't accept circular objects"); - } - for (var k in b) { - if (Util.isObject(b[k])) { - a[k] = Util.isObject(a[k]) ? a[k] : {}; - Util.extend(a[k], b[k]); - continue; - } - if (Array.isArray(b[k])) { - a[k] = b[k].slice(); - continue; - } - a[k] = b[k]; - } - }; - Util.isChecked = function(el) { - if (!el) { - return false; - } - if (typeof el.tagName !== "undefined") { - return Boolean(el.checked); - } - if (typeof el.prop === "function") { - return Boolean(el.prop("checked")); - } - return false; - }; - Util.hexToRGB = function(hex) { - var h = hex.replace(/^#/, ""); - return [ parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16) ]; - }; - Util.rgbToHex = function(rgb) { - return `#${rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/).slice(1).map((n => parseInt(n, 10).toString(16).padStart(2, "0"))).join("")}`; - }; - Util.isSmallScreen = function() { - return window.innerHeight < 800 || window.innerWidth < 800; - }; - Util.stripTags = function(text) { - var div = document.createElement("div"); - div.innerHTML = text; - return div.innerText; - }; - Util.parseFilename = function(filename) { - if (!filename || !filename.trim()) { - return {}; - } - var parsedName = /^(\.?.+?)(\.[^.]+)?$/.exec(filename) || []; - return { - name: parsedName[1], - ext: parsedName[2] - }; - }; - Util.isPlainTextFile = function(type, name) { - if (type && type.indexOf("text/") === 0) { - return true; - } - var parsedName = Util.parseFilename(name); - if (!type && name && !parsedName.ext) { - return true; - } - if (type === "application/x-javascript") { - return true; - } - if (type === "application/xml") { - return true; - } - return false; - }; - Util.isSpreadsheet = function(type, name) { - return type && (type === "application/vnd.oasis.opendocument.spreadsheet" || type === "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") || name && (name.endsWith(".xlsx") || name.endsWith(".ods")); - }; - Util.isOfficeDoc = function(type, name) { - return type && (type === "application/vnd.oasis.opendocument.text" || type === "application/vnd.openxmlformats-officedocument.wordprocessingml.document") || name && (name.endsWith(".docx") || name.endsWith(".odt")); - }; - Util.isPresentation = function(type, name) { - return type && (type === "application/vnd.oasis.opendocument.presentation" || type === "application/vnd.openxmlformats-officedocument.presentationml.presentation") || name && (name.endsWith(".pptx") || name.endsWith(".odp")); - }; - Util.isValidURL = function(str) { - var pattern = new RegExp("^(https?:\\/\\/)" + "((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|" + "((\\d{1,3}\\.){3}\\d{1,3}))" + "(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*" + "(\\?[;&a-z\\d%_.~+=-]*)?"); - return !!pattern.test(str); - }; - var emoji_patt = /([\uD800-\uDBFF][\uDC00-\uDFFF])/; - var isEmoji = function(str) { - return emoji_patt.test(str); - }; - var emojiStringToArray = function(str) { - var split = str.split(emoji_patt); - var arr = []; - for (var i = 0; i < split.length; i++) { - var char = split[i]; - if (char !== "") { - arr.push(char); - } - } - return arr; - }; - Util.getFirstCharacter = function(str) { - if (!str || !str.trim()) { - return "?"; - } - var emojis = emojiStringToArray(str); - return isEmoji(emojis[0]) ? emojis[0] : str[0]; - }; - Util.getRandomColor = function(light) { - var getColor = function() { - if (light) { - return Math.floor(Math.random() * 156) + 70; - } - return Math.floor(Math.random() * 200) + 25; - }; - return "#" + getColor().toString(16) + getColor().toString(16) + getColor().toString(16); - }; - Util.checkRestrictedApp = function(app, AppConfig, earlyTypes, plan, loggedIn) { - if (Array.isArray(earlyTypes) && earlyTypes.includes(app) && !AppConfig.enableEarlyAccess) { - return -2; - } - var premiumTypes = AppConfig.premiumTypes; - if (!Array.isArray(premiumTypes) || !premiumTypes.includes(app)) { - return 2; - } - if (!loggedIn) { - return -1; - } - return plan ? 1 : 0; - }; - var supportsSharedArrayBuffers = function() { - try { - return Object.prototype.toString.call(new window.WebAssembly.Memory({ - shared: true, - initial: 0, - maximum: 0 - }).buffer) === "[object SharedArrayBuffer]"; - } catch (err) { - console.error(err); - } - return false; - }; - Util.supportsWasm = function() { - return !(typeof Atomics === "undefined" || !supportsSharedArrayBuffers() || typeof WebAssembly === "undefined"); - }; - Util.getKeysArray = function(length) { - return [ ...Array(length).keys() ]; - }; - Util.getVersionFromUrlArgs = urlArgs => { - let arr = /ver=([0-9.]+)(-[0-9]*)?/.exec(urlArgs); - let ver = Array.isArray(arr) && arr[1]; - return ver || undefined; - }; - Util.Saferphore = { - create: resourceCount => { - var queue = []; - var check; - var mkRa = function() { - var outerCalled = 0; - return function(func) { - if (outerCalled++) { - throw new Error("returnAfter() called multiple times"); - } - var called = 0; - return function() { - if (called++) { - throw new Error("returnAfter wrapped callback called multiple times"); - } - if (func) { - func.apply(null, arguments); - } - resourceCount++; - check(); - }; - }; - }; - check = function() { - if (resourceCount < 0) { - throw new Error("(resourceCount < 0) should never happen"); - } - if (resourceCount === 0 || queue.length === 0) { - return; - } - resourceCount--; - queue.shift()(mkRa()); - }; - return { - take: function(func) { - queue.push(func); - check(); - } - }; - } - }; - if (module.exports) { - module.exports = Util; - } else { - window.CryptPad_Util = Util; - } - })(typeof self !== "undefined" ? self : commonUtil); - })(commonUtil$1); - return commonUtil$1.exports; - } - var commonSigningKeys = { - exports: {} - }; - var hasRequiredCommonSigningKeys; - function requireCommonSigningKeys() { - if (hasRequiredCommonSigningKeys) return commonSigningKeys.exports; - hasRequiredCommonSigningKeys = 1; - (function(module) { - (function() { - var factory = function() { - var Keys = {}; - var unescape = function(s) { - return s.replace(/-/g, "/"); - }; - var parseNewUser = function(userString) { - if (!/^\[.*?@.*\]$/.test(userString)) { - return; - } - var temp = userString.slice(1, -1); - var domain, username, pubkey; - temp = temp.replace(/\/([a-zA-Z0-9+-]{43}=)$/, (function(all, k) { - pubkey = unescape(k); - return ""; - })); - if (!pubkey) { - return; - } - var index = temp.lastIndexOf("@"); - if (index < 1) { - return; - } - domain = temp.slice(index + 1); - username = temp.slice(0, index); - return { - domain, - user: username, - pubkey - }; - }; - var isValidUser = function(parsed) { - if (!parsed) { - return; - } - if (!(parsed.domain && parsed.user && parsed.pubkey)) { - return; - } - return true; - }; - Keys.parseUser = function(user) { - var parsed = parseNewUser(user); - if (isValidUser(parsed)) { - return parsed; - } - var domain, username, pubkey; - user.replace(/^https*:\/\/([^\/]+)\/user\/#\/1\/([^\/]+)\/([a-zA-Z0-9+-]{43}=)$/, (function(a, d, u, k) { - domain = d; - username = u; - pubkey = unescape(k); - return ""; - })); - if (!domain) { - throw new Error("Could not parse user id [" + user + "]"); - } - return { - domain, - user: username, - pubkey - }; - }; - Keys.serialize = function(origin, username, pubkey) { - return "[" + username + "@" + origin.replace(/https*:\/\//, "") + "/" + pubkey.replace(/\//g, "-") + "]"; - }; - Keys.canonicalize = function(input) { - if (typeof input !== "string") { - return; - } - if (input.length === 44) { - return unescape(input); - } - try { - return Keys.parseUser(input).pubkey; - } catch (err) { - return; - } - }; - return Keys; - }; - if (module.exports) { - module.exports = factory(); - } - })(); - })(commonSigningKeys); - return commonSigningKeys.exports; - } - var hasRequiredCommonHash; - function requireCommonHash() { - if (hasRequiredCommonHash) return commonHash.exports; - hasRequiredCommonHash = 1; - (function(module) { - (function(window) { - var factory = function(Util, Crypto, Keys, Nacl) { - var Hash = window.CryptPad_Hash = {}; - var uint8ArrayToHex = Util.uint8ArrayToHex; - var hexToBase64 = Util.hexToBase64; - var base64ToHex = Util.base64ToHex; - Hash.encodeBase64 = Nacl.util.encodeBase64; - Hash.decodeBase64 = Nacl.util.decodeBase64; - Hash.hashChannelList = function(list) { - return Nacl.util.encodeBase64(Nacl.hash(Nacl.util.decodeUTF8(JSON.stringify(list)))); - }; - Hash.generateSignPair = function() { - var ed = Nacl.sign.keyPair(); - var makeSafe = function(key) { - return Crypto.b64RemoveSlashes(key).replace(/=+$/g, ""); - }; - return { - validateKey: Hash.encodeBase64(ed.publicKey), - signKey: Hash.encodeBase64(ed.secretKey), - safeValidateKey: makeSafe(Hash.encodeBase64(ed.publicKey)), - safeSignKey: makeSafe(Hash.encodeBase64(ed.secretKey)) - }; - }; - Hash.getSignPublicFromPrivate = function(edPrivateSafeStr) { - var edPrivateStr = Crypto.b64AddSlashes(edPrivateSafeStr); - var privateKey = Nacl.util.decodeBase64(edPrivateStr); - var keyPair = Nacl.sign.keyPair.fromSecretKey(privateKey); - return Nacl.util.encodeBase64(keyPair.publicKey); - }; - Hash.getCurvePublicFromPrivate = function(curvePrivateSafeStr) { - var curvePrivateStr = Crypto.b64AddSlashes(curvePrivateSafeStr); - var privateKey = Nacl.util.decodeBase64(curvePrivateStr); - var keyPair = Nacl.box.keyPair.fromSecretKey(privateKey); - return Nacl.util.encodeBase64(keyPair.publicKey); - }; - var getEditHashFromKeys = Hash.getEditHashFromKeys = function(secret) { - var version = secret.version; - var data = secret.keys; - if (version === 0) { - return secret.channel + secret.key; - } - if (version === 1) { - if (!data.editKeyStr) { - return; - } - return "/1/edit/" + hexToBase64(secret.channel) + "/" + Crypto.b64RemoveSlashes(data.editKeyStr) + "/"; - } - if (version === 2) { - if (!data.editKeyStr) { - return; - } - var pass = secret.password ? "p/" : ""; - return "/2/" + secret.type + "/edit/" + Crypto.b64RemoveSlashes(data.editKeyStr) + "/" + pass; - } - }; - var getViewHashFromKeys = Hash.getViewHashFromKeys = function(secret) { - var version = secret.version; - var data = secret.keys; - if (version === 0) { - return; - } - if (version === 1) { - if (!data.viewKeyStr) { - return; - } - return "/1/view/" + hexToBase64(secret.channel) + "/" + Crypto.b64RemoveSlashes(data.viewKeyStr) + "/"; - } - if (version === 2) { - if (!data.viewKeyStr) { - return; - } - var pass = secret.password ? "p/" : ""; - return "/2/" + secret.type + "/view/" + Crypto.b64RemoveSlashes(data.viewKeyStr) + "/" + pass; - } - }; - Hash.getHiddenHashFromKeys = function(type, secret, opts) { - opts = opts || {}; - var canEdit = secret.keys && secret.keys.editKeyStr || secret.key; - var mode = !opts.view && canEdit ? "edit/" : "view/"; - var pass = secret.password ? "p/" : ""; - if (secret.keys && secret.keys.fileKeyStr) { - mode = ""; - } - var hash = "/3/" + type + "/" + mode + secret.channel + "/" + pass; - var hashData = Hash.parseTypeHash(type, hash); - if (hashData && hashData.getHash) { - return hashData.getHash(opts || {}); - } - return hash; - }; - var getFileHashFromKeys = Hash.getFileHashFromKeys = function(secret) { - var version = secret.version; - var data = secret.keys; - if (version === 0) { - return; - } - if (version === 1) { - return "/1/" + hexToBase64(secret.channel) + "/" + Crypto.b64RemoveSlashes(data.fileKeyStr) + "/"; - } - if (version === 2) { - if (!data.fileKeyStr) { - return; - } - var pass = secret.password ? "p/" : ""; - return "/2/" + secret.type + "/" + Crypto.b64RemoveSlashes(data.fileKeyStr) + "/" + pass; - } - }; - Hash.getPublicSigningKeyString = Keys.serialize; - var fixDuplicateSlashes = function(s) { - return s.replace(/\/+/g, "/"); - }; - Hash.ephemeralChannelLength = 34; - Hash.createChannelId = function(ephemeral) { - var id = uint8ArrayToHex(Crypto.Nacl.randomBytes(ephemeral ? 17 : 16)); - if ([ 32, 34 ].indexOf(id.length) === -1 || /[^a-f0-9]/.test(id)) { - throw new Error("channel ids must consist of 32 hex characters"); - } - return id; - }; - Hash.getChannelIdFromKey = function(publicKey) { - if (!publicKey) { - return; - } - return uint8ArrayToHex(Hash.decodeBase64(publicKey).subarray(0, 16)); - }; - Hash.getBoxPublicFromSecret = function(priv) { - if (!priv) { - return; - } - var u8_priv = Hash.decodeBase64(priv); - var pair = Nacl.box.keyPair.fromSecretKey(u8_priv); - return Hash.encodeBase64(pair.publicKey); - }; - Hash.checkBoxKeyPair = function(priv, pub) { - if (!pub || !priv) { - return false; - } - var u8_priv = Hash.decodeBase64(priv); - var pair = Nacl.box.keyPair.fromSecretKey(u8_priv); - return pub === Hash.encodeBase64(pair.publicKey); - }; - Hash.createRandomHash = function(type, password) { - var cryptor; - if (type === "file") { - cryptor = Crypto.createFileCryptor2(void 0, password); - return getFileHashFromKeys({ - password: Boolean(password), - version: 2, - type, - keys: cryptor - }); - } - cryptor = Crypto.createEditCryptor2(void 0, void 0, password); - return getEditHashFromKeys({ - password: Boolean(password), - version: 2, - type, - keys: cryptor - }); - }; - var getLoginOpts = function(hashArr) { - var k; - hashArr.some((function(data) { - if (/^login=/.test(data)) { - k = data.slice(6); - return true; - } - })); - return k || ""; - }; - var getNewPadOpts = function(hashArr) { - var k; - hashArr.some((function(data) { - if (/^newpad=/.test(data)) { - k = data.slice(7); - return true; - } - })); - return k || ""; - }; - var getVersionHash = function(hashArr) { - var k; - hashArr.some((function(data) { - if (/^hash=/.test(data)) { - k = data.slice(5); - return true; - } - })); - return k ? Crypto.b64AddSlashes(k) : ""; - }; - var getAuditorKey = function(hashArr) { - var k; - hashArr.some((function(data) { - if (/^auditor=/.test(data)) { - k = data.slice(8); - return true; - } - })); - return k ? Crypto.b64AddSlashes(k) : ""; - }; - var getOwnerKey = function(hashArr) { - var k; - hashArr.some((function(data) { - if (data.length === 86) { - k = data; - return true; - } - })); - return k; - }; - var parseTypeHash = Hash.parseTypeHash = function(type, hash) { - if (!hash) { - return; - } - var options = []; - var parsed = {}; - var hashArr = fixDuplicateSlashes(hash).split("/"); - var addOptions = function() { - parsed.password = options.indexOf("p") !== -1; - parsed.present = options.indexOf("present") !== -1; - parsed.embed = options.indexOf("embed") !== -1; - parsed.versionHash = getVersionHash(options); - parsed.auditorKey = getAuditorKey(options); - parsed.newPadOpts = getNewPadOpts(options); - parsed.loginOpts = getLoginOpts(options); - parsed.ownerKey = getOwnerKey(options); - }; - if (hashArr[1] && hashArr[1] === "4") { - parsed.getHash = function(opts) { - if (!opts || !Object.keys(opts).length) { - return ""; - } - var hash = "/4/" + type + "/"; - if (opts.newPadOpts) { - hash += "newpad=" + opts.newPadOpts + "/"; - } - if (opts.loginOpts) { - hash += "login=" + opts.loginOpts + "/"; - } - return hash; - }; - parsed.getOptions = function() { - var options = {}; - if (parsed.newPadOpts) { - options.newPadOpts = parsed.newPadOpts; - } - if (parsed.loginOpts) { - options.loginOpts = parsed.loginOpts; - } - return options; - }; - parsed.version = 4; - parsed.app = hashArr[2]; - options = hashArr.slice(3); - addOptions(); - return parsed; - } - if ([ "media", "file", "user", "invite" ].indexOf(type) === -1) { - parsed.type = "pad"; - parsed.getHash = function() { - return hash; - }; - parsed.getOptions = function() { - return { - embed: parsed.embed, - present: parsed.present, - ownerKey: parsed.ownerKey, - versionHash: parsed.versionHash, - auditorKey: parsed.auditorKey, - newPadOpts: parsed.newPadOpts, - loginOpts: parsed.loginOpts, - password: parsed.password - }; - }; - if (hash.slice(0, 1) !== "/" && hash.length >= 56) { - parsed.channel = hash.slice(0, 32); - parsed.key = hash.slice(32, 56); - parsed.version = 0; - return parsed; - } - parsed.getHash = function(opts) { - var hash = hashArr.slice(0, 5).join("/") + "/"; - var owner = typeof opts.ownerKey !== "undefined" ? opts.ownerKey : parsed.ownerKey; - if (owner) { - hash += owner + "/"; - } - if (parsed.password || opts.password) { - hash += "p/"; - } - if (opts.embed) { - hash += "embed/"; - } - if (opts.present) { - hash += "present/"; - } - var versionHash = typeof opts.versionHash !== "undefined" ? opts.versionHash : parsed.versionHash; - if (versionHash) { - hash += "hash=" + Crypto.b64RemoveSlashes(versionHash) + "/"; - } - var auditorKey = typeof opts.auditorKey !== "undefined" ? opts.auditorKey : parsed.auditorKey; - if (auditorKey) { - hash += "auditor=" + Crypto.b64RemoveSlashes(auditorKey) + "/"; - } - if (opts.newPadOpts) { - hash += "newpad=" + opts.newPadOpts + "/"; - } - if (opts.loginOpts) { - hash += "login=" + opts.loginOpts + "/"; - } - return hash; - }; - if (hashArr[1] && hashArr[1] === "1") { - parsed.version = 1; - parsed.mode = hashArr[2]; - parsed.channel = hashArr[3]; - parsed.key = Crypto.b64AddSlashes(hashArr[4]); - options = hashArr.slice(5); - addOptions(); - return parsed; - } - if (hashArr[1] && hashArr[1] === "2") { - parsed.version = 2; - parsed.app = hashArr[2]; - parsed.mode = hashArr[3]; - parsed.key = hashArr[4]; - options = hashArr.slice(5); - addOptions(); - return parsed; - } - if (hashArr[1] && hashArr[1] === "3") { - parsed.version = 3; - parsed.app = hashArr[2]; - parsed.mode = hashArr[3]; - parsed.channel = hashArr[4]; - options = hashArr.slice(5); - addOptions(); - return parsed; - } - return parsed; - } - parsed.getHash = function() { - return hashArr.join("/"); - }; - if ([ "media", "file" ].indexOf(type) !== -1) { - parsed.type = "file"; - parsed.getOptions = function() { - return { - embed: parsed.embed, - present: parsed.present, - ownerKey: parsed.ownerKey, - newPadOpts: parsed.newPadOpts, - loginOpts: parsed.loginOpts, - password: parsed.password - }; - }; - parsed.getHash = function(opts) { - var hash = hashArr.slice(0, 4).join("/") + "/"; - var owner = typeof opts.ownerKey !== "undefined" ? opts.ownerKey : parsed.ownerKey; - if (owner) { - hash += owner + "/"; - } - if (parsed.password || opts.password) { - hash += "p/"; - } - if (opts.embed) { - hash += "embed/"; - } - if (opts.present) { - hash += "present/"; - } - if (opts.newPadOpts) { - hash += "newpad=" + opts.newPadOpts + "/"; - } - if (opts.loginOpts) { - hash += "login=" + opts.loginOpts + "/"; - } - return hash; - }; - if (hashArr[1] && hashArr[1] === "1") { - parsed.version = 1; - parsed.channel = hashArr[2].replace(/-/g, "/"); - parsed.key = hashArr[3].replace(/-/g, "/"); - options = hashArr.slice(4); - addOptions(); - return parsed; - } - if (hashArr[1] && hashArr[1] === "2") { - parsed.version = 2; - parsed.app = hashArr[2]; - parsed.key = hashArr[3]; - options = hashArr.slice(4); - addOptions(); - return parsed; - } - if (hashArr[1] && hashArr[1] === "3") { - parsed.version = 3; - parsed.app = hashArr[2]; - parsed.channel = hashArr[3]; - options = hashArr.slice(4); - addOptions(); - return parsed; - } - return parsed; - } - if ([ "user" ].indexOf(type) !== -1) { - parsed.type = "user"; - if (hashArr[1] && hashArr[1] === "1") { - parsed.version = 1; - parsed.user = hashArr[2]; - parsed.pubkey = hashArr[3].replace(/-/g, "/"); - return parsed; - } - return parsed; - } - if ([ "invite" ].indexOf(type) !== -1) { - parsed.type = "invite"; - if (hashArr[1] && hashArr[1] === "2") { - parsed.version = 2; - parsed.app = hashArr[2]; - parsed.mode = hashArr[3]; - parsed.key = hashArr[4]; - options = hashArr.slice(5); - parsed.password = options.indexOf("p") !== -1; - return parsed; - } - return parsed; - } - return; - }; - var parsePadUrl = Hash.parsePadUrl = function(href) { - var patt = /^https*:\/\/([^\/]*)\/(.*?)\//i; - var ret = {}; - if (!href) { - return ret; - } - if (href.slice(-1) !== "/" && href.slice(-1) !== "#") { - href += "/"; - } - href = href.replace(/\/\?[^#]+#/, "/#"); - var idx; - var getHash = function(opts) { - if (!opts || !Object.keys(opts).length) { - return ""; - } - var hash = "/4/" + ret.type + "/"; - if (opts.newPadOpts) { - hash += "newpad=" + opts.newPadOpts + "/"; - } - if (opts.loginOpts) { - hash += "login=" + opts.loginOpts + "/"; - } - return hash; - }; - ret.getUrl = function(options) { - options = options || {}; - var url = "/"; - if (!ret.type) { - return url; - } - url += ret.type + "/"; - if (!ret.hashData && options && Object.keys(options).length) { - return url + "#" + getHash(options); - } - if (!ret.hashData) { - return url; - } - var hash = ret.hashData.getHash(options); - url += "#" + hash; - return url; - }; - ret.getOptions = function() { - if (!ret.hashData || !ret.hashData.getOptions) { - return {}; - } - return ret.hashData.getOptions(); - }; - if (!/^https*:\/\//.test(href)) { - if (!/^\/($|[^\/])/.test(href)) { - return ret; - } - idx = href.indexOf("/#"); - ret.type = href.slice(1, idx); - if (idx === -1) { - return ret; - } - ret.hash = href.slice(idx + 2); - ret.hashData = parseTypeHash(ret.type, ret.hash); - return ret; - } - href.replace(patt, (function(a, domain, type) { - ret.domain = domain; - ret.type = type; - return ""; - })); - idx = href.indexOf("/#"); - if (idx === -1) { - return ret; - } - ret.hash = href.slice(idx + 2); - ret.hashData = parseTypeHash(ret.type, ret.hash); - return ret; - }; - Hash.hashToHref = function(hash, type) { - return "/" + type + "/#" + hash; - }; - Hash.hrefToHash = function(href) { - var parsed = Hash.parsePadUrl(href); - return parsed.hash; - }; - Hash.getRelativeHref = function(href) { - if (!href) { - return; - } - if (href.indexOf("#") === -1) { - return; - } - var parsed = parsePadUrl(href); - return "/" + parsed.type + "/#" + parsed.hash; - }; - Hash.getSecrets = function(type, secretHash, password) { - var secret = {}; - var generate = function() { - secret.keys = Crypto.createEditCryptor2(void 0, void 0, password); - secret.channel = base64ToHex(secret.keys.chanId); - secret.version = 2; - secret.type = type; - }; - if (!secretHash) { - generate(); - return secret; - } else { - var parsed; - var hash; - if (secretHash) { - if (!type) { - throw new Error("getSecrets with a hash requires a type parameter"); - } - parsed = parseTypeHash(type, secretHash); - hash = secretHash; - } - if (hash.length === 0) { - generate(); - return secret; - } - if (parsed.version === 0) { - secret.channel = parsed.channel; - secret.key = parsed.key; - secret.version = 0; - } else if (parsed.version === 1) { - secret.version = 1; - if (parsed.type === "pad") { - secret.channel = base64ToHex(parsed.channel); - if (parsed.mode === "edit") { - secret.keys = Crypto.createEditCryptor(parsed.key); - secret.key = secret.keys.editKeyStr; - if (secret.channel.length !== 32 || secret.key.length !== 24) { - throw new Error("The channel key and/or the encryption key is invalid"); - } - } else if (parsed.mode === "view") { - secret.keys = Crypto.createViewCryptor(parsed.key); - if (secret.channel.length !== 32) { - throw new Error("The channel key is invalid"); - } - } - } else if (parsed.type === "file") { - secret.channel = base64ToHex(parsed.channel); - secret.keys = { - fileKeyStr: parsed.key, - cryptKey: Nacl.util.decodeBase64(parsed.key) - }; - } else if (parsed.type === "user") { - throw new Error("User hashes can't be opened (yet)"); - } - } else if (parsed.version === 2) { - secret.version = 2; - secret.type = type; - secret.password = password; - if (parsed.type === "pad") { - if (parsed.mode === "edit") { - secret.keys = Crypto.createEditCryptor2(parsed.key, void 0, password); - secret.channel = base64ToHex(secret.keys.chanId); - secret.key = secret.keys.editKeyStr; - if (secret.channel.length !== 32 || secret.key.length !== 24) { - throw new Error("The channel key and/or the encryption key is invalid"); - } - } else if (parsed.mode === "view") { - secret.keys = Crypto.createViewCryptor2(parsed.key, password); - secret.channel = base64ToHex(secret.keys.chanId); - if (secret.channel.length !== 32) { - throw new Error("The channel key is invalid"); - } - } - } else if (parsed.type === "file") { - secret.keys = Crypto.createFileCryptor2(parsed.key, password); - secret.channel = base64ToHex(secret.keys.chanId); - secret.key = secret.keys.fileKeyStr; - if (secret.channel.length !== 48 || secret.key.length !== 24) { - throw new Error("The channel key and/or the encryption key is invalid"); - } - } else if (parsed.type === "user") { - throw new Error("User hashes can't be opened (yet)"); - } - } - } - return secret; - }; - Hash.getHashes = function(secret) { - var hashes = {}; - secret = JSON.parse(JSON.stringify(secret)); - if (!secret.keys && !secret.key) { - return hashes; - } else if (!secret.keys) { - secret.keys = {}; - } - if (secret.keys.editKeyStr || secret.version === 0 && secret.key) { - hashes.editHash = getEditHashFromKeys(secret); - } - if (secret.keys.viewKeyStr) { - hashes.viewHash = getViewHashFromKeys(secret); - } - if (secret.keys.fileKeyStr) { - hashes.fileHash = getFileHashFromKeys(secret); - } - return hashes; - }; - Hash.getFormData = function(secret, hash, password) { - secret = secret || Hash.getSecrets("form", hash, password); - var keys = secret && secret.keys; - var secondary = keys && keys.secondaryKey; - if (!secondary) { - return; - } - var curvePair = Nacl.box.keyPair.fromSecretKey(Nacl.util.decodeUTF8(secondary).slice(0, 32)); - var ret = {}; - ret.form_public = Nacl.util.encodeBase64(curvePair.publicKey); - var privateKey = ret.form_private = Nacl.util.encodeBase64(curvePair.secretKey); - var auditorHash = Hash.getViewHashFromKeys({ - version: 1, - channel: secret.channel, - keys: { - viewKeyStr: Nacl.util.encodeBase64(keys.cryptKey) - } - }); - var _parsed = Hash.parseTypeHash("pad", auditorHash); - ret.form_auditorHash = _parsed.getHash({ - auditorKey: privateKey - }); - return ret; - }; - Hash.hrefToHexChannelId = function(href, password) { - var parsed = Hash.parsePadUrl(href); - if (!parsed || !parsed.hash) { - return; - } - var secret = Hash.getSecrets(parsed.type, parsed.hash, password); - return secret.channel; - }; - Hash.getBlobPathFromHex = function(id) { - return "/blob/" + id.slice(0, 2) + "/" + id; - }; - Hash.serializeHash = function(hash) { - if (hash && hash.slice(-1) !== "/") { - hash += "/"; - } - return hash; - }; - Hash.createInviteUrl = function(curvePublic, channel) { - channel = channel || Hash.createChannelId(); - return window.location.origin + "/invite/#/1/" + channel + "/" + curvePublic.replace(/\//g, "-") + "/"; - }; - Hash.isValidChannel = function(channelId) { - return /^[a-zA-Z0-9]{32,48}$/.test(channelId); - }; - Hash.isValidHref = function(href) { - if (!href) { - return; - } - var parsed = Hash.parsePadUrl(href); - if (!parsed) { - return; - } - if (!parsed.type) { - return; - } - if (parsed.hash) { - if (!parsed.hashData) { - return; - } - if (typeof parsed.hashData.version === "undefined") { - return; - } - if (parsed.hashData.type === "pad" || parsed.hashData.type === "file") { - if (!parsed.hashData.key && !parsed.hashData.channel) { - return; - } - if (parsed.hashData.key && !/^[a-zA-Z0-9+-/=]+$/.test(parsed.hashData.key)) { - return; - } - } - } - return parsed; - }; - Hash.decodeDataOptions = function(opts) { - var b64 = decodeURIComponent(opts); - var str = Nacl.util.encodeUTF8(Nacl.util.decodeBase64(b64)); - return Util.tryParse(str) || {}; - }; - Hash.encodeDataOptions = function(opts) { - var str = JSON.stringify(opts); - var b64 = Nacl.util.encodeBase64(Nacl.util.decodeUTF8(str)); - return encodeURIComponent(b64); - }; - Hash.getNewPadURL = function(href, opts) { - var parsed = Hash.parsePadUrl(href); - var options = parsed.getOptions(); - options.newPadOpts = Hash.encodeDataOptions(opts); - return parsed.getUrl(options); - }; - Hash.getLoginURL = function(href, opts) { - var parsed = Hash.parsePadUrl(href); - var options = parsed.getOptions(); - options.loginOpts = Hash.encodeDataOptions(opts); - return parsed.getUrl(options); - }; - return Hash; - }; - if (module.exports) { - module.exports = factory(requireCommonUtil(), requireCrypto(), requireCommonSigningKeys(), requireNaclFast()); - } - })(typeof window !== "undefined" ? window : {}); - })(commonHash); - return commonHash.exports; - } - var commonHashExports = requireCommonHash(); - var commonUtilExports = requireCommonUtil(); - var cacheStore$1 = { - exports: {} - }; - var localforage = { - exports: {} - }; - /*! - localForage -- Offline Storage, Improved - Version 1.10.0 - https://localforage.github.io/localForage - (c) 2013-2017 Mozilla, Apache License 2.0 - */ var hasRequiredLocalforage; - function requireLocalforage() { - if (hasRequiredLocalforage) return localforage.exports; - hasRequiredLocalforage = 1; - (function(module, exports) { - (function(f) { - { - module.exports = f(); - } - })((function() { - return function e(t, n, r) { - function s(o, u) { - if (!n[o]) { - if (!t[o]) { - var a = typeof commonjsRequire == "function" && commonjsRequire; - if (!u && a) return a(o, !0); - if (i) return i(o, !0); - var f = new Error("Cannot find module '" + o + "'"); - throw f.code = "MODULE_NOT_FOUND", f; - } - var l = n[o] = { - exports: {} - }; - t[o][0].call(l.exports, (function(e) { - var n = t[o][1][e]; - return s(n ? n : e); - }), l, l.exports, e, t, n, r); - } - return n[o].exports; - } - var i = typeof commonjsRequire == "function" && commonjsRequire; - for (var o = 0; o < r.length; o++) s(r[o]); - return s; - }({ - 1: [ function(_dereq_, module, exports) { - (function(global) { - var Mutation = global.MutationObserver || global.WebKitMutationObserver; - var scheduleDrain; - { - if (Mutation) { - var called = 0; - var observer = new Mutation(nextTick); - var element = global.document.createTextNode(""); - observer.observe(element, { - characterData: true - }); - scheduleDrain = function() { - element.data = called = ++called % 2; - }; - } else if (!global.setImmediate && typeof global.MessageChannel !== "undefined") { - var channel = new global.MessageChannel; - channel.port1.onmessage = nextTick; - scheduleDrain = function() { - channel.port2.postMessage(0); - }; - } else if ("document" in global && "onreadystatechange" in global.document.createElement("script")) { - scheduleDrain = function() { - var scriptEl = global.document.createElement("script"); - scriptEl.onreadystatechange = function() { - nextTick(); - scriptEl.onreadystatechange = null; - scriptEl.parentNode.removeChild(scriptEl); - scriptEl = null; - }; - global.document.documentElement.appendChild(scriptEl); - }; - } else { - scheduleDrain = function() { - setTimeout(nextTick, 0); - }; - } - } - var draining; - var queue = []; - function nextTick() { - draining = true; - var i, oldQueue; - var len = queue.length; - while (len) { - oldQueue = queue; - queue = []; - i = -1; - while (++i < len) { - oldQueue[i](); - } - len = queue.length; - } - draining = false; - } - module.exports = immediate; - function immediate(task) { - if (queue.push(task) === 1 && !draining) { - scheduleDrain(); - } - } - }).call(this, typeof commonjsGlobal !== "undefined" ? commonjsGlobal : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}); - }, {} ], - 2: [ function(_dereq_, module, exports) { - var immediate = _dereq_(1); - function INTERNAL() {} - var handlers = {}; - var REJECTED = [ "REJECTED" ]; - var FULFILLED = [ "FULFILLED" ]; - var PENDING = [ "PENDING" ]; - module.exports = Promise; - function Promise(resolver) { - if (typeof resolver !== "function") { - throw new TypeError("resolver must be a function"); - } - this.state = PENDING; - this.queue = []; - this.outcome = void 0; - if (resolver !== INTERNAL) { - safelyResolveThenable(this, resolver); - } - } - Promise.prototype["catch"] = function(onRejected) { - return this.then(null, onRejected); - }; - Promise.prototype.then = function(onFulfilled, onRejected) { - if (typeof onFulfilled !== "function" && this.state === FULFILLED || typeof onRejected !== "function" && this.state === REJECTED) { - return this; - } - var promise = new this.constructor(INTERNAL); - if (this.state !== PENDING) { - var resolver = this.state === FULFILLED ? onFulfilled : onRejected; - unwrap(promise, resolver, this.outcome); - } else { - this.queue.push(new QueueItem(promise, onFulfilled, onRejected)); - } - return promise; - }; - function QueueItem(promise, onFulfilled, onRejected) { - this.promise = promise; - if (typeof onFulfilled === "function") { - this.onFulfilled = onFulfilled; - this.callFulfilled = this.otherCallFulfilled; - } - if (typeof onRejected === "function") { - this.onRejected = onRejected; - this.callRejected = this.otherCallRejected; - } - } - QueueItem.prototype.callFulfilled = function(value) { - handlers.resolve(this.promise, value); - }; - QueueItem.prototype.otherCallFulfilled = function(value) { - unwrap(this.promise, this.onFulfilled, value); - }; - QueueItem.prototype.callRejected = function(value) { - handlers.reject(this.promise, value); - }; - QueueItem.prototype.otherCallRejected = function(value) { - unwrap(this.promise, this.onRejected, value); - }; - function unwrap(promise, func, value) { - immediate((function() { - var returnValue; - try { - returnValue = func(value); - } catch (e) { - return handlers.reject(promise, e); - } - if (returnValue === promise) { - handlers.reject(promise, new TypeError("Cannot resolve promise with itself")); - } else { - handlers.resolve(promise, returnValue); - } - })); - } - handlers.resolve = function(self, value) { - var result = tryCatch(getThen, value); - if (result.status === "error") { - return handlers.reject(self, result.value); - } - var thenable = result.value; - if (thenable) { - safelyResolveThenable(self, thenable); - } else { - self.state = FULFILLED; - self.outcome = value; - var i = -1; - var len = self.queue.length; - while (++i < len) { - self.queue[i].callFulfilled(value); - } - } - return self; - }; - handlers.reject = function(self, error) { - self.state = REJECTED; - self.outcome = error; - var i = -1; - var len = self.queue.length; - while (++i < len) { - self.queue[i].callRejected(error); - } - return self; - }; - function getThen(obj) { - var then = obj && obj.then; - if (obj && (typeof obj === "object" || typeof obj === "function") && typeof then === "function") { - return function appyThen() { - then.apply(obj, arguments); - }; - } - } - function safelyResolveThenable(self, thenable) { - var called = false; - function onError(value) { - if (called) { - return; - } - called = true; - handlers.reject(self, value); - } - function onSuccess(value) { - if (called) { - return; - } - called = true; - handlers.resolve(self, value); - } - function tryToUnwrap() { - thenable(onSuccess, onError); - } - var result = tryCatch(tryToUnwrap); - if (result.status === "error") { - onError(result.value); - } - } - function tryCatch(func, value) { - var out = {}; - try { - out.value = func(value); - out.status = "success"; - } catch (e) { - out.status = "error"; - out.value = e; - } - return out; - } - Promise.resolve = resolve; - function resolve(value) { - if (value instanceof this) { - return value; - } - return handlers.resolve(new this(INTERNAL), value); - } - Promise.reject = reject; - function reject(reason) { - var promise = new this(INTERNAL); - return handlers.reject(promise, reason); - } - Promise.all = all; - function all(iterable) { - var self = this; - if (Object.prototype.toString.call(iterable) !== "[object Array]") { - return this.reject(new TypeError("must be an array")); - } - var len = iterable.length; - var called = false; - if (!len) { - return this.resolve([]); - } - var values = new Array(len); - var resolved = 0; - var i = -1; - var promise = new this(INTERNAL); - while (++i < len) { - allResolver(iterable[i], i); - } - return promise; - function allResolver(value, i) { - self.resolve(value).then(resolveFromAll, (function(error) { - if (!called) { - called = true; - handlers.reject(promise, error); - } - })); - function resolveFromAll(outValue) { - values[i] = outValue; - if (++resolved === len && !called) { - called = true; - handlers.resolve(promise, values); - } - } - } - } - Promise.race = race; - function race(iterable) { - var self = this; - if (Object.prototype.toString.call(iterable) !== "[object Array]") { - return this.reject(new TypeError("must be an array")); - } - var len = iterable.length; - var called = false; - if (!len) { - return this.resolve([]); - } - var i = -1; - var promise = new this(INTERNAL); - while (++i < len) { - resolver(iterable[i]); - } - return promise; - function resolver(value) { - self.resolve(value).then((function(response) { - if (!called) { - called = true; - handlers.resolve(promise, response); - } - }), (function(error) { - if (!called) { - called = true; - handlers.reject(promise, error); - } - })); - } - } - }, { - 1: 1 - } ], - 3: [ function(_dereq_, module, exports) { - (function(global) { - if (typeof global.Promise !== "function") { - global.Promise = _dereq_(2); - } - }).call(this, typeof commonjsGlobal !== "undefined" ? commonjsGlobal : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}); - }, { - 2: 2 - } ], - 4: [ function(_dereq_, module, exports) { - var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function(obj) { - return typeof obj; - } : function(obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }; - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - function getIDB() { - try { - if (typeof indexedDB !== "undefined") { - return indexedDB; - } - if (typeof webkitIndexedDB !== "undefined") { - return webkitIndexedDB; - } - if (typeof mozIndexedDB !== "undefined") { - return mozIndexedDB; - } - if (typeof OIndexedDB !== "undefined") { - return OIndexedDB; - } - if (typeof msIndexedDB !== "undefined") { - return msIndexedDB; - } - } catch (e) { - return; - } - } - var idb = getIDB(); - function isIndexedDBValid() { - try { - if (!idb || !idb.open) { - return false; - } - var isSafari = typeof openDatabase !== "undefined" && /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform); - var hasFetch = typeof fetch === "function" && fetch.toString().indexOf("[native code") !== -1; - return (!isSafari || hasFetch) && typeof indexedDB !== "undefined" && typeof IDBKeyRange !== "undefined"; - } catch (e) { - return false; - } - } - function createBlob(parts, properties) { - parts = parts || []; - properties = properties || {}; - try { - return new Blob(parts, properties); - } catch (e) { - if (e.name !== "TypeError") { - throw e; - } - var Builder = typeof BlobBuilder !== "undefined" ? BlobBuilder : typeof MSBlobBuilder !== "undefined" ? MSBlobBuilder : typeof MozBlobBuilder !== "undefined" ? MozBlobBuilder : WebKitBlobBuilder; - var builder = new Builder; - for (var i = 0; i < parts.length; i += 1) { - builder.append(parts[i]); - } - return builder.getBlob(properties.type); - } - } - if (typeof Promise === "undefined") { - _dereq_(3); - } - var Promise$1 = Promise; - function executeCallback(promise, callback) { - if (callback) { - promise.then((function(result) { - callback(null, result); - }), (function(error) { - callback(error); - })); - } - } - function executeTwoCallbacks(promise, callback, errorCallback) { - if (typeof callback === "function") { - promise.then(callback); - } - if (typeof errorCallback === "function") { - promise["catch"](errorCallback); - } - } - function normalizeKey(key) { - if (typeof key !== "string") { - console.warn(key + " used as a key, but it is not a string."); - key = String(key); - } - return key; - } - function getCallback() { - if (arguments.length && typeof arguments[arguments.length - 1] === "function") { - return arguments[arguments.length - 1]; - } - } - var DETECT_BLOB_SUPPORT_STORE = "local-forage-detect-blob-support"; - var supportsBlobs = void 0; - var dbContexts = {}; - var toString = Object.prototype.toString; - var READ_ONLY = "readonly"; - var READ_WRITE = "readwrite"; - function _binStringToArrayBuffer(bin) { - var length = bin.length; - var buf = new ArrayBuffer(length); - var arr = new Uint8Array(buf); - for (var i = 0; i < length; i++) { - arr[i] = bin.charCodeAt(i); - } - return buf; - } - function _checkBlobSupportWithoutCaching(idb) { - return new Promise$1((function(resolve) { - var txn = idb.transaction(DETECT_BLOB_SUPPORT_STORE, READ_WRITE); - var blob = createBlob([ "" ]); - txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, "key"); - txn.onabort = function(e) { - e.preventDefault(); - e.stopPropagation(); - resolve(false); - }; - txn.oncomplete = function() { - var matchedChrome = navigator.userAgent.match(/Chrome\/(\d+)/); - var matchedEdge = navigator.userAgent.match(/Edge\//); - resolve(matchedEdge || !matchedChrome || parseInt(matchedChrome[1], 10) >= 43); - }; - }))["catch"]((function() { - return false; - })); - } - function _checkBlobSupport(idb) { - if (typeof supportsBlobs === "boolean") { - return Promise$1.resolve(supportsBlobs); - } - return _checkBlobSupportWithoutCaching(idb).then((function(value) { - supportsBlobs = value; - return supportsBlobs; - })); - } - function _deferReadiness(dbInfo) { - var dbContext = dbContexts[dbInfo.name]; - var deferredOperation = {}; - deferredOperation.promise = new Promise$1((function(resolve, reject) { - deferredOperation.resolve = resolve; - deferredOperation.reject = reject; - })); - dbContext.deferredOperations.push(deferredOperation); - if (!dbContext.dbReady) { - dbContext.dbReady = deferredOperation.promise; - } else { - dbContext.dbReady = dbContext.dbReady.then((function() { - return deferredOperation.promise; - })); - } - } - function _advanceReadiness(dbInfo) { - var dbContext = dbContexts[dbInfo.name]; - var deferredOperation = dbContext.deferredOperations.pop(); - if (deferredOperation) { - deferredOperation.resolve(); - return deferredOperation.promise; - } - } - function _rejectReadiness(dbInfo, err) { - var dbContext = dbContexts[dbInfo.name]; - var deferredOperation = dbContext.deferredOperations.pop(); - if (deferredOperation) { - deferredOperation.reject(err); - return deferredOperation.promise; - } - } - function _getConnection(dbInfo, upgradeNeeded) { - return new Promise$1((function(resolve, reject) { - dbContexts[dbInfo.name] = dbContexts[dbInfo.name] || createDbContext(); - if (dbInfo.db) { - if (upgradeNeeded) { - _deferReadiness(dbInfo); - dbInfo.db.close(); - } else { - return resolve(dbInfo.db); - } - } - var dbArgs = [ dbInfo.name ]; - if (upgradeNeeded) { - dbArgs.push(dbInfo.version); - } - var openreq = idb.open.apply(idb, dbArgs); - if (upgradeNeeded) { - openreq.onupgradeneeded = function(e) { - var db = openreq.result; - try { - db.createObjectStore(dbInfo.storeName); - if (e.oldVersion <= 1) { - db.createObjectStore(DETECT_BLOB_SUPPORT_STORE); - } - } catch (ex) { - if (ex.name === "ConstraintError") { - console.warn('The database "' + dbInfo.name + '"' + " has been upgraded from version " + e.oldVersion + " to version " + e.newVersion + ', but the storage "' + dbInfo.storeName + '" already exists.'); - } else { - throw ex; - } - } - }; - } - openreq.onerror = function(e) { - e.preventDefault(); - reject(openreq.error); - }; - openreq.onsuccess = function() { - var db = openreq.result; - db.onversionchange = function(e) { - e.target.close(); - }; - resolve(db); - _advanceReadiness(dbInfo); - }; - })); - } - function _getOriginalConnection(dbInfo) { - return _getConnection(dbInfo, false); - } - function _getUpgradedConnection(dbInfo) { - return _getConnection(dbInfo, true); - } - function _isUpgradeNeeded(dbInfo, defaultVersion) { - if (!dbInfo.db) { - return true; - } - var isNewStore = !dbInfo.db.objectStoreNames.contains(dbInfo.storeName); - var isDowngrade = dbInfo.version < dbInfo.db.version; - var isUpgrade = dbInfo.version > dbInfo.db.version; - if (isDowngrade) { - if (dbInfo.version !== defaultVersion) { - console.warn('The database "' + dbInfo.name + '"' + " can't be downgraded from version " + dbInfo.db.version + " to version " + dbInfo.version + "."); - } - dbInfo.version = dbInfo.db.version; - } - if (isUpgrade || isNewStore) { - if (isNewStore) { - var incVersion = dbInfo.db.version + 1; - if (incVersion > dbInfo.version) { - dbInfo.version = incVersion; - } - } - return true; - } - return false; - } - function _encodeBlob(blob) { - return new Promise$1((function(resolve, reject) { - var reader = new FileReader; - reader.onerror = reject; - reader.onloadend = function(e) { - var base64 = btoa(e.target.result || ""); - resolve({ - __local_forage_encoded_blob: true, - data: base64, - type: blob.type - }); - }; - reader.readAsBinaryString(blob); - })); - } - function _decodeBlob(encodedBlob) { - var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data)); - return createBlob([ arrayBuff ], { - type: encodedBlob.type - }); - } - function _isEncodedBlob(value) { - return value && value.__local_forage_encoded_blob; - } - function _fullyReady(callback) { - var self = this; - var promise = self._initReady().then((function() { - var dbContext = dbContexts[self._dbInfo.name]; - if (dbContext && dbContext.dbReady) { - return dbContext.dbReady; - } - })); - executeTwoCallbacks(promise, callback, callback); - return promise; - } - function _tryReconnect(dbInfo) { - _deferReadiness(dbInfo); - var dbContext = dbContexts[dbInfo.name]; - var forages = dbContext.forages; - for (var i = 0; i < forages.length; i++) { - var forage = forages[i]; - if (forage._dbInfo.db) { - forage._dbInfo.db.close(); - forage._dbInfo.db = null; - } - } - dbInfo.db = null; - return _getOriginalConnection(dbInfo).then((function(db) { - dbInfo.db = db; - if (_isUpgradeNeeded(dbInfo)) { - return _getUpgradedConnection(dbInfo); - } - return db; - })).then((function(db) { - dbInfo.db = dbContext.db = db; - for (var i = 0; i < forages.length; i++) { - forages[i]._dbInfo.db = db; - } - }))["catch"]((function(err) { - _rejectReadiness(dbInfo, err); - throw err; - })); - } - function createTransaction(dbInfo, mode, callback, retries) { - if (retries === undefined) { - retries = 1; - } - try { - var tx = dbInfo.db.transaction(dbInfo.storeName, mode); - callback(null, tx); - } catch (err) { - if (retries > 0 && (!dbInfo.db || err.name === "InvalidStateError" || err.name === "NotFoundError")) { - return Promise$1.resolve().then((function() { - if (!dbInfo.db || err.name === "NotFoundError" && !dbInfo.db.objectStoreNames.contains(dbInfo.storeName) && dbInfo.version <= dbInfo.db.version) { - if (dbInfo.db) { - dbInfo.version = dbInfo.db.version + 1; - } - return _getUpgradedConnection(dbInfo); - } - })).then((function() { - return _tryReconnect(dbInfo).then((function() { - createTransaction(dbInfo, mode, callback, retries - 1); - })); - }))["catch"](callback); - } - callback(err); - } - } - function createDbContext() { - return { - forages: [], - db: null, - dbReady: null, - deferredOperations: [] - }; - } - function _initStorage(options) { - var self = this; - var dbInfo = { - db: null - }; - if (options) { - for (var i in options) { - dbInfo[i] = options[i]; - } - } - var dbContext = dbContexts[dbInfo.name]; - if (!dbContext) { - dbContext = createDbContext(); - dbContexts[dbInfo.name] = dbContext; - } - dbContext.forages.push(self); - if (!self._initReady) { - self._initReady = self.ready; - self.ready = _fullyReady; - } - var initPromises = []; - function ignoreErrors() { - return Promise$1.resolve(); - } - for (var j = 0; j < dbContext.forages.length; j++) { - var forage = dbContext.forages[j]; - if (forage !== self) { - initPromises.push(forage._initReady()["catch"](ignoreErrors)); - } - } - var forages = dbContext.forages.slice(0); - return Promise$1.all(initPromises).then((function() { - dbInfo.db = dbContext.db; - return _getOriginalConnection(dbInfo); - })).then((function(db) { - dbInfo.db = db; - if (_isUpgradeNeeded(dbInfo, self._defaultConfig.version)) { - return _getUpgradedConnection(dbInfo); - } - return db; - })).then((function(db) { - dbInfo.db = dbContext.db = db; - self._dbInfo = dbInfo; - for (var k = 0; k < forages.length; k++) { - var forage = forages[k]; - if (forage !== self) { - forage._dbInfo.db = dbInfo.db; - forage._dbInfo.version = dbInfo.version; - } - } - })); - } - function getItem(key, callback) { - var self = this; - key = normalizeKey(key); - var promise = new Promise$1((function(resolve, reject) { - self.ready().then((function() { - createTransaction(self._dbInfo, READ_ONLY, (function(err, transaction) { - if (err) { - return reject(err); - } - try { - var store = transaction.objectStore(self._dbInfo.storeName); - var req = store.get(key); - req.onsuccess = function() { - var value = req.result; - if (value === undefined) { - value = null; - } - if (_isEncodedBlob(value)) { - value = _decodeBlob(value); - } - resolve(value); - }; - req.onerror = function() { - reject(req.error); - }; - } catch (e) { - reject(e); - } - })); - }))["catch"](reject); - })); - executeCallback(promise, callback); - return promise; - } - function iterate(iterator, callback) { - var self = this; - var promise = new Promise$1((function(resolve, reject) { - self.ready().then((function() { - createTransaction(self._dbInfo, READ_ONLY, (function(err, transaction) { - if (err) { - return reject(err); - } - try { - var store = transaction.objectStore(self._dbInfo.storeName); - var req = store.openCursor(); - var iterationNumber = 1; - req.onsuccess = function() { - var cursor = req.result; - if (cursor) { - var value = cursor.value; - if (_isEncodedBlob(value)) { - value = _decodeBlob(value); - } - var result = iterator(value, cursor.key, iterationNumber++); - if (result !== void 0) { - resolve(result); - } else { - cursor["continue"](); - } - } else { - resolve(); - } - }; - req.onerror = function() { - reject(req.error); - }; - } catch (e) { - reject(e); - } - })); - }))["catch"](reject); - })); - executeCallback(promise, callback); - return promise; - } - function setItem(key, value, callback) { - var self = this; - key = normalizeKey(key); - var promise = new Promise$1((function(resolve, reject) { - var dbInfo; - self.ready().then((function() { - dbInfo = self._dbInfo; - if (toString.call(value) === "[object Blob]") { - return _checkBlobSupport(dbInfo.db).then((function(blobSupport) { - if (blobSupport) { - return value; - } - return _encodeBlob(value); - })); - } - return value; - })).then((function(value) { - createTransaction(self._dbInfo, READ_WRITE, (function(err, transaction) { - if (err) { - return reject(err); - } - try { - var store = transaction.objectStore(self._dbInfo.storeName); - if (value === null) { - value = undefined; - } - var req = store.put(value, key); - transaction.oncomplete = function() { - if (value === undefined) { - value = null; - } - resolve(value); - }; - transaction.onabort = transaction.onerror = function() { - var err = req.error ? req.error : req.transaction.error; - reject(err); - }; - } catch (e) { - reject(e); - } - })); - }))["catch"](reject); - })); - executeCallback(promise, callback); - return promise; - } - function removeItem(key, callback) { - var self = this; - key = normalizeKey(key); - var promise = new Promise$1((function(resolve, reject) { - self.ready().then((function() { - createTransaction(self._dbInfo, READ_WRITE, (function(err, transaction) { - if (err) { - return reject(err); - } - try { - var store = transaction.objectStore(self._dbInfo.storeName); - var req = store["delete"](key); - transaction.oncomplete = function() { - resolve(); - }; - transaction.onerror = function() { - reject(req.error); - }; - transaction.onabort = function() { - var err = req.error ? req.error : req.transaction.error; - reject(err); - }; - } catch (e) { - reject(e); - } - })); - }))["catch"](reject); - })); - executeCallback(promise, callback); - return promise; - } - function clear(callback) { - var self = this; - var promise = new Promise$1((function(resolve, reject) { - self.ready().then((function() { - createTransaction(self._dbInfo, READ_WRITE, (function(err, transaction) { - if (err) { - return reject(err); - } - try { - var store = transaction.objectStore(self._dbInfo.storeName); - var req = store.clear(); - transaction.oncomplete = function() { - resolve(); - }; - transaction.onabort = transaction.onerror = function() { - var err = req.error ? req.error : req.transaction.error; - reject(err); - }; - } catch (e) { - reject(e); - } - })); - }))["catch"](reject); - })); - executeCallback(promise, callback); - return promise; - } - function length(callback) { - var self = this; - var promise = new Promise$1((function(resolve, reject) { - self.ready().then((function() { - createTransaction(self._dbInfo, READ_ONLY, (function(err, transaction) { - if (err) { - return reject(err); - } - try { - var store = transaction.objectStore(self._dbInfo.storeName); - var req = store.count(); - req.onsuccess = function() { - resolve(req.result); - }; - req.onerror = function() { - reject(req.error); - }; - } catch (e) { - reject(e); - } - })); - }))["catch"](reject); - })); - executeCallback(promise, callback); - return promise; - } - function key(n, callback) { - var self = this; - var promise = new Promise$1((function(resolve, reject) { - if (n < 0) { - resolve(null); - return; - } - self.ready().then((function() { - createTransaction(self._dbInfo, READ_ONLY, (function(err, transaction) { - if (err) { - return reject(err); - } - try { - var store = transaction.objectStore(self._dbInfo.storeName); - var advanced = false; - var req = store.openKeyCursor(); - req.onsuccess = function() { - var cursor = req.result; - if (!cursor) { - resolve(null); - return; - } - if (n === 0) { - resolve(cursor.key); - } else { - if (!advanced) { - advanced = true; - cursor.advance(n); - } else { - resolve(cursor.key); - } - } - }; - req.onerror = function() { - reject(req.error); - }; - } catch (e) { - reject(e); - } - })); - }))["catch"](reject); - })); - executeCallback(promise, callback); - return promise; - } - function keys(callback) { - var self = this; - var promise = new Promise$1((function(resolve, reject) { - self.ready().then((function() { - createTransaction(self._dbInfo, READ_ONLY, (function(err, transaction) { - if (err) { - return reject(err); - } - try { - var store = transaction.objectStore(self._dbInfo.storeName); - var req = store.openKeyCursor(); - var keys = []; - req.onsuccess = function() { - var cursor = req.result; - if (!cursor) { - resolve(keys); - return; - } - keys.push(cursor.key); - cursor["continue"](); - }; - req.onerror = function() { - reject(req.error); - }; - } catch (e) { - reject(e); - } - })); - }))["catch"](reject); - })); - executeCallback(promise, callback); - return promise; - } - function dropInstance(options, callback) { - callback = getCallback.apply(this, arguments); - var currentConfig = this.config(); - options = typeof options !== "function" && options || {}; - if (!options.name) { - options.name = options.name || currentConfig.name; - options.storeName = options.storeName || currentConfig.storeName; - } - var self = this; - var promise; - if (!options.name) { - promise = Promise$1.reject("Invalid arguments"); - } else { - var isCurrentDb = options.name === currentConfig.name && self._dbInfo.db; - var dbPromise = isCurrentDb ? Promise$1.resolve(self._dbInfo.db) : _getOriginalConnection(options).then((function(db) { - var dbContext = dbContexts[options.name]; - var forages = dbContext.forages; - dbContext.db = db; - for (var i = 0; i < forages.length; i++) { - forages[i]._dbInfo.db = db; - } - return db; - })); - if (!options.storeName) { - promise = dbPromise.then((function(db) { - _deferReadiness(options); - var dbContext = dbContexts[options.name]; - var forages = dbContext.forages; - db.close(); - for (var i = 0; i < forages.length; i++) { - var forage = forages[i]; - forage._dbInfo.db = null; - } - var dropDBPromise = new Promise$1((function(resolve, reject) { - var req = idb.deleteDatabase(options.name); - req.onerror = function() { - var db = req.result; - if (db) { - db.close(); - } - reject(req.error); - }; - req.onblocked = function() { - console.warn('dropInstance blocked for database "' + options.name + '" until all open connections are closed'); - }; - req.onsuccess = function() { - var db = req.result; - if (db) { - db.close(); - } - resolve(db); - }; - })); - return dropDBPromise.then((function(db) { - dbContext.db = db; - for (var i = 0; i < forages.length; i++) { - var _forage = forages[i]; - _advanceReadiness(_forage._dbInfo); - } - }))["catch"]((function(err) { - (_rejectReadiness(options, err) || Promise$1.resolve())["catch"]((function() {})); - throw err; - })); - })); - } else { - promise = dbPromise.then((function(db) { - if (!db.objectStoreNames.contains(options.storeName)) { - return; - } - var newVersion = db.version + 1; - _deferReadiness(options); - var dbContext = dbContexts[options.name]; - var forages = dbContext.forages; - db.close(); - for (var i = 0; i < forages.length; i++) { - var forage = forages[i]; - forage._dbInfo.db = null; - forage._dbInfo.version = newVersion; - } - var dropObjectPromise = new Promise$1((function(resolve, reject) { - var req = idb.open(options.name, newVersion); - req.onerror = function(err) { - var db = req.result; - db.close(); - reject(err); - }; - req.onupgradeneeded = function() { - var db = req.result; - db.deleteObjectStore(options.storeName); - }; - req.onsuccess = function() { - var db = req.result; - db.close(); - resolve(db); - }; - })); - return dropObjectPromise.then((function(db) { - dbContext.db = db; - for (var j = 0; j < forages.length; j++) { - var _forage2 = forages[j]; - _forage2._dbInfo.db = db; - _advanceReadiness(_forage2._dbInfo); - } - }))["catch"]((function(err) { - (_rejectReadiness(options, err) || Promise$1.resolve())["catch"]((function() {})); - throw err; - })); - })); - } - } - executeCallback(promise, callback); - return promise; - } - var asyncStorage = { - _driver: "asyncStorage", - _initStorage, - _support: isIndexedDBValid(), - iterate, - getItem, - setItem, - removeItem, - clear, - length, - key, - keys, - dropInstance - }; - function isWebSQLValid() { - return typeof openDatabase === "function"; - } - var BASE_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - var BLOB_TYPE_PREFIX = "~~local_forage_type~"; - var BLOB_TYPE_PREFIX_REGEX = /^~~local_forage_type~([^~]+)~/; - var SERIALIZED_MARKER = "__lfsc__:"; - var SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length; - var TYPE_ARRAYBUFFER = "arbf"; - var TYPE_BLOB = "blob"; - var TYPE_INT8ARRAY = "si08"; - var TYPE_UINT8ARRAY = "ui08"; - var TYPE_UINT8CLAMPEDARRAY = "uic8"; - var TYPE_INT16ARRAY = "si16"; - var TYPE_INT32ARRAY = "si32"; - var TYPE_UINT16ARRAY = "ur16"; - var TYPE_UINT32ARRAY = "ui32"; - var TYPE_FLOAT32ARRAY = "fl32"; - var TYPE_FLOAT64ARRAY = "fl64"; - var TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length; - var toString$1 = Object.prototype.toString; - function stringToBuffer(serializedString) { - var bufferLength = serializedString.length * .75; - var len = serializedString.length; - var i; - var p = 0; - var encoded1, encoded2, encoded3, encoded4; - if (serializedString[serializedString.length - 1] === "=") { - bufferLength--; - if (serializedString[serializedString.length - 2] === "=") { - bufferLength--; - } - } - var buffer = new ArrayBuffer(bufferLength); - var bytes = new Uint8Array(buffer); - for (i = 0; i < len; i += 4) { - encoded1 = BASE_CHARS.indexOf(serializedString[i]); - encoded2 = BASE_CHARS.indexOf(serializedString[i + 1]); - encoded3 = BASE_CHARS.indexOf(serializedString[i + 2]); - encoded4 = BASE_CHARS.indexOf(serializedString[i + 3]); - bytes[p++] = encoded1 << 2 | encoded2 >> 4; - bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2; - bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63; - } - return buffer; - } - function bufferToString(buffer) { - var bytes = new Uint8Array(buffer); - var base64String = ""; - var i; - for (i = 0; i < bytes.length; i += 3) { - base64String += BASE_CHARS[bytes[i] >> 2]; - base64String += BASE_CHARS[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4]; - base64String += BASE_CHARS[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6]; - base64String += BASE_CHARS[bytes[i + 2] & 63]; - } - if (bytes.length % 3 === 2) { - base64String = base64String.substring(0, base64String.length - 1) + "="; - } else if (bytes.length % 3 === 1) { - base64String = base64String.substring(0, base64String.length - 2) + "=="; - } - return base64String; - } - function serialize(value, callback) { - var valueType = ""; - if (value) { - valueType = toString$1.call(value); - } - if (value && (valueType === "[object ArrayBuffer]" || value.buffer && toString$1.call(value.buffer) === "[object ArrayBuffer]")) { - var buffer; - var marker = SERIALIZED_MARKER; - if (value instanceof ArrayBuffer) { - buffer = value; - marker += TYPE_ARRAYBUFFER; - } else { - buffer = value.buffer; - if (valueType === "[object Int8Array]") { - marker += TYPE_INT8ARRAY; - } else if (valueType === "[object Uint8Array]") { - marker += TYPE_UINT8ARRAY; - } else if (valueType === "[object Uint8ClampedArray]") { - marker += TYPE_UINT8CLAMPEDARRAY; - } else if (valueType === "[object Int16Array]") { - marker += TYPE_INT16ARRAY; - } else if (valueType === "[object Uint16Array]") { - marker += TYPE_UINT16ARRAY; - } else if (valueType === "[object Int32Array]") { - marker += TYPE_INT32ARRAY; - } else if (valueType === "[object Uint32Array]") { - marker += TYPE_UINT32ARRAY; - } else if (valueType === "[object Float32Array]") { - marker += TYPE_FLOAT32ARRAY; - } else if (valueType === "[object Float64Array]") { - marker += TYPE_FLOAT64ARRAY; - } else { - callback(new Error("Failed to get type for BinaryArray")); - } - } - callback(marker + bufferToString(buffer)); - } else if (valueType === "[object Blob]") { - var fileReader = new FileReader; - fileReader.onload = function() { - var str = BLOB_TYPE_PREFIX + value.type + "~" + bufferToString(this.result); - callback(SERIALIZED_MARKER + TYPE_BLOB + str); - }; - fileReader.readAsArrayBuffer(value); - } else { - try { - callback(JSON.stringify(value)); - } catch (e) { - console.error("Couldn't convert value into a JSON string: ", value); - callback(null, e); - } - } - } - function deserialize(value) { - if (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) { - return JSON.parse(value); - } - var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH); - var type = value.substring(SERIALIZED_MARKER_LENGTH, TYPE_SERIALIZED_MARKER_LENGTH); - var blobType; - if (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) { - var matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX); - blobType = matcher[1]; - serializedString = serializedString.substring(matcher[0].length); - } - var buffer = stringToBuffer(serializedString); - switch (type) { - case TYPE_ARRAYBUFFER: - return buffer; - - case TYPE_BLOB: - return createBlob([ buffer ], { - type: blobType - }); - - case TYPE_INT8ARRAY: - return new Int8Array(buffer); - - case TYPE_UINT8ARRAY: - return new Uint8Array(buffer); - - case TYPE_UINT8CLAMPEDARRAY: - return new Uint8ClampedArray(buffer); - - case TYPE_INT16ARRAY: - return new Int16Array(buffer); - - case TYPE_UINT16ARRAY: - return new Uint16Array(buffer); - - case TYPE_INT32ARRAY: - return new Int32Array(buffer); - - case TYPE_UINT32ARRAY: - return new Uint32Array(buffer); - - case TYPE_FLOAT32ARRAY: - return new Float32Array(buffer); - - case TYPE_FLOAT64ARRAY: - return new Float64Array(buffer); - - default: - throw new Error("Unkown type: " + type); - } - } - var localforageSerializer = { - serialize, - deserialize, - stringToBuffer, - bufferToString - }; - function createDbTable(t, dbInfo, callback, errorCallback) { - t.executeSql("CREATE TABLE IF NOT EXISTS " + dbInfo.storeName + " " + "(id INTEGER PRIMARY KEY, key unique, value)", [], callback, errorCallback); - } - function _initStorage$1(options) { - var self = this; - var dbInfo = { - db: null - }; - if (options) { - for (var i in options) { - dbInfo[i] = typeof options[i] !== "string" ? options[i].toString() : options[i]; - } - } - var dbInfoPromise = new Promise$1((function(resolve, reject) { - try { - dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size); - } catch (e) { - return reject(e); - } - dbInfo.db.transaction((function(t) { - createDbTable(t, dbInfo, (function() { - self._dbInfo = dbInfo; - resolve(); - }), (function(t, error) { - reject(error); - })); - }), reject); - })); - dbInfo.serializer = localforageSerializer; - return dbInfoPromise; - } - function tryExecuteSql(t, dbInfo, sqlStatement, args, callback, errorCallback) { - t.executeSql(sqlStatement, args, callback, (function(t, error) { - if (error.code === error.SYNTAX_ERR) { - t.executeSql("SELECT name FROM sqlite_master " + "WHERE type='table' AND name = ?", [ dbInfo.storeName ], (function(t, results) { - if (!results.rows.length) { - createDbTable(t, dbInfo, (function() { - t.executeSql(sqlStatement, args, callback, errorCallback); - }), errorCallback); - } else { - errorCallback(t, error); - } - }), errorCallback); - } else { - errorCallback(t, error); - } - }), errorCallback); - } - function getItem$1(key, callback) { - var self = this; - key = normalizeKey(key); - var promise = new Promise$1((function(resolve, reject) { - self.ready().then((function() { - var dbInfo = self._dbInfo; - dbInfo.db.transaction((function(t) { - tryExecuteSql(t, dbInfo, "SELECT * FROM " + dbInfo.storeName + " WHERE key = ? LIMIT 1", [ key ], (function(t, results) { - var result = results.rows.length ? results.rows.item(0).value : null; - if (result) { - result = dbInfo.serializer.deserialize(result); - } - resolve(result); - }), (function(t, error) { - reject(error); - })); - })); - }))["catch"](reject); - })); - executeCallback(promise, callback); - return promise; - } - function iterate$1(iterator, callback) { - var self = this; - var promise = new Promise$1((function(resolve, reject) { - self.ready().then((function() { - var dbInfo = self._dbInfo; - dbInfo.db.transaction((function(t) { - tryExecuteSql(t, dbInfo, "SELECT * FROM " + dbInfo.storeName, [], (function(t, results) { - var rows = results.rows; - var length = rows.length; - for (var i = 0; i < length; i++) { - var item = rows.item(i); - var result = item.value; - if (result) { - result = dbInfo.serializer.deserialize(result); - } - result = iterator(result, item.key, i + 1); - if (result !== void 0) { - resolve(result); - return; - } - } - resolve(); - }), (function(t, error) { - reject(error); - })); - })); - }))["catch"](reject); - })); - executeCallback(promise, callback); - return promise; - } - function _setItem(key, value, callback, retriesLeft) { - var self = this; - key = normalizeKey(key); - var promise = new Promise$1((function(resolve, reject) { - self.ready().then((function() { - if (value === undefined) { - value = null; - } - var originalValue = value; - var dbInfo = self._dbInfo; - dbInfo.serializer.serialize(value, (function(value, error) { - if (error) { - reject(error); - } else { - dbInfo.db.transaction((function(t) { - tryExecuteSql(t, dbInfo, "INSERT OR REPLACE INTO " + dbInfo.storeName + " " + "(key, value) VALUES (?, ?)", [ key, value ], (function() { - resolve(originalValue); - }), (function(t, error) { - reject(error); - })); - }), (function(sqlError) { - if (sqlError.code === sqlError.QUOTA_ERR) { - if (retriesLeft > 0) { - resolve(_setItem.apply(self, [ key, originalValue, callback, retriesLeft - 1 ])); - return; - } - reject(sqlError); - } - })); - } - })); - }))["catch"](reject); - })); - executeCallback(promise, callback); - return promise; - } - function setItem$1(key, value, callback) { - return _setItem.apply(this, [ key, value, callback, 1 ]); - } - function removeItem$1(key, callback) { - var self = this; - key = normalizeKey(key); - var promise = new Promise$1((function(resolve, reject) { - self.ready().then((function() { - var dbInfo = self._dbInfo; - dbInfo.db.transaction((function(t) { - tryExecuteSql(t, dbInfo, "DELETE FROM " + dbInfo.storeName + " WHERE key = ?", [ key ], (function() { - resolve(); - }), (function(t, error) { - reject(error); - })); - })); - }))["catch"](reject); - })); - executeCallback(promise, callback); - return promise; - } - function clear$1(callback) { - var self = this; - var promise = new Promise$1((function(resolve, reject) { - self.ready().then((function() { - var dbInfo = self._dbInfo; - dbInfo.db.transaction((function(t) { - tryExecuteSql(t, dbInfo, "DELETE FROM " + dbInfo.storeName, [], (function() { - resolve(); - }), (function(t, error) { - reject(error); - })); - })); - }))["catch"](reject); - })); - executeCallback(promise, callback); - return promise; - } - function length$1(callback) { - var self = this; - var promise = new Promise$1((function(resolve, reject) { - self.ready().then((function() { - var dbInfo = self._dbInfo; - dbInfo.db.transaction((function(t) { - tryExecuteSql(t, dbInfo, "SELECT COUNT(key) as c FROM " + dbInfo.storeName, [], (function(t, results) { - var result = results.rows.item(0).c; - resolve(result); - }), (function(t, error) { - reject(error); - })); - })); - }))["catch"](reject); - })); - executeCallback(promise, callback); - return promise; - } - function key$1(n, callback) { - var self = this; - var promise = new Promise$1((function(resolve, reject) { - self.ready().then((function() { - var dbInfo = self._dbInfo; - dbInfo.db.transaction((function(t) { - tryExecuteSql(t, dbInfo, "SELECT key FROM " + dbInfo.storeName + " WHERE id = ? LIMIT 1", [ n + 1 ], (function(t, results) { - var result = results.rows.length ? results.rows.item(0).key : null; - resolve(result); - }), (function(t, error) { - reject(error); - })); - })); - }))["catch"](reject); - })); - executeCallback(promise, callback); - return promise; - } - function keys$1(callback) { - var self = this; - var promise = new Promise$1((function(resolve, reject) { - self.ready().then((function() { - var dbInfo = self._dbInfo; - dbInfo.db.transaction((function(t) { - tryExecuteSql(t, dbInfo, "SELECT key FROM " + dbInfo.storeName, [], (function(t, results) { - var keys = []; - for (var i = 0; i < results.rows.length; i++) { - keys.push(results.rows.item(i).key); - } - resolve(keys); - }), (function(t, error) { - reject(error); - })); - })); - }))["catch"](reject); - })); - executeCallback(promise, callback); - return promise; - } - function getAllStoreNames(db) { - return new Promise$1((function(resolve, reject) { - db.transaction((function(t) { - t.executeSql("SELECT name FROM sqlite_master " + "WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'", [], (function(t, results) { - var storeNames = []; - for (var i = 0; i < results.rows.length; i++) { - storeNames.push(results.rows.item(i).name); - } - resolve({ - db, - storeNames - }); - }), (function(t, error) { - reject(error); - })); - }), (function(sqlError) { - reject(sqlError); - })); - })); - } - function dropInstance$1(options, callback) { - callback = getCallback.apply(this, arguments); - var currentConfig = this.config(); - options = typeof options !== "function" && options || {}; - if (!options.name) { - options.name = options.name || currentConfig.name; - options.storeName = options.storeName || currentConfig.storeName; - } - var self = this; - var promise; - if (!options.name) { - promise = Promise$1.reject("Invalid arguments"); - } else { - promise = new Promise$1((function(resolve) { - var db; - if (options.name === currentConfig.name) { - db = self._dbInfo.db; - } else { - db = openDatabase(options.name, "", "", 0); - } - if (!options.storeName) { - resolve(getAllStoreNames(db)); - } else { - resolve({ - db, - storeNames: [ options.storeName ] - }); - } - })).then((function(operationInfo) { - return new Promise$1((function(resolve, reject) { - operationInfo.db.transaction((function(t) { - function dropTable(storeName) { - return new Promise$1((function(resolve, reject) { - t.executeSql("DROP TABLE IF EXISTS " + storeName, [], (function() { - resolve(); - }), (function(t, error) { - reject(error); - })); - })); - } - var operations = []; - for (var i = 0, len = operationInfo.storeNames.length; i < len; i++) { - operations.push(dropTable(operationInfo.storeNames[i])); - } - Promise$1.all(operations).then((function() { - resolve(); - }))["catch"]((function(e) { - reject(e); - })); - }), (function(sqlError) { - reject(sqlError); - })); - })); - })); - } - executeCallback(promise, callback); - return promise; - } - var webSQLStorage = { - _driver: "webSQLStorage", - _initStorage: _initStorage$1, - _support: isWebSQLValid(), - iterate: iterate$1, - getItem: getItem$1, - setItem: setItem$1, - removeItem: removeItem$1, - clear: clear$1, - length: length$1, - key: key$1, - keys: keys$1, - dropInstance: dropInstance$1 - }; - function isLocalStorageValid() { - try { - return typeof localStorage !== "undefined" && "setItem" in localStorage && !!localStorage.setItem; - } catch (e) { - return false; - } - } - function _getKeyPrefix(options, defaultConfig) { - var keyPrefix = options.name + "/"; - if (options.storeName !== defaultConfig.storeName) { - keyPrefix += options.storeName + "/"; - } - return keyPrefix; - } - function checkIfLocalStorageThrows() { - var localStorageTestKey = "_localforage_support_test"; - try { - localStorage.setItem(localStorageTestKey, true); - localStorage.removeItem(localStorageTestKey); - return false; - } catch (e) { - return true; - } - } - function _isLocalStorageUsable() { - return !checkIfLocalStorageThrows() || localStorage.length > 0; - } - function _initStorage$2(options) { - var self = this; - var dbInfo = {}; - if (options) { - for (var i in options) { - dbInfo[i] = options[i]; - } - } - dbInfo.keyPrefix = _getKeyPrefix(options, self._defaultConfig); - if (!_isLocalStorageUsable()) { - return Promise$1.reject(); - } - self._dbInfo = dbInfo; - dbInfo.serializer = localforageSerializer; - return Promise$1.resolve(); - } - function clear$2(callback) { - var self = this; - var promise = self.ready().then((function() { - var keyPrefix = self._dbInfo.keyPrefix; - for (var i = localStorage.length - 1; i >= 0; i--) { - var key = localStorage.key(i); - if (key.indexOf(keyPrefix) === 0) { - localStorage.removeItem(key); - } - } - })); - executeCallback(promise, callback); - return promise; - } - function getItem$2(key, callback) { - var self = this; - key = normalizeKey(key); - var promise = self.ready().then((function() { - var dbInfo = self._dbInfo; - var result = localStorage.getItem(dbInfo.keyPrefix + key); - if (result) { - result = dbInfo.serializer.deserialize(result); - } - return result; - })); - executeCallback(promise, callback); - return promise; - } - function iterate$2(iterator, callback) { - var self = this; - var promise = self.ready().then((function() { - var dbInfo = self._dbInfo; - var keyPrefix = dbInfo.keyPrefix; - var keyPrefixLength = keyPrefix.length; - var length = localStorage.length; - var iterationNumber = 1; - for (var i = 0; i < length; i++) { - var key = localStorage.key(i); - if (key.indexOf(keyPrefix) !== 0) { - continue; - } - var value = localStorage.getItem(key); - if (value) { - value = dbInfo.serializer.deserialize(value); - } - value = iterator(value, key.substring(keyPrefixLength), iterationNumber++); - if (value !== void 0) { - return value; - } - } - })); - executeCallback(promise, callback); - return promise; - } - function key$2(n, callback) { - var self = this; - var promise = self.ready().then((function() { - var dbInfo = self._dbInfo; - var result; - try { - result = localStorage.key(n); - } catch (error) { - result = null; - } - if (result) { - result = result.substring(dbInfo.keyPrefix.length); - } - return result; - })); - executeCallback(promise, callback); - return promise; - } - function keys$2(callback) { - var self = this; - var promise = self.ready().then((function() { - var dbInfo = self._dbInfo; - var length = localStorage.length; - var keys = []; - for (var i = 0; i < length; i++) { - var itemKey = localStorage.key(i); - if (itemKey.indexOf(dbInfo.keyPrefix) === 0) { - keys.push(itemKey.substring(dbInfo.keyPrefix.length)); - } - } - return keys; - })); - executeCallback(promise, callback); - return promise; - } - function length$2(callback) { - var self = this; - var promise = self.keys().then((function(keys) { - return keys.length; - })); - executeCallback(promise, callback); - return promise; - } - function removeItem$2(key, callback) { - var self = this; - key = normalizeKey(key); - var promise = self.ready().then((function() { - var dbInfo = self._dbInfo; - localStorage.removeItem(dbInfo.keyPrefix + key); - })); - executeCallback(promise, callback); - return promise; - } - function setItem$2(key, value, callback) { - var self = this; - key = normalizeKey(key); - var promise = self.ready().then((function() { - if (value === undefined) { - value = null; - } - var originalValue = value; - return new Promise$1((function(resolve, reject) { - var dbInfo = self._dbInfo; - dbInfo.serializer.serialize(value, (function(value, error) { - if (error) { - reject(error); - } else { - try { - localStorage.setItem(dbInfo.keyPrefix + key, value); - resolve(originalValue); - } catch (e) { - if (e.name === "QuotaExceededError" || e.name === "NS_ERROR_DOM_QUOTA_REACHED") { - reject(e); - } - reject(e); - } - } - })); - })); - })); - executeCallback(promise, callback); - return promise; - } - function dropInstance$2(options, callback) { - callback = getCallback.apply(this, arguments); - options = typeof options !== "function" && options || {}; - if (!options.name) { - var currentConfig = this.config(); - options.name = options.name || currentConfig.name; - options.storeName = options.storeName || currentConfig.storeName; - } - var self = this; - var promise; - if (!options.name) { - promise = Promise$1.reject("Invalid arguments"); - } else { - promise = new Promise$1((function(resolve) { - if (!options.storeName) { - resolve(options.name + "/"); - } else { - resolve(_getKeyPrefix(options, self._defaultConfig)); - } - })).then((function(keyPrefix) { - for (var i = localStorage.length - 1; i >= 0; i--) { - var key = localStorage.key(i); - if (key.indexOf(keyPrefix) === 0) { - localStorage.removeItem(key); - } - } - })); - } - executeCallback(promise, callback); - return promise; - } - var localStorageWrapper = { - _driver: "localStorageWrapper", - _initStorage: _initStorage$2, - _support: isLocalStorageValid(), - iterate: iterate$2, - getItem: getItem$2, - setItem: setItem$2, - removeItem: removeItem$2, - clear: clear$2, - length: length$2, - key: key$2, - keys: keys$2, - dropInstance: dropInstance$2 - }; - var sameValue = function sameValue(x, y) { - return x === y || typeof x === "number" && typeof y === "number" && isNaN(x) && isNaN(y); - }; - var includes = function includes(array, searchElement) { - var len = array.length; - var i = 0; - while (i < len) { - if (sameValue(array[i], searchElement)) { - return true; - } - i++; - } - return false; - }; - var isArray = Array.isArray || function(arg) { - return Object.prototype.toString.call(arg) === "[object Array]"; - }; - var DefinedDrivers = {}; - var DriverSupport = {}; - var DefaultDrivers = { - INDEXEDDB: asyncStorage, - WEBSQL: webSQLStorage, - LOCALSTORAGE: localStorageWrapper - }; - var DefaultDriverOrder = [ DefaultDrivers.INDEXEDDB._driver, DefaultDrivers.WEBSQL._driver, DefaultDrivers.LOCALSTORAGE._driver ]; - var OptionalDriverMethods = [ "dropInstance" ]; - var LibraryMethods = [ "clear", "getItem", "iterate", "key", "keys", "length", "removeItem", "setItem" ].concat(OptionalDriverMethods); - var DefaultConfig = { - description: "", - driver: DefaultDriverOrder.slice(), - name: "localforage", - size: 4980736, - storeName: "keyvaluepairs", - version: 1 - }; - function callWhenReady(localForageInstance, libraryMethod) { - localForageInstance[libraryMethod] = function() { - var _args = arguments; - return localForageInstance.ready().then((function() { - return localForageInstance[libraryMethod].apply(localForageInstance, _args); - })); - }; - } - function extend() { - for (var i = 1; i < arguments.length; i++) { - var arg = arguments[i]; - if (arg) { - for (var _key in arg) { - if (arg.hasOwnProperty(_key)) { - if (isArray(arg[_key])) { - arguments[0][_key] = arg[_key].slice(); - } else { - arguments[0][_key] = arg[_key]; - } - } - } - } - } - return arguments[0]; - } - var LocalForage = function() { - function LocalForage(options) { - _classCallCheck(this, LocalForage); - for (var driverTypeKey in DefaultDrivers) { - if (DefaultDrivers.hasOwnProperty(driverTypeKey)) { - var driver = DefaultDrivers[driverTypeKey]; - var driverName = driver._driver; - this[driverTypeKey] = driverName; - if (!DefinedDrivers[driverName]) { - this.defineDriver(driver); - } - } - } - this._defaultConfig = extend({}, DefaultConfig); - this._config = extend({}, this._defaultConfig, options); - this._driverSet = null; - this._initDriver = null; - this._ready = false; - this._dbInfo = null; - this._wrapLibraryMethodsWithReady(); - this.setDriver(this._config.driver)["catch"]((function() {})); - } - LocalForage.prototype.config = function config(options) { - if ((typeof options === "undefined" ? "undefined" : _typeof(options)) === "object") { - if (this._ready) { - return new Error("Can't call config() after localforage " + "has been used."); - } - for (var i in options) { - if (i === "storeName") { - options[i] = options[i].replace(/\W/g, "_"); - } - if (i === "version" && typeof options[i] !== "number") { - return new Error("Database version must be a number."); - } - this._config[i] = options[i]; - } - if ("driver" in options && options.driver) { - return this.setDriver(this._config.driver); - } - return true; - } else if (typeof options === "string") { - return this._config[options]; - } else { - return this._config; - } - }; - LocalForage.prototype.defineDriver = function defineDriver(driverObject, callback, errorCallback) { - var promise = new Promise$1((function(resolve, reject) { - try { - var driverName = driverObject._driver; - var complianceError = new Error("Custom driver not compliant; see " + "https://mozilla.github.io/localForage/#definedriver"); - if (!driverObject._driver) { - reject(complianceError); - return; - } - var driverMethods = LibraryMethods.concat("_initStorage"); - for (var i = 0, len = driverMethods.length; i < len; i++) { - var driverMethodName = driverMethods[i]; - var isRequired = !includes(OptionalDriverMethods, driverMethodName); - if ((isRequired || driverObject[driverMethodName]) && typeof driverObject[driverMethodName] !== "function") { - reject(complianceError); - return; - } - } - var configureMissingMethods = function configureMissingMethods() { - var methodNotImplementedFactory = function methodNotImplementedFactory(methodName) { - return function() { - var error = new Error("Method " + methodName + " is not implemented by the current driver"); - var promise = Promise$1.reject(error); - executeCallback(promise, arguments[arguments.length - 1]); - return promise; - }; - }; - for (var _i = 0, _len = OptionalDriverMethods.length; _i < _len; _i++) { - var optionalDriverMethod = OptionalDriverMethods[_i]; - if (!driverObject[optionalDriverMethod]) { - driverObject[optionalDriverMethod] = methodNotImplementedFactory(optionalDriverMethod); - } - } - }; - configureMissingMethods(); - var setDriverSupport = function setDriverSupport(support) { - if (DefinedDrivers[driverName]) { - console.info("Redefining LocalForage driver: " + driverName); - } - DefinedDrivers[driverName] = driverObject; - DriverSupport[driverName] = support; - resolve(); - }; - if ("_support" in driverObject) { - if (driverObject._support && typeof driverObject._support === "function") { - driverObject._support().then(setDriverSupport, reject); - } else { - setDriverSupport(!!driverObject._support); - } - } else { - setDriverSupport(true); - } - } catch (e) { - reject(e); - } - })); - executeTwoCallbacks(promise, callback, errorCallback); - return promise; - }; - LocalForage.prototype.driver = function driver() { - return this._driver || null; - }; - LocalForage.prototype.getDriver = function getDriver(driverName, callback, errorCallback) { - var getDriverPromise = DefinedDrivers[driverName] ? Promise$1.resolve(DefinedDrivers[driverName]) : Promise$1.reject(new Error("Driver not found.")); - executeTwoCallbacks(getDriverPromise, callback, errorCallback); - return getDriverPromise; - }; - LocalForage.prototype.getSerializer = function getSerializer(callback) { - var serializerPromise = Promise$1.resolve(localforageSerializer); - executeTwoCallbacks(serializerPromise, callback); - return serializerPromise; - }; - LocalForage.prototype.ready = function ready(callback) { - var self = this; - var promise = self._driverSet.then((function() { - if (self._ready === null) { - self._ready = self._initDriver(); - } - return self._ready; - })); - executeTwoCallbacks(promise, callback, callback); - return promise; - }; - LocalForage.prototype.setDriver = function setDriver(drivers, callback, errorCallback) { - var self = this; - if (!isArray(drivers)) { - drivers = [ drivers ]; - } - var supportedDrivers = this._getSupportedDrivers(drivers); - function setDriverToConfig() { - self._config.driver = self.driver(); - } - function extendSelfWithDriver(driver) { - self._extend(driver); - setDriverToConfig(); - self._ready = self._initStorage(self._config); - return self._ready; - } - function initDriver(supportedDrivers) { - return function() { - var currentDriverIndex = 0; - function driverPromiseLoop() { - while (currentDriverIndex < supportedDrivers.length) { - var driverName = supportedDrivers[currentDriverIndex]; - currentDriverIndex++; - self._dbInfo = null; - self._ready = null; - return self.getDriver(driverName).then(extendSelfWithDriver)["catch"](driverPromiseLoop); - } - setDriverToConfig(); - var error = new Error("No available storage method found."); - self._driverSet = Promise$1.reject(error); - return self._driverSet; - } - return driverPromiseLoop(); - }; - } - var oldDriverSetDone = this._driverSet !== null ? this._driverSet["catch"]((function() { - return Promise$1.resolve(); - })) : Promise$1.resolve(); - this._driverSet = oldDriverSetDone.then((function() { - var driverName = supportedDrivers[0]; - self._dbInfo = null; - self._ready = null; - return self.getDriver(driverName).then((function(driver) { - self._driver = driver._driver; - setDriverToConfig(); - self._wrapLibraryMethodsWithReady(); - self._initDriver = initDriver(supportedDrivers); - })); - }))["catch"]((function() { - setDriverToConfig(); - var error = new Error("No available storage method found."); - self._driverSet = Promise$1.reject(error); - return self._driverSet; - })); - executeTwoCallbacks(this._driverSet, callback, errorCallback); - return this._driverSet; - }; - LocalForage.prototype.supports = function supports(driverName) { - return !!DriverSupport[driverName]; - }; - LocalForage.prototype._extend = function _extend(libraryMethodsAndProperties) { - extend(this, libraryMethodsAndProperties); - }; - LocalForage.prototype._getSupportedDrivers = function _getSupportedDrivers(drivers) { - var supportedDrivers = []; - for (var i = 0, len = drivers.length; i < len; i++) { - var driverName = drivers[i]; - if (this.supports(driverName)) { - supportedDrivers.push(driverName); - } - } - return supportedDrivers; - }; - LocalForage.prototype._wrapLibraryMethodsWithReady = function _wrapLibraryMethodsWithReady() { - for (var i = 0, len = LibraryMethods.length; i < len; i++) { - callWhenReady(this, LibraryMethods[i]); - } - }; - LocalForage.prototype.createInstance = function createInstance(options) { - return new LocalForage(options); - }; - return LocalForage; - }(); - var localforage_js = new LocalForage; - module.exports = localforage_js; - }, { - 3: 3 - } ] - }, {}, [ 4 ])(4); - })); - })(localforage); - return localforage.exports; - } - var hasRequiredCacheStore; - function requireCacheStore() { - if (hasRequiredCacheStore) return cacheStore$1.exports; - hasRequiredCacheStore = 1; - (function(module) { - (() => { - const factory = (Util, localForage) => { - let window = globalThis; - let self = globalThis; - var S = window.CryptPad_Cache = {}; - var onReady = Util.mkEvent(true); - var allowed = false; - var disabled = false; - var supported = false; - try { - var request = window.indexedDB.open("test_db", 1); - request.onsuccess = function() { - supported = true; - allowed = supported && !disabled; - onReady.fire(); - }; - request.onerror = function() { - onReady.fire(); - }; - } catch (e) { - onReady.fire(); - } - S.enable = function() { - disabled = false; - allowed = supported && !disabled; - }; - S.disable = function() { - disabled = true; - allowed = supported && !disabled; - }; - S.isEnabled = () => allowed; - var cache = localForage.createInstance({ - driver: localForage.INDEXEDDB, - name: "cp_cache" - }); - S.getBlobCache = function(id, cb) { - cb = Util.once(Util.mkAsync(cb || function() {})); - onReady.reg((function() { - if (!allowed) { - return void cb("NOCACHE"); - } - cache.getItem(id, (function(err, obj) { - if (err || !obj || !obj.c) { - return void cb(Util.serializeError(err || "EINVAL")); - } - cb(null, obj.c); - obj.t = +new Date; - cache.setItem(id, obj, (function(err) { - if (!err) { - return; - } - console.error(err); - })); - })); - })); - }; - S.setBlobCache = function(id, u8, cb) { - cb = Util.once(Util.mkAsync(cb || function() {})); - onReady.reg((function() { - if (!allowed) { - return void cb("NOCACHE"); - } - if (!u8) { - return void cb("EINVAL"); - } - cache.setItem(id, { - c: u8, - t: +new Date - }, (function(err) { - cb(Util.serializeError(err)); - })); - })); - }; - S.getChannelCache = function(id, cb) { - cb = Util.once(Util.mkAsync(cb || function() {})); - onReady.reg((function() { - if (!allowed) { - return void cb("NOCACHE"); - } - cache.getItem(id, (function(err, obj) { - if (err || !obj || !Array.isArray(obj.c)) { - return void cb(Util.serializeError(err || "EINVAL")); - } - cb(null, obj); - obj.t = +new Date; - cache.setItem(id, obj, (function(err) { - if (!err) { - return; - } - console.error(err); - })); - })); - })); - }; - var checkCheckpoints = function(array) { - if (!Array.isArray(array)) { - return; - } - if (array.length > 100) { - array.splice(0, array.length - 100); - } - var firstCpIdx; - array.some((function(el, i) { - if (!el.isCheckpoint) { - return; - } - firstCpIdx = i; - return true; - })); - array.splice(0, firstCpIdx); - }; - var t = {}; - S.storeCache = function(id, validateKey, val, onError) { - onError = Util.once(Util.mkAsync(onError || function() {})); - onReady.reg((function() { - t[id] = t[id] || Util.throttle((function(validateKey, val, onError) { - if (!allowed) { - return void onError("NOCACHE"); - } - if (!Array.isArray(val) || !validateKey) { - return void onError("EINVAL"); - } - checkCheckpoints(val); - cache.setItem(id, { - k: validateKey, - c: val, - t: +new Date - }, (function(err) { - if (err) { - onError(Util.serializeError(err)); - } - })); - }), 50); - t[id](validateKey, val, onError); - })); - }; - S.leaveChannel = function(id) { - delete t[id]; - }; - S.clearChannel = function(id, cb) { - cb = Util.once(Util.mkAsync(cb || function() {})); - onReady.reg((function() { - if (!allowed) { - return void cb("NOCACHE"); - } - cache.removeItem(id, (function() { - cb(); - })); - })); - }; - S.clear = function(cb) { - cb = Util.once(Util.mkAsync(cb || function() {})); - onReady.reg((function() { - if (!allowed) { - return void cb("NOCACHE"); - } - cache.clear(cb); - })); - }; - S.getKeys = function(cb) { - cb = Util.once(Util.mkAsync(cb || function() {})); - onReady.reg((function() { - if (!allowed) { - return void cb("NOCACHE"); - } - cache.keys().then((function(keys) { - cb(null, keys); - })).catch((function(err) { - cb(err); - })); - })); - }; - S.getTime = function(id, cb) { - cb = Util.once(Util.mkAsync(cb || function() {})); - onReady.reg((function() { - if (!allowed) { - return void cb("NOCACHE"); - } - cache.getItem(id, (function(err, obj) { - if (err || !obj || !obj.c) { - return void cb(Util.serializeError(err || "EINVAL")); - } - cb(null, obj.t); - })); - })); - }; - self.CryptPad_clearIndexedDB = S.clear; - return S; - }; - if (module.exports) { - module.exports = factory(requireCommonUtil(), requireLocalforage()); - } - })(); - })(cacheStore$1); - return cacheStore$1.exports; - } - var cacheStoreExports = requireCacheStore(); - var cacheStore = getDefaultExportFromCjs(cacheStoreExports); - var Cache = _mergeNamespaces({ - __proto__: null, - default: cacheStore - }, [ cacheStoreExports ]); - const onCacheReadyEvt$1 = commonUtilExports.mkEvent(true); - const onReadyEvt$1 = commonUtilExports.mkEvent(true); - const onDisconnectEvt$1 = commonUtilExports.mkEvent(); - const onReconnectEvt$1 = commonUtilExports.mkEvent(); - let ApiConfig = {}; - const init$1 = config => { - var _a, _b; - const {broadcast, userHash, anonHash} = config; - const hash = userHash || anonHash || commonHashExports.createRandomHash("drive"); - const store = config.store; - const updateProgress = function(data) { - data.type = "drive"; - broadcast([], "LOADING_DRIVE", data); - }; - const secret = commonHashExports.getSecrets("drive", hash); - const listmapConfig = { - data: {}, - websocketURL: networkConfigExports.getWebsocketURL(), - network: (_a = config.store) === null || _a === void 0 ? void 0 : _a.network, - channel: secret.channel, - readOnly: false, - validateKey: ((_b = secret.keys) === null || _b === void 0 ? void 0 : _b.validateKey) || undefined, - crypto: cryptoExports.createEncryptor(secret.keys), - Cache, - userName: "fs", - logLevel: 1, - ChainPad, - updateProgress, - classic: true - }; - const rt = globalThis.CP_account_rt = chainpadListmapExports.create(listmapConfig); - store.driveSecret = secret; - store.proxy = rt.proxy; - store.onRpcReadyEvt = commonUtilExports.mkEvent(true); - store.loggedIn = typeof config.userHash !== "undefined"; - const returned = { - loggedIn: store.loggedIn - }; - rt.proxy.on("create", (function(info) { - store.realtime = info.realtime; - store.network = info.network; - if (!store.loggedIn) { - returned.anonHash = commonHashExports.getEditHashFromKeys(secret); - } - })).on("cacheready", (function(info) { - store.realtime = info.realtime; - store.offline = true; - store.networkPromise = info.networkPromise; - store.cacheReturned = returned; - if (store.networkPromise && store.networkPromise.then) { - const to = setTimeout((function() { - store.networkTimeout = true; - broadcast([], "LOADING_DRIVE", { - type: "offline" - }); - }), 5e3); - store.networkPromise.then((function(network) { - store.network || (store.network = network); - clearTimeout(to); - }), (function(err) { - console.error(err); - clearTimeout(to); - })); - } - if (!config.cache) { - return; - } - returned.edPublic = rt.proxy.edPublic; - onCacheReadyEvt$1.fire(returned); - })).on("ready", (function(info) { - delete store.networkTimeout; - if (store.ready) { - return; - } - store.driveMetadata = info.metadata; - if (!rt.proxy.drive) { - rt.proxy.drive = {}; - } - if (!rt.proxy[commonConstantsExports.displayNameKey] && store.noDriveName) { - rt.proxy[commonConstantsExports.displayNameKey] = store.noDriveName; - } - if (!rt.proxy.uid && store.noDriveUid) { - rt.proxy.uid = store.noDriveUid; - } - if (!rt.proxy.form_seed && config.form_seed) { - rt.proxy.form_seed = config.form_seed; - } - if (rt.proxy.edPublic && Array.isArray(ApiConfig.adminKeys) && ApiConfig.adminKeys.indexOf(rt.proxy.edPublic) !== -1) { - store.isAdmin = true; - } - returned.edPublic = rt.proxy.edPublic; - onReadyEvt$1.fire(returned); - })).on("error", (function(info) { - if (info.error !== "EDELETED") { - return; - } - if (store.ownDeletion) { - return; - } - store.isDeleted = true; - broadcast([], "DRIVE_DELETED", info.message); - })).on("disconnect", (function() { - store.offline = true; - onDisconnectEvt$1.fire(); - broadcast([], "UPDATE_METADATA"); - })).on("reconnect", (function() { - store.offline = false; - onReconnectEvt$1.fire(); - broadcast([], "UPDATE_METADATA"); - })); - return { - channel: secret.channel, - onAccountCacheReady: onCacheReadyEvt$1.reg, - onAccountReady: onReadyEvt$1.reg, - onDisconnect: onDisconnectEvt$1.reg, - onReconnect: onReconnectEvt$1.reg - }; - }; - const Account = { - setCustomize: data => { - ApiConfig = data.ApiConfig; - }, - init: init$1 - }; - var account = Object.freeze({ - __proto__: null, - Account - }); - var commonFeedback$1 = { - exports: {} - }; - var hasRequiredCommonFeedback; - function requireCommonFeedback() { - if (hasRequiredCommonFeedback) return commonFeedback$1.exports; - hasRequiredCommonFeedback = 1; - (function(module) { - (() => { - const factory = (AppConfig = {}, Messages = {}) => { - var Feedback = {}; - Feedback.setCustomize = data => { - Messages = data.Messages; - AppConfig = data.AppConfig; - }; - Feedback.init = function(state) { - Feedback.state = state; - }; - var randomToken = function() { - return Math.random().toString(16).replace(/0./, ""); - }; - var ajax = function(url, cb) { - var http = new XMLHttpRequest; - http.open("HEAD", url); - http.onreadystatechange = function() { - if (this.readyState === this.DONE) { - if (cb) { - cb(); - } - } - }; - http.send(); - }; - Feedback.send = function(action, force, cb) { - if (typeof cb !== "function") { - cb = function() {}; - } - if (AppConfig.disableFeedback) { - return void cb(); - } - if (!action) { - return void cb(); - } - if (force !== true) { - if (!Feedback.state) { - return void cb(); - } - } - var href = "/common/feedback.html?" + action + "=" + randomToken(); - ajax(href, cb); - }; - Feedback.reportAppUsage = function() { - var pattern = window.location.pathname.split("/").filter((function(x) { - return x; - })).join("."); - if (/^#\/1\/view\//.test(window.location.hash)) { - Feedback.send(pattern + "_VIEW"); - } else { - Feedback.send(pattern); - } - }; - Feedback.reportScreenDimensions = function() { - var h = window.innerHeight; - var w = window.innerWidth; - Feedback.send("DIMENSIONS:" + h + "x" + w); - }; - Feedback.reportLanguage = function() { - if (!Messages) { - return; - } - Feedback.send("LANG_" + Messages._languageUsed); - }; - return Feedback; - }; - if (module.exports) { - module.exports = factory(undefined, undefined); - } - })(); - })(commonFeedback$1); - return commonFeedback$1.exports; - } - var commonFeedbackExports = requireCommonFeedback(); - var commonFeedback = getDefaultExportFromCjs(commonFeedbackExports); - var Feedback = _mergeNamespaces({ - __proto__: null, - default: commonFeedback - }, [ commonFeedbackExports ]); - var commonCredential$1 = { - exports: {} - }; - var scryptAsync = { - exports: {} - }; - /*! - * Fast "async" scrypt implementation in JavaScript. - * Copyright (c) 2013-2015 Dmitry Chestnykh | BSD License - * https://github.com/dchest/scrypt-async-js - */ var hasRequiredScryptAsync; - function requireScryptAsync() { - if (hasRequiredScryptAsync) return scryptAsync.exports; - hasRequiredScryptAsync = 1; - (function(module) { - function scrypt(password, salt, logN, r, dkLen, interruptStep, callback, encoding) { - function SHA256(m) { - var K = [ 1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298 ]; - var h0 = 1779033703, h1 = 3144134277, h2 = 1013904242, h3 = 2773480762, h4 = 1359893119, h5 = 2600822924, h6 = 528734635, h7 = 1541459225, w = new Array(64); - function blocks(p) { - var off = 0, len = p.length; - while (len >= 64) { - var a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, h = h7, u, i, j, t1, t2; - for (i = 0; i < 16; i++) { - j = off + i * 4; - w[i] = (p[j] & 255) << 24 | (p[j + 1] & 255) << 16 | (p[j + 2] & 255) << 8 | p[j + 3] & 255; - } - for (i = 16; i < 64; i++) { - u = w[i - 2]; - t1 = (u >>> 17 | u << 32 - 17) ^ (u >>> 19 | u << 32 - 19) ^ u >>> 10; - u = w[i - 15]; - t2 = (u >>> 7 | u << 32 - 7) ^ (u >>> 18 | u << 32 - 18) ^ u >>> 3; - w[i] = (t1 + w[i - 7] | 0) + (t2 + w[i - 16] | 0) | 0; - } - for (i = 0; i < 64; i++) { - t1 = (((e >>> 6 | e << 32 - 6) ^ (e >>> 11 | e << 32 - 11) ^ (e >>> 25 | e << 32 - 25)) + (e & f ^ ~e & g) | 0) + (h + (K[i] + w[i] | 0) | 0) | 0; - t2 = ((a >>> 2 | a << 32 - 2) ^ (a >>> 13 | a << 32 - 13) ^ (a >>> 22 | a << 32 - 22)) + (a & b ^ a & c ^ b & c) | 0; - h = g; - g = f; - f = e; - e = d + t1 | 0; - d = c; - c = b; - b = a; - a = t1 + t2 | 0; - } - h0 = h0 + a | 0; - h1 = h1 + b | 0; - h2 = h2 + c | 0; - h3 = h3 + d | 0; - h4 = h4 + e | 0; - h5 = h5 + f | 0; - h6 = h6 + g | 0; - h7 = h7 + h | 0; - off += 64; - len -= 64; - } - } - blocks(m); - var i, bytesLeft = m.length % 64, bitLenHi = m.length / 536870912 | 0, bitLenLo = m.length << 3, numZeros = bytesLeft < 56 ? 56 : 120, p = m.slice(m.length - bytesLeft, m.length); - p.push(128); - for (i = bytesLeft + 1; i < numZeros; i++) p.push(0); - p.push(bitLenHi >>> 24 & 255); - p.push(bitLenHi >>> 16 & 255); - p.push(bitLenHi >>> 8 & 255); - p.push(bitLenHi >>> 0 & 255); - p.push(bitLenLo >>> 24 & 255); - p.push(bitLenLo >>> 16 & 255); - p.push(bitLenLo >>> 8 & 255); - p.push(bitLenLo >>> 0 & 255); - blocks(p); - return [ h0 >>> 24 & 255, h0 >>> 16 & 255, h0 >>> 8 & 255, h0 >>> 0 & 255, h1 >>> 24 & 255, h1 >>> 16 & 255, h1 >>> 8 & 255, h1 >>> 0 & 255, h2 >>> 24 & 255, h2 >>> 16 & 255, h2 >>> 8 & 255, h2 >>> 0 & 255, h3 >>> 24 & 255, h3 >>> 16 & 255, h3 >>> 8 & 255, h3 >>> 0 & 255, h4 >>> 24 & 255, h4 >>> 16 & 255, h4 >>> 8 & 255, h4 >>> 0 & 255, h5 >>> 24 & 255, h5 >>> 16 & 255, h5 >>> 8 & 255, h5 >>> 0 & 255, h6 >>> 24 & 255, h6 >>> 16 & 255, h6 >>> 8 & 255, h6 >>> 0 & 255, h7 >>> 24 & 255, h7 >>> 16 & 255, h7 >>> 8 & 255, h7 >>> 0 & 255 ]; - } - function PBKDF2_HMAC_SHA256_OneIter(password, salt, dkLen) { - password = password.length <= 64 ? password : SHA256(password); - var i, innerLen = 64 + salt.length + 4, inner = new Array(innerLen), outerKey = new Array(64), dk = []; - for (i = 0; i < 64; i++) inner[i] = 54; - for (i = 0; i < password.length; i++) inner[i] ^= password[i]; - for (i = 0; i < salt.length; i++) inner[64 + i] = salt[i]; - for (i = innerLen - 4; i < innerLen; i++) inner[i] = 0; - for (i = 0; i < 64; i++) outerKey[i] = 92; - for (i = 0; i < password.length; i++) outerKey[i] ^= password[i]; - function incrementCounter() { - for (var i = innerLen - 1; i >= innerLen - 4; i--) { - inner[i]++; - if (inner[i] <= 255) return; - inner[i] = 0; - } - } - while (dkLen >= 32) { - incrementCounter(); - dk = dk.concat(SHA256(outerKey.concat(SHA256(inner)))); - dkLen -= 32; - } - if (dkLen > 0) { - incrementCounter(); - dk = dk.concat(SHA256(outerKey.concat(SHA256(inner))).slice(0, dkLen)); - } - return dk; - } - function salsaXOR(tmp, B, bin, bout) { - var j0 = tmp[0] ^ B[bin++], j1 = tmp[1] ^ B[bin++], j2 = tmp[2] ^ B[bin++], j3 = tmp[3] ^ B[bin++], j4 = tmp[4] ^ B[bin++], j5 = tmp[5] ^ B[bin++], j6 = tmp[6] ^ B[bin++], j7 = tmp[7] ^ B[bin++], j8 = tmp[8] ^ B[bin++], j9 = tmp[9] ^ B[bin++], j10 = tmp[10] ^ B[bin++], j11 = tmp[11] ^ B[bin++], j12 = tmp[12] ^ B[bin++], j13 = tmp[13] ^ B[bin++], j14 = tmp[14] ^ B[bin++], j15 = tmp[15] ^ B[bin++], u, i; - var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, x15 = j15; - for (i = 0; i < 8; i += 2) { - u = x0 + x12; - x4 ^= u << 7 | u >>> 32 - 7; - u = x4 + x0; - x8 ^= u << 9 | u >>> 32 - 9; - u = x8 + x4; - x12 ^= u << 13 | u >>> 32 - 13; - u = x12 + x8; - x0 ^= u << 18 | u >>> 32 - 18; - u = x5 + x1; - x9 ^= u << 7 | u >>> 32 - 7; - u = x9 + x5; - x13 ^= u << 9 | u >>> 32 - 9; - u = x13 + x9; - x1 ^= u << 13 | u >>> 32 - 13; - u = x1 + x13; - x5 ^= u << 18 | u >>> 32 - 18; - u = x10 + x6; - x14 ^= u << 7 | u >>> 32 - 7; - u = x14 + x10; - x2 ^= u << 9 | u >>> 32 - 9; - u = x2 + x14; - x6 ^= u << 13 | u >>> 32 - 13; - u = x6 + x2; - x10 ^= u << 18 | u >>> 32 - 18; - u = x15 + x11; - x3 ^= u << 7 | u >>> 32 - 7; - u = x3 + x15; - x7 ^= u << 9 | u >>> 32 - 9; - u = x7 + x3; - x11 ^= u << 13 | u >>> 32 - 13; - u = x11 + x7; - x15 ^= u << 18 | u >>> 32 - 18; - u = x0 + x3; - x1 ^= u << 7 | u >>> 32 - 7; - u = x1 + x0; - x2 ^= u << 9 | u >>> 32 - 9; - u = x2 + x1; - x3 ^= u << 13 | u >>> 32 - 13; - u = x3 + x2; - x0 ^= u << 18 | u >>> 32 - 18; - u = x5 + x4; - x6 ^= u << 7 | u >>> 32 - 7; - u = x6 + x5; - x7 ^= u << 9 | u >>> 32 - 9; - u = x7 + x6; - x4 ^= u << 13 | u >>> 32 - 13; - u = x4 + x7; - x5 ^= u << 18 | u >>> 32 - 18; - u = x10 + x9; - x11 ^= u << 7 | u >>> 32 - 7; - u = x11 + x10; - x8 ^= u << 9 | u >>> 32 - 9; - u = x8 + x11; - x9 ^= u << 13 | u >>> 32 - 13; - u = x9 + x8; - x10 ^= u << 18 | u >>> 32 - 18; - u = x15 + x14; - x12 ^= u << 7 | u >>> 32 - 7; - u = x12 + x15; - x13 ^= u << 9 | u >>> 32 - 9; - u = x13 + x12; - x14 ^= u << 13 | u >>> 32 - 13; - u = x14 + x13; - x15 ^= u << 18 | u >>> 32 - 18; - } - B[bout++] = tmp[0] = x0 + j0 | 0; - B[bout++] = tmp[1] = x1 + j1 | 0; - B[bout++] = tmp[2] = x2 + j2 | 0; - B[bout++] = tmp[3] = x3 + j3 | 0; - B[bout++] = tmp[4] = x4 + j4 | 0; - B[bout++] = tmp[5] = x5 + j5 | 0; - B[bout++] = tmp[6] = x6 + j6 | 0; - B[bout++] = tmp[7] = x7 + j7 | 0; - B[bout++] = tmp[8] = x8 + j8 | 0; - B[bout++] = tmp[9] = x9 + j9 | 0; - B[bout++] = tmp[10] = x10 + j10 | 0; - B[bout++] = tmp[11] = x11 + j11 | 0; - B[bout++] = tmp[12] = x12 + j12 | 0; - B[bout++] = tmp[13] = x13 + j13 | 0; - B[bout++] = tmp[14] = x14 + j14 | 0; - B[bout++] = tmp[15] = x15 + j15 | 0; - } - function blockCopy(dst, di, src, si, len) { - while (len--) dst[di++] = src[si++]; - } - function blockXOR(dst, di, src, si, len) { - while (len--) dst[di++] ^= src[si++]; - } - function blockMix(tmp, B, bin, bout, r) { - blockCopy(tmp, 0, B, bin + (2 * r - 1) * 16, 16); - for (var i = 0; i < 2 * r; i += 2) { - salsaXOR(tmp, B, bin + i * 16, bout + i * 8); - salsaXOR(tmp, B, bin + i * 16 + 16, bout + i * 8 + r * 16); - } - } - function integerify(B, bi, r) { - return B[bi + (2 * r - 1) * 16]; - } - function stringToUTF8Bytes(s) { - var arr = []; - for (var i = 0; i < s.length; i++) { - var c = s.charCodeAt(i); - if (c < 128) { - arr.push(c); - } else if (c > 127 && c < 2048) { - arr.push(c >> 6 | 192); - arr.push(c & 63 | 128); - } else { - arr.push(c >> 12 | 224); - arr.push(c >> 6 & 63 | 128); - arr.push(c & 63 | 128); - } - } - return arr; - } - function bytesToHex(p) { - var enc = "0123456789abcdef".split(""); - var len = p.length, arr = [], i = 0; - for (;i < len; i++) { - arr.push(enc[p[i] >>> 4 & 15]); - arr.push(enc[p[i] >>> 0 & 15]); - } - return arr.join(""); - } - function bytesToBase64(p) { - var enc = ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789+/").split(""); - var len = p.length, arr = [], i = 0, a, b, c, t; - while (i < len) { - a = i < len ? p[i++] : 0; - b = i < len ? p[i++] : 0; - c = i < len ? p[i++] : 0; - t = (a << 16) + (b << 8) + c; - arr.push(enc[t >>> 3 * 6 & 63]); - arr.push(enc[t >>> 2 * 6 & 63]); - arr.push(enc[t >>> 1 * 6 & 63]); - arr.push(enc[t >>> 0 * 6 & 63]); - } - if (len % 3 > 0) { - arr[arr.length - 1] = "="; - if (len % 3 === 1) arr[arr.length - 2] = "="; - } - return arr.join(""); - } - var p = 1; - if (logN < 1 || logN > 31) throw new Error("scrypt: logN not be between 1 and 31"); - var MAX_INT = 1 << 31 >>> 0, N = 1 << logN >>> 0, XY, V, B, tmp; - if (r * p >= 1 << 30 || r > MAX_INT / 128 / p || r > MAX_INT / 256 || N > MAX_INT / 128 / r) throw new Error("scrypt: parameters are too large"); - if (typeof password === "string") password = stringToUTF8Bytes(password); - if (typeof salt === "string") salt = stringToUTF8Bytes(salt); - if (typeof Int32Array !== "undefined") { - XY = new Int32Array(64 * r); - V = new Int32Array(32 * N * r); - tmp = new Int32Array(16); - } else { - XY = []; - V = []; - tmp = new Array(16); - } - B = PBKDF2_HMAC_SHA256_OneIter(password, salt, p * 128 * r); - var xi = 0, yi = 32 * r; - function smixStart() { - for (var i = 0; i < 32 * r; i++) { - var j = i * 4; - XY[xi + i] = (B[j + 3] & 255) << 24 | (B[j + 2] & 255) << 16 | (B[j + 1] & 255) << 8 | (B[j + 0] & 255) << 0; - } - } - function smixStep1(start, end) { - for (var i = start; i < end; i += 2) { - blockCopy(V, i * (32 * r), XY, xi, 32 * r); - blockMix(tmp, XY, xi, yi, r); - blockCopy(V, (i + 1) * (32 * r), XY, yi, 32 * r); - blockMix(tmp, XY, yi, xi, r); - } - } - function smixStep2(start, end) { - for (var i = start; i < end; i += 2) { - var j = integerify(XY, xi, r) & N - 1; - blockXOR(XY, xi, V, j * (32 * r), 32 * r); - blockMix(tmp, XY, xi, yi, r); - j = integerify(XY, yi, r) & N - 1; - blockXOR(XY, yi, V, j * (32 * r), 32 * r); - blockMix(tmp, XY, yi, xi, r); - } - } - function smixFinish() { - for (var i = 0; i < 32 * r; i++) { - var j = XY[xi + i]; - B[i * 4 + 0] = j >>> 0 & 255; - B[i * 4 + 1] = j >>> 8 & 255; - B[i * 4 + 2] = j >>> 16 & 255; - B[i * 4 + 3] = j >>> 24 & 255; - } - } - var nextTick = typeof setImmediate !== "undefined" ? setImmediate : setTimeout; - function interruptedFor(start, end, step, fn, donefn) { - (function performStep() { - nextTick((function() { - fn(start, start + step < end ? start + step : end); - start += step; - if (start < end) performStep(); else donefn(); - })); - })(); - } - function getResult(enc) { - var result = PBKDF2_HMAC_SHA256_OneIter(password, B, dkLen); - if (enc === "base64") return bytesToBase64(result); else if (enc === "hex") return bytesToHex(result); else return result; - } - if (typeof interruptStep === "function") { - encoding = callback; - callback = interruptStep; - interruptStep = 1e3; - } - if (interruptStep <= 0) { - smixStart(); - smixStep1(0, N); - smixStep2(0, N); - smixFinish(); - callback(getResult(encoding)); - } else { - smixStart(); - interruptedFor(0, N, interruptStep * 2, smixStep1, (function() { - interruptedFor(0, N, interruptStep * 2, smixStep2, (function() { - smixFinish(); - callback(getResult(encoding)); - })); - })); - } - } - module.exports = scrypt; - })(scryptAsync); - return scryptAsync.exports; - } - var hasRequiredCommonCredential; - function requireCommonCredential() { - if (hasRequiredCommonCredential) return commonCredential$1.exports; - hasRequiredCommonCredential = 1; - (function(module) { - (function() { - var factory = function(AppConfig = {}, Scrypt) { - var Cred = {}; - Cred.setCustomize = data => { - AppConfig = data.AppConfig; - }; - Cred.MINIMUM_PASSWORD_LENGTH = typeof AppConfig.minimumPasswordLength === "number" ? AppConfig.minimumPasswordLength : 8; - Cred.MINIMUM_NAME_LENGTH = 1; - Cred.MAXIMUM_NAME_LENGTH = 64; - Cred.isEmail = function(email) { - var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - return re.test(String(email).toLowerCase()); - }; - Cred.isLongEnoughPassword = function(passwd) { - return passwd.length >= Cred.MINIMUM_PASSWORD_LENGTH; - }; - var isString = Cred.isString = function(x) { - return typeof x === "string"; - }; - Cred.isValidUsername = function(name) { - return !!(isString(name) && name.length >= Cred.MINIMUM_NAME_LENGTH); - }; - Cred.isValidPassword = function(passwd) { - return !!(passwd && isString(passwd)); - }; - Cred.passwordsMatch = function(a, b) { - return isString(a) && isString(b) && a === b; - }; - Cred.customSalt = function() { - return typeof AppConfig.loginSalt === "string" ? AppConfig.loginSalt : ""; - }; - Cred.deriveFromPassphrase = function(username, password, len, cb) { - Scrypt(password, username + Cred.customSalt(), 8, 1024, len || 128, 200, cb, undefined); - }; - Cred.dispenser = function(bytes) { - var entropy = { - used: 0 - }; - var consume = function(n) { - if (entropy.used + n > bytes.length) { - throw new Error("exceeded available entropy"); - } - if (typeof n !== "number") { - throw new Error("expected a number"); - } - if (n <= 0) { - throw new Error("expected to consume a positive number of bytes"); - } - var A; - if (bytes.slice) { - A = bytes.slice(entropy.used, entropy.used + n); - } else { - A = bytes.subarray(entropy.used, entropy.used + n); - } - entropy.used += n; - return A; - }; - return consume; - }; - return Cred; - }; - if (module.exports) { - module.exports = factory(undefined, requireScryptAsync()); - } - })(); - })(commonCredential$1); - return commonCredential$1.exports; - } - var commonCredentialExports = requireCommonCredential(); - var commonCredential = getDefaultExportFromCjs(commonCredentialExports); - var Credential = _mergeNamespaces({ - __proto__: null, - default: commonCredential - }, [ commonCredentialExports ]); - var proxyManager$1 = { - exports: {} - }; - var userObject$1 = { - exports: {} - }; - var userObjectSetter = { - exports: {} - }; - var commonRealtime = { - exports: {} - }; - var hasRequiredCommonRealtime; - function requireCommonRealtime() { - if (hasRequiredCommonRealtime) return commonRealtime.exports; - hasRequiredCommonRealtime = 1; - (function(module) { - (() => { - const factory = () => { - var common = {}; - common.whenRealtimeSyncs = function(realtime, cb) { - if (typeof realtime.getAuthDoc !== "function") { - return void console.error("improper use of this function"); - } - setTimeout((function() { - if (realtime.getAuthDoc() === realtime.getUserDoc()) { - return void cb(); - } else { - realtime.onSettle(cb); - } - }), 0); - }; - return common; - }; - if (module.exports) { - module.exports = factory(); - } - })(); - })(commonRealtime); - return commonRealtime.exports; - } - var hasRequiredUserObjectSetter; - function requireUserObjectSetter() { - if (hasRequiredUserObjectSetter) return userObjectSetter.exports; - hasRequiredUserObjectSetter = 1; - (function(module) { - (() => { - const factory = (Util, Hash, Realtime) => { - let window = globalThis; - var module = {}; - module.setCustomize = () => {}; - var clone = function(o) { - try { - return JSON.parse(JSON.stringify(o)); - } catch (e) { - return undefined; - } - }; - module.init = function(config, exp, files) { - var loggedIn = config.loggedIn; - var sharedFolder = config.sharedFolder; - var readOnly = config.readOnly; - var Messages = config.Messages || {}; - var ROOT = exp.ROOT; - var FILES_DATA = exp.FILES_DATA; - var STATIC_DATA = exp.STATIC_DATA; - var OLD_FILES_DATA = exp.OLD_FILES_DATA; - var UNSORTED = exp.UNSORTED; - var TRASH = exp.TRASH; - var TEMPLATE = exp.TEMPLATE; - var SHARED_FOLDERS = exp.SHARED_FOLDERS; - var SHARED_FOLDERS_TEMP = exp.SHARED_FOLDERS_TEMP; - var debug = exp.debug; - exp._setReadOnly = function(state) { - readOnly = state; - if (!readOnly) { - exp.fixFiles(); - } - }; - exp.setHref = function(channel, id, href) { - if (!id && !channel) { - return; - } - if (readOnly) { - return; - } - var ids = id ? [ id ] : exp.findChannels([ channel ]); - ids.forEach((function(i) { - var data = exp.getFileData(i, true); - var oldHref = exp.getHref(data); - if (oldHref === href) { - return; - } - data.href = exp.cryptor.encrypt(href); - })); - }; - exp.setPadAttribute = function(href, attr, value, cb) { - cb = cb || function() {}; - if (readOnly) { - return void cb("EFORBIDDEN"); - } - var id = exp.getIdFromHref(href); - if (!id) { - return void cb("E_INVAL_HREF"); - } - if (!attr || !attr.trim()) { - return void cb("E_INVAL_ATTR"); - } - var data = exp.getFileData(id, true); - if (attr === "href") { - exp.setHref(null, id, value); - } else { - data[attr] = clone(value); - } - cb(null); - }; - exp.getPadAttribute = function(href, attr, cb) { - cb = cb || function() {}; - var id = exp.getIdFromHref(href); - if (!id) { - return void cb(null, undefined); - } - var data = exp.getFileData(id); - cb(null, clone(data[attr])); - }; - exp.pushData = function(_data, cb) { - if (typeof cb !== "function") { - cb = function() {}; - } - if (readOnly) { - return void cb("EFORBIDDEN"); - } - var id = Util.createRandomInteger(); - var data = clone(_data); - if (data.href && data.href.indexOf("#") !== -1) { - data.href = exp.cryptor.encrypt(data.href); - } - files[FILES_DATA][id] = data; - cb(null, id); - }; - exp.pushLink = function(_data, cb) { - if (typeof cb !== "function") { - cb = function() {}; - } - if (readOnly) { - return void cb("EFORBIDDEN"); - } - var id = Util.createRandomInteger(); - var data = clone(_data); - files[STATIC_DATA][id] = data; - cb(null, id); - }; - exp.pushSharedFolder = function(_data, cb) { - if (typeof cb !== "function") { - cb = function() {}; - } - if (readOnly) { - return void cb("EFORBIDDEN"); - } - var data = clone(_data); - var exists; - if (Object.keys(files[SHARED_FOLDERS]).some((function(k) { - if (files[SHARED_FOLDERS][k].channel === data.channel) { - if (data.href && !files[SHARED_FOLDERS][k].href) { - files[SHARED_FOLDERS][k].href = data.href; - } - exists = k; - return true; - } - }))) { - return void cb("EEXISTS", exists); - } - if (!loggedIn || config.testMode) { - return void cb("EAUTH"); - } - var id = Util.createRandomInteger(); - if (data.href && data.href.indexOf("#") !== -1) { - data.href = exp.cryptor.encrypt(data.href); - } - files[SHARED_FOLDERS][id] = data; - cb(null, id); - }; - exp.deprecateSharedFolder = function(id, reason) { - if (readOnly) { - return; - } - var data = files[SHARED_FOLDERS][id]; - if (!data) { - return; - } - var ro = !data.href || exp.cryptor.decrypt(data.href).indexOf("#") === -1; - if (!ro) { - var obj = files[SHARED_FOLDERS_TEMP][id] = JSON.parse(JSON.stringify(data)); - obj.legacy = reason !== "PASSWORD_CHANGE"; - } - var paths = exp.findFile(Number(id)); - exp.delete(paths, null, true); - delete files[SHARED_FOLDERS][id]; - }; - var spliceFileData = function(id) { - if (readOnly) { - return; - } - delete files[FILES_DATA][id]; - }; - exp.checkDeletedFiles = function(cb) { - if (!loggedIn && !config.testMode) { - return void cb(); - } - if (readOnly) { - return void cb("EFORBIDDEN"); - } - var filesList = exp.getFiles([ ROOT, "hrefArray", TRASH ]); - var toClean = []; - exp.getFiles([ FILES_DATA, SHARED_FOLDERS, STATIC_DATA ]).forEach((function(id) { - if (filesList.indexOf(id) === -1) { - var fd = exp.isSharedFolder(id) ? files[SHARED_FOLDERS][id] : exp.getFileData(id); - var channelId = fd.channel; - if (fd.lastVersion) { - toClean.push(Hash.hrefToHexChannelId(fd.lastVersion)); - } - if (fd.rtChannel) { - toClean.push(fd.rtChannel); - } - if (channelId) { - toClean.push(channelId); - } - if (exp.isSharedFolder(id)) { - delete files[SHARED_FOLDERS][id]; - if (config.removeProxy) { - config.removeProxy(id); - } - } else if (files[STATIC_DATA][id]) { - delete files[STATIC_DATA][id]; - } else { - spliceFileData(id); - } - } - })); - if (!toClean.length) { - return void cb(); - } - cb(null, toClean); - }; - var deleteHrefs = function(ids) { - if (readOnly) { - return; - } - ids.forEach((function(obj) { - var idx = files[obj.root].indexOf(obj.id); - files[obj.root].splice(idx, 1); - })); - }; - var deleteMultipleTrashRoot = function(roots) { - if (readOnly) { - return; - } - roots.forEach((function(obj) { - var idx = files[TRASH][obj.name].indexOf(obj.el); - files[TRASH][obj.name].splice(idx, 1); - })); - }; - exp.deleteMultiplePermanently = function(paths, nocheck, cb) { - if (readOnly) { - return void cb("EFORBIDDEN"); - } - var allFilesPaths = paths.filter((function(x) { - return exp.isPathIn(x, [ FILES_DATA ]); - })); - if (!loggedIn && !config.testMode) { - allFilesPaths.forEach((function(path) { - var id = path[1]; - if (!id) { - return; - } - spliceFileData(id); - })); - return void cb(); - } - var hrefPaths = paths.filter((function(x) { - return exp.isPathIn(x, [ "hrefArray" ]); - })); - var rootPaths = paths.filter((function(x) { - return exp.isPathIn(x, [ ROOT ]); - })); - var trashPaths = paths.filter((function(x) { - return exp.isPathIn(x, [ TRASH ]); - })); - var ids = []; - hrefPaths.forEach((function(path) { - var id = exp.find(path); - ids.push({ - root: path[0], - id - }); - })); - deleteHrefs(ids); - rootPaths.forEach((function(path) { - var parentPath = path.slice(); - var key = parentPath.pop(); - var parentEl = exp.find(parentPath); - delete parentEl[key]; - })); - var trashRoot = []; - trashPaths.forEach((function(path) { - var parentPath = path.slice(); - var key = parentPath.pop(); - var parentEl = exp.find(parentPath); - if (path.length === 4) { - trashRoot.push({ - name: path[1], - el: parentEl - }); - return; - } - delete parentEl[key]; - })); - deleteMultipleTrashRoot(trashRoot); - if (!nocheck) { - exp.checkDeletedFiles(cb); - } else { - cb(); - } - }; - exp.copyFromOtherDrive = function(path, element, data, key) { - if (readOnly) { - return; - } - var toRemove = []; - Object.keys(data).forEach((function(id) { - id = Number(id); - var d = data[id]; - if (d.static) { - delete d.static; - files[STATIC_DATA][id] = d; - return; - } - if (d.href) { - d.href = exp.cryptor.encrypt(d.href); - } - var found = false; - for (var i in files[FILES_DATA]) { - if (files[FILES_DATA][i].channel === d.channel) { - if (!files[FILES_DATA][i].href) { - files[FILES_DATA][i].href = d.href; - } - found = true; - break; - } - } - if (found) { - toRemove.push(id); - return; - } - files[FILES_DATA][id] = d; - })); - if (exp.isFile(element) && toRemove.indexOf(element) !== -1) { - exp.log(Messages.sharedFolders_duplicate); - return; - } else if (exp.isFolder(element)) { - var _removeExisting = function(root) { - for (var k in root) { - if (exp.isFile(root[k])) { - if (toRemove.indexOf(root[k]) !== -1) { - exp.log(Messages.sharedFolders_duplicate); - delete root[k]; - } - } else if (exp.isFolder(root[k])) { - _removeExisting(root[k]); - } - } - }; - _removeExisting(element); - } - var newParent = exp.find(path); - var tempName = exp.isFile(element) ? Hash.createChannelId() : key; - var newName = exp.getAvailableName(newParent, tempName); - if (Array.isArray(newParent)) { - newParent.push(element); - return; - } - newParent[newName] = element; - }; - var pushToTrash = function(name, element, path) { - if (readOnly) { - return; - } - var trash = files[TRASH]; - if (typeof trash[name] === "undefined") { - trash[name] = []; - } - var trashArray = trash[name]; - var trashElement = { - element, - path - }; - trashArray.push(trashElement); - }; - exp.copyElement = function(elementPath, newParentPath) { - if (readOnly) { - return; - } - if (exp.comparePath(elementPath, newParentPath)) { - return; - } - var element = exp.find(elementPath); - var newParent = exp.find(newParentPath); - if (exp.isPathIn(newParentPath, [ TRASH ])) { - if (!elementPath || elementPath.length < 2 || elementPath[0] === TRASH) { - debug("Can't move an element from the trash to the trash: ", elementPath); - return; - } - var key = elementPath[elementPath.length - 1]; - var elName = exp.isPathIn(elementPath, [ "hrefArray" ]) ? exp.getTitle(element) : key; - var parentPath = elementPath.slice(); - parentPath.pop(); - pushToTrash(elName, element, parentPath); - return true; - } - if (exp.isPathIn(newParentPath, [ "hrefArray" ])) { - if (exp.isFolder(element)) { - exp.log(Messages.fo_moveUnsortedError); - return; - } else { - if (elementPath[0] === newParentPath[0]) { - return; - } - var fileRoot = newParentPath[0]; - if (files[fileRoot].indexOf(element) === -1) { - files[fileRoot].push(element); - } - return true; - } - } - var newName = exp.isFile(element) ? exp.getAvailableName(newParent, Hash.createChannelId()) : exp.isInTrashRoot(elementPath) ? elementPath[1] : elementPath.pop(); - if (typeof newParent[newName] !== "undefined") { - exp.log(Messages.fo_unavailableName); - return; - } - newParent[newName] = element; - return true; - }; - exp.forget = function(href) { - if (readOnly) { - return; - } - var id = exp.getIdFromHref(href); - if (!id) { - return; - } - if (!loggedIn && !config.testMode) { - spliceFileData(id); - return true; - } - var paths = exp.findFile(id); - exp.move(paths, [ TRASH ]); - return true; - }; - exp.restoreHref = function(href) { - if (readOnly) { - return; - } - var idO = exp.getIdFromHref(href); - if (!idO || !exp.isFile(idO)) { - return; - } - var paths = exp.findFile(idO); - var allInTrash = true; - paths.forEach((function(p) { - if (p[0] === TRASH) { - exp.delete(p, null, true); - return; - } - allInTrash = false; - })); - if (allInTrash) { - exp.add(idO); - } - }; - exp.add = function(id, path) { - if (readOnly) { - return; - } - if (!loggedIn && !config.testMode) { - return; - } - id = Number(id); - var data = files[FILES_DATA][id] || files[STATIC_DATA][id] || files[SHARED_FOLDERS][id]; - if (!data || typeof data !== "object") { - return; - } - var newPath = path, parentEl; - if (path && !Array.isArray(path)) { - newPath = decodeURIComponent(path).split(","); - } - if (path && exp.isPathIn(newPath, [ "hrefArray" ])) { - parentEl = exp.find(newPath); - parentEl.push(id); - return; - } - var filesList = exp.getFiles([ ROOT, TRASH, "hrefArray" ]); - if (filesList.indexOf(id) === -1 && !newPath) { - newPath = [ ROOT ]; - } - if (path && exp.isPathIn(newPath, [ ROOT ])) { - parentEl = exp.find(newPath); - if (parentEl) { - var newName = exp.getAvailableName(parentEl, Hash.createChannelId()); - parentEl[newName] = id; - return; - } else { - parentEl = exp.find([ ROOT ]); - newPath.slice(1).forEach((function(folderName) { - parentEl = parentEl[folderName] = parentEl[folderName] || {}; - })); - parentEl[Hash.createChannelId()] = id; - } - } - }; - exp.setFolderData = function(path, key, value, cb) { - if (readOnly) { - return; - } - var folder = exp.find(path); - if (!exp.isFolder(folder) || exp.isSharedFolder(folder)) { - return; - } - if (!exp.hasFolderData(folder)) { - var hashKey = "000" + Hash.createChannelId().slice(0, -3); - folder[hashKey] = { - metadata: true - }; - } - exp.getFolderData(folder)[key] = value; - cb(); - }; - var onSync = function(next) { - if (exp.rt) { - exp.rt.sync(); - Realtime.whenRealtimeSyncs(exp.rt, next); - } else { - window.setTimeout(next, 1e3); - } - }; - exp.migrateReadOnly = function(cb) { - if (readOnly || !config.editKey) { - return void cb({ - error: "EFORBIDDEN" - }); - } - if (files.version >= 2) { - return void cb(); - } - files.migrateRo = 1; - var next = function() { - var copy = JSON.parse(JSON.stringify(files)); - exp.reencrypt(config.editKey, config.editKey, copy); - setTimeout((function() { - if (files.version >= 2) { - return void cb(); - } - Object.keys(copy).forEach((function(k) { - files[k] = copy[k]; - })); - files.version = 2; - delete files.migrateRo; - onSync(cb); - }), 1e3); - }; - onSync(next); - }; - exp.migrate = function(cb) { - if (readOnly) { - return void cb(); - } - var fixUnsorted = function() { - if (!files[UNSORTED] || !files[OLD_FILES_DATA]) { - return; - } - debug("UNSORTED still exists in the object, removing it..."); - var us = files[UNSORTED]; - if (us.length === 0) { - delete files[UNSORTED]; - return; - } - us.forEach((function(el) { - if (typeof el !== "string") { - return; - } - var data = files[OLD_FILES_DATA].filter((function(x) { - return x.href === el; - })); - if (data.length === 0) { - files[OLD_FILES_DATA].push({ - href: el - }); - } - return; - })); - delete files[UNSORTED]; - }; - var migrateToNewFormat = function(todo) { - if (!files[OLD_FILES_DATA]) { - return void todo(); - } - try { - debug("Migrating file system..."); - files.migrate = 1; - var next = function() { - var oldData = files[OLD_FILES_DATA].slice(); - if (!files[FILES_DATA]) { - files[FILES_DATA] = {}; - } - var newData = files[FILES_DATA]; - oldData.forEach((function(obj) { - if (!obj || !obj.href) { - return; - } - var href = obj.href; - var id = Util.createRandomInteger(); - var paths = exp.findFile(href); - var data = obj; - var key = Hash.createChannelId(); - if (data) { - newData[id] = data; - } else { - newData[id] = { - href - }; - } - paths.forEach((function(p) { - var parentPath = p.slice(); - var okey = parentPath.pop(); - var parent = exp.find(parentPath); - if (exp.isInTrashRoot(p)) { - parent.element = id; - newData[id].filename = p[1]; - return; - } - if (exp.isPathIn(p, [ "hrefArray" ])) { - parent[okey] = id; - return; - } - parent[key] = id; - newData[id].filename = okey; - delete parent[okey]; - })); - })); - delete files[OLD_FILES_DATA]; - delete files.migrate; - todo(); - }; - onSync(next); - } catch (e) { - console.error(e); - todo(); - } - }; - fixUnsorted(); - migrateToNewFormat(cb); - }; - exp.fixFiles = function(silent) { - if (readOnly) { - return; - } - if (silent) { - debug = function() {}; - } - var t0 = +new Date; - debug("Cleaning file system..."); - var before = JSON.stringify(files); - var fixRoot = function(elem) { - if (typeof files[ROOT] !== "object") { - debug("ROOT was not an object"); - files[ROOT] = {}; - } - var element = elem || files[ROOT]; - if (!element) { - return console.error("Invalid element in root"); - } - var nbMetadataFolders = 0; - var static_data = files[STATIC_DATA]; - var files_data = files[FILES_DATA]; - var element_el; - for (var el in element) { - element_el = element[el]; - if (element_el === null) { - console.error("element[%s] is null", el); - delete element[el]; - continue; - } - if (exp.isFolderData(element_el)) { - if (nbMetadataFolders !== 0) { - debug("Multiple metadata files in folder"); - delete element[el]; - } - nbMetadataFolders++; - continue; - } - if (!exp.isFile(element_el, true) && !exp.isFolder(element_el)) { - debug("An element in ROOT was not a folder nor a file. ", element_el); - delete element[el]; - continue; - } - if (exp.isFolder(element_el)) { - fixRoot(element_el); - continue; - } - if (typeof element_el === "string") { - var id = Util.createRandomInteger(); - var key = Hash.createChannelId(); - files_data[id] = { - href: exp.cryptor.encrypt(element_el), - filename: el - }; - element[key] = id; - delete element[el]; - } - if (typeof element_el === "number") { - var data = files_data[element_el] || static_data[element_el]; - if (!data) { - debug("An element in ROOT doesn't have associated data", element_el, el); - delete element[el]; - } - } - } - }; - var fixTrashRoot = function() { - if (sharedFolder) { - return; - } - if (typeof files[TRASH] !== "object") { - debug("TRASH was not an object"); - files[TRASH] = {}; - } - var tr = files[TRASH]; - var toClean; - var addToClean = function(obj, idx, el) { - if (typeof obj !== "object") { - toClean.push(idx); - return; - } - if (exp.isSharedFolder(obj.element)) { - return; - } - if (!exp.isFile(obj.element, true) && !exp.isFolder(obj.element)) { - toClean.push(idx); - return; - } - if (!Array.isArray(obj.path)) { - toClean.push(idx); - return; - } - if (typeof obj.element === "string") { - var id = Util.createRandomInteger(); - files[FILES_DATA][id] = { - href: exp.cryptor.encrypt(obj.element), - filename: el - }; - obj.element = id; - } - if (exp.isFolder(obj.element)) { - fixRoot(obj.element); - } - if (typeof obj.element === "number") { - var data = files[FILES_DATA][obj.element] || files[STATIC_DATA][obj.element]; - if (!data) { - debug("An element in TRASH doesn't have associated data", obj.element, el); - toClean.push(idx); - } - } - }; - for (var el in tr) { - if (!Array.isArray(tr[el])) { - debug("An element in TRASH root is not an array. ", tr[el]); - delete tr[el]; - } else if (tr[el].length === 0) { - debug("Empty array in TRASH root. ", tr[el]); - delete tr[el]; - } else { - toClean = []; - for (var j = 0; j < tr[el].length; j++) { - addToClean(tr[el][j], j, el); - } - for (var i = toClean.length - 1; i >= 0; i--) { - tr[el].splice(toClean[i], 1); - } - } - } - }; - var fixTemplate = function() { - if (sharedFolder) { - return; - } - if (!Array.isArray(files[TEMPLATE])) { - debug("TEMPLATE was not an array"); - files[TEMPLATE] = []; - } - var dedup = Util.deduplicateString(files[TEMPLATE]); - if (dedup.length !== files[TEMPLATE].length) { - files[TEMPLATE] = dedup; - } - var us = files[TEMPLATE]; - var rootFiles = exp.getFiles([ ROOT ]); - var toClean = []; - us.forEach((function(el, idx) { - if (!exp.isFile(el, true) || rootFiles.indexOf(el) !== -1) { - toClean.push(el); - return; - } - if (typeof el === "string") { - var id = Util.createRandomInteger(); - files[FILES_DATA][id] = { - href: exp.cryptor.encrypt(el) - }; - us[idx] = id; - return; - } - if (typeof el === "number") { - var data = files[FILES_DATA][el]; - if (!data) { - debug("An element in TEMPLATE doesn't have associated data", el); - toClean.push(el); - } - } - })); - toClean.forEach((function(el) { - var idx = us.indexOf(el); - if (idx !== -1) { - us.splice(idx, 1); - } - })); - }; - var fixFilesData = function() { - if (typeof files[FILES_DATA] !== "object") { - debug("FILES_DATA was not an object"); - files[FILES_DATA] = {}; - } - var fd = files[FILES_DATA]; - var rootFiles = exp.getFiles([ ROOT, TRASH, "hrefArray" ]); - var root = exp.find([ ROOT ]); - var toClean = []; - for (var id in fd) { - if (String(id) !== String(Number(id))) { - debug("Invalid file ID in filesData.", id); - toClean.push(id); - continue; - } - id = Number(id); - var el = fd[id]; - if (!el || typeof el !== "object") { - debug("An element in filesData was not an object.", el); - toClean.push(id); - continue; - } - if (!el.href && !el.roHref) { - debug("Removing an element in filesData with a missing href.", el); - toClean.push(id); - continue; - } - var decryptedHref; - try { - decryptedHref = el.href && (el.href.indexOf("#") !== -1 ? el.href : exp.cryptor.decrypt(el.href)); - } catch (e) {} - if (decryptedHref && decryptedHref.indexOf("#") === -1) { - continue; - } - var parsed = Hash.parsePadUrl(decryptedHref || el.roHref); - var secret; - if (!parsed.hash) { - debug("Removing an element in filesData with a invalid href.", el); - toClean.push(id); - continue; - } - if (!parsed.type) { - debug("Removing an element in filesData with a invalid type.", el); - toClean.push(id); - continue; - } - if (decryptedHref && parsed.hashData.type === "pad" && parsed.hashData.version) { - if (parsed.hashData.mode === "view") { - el.roHref = decryptedHref; - delete el.href; - } else if (!el.roHref) { - secret = Hash.getSecrets(parsed.type, parsed.hash, el.password); - el.roHref = "/" + parsed.type + "/#" + Hash.getViewHashFromKeys(secret); - } else { - var parsed2 = Hash.parsePadUrl(el.roHref); - if (!parsed2.hash || !parsed2.type) { - secret = Hash.getSecrets(parsed.type, parsed.hash, el.password); - el.roHref = "/" + parsed.type + "/#" + Hash.getViewHashFromKeys(secret); - } - } - } - if (parsed.hashData.version === 0) { - delete el.roHref; - } - if (decryptedHref && decryptedHref.slice(0, 1) !== "/") { - el.href = exp.cryptor.encrypt(Hash.getRelativeHref(decryptedHref)); - } - if (!el.ctime) { - el.ctime = el.atime; - } - if (!el.title) { - el.title = exp.getDefaultName(parsed); - } - if (!el.channel) { - try { - if (!secret) { - secret = Hash.getSecrets(parsed.type, parsed.hash, el.password); - } - el.channel = secret.channel; - console.log(el); - debug("Adding missing channel in filesData ", el.channel); - } catch (e) { - console.error(e); - } - } - if (!Hash.isValidChannel(el.channel)) { - console.error("Remove invalid channel", el.channel, el); - } - if ((loggedIn || config.testMode) && rootFiles.indexOf(id) === -1) { - debug("An element in filesData was not in ROOT, TEMPLATE or TRASH.", id, el); - var newName = Hash.createChannelId(); - root[newName] = id; - continue; - } - } - toClean.forEach((function(id) { - spliceFileData(id); - })); - var sd = files[STATIC_DATA]; - var toCleanSD = []; - for (var id2 in sd) { - id2 = Number(id2); - var el2 = sd[id2]; - if (!el2 || typeof el2 !== "object" || !el2.href) { - toCleanSD.push(id2); - continue; - } - if ((loggedIn || config.testMode) && rootFiles.indexOf(id2) === -1) { - toCleanSD.push(id2); - continue; - } - } - var spliceSD = function(id) { - if (readOnly) { - return; - } - delete files[STATIC_DATA][id]; - }; - toCleanSD.forEach(spliceSD); - }; - var fixSharedFolders = function() { - if (sharedFolder) { - return; - } - if (typeof files[SHARED_FOLDERS] !== "object") { - debug("SHARED_FOLDER was not an object"); - files[SHARED_FOLDERS] = {}; - } - var sf = files[SHARED_FOLDERS]; - var rootFiles = exp.getFiles([ ROOT, TRASH ]); - var root = exp.find([ ROOT ]); - var parsed, el; - for (var id in sf) { - el = sf[id]; - id = Number(id); - var href; - try { - href = el.href && (el.href.indexOf("#") !== -1 ? el.href : exp.cryptor.decrypt(el.href)); - } catch (e) {} - parsed = Hash.parsePadUrl(href || el.roHref); - if (!parsed || !parsed.hash || parsed.hash === "undefined") { - delete sf[id]; - continue; - } - if (rootFiles.indexOf(id) === -1) { - console.log("missing" + id); - var newName = Hash.createChannelId(); - root[newName] = id; - } - } - }; - var fixSharedFoldersTemp = function() { - if (sharedFolder) { - return; - } - if (typeof files[SHARED_FOLDERS_TEMP] !== "object") { - debug("SHARED_FOLDER_TEMP was not an object"); - files[SHARED_FOLDERS_TEMP] = {}; - } - var sft = files[SHARED_FOLDERS_TEMP]; - var sf = files[SHARED_FOLDERS]; - for (var id in sft) { - if (sf[id]) { - delete sft[id]; - } - } - }; - var fixStaticData = function() { - if (!Util.isObject(files[STATIC_DATA])) { - debug("STATIC_DATA was not an object"); - files[STATIC_DATA] = {}; - } - }; - var fixDrive = function() { - Object.keys(files).forEach((function(key) { - if (key.slice(0, 1) === "/") { - delete files[key]; - } - })); - }; - fixStaticData(); - fixRoot(); - fixTrashRoot(); - fixTemplate(); - fixFilesData(); - fixDrive(); - fixSharedFolders(); - fixSharedFoldersTemp(); - var ms = +new Date - t0 + "ms"; - if (JSON.stringify(files) !== before) { - debug("Your file system was corrupted. It has been cleaned so that the pads you visit can be stored safely.", ms); - return; - } - debug("File system was clean.", ms); - }; - return exp; - }; - return module; - }; - if (module.exports) { - module.exports = factory(requireCommonUtil(), requireCommonHash(), requireCommonRealtime()); - } - })(); - })(userObjectSetter); - return userObjectSetter.exports; - } - var hasRequiredUserObject; - function requireUserObject() { - if (hasRequiredUserObject) return userObject$1.exports; - hasRequiredUserObject = 1; - (function(module) { - (() => { - const factory = (Util, Hash, Constants, UOSetter, Crypto, Messages = {}) => { - let window = globalThis; - var module = {}; - module.setCustomize = data => { - Messages = data.Messages; - UOSetter.setCustomize(data); - }; - var ROOT = module.ROOT = "root"; - var UNSORTED = module.UNSORTED = "unsorted"; - var TRASH = module.TRASH = "trash"; - var TEMPLATE = module.TEMPLATE = "template"; - var SHARED_FOLDERS = module.SHARED_FOLDERS = "sharedFolders"; - var SHARED_FOLDERS_TEMP = module.SHARED_FOLDERS_TEMP = "sharedFoldersTemp"; - var FILES_DATA = module.FILES_DATA = Constants.storageKey; - var OLD_FILES_DATA = module.OLD_FILES_DATA = Constants.oldStorageKey; - var STATIC_DATA = module.STATIC_DATA = "static"; - var getLocaleDate = function() { - if (window.Intl && window.Intl.DateTimeFormat) { - var options = { - weekday: "short", - year: "numeric", - month: "long", - day: "numeric" - }; - return new window.Intl.DateTimeFormat(undefined, options).format(new Date); - } - return (new Date).toString().split(" ").slice(0, 4).join(" "); - }; - module.getDefaultName = function(parsed) { - var type = parsed.type; - var name = Messages.type[type] + " - " + getLocaleDate(); - return name; - }; - var createCryptor = module.createCryptor = function(key) { - var cryptor = {}; - if (!key) { - cryptor.encrypt = function(x) { - return x; - }; - cryptor.decrypt = function(x) { - return x; - }; - return cryptor; - } - try { - var c = Crypto.createEncryptor(key); - cryptor.encrypt = function(href) { - try { - if (href.slice(0, 7) === "/file/#") { - return href; - } - return c.encrypt(href); - } catch (e) { - return; - } - }; - cryptor.decrypt = function(msg) { - try { - return c.decrypt(msg); - } catch (e) { - return; - } - }; - } catch (e) { - console.error(e); - } - return cryptor; - }; - module.getHref = function(pad, cryptor) { - if (pad.href && pad.href.indexOf("#") !== -1) { - return pad.href; - } - if (pad.href && cryptor) { - var d = cryptor.decrypt(pad.href); - if (d && d.indexOf("#") !== -1) { - return d; - } - } - return pad.roHref; - }; - module.reencrypt = function(oldKey, newKey, obj) { - if (!obj) { - return void console.error("Nothing to reencrypt"); - } - var oldCryptor = createCryptor(oldKey); - var newCryptor = createCryptor(newKey); - Object.keys(obj[FILES_DATA]).forEach((function(id) { - var data = obj[FILES_DATA][id] || {}; - if (data.href && data.roHref && !data.fileType) { - var _href = data.href && data.href.indexOf("#") === -1 ? oldCryptor.decrypt(data.href) : data.href; - if (!_href) { - return; - } - data.href = newCryptor.encrypt(_href); - } - })); - Object.keys(obj[SHARED_FOLDERS] || {}).forEach((function(id) { - var data = obj[SHARED_FOLDERS][id] || {}; - if (data.href) { - var _href = data.href && data.href.indexOf("#") === -1 ? oldCryptor.decrypt(data.href) : data.href; - if (!_href) { - return; - } - data.href = newCryptor.encrypt(_href); - } - })); - Object.keys(obj[SHARED_FOLDERS_TEMP] || {}).forEach((function(id) { - var data = obj[SHARED_FOLDERS_TEMP][id] || {}; - if (data.href) { - var _href = data.href && data.href.indexOf("#") === -1 ? oldCryptor.decrypt(data.href) : data.href; - if (!_href) { - return; - } - data.href = newCryptor.encrypt(_href); - } - })); - }; - module.init = function(files, config) { - var exp = {}; - exp.cryptor = createCryptor(config.editKey); - exp.setReadOnly = function(state, key) { - config.editKey = key; - exp.cryptor = createCryptor(key); - exp.cryptor.k = Math.random(); - exp.readOnly = state; - if (exp._setReadOnly) { - exp._setReadOnly(state); - } - }; - exp.readOnly = config.readOnly; - exp.reencrypt = module.reencrypt; - exp.getDefaultName = module.getDefaultName; - var sframeChan = config.sframeChan; - var NEW_FOLDER_NAME = Messages.fm_newFolder || "New folder"; - var NEW_FILE_NAME = Messages.fm_newFile || "New file"; - exp.ROOT = ROOT; - exp.STATIC_DATA = STATIC_DATA; - exp.UNSORTED = UNSORTED; - exp.TRASH = TRASH; - exp.TEMPLATE = TEMPLATE; - exp.SHARED_FOLDERS = SHARED_FOLDERS; - exp.SHARED_FOLDERS_TEMP = SHARED_FOLDERS_TEMP; - exp.FILES_DATA = FILES_DATA; - exp.OLD_FILES_DATA = OLD_FILES_DATA; - var sharedFolder = exp.sharedFolder = config.sharedFolder; - exp.id = config.id; - var logging = function() { - console.debug.apply(console, arguments); - }; - var log = exp.log = config.log || logging; - var logError = config.logError || logging; - var debug = exp.debug = config.debug || logging; - exp.fixFiles = function() {}; - var error = exp.error = function() { - if (sframeChan) { - return void sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "fixFiles", - data: {} - }, (function() {})); - } else if (typeof exp.fixFiles === "function") { - exp.fixFiles(); - } - console.error.apply(console, arguments); - exp.fixFiles(); - }; - if (config.outer) { - UOSetter.init(config, exp, files); - } - exp.getStructure = function() { - var a = {}; - a[ROOT] = {}; - a[TRASH] = {}; - a[FILES_DATA] = {}; - a[TEMPLATE] = []; - a[SHARED_FOLDERS] = {}; - return a; - }; - var getHref = exp.getHref = function(pad) { - return module.getHref(pad, exp.cryptor); - }; - var type = function(dat) { - return dat === null ? "null" : Array.isArray(dat) ? "array" : typeof dat; - }; - exp.isValidDrive = function(obj) { - var base = exp.getStructure(); - return typeof obj === "object" && Object.keys(base).every((function(key) { - return obj[key] && type(base[key]) === type(obj[key]); - })); - }; - var getHrefArray = function() { - return [ TEMPLATE ]; - }; - var compareFiles = function(fileA, fileB) { - return fileA === fileB; - }; - var isSharedFolder = exp.isSharedFolder = function(element) { - if (sharedFolder) { - return false; - } - return Boolean(files[SHARED_FOLDERS] && files[SHARED_FOLDERS][element]); - }; - var isFile = exp.isFile = function(element, allowStr) { - if (isSharedFolder(element)) { - return false; - } - return typeof element === "number" || (typeof files[OLD_FILES_DATA] !== "undefined" || allowStr) && typeof element === "string"; - }; - var isFolderData = exp.isFolderData = function(element) { - return typeof element === "object" && element.metadata === true; - }; - exp.isReadOnlyFile = function(element) { - if (!isFile(element)) { - return false; - } - var data = exp.getFileData(element); - if (!data.roHref) { - return; - } - return Boolean(data.roHref && !data.href); - }; - exp.isStaticFile = function(element) { - return Boolean(files[STATIC_DATA] && files[STATIC_DATA][element]); - }; - var isFolder = exp.isFolder = function(element) { - if (isFolderData(element)) { - return false; - } - return typeof element === "object" && !element.channel || isSharedFolder(element); - }; - exp.isFolderEmpty = function(element) { - if (!isFolder(element)) { - return false; - } - if (Object.keys(element).length === 0) { - return true; - } - if (Object.keys(element).length === 1 && isFolderData(element[Object.keys(element)[0]])) { - return true; - } - return false; - }; - exp.hasSubfolder = function(element, trashRoot) { - if (!isFolder(element)) { - return false; - } - var subfolder = 0; - var addSubfolder = function(el) { - subfolder += isFolder(el.element) ? 1 : 0; - }; - for (var f in element) { - if (trashRoot) { - if (Array.isArray(element[f])) { - element[f].forEach(addSubfolder); - } - } else { - subfolder += isFolder(element[f]) ? 1 : 0; - } - } - return subfolder; - }; - exp.hasFile = function(element, trashRoot) { - if (!isFolder(element)) { - return false; - } - var file = 0; - var addFile = function(el) { - file += isFile(el.element) ? 1 : 0; - }; - for (var f in element) { - if (trashRoot) { - if (Array.isArray(element[f])) { - element[f].forEach(addFile); - } - } else { - file += isFile(element[f]) ? 1 : 0; - } - } - return file; - }; - exp.hasFolderData = function(folder) { - for (var el in folder) { - if (isFolderData(folder[el])) { - return true; - } - } - }; - var hasSubSharedFolder = exp.hasSubSharedFolder = function(folder) { - for (var el in folder) { - if (isSharedFolder(folder[el])) { - return true; - } else if (isFolder(folder[el])) { - if (hasSubSharedFolder(folder[el])) { - return true; - } - } - } - return false; - }; - var getFileData = exp.getFileData = function(file, editable) { - if (!file) { - return; - } - var link; - try { - link = (files[STATIC_DATA] || {})[file]; - } catch (err) { - console.error(err); - } - if (link) { - var _link = editable ? link : Util.clone(link); - if (!editable) { - _link.static = true; - } - return _link; - } - var data; - try { - data = files[FILES_DATA][file] || {}; - } catch (err) { - console.error(err); - data = {}; - } - if (!editable) { - data = JSON.parse(JSON.stringify(data)); - if (data.href && data.href.indexOf("#") === -1) { - if (config.editKey) { - try { - data.href = exp.cryptor.decrypt(data.href); - } catch (e) { - delete data.href; - } - } else { - delete data.href; - } - } - } - return data; - }; - exp.getFolderData = function(folder) { - for (var el in folder) { - if (isFolderData(folder[el])) { - return folder[el]; - } - } - return {}; - }; - var getTitle = exp.getTitle = function(file, type) { - if (isSharedFolder(file)) { - return "??"; - } - var data = getFileData(file); - if (!data) { - error("unable to retrieve data about the requested file: ", file, data); - return; - } - if (data.static) { - return data.name; - } - if (!file || !(data.href || data.roHref)) { - error("getTitle called with a non-existing file id: ", file, data); - return; - } - if (type === "title") { - return data.title; - } - if (type === "name") { - return data.filename; - } - return data.filename || data.title || NEW_FILE_NAME; - }; - var comparePath = exp.comparePath = function(a, b) { - if (!a || !b || !Array.isArray(a) || !Array.isArray(b)) { - return false; - } - if (a.length !== b.length) { - return false; - } - var result = true; - var i = a.length - 1; - while (result && i >= 0) { - result = a[i] === b[i]; - i--; - } - return result; - }; - var isSubpath = exp.isSubpath = function(path, parentPath) { - var pathA = parentPath.slice(); - var pathB = path.slice(0, pathA.length); - return comparePath(pathA, pathB); - }; - var isPathIn = exp.isPathIn = function(path, categories) { - if (!categories) { - return; - } - var idx = categories.indexOf("hrefArray"); - if (idx !== -1) { - categories.splice(idx, 1); - categories = categories.concat(getHrefArray()); - } - return categories.some((function(c) { - return Array.isArray(path) && path[0] === c; - })); - }; - var isInTrashRoot = exp.isInTrashRoot = function(path) { - return path[0] === TRASH && path.length === 4; - }; - var findElement = function(root, pathInput) { - if (!pathInput) { - error("Invalid path:\n", pathInput, "\nin root\n", root); - return; - } - if (pathInput.length === 0) { - return root; - } - var path = pathInput.slice(); - var key = path.shift(); - if (typeof root[key] === "undefined") { - debug("Unable to find the key '" + key + "' in the root object provided:", root); - return; - } - return findElement(root[key], path); - }; - var find = exp.find = function(path) { - return findElement(files, path); - }; - var getFilesRecursively = exp.getFilesRecursively = function(root, arr) { - arr = arr || []; - for (var e in root) { - if (isFile(root[e]) || isSharedFolder(root[e])) { - if (arr.indexOf(root[e]) === -1) { - arr.push(root[e]); - } - } else if (!isFolderData(root[e])) { - getFilesRecursively(root[e], arr); - } - } - return arr; - }; - var _getFiles = {}; - _getFiles["array"] = function(cat) { - if (!files[cat]) { - files[cat] = []; - } - return files[cat].slice(); - }; - getHrefArray().forEach((function(c) { - _getFiles[c] = function() { - return _getFiles["array"](c); - }; - })); - _getFiles["hrefArray"] = function() { - var ret = []; - if (sharedFolder) { - return ret; - } - getHrefArray().forEach((function(c) { - ret = ret.concat(_getFiles[c]()); - })); - return Util.deduplicateString(ret); - }; - _getFiles[ROOT] = function() { - var ret = []; - getFilesRecursively(files[ROOT], ret); - return ret; - }; - _getFiles[TRASH] = function() { - var root = files[TRASH]; - var ret = []; - var addFiles = function(el) { - if (isFile(el.element) || isSharedFolder(el.element)) { - if (ret.indexOf(el.element) === -1) { - ret.push(el.element); - } - } else { - getFilesRecursively(el.element, ret); - } - }; - for (var e in root) { - if (!Array.isArray(root[e])) { - error("Trash contains a non-array element"); - return; - } - root[e].forEach(addFiles); - } - return ret; - }; - _getFiles[OLD_FILES_DATA] = function() { - var ret = []; - if (!files[OLD_FILES_DATA]) { - return ret; - } - files[OLD_FILES_DATA].forEach((function(el) { - if (el.href && ret.indexOf(el.href) === -1) { - ret.push(el.href); - } - })); - return ret; - }; - _getFiles[STATIC_DATA] = function() { - var ret = []; - if (!files[STATIC_DATA]) { - return ret; - } - return Object.keys(files[STATIC_DATA]).map(Number).filter(Boolean); - }; - _getFiles[FILES_DATA] = function() { - var ret = []; - if (!files[FILES_DATA]) { - return ret; - } - return Object.keys(files[FILES_DATA]).map(Number).filter(Boolean); - }; - _getFiles[SHARED_FOLDERS] = function() { - var ret = []; - if (!files[SHARED_FOLDERS]) { - return ret; - } - return Object.keys(files[SHARED_FOLDERS]).map(Number).filter(Boolean); - }; - var getFiles = exp.getFiles = function(categories) { - var ret = []; - if (!categories || !categories.length) { - categories = [ ROOT, "hrefArray", TRASH, OLD_FILES_DATA, FILES_DATA, SHARED_FOLDERS ]; - } - categories.forEach((function(c) { - if (typeof _getFiles[c] === "function") { - ret = ret.concat(_getFiles[c]()); - } - })); - return Util.deduplicateString(ret); - }; - var getIdFromHref = exp.getIdFromHref = function(_href) { - var result; - var noPassword = function(str) { - if (!str) { - return; - } - var parsed = Hash.parsePadUrl(str); - return parsed.getUrl().replace(/\/p\/?/, "/"); - }; - var href = noPassword(_href); - getFiles([ FILES_DATA ]).some((function(id) { - if (noPassword(getHref(files[FILES_DATA][id])) === href || noPassword(files[FILES_DATA][id].roHref) === href) { - result = id; - return true; - } - })); - return result; - }; - exp.getSFIdFromHref = function(_href) { - var result; - var noPassword = function(str) { - if (!str) { - return; - } - var parsed = Hash.parsePadUrl(str); - return parsed.getUrl().replace(/\/p\/?/, "/"); - }; - var href = noPassword(_href); - getFiles([ SHARED_FOLDERS ]).some((function(id) { - if (noPassword(getHref(files[SHARED_FOLDERS][id])) === href || noPassword(files[SHARED_FOLDERS][id].roHref) === href) { - result = id; - return true; - } - })); - return result; - }; - var _findFileInRoot = function(path, files) { - if (!isPathIn(path, [ ROOT, TRASH ])) { - return []; - } - files = Array.isArray(files) ? files : [ files ]; - var paths = {}; - var root = find(path); - var addPaths = function(p) { - Object.keys(p).forEach((file => { - paths[file] ||= []; - Array.prototype.push.apply(paths[file], p[file]); - })); - }; - if (isFile(root) || isSharedFolder(root)) { - files.some((file => { - if (compareFiles(file, root)) { - paths[file] ||= []; - paths[file].push(path); - } - })); - return paths; - } - if (isFolder(root)) { - for (var e in root) { - let nPath = path.slice(); - nPath.push(e); - addPaths(_findFileInRoot(nPath, files)); - } - } - return paths; - }; - var _findFileInHrefArray = function(rootName, toFind) { - if (sharedFolder) { - return {}; - } - if (!files[rootName]) { - return {}; - } - var unsorted = files[rootName].slice(); - var ret = {}; - var i = -1; - toFind.forEach((file => { - while ((i = unsorted.indexOf(file, i + 1)) !== -1) { - ret[file] ||= []; - ret[file].push([ rootName, i ]); - } - })); - return ret; - }; - var _findFileInTrash = function(path, files) { - if (sharedFolder) { - return []; - } - var root = find(path); - var paths = {}; - var addPaths = function(p) { - Object.keys(p).forEach((file => { - paths[file] ||= []; - Array.prototype.push.apply(paths[file], p[file]); - })); - }; - if (path.length === 1 && typeof root === "object") { - Object.keys(root).forEach((function(key) { - var arr = root[key]; - if (!Array.isArray(arr)) { - return; - } - var nPath = path.slice(); - nPath.push(key); - addPaths(_findFileInTrash(nPath, files)); - })); - } - if (path.length === 2) { - if (!Array.isArray(root)) { - return []; - } - root.forEach((function(el, i) { - var nPath = path.slice(); - nPath.push(i); - nPath.push("element"); - if (isFile(el.element)) { - files.some((file => { - if (compareFiles(file, el.element)) { - paths[file] ||= []; - paths[file].push(nPath); - } - })); - return; - } - addPaths(_findFileInTrash(nPath, files)); - })); - } - if (path.length >= 4) { - addPaths(_findFileInRoot(path, files)); - } - return paths; - }; - var findFiles = exp.findFiles = function(files) { - var rootpaths = _findFileInRoot([ ROOT ], files); - var templatepaths = _findFileInHrefArray(TEMPLATE, files); - var trashpaths = _findFileInTrash([ TRASH ], files); - let res = {}; - files.forEach((file => { - res[file] = []; - })); - [ rootpaths, templatepaths, trashpaths ].forEach((r => { - Object.keys(r).forEach((file => { - res[file] ||= []; - Array.prototype.push.apply(res[file], r[file]); - })); - })); - return res; - }; - var findFile = exp.findFile = function(file) { - let res = findFiles([ file ]); - return res[file] || []; - }; - exp.findChannels = function(channels, includeSharedFolders) { - var allFilesList = files[FILES_DATA]; - var sfList = files[SHARED_FOLDERS]; - var paths = [ FILES_DATA ]; - if (includeSharedFolders) { - paths.push(SHARED_FOLDERS); - } - return getFiles(paths).filter((function(k) { - var data = allFilesList[k] || sfList[k] || {}; - return channels.indexOf(data.channel) !== -1; - })); - }; - exp.search = function(value) { - if (typeof value !== "string") { - return []; - } - value = value.trim(); - var res = []; - var allFilesList = files[FILES_DATA]; - var allSFList = files[SHARED_FOLDERS]; - var lValue = value.toLowerCase(); - var tags; - if (/^#/.test(lValue)) { - tags = [ lValue.slice(1).trim() ]; - } - var containsSearchedTag = function(T) { - if (!tags) { - return false; - } - if (!T.length) { - return false; - } - T = T.map((function(t) { - return t.toLowerCase(); - })); - return tags.some((function(tag) { - return T.some((function(t) { - return t === tag; - })); - })); - }; - getFiles([ FILES_DATA, SHARED_FOLDERS ]).forEach((function(id) { - var data = allFilesList[id] || allSFList[id]; - if (!data) { - return; - } - if (Array.isArray(data.tags) && containsSearchedTag(data.tags)) { - return void res.push(id); - } - var title = data.title || data.lastTitle; - if (title && title.toLowerCase().indexOf(lValue) !== -1 || data.filename && data.filename.toLowerCase().indexOf(lValue) !== -1) { - res.push(id); - } - })); - var href = Hash.getRelativeHref(value); - if (href) { - var id = getIdFromHref(href); - if (id) { - res.push(id); - } - } - res = Util.deduplicateString(res); - var ret = []; - res.forEach((function(l) { - ret.push({ - id: l, - paths: findFile(l), - data: exp.getFileData(l) - }); - })); - var resFolders = []; - var findFoldersRec = function(folder, path) { - for (var key in folder) { - if (isFolder(folder[key]) && !isSharedFolder(folder[key])) { - if (key.toLowerCase().indexOf(lValue) !== -1) { - resFolders.push({ - id: null, - paths: [ path.concat(key) ], - data: { - title: key - } - }); - } - findFoldersRec(folder[key], path.concat(key)); - } - } - }; - findFoldersRec(files[ROOT], [ ROOT ]); - resFolders = resFolders.sort((function(a, b) { - return a.data.title.toLowerCase() > b.data.title.toLowerCase(); - })); - ret = resFolders.concat(ret); - return ret; - }; - exp.getRecentPads = function() { - var allFiles = files[FILES_DATA]; - var sorted = Object.keys(allFiles).filter((function(a) { - return allFiles[a]; - })).sort((function(a, b) { - return allFiles[b].atime - allFiles[a].atime; - })).map((function(str) { - return Number(str); - })); - return sorted; - }; - exp.getOwnedPads = function(edPub) { - var allFiles = files[FILES_DATA]; - return Object.keys(allFiles).filter((function(id) { - return allFiles[id].owners && allFiles[id].owners.indexOf(edPub) !== -1; - })).map((function(k) { - return Number(k); - })); - }; - var getAvailableName = exp.getAvailableName = function(parentEl, name) { - if (typeof parentEl[name] === "undefined") { - return name; - } - var newName = name; - var i = 1; - while (typeof parentEl[newName] !== "undefined") { - newName = name + "_" + i; - i++; - } - return newName; - }; - var move = exp.move = function(paths, newPath, cb) { - if (sframeChan) { - return void sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "move", - data: { - paths, - newPath - } - }, cb); - } - var toRemove = []; - paths.forEach((function(p) { - var parentPath = p.slice(); - parentPath.pop(); - if (comparePath(parentPath, newPath)) { - return; - } - if (isSubpath(newPath, p)) { - log(Messages.fo_moveFolderToChildError); - return; - } - if (exp.copyElement(p.slice(), newPath)) { - toRemove.push(p); - } - })); - exp.delete(toRemove, cb); - }; - exp.restore = function(path, cb) { - if (sframeChan) { - return void sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "restore", - data: { - path - } - }, cb); - } - if (!isInTrashRoot(path)) { - return; - } - var parentPath = path.slice(); - parentPath.pop(); - var oldPath = find(parentPath).path; - move([ path ], oldPath, cb); - }; - exp.addFolder = function(folderPath, name, cb) { - if (sframeChan) { - return void sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "addFolder", - data: { - path: folderPath, - name - } - }, cb); - } - var parentEl = find(folderPath); - var folderName = getAvailableName(parentEl, name || NEW_FOLDER_NAME); - parentEl[folderName] = {}; - var newPath = folderPath.slice(); - newPath.push(folderName); - cb({ - newPath - }); - }; - exp.delete = function(paths, cb, nocheck) { - if (sframeChan) { - return void sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "delete", - data: { - paths, - nocheck - } - }, cb); - } - cb = cb || function() {}; - exp.deleteMultiplePermanently(paths, nocheck, cb); - }; - exp.emptyTrash = function(cb) { - cb = cb || function() {}; - if (sframeChan) { - return void sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "emptyTrash" - }, cb); - } - files[TRASH] = {}; - exp.checkDeletedFiles(cb); - }; - exp.ownedInTrash = function(isOwned) { - return getFiles([ TRASH ]).map((function(id) { - var data = isSharedFolder(id) ? files[SHARED_FOLDERS][id] : exp.getFileData(id); - if (!data) { - return; - } - return isOwned(data.owners) ? data.channel : undefined; - })).filter(Boolean); - }; - exp.rename = function(path, newName, cb) { - cb = cb || function() {}; - if (sframeChan) { - return void sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "rename", - data: { - path, - newName - } - }, cb); - } - if (path.length <= 1) { - logError("Renaming `root` is forbidden"); - return; - } - var element = find(path); - if (isFolder(element) && !isSharedFolder(element)) { - var parentPath = path.slice(); - var oldName = parentPath.pop(); - if (!newName || !newName.trim() || oldName === newName) { - return; - } - var parentEl = find(parentPath); - if (typeof parentEl[newName] !== "undefined") { - log(Messages.fo_existingNameError); - return; - } - parentEl[newName] = element; - delete parentEl[oldName]; - if (typeof cb === "function") { - cb(); - } - return; - } - var data; - if (isSharedFolder(element)) { - data = files[SHARED_FOLDERS][element]; - } else { - data = files[FILES_DATA][element] || files[STATIC_DATA][element]; - } - if (!data) { - return; - } - if (files[STATIC_DATA][element]) { - if (!newName || !newName.trim()) { - return void cb(); - } - data.name = newName; - cb(); - return; - } - if (!newName || newName.trim() === "") { - delete data.filename; - if (typeof cb === "function") { - cb(); - } - return; - } - if (getTitle(element, "name") === newName) { - return; - } - data.filename = newName; - if (typeof cb === "function") { - cb(); - } - }; - exp.getTagsList = function() { - var tags = {}; - var data; - var pushTag = function(tag) { - tags[tag] = tags[tag] ? ++tags[tag] : 1; - }; - for (var id in files[FILES_DATA]) { - data = files[FILES_DATA][id]; - if (!data.tags || !Array.isArray(data.tags)) { - continue; - } - data.tags.forEach(pushTag); - } - return tags; - }; - return exp; - }; - return module; - }; - if (module.exports) { - module.exports = factory(requireCommonUtil(), requireCommonHash(), requireCommonConstants(), requireUserObjectSetter(), requireCrypto(), undefined); - } - })(); - })(userObject$1); - return userObject$1.exports; - } - var sharedfolder = { - exports: {} - }; - var nthen = { - exports: {} - }; - var hasRequiredNthen; - function requireNthen() { - if (hasRequiredNthen) return nthen.exports; - hasRequiredNthen = 1; - (function(module) { - (function() { - var nThen = function(next) { - var funcs = []; - var timeouts = []; - var calls = 0; - var abort; - var waitFor = function(func) { - calls++; - return function() { - if (func) { - func.apply(null, arguments); - } - calls = (calls || 1) - 1; - while (!calls && funcs.length && !abort) { - funcs.shift()(waitFor); - } - }; - }; - waitFor.abort = function() { - timeouts.forEach(clearTimeout); - abort = 1; - }; - var ret = { - nThen: function(next) { - if (!abort) { - if (!calls) { - next(waitFor); - } else { - funcs.push(next); - } - } - return ret; - }, - orTimeout: function(func, milliseconds) { - if (abort) { - return ret; - } - if (!milliseconds) { - throw Error("Must specify milliseconds to orTimeout()"); - } - var cto; - var timeout = setTimeout((function() { - while (funcs.shift() !== cto) {} - func(waitFor); - calls = (calls || 1) - 1; - while (!calls && funcs.length) { - funcs.shift()(waitFor); - } - }), milliseconds); - funcs.push(cto = function() { - var idx = timeouts.indexOf(timeout); - if (idx > -1) { - timeouts.splice(idx, 1); - clearTimeout(timeout); - return; - } - throw new Error("timeout not listed in array"); - }); - timeouts.push(timeout); - return ret; - } - }; - return ret.nThen(next); - }; - { - module.exports = nThen; - } - })(); - })(nthen); - return nthen.exports; - } - var hasRequiredSharedfolder; - function requireSharedfolder() { - if (hasRequiredSharedfolder) return sharedfolder.exports; - hasRequiredSharedfolder = 1; - (function(module) { - (() => { - const factory = (Hash, Util, UserObject, Cache, nThen, Crypto, Listmap, ChainPad) => { - var SF = {}; - var allSharedFolders = {}; - SF.checkMigration = function(secondaryKey, proxy, uo, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - if (!proxy) { - return void cb(); - } - if (!secondaryKey) { - return void cb(); - } - if (proxy.version >= 2) { - return void cb(); - } - if (!proxy.migrateRo) { - return void uo.migrateReadOnly(cb); - } - var done = false; - var to; - var it = setInterval((function() { - if (proxy.version >= 2) { - done = true; - clearTimeout(to); - clearInterval(it); - return void cb(); - } - }), 100); - to = setTimeout((function() { - clearInterval(it); - uo.migrateReadOnly((function() { - done = true; - cb(); - })); - }), 2e4); - var path = [ "version" ]; - proxy.on("change", path, (function() { - if (done) { - return; - } - if (proxy.version >= 2) { - done = true; - clearTimeout(to); - clearInterval(it); - cb(); - } - })); - }; - SF.migrate = function(channel) { - var sf = allSharedFolders[channel]; - if (!sf) { - return; - } - var clients = sf.teams; - if (!Array.isArray(clients) || !clients.length) { - return; - } - var c = clients[0]; - if (!c.secondaryKey) { - return; - } - var f = Util.find(c, [ "store", "manager", "folders", c.id ]); - if (!f) { - return; - } - if (!f.proxy || f.proxy.version) { - return; - } - f.userObject.migrateReadOnly((function() { - clients.forEach((function(obj) { - var uo = Util.find(obj, [ "store", "manager", "folders", obj.id, "userObject" ]); - uo.setReadOnly(false, obj.secondarykey); - })); - })); - }; - SF.load = function(config, id, data, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - var network = config.network; - var store = config.store; - var isNew = config.isNew; - var isNewChannel = config.isNewChannel; - var teamId = store.id; - var handler = store.handleSharedFolder; - var href = store.manager.user.userObject.getHref(data); - var parsed = Hash.parsePadUrl(href); - var secret = Hash.getSecrets("drive", parsed.hash, data.password); - if (!secret.keys) { - store.manager.deprecateProxy(id); - return void cb(null); - } - var secondaryKey = secret.keys.secondaryKey; - nThen((function(waitFor) { - if (config.cache) { - Cache.getChannelCache(secret.channel, waitFor((function(err) { - if (err === "EINVAL") { - waitFor.abort(); - store.manager.restrictedProxy(id, secret.channel); - return void cb(null); - } - }))); - } - })).nThen((function(waitFor) { - isNewChannel(null, { - channel: secret.channel - }, waitFor((function(obj) { - if (obj.isNew && !isNew) { - store.manager.deprecateProxy(id, secret.channel, obj.reason); - waitFor.abort(); - return void cb(null); - } - }))); - })).nThen((function() { - var sf = allSharedFolders[secret.channel]; - if (sf && sf.readOnly && secondaryKey) { - SF.upgrade(secret.channel, secret); - } - if (sf && sf.ready && sf.rt) { - setTimeout((function() { - var leave = function() { - SF.leave(secret.channel, teamId); - }; - store.manager.addProxy(id, sf.rt, leave, secondaryKey); - cb(sf.rt); - })); - sf.teams.push({ - cb, - store, - id - }); - if (handler) { - handler(id, sf.rt); - } - return; - } - if (sf && !sf.ready && sf.rt) { - sf.teams.push({ - cb, - store, - secondaryKey, - id - }); - if (handler) { - handler(id, sf.rt); - } - return; - } - sf = allSharedFolders[secret.channel] = { - teams: [ { - cb, - store, - secondaryKey, - id - } ], - readOnly: !Boolean(secondaryKey) - }; - var owners = data.owners; - var listmapConfig = { - data: {}, - channel: secret.channel, - readOnly: !Boolean(secondaryKey), - crypto: Crypto.createEncryptor(secret.keys), - userName: "sharedFolder", - logLevel: 1, - ChainPad, - classic: true, - network, - Cache, - metadata: { - validateKey: secret.keys.validateKey || undefined, - owners - }, - onRejected: config.Store && config.Store.onRejected - }; - var rt = sf.rt = Listmap.create(listmapConfig); - rt.proxy.on("cacheready", (function() { - if (!sf.teams) { - return; - } - sf.teams.forEach((function(obj) { - var leave = function() { - SF.leave(secret.channel, obj.store.id); - }; - rt.cache = true; - obj.store.manager.addProxy(obj.id, rt, leave, obj.secondaryKey, config.updatePassword); - config.updatePassword = false; - obj.cb(sf.rt); - })); - sf.ready = true; - })); - rt.proxy.on("ready", (function() { - if (isNew && !Object.keys(rt.proxy).length) { - rt.proxy.version = 2; - } - if (!sf.teams) { - return; - } - sf.teams.forEach((function(obj) { - var leave = function() { - SF.leave(secret.channel, obj.store.id); - }; - rt.cache = false; - obj.store.manager.addProxy(obj.id, rt, leave, obj.secondaryKey, config.updatePassword); - obj.cb(sf.rt); - })); - sf.ready = true; - })); - rt.proxy.on("error", (function(info) { - if (info && info.error) { - if (info.error === "EDELETED") { - try { - sf.teams.forEach((function(obj) { - obj.store.manager.deprecateProxy(obj.id, secret.channel, info.message); - if (obj.store.handleSharedFolder) { - obj.store.handleSharedFolder(obj.id, null); - } - obj.cb(); - })); - } catch (e) {} - delete allSharedFolders[secret.channel]; - return void cb(); - } - if (info.error === "ERESTRICTED") { - sf.teams.forEach((function(obj) { - obj.store.manager.restrictedProxy(obj.id, secret.channel); - obj.cb(); - })); - delete allSharedFolders[secret.channel]; - return void cb(); - } - } - })); - if (handler) { - handler(id, rt); - } - })); - }; - SF.upgrade = function(channel, secret) { - var sf = allSharedFolders[channel]; - if (!sf || !sf.readOnly) { - return; - } - if (!sf.rt.setReadOnly) { - return; - } - if (!secret.keys || !secret.keys.editKeyStr) { - return; - } - var crypto = Crypto.createEncryptor(secret.keys); - sf.readOnly = false; - sf.rt.setReadOnly(false, crypto); - }; - SF.leave = function(channel, teamId) { - var sf = allSharedFolders[channel]; - if (!sf) { - return; - } - var clients = sf.teams; - if (!Array.isArray(clients)) { - return; - } - var idx; - clients.some((function(obj, i) { - if (obj.store.id === teamId) { - if (obj.store.handleSharedFolder) { - obj.store.handleSharedFolder(obj.id, null); - } - idx = i; - return true; - } - })); - if (typeof idx === "undefined") { - return; - } - clients.splice(idx, 1); - if (clients.length) { - return; - } - if (sf.rt && sf.rt.stop) { - sf.rt.stop(); - } - }; - SF.updatePassword = function(Store, data, network, cb) { - var oldChannel = data.oldChannel; - var href = data.href; - var password = data.password; - var parsed = Hash.parsePadUrl(href); - var secret = Hash.getSecrets(parsed.type, parsed.hash, password); - var sf = allSharedFolders[oldChannel]; - if (!sf) { - return void cb({ - error: "ENOTFOUND" - }); - } - if (sf.rt && sf.rt.stop) { - try { - sf.rt.stop(); - } catch (e) {} - } - var nt = nThen; - sf.teams.forEach((function(obj) { - nt = nt((function(waitFor) { - var s = obj.store; - var sfId = obj.id; - var shared = Util.find(s.proxy, [ "drive", UserObject.SHARED_FOLDERS ]) || {}; - if (!sfId || !shared[sfId]) { - return; - } - var sf = JSON.parse(JSON.stringify(shared[sfId])); - sf.password = password; - SF.load({ - network, - store: s, - updatePassword: true, - Store, - isNewChannel: Store.isNewChannel - }, sfId, sf, waitFor()); - if (!s.rpc) { - return; - } - s.rpc.unpin([ oldChannel ], waitFor()); - s.rpc.pin([ secret.channel ], waitFor()); - })).nThen; - })); - nt((function() { - cb(); - })); - }; - SF.loadSharedFolders = function(Store, network, store, drive, userObject, waitFor, progress, cache) { - var shared = drive[UserObject.SHARED_FOLDERS] || {}; - var steps = Object.keys(shared).length; - var i = 1; - var w = waitFor(); - progress = progress || function() {}; - nThen((function(waitFor) { - Object.keys(shared).forEach((function(id) { - var sf = shared[id]; - SF.load({ - network, - store, - Store, - cache, - isNewChannel: Store.isNewChannel - }, id, sf, waitFor((function() { - progress({ - progress: i, - max: steps - }); - i++; - }))); - })); - })).nThen((function() { - setTimeout(w); - })); - }; - SF.isSharedFolderChannel = function(chanId) { - return Object.keys(allSharedFolders).includes(chanId); - }; - return SF; - }; - if (module.exports) { - module.exports = factory(requireCommonHash(), requireCommonUtil(), requireUserObject(), requireCacheStore(), requireNthen(), requireCrypto(), requireChainpadListmap(), requireChainpad_dist()); - } - })(); - })(sharedfolder); - return sharedfolder.exports; - } - var hasRequiredProxyManager; - function requireProxyManager() { - if (hasRequiredProxyManager) return proxyManager$1.exports; - hasRequiredProxyManager = 1; - (function(module) { - (() => { - const factory = (UserObject, Util, Hash, SF, Messages = {}, Feedback, nThen) => { - let setCustomize = data => { - Messages = data.Messages; - UserObject.setCustomize(data); - }; - var getConfig = function(Env) { - var cfg = {}; - for (var k in Env.cfg) { - cfg[k] = Env.cfg[k]; - } - return cfg; - }; - var addProxy = function(Env, id, lm, leave, editKey, force) { - if (Env.folders[id] && !force && !Env.folders[id].restricted) { - if (Env.folders[id].offline && !lm.cache && Env.Store) { - Env.folders[id].offline = false; - if (Env.folders[id].userObject.fixFiles) { - Env.folders[id].userObject.fixFiles(); - } - Env.Store.refreshDriveUI(); - } - return; - } - var cfg = getConfig(Env); - cfg.sharedFolder = true; - cfg.id = id; - cfg.editKey = editKey; - cfg.rt = lm.realtime; - cfg.readOnly = Boolean(!editKey); - var userObject = UserObject.init(lm.proxy, cfg); - if (userObject.fixFiles) { - userObject.fixFiles(); - } - var proxy = lm.proxy; - if (proxy.metadata && proxy.metadata.title) { - var sf = Env.user.proxy[UserObject.SHARED_FOLDERS][id]; - if (sf) { - sf.lastTitle = proxy.metadata.title; - } - } - Env.folders[id] = { - proxy: lm.proxy, - userObject, - leave, - restricted: proxy.restricted, - offline: Boolean(lm.cache) - }; - if (proxy.on) { - proxy.on("disconnect", (function() { - Env.folders[id].offline = true; - })); - proxy.on("reconnect", (function() { - Env.folders[id].offline = false; - })); - } - return userObject; - }; - var removeProxy = function(Env, id) { - var f = Env.folders[id]; - if (!f) { - return; - } - f.leave(); - delete Env.folders[id]; - }; - var sendNotification = (Env, sfId, title) => { - var mailbox = Env.store.mailbox; - if (!mailbox) { - return; - } - var team = Env.cfg.teamId; - var box; - if (team) { - let teams = Env.store.modules["team"].getTeamsData(); - box = teams[team]; - } else { - let md = Env.Store.getMetadata(null, null, (() => {})); - box = md.user; - } - mailbox.sendTo("SF_DELETED", { - sfId, - team, - title - }, { - curvePublic: box.curvePublic, - channel: box.notifications - }, (err => { - console.error(err); - })); - }; - var deprecateProxy = function(Env, id, channel, reason) { - if (Env.folders[id] && Env.folders[id].deleting) { - return; - } - if (Env.user.userObject.readOnly) { - var lm = { - proxy: { - deprecated: true - } - }; - removeProxy(Env, id); - addProxy(Env, id, lm, (function() {})); - return void Env.Store.refreshDriveUI(); - } - if (channel) { - Env.unpinPads([ channel ], (function() {})); - } - if (reason && reason !== "PASSWORD_CHANGE") { - let temp = Util.find(Env, [ "user", "proxy", UserObject.SHARED_FOLDERS ]); - let title = temp[id] && temp[id].lastTitle; - if (title) { - sendNotification(Env, id, title); - } - delete temp[id]; - if (Env.Store && Env.Store.refreshDriveUI) { - Env.Store.refreshDriveUI(); - } - return; - } - Env.user.userObject.deprecateSharedFolder(id, reason); - removeProxy(Env, id); - if (Env.Store && Env.Store.refreshDriveUI) { - Env.Store.refreshDriveUI(); - } - }; - var restrictedProxy = function(Env, id) { - var lm = { - proxy: { - restricted: true, - root: {}, - filesData: {} - } - }; - removeProxy(Env, id); - addProxy(Env, id, lm, (function() {})); - return void Env.Store.refreshDriveUI(); - }; - var _ownedByMe = function(Env, owners) { - return Array.isArray(owners) && owners.indexOf(Env.edPublic) !== -1; - }; - var _ownedByOther = function(Env, owners) { - return Array.isArray(owners) && owners.length && (!Env.edPublic || owners.indexOf(Env.edPublic) === -1); - }; - var _getUserObjects = function(Env) { - var userObjects = [ Env.user.userObject ]; - var foldersUO = Object.keys(Env.folders).map((function(k) { - return Env.folders[k].userObject; - })); - Array.prototype.push.apply(userObjects, foldersUO); - return userObjects; - }; - var _getUserObjectFromId = function(Env, id) { - var userObjects = _getUserObjects(Env); - var userObject = Env.user.userObject; - userObjects.some((function(uo) { - if (Object.keys(uo.getFileData(id)).length) { - userObject = uo; - return true; - } - })); - return userObject; - }; - var _getUserObjectPath = function(Env, uo) { - var fId = Number(uo.id); - if (!fId) { - return; - } - var fPath = Env.user.userObject.findFile(fId)[0]; - return fPath; - }; - var findChannel = function(Env, channel, editable) { - var ret = []; - Env.user.userObject.findChannels([ channel ], true).forEach((function(id) { - var data = Env.user.proxy[UserObject.SHARED_FOLDERS][id]; - if (data && !editable) { - data = JSON.parse(JSON.stringify(data)); - } - if (!data) { - data = Env.user.userObject.getFileData(id, editable); - } - ret.push({ - id, - data, - userObject: Env.user.userObject - }); - })); - Object.keys(Env.folders).forEach((function(fId) { - Env.folders[fId].userObject.findChannels([ channel ]).forEach((function(id) { - ret.push({ - id, - fId, - data: Env.folders[fId].userObject.getFileData(id, editable), - userObject: Env.folders[fId].userObject - }); - })); - })); - return ret; - }; - var findHref = function(Env, href) { - var ret = []; - var id = Env.user.userObject.getIdFromHref(href); - if (id) { - ret.push({ - data: Env.user.userObject.getFileData(id), - userObject: Env.user.userObject - }); - } - Object.keys(Env.folders).forEach((function(fId) { - var id = Env.folders[fId].userObject.getIdFromHref(href); - if (!id) { - return; - } - ret.push({ - fId, - data: Env.folders[fId].userObject.getFileData(id), - userObject: Env.folders[fId].userObject - }); - })); - return ret; - }; - var findFile = function(Env, id) { - var ret = []; - var userObjects = _getUserObjects(Env); - let mainRes = {}; - userObjects.forEach((function(uo) { - var fId = Number(uo.id); - let results; - if (!fId) { - let ids = [ id ]; - let fIds = userObjects.map((uo => +uo.id)).filter(Boolean); - Array.prototype.push.apply(ids, fIds); - mainRes = uo.findFiles(ids); - results = mainRes[id]; - } else { - results = uo.findFile(id); - let fPath = (mainRes[fId] || [])[0]; - if (!fPath) { - return; - } - results.forEach((function(p) { - Array.prototype.unshift.apply(p, fPath); - })); - } - Array.prototype.push.apply(ret, results); - })); - return ret; - }; - var findFiles = function(Env, ids) { - var ret = {}; - var userObjects = _getUserObjects(Env); - let mainRes = {}; - userObjects.forEach((function(uo) { - var fId = Number(uo.id); - if (!uo.id) { - let fIds = userObjects.map((uo => +uo.id)).filter(Boolean); - Array.prototype.push.apply(ids, fIds); - } - var results = uo.findFiles(ids); - if (!uo.id) { - mainRes = results; - } - if (fId) { - let fPath = (mainRes[fId] || [])[0]; - if (!fPath) { - return; - } - Object.keys(results).forEach((file => { - results[file].forEach((p => { - Array.prototype.unshift.apply(p, fPath); - })); - })); - } - Object.keys(results).forEach((file => { - ret[file] ||= []; - Array.prototype.push.apply(ret[file], results[file]); - })); - })); - return ret; - }; - var _findChannels = function(Env, channels, onlyMain) { - if (onlyMain) { - return Env.user.userObject.findChannels(channels); - } - var ret = []; - var userObjects = _getUserObjects(Env); - userObjects.forEach((function(uo) { - var results = uo.findChannels(channels); - Array.prototype.push.apply(ret, results); - })); - ret = Util.deduplicateString(ret); - return ret; - }; - var _getFileData = function(Env, id, editable) { - var userObjects = _getUserObjects(Env); - var data = {}; - userObjects.some((function(uo) { - data = uo.getFileData(id, editable); - if (data && Object.keys(data).length) { - return true; - } - })); - return data; - }; - var getSharedFolderData = function(Env, id) { - var inHistory; - if (Env.isHistoryMode && !Env.folders[id]) { - inHistory = true; - } else if (!Env.folders[id]) { - return {}; - } - var proxy = inHistory ? {} : Env.folders[id].proxy; - if (Object.keys(proxy.metadata || {}).length > 1) { - proxy.metadata = { - title: proxy.metadata.title - }; - } - var obj = Util.clone(proxy.metadata || {}); - for (var k in Env.user.proxy[UserObject.SHARED_FOLDERS][id] || {}) { - if (typeof Env.user.proxy[UserObject.SHARED_FOLDERS][id][k] === "undefined") { - continue; - } - var data = Util.clone(Env.user.proxy[UserObject.SHARED_FOLDERS][id][k]); - if (k === "href" && data.indexOf("#") === -1) { - try { - data = Env.user.userObject.cryptor.decrypt(data); - } catch (e) {} - } - if (k === "href" && data.indexOf("#") === -1) { - data = undefined; - } - obj[k] = data; - } - return obj; - }; - var _resolvePath = function(Env, path) { - var res = { - id: null, - userObject: Env.user.userObject, - path - }; - if (!Array.isArray(path) || path.length <= 1) { - return res; - } - var current; - var uo = Env.user.userObject; - for (var i = 2; i < path.length; i++) { - current = uo.find(path.slice(0, i)); - if (uo.isSharedFolder(current)) { - res = { - id: current, - userObject: Env.folders[current]?.userObject, - path: path.slice(i) - }; - break; - } - } - return res; - }; - var _resolvePaths = function(Env, paths) { - var main = []; - var folders = {}; - paths.forEach((function(path) { - var r = _resolvePath(Env, path); - if (r.id) { - if (!folders[r.id]) { - folders[r.id] = [ r.path ]; - } else { - folders[r.id].push(r.path); - } - } else { - main.push(r.path); - } - })); - return { - main, - folders - }; - }; - var _isInSharedFolder = function(Env, path) { - var resolved = _resolvePath(Env, path); - return typeof resolved.id === "number" ? resolved.id : false; - }; - var _isDuplicateOwned = function(Env, path, id) { - if (path && _isInSharedFolder(Env, path)) { - return; - } - var data = _getFileData(Env, id || Env.user.userObject.find(path)); - if (!data) { - return; - } - if (!_ownedByMe(Env, data.owners)) { - return; - } - var channel = data.channel; - if (!channel) { - return; - } - var foldersUO = Object.keys(Env.folders).map((function(k) { - return Env.folders[k].userObject; - })); - return foldersUO.some((function(uo) { - return uo.findChannels([ channel ]).length; - })); - }; - var _getCopyFromPaths = function(Env, paths, userObject) { - var data = []; - var toNotRemove = []; - paths.forEach((function(path, idx) { - var el = userObject.find(path); - var files = []; - var key = path[path.length - 1]; - if (userObject.isFile(el)) { - files.push(el); - } else if (userObject.isSharedFolder(el)) { - files.push(el); - var obj = Env.folders[el].proxy.metadata || {}; - if (obj) { - key = obj.title; - } - } else { - try { - el = JSON.parse(JSON.stringify(el)); - } catch (e) { - return undefined; - } - userObject.getFilesRecursively(el, files); - } - if (files.some((function(f) { - return userObject.isSharedFolder(f); - }))) { - if (Env.cfg && Env.cfg.log) { - Env.cfg.log(Messages._getKey("fm_moveNestedSF", [ key ])); - } - toNotRemove.unshift(idx); - return; - } - files = Util.deduplicateString(files); - var filesData = {}; - files.forEach((function(f) { - filesData[f] = userObject.getFileData(f); - })); - data.push({ - el, - data: filesData, - key - }); - })); - toNotRemove.forEach((function(idx) { - paths.splice(idx, 1); - })); - return data; - }; - var getEditHash = function(Env, channel) { - var res = findChannel(Env, channel); - var stronger; - res.some((function(obj) { - if (!obj || !obj.data || !obj.data.href) { - return; - } - var parsed = Hash.parsePadUrl(obj.data.href); - var parsedHash = parsed.hashData; - if (!parsedHash || parsedHash.mode === "view") { - return; - } - stronger = parsed.hash; - return true; - })); - return stronger; - }; - var _move = function(Env, data, cb) { - var resolved = _resolvePaths(Env, data.paths); - var newResolved = _resolvePath(Env, data.newPath); - var copy = data.copy; - if (!newResolved.userObject.isFolder(newResolved.path)) { - return void cb(); - } - nThen((function(waitFor) { - if (resolved.main.length) { - if (!newResolved.id) { - Env.user.userObject.move(resolved.main, newResolved.path, waitFor()); - } else { - var toCopy = _getCopyFromPaths(Env, resolved.main, Env.user.userObject); - var newUserObject = newResolved.userObject; - toCopy.forEach((function(obj) { - newUserObject.copyFromOtherDrive(newResolved.path, obj.el, obj.data, obj.key); - })); - if (copy) { - return; - } - if (resolved.main.length) { - Env.user.userObject.delete(resolved.main, waitFor()); - } - } - } - var folderIds = Object.keys(resolved.folders); - if (folderIds.length) { - folderIds.forEach((function(fIdStr) { - var fId = Number(fIdStr); - var paths = resolved.folders[fId]; - if (newResolved.id === fId) { - newResolved.userObject.move(paths, newResolved.path, waitFor()); - } else { - var uoFrom = Env.folders[fId].userObject; - var uoTo = newResolved.userObject; - var toCopy = _getCopyFromPaths(Env, paths, uoFrom); - toCopy.forEach((function(obj) { - uoTo.copyFromOtherDrive(newResolved.path, obj.el, obj.data, obj.key); - })); - if (copy) { - return; - } - uoFrom.delete(paths, waitFor()); - } - })); - } - })).nThen((function() { - cb(); - })); - }; - var _restore = function(Env, data, cb) { - var userObject = Env.user.userObject; - data = data || {}; - userObject.restore(data.path, cb); - }; - var _addFolder = function(Env, data, cb) { - data = data || {}; - var resolved = _resolvePath(Env, data.path); - if (!resolved || !resolved.userObject) { - return void cb({ - error: "E_NOTFOUND" - }); - } - resolved.userObject.addFolder(resolved.path, data.name, (function(obj) { - if (obj.newPath && resolved.id) { - var fPath = _getUserObjectPath(Env, resolved.userObject); - if (fPath) { - Array.prototype.unshift.apply(obj.newPath, fPath); - } - } - cb(obj); - })); - }; - var _addSharedFolder = function(Env, data, cb) { - data = data || {}; - var resolved = _resolvePath(Env, data.path); - if (!resolved || !resolved.userObject) { - return void cb({ - error: "E_NOTFOUND" - }); - } - if (resolved.id) { - return void cb({ - error: "EINVAL" - }); - } - if (!Env.pinPads) { - return void cb({ - error: "EAUTH" - }); - } - var folderData = data.folderData || {}; - var id; - nThen((function() { - if (data.folderData) { - return; - } - var hash = Hash.createRandomHash("drive", data.password); - var secret = Hash.getSecrets("drive", hash, data.password); - var hashes = Hash.getHashes(secret); - folderData = { - href: "/drive/#" + hashes.editHash, - roHref: "/drive/#" + hashes.viewHash, - channel: secret.channel, - lastTitle: data.name, - ctime: +new Date - }; - if (data.password) { - folderData.password = data.password; - } - if (data.owned) { - folderData.owners = [ Env.edPublic ]; - } - })).nThen((function(waitFor) { - Env.Store.getPadMetadata(null, { - channel: folderData.channel - }, waitFor((function(obj) { - if (obj && (obj.error || obj.rejected)) { - waitFor.abort(); - return void cb({ - error: obj.error || "ERESTRICTED" - }); - } - }))); - })).nThen((function(waitFor) { - Env.pinPads([ folderData.channel ], waitFor()); - })).nThen((function(waitFor) { - Env.user.userObject.pushSharedFolder(folderData, waitFor((function(err, folderId) { - if (err === "EEXISTS" && folderData.href && folderId) { - var parsed = Hash.parsePadUrl(folderData.href); - var secret = Hash.getSecrets("drive", parsed.hash, folderData.password); - SF.upgrade(secret.channel, secret); - Env.folders[folderId].userObject.setReadOnly(false, secret.keys.secondaryKey); - waitFor.abort(); - return void cb(folderId); - } - if (err === "EEXISTS" && folderId) { - waitFor.abort(); - return void cb(folderId); - } - if (err) { - waitFor.abort(); - return void cb(err); - } - id = folderId; - }))); - })).nThen((function(waitFor) { - Env.user.userObject.add(id, resolved.path); - Env.loadSharedFolder(id, folderData, waitFor((function(rt) { - if (!rt) { - waitFor.abort(); - return void cb({ - error: "EDELETED" - }); - } - if (!rt.proxy.metadata) { - rt.proxy.metadata = { - title: data.name || Messages.fm_newFolder - }; - } - if (data.folderData) { - Env.Store.getPadMetadata(null, { - channel: folderData.channel - }, (function(md) { - var fData = Env.user.proxy[UserObject.SHARED_FOLDERS][id]; - if (md.owners) { - fData.owners = md.owners; - } - if (md.expire) { - fData.expire = +md.expire; - } - })); - } - })), !Boolean(data.folderData)); - })).nThen((function() { - Env.onSync((function() { - cb(id); - })); - })); - }; - var _addLink = function(Env, data, cb) { - data = data || {}; - var resolved = _resolvePath(Env, data.path); - if (!resolved || !resolved.userObject) { - return void cb({ - error: "E_NOTFOUND" - }); - } - var uo = resolved.userObject; - var now = +new Date; - uo.pushLink({ - name: data.name, - href: data.href, - atime: now, - ctime: now - }, (function(e, id) { - if (e) { - return void cb({ - error: e - }); - } - uo.add(id, resolved.path); - Env.onSync(cb); - })); - }; - var _restoreSharedFolder = function(Env, _data, cb) { - var fId = _data.id; - var newPassword = _data.password; - var temp = Util.find(Env, [ "user", "proxy", UserObject.SHARED_FOLDERS_TEMP ]); - var data = temp && temp[fId]; - if (!data) { - return void cb({ - error: "EINVAL" - }); - } - if (!Env.Store) { - return void cb({ - error: "ESTORE" - }); - } - var href = Env.user.userObject.getHref ? Env.user.userObject.getHref(data) : data.href; - var isNew = false; - nThen((function(waitFor) { - Env.Store.isNewChannel(null, { - href, - password: newPassword - }, waitFor((function(obj) { - if (!obj || obj.error) { - isNew = false; - return; - } - isNew = obj.isNew; - }))); - })).nThen((function() { - if (isNew) { - return void cb({ - error: "ENOTFOUND" - }); - } - var newData = Util.clone(data); - var parsed = Hash.parsePadUrl(href); - var secret = Hash.getSecrets(parsed.type, parsed.hash, newPassword); - newData.password = newPassword; - newData.channel = secret.channel; - if (secret.keys.editKeyStr) { - newData.href = "/drive/#" + Hash.getEditHashFromKeys(secret); - } - newData.roHref = "/drive/#" + Hash.getViewHashFromKeys(secret); - delete newData.legacy; - _addSharedFolder(Env, { - path: [ "root" ], - folderData: newData - }, (function() { - delete temp[fId]; - Env.onSync(cb); - })); - })); - }; - var _convertFolderToSharedFolder = function(Env, data, cb) { - var path = data.path; - var folderElement = Env.user.userObject.find(path); - if (path.length <= 1 || path[0] !== UserObject.ROOT) { - return void cb({ - error: "E_INVAL_PATH" - }); - } - if (_isInSharedFolder(Env, path)) { - return void cb({ - error: "E_INVAL_NESTING" - }); - } - if (Env.user.userObject.hasSubSharedFolder(folderElement)) { - return void cb({ - error: "E_INVAL_NESTING" - }); - } - var parentPath = path.slice(0, -1); - var parentFolder = Env.user.userObject.find(parentPath); - var folderName = path[path.length - 1]; - var SFId; - nThen((function(waitFor) { - _addSharedFolder(Env, { - path: parentPath, - name: folderName, - owned: data.owned, - password: data.password || "" - }, waitFor((function(id) { - if (typeof id === "object" && id && id.error) { - waitFor.abort(); - return void cb(id); - } else { - SFId = id; - } - }))); - })).nThen((function(waitFor) { - if (!SFId) { - waitFor.abort(); - return void cb({ - error: "E_NO_ID" - }); - } - var paths = []; - for (var el in folderElement) { - if (Env.user.userObject.isFolder(folderElement[el]) || Env.user.userObject.isFile(folderElement[el])) { - paths.push(path.concat(el)); - } - } - var SFKey; - Object.keys(parentFolder).some((function(el) { - if (parentFolder[el] === SFId) { - SFKey = el; - return true; - } - })); - if (!SFKey) { - waitFor.abort(); - return void cb({ - error: "E_NO_KEY" - }); - } - var newPath = parentPath.concat(SFKey).concat(UserObject.ROOT); - _move(Env, { - paths, - newPath, - copy: false - }, waitFor()); - })).nThen((function(waitFor) { - var paths = []; - Object.keys(folderElement).forEach((function(el) { - if (!Env.user.userObject.isFile(folderElement[el])) { - return; - } - var data = Env.user.userObject.getFileData(folderElement[el]); - if (!data || !_ownedByMe(Env, data.owners)) { - return; - } - paths.push(path.concat(el)); - })); - _move(Env, { - paths, - newPath: [ UserObject.ROOT ], - copy: false - }, waitFor()); - })).nThen((function() { - var sharedFolderElement = Env.user.proxy[UserObject.SHARED_FOLDERS][SFId]; - var metadata = Env.user.userObject.getFolderData(folderElement); - for (var key in metadata) { - if (key === "metadata") { - continue; - } - sharedFolderElement[key] = metadata[key]; - } - Env.user.userObject.delete([ path ], (function() { - cb({ - fId: SFId - }); - })); - })); - }; - var _delete = function(Env, data, cb) { - data = data || {}; - var resolved = data.resolved || _resolvePaths(Env, data.paths); - if (!resolved.main.length && !Object.keys(resolved.folders).length) { - return void cb({ - error: "E_NOTFOUND" - }); - } - if (data.paths && data.paths.length === 1 && data.paths[0][0] === UserObject.SHARED_FOLDERS_TEMP) { - var temp = Util.find(Env, [ "user", "proxy", UserObject.SHARED_FOLDERS_TEMP ]); - delete temp[data.paths[0][1]]; - return void Env.onSync(cb); - } - var toUnpin = []; - nThen((function(waitFor) { - if (resolved.main.length) { - var uo = Env.user.userObject; - if (Util.find(Env.settings, [ "drive", "hideDuplicate" ])) { - resolved.main.forEach((function(p) { - var el = uo.find(p); - if (p[0] === UserObject.FILES_DATA) { - return; - } - if (uo.isFile(el) || uo.isSharedFolder(el)) { - return; - } - var arr = []; - uo.getFilesRecursively(el, arr); - arr.forEach((function(id) { - if (_isDuplicateOwned(Env, null, id)) { - Env.user.userObject.add(Number(id), [ UserObject.ROOT ]); - } - })); - })); - } - uo.delete(resolved.main, waitFor((function(err, _toUnpin) { - if (!Env.unpinPads || !_toUnpin) { - return; - } - Array.prototype.push.apply(toUnpin, _toUnpin); - }))); - } - })).nThen((function(waitFor) { - Object.keys(resolved.folders).forEach((function(id) { - Env.folders[id].userObject.delete(resolved.folders[id], waitFor((function(err, _toUnpin) { - if (!Env.unpinPads || !_toUnpin) { - return; - } - Array.prototype.push.apply(toUnpin, _toUnpin); - }))); - })); - })).nThen((function(waitFor) { - if (!Env.unpinPads) { - return; - } - toUnpin = Util.deduplicateString(toUnpin); - var toKeep = []; - _findChannels(Env, toUnpin).forEach((function(id) { - var data = _getFileData(Env, id); - var arr = [ data.channel ]; - if (data.answersChannel) { - arr.push(data.answersChannel); - } - if (data.rtChannel) { - arr.push(data.rtChannel); - } - if (data.lastVersion) { - arr.push(Hash.hrefToHexChannelId(data.lastVersion)); - } - Array.prototype.push.apply(toKeep, arr); - })); - var unpinList = []; - toUnpin.forEach((function(chan) { - if (toKeep.indexOf(chan) === -1) { - unpinList.push(chan); - Env.Store.checkDeletedPad(chan); - } - })); - Env.unpinPads(unpinList, waitFor((function(response) { - if (response && response.error) { - return console.error(response.error); - } - }))); - })).nThen((function() { - cb(); - })); - }; - var _deleteOwned = function(Env, data, cb) { - data = data || {}; - var resolved = _resolvePaths(Env, data.paths || []); - if (!data.channel && !resolved.main.length && !Object.keys(resolved.folders).length) { - return void cb({ - error: "E_NOTFOUND" - }); - } - var toDelete = { - main: [], - folders: {} - }; - var todo = function(channel, uo, p, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - var chan = channel; - if (!chan && uo) { - var el = uo.find(p); - if (!uo.isFile(el) && !uo.isSharedFolder(el)) { - return; - } - var data = uo.isFile(el) ? uo.getFileData(el) : getSharedFolderData(Env, el); - chan = data.channel; - } - var fId; - Object.keys(Env.user.proxy[UserObject.SHARED_FOLDERS] || {}).some((function(id) { - var sfData = Env.user.proxy[UserObject.SHARED_FOLDERS][id] || {}; - if (sfData.channel === chan) { - fId = Number(id); - Env.folders[id].deleting = true; - return true; - } - })); - Env.removeOwnedChannel(chan, (function(obj) { - if (obj && obj.error && obj.error !== "ENOENT") { - if (fId && Env.folders[fId] && Env.folders[fId].deleting) { - delete Env.folders[fId].deleting; - } - Feedback.send("ERROR_DELETING_OWNED_PAD=" + chan + "|" + obj.error, true); - return void cb(); - } - var ids = _findChannels(Env, [ chan ]); - if (fId) { - ids.push(fId); - } - if (!ids.length) { - toDelete = undefined; - return void cb(); - } - ids.forEach((function(id) { - var paths = findFile(Env, id); - var _resolved = _resolvePaths(Env, paths); - Array.prototype.push.apply(toDelete.main, _resolved.main); - Object.keys(_resolved.folders).forEach((function(fId) { - if (toDelete.folders[fId]) { - Array.prototype.push.apply(toDelete.folders[fId], _resolved.folders[fId]); - } else { - toDelete.folders[fId] = _resolved.folders[fId]; - } - })); - })); - cb(); - })); - }; - nThen((function(w) { - if (data.channel) { - todo(data.channel, null, null, w()); - } - resolved.main.forEach((function(p) { - todo(null, Env.user.userObject, p, w()); - })); - Object.keys(resolved.folders).forEach((function(id) { - var uo = Env.folders[id].userObject; - resolved.folders[id].forEach((function(p) { - todo(null, uo, p, w()); - })); - })); - })).nThen((function() { - if (!toDelete) { - cb(); - } else { - _delete(Env, { - resolved: toDelete - }, cb); - } - if (data.channel) { - Env.Store.refreshDriveUI(); - } - })); - }; - var _emptyTrash = function(Env, data, cb) { - nThen((function(waitFor) { - if (data && data.deleteOwned) { - var owned = Env.user.userObject.ownedInTrash((function(owners) { - return _ownedByMe(Env, owners); - })); - var n = nThen; - owned.forEach((function(chan) { - n = n((function(w) { - Env.removeOwnedChannel(chan, w((function(obj) { - setTimeout(w(), 50); - if (obj && obj.error && obj.error !== "ENOENT") { - console.error(obj.error, chan); - Feedback.send("ERROR_EMPTYTRASH_OWNED=" + chan + "|" + obj.error, true); - } - console.warn("DELETED", chan); - }))); - })).nThen; - })); - n(waitFor()); - } - Env.user.userObject.emptyTrash(waitFor((function(err, toClean) { - var nn = nThen; - setTimeout(waitFor((function() { - if (!Array.isArray(toClean)) { - return; - } - var done = waitFor(); - var toCheck = Util.deduplicateString(toClean); - var toUnpin = []; - toCheck.forEach((function(channel) { - nn = nn((function(w) { - var data = findChannel(Env, channel, true); - if (!data.length) { - toUnpin.push(channel); - } - Env.Store.checkDeletedPad(channel, w()); - })).nThen; - })); - nn((function() { - Env.unpinPads(toUnpin, (function() { - done(); - })); - })); - }))); - }))); - })).nThen(cb); - }; - var _rename = function(Env, data, cb) { - data = data || {}; - var resolved = _resolvePath(Env, data.path); - if (!resolved || !resolved.userObject) { - return void cb({ - error: "E_NOTFOUND" - }); - } - if (!resolved.id) { - var el = Env.user.userObject.find(resolved.path); - if (Env.user.userObject.isSharedFolder(el) && Env.folders[el]) { - Env.folders[el].proxy.metadata.title = data.newName || Messages.fm_folder; - Env.user.proxy[UserObject.SHARED_FOLDERS][el].lastTitle = data.newName || Messages.fm_folder; - return void cb(); - } - } - resolved.userObject.rename(resolved.path, data.newName, cb); - }; - var _setFolderData = function(Env, data, cb) { - data = data || {}; - var resolved = _resolvePath(Env, data.path); - if (!resolved || !resolved.userObject) { - return void cb({ - error: "E_NOTFOUND" - }); - } - if (!resolved.id) { - var el = Env.user.userObject.find(resolved.path); - if (Env.user.userObject.isSharedFolder(el) && Env.folders[el]) { - Env.user.proxy[UserObject.SHARED_FOLDERS][el][data.key] = data.value; - return void Env.onSync(cb); - } - } - resolved.userObject.setFolderData(resolved.path, data.key, data.value, (function() { - Env.onSync(cb); - })); - }; - var _updateStaticAccess = function(Env, id, cb) { - var uo = _getUserObjectFromId(Env, id); - var sd = uo.getFileData(id, true); - sd.atime = +new Date; - Env.onSync(cb); - }; - var COMMANDS = { - move: _move, - restore: _restore, - addFolder: _addFolder, - addSharedFolder: _addSharedFolder, - addLink: _addLink, - restoreSharedFolder: _restoreSharedFolder, - convertFolderToSharedFolder: _convertFolderToSharedFolder, - delete: _delete, - deleteOwned: _deleteOwned, - emptyTrash: _emptyTrash, - rename: _rename, - setFolderData: _setFolderData, - updateStaticAccess: _updateStaticAccess - }; - var onCommand = function(Env, cmdData, cb) { - var cmd = cmdData.cmd; - var data = cmdData.data || {}; - var method = COMMANDS[cmd]; - if (typeof method === "function") { - return void method(Env, data, cb); - } - cb(); - }; - var setPadAttribute = function(Env, data, cb) { - cb = cb || function() {}; - if (!data.attr || !data.attr.trim()) { - return void cb("E_INVAL_ATTR"); - } - var sfId = Env.user.userObject.getSFIdFromHref(data.href); - if (sfId) { - if (data.attr === "href") { - data.value = Env.user.userObject.cryptor.encrypt(data.value); - } - Env.user.proxy[UserObject.SHARED_FOLDERS][sfId][data.attr] = data.value; - } - var datas = findHref(Env, data.href); - var nt = nThen; - datas.forEach((function(d) { - nt = nt((function(waitFor) { - d.userObject.setPadAttribute(data.href, data.attr, data.value, waitFor()); - })).nThen; - })); - nt((function() { - cb(); - })); - }; - var getPadAttribute = function(Env, data, cb) { - cb = cb || function() {}; - var sfId = Env.user.userObject.getSFIdFromHref(data.href); - if (sfId) { - var sfData = getSharedFolderData(Env, sfId); - var sfValue = data.attr ? sfData[data.attr] : JSON.parse(JSON.stringify(sfData)); - setTimeout((function() { - cb(null, { - value: sfValue, - atime: 1 - }); - })); - return; - } - var datas = findHref(Env, data.href); - var res = {}; - datas.forEach((function(d) { - var atime = d.data.atime; - var value = data.attr ? d.data[data.attr] : JSON.parse(JSON.stringify(d.data)); - if (!res.value || res.atime < atime) { - res.atime = atime; - res.value = value; - } - })); - setTimeout((function() { - cb(null, res); - })); - }; - var getTagsList = function(Env) { - var list = {}; - var userObjects = _getUserObjects(Env); - userObjects.forEach((function(uo) { - var l = uo.getTagsList(); - Object.keys(l).forEach((function(t) { - list[t] = list[t] ? list[t] + l[t] : l[t]; - })); - })); - return list; - }; - var getSecureFilesList = function(Env, where) { - var userObjects = _getUserObjects(Env); - var list = []; - var channels = []; - userObjects.forEach((function(uo) { - var toPush = uo.getFiles(where).map((function(id) { - return { - id, - data: uo.getFileData(id) - }; - })).filter((function(d) { - if (channels.indexOf(d.data.channel || d.id) === -1) { - channels.push(d.data.channel || d.id); - return true; - } - })); - Array.prototype.push.apply(list, toPush); - })); - return list; - }; - var excludeInvalidIdentifiers = function(result) { - return result.filter((function(channel) { - if (typeof channel !== "string") { - return; - } - return [ 32, 48 ].indexOf(channel.length) !== -1; - })); - }; - var getChannelsList = function(Env, type) { - var result = []; - var addChannel = function(userObject) { - if (type === "expirable") { - return function(fileId) { - var data = userObject.getFileData(fileId); - if (!data) { - return; - } - if (result.indexOf(data.channel) !== -1) { - return; - } - if (_ownedByOther(Env, data.owners) || data.expire && data.expire < +new Date) { - result.push(data.channel); - } - }; - } - if (type === "owned") { - return function(fileId) { - var data = userObject.getFileData(fileId); - if (!data) { - return; - } - if (result.indexOf(data.channel) !== -1) { - return; - } - if (_ownedByMe(Env, data.owners)) { - result.push(data.channel); - } - }; - } - if (type === "pin") { - return function(fileId) { - var data = userObject.getFileData(fileId); - if (!data) { - return; - } - if (data.lastVersion) { - var otherChan = Hash.hrefToHexChannelId(data.lastVersion); - if (result.indexOf(otherChan) === -1) { - result.push(otherChan); - } - } - if (data.answersChannel && result.indexOf(data.answersChannel) === -1) { - result.push(data.answersChannel); - } - if (data.rtChannel && result.indexOf(data.rtChannel) === -1) { - result.push(data.rtChannel); - } - if (data.ooImages && Array.isArray(data.ooImages)) { - Array.prototype.push.apply(result, data.ooImages); - } - if (result.indexOf(data.channel) === -1) { - result.push(data.channel); - } - }; - } - }; - if (type === "owned" && !Env.edPublic) { - return excludeInvalidIdentifiers(result); - } - if (type === "pin" && !Env.edPublic) { - return excludeInvalidIdentifiers(result); - } - var userObjects = _getUserObjects(Env); - userObjects.forEach((function(uo) { - var files = uo.getFiles([ UserObject.FILES_DATA ]); - files.forEach(addChannel(uo)); - })); - if (type === "owned") { - var sfOwned = Object.keys(Env.user.proxy[UserObject.SHARED_FOLDERS]).filter((function(fId) { - var owners = Env.user.proxy[UserObject.SHARED_FOLDERS][fId].owners; - if (_ownedByMe(Env, owners)) { - return true; - } - })).map((function(fId) { - return Env.user.proxy[UserObject.SHARED_FOLDERS][fId].channel; - })); - Array.prototype.push.apply(result, sfOwned); - } - if (type === "pin") { - var sfChannels = Object.keys(Env.folders).map((function(fId) { - try { - return Env.user.proxy[UserObject.SHARED_FOLDERS][fId].channel; - } catch (err) { - console.error(err); - } - })).filter(Boolean); - Array.prototype.push.apply(result, sfChannels); - } - return excludeInvalidIdentifiers(result); - }; - var addPad = function(Env, path, pad, cb) { - var uo = Env.user.userObject; - var p = [ "root" ]; - if (path) { - var resolved = _resolvePath(Env, path); - uo = resolved.userObject; - p = resolved.path; - } - var todo = function() { - var error; - nThen((function(waitFor) { - uo.pushData(pad, waitFor((function(e, id) { - if (e) { - error = e; - return; - } - uo.add(id, p); - }))); - })).nThen((function() { - cb(error); - })); - }; - if (!Env.pinPads) { - return void todo(); - } - Env.pinPads([ pad.channel ], (function(obj) { - if (obj && obj.error) { - return void cb(obj.error); - } - todo(); - })); - }; - var create = function(proxy, data, uoConfig) { - var Env = { - pinPads: data.pin, - unpinPads: data.unpin, - onSync: data.onSync, - Store: data.Store, - store: data.store, - removeOwnedChannel: data.removeOwnedChannel, - loadSharedFolder: data.loadSharedFolder, - cfg: uoConfig, - edPublic: data.edPublic, - settings: data.settings, - user: { - proxy - }, - folders: {} - }; - uoConfig.removeProxy = function(id) { - removeProxy(Env, id); - }; - Env.user.userObject = UserObject.init(proxy, uoConfig); - var callWithEnv = function(f) { - return function() { - [].unshift.call(arguments, Env); - return f.apply(null, arguments); - }; - }; - var addPin = function(pin, unpin) { - Env.pinPads = pin; - Env.unpinPads = unpin; - }; - var removePin = function() { - delete Env.pinPads; - delete Env.unpinPads; - }; - return { - addProxy: callWithEnv(addProxy), - removeProxy: callWithEnv(removeProxy), - deprecateProxy: callWithEnv(deprecateProxy), - restrictedProxy: callWithEnv(restrictedProxy), - addSharedFolder: callWithEnv(_addSharedFolder), - addPin, - removePin, - command: callWithEnv(onCommand), - getPadAttribute: callWithEnv(getPadAttribute), - setPadAttribute: callWithEnv(setPadAttribute), - getTagsList: callWithEnv(getTagsList), - getSecureFilesList: callWithEnv(getSecureFilesList), - getSharedFolderData: callWithEnv(getSharedFolderData), - getChannelsList: callWithEnv(getChannelsList), - addPad: callWithEnv(addPad), - delete: callWithEnv(_delete), - deleteOwned: callWithEnv(_deleteOwned), - findChannel: callWithEnv(findChannel), - findHref: callWithEnv(findHref), - findFile: callWithEnv(findFile), - getEditHash: callWithEnv(getEditHash), - user: Env.user, - folders: Env.folders - }; - }; - var renameInner = function(Env, path, newName, cb) { - return void Env.sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "rename", - data: { - path, - newName - } - }, cb); - }; - var moveInner = function(Env, paths, newPath, cb, copy) { - return void Env.sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "move", - data: { - paths, - newPath, - copy - } - }, cb); - }; - var emptyTrashInner = function(Env, deleteOwned, cb) { - return void Env.sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "emptyTrash", - data: { - deleteOwned - } - }, cb); - }; - var addFolderInner = function(Env, path, name, cb) { - return void Env.sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "addFolder", - data: { - path, - name - } - }, cb); - }; - var addSharedFolderInner = function(Env, path, data, cb) { - return void Env.sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "addSharedFolder", - data: { - path, - name: data.name, - owned: data.owned, - password: data.password - } - }, cb); - }; - var addLinkInner = function(Env, path, data, cb) { - return void Env.sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "addLink", - data: { - path, - name: data.name, - href: data.url - } - }, cb); - }; - var restoreSharedFolderInner = function(Env, fId, password, cb) { - return void Env.sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "restoreSharedFolder", - data: { - id: fId, - password - } - }, cb); - }; - var convertFolderToSharedFolderInner = function(Env, path, owned, password, cb) { - return void Env.sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "convertFolderToSharedFolder", - data: { - path, - owned, - password - } - }, cb); - }; - var deleteInner = function(Env, paths, cb) { - return void Env.sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "delete", - data: { - paths - } - }, cb); - }; - var deleteOwnedInner = function(Env, paths, cb) { - return void Env.sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "deleteOwned", - data: { - paths - } - }, cb); - }; - var restoreInner = function(Env, path, cb) { - return void Env.sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "restore", - data: { - path - } - }, cb); - }; - var setFolderDataInner = function(Env, data, cb) { - return void Env.sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "setFolderData", - data - }, cb); - }; - var updateStaticAccessInner = function(Env, id, cb) { - return void Env.sframeChan.query("Q_DRIVE_USEROBJECT", { - cmd: "updateStaticAccess", - data: id - }, cb); - }; - var findChannels = _findChannels; - var getFileData = _getFileData; - var getUserObjectPath = _getUserObjectPath; - var find = function(Env, path, fId) { - if (fId) { - return Env.folders[fId].userObject.find(path); - } - var resolved = _resolvePath(Env, path); - return resolved.userObject.find(resolved.path); - }; - var getTitle = function(Env, id, type) { - var uo = _getUserObjectFromId(Env, id); - return String(uo.getTitle(id, type)); - }; - var isStaticFile = function(Env, id) { - var uo = _getUserObjectFromId(Env, id); - return uo.isStaticFile(id); - }; - var isReadOnlyFile = function(Env, id) { - var uo = _getUserObjectFromId(Env, id); - return uo.isReadOnlyFile(id); - }; - var getFiles = function(Env, categories) { - var files = []; - var userObjects = _getUserObjects(Env); - userObjects.forEach((function(uo) { - Array.prototype.push.apply(files, uo.getFiles(categories)); - })); - files = Util.deduplicateString(files); - return files; - }; - var search = function(Env, value) { - var ret = []; - var userObjects = _getUserObjects(Env); - userObjects.forEach((function(uo) { - var fPath = _getUserObjectPath(Env, uo); - var results = uo.search(value); - if (!results.length) { - return; - } - if (fPath) { - results.forEach((function(r) { - r.inSharedFolder = true; - r.paths.forEach((function(p) { - Array.prototype.unshift.apply(p, fPath); - })); - })); - } - Array.prototype.push.apply(ret, results); - })); - return ret; - }; - var getRecentPads = function(Env) { - var files = []; - var userObjects = _getUserObjects(Env); - userObjects.forEach((function(uo) { - var data = uo.getFiles([ UserObject.FILES_DATA, UserObject.STATIC_DATA ]).map((function(id) { - return [ Number(id), uo.getFileData(id) ]; - })); - Array.prototype.push.apply(files, data); - })); - var sorted = files.filter((function(a) { - return a[1].atime; - })).sort((function(a, b) { - return b[1].atime - a[1].atime; - })); - return sorted; - }; - var getOwnedPads = function(Env) { - return Env.user.userObject.getOwnedPads(Env.edPublic); - }; - var setHistoryMode = function(Env, flag) { - Env.isHistoryMode = Boolean(flag); - }; - var getFolderData = function(Env, path) { - var resolved = _resolvePath(Env, path); - if (!resolved || !resolved.userObject) { - return {}; - } - if (!resolved.id) { - var el = Env.user.userObject.find(resolved.path); - if (Env.user.userObject.isSharedFolder(el)) { - return getSharedFolderData(Env, el); - } - } - var folder = resolved.userObject.find(resolved.path); - return resolved.userObject.getFolderData(folder); - }; - var isInSharedFolder = _isInSharedFolder; - var isValidDrive = function(Env, obj) { - return Env.user.userObject.isValidDrive(obj); - }; - var isFile = function(Env, el, allowStr) { - return Env.user.userObject.isFile(el, allowStr); - }; - var isFolder = function(Env, el) { - return Env.user.userObject.isFolder(el); - }; - var isSharedFolder = function(Env, el) { - return Env.user.userObject.isSharedFolder(el); - }; - var isFolderEmpty = function(Env, el) { - if (Env.folders[el]) { - var uo = Env.folders[el].userObject; - return uo.isFolderEmpty(uo.find[uo.ROOT]); - } - return Env.user.userObject.isFolderEmpty(el); - }; - var isPathIn = function(Env, path, categories) { - return Env.user.userObject.isPathIn(path, categories); - }; - var isSubpath = function(Env, path, parentPath) { - return Env.user.userObject.isSubpath(path, parentPath); - }; - var isInTrashRoot = function(Env, path) { - return Env.user.userObject.isInTrashRoot(path); - }; - var comparePath = function(Env, a, b) { - return Env.user.userObject.comparePath(a, b); - }; - var hasSubfolder = function(Env, el, trashRoot) { - if (Env.folders[el]) { - var uo = Env.folders[el].userObject; - return uo.hasSubfolder(uo.find[uo.ROOT]); - } - return Env.user.userObject.hasSubfolder(el, trashRoot); - }; - var hasSubSharedFolder = function(Env, el) { - return Env.user.userObject.hasSubSharedFolder(el); - }; - var hasFile = function(Env, el, trashRoot) { - if (Env.folders[el]) { - var uo = Env.folders[el].userObject; - return uo.hasFile(uo.find[uo.ROOT]); - } - return Env.user.userObject.hasFile(el, trashRoot); - }; - var ownedInTrash = function(Env) { - return Env.user.userObject.ownedInTrash((function(owners) { - return _ownedByMe(Env, owners); - })); - }; - var isDuplicateOwned = _isDuplicateOwned; - var createInner = function(proxy, sframeChan, edPublic, uoConfig) { - var Env = { - cfg: uoConfig, - sframeChan, - edPublic, - user: { - proxy, - userObject: UserObject.init(proxy, uoConfig) - }, - folders: {} - }; - var callWithEnv = function(f) { - return function() { - [].unshift.call(arguments, Env); - return f.apply(null, arguments); - }; - }; - return { - addProxy: callWithEnv(addProxy), - removeProxy: callWithEnv(removeProxy), - setHistoryMode: callWithEnv(setHistoryMode), - rename: callWithEnv(renameInner), - move: callWithEnv(moveInner), - emptyTrash: callWithEnv(emptyTrashInner), - addFolder: callWithEnv(addFolderInner), - addSharedFolder: callWithEnv(addSharedFolderInner), - addLink: callWithEnv(addLinkInner), - restoreSharedFolder: callWithEnv(restoreSharedFolderInner), - convertFolderToSharedFolder: callWithEnv(convertFolderToSharedFolderInner), - delete: callWithEnv(deleteInner), - deleteOwned: callWithEnv(deleteOwnedInner), - restore: callWithEnv(restoreInner), - setFolderData: callWithEnv(setFolderDataInner), - updateStaticAccess: callWithEnv(updateStaticAccessInner), - getFileData: callWithEnv(getFileData), - find: callWithEnv(find), - getTitle: callWithEnv(getTitle), - isReadOnlyFile: callWithEnv(isReadOnlyFile), - isStaticFile: callWithEnv(isStaticFile), - getFiles: callWithEnv(getFiles), - search: callWithEnv(search), - getRecentPads: callWithEnv(getRecentPads), - getOwnedPads: callWithEnv(getOwnedPads), - getTagsList: callWithEnv(getTagsList), - findFile: callWithEnv(findFile), - findFiles: callWithEnv(findFiles), - findChannels: callWithEnv(findChannels), - getSharedFolderData: callWithEnv(getSharedFolderData), - getFolderData: callWithEnv(getFolderData), - isInSharedFolder: callWithEnv(isInSharedFolder), - getUserObjectPath: callWithEnv(getUserObjectPath), - isDuplicateOwned: callWithEnv(isDuplicateOwned), - ownedInTrash: callWithEnv(ownedInTrash), - isValidDrive: callWithEnv(isValidDrive), - isFile: callWithEnv(isFile), - isFolder: callWithEnv(isFolder), - isSharedFolder: callWithEnv(isSharedFolder), - isFolderEmpty: callWithEnv(isFolderEmpty), - isPathIn: callWithEnv(isPathIn), - isSubpath: callWithEnv(isSubpath), - isInTrashRoot: callWithEnv(isInTrashRoot), - comparePath: callWithEnv(comparePath), - hasSubfolder: callWithEnv(hasSubfolder), - hasSubSharedFolder: callWithEnv(hasSubSharedFolder), - hasFile: callWithEnv(hasFile), - user: Env.user, - folders: Env.folders - }; - }; - return { - setCustomize, - create, - createInner - }; - }; - if (module.exports) { - module.exports = factory(requireUserObject(), requireCommonUtil(), requireCommonHash(), requireSharedfolder(), undefined, requireCommonFeedback(), requireNthen()); - } - })(); - })(proxyManager$1); - return proxyManager$1.exports; - } - var proxyManagerExports = requireProxyManager(); - var proxyManager = getDefaultExportFromCjs(proxyManagerExports); - var ProxyManager = _mergeNamespaces({ - __proto__: null, - default: proxyManager - }, [ proxyManagerExports ]); - var userObjectExports = requireUserObject(); - var userObject = getDefaultExportFromCjs(userObjectExports); - var UO = _mergeNamespaces({ - __proto__: null, - default: userObject - }, [ userObjectExports ]); - var padTypes$1 = { - exports: {} - }; - var currentVersion = { - exports: {} - }; - var hasRequiredCurrentVersion; - function requireCurrentVersion() { - if (hasRequiredCurrentVersion) return currentVersion.exports; - hasRequiredCurrentVersion = 1; - (function(module) { - (() => { - const factory = () => ({ - currentVersion: "v7" - }); - if (module.exports) { - module.exports = factory(); - } - })(); - })(currentVersion); - return currentVersion.exports; - } - var hasRequiredPadTypes; - function requirePadTypes() { - if (hasRequiredPadTypes) return padTypes$1.exports; - hasRequiredPadTypes = 1; - (function(module) { - (() => { - const factory = (AppConfig = {}, ApiConfig = {}, OOCurrentVersion) => { - let availablePadTypes = []; - const OO_APPS = [ "sheet", "doc", "presentation" ]; - const setCustomize = data => { - AppConfig = data.AppConfig; - ApiConfig = data.ApiConfig; - const ooEnabled = ApiConfig.onlyOffice && ApiConfig.onlyOffice.availableVersions.includes(OOCurrentVersion.currentVersion); - availablePadTypes = AppConfig.availablePadTypes.filter((t => ooEnabled || !OO_APPS.includes(t))); - }; - if (Object.keys(AppConfig).length) { - setCustomize({ - AppConfig, - ApiConfig - }); - } - const Types = { - setCustomize - }; - Types.__defineGetter__("availableTypes", (function() { - if (ApiConfig.appsToDisable) { - return availablePadTypes.filter((value => !ApiConfig.appsToDisable.includes(value))); - } - return availablePadTypes; - })); - Types.__defineGetter__("appsToSelect", (function() { - return availablePadTypes.filter((value => ![ "drive", "teams", "file", "contacts", "convert" ].includes(value))); - })); - Types.isAvailable = type => Array.isArray(Types.availableTypes) && Types.availableTypes.includes(type); - return Types; - }; - if (module.exports) { - module.exports = factory(undefined, undefined, requireCurrentVersion()); - } - })(); - })(padTypes$1); - return padTypes$1.exports; - } - var padTypesExports = requirePadTypes(); - var padTypes = getDefaultExportFromCjs(padTypesExports); - var PadTypes = _mergeNamespaces({ - __proto__: null, - default: padTypes - }, [ padTypesExports ]); - var loginBlock$1 = { - exports: {} - }; - var httpCommand = { - exports: {} - }; - var hasRequiredHttpCommand; - function requireHttpCommand() { - if (hasRequiredHttpCommand) return httpCommand.exports; - hasRequiredHttpCommand = 1; - (function(module) { - (() => { - const factory = (nThen, Util, ApiConfig = {}, Nacl) => { - const getApiOrigin = function() { - if (!Object.keys(ApiConfig).length) { - return; - } - var url; - var unsafeOriginURL = new URL(ApiConfig.httpUnsafeOrigin); - try { - url = new URL(ApiConfig.websocketPath, ApiConfig.httpUnsafeOrigin); - url.protocol = unsafeOriginURL.protocol; - return url.origin; - } catch (err) { - console.error(err); - return ApiConfig.httpUnsafeOrigin; - } - }; - var API_ORIGIN = getApiOrigin(); - const setCustomize = data => { - ApiConfig = data.ApiConfig; - API_ORIGIN = getApiOrigin(); - }; - var clone = o => JSON.parse(JSON.stringify(o)); - var randomToken = () => Nacl.util.encodeBase64(Nacl.randomBytes(24)); - var postData = function(url, data, cb) { - var CB = Util.once(Util.mkAsync(cb)); - fetch(url, { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify(data) - }).then((response => { - if (response.ok) { - return void response.text().then((result => { - CB(void 0, Util.tryParse(result)); - })); - } - response.json().then().then((result => { - CB(response.status, result); - })); - })).catch((error => { - CB(error); - })); - }; - var serverCommand = function(keypair, my_data, cb) { - var obj = clone(my_data); - obj.publicKey = Nacl.util.encodeBase64(keypair.publicKey); - obj.nonce = randomToken(); - var href = new URL("/api/auth/", API_ORIGIN); - var txid, date; - nThen((function(w) { - postData(href, obj, w(((err, data) => { - if (err) { - w.abort(); - console.error(err); - if (data) { - console.error(data); - } - return void cb(err); - } - if (!data.date || !data.txid) { - w.abort(); - return void cb("REQUEST_REJECTED"); - } - txid = data.txid; - date = data.date; - }))); - })).nThen((function(w) { - var copy = clone(obj); - copy.txid = txid; - copy.date = date; - var toSign = Nacl.util.decodeUTF8(JSON.stringify(copy)); - var sig = Nacl.sign.detached(toSign, keypair.secretKey); - var encoded = Nacl.util.encodeBase64(sig); - var obj2 = { - sig: encoded, - txid - }; - postData(href, obj2, w(((err, data) => { - if (err) { - w.abort(); - console.error(err); - if (data) { - console.error(data); - } - return void cb("RESPONSE_REJECTED", data); - } - cb(void 0, data); - }))); - })); - }; - serverCommand.setCustomize = setCustomize; - return serverCommand; - }; - if (module.exports) { - module.exports = factory(requireNthen(), requireCommonUtil(), undefined, requireNaclFast()); - } - })(); - })(httpCommand); - return httpCommand.exports; - } - var hasRequiredLoginBlock; - function requireLoginBlock() { - if (hasRequiredLoginBlock) return loginBlock$1.exports; - hasRequiredLoginBlock = 1; - (function(module) { - (() => { - const factory = (Util, ApiConfig = {}, ServerCommand, Nacl) => { - var Block = {}; - Block.setCustomize = data => { - ApiConfig = data.ApiConfig; - ServerCommand.setCustomize(data); - }; - Block.join = Util.uint8ArrayJoin; - Block.seed = function() { - return Nacl.hash(Nacl.util.decodeUTF8("pewpewpew")); - }; - Block.genkeys = function(seed) { - if (!(seed instanceof Uint8Array)) { - throw new Error("INVALID_SEED_FORMAT"); - } - if (!seed || typeof seed.length !== "number" || seed.length < 64) { - throw new Error("INVALID_SEED_LENGTH"); - } - var signSeed = seed.subarray(0, Nacl.sign.seedLength); - var symmetric = seed.subarray(Nacl.sign.seedLength, Nacl.sign.seedLength + Nacl.secretbox.keyLength); - return { - sign: Nacl.sign.keyPair.fromSeed(signSeed), - symmetric - }; - }; - Block.keysToRPCFormat = function(keys) { - try { - var sign = keys.sign; - return { - edPrivate: Nacl.util.encodeBase64(sign.secretKey), - edPublic: Nacl.util.encodeBase64(sign.publicKey) - }; - } catch (err) { - console.error(err); - return; - } - }; - Block.encrypt = function(version, content, keys) { - var u8 = Nacl.util.decodeUTF8(content); - var nonce = Nacl.randomBytes(Nacl.secretbox.nonceLength); - return Block.join([ [ 0 ], nonce, Nacl.secretbox(u8, nonce, keys.symmetric) ]); - }; - Block.decrypt = function(u8_content, keys) { - var nonce = u8_content.subarray(1, 1 + Nacl.secretbox.nonceLength); - var box = u8_content.subarray(1 + Nacl.secretbox.nonceLength); - var plaintext = Nacl.secretbox.open(box, nonce, keys.symmetric); - try { - return JSON.parse(Nacl.util.encodeUTF8(plaintext)); - } catch (e) { - console.error(e); - return; - } - }; - Block.sign = function(ciphertext, keys) { - return Nacl.sign.detached(Nacl.hash(ciphertext), keys.sign.secretKey); - }; - Block.serialize = function(content, keys) { - var ciphertext = Block.encrypt(0, content, keys); - var sig = Block.sign(ciphertext, keys); - return { - publicKey: Nacl.util.encodeBase64(keys.sign.publicKey), - signature: Nacl.util.encodeBase64(sig), - ciphertext: Nacl.util.encodeBase64(ciphertext) - }; - }; - Block.proveAncestor = function(O) { - var u8_pub = Util.find(O, [ "sign", "publicKey" ]); - var u8_secret = Util.find(O, [ "sign", "secretKey" ]); - try { - var u8_sig = Nacl.sign.detached(u8_pub, u8_secret); - return JSON.stringify([ u8_pub, u8_sig ].map(Nacl.util.encodeBase64)); - } catch (err) { - return void console.error(err); - } - }; - var urlSafeB64 = function(u8) { - return Nacl.util.encodeBase64(u8).replace(/\//g, "-"); - }; - Block.getBlockUrl = function(keys) { - var publicKey = urlSafeB64(keys.sign.publicKey); - return (ApiConfig.fileHost || ApiConfig.httpUnsafeOrigin || window.location.origin) + "/block/" + publicKey.slice(0, 2) + "/" + publicKey; - }; - Block.getBlockHash = function(keys) { - var absolute = Block.getBlockUrl(keys); - var symmetric = urlSafeB64(keys.symmetric); - return absolute + "#" + symmetric; - }; - var decodeSafeB64 = function(b64) { - try { - return Nacl.util.decodeBase64(b64.replace(/\-/g, "/")); - } catch (e) { - console.error(e); - return; - } - }; - Block.parseBlockHash = function(hash) { - if (typeof hash !== "string") { - return; - } - var parts = hash.split("#"); - if (parts.length !== 2) { - return; - } - try { - return { - href: parts[0], - keys: { - symmetric: decodeSafeB64(parts[1]) - } - }; - } catch (e) { - console.error(e); - return; - } - }; - Block.checkRights = function(data, _cb) { - const cb = Util.mkAsync(_cb); - const {blockKeys, auth} = data; - var command = "MFA_CHECK"; - if (auth && auth.type) { - command = `${auth.type.toUpperCase()}_` + command; - } - ServerCommand(blockKeys.sign, { - command, - auth: auth && auth.data - }, cb); - }; - Block.writeLoginBlock = function(data, cb) { - const {content, blockKeys, oldBlockKeys, auth, pw, session, token, userData} = data; - var command = "WRITE_BLOCK"; - if (auth && auth.type) { - command = `${auth.type.toUpperCase()}_` + command; - } - var block = Block.serialize(JSON.stringify(content), blockKeys); - block.auth = auth && auth.data; - block.hasPassword = pw; - block.registrationProof = oldBlockKeys && Block.proveAncestor(oldBlockKeys); - if (token) { - block.inviteToken = token; - } - if (userData) { - block.userData = userData; - } - ServerCommand(blockKeys.sign, { - command, - content: block, - session - }, cb); - }; - Block.removeLoginBlock = function(data, cb) { - const {reason, blockKeys, auth, edPublic} = data; - var command = "REMOVE_BLOCK"; - if (auth && auth.type) { - command = `${auth.type.toUpperCase()}_` + command; - } - ServerCommand(blockKeys.sign, { - command, - auth: auth && auth.data, - edPublic, - reason - }, cb); - }; - Block.updateSSOBlock = function(data, cb) { - const {blockKeys, oldBlockKeys} = data; - var oldProof = oldBlockKeys && Block.proveAncestor(oldBlockKeys); - ServerCommand(blockKeys.sign, { - command: "SSO_UPDATE_BLOCK", - ancestorProof: oldProof - }, cb); - }; - return Block; - }; - if (module.exports) { - module.exports = factory(requireCommonUtil(), undefined, requireHttpCommand(), requireNaclFast()); - } - })(); - })(loginBlock$1); - return loginBlock$1.exports; - } - var loginBlockExports = requireLoginBlock(); - var loginBlock = getDefaultExportFromCjs(loginBlockExports); - var LoginBlock = _mergeNamespaces({ - __proto__: null, - default: loginBlock - }, [ loginBlockExports ]); - var asyncStore$1 = { - exports: {} - }; - var JSON_sortify = { - exports: {} - }; - var hasRequiredJSON_sortify; - function requireJSON_sortify() { - if (hasRequiredJSON_sortify) return JSON_sortify.exports; - hasRequiredJSON_sortify = 1; - (function(module) { - (function(a) { - module.exports ? module.exports = a() : JSON.sortify = a(); - })((function() { - var a = function(b) { - if (Array.isArray(b)) return b.map(a); - if (b instanceof Object) { - var c = [], d = []; - return Object.keys(b).forEach((function(a) { - /^(0|[1-9][0-9]*)$/.test(a) ? c.push(+a) : d.push(a); - })), c.sort((function(c, a) { - return c - a; - })).concat(d.sort()).reduce((function(c, d) { - return c[d] = a(b[d]), c; - }), {}); - } - return b; - }, b = JSON.stringify.bind(JSON); - return function sortify(c, d, e) { - var f = b(c, d, 0); - if (!f || f[0] !== "{" && f[0] !== "[") return f; - var g = JSON.parse(f); - return b(a(g), null, e); - }; - })); - })(JSON_sortify); - return JSON_sortify.exports; - } - var migrateUserObject$1 = { - exports: {} - }; - var commonMessaging = { - exports: {} - }; - var hasRequiredCommonMessaging; - function requireCommonMessaging() { - if (hasRequiredCommonMessaging) return commonMessaging.exports; - hasRequiredCommonMessaging = 1; - (function(module) { - (() => { - const factory = (Crypto, Hash, Util, Constants, Realtime) => { - var Msg = {}; - var createData = Msg.createData = function(proxy, hash) { - var data = { - channel: hash || Hash.createChannelId(), - displayName: proxy["cryptpad.username"], - profile: proxy.profile && proxy.profile.view, - edPublic: proxy.edPublic, - curvePublic: proxy.curvePublic, - notifications: Util.find(proxy, [ "mailboxes", "notifications", "channel" ]), - avatar: proxy.profile && proxy.profile.avatar, - uid: proxy.uid - }; - if (hash === false) { - delete data.channel; - } - return data; - }; - var getFriend = Msg.getFriend = function(proxy, pubkey) { - if (!pubkey) { - return; - } - if (pubkey === proxy.curvePublic) { - var data = createData(proxy); - delete data.channel; - return data; - } - return proxy.friends ? proxy.friends[pubkey] : undefined; - }; - var getFriendList = Msg.getFriendList = function(proxy) { - if (!proxy.friends) { - proxy.friends = {}; - } - return proxy.friends; - }; - var eachFriend = function(friends, cb) { - Object.keys(friends).forEach((function(id) { - if (id === "me") { - return; - } - cb(friends[id], id, friends); - })); - }; - Msg.getFriendChannelsList = function(proxy) { - var list = []; - eachFriend(proxy.friends, (function(friend) { - list.push(friend.channel); - })); - return list; - }; - Msg.declineFriendRequest = function(store, data, cb) { - store.mailbox.sendTo("DECLINE_FRIEND_REQUEST", {}, { - channel: data.notifications, - curvePublic: data.curvePublic - }, (function(obj) { - cb(obj); - })); - }; - Msg.acceptFriendRequest = function(store, data, cb) { - var friend = getFriend(store.proxy, data.curvePublic) || {}; - var myData = createData(store.proxy, friend.channel || data.channel); - store.mailbox.sendTo("ACCEPT_FRIEND_REQUEST", { - user: myData - }, { - channel: data.notifications, - curvePublic: data.curvePublic - }, (function(obj) { - cb(obj); - })); - }; - Msg.addToFriendList = function(cfg, data, cb) { - var proxy = cfg.proxy; - var friends = getFriendList(proxy); - var pubKey = data.curvePublic; - if (pubKey === proxy.curvePublic) { - return void cb("E_MYKEY"); - } - friends[pubKey] = data; - Realtime.whenRealtimeSyncs(cfg.realtime, (function() { - cb(); - cfg.pinPads([ data.channel ], (function(res) { - if (res.error) { - console.error(res.error); - } - })); - })); - }; - Msg.updateMyData = function(store, curve) { - var myData = createData(store.proxy, false); - if (store.proxy.friends) { - store.proxy.friends.me = Util.clone(myData); - delete store.proxy.friends.me.channel; - } - if (store.modules["team"]) { - store.modules["team"].updateMyData(myData); - } - var todo = function(friend) { - if (!friend || !friend.notifications) { - return; - } - delete friend.user; - myData.channel = friend.channel; - store.mailbox.sendTo("UPDATE_DATA", myData, { - channel: friend.notifications, - curvePublic: friend.curvePublic - }, (function(obj) { - if (obj && obj.error) { - console.error(obj); - } - })); - }; - if (curve) { - var friend = getFriend(store.proxy, curve); - return void todo(friend); - } - eachFriend(store.proxy.friends || {}, todo); - }; - Msg.removeFriend = function(store, curvePublic, cb) { - var proxy = store.proxy; - var friend = proxy.friends[curvePublic]; - if (!friend) { - return void cb({ - error: "ENOENT" - }); - } - if (!friend.notifications) { - return void cb({ - error: "EINVAL" - }); - } - store.mailbox.sendTo("UNFRIEND", { - curvePublic: proxy.curvePublic - }, { - channel: friend.notifications, - curvePublic: friend.curvePublic - }, (function(obj) { - if (obj && obj.error) { - return void cb(obj); - } - store.messenger.onFriendRemoved(curvePublic, friend.channel); - delete proxy.friends[curvePublic]; - Realtime.whenRealtimeSyncs(store.realtime, (function() { - cb(obj); - })); - })); - }; - return Msg; - }; - if (module.exports) { - module.exports = factory(requireCrypto(), requireCommonHash(), requireCommonUtil(), requireCommonConstants(), requireCommonRealtime()); - } - })(); - })(commonMessaging); - return commonMessaging.exports; - } - var cryptget = { - exports: {} - }; - var pinpad = { - exports: {} - }; - var rpc = { - exports: {} - }; - var hasRequiredRpc; - function requireRpc() { - if (hasRequiredRpc) return rpc.exports; - hasRequiredRpc = 1; - (function(module) { - (function() { - var factory = function(Util, Nacl) { - var uid = Util.uid; - var tryParse = Util.tryParse; - var signMsg = function(data, signKey) { - var buffer = Nacl.util.decodeUTF8(JSON.stringify(data)); - return Nacl.util.encodeBase64(Nacl.sign.detached(buffer, signKey)); - }; - var sendMsg = function(ctx, data, cb) { - if (typeof cb !== "function") { - throw new Error("expected callback"); - } - var network = ctx.network; - var hkn = network.historyKeeper; - if (typeof hkn !== "string") { - return void cb("NO_HISTORY_KEEPER"); - } - var txid = uid(); - var pending = ctx.pending[txid] = function(err, response) { - cb(err, response); - }; - pending.data = data; - pending.called = 0; - return network.sendto(hkn, JSON.stringify([ txid, data ])); - }; - var matchesAnon = function(ctx, txid) { - if (!ctx.anon) { - return false; - } - if (typeof ctx.anon.pending[txid] !== "function") { - return false; - } - return true; - }; - var handleAnon = function(ctx, txid, body) { - var pending = ctx.pending[txid]; - if (body[0] === "ERROR") { - pending(body[1]); - } else { - pending(void 0, body.slice(1)); - } - delete ctx.pending[txid]; - }; - var onMsg = function(ctx, msg) { - if (typeof msg !== "string") { - console.error("received non-string message [%s]", msg); - } - var parsed = tryParse(msg); - if (!parsed) { - return void console.error(new Error("could not parse message: %s", msg)); - } - if (!Array.isArray(parsed)) { - return; - } - if (/(FULL_HISTORY|HISTORY_RANGE)/.test(parsed[0])) { - return; - } - var txid = parsed[0]; - if (typeof txid !== "string") { - return; - } - if (matchesAnon(ctx, txid)) { - return void handleAnon(ctx.anon, txid, parsed.slice(1)); - } - if (ctx.authenticated.some((function(rpc_ctx) { - var pending = rpc_ctx.pending[txid]; - if (typeof pending !== "function") { - return false; - } - if (parsed[1] !== "ERROR") { - if (/\|/.test(parsed[1]) && rpc_ctx.cookie !== parsed[1]) { - rpc_ctx.cookie = parsed[1]; - } - pending(void 0, parsed.slice(2)); - delete rpc_ctx.pending[txid]; - return true; - } - if (parsed[2] === "NO_COOKIE") { - rpc_ctx.send("COOKIE", "", (function(e) { - if (e) { - console.error(e); - return void pending(e); - } - if (rpc_ctx.resend(txid)) { - delete rpc_ctx.pending[txid]; - } - })); - return true; - } - pending(parsed[2]); - delete rpc_ctx.pending[txid]; - return true; - }))) { - return; - } - console.error("UNHANDLED RPC MESSAGE", msg); - }; - var networks = []; - var contexts = []; - var initNetworkContext = function(network) { - var ctx = { - network, - connected: true, - anon: undefined, - authenticated: [] - }; - networks.push(network); - contexts.push(ctx); - network.on("message", (function(msg, sender) { - if (sender !== network.historyKeeper) { - return; - } - onMsg(ctx, msg); - })); - network.on("disconnect", (function() { - ctx.connected = false; - if (ctx.anon) { - ctx.anon.connected = false; - } - ctx.authenticated.forEach((function(ctx) { - ctx.connected = false; - })); - })); - network.on("reconnect", (function() { - if (ctx.anon) { - ctx.anon.connected = true; - } - ctx.authenticated.forEach((function(ctx) { - ctx.connected = true; - })); - })); - return ctx; - }; - var getNetworkContext = function(network) { - var i; - networks.some((function(current, j) { - if (network !== current) { - return false; - } - i = j; - return true; - })); - if (contexts[i]) { - return contexts[i]; - } - return initNetworkContext(network); - }; - var initAuthenticatedRpc = function(networkContext, keys) { - var ctx = { - network: networkContext.network, - publicKey: keys.publicKeyString, - timeouts: {}, - pending: {}, - cookie: null, - connected: true - }; - var send = ctx.send = function(type, msg, _cb) { - var cb = Util.mkAsync(_cb); - if (!ctx.connected && type !== "COOKIE") { - return void cb("DISCONNECTED"); - } - var data = [ type, msg ]; - if (ctx.cookie && ctx.cookie.join) { - data.unshift(ctx.cookie.join("|")); - } else { - data.unshift(ctx.cookie); - } - var sig = signMsg(data, keys.signKey); - data.unshift(keys.publicKeyString); - data.unshift(sig); - return sendMsg(ctx, data, cb); - }; - ctx.resend = function(txid) { - var pending = ctx.pending[txid]; - if (pending.called) { - console.error("[%s] called too many times", txid); - return true; - } - pending.called++; - pending.data[2] = ctx.cookie; - pending.data[0] = signMsg(pending.data.slice(2), keys.signKey); - var new_txid = uid(); - ctx.pending[new_txid] = pending; - delete ctx.pending[txid]; - try { - return ctx.network.sendto(ctx.network.historyKeeper, JSON.stringify([ new_txid, pending.data ])); - } catch (e) { - console.log("failed to resend"); - console.error(e); - } - }; - send.unauthenticated = function(type, msg, _cb) { - var cb = Util.mkAsync(_cb); - if (!ctx.connected) { - return void cb("DISCONNECTED"); - } - var data = [ null, keys.publicKeyString, null, type, msg ]; - if (ctx.cookie && ctx.cookie.join) { - data[2] = ctx.cookie.join("|"); - } else { - data[2] = ctx.cookie; - } - return sendMsg(ctx, data, cb); - }; - ctx.destroy = function() { - Object.keys(ctx.timeouts).forEach((function(to) { - clearTimeout(to); - })); - var idx = networkContext.authenticated.indexOf(ctx); - if (idx === -1) { - return; - } - networkContext.authenticated.splice(idx, 1); - }; - networkContext.authenticated.push(ctx); - return ctx; - }; - var getAuthenticatedContext = function(networkContext, keys) { - if (!networkContext) { - throw new Error("expected network context"); - } - var publicKey = keys.publicKeyString; - var i; - networkContext.authenticated.some((function(ctx, j) { - if (ctx.publicKey !== publicKey) { - return false; - } - i = j; - return true; - })); - if (networkContext.authenticated[i]) { - return networkContext.authenticated[i]; - } - return initAuthenticatedRpc(networkContext, keys); - }; - var create = function(network, edPrivateKey, edPublicKey, _cb) { - if (typeof _cb !== "function") { - throw new Error("expected callback"); - } - var cb = Util.mkAsync(_cb); - var signKey; - try { - signKey = Nacl.util.decodeBase64(edPrivateKey); - if (signKey.length !== 64) { - throw new Error("private key did not match expected length of 64"); - } - } catch (err) { - return void cb(err); - } - try { - if (Nacl.util.decodeBase64(edPublicKey).length !== 32) { - return void cb("expected public key to be 32 uint"); - } - } catch (err) { - return void cb(err); - } - if (!network) { - return void cb("NO_NETWORK"); - } - var net_ctx = getNetworkContext(network); - var rpc_ctx = getAuthenticatedContext(net_ctx, { - publicKeyString: edPublicKey, - signKey - }); - rpc_ctx.send("COOKIE", "", (function(e) { - if (e) { - return void cb(e); - } - cb(void 0, { - send: rpc_ctx.send, - destroy: rpc_ctx.destroy - }); - })); - }; - var initAnonRpc = function(networkContext) { - var ctx = { - network: networkContext.network, - timeouts: {}, - pending: {}, - connected: true - }; - networkContext.anon = ctx; - ctx.send = function(type, msg, _cb) { - var cb = Util.mkAsync(_cb); - if (!ctx.connected) { - return void cb("DISCONNECTED"); - } - var data = [ type, msg ]; - return sendMsg(ctx, data, cb); - }; - ctx.resend = function(txid) { - var pending = ctx.pending[txid]; - if (pending.called) { - console.error("[%s] called too many times", txid); - return true; - } - pending.called++; - try { - return ctx.network.sendto(ctx.network.historyKeeper, JSON.stringify([ txid, pending.data ])); - } catch (e) { - console.log("failed to resend"); - console.error(e); - } - }; - ctx.destroy = function() { - Object.keys(ctx.timeouts).forEach((function(to) { - clearTimeout(to); - })); - networkContext.anon = undefined; - }; - return ctx; - }; - var getAnonContext = function(networkContext) { - return networkContext.anon || initAnonRpc(networkContext); - }; - var createAnonymous = function(network, _cb) { - var cb = Util.mkAsync(_cb); - if (typeof cb !== "function") { - throw new Error("expected callback"); - } - if (!network) { - return void cb("NO_NETWORK"); - } - var ctx = getAnonContext(getNetworkContext(network)); - cb(void 0, { - send: ctx.send, - destroy: ctx.destroy - }); - }; - return { - create, - createAnonymous - }; - }; - if (module.exports) { - module.exports = factory(requireCommonUtil(), requireNaclFast()); - } - })(); - })(rpc); - return rpc.exports; - } - var hasRequiredPinpad; - function requirePinpad() { - if (hasRequiredPinpad) return pinpad.exports; - hasRequiredPinpad = 1; - (function(module) { - (function() { - var factory = function(Util, Rpc) { - var create = function(network, proxy, _cb, Cache) { - if (typeof _cb !== "function") { - throw new Error("Expected callback"); - } - var cb = Util.once(Util.mkAsync(_cb)); - if (!network) { - return void cb("INVALID_NETWORK"); - } - if (!proxy) { - return void cb("INVALID_PROXY"); - } - var edPrivate = proxy.edPrivate; - var edPublic = proxy.edPublic; - if (!(edPrivate && edPublic)) { - return void cb("INVALID_KEYS"); - } - Rpc.create(network, edPrivate, edPublic, (function(e, rpc) { - if (e) { - return void cb(e); - } - var exp = {}; - exp.destroy = rpc.destroy; - exp.publicKey = edPublic; - exp.send = rpc.send; - exp.pin = function(channels, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - if (!Array.isArray(channels)) { - return void cb("[TypeError] pin expects an array"); - } - rpc.send("PIN", channels, cb); - }; - exp.unpin = function(channels, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - if (!Array.isArray(channels)) { - return void cb("[TypeError] pin expects an array"); - } - rpc.send("UNPIN", channels, cb); - }; - exp.adminRpc = function(obj, cb) { - if (!obj.cmd) { - setTimeout((function() { - cb("[TypeError] admin rpc expects a command"); - })); - return; - } - var params = [ obj.cmd, obj.data ]; - rpc.send("ADMIN", params, cb); - }; - exp.getServerHash = function(cb) { - rpc.send("GET_HASH", edPublic, (function(e, hash) { - if (!(hash && hash[0])) { - return void cb("NO_HASH_RETURNED"); - } - cb(e, Array.isArray(hash) && hash[0] || undefined); - })); - }; - exp.reset = function(channels, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - if (!Array.isArray(channels)) { - return void cb("[TypeError] pin expects an array"); - } - rpc.send("RESET", channels, cb); - }; - exp.getFileListSize = function(cb) { - rpc.send("GET_TOTAL_SIZE", undefined, (function(e, response) { - if (e) { - return void cb(e); - } - if (response && response.length && typeof response[0] === "number") { - cb(void 0, response[0]); - } else { - cb("INVALID_RESPONSE"); - } - })); - }; - exp.updatePinLimits = function(cb) { - rpc.send("UPDATE_LIMITS", undefined, (function(e, response) { - if (e) { - return void cb(e); - } - if (response && response.length && typeof response[0] === "number") { - cb(void 0, response[0], response[1], response[2]); - } else { - cb("INVALID_RESPONSE"); - } - })); - }; - exp.getLimit = function(cb) { - rpc.send("GET_LIMIT", undefined, (function(e, response) { - if (e) { - return void cb(e); - } - if (response && response.length && typeof response[0] === "number") { - cb(void 0, response[0], response[1], response[2]); - } else { - cb("INVALID_RESPONSE"); - } - })); - }; - exp.trimHistory = function(data, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - if (typeof data !== "object" || !data.channel || !data.hash) { - return void cb("INVALID_ARGUMENTS"); - } - rpc.send("TRIM_HISTORY", data, (function(e) { - if (e) { - return cb(e); - } - cb(); - })); - }; - exp.clearOwnedChannel = function(channel, cb) { - if (typeof channel !== "string" || channel.length !== 32) { - return void cb("INVALID_ARGUMENTS"); - } - rpc.send("CLEAR_OWNED_CHANNEL", channel, (function(e) { - if (e) { - return cb(e); - } - cb(); - })); - }; - exp.removeOwnedChannel = function(channel, cb, reason) { - if (typeof channel !== "string" || [ 32, 48 ].indexOf(channel.length) === -1) { - console.error("invalid channel to remove", channel); - return void cb("INVALID_ARGUMENTS"); - } - rpc.send("REMOVE_OWNED_CHANNEL", { - channel, - reason - }, (function(e, response) { - if (e) { - return void cb(e); - } - if (response && response.length && response[0] === "OK") { - cb(); - if (Cache && Cache.clearChannel) { - Cache.clearChannel(channel); - } - } else { - cb("INVALID_RESPONSE"); - } - })); - }; - exp.removePins = function(cb) { - rpc.send("REMOVE_PINS", undefined, (function(e, response) { - if (e) { - return void cb(e); - } - if (response && response.length && response[0] === "OK") { - cb(); - } else { - cb("INVALID_RESPONSE"); - } - })); - }; - exp.uploadComplete = function(id, cb) { - rpc.send("UPLOAD_COMPLETE", id, (function(e, res) { - if (e) { - return void cb(e); - } - var id = res[0]; - if (typeof id !== "string") { - return void cb("INVALID_ID"); - } - cb(void 0, id); - })); - }; - exp.ownedUploadComplete = function(id, cb) { - rpc.send("OWNED_UPLOAD_COMPLETE", id, (function(e, res) { - if (e) { - return void cb(e); - } - var id = res[0]; - if (typeof id !== "string") { - return void cb("INVALID_ID"); - } - cb(void 0, id); - })); - }; - exp.uploadStatus = function(size, cb) { - if (typeof size !== "number") { - return void setTimeout((function() { - cb("INVALID_SIZE"); - })); - } - rpc.send("UPLOAD_STATUS", size, (function(e, res) { - if (e) { - return void cb(e); - } - var pending = res[0]; - if (typeof pending !== "boolean") { - return void cb("INVALID_RESPONSE"); - } - cb(void 0, pending); - })); - }; - exp.uploadCancel = function(size, cb) { - rpc.send("UPLOAD_CANCEL", size, (function(e) { - if (e) { - return void cb(e); - } - cb(); - })); - }; - exp.setMetadata = function(obj, cb) { - rpc.send("SET_METADATA", { - channel: obj.channel, - command: obj.command, - value: obj.value - }, cb); - }; - cb(e, exp); - })); - }; - return { - create - }; - }; - if (module.exports) { - module.exports = factory(requireCommonUtil(), requireRpc()); - } - })(); - })(pinpad); - return pinpad.exports; - } - var hasRequiredCryptget; - function requireCryptget() { - if (hasRequiredCryptget) return cryptget.exports; - hasRequiredCryptget = 1; - (function(module) { - (() => { - const factory = (Crypto, CPNetflux, Netflux, Util, Hash, Realtime, NetConfig, Cache, Pinpad, nThen) => { - var finish = function(S, err, doc) { - if (S.done) { - return; - } - S.cb(err && err.error, doc, err); - S.done = true; - if (!S.hasNetwork) { - var disconnect = Util.find(S, [ "network", "disconnect" ]); - if (typeof disconnect === "function") { - disconnect(); - } - } - if (S.realtime && S.realtime.stop) { - try { - S.realtime.stop(); - } catch (e) { - console.error(e); - } - } - var abort = Util.find(S, [ "session", "realtime", "abort" ]); - if (typeof abort === "function") { - S.session.realtime.sync(); - abort(); - } - }; - var makeNetwork = function(cb) { - var wsUrl = NetConfig.getWebsocketURL(); - Netflux.connect(wsUrl).then((function(network) { - cb(null, network); - }), (function(err) { - cb(err); - })); - }; - var start = function(Session, config) { - nThen((function(waitFor) { - if (Session.hasNetwork) { - return; - } - makeNetwork(waitFor((function(err, network) { - if (err) { - return; - } - config.network = network; - }))); - })).nThen((function() { - Session.realtime = CPNetflux.start(config); - })); - }; - var onRejected = function(config, Session, data, cb) { - if (!Array.isArray(data) || !data.length || data[0].length !== 16) { - return void cb(true); - } - if (!Array.isArray(Session.accessKeys)) { - return void cb(true); - } - config.network.historyKeeper = data[0]; - nThen((function(waitFor) { - Session.accessKeys.forEach((function(obj) { - Pinpad.create(config.network, obj, waitFor((function(e) { - console.log("done", obj); - if (e) { - console.error(e); - } - }))); - })); - })).nThen((function() { - cb(); - })); - }; - var makeConfig = function(hash, opt) { - var secret; - if (typeof hash === "string") { - secret = Hash.getSecrets("pad", hash, opt.password); - } else if (typeof hash === "object") { - secret = hash; - } - if (!secret.keys) { - secret.keys = secret.key; - } - var config = { - websocketURL: NetConfig.getWebsocketURL(opt.origin), - channel: secret.channel, - validateKey: secret.keys.validateKey || undefined, - crypto: Crypto.createEncryptor(secret.keys), - logLevel: 0, - initialState: opt.initialState, - Cache - }; - return config; - }; - var isObject = function(o) { - return typeof o === "object"; - }; - var overwrite = function(a, b) { - if (!(isObject(a) && isObject(b))) { - return; - } - Object.keys(b).forEach((function(k) { - a[k] = b[k]; - })); - }; - var get = function(hash, cb, opt, progress) { - if (typeof cb !== "function") { - throw new Error("Cryptget expects a callback"); - } - opt = opt || {}; - progress = progress || function() {}; - var config = makeConfig(hash, opt); - var Session = { - cb, - accessKeys: opt.accessKeys, - hasNetwork: Boolean(opt.network) - }; - config.onRejected = function(data, cb) { - onRejected(config, Session, data, cb); - }; - config.onReady = function(info) { - var rt = Session.session = info.realtime; - Session.network = info.network; - progress(1); - finish(Session, void 0, rt.getUserDoc()); - }; - config.onError = function(info) { - console.warn(info); - finish(Session, info); - }; - config.onChannelError = function(info) { - console.error(info); - finish(Session, info); - }; - config.onCacheReady = opt.onCacheReady; - var i = 0; - config.onMessage = function() { - i++; - progress(Math.min(.99, i / 100)); - }; - overwrite(config, opt); - start(Session, config); - }; - var put = function(hash, doc, cb, opt) { - if (typeof cb !== "function") { - throw new Error("Cryptput expects a callback"); - } - opt = opt || {}; - var config = makeConfig(hash, opt); - var Session = { - cb, - accessKeys: opt.accessKeys, - hasNetwork: Boolean(opt.network) - }; - config.onRejected = function(data, cb) { - onRejected(config, Session, data, cb); - }; - config.onReady = function(info) { - var realtime = Session.session = info.realtime; - Session.network = info.network; - realtime.contentUpdate(doc); - var to = setTimeout((function() { - cb(new Error("Timeout")); - }), 15e3); - Realtime.whenRealtimeSyncs(realtime, (function() { - clearTimeout(to); - var doc = realtime.getAuthDoc(); - realtime.abort(); - finish(Session, void 0, doc); - })); - }; - config.onChannelError = function(info) { - finish(Session, info); - }; - overwrite(config, opt); - start(Session, config); - }; - return { - get, - put - }; - }; - if (module.exports) { - module.exports = factory(requireCrypto(), requireChainpadNetflux(), requireNetfluxClient(), requireCommonUtil(), requireCommonHash(), requireCommonRealtime(), requireNetworkConfig(), requireCacheStore(), requirePinpad(), requireNthen(), requireChainpad_dist()); - } - })(); - })(cryptget); - return cryptget.exports; - } - var mailbox$1 = { - exports: {} - }; - var notify = { - exports: {} - }; - var hasRequiredNotify; - function requireNotify() { - if (hasRequiredNotify) return notify.exports; - hasRequiredNotify = 1; - (function(module) { - (() => { - const factory = (ApiConfig = {}) => { - let window = globalThis; - var Module = {}; - ApiConfig.requireConf = ApiConfig.requireConf || {}; - Module.setCustomize = data => { - ApiConfig = data.ApiConfig; - }; - var apps = [ "code", "slide", "pad", "kanban", "whiteboard", "diagram", "sheet", "poll", "teams", "form", "doc", "presentation" ]; - var app = window.location && window.location.pathname.slice(1, -1); - var suffix = apps.indexOf(app) !== -1 ? "-" + app : ""; - var DEFAULT_MAIN = "/customize/favicon/main-favicon" + suffix + ".png?" + ApiConfig.requireConf.urlArgs; - var DEFAULT_ALT = "/customize/favicon/alt-favicon" + suffix + ".png?" + ApiConfig.requireConf.urlArgs; - var DEFAULT_MAIN_ICO = "/customize/favicon/main-favicon" + suffix + ".ico?" + ApiConfig.requireConf.urlArgs; - var DEFAULT_ALT_ICO = "/customize/favicon/alt-favicon" + suffix + ".ico?" + ApiConfig.requireConf.urlArgs; - var document = window.document; - var isSupported = Module.isSupported = function() { - return typeof window.Notification === "function" && window.isSecureContext; - }; - var hasPermission = Module.hasPermission = function() { - return Notification.permission === "granted"; - }; - var getPermission = Module.getPermission = function(f) { - f = f || function() {}; - if (!Notification || typeof Notification.requestPermission !== "function") { - return void f(false); - } - Notification.requestPermission((function(permission) { - if (permission === "granted") { - f(true); - } else { - f(false); - } - })); - }; - var create = Module.create = function(msg, title, icon) { - if (document && !icon) { - var favicon = document.getElementById("favicon"); - icon = favicon.getAttribute("data-main-favicon") || DEFAULT_ALT; - } else if (!icon) { - icon = DEFAULT_ALT; - } - var n = new Notification(title, { - icon, - body: msg - }); - n.onclick = function() { - if (!document) { - return; - } - try { - parent.focus(); - window.focus(); - this.close(); - } catch (e) {} - }; - return n; - }; - Module.system = function(msg, title, icon) { - if (!isSupported()) { - return; - } else if (hasPermission()) { - return create(msg, title, icon); - } else if (Notification.permission !== "denied") { - getPermission((function(state) { - if (state) { - create(msg, title, icon); - } - })); - } - }; - var createFavicon = function() { - if (!document) { - return void console.error("document is not available in this context"); - } - console.debug("creating favicon"); - var attrs = { - id: "favicon", - type: "image/png", - rel: "icon", - "data-main-favicon": DEFAULT_MAIN, - "data-alt-favicon": DEFAULT_ALT, - href: DEFAULT_MAIN - }; - if (!document.getElementById("favicon")) { - var fav = document.createElement("link"); - Object.keys(attrs).forEach((function(k) { - fav.setAttribute(k, attrs[k]); - })); - document.head.appendChild(fav); - } - if (!document.getElementById("favicon-ico")) { - var faviconLink = document.createElement("link"); - attrs.href = attrs.href.replace(/\.png/g, ".ico"); - attrs.id = "favicon-ico"; - attrs.type = "image/x-icon"; - Object.keys(attrs).forEach((function(k) { - faviconLink.setAttribute(k, attrs[k]); - })); - document.head.appendChild(faviconLink); - } - }; - if (document && !document.getElementById("favicon")) { - createFavicon(); - } - Module.tab = function(frequency, count) { - if (!document) { - return void console.error("document is not available in this context"); - } - var key = "_pendingTabNotification"; - var favicon = document.getElementById("favicon"); - var faviconIco = document.getElementById("favicon-ico"); - var main = DEFAULT_MAIN; - var alt = DEFAULT_ALT; - var mainIco = DEFAULT_MAIN_ICO; - var altIco = DEFAULT_ALT_ICO; - if (favicon) { - main = favicon.getAttribute("data-main-favicon") || DEFAULT_MAIN; - alt = favicon.getAttribute("data-alt-favicon") || DEFAULT_ALT; - favicon.setAttribute("href", main); - } - if (faviconIco) { - mainIco = faviconIco.getAttribute("data-main-favicon") || DEFAULT_MAIN_ICO; - altIco = faviconIco.getAttribute("data-alt-favicon") || DEFAULT_ALT_ICO; - faviconIco.setAttribute("href", mainIco); - } - var cancel = function(pending) { - if (Module[key]) { - window.clearInterval(Module[key]); - if (favicon) { - favicon.setAttribute("href", pending ? alt : main); - } - if (faviconIco) { - faviconIco.setAttribute("href", pending ? altIco : mainIco); - } - return true; - } - return false; - }; - cancel(); - var step = function() { - if (favicon) { - favicon.setAttribute("href", favicon.getAttribute("href") === main ? alt : main); - } - if (faviconIco) { - faviconIco.setAttribute("href", faviconIco.getAttribute("href") === mainIco ? altIco : mainIco); - } - --count; - }; - Module[key] = window.setInterval((function() { - if (count > 0) { - return step(); - } - cancel(true); - }), frequency); - step(); - return { - cancel - }; - }; - return Module; - }; - if (module.exports) { - module.exports = factory(undefined); - } - })(); - })(notify); - return notify.exports; - } - var mailboxHandlers = { - exports: {} - }; - var hasRequiredMailboxHandlers; - function requireMailboxHandlers() { - if (hasRequiredMailboxHandlers) return mailboxHandlers.exports; - hasRequiredMailboxHandlers = 1; - (function(module) { - (() => { - const factory = (Messaging, Hash, Util, Crypto, Block) => { - var getRandomTimeout = function(ctx) { - var lag = ctx.store.realtime.getLag().lag || 0; - return (Math.max(0, lag) + 300) * 20 * (.5 + Math.random()); - }; - var handlers = {}; - var removeHandlers = {}; - var isMuted = function(ctx, data) { - var muted = ctx.store.proxy.mutedUsers || {}; - var curvePublic = Util.find(data, [ "msg", "author" ]); - if (!curvePublic) { - return false; - } - return Boolean(muted[curvePublic]); - }; - var isChannelMuted = function(ctx, channel) { - var muted = ctx.store.proxy.mutedChannels || []; - return muted.includes(channel); - }; - var friendRequest = {}; - handlers["FRIEND_REQUEST"] = function(ctx, box, data, cb) { - var userData = data.msg.content.user || data.msg.content; - if (isMuted(ctx, data)) { - return void cb(true); - } - if (friendRequest[data.msg.author]) { - return void cb(true); - } - friendRequest[data.msg.author] = { - type: box.type, - hash: data.hash - }; - if (Messaging.getFriend(ctx.store.proxy, data.msg.author) || ctx.store.proxy.friends_pending[data.msg.author]) { - delete ctx.store.proxy.friends_pending[data.msg.author]; - Messaging.acceptFriendRequest(ctx.store, userData, (function(obj) { - if (obj && obj.error) { - return void cb(); - } - Messaging.addToFriendList({ - proxy: ctx.store.proxy, - realtime: ctx.store.realtime, - pinPads: ctx.pinPads - }, userData, (function(err) { - if (err) { - console.error(err); - return void cb(true); - } - if (ctx.store.messenger) { - ctx.store.messenger.onFriendAdded(userData); - } - ctx.updateMetadata(); - cb(true); - })); - })); - return; - } - cb(); - }; - removeHandlers["FRIEND_REQUEST"] = function(ctx, box, data) { - var userData = data.content.user || data.content; - if (friendRequest[userData.curvePublic]) { - delete friendRequest[userData.curvePublic]; - } - }; - var friendRequestDeclined = {}; - var friendRequestAccepted = {}; - handlers["DECLINE_FRIEND_REQUEST"] = function(ctx, box, data, cb) { - var userData = data.msg.content.user || data.msg.content; - if (!userData.curvePublic) { - userData.curvePublic = data.msg.author; - } - setTimeout((function() { - cb(true); - if (!ctx.store.proxy.friends_pending[data.msg.author]) { - return; - } - delete ctx.store.proxy.friends_pending[data.msg.author]; - ctx.updateMetadata(); - if (friendRequestDeclined[data.msg.author]) { - return; - } - box.sendMessage({ - type: "FRIEND_REQUEST_DECLINED", - content: { - user: userData - } - }, (function(hash) { - friendRequestDeclined[data.msg.author] = { - type: box.type, - hash - }; - })); - }), getRandomTimeout(ctx)); - }; - handlers["FRIEND_REQUEST_DECLINED"] = function(ctx, box, data, cb) { - ctx.updateMetadata(); - var curve = data.msg.content.user.curvePublic || data.msg.content.user; - var toRemove = friendRequestAccepted[curve]; - delete friendRequestAccepted[curve]; - if (friendRequestDeclined[curve]) { - return void cb(true, toRemove); - } - friendRequestDeclined[curve] = { - type: box.type, - hash: data.hash - }; - cb(false, toRemove); - }; - removeHandlers["FRIEND_REQUEST_DECLINED"] = function(ctx, box, data) { - var curve = data.content.user.curvePublic || data.content.user; - if (friendRequestDeclined[curve]) { - delete friendRequestDeclined[curve]; - } - }; - handlers["ACCEPT_FRIEND_REQUEST"] = function(ctx, box, data, cb) { - var userData = data.msg.content.user || data.msg.content; - setTimeout((function() { - cb(true); - if (!ctx.store.proxy.friends_pending[data.msg.author]) { - return; - } - delete ctx.store.proxy.friends_pending[data.msg.author]; - Messaging.addToFriendList({ - proxy: ctx.store.proxy, - realtime: ctx.store.realtime, - pinPads: ctx.pinPads - }, userData, (function(err) { - if (err) { - return void console.error(err); - } - if (ctx.store.messenger) { - ctx.store.messenger.onFriendAdded(userData); - } - ctx.updateMetadata(); - if (ctx.store.modules["profile"]) { - ctx.store.modules["profile"].update(); - } - if (friendRequestAccepted[data.msg.author]) { - return; - } - box.sendMessage({ - type: "FRIEND_REQUEST_ACCEPTED", - content: { - user: userData - } - }, (function(hash) { - friendRequestAccepted[data.msg.author] = { - type: box.type, - hash - }; - })); - })); - }), getRandomTimeout(ctx)); - }; - handlers["FRIEND_REQUEST_ACCEPTED"] = function(ctx, box, data, cb) { - ctx.updateMetadata(); - var curve = data.msg.content.user.curvePublic || data.msg.content.user; - var toRemove = friendRequestDeclined[curve]; - delete friendRequestDeclined[curve]; - if (friendRequestAccepted[curve]) { - return void cb(true, toRemove); - } - friendRequestAccepted[curve] = { - type: box.type, - hash: data.hash - }; - cb(false, toRemove); - }; - removeHandlers["FRIEND_REQUEST_ACCEPTED"] = function(ctx, box, data) { - var curve = data.content.user.curvePublic || data.content.user; - if (friendRequestAccepted[curve]) { - delete friendRequestAccepted[curve]; - } - }; - handlers["CANCEL_FRIEND_REQUEST"] = function(ctx, box, data, cb) { - var f = friendRequest[data.msg.author]; - if (!f) { - return void cb(true); - } - cb(true, f); - }; - handlers["UNFRIEND"] = function(ctx, box, data, cb) { - var curve = data.msg.author; - var friend = Messaging.getFriend(ctx.store.proxy, curve); - if (!friend) { - return void cb(true); - } - delete ctx.store.proxy.friends[curve]; - delete ctx.store.proxy.friends_pending[curve]; - if (ctx.store.messenger) { - ctx.store.messenger.onFriendRemoved(curve, friend.channel); - } - ctx.updateMetadata(); - cb(true); - }; - handlers["UPDATE_DATA"] = function(ctx, box, data, cb) { - var msg = data.msg; - var curve = msg.author; - var friend = ctx.store.proxy.friends && ctx.store.proxy.friends[curve]; - if (!friend || typeof msg.content !== "object") { - return void cb(true); - } - Object.keys(msg.content).forEach((function(key) { - friend[key] = msg.content[key]; - })); - if (ctx.store.messenger) { - ctx.store.messenger.onFriendUpdate(curve); - } - ctx.updateMetadata(); - cb(true); - }; - var encryptPassword = function(ctx, password) { - let uHash = ctx.store.data.blockHash; - let uSecret = Block.parseBlockHash(uHash); - let key = uSecret.keys.symmetric; - return Crypto.encrypt(password, key); - }; - var channels = {}; - handlers["SHARE_PAD"] = function(ctx, box, data, cb) { - var msg = data.msg; - var hash = data.hash; - var content = msg.content; - if (isMuted(ctx, data)) { - return void cb(true); - } - var channel = content.isStatic ? content.href : Hash.hrefToHexChannelId(content.href, content.password); - var parsed = Hash.parsePadUrl(content.href); - var mode = parsed.hashData && parsed.hashData.mode || "n/a"; - var old = channels[channel]; - var toRemove; - if (old) { - if (old.mode === "edit" && mode === "view") { - return void cb(true); - } - toRemove = old.data; - } - if (content.password) { - content.password = encryptPassword(ctx, content.password); - } - channels[channel] = { - mode, - data: { - type: box.type, - hash - } - }; - cb(false, toRemove); - }; - removeHandlers["SHARE_PAD"] = function(ctx, box, data, hash) { - var content = data.content; - var channel = Hash.hrefToHexChannelId(content.href, content.password); - var old = channels[channel]; - if (old && old.data && old.data.hash === hash) { - delete channels[channel]; - } - }; - var supportMessage = false; - handlers["SUPPORT_MESSAGE"] = function(ctx, box, data, cb) { - if (supportMessage) { - return void cb(true); - } - supportMessage = true; - cb(); - }; - removeHandlers["SUPPORT_MESSAGE"] = function() { - supportMessage = false; - }; - handlers["REQUEST_PAD_ACCESS"] = function(ctx, box, data, cb) { - var msg = data.msg; - var content = msg.content; - if (isMuted(ctx, data)) { - return void cb(true); - } - var channel = content.channel; - var res = ctx.store.manager.findChannel(channel); - if (!res.length) { - return void cb(true); - } - var edPublic = ctx.store.proxy.edPublic; - var title, href; - if (!res.some((function(obj) { - if (obj.data && Array.isArray(obj.data.owners) && obj.data.owners.indexOf(edPublic) !== -1 && obj.data.href) { - href = obj.data.href; - title = obj.data.filename || obj.data.title; - return true; - } - }))) { - return void cb(true); - } - content.title = title; - content.href = href; - cb(false); - }; - handlers["GIVE_PAD_ACCESS"] = function(ctx, box, data, cb) { - var msg = data.msg; - var content = msg.content; - var channel = content.channel; - var res = ctx.store.manager.findChannel(channel, true); - var title; - res.forEach((function(obj) { - if (obj.data && !obj.data.href) { - if (!title) { - title = obj.data.filename || obj.data.title; - } - obj.userObject.setHref(channel, null, content.href); - } - })); - content.title = title || content.title; - cb(false); - }; - handlers["ADD_TO_ACCESS_LIST"] = function(ctx, common, data, cb) { - var msg = data.msg; - var content = msg.content; - var channel = content.channel; - ctx.Store.getAllStores().forEach((function(store) { - var res = store.manager.findChannel(channel); - if (!res.length) { - return; - } - var data = res[0].data; - var id = res[0].id; - var teamId = store.id; - ctx.Store.loadSharedFolder(teamId, id, data, (function() {}), false); - })); - cb(true); - }; - var addOwners = {}; - handlers["ADD_OWNER"] = function(ctx, box, data, cb) { - var msg = data.msg; - var content = msg.content; - if (isMuted(ctx, data)) { - return void cb(true); - } - if (!content.teamChannel && !(content.href && content.title && content.channel)) { - console.log("Remove invalid notification"); - return void cb(true); - } - var channel = content.channel || content.teamChannel; - if (content.password) { - content.pw = content.password; - content.password = encryptPassword(ctx, content.password); - } - if (addOwners[channel]) { - return void cb(true); - } - addOwners[channel] = { - type: box.type, - hash: data.hash - }; - cb(false); - }; - removeHandlers["ADD_OWNER"] = function(ctx, box, data) { - var channel = data.content.channel || data.content.teamChannel; - if (addOwners[channel]) { - delete addOwners[channel]; - } - }; - handlers["RM_OWNER"] = function(ctx, box, data, cb) { - var msg = data.msg; - var content = msg.content; - if (!content.channel && !content.teamChannel) { - console.log("Remove invalid notification"); - return void cb(true); - } - var channel = content.channel || content.teamChannel; - if (content.teamChannel) { - var teams = ctx.store.proxy.teams || {}; - Object.keys(teams).some((function(id) { - if (teams[id].channel === channel) { - teams[id].owner = false; - return true; - } - })); - } - if (addOwners[channel] && content.pending) { - return void cb(false, addOwners[channel]); - } - cb(false); - }; - var invitedTo = {}; - handlers["INVITE_TO_TEAM"] = function(ctx, box, data, cb) { - var msg = data.msg; - var content = msg.content; - if (isMuted(ctx, data)) { - return void cb(true); - } - if (!content.team) { - console.log("Remove invalid notification"); - return void cb(true); - } - var invited = invitedTo[content.team.channel]; - if (invited) { - console.log("removing old invitation"); - cb(false, invited); - invitedTo[content.team.channel] = { - type: box.type, - hash: data.hash - }; - return; - } - var myTeams = Util.find(ctx, [ "store", "proxy", "teams" ]) || {}; - var alreadyMember = Object.keys(myTeams).some((function(k) { - var team = myTeams[k]; - return team.channel === content.team.channel; - })); - if (alreadyMember) { - return void cb(true); - } - invitedTo[content.team.channel] = { - type: box.type, - hash: data.hash - }; - cb(false); - }; - removeHandlers["INVITE_TO_TEAM"] = function(ctx, box, data) { - var channel = Util.find(data, [ "content", "team", "channel" ]); - delete invitedTo[channel]; - }; - handlers["KICKED_FROM_TEAM"] = function(ctx, box, data, cb) { - var msg = data.msg; - var content = msg.content; - if (!content.teamChannel) { - console.log("Remove invalid notification"); - return void cb(true); - } - if (invitedTo[content.teamChannel] && content.pending) { - return void cb(true, invitedTo[content.teamChannel]); - } - cb(false); - }; - handlers["INVITE_TO_TEAM_ANSWER"] = function(ctx, box, data, cb) { - var msg = data.msg; - var content = msg.content; - if (!content.teamChannel) { - console.log("Remove invalid notification"); - return void cb(true); - } - var myTeams = Util.find(ctx, [ "store", "proxy", "teams" ]) || {}; - var teamId; - var team; - Object.keys(myTeams).some((function(k) { - var _team = myTeams[k]; - if (_team.channel === content.teamChannel) { - teamId = k; - team = _team; - return true; - } - })); - if (!teamId) { - return void cb(true); - } - content.team = team; - if (!content.answer) { - try { - var module = ctx.store.modules["team"]; - module.removeFromTeam(teamId, msg.author, true); - } catch (e) { - console.error(e); - } - } - var userData = content.user || content; - box.sendMessage({ - type: "INVITE_TO_TEAM_ANSWERED", - content: { - user: userData, - team, - answer: content.answer - } - }, (function() {})); - cb(true); - }; - handlers["TEAM_EDIT_RIGHTS"] = function(ctx, box, data, cb) { - var msg = data.msg; - var content = msg.content; - if (!content.teamData) { - console.log("Remove invalid notification"); - return void cb(true); - } - var myTeams = Util.find(ctx, [ "store", "proxy", "teams" ]) || {}; - var teamId; - Object.keys(myTeams).some((function(k) { - var _team = myTeams[k]; - if (_team.channel === content.teamData.channel) { - teamId = k; - return true; - } - })); - if (!teamId) { - return void cb(true); - } - try { - var module = ctx.store.modules["team"]; - module.changeMyRights(teamId, content.state, content.teamData, (function(done) { - if (!done) { - console.error("Can't update team rights"); - } - cb(true); - })); - } catch (e) { - console.error(e); - } - }; - handlers["OWNED_PAD_REMOVED"] = function(ctx, box, data, cb) { - var msg = data.msg; - var content = msg.content; - if (!content.channel) { - console.log("Remove invalid notification"); - return void cb(true); - } - var channel = content.channel; - var res = ctx.store.manager.findChannel(channel); - res.forEach((function(obj) { - var paths = ctx.store.manager.findFile(obj.id); - ctx.store.manager.delete({ - paths - }, (function() { - ctx.updateDrive(); - })); - })); - cb(true); - }; - handlers["MOVE_TODO"] = function(ctx, box, data, cb) { - var curve = ctx.store.proxy.curvePublic; - if (data.msg.author !== curve) { - return void cb(true); - } - cb(); - }; - handlers["SAFE_LINKS_DEFAULT"] = function(ctx, box, data, cb) { - var curve = ctx.store.proxy.curvePublic; - if (data.msg.author !== curve) { - return void cb(true); - } - cb(); - }; - var formNotifs = {}; - handlers["FORM_RESPONSE"] = function(ctx, box, data, cb) { - var msg = data.msg; - var hash = data.hash; - var content = msg.content; - var channel = content.channel; - if (!channel) { - return void cb(true); - } - if (isChannelMuted(ctx, channel)) { - return void cb(true); - } - var title, href; - ctx.Store.getAllStores().some((function(s) { - var res = s.manager.findChannel(channel); - return res.some((function(obj) { - if (!obj.data) { - return; - } - if (href && !obj.data.href) { - return; - } - href = obj.data.href || obj.data.roHref; - title = obj.data.filename || obj.data.title; - if (obj.data.href) { - return true; - } - })); - })); - if (!href) { - return void cb(true); - } - content.href = href; - content.title = title; - var old = formNotifs[channel]; - var toRemove = old ? old.data : undefined; - formNotifs[channel] = { - data: { - type: box.type, - hash - } - }; - cb(false, toRemove); - }; - removeHandlers["FORM_RESPONSE"] = function(ctx, box, data, hash) { - var content = data.content; - var channel = content.channel; - var old = formNotifs[channel]; - if (old && old.data && old.data.hash === hash) { - delete formNotifs[channel]; - } - }; - var comments = {}; - handlers["COMMENT_REPLY"] = function(ctx, box, data, cb) { - var msg = data.msg; - var hash = data.hash; - var content = msg.content; - if (Util.find(ctx.store.proxy, [ "settings", "pad", "disableNotif" ])) { - return void cb(true); - } - var channel = content.channel; - if (!channel) { - return void cb(true); - } - var title, href; - ctx.Store.getAllStores().some((function(s) { - var res = s.manager.findChannel(channel); - return res.some((function(obj) { - if (!obj.data) { - return; - } - if (href && !obj.data.href) { - return; - } - href = obj.data.href || obj.data.roHref; - title = obj.data.filename || obj.data.title; - if (obj.data.href) { - return true; - } - })); - })); - if (!href) { - return void cb(true); - } - content.href = href; - content.title = title; - var old = comments[channel]; - var toRemove = old ? old.data : undefined; - comments[channel] = { - data: { - type: box.type, - hash - } - }; - cb(false, toRemove); - }; - removeHandlers["COMMENT_REPLY"] = function(ctx, box, data, hash) { - var content = data.content; - var channel = content.channel; - var old = comments[channel]; - if (old && old.data && old.data.hash === hash) { - delete comments[channel]; - } - }; - var mentions = {}; - handlers["MENTION"] = function(ctx, box, data, cb) { - var msg = data.msg; - var hash = data.hash; - var content = msg.content; - if (isMuted(ctx, data)) { - return void cb(true); - } - var channel = content.channel; - if (!channel) { - return void cb(true); - } - var title, href; - ctx.Store.getAllStores().some((function(s) { - var res = s.manager.findChannel(channel); - return res.some((function(obj) { - if (!obj.data) { - return; - } - if (href && !obj.data.href) { - return; - } - href = obj.data.href || obj.data.roHref; - title = obj.data.filename || obj.data.title; - if (obj.data.href) { - return true; - } - })); - })); - content.href = href; - content.title = title; - var old = mentions[channel]; - var toRemove = old ? old.data : undefined; - mentions[channel] = { - data: { - type: box.type, - hash - } - }; - cb(false, toRemove); - }; - removeHandlers["MENTION"] = function(ctx, box, data, hash) { - var content = data.content; - var channel = content.channel; - var old = mentions[channel]; - if (old && old.data && old.data.hash === hash) { - delete mentions[channel]; - } - }; - handlers["BROADCAST_MAINTENANCE"] = function(ctx, box, data, cb) { - var msg = data.msg; - var uid = msg.uid; - ctx.Store.onMaintenanceUpdate(uid); - cb(true); - }; - var activeSurvey; - handlers["BROADCAST_SURVEY"] = function(ctx, box, data, cb) { - var msg = data.msg; - var content = msg.content; - var uid = msg.uid; - var old = activeSurvey; - activeSurvey = { - type: box.type, - hash: data.hash - }; - ctx.Store.onSurveyUpdate(uid); - var dismiss = !content.url; - cb(dismiss, old); - }; - var activeCustom; - handlers["BROADCAST_CUSTOM"] = function(ctx, box, data, cb) { - var msg = data.msg; - var uid = msg.uid; - var old = activeCustom; - activeCustom = { - uid, - type: box.type, - hash: data.hash - }; - cb(false, old); - }; - handlers["BROADCAST_DELETE"] = function(ctx, box, data, cb) { - var msg = data.msg; - var content = msg.content; - var uid = content.uid; - if (activeCustom && activeCustom.uid === uid) { - cb(true, activeCustom); - activeCustom = undefined; - return; - } - cb(true); - }; - var sfDeleted = {}; - handlers["SF_DELETED"] = function(ctx, box, data, cb) { - var msg = data.msg; - var content = msg.content; - var teamId = content.team; - var sfId = content.sfId; - if (sfDeleted[sfId]) { - return void cb(true); - } - sfDeleted[sfId] = 1; - if (!teamId) { - return void cb(false); - } - var team = ctx.store.proxy.teams[teamId]; - content.teamName = team.metadata && team.metadata.name; - cb(false); - }; - removeHandlers["SF_DELETED"] = function(ctx, box, data) { - var id = data.content.sfId; - delete sfDeleted[id]; - }; - handlers["NEW_TICKET"] = function(ctx, box, data, cb) { - var msg = data.msg; - var content = msg.content; - if (!content.time) { - content.time = data.time; - } - var support = Util.find(ctx, [ "store", "modules", "support" ]); - if (content.isAdmin) { - support.addUserTicket(content, cb); - } - support.addAdminTicket(content, cb); - }; - var supportNotif, adminSupportNotif; - handlers["NOTIF_TICKET"] = function(ctx, box, data, cb) { - var msg = data.msg; - var content = msg.content; - if (!content.time) { - content.time = data.time; - } - var support = Util.find(ctx, [ "store", "modules", "support" ]); - if (content.isAdmin) { - let exists = Util.find(ctx, [ "store", "proxy", "support", content.channel ]); - if (!exists) { - return void cb(true); - } - support.updateUserTicket(content); - if (supportNotif) { - return void cb(false, supportNotif); - } - supportNotif = { - channel: content.channel, - type: box.type, - hash: data.hash - }; - return void cb(false); - } - support.checkAdminTicket(content, (exists => { - if (!exists) { - return void cb(true); - } - support.updateAdminTicket(content); - if (Util.find(ctx.store.proxy, [ "settings", "general", "disableSupportNotif" ])) { - return void cb(true); - } - if (adminSupportNotif) { - return void cb(false, adminSupportNotif); - } - adminSupportNotif = { - channel: content.channel, - type: box.type, - hash: data.hash - }; - cb(false); - })); - }; - removeHandlers["NOTIF_TICKET"] = function(ctx, box, data) { - var id = data.content.channel; - if (supportNotif && supportNotif.channel === id) { - supportNotif = undefined; - } - if (adminSupportNotif && adminSupportNotif.channel === id) { - adminSupportNotif = undefined; - } - }; - handlers["ADD_MODERATOR"] = function(ctx, box, data, cb) { - var msg = data.msg; - var content = msg.content; - var support = Util.find(ctx, [ "store", "modules", "support" ]); - support.updateAdminKey(content, cb); - }; - handlers["MODERATOR_NEW_KEY"] = function(ctx, box, data, cb) { - var msg = data.msg; - var content = msg.content; - var support = Util.find(ctx, [ "store", "modules", "support" ]); - support.updateAdminKey(content, (function() { - cb(true); - })); - }; - return { - add: function(ctx, box, data, cb) { - if (!data.msg) { - return void cb(null, null, true); - } - var myCurve = Util.find(ctx, [ "store", "proxy", "curvePublic" ]); - var curve = Util.find(data, [ "msg", "content", "user", "curvePublic" ]) || Util.find(data, [ "msg", "content", "curvePublic" ]); - if (curve && data.msg.author !== curve && data.msg.author !== myCurve) { - console.error("blocked"); - return void cb(null, null, true); - } - var type = data.msg.type; - if (handlers[type]) { - try { - handlers[type](ctx, box, data, cb); - } catch (e) { - console.error(e); - cb(); - } - } else { - cb(); - } - }, - remove: function(ctx, box, data, h) { - if (!data) { - return; - } - var type = data.type; - if (removeHandlers[type]) { - try { - removeHandlers[type](ctx, box, data, h); - } catch (e) { - console.error(e); - } - } - } - }; - }; - if (module.exports) { - module.exports = factory(requireCommonMessaging(), requireCommonHash(), requireCommonUtil(), requireCrypto(), requireLoginBlock()); - } - })(); - })(mailboxHandlers); - return mailboxHandlers.exports; - } - var hasRequiredMailbox; - function requireMailbox() { - if (hasRequiredMailbox) return mailbox$1.exports; - hasRequiredMailbox = 1; - (function(module) { - (() => { - const factory = (BCast = {}, Util, Hash, Realtime, Messaging, Notify, Handlers, CpNetflux, Crypto) => { - var Mailbox = {}; - Mailbox.setCustomize = data => { - BCast = data.Broadcast; - }; - var TYPES = [ "notifications", "supportteam", "broadcast" ]; - var BLOCKING_TYPES = []; - var BROADCAST_CHAN = "000000000000000000000000000000000"; - var initializeMailboxes = function(ctx, mailboxes) { - if (!mailboxes["notifications"] && ctx.loggedIn) { - mailboxes.notifications = { - channel: Hash.createChannelId(), - lastKnownHash: "", - viewed: [] - }; - ctx.pinPads([ mailboxes.notifications.channel ], (function(res) { - if (res.error) { - console.error(res); - } - })); - } - if (mailboxes.support) { - delete mailboxes.support; - } - if (!mailboxes["broadcast"]) { - mailboxes.broadcast = { - channel: BROADCAST_CHAN, - lastKnownHash: BCast.lastBroadcastHash, - decrypted: true, - viewed: [] - }; - } - }; - var isMessageNew = function(hash, m) { - return (m.viewed || []).indexOf(hash) === -1 && hash !== m.lastKnownHash; - }; - var showMessage = function(ctx, type, msg, cId, cb) { - ctx.emit("MESSAGE", { - type, - content: msg - }, cId ? [ cId ] : ctx.clients, cb); - }; - var hideMessage = function(ctx, type, hash, clients) { - ctx.emit("VIEWED", { - type, - hash - }, clients || ctx.clients); - }; - var getMyKeys = function(ctx) { - var proxy = ctx.store && ctx.store.proxy; - if (!proxy.curvePrivate || !proxy.curvePublic) { - return; - } - return { - curvePrivate: proxy.curvePrivate, - curvePublic: proxy.curvePublic - }; - }; - var sendTo = Mailbox.sendTo = function(ctx, type, msg, user, _cb) { - user = user || {}; - var cb = _cb || function(obj) { - if (obj && obj.error) { - console.error(obj.error); - } - }; - if (!Crypto.Mailbox) { - return void cb({ - error: "chainpad-crypto is outdated and doesn't support mailboxes." - }); - } - var anonRpc = Util.find(ctx, [ "store", "anon_rpc" ]); - if (!anonRpc) { - return void cb({ - error: "anonymous rpc session not ready" - }); - } - var crypto = { - encrypt: function(x) { - return x; - } - }; - var channel = BROADCAST_CHAN; - var obj = { - uid: Util.uid(), - type, - content: msg - }; - if (!/^BROADCAST/.test(type)) { - var keys = getMyKeys(ctx); - if (!keys) { - return void cb({ - error: "missing asymmetric encryption keys" - }); - } - if (!user || !user.channel || !user.curvePublic) { - return void cb({ - error: "no notification channel" - }); - } - channel = user.channel; - crypto = Crypto.Mailbox.createEncryptor(keys); - if (typeof msg === "object" && !msg.user) { - var myData = Messaging.createData(ctx.store.proxy, false); - msg.user = myData; - } - obj = { - type, - content: msg - }; - } - var text = JSON.stringify(obj); - var ciphertext = crypto.encrypt(text, user.curvePublic); - if (user.viewed) { - var team = Util.find(ctx, [ "store", "proxy", "teams", user.viewed ]); - if (team) { - var hash = ciphertext.slice(0, 64); - var viewed = Util.find(team, [ "keys", "mailbox", "viewed" ]); - if (Array.isArray(viewed)) { - viewed.push(hash); - } - } - } - anonRpc.send("WRITE_PRIVATE_MESSAGE", [ channel, ciphertext ], (function(err) { - if (err) { - return void cb({ - error: err - }); - } - return void cb({ - hash: ciphertext.slice(0, 64) - }); - })); - }; - Mailbox.sendToAnon = function(anonRpc, type, msg, user, cb) { - var Nacl = Crypto.Nacl; - var curveSeed = Nacl.randomBytes(32); - var curvePair = Nacl.box.keyPair.fromSecretKey(new Uint8Array(curveSeed)); - var curvePrivate = Nacl.util.encodeBase64(curvePair.secretKey); - var curvePublic = Nacl.util.encodeBase64(curvePair.publicKey); - sendTo({ - store: { - anon_rpc: anonRpc, - proxy: { - curvePrivate, - curvePublic - } - } - }, type, msg, user, cb); - }; - var dismiss = function(ctx, data, cId, cb) { - var type = data.type; - var hash = data.hash; - if (/^REMINDER\|/.test(hash)) { - cb(); - delete ctx.boxes.reminders.content[hash]; - hideMessage(ctx, type, hash, ctx.clients.filter((function(clientId) { - return clientId !== cId; - }))); - var uid = hash.slice(9).split("-")[0]; - var d = Util.find(ctx, [ "store", "proxy", "hideReminders", uid ]); - if (!d) { - var h = ctx.store.proxy.hideReminders = ctx.store.proxy.hideReminders || {}; - d = h[uid] = h[uid] || []; - } - var delay = hash.split("-")[1]; - if (delay && !d.includes(delay)) { - d.push(Number(delay)); - } - return; - } - var box = ctx.boxes[type]; - if (!box) { - return void cb({ - error: "NOT_LOADED" - }); - } - var m = box.data || {}; - var idx = box.history.indexOf(hash); - if (idx !== -1) { - if (idx === 0) { - m.lastKnownHash = hash; - box.history.shift(); - } else if (m.viewed.indexOf(hash) === -1) { - m.viewed.push(hash); - } - } - var sliceIdx; - var lastKnownHash; - var toForget = []; - box.history.some((function(hash, i) { - var isViewed = m.viewed.indexOf(hash); - if (isViewed === -1) { - return true; - } - sliceIdx = i + 1; - toForget.push(hash); - lastKnownHash = hash; - })); - m.viewed = m.viewed.filter((function(hash) { - return toForget.indexOf(hash) === -1; - })); - if (sliceIdx) { - box.history = box.history.slice(sliceIdx); - m.lastKnownHash = lastKnownHash; - } - Object.keys(box.content).forEach((function(h) { - if (box.history.indexOf(h) === -1 || m.viewed.indexOf(h) !== -1) { - Handlers.remove(ctx, box, box.content[h], h); - delete box.content[h]; - } - })); - Realtime.whenRealtimeSyncs(ctx.store.realtime, (function() { - cb(); - hideMessage(ctx, type, hash, ctx.clients.filter((function(clientId) { - return clientId !== cId; - }))); - })); - }; - var leaveChannel = function(ctx, type, cb) { - cb = cb || function() {}; - var box = ctx.boxes[type]; - if (!box) { - return void cb(); - } - if (!box.cpNf || typeof box.cpNf.stop !== "function") { - return void cb("EINVAL"); - } - box.cpNf.stop(); - Object.keys(box.content).forEach((function(h) { - Handlers.remove(ctx, box, box.content[h], h); - hideMessage(ctx, type, h, ctx.clients); - })); - delete ctx.boxes[type]; - }; - var openChannel = function(ctx, type, m, onReady, opts) { - opts = opts || {}; - var box = ctx.boxes[type] = { - channel: m.channel, - type, - queue: [], - history: [], - content: {}, - sendMessage: function(msg) { - if (typeof msg === "object" && !msg.user) { - var myData = Messaging.createData(ctx.store.proxy, false); - msg.user = myData; - } - try { - msg = JSON.stringify(msg); - } catch (e) { - console.error(e); - } - box.queue.push(msg); - }, - data: m - }; - if (!Crypto.Mailbox) { - return void console.error("chainpad-crypto is outdated and doesn't support mailboxes."); - } - var keys = m.keys || getMyKeys(ctx); - if (!keys && !m.decrypted) { - return void console.error("missing asymmetric encryption keys"); - } - var crypto = m.decrypted ? { - encrypt: function(x) { - return x; - }, - decrypt: function(x) { - return x; - } - } : Crypto.Mailbox.createEncryptor(keys); - box.encryptor = crypto; - var cfg = { - network: ctx.store.network, - channel: m.channel, - noChainPad: true, - crypto, - owners: type === "broadcast" ? [] : opts.owners || [ ctx.store.proxy.edPublic ], - lastKnownHash: m.lastKnownHash - }; - cfg.onConnectionChange = function() {}; - cfg.onConnect = function(wc, sendMessage) { - box.sendMessage = function(_msg, cb) { - cb = cb || function() {}; - var msg; - try { - msg = JSON.stringify(_msg); - } catch (e) { - console.error(e); - } - sendMessage(msg, (function(err, hash) { - if (err) { - return void console.error(err); - } - box.history.push(hash); - _msg.ctime = +new Date; - box.content[hash] = _msg; - var message = { - msg: _msg, - hash - }; - showMessage(ctx, type, message); - cb(hash); - }), keys.curvePublic); - }; - box.queue.forEach((function(msg) { - box.sendMessage(msg); - })); - box.queue = []; - }; - var lastReceivedHash; - box.onMessage = cfg.onMessage = function(msg, user, vKey, isCp, hash, author, data) { - if (hash === m.lastKnownHash) { - return; - } - if (hash === lastReceivedHash) { - return; - } - var time = data && data.time; - lastReceivedHash = hash; - try { - msg = JSON.parse(msg); - } catch (e) { - console.error(e); - } - if (author) { - msg.author = author; - } - box.history.push(hash); - if (isMessageNew(hash, m)) { - var message = { - msg, - hash, - time - }; - var notify = box.ready; - Handlers.add(ctx, box, message, (function(dismissed, toDismiss, invalid) { - if (toDismiss) { - dismiss(ctx, toDismiss, "", (function() { - console.log("Notification handled automatically"); - })); - } - if (invalid || dismissed) { - dismiss(ctx, { - type, - hash - }, "", (function() { - console.log("Notification handled automatically"); - })); - return; - } - msg.ctime = time || 0; - box.content[hash] = msg; - if (opts.dump) { - return; - } - showMessage(ctx, type, message, null, (function(obj) { - if (!obj || !obj.msg || !notify) { - return; - } - Notify.system(undefined, obj.msg); - })); - })); - } else { - if (Object.keys(box.content).length === 0) { - m.lastKnownHash = hash; - box.history = []; - var idxViewed = m.viewed.indexOf(hash); - if (idxViewed !== -1) { - m.viewed.splice(idxViewed, 1); - } - } - } - }; - cfg.onReady = function() { - var toClean = []; - m.viewed.forEach((function(h, i) { - if (box.history.indexOf(h) === -1) { - toClean.push(i); - } - })); - for (var i = toClean.length - 1; i >= 0; i--) { - m.viewed.splice(toClean[i], 1); - } - var view = function(h) { - Handlers.remove(ctx, box, box.content[h], h); - delete box.content[h]; - hideMessage(ctx, type, h); - }; - ctx.store.proxy.on("change", [ "mailboxes", type ], (function(o, n, p) { - if (p[2] === "lastKnownHash") { - var sliceIdx; - box.history.some((function(h, i) { - sliceIdx = i + 1; - view(h); - if (h === n) { - return true; - } - })); - box.history = box.history.slice(sliceIdx); - } - if (p[2] === "viewed") { - view(n); - } - })); - box.ready = true; - onReady(box.content); - }; - box.cpNf = CpNetflux.start(cfg); - }; - var initializeHistory = function(ctx) { - var network = ctx.store.network; - network.on("message", (function(msg, sender) { - if (sender !== network.historyKeeper) { - return; - } - var parsed = JSON.parse(msg); - if (!/HISTORY_RANGE/.test(parsed[0])) { - return; - } - var txid = parsed[1]; - var req = ctx.req[txid]; - if (!req) { - return; - } - var type = parsed[0]; - var _msg = parsed[2]; - var box = req.box; - if (type === "HISTORY_RANGE") { - if (!Array.isArray(_msg)) { - return; - } - var message; - if (req.box.type === "broadcast") { - message = Util.tryParse(_msg[4]); - } else { - try { - var decrypted = box.encryptor.decrypt(_msg[4]); - message = JSON.parse(decrypted.content); - message.author = decrypted.author; - } catch (e) { - console.log(e); - } - } - var hash = _msg[4].slice(0, 64); - ctx.emit("HISTORY", { - txid, - time: _msg[5], - message, - hash - }, [ req.cId ]); - } else if (type === "HISTORY_RANGE_END") { - ctx.emit("HISTORY", { - txid, - complete: true - }, [ req.cId ]); - delete ctx.req[txid]; - } - })); - }; - var loadHistory = function(ctx, clientId, data, cb) { - var box = ctx.boxes[data.type]; - if (!box) { - return void cb({ - error: "ENOENT" - }); - } - var msg = [ "GET_HISTORY_RANGE", box.channel, { - from: data.lastKnownHash, - count: data.count, - txid: data.txid - } ]; - if (data.type === "broadcast") { - msg = [ "GET_HISTORY_RANGE", box.channel, { - to: data.lastKnownHash, - txid: data.txid - } ]; - } - ctx.req[data.txid] = { - cId: clientId, - box - }; - var network = ctx.store.network; - network.sendto(network.historyKeeper, JSON.stringify(msg)).then((function() {}), (function(err) { - console.error(err); - })); - }; - var subscribe = function(ctx, data, cId, cb) { - Object.keys(ctx.boxes).forEach((function(type) { - Object.keys(ctx.boxes[type].content).forEach((function(h) { - var message = { - msg: ctx.boxes[type].content[h], - hash: h - }; - showMessage(ctx, type, message, cId, (function(obj) { - if (obj.error) { - return; - } - if (!message.msg || !message.msg.requiresNotif) { - return; - } - Notify.system(undefined, obj.msg); - delete message.msg.requiresNotif; - })); - })); - })); - var idx = ctx.clients.indexOf(cId); - if (idx === -1) { - ctx.clients.push(cId); - } - cb(); - }; - var removeClient = function(ctx, cId) { - var idx = ctx.clients.indexOf(cId); - ctx.clients.splice(idx, 1); - }; - Mailbox.init = function(cfg, waitFor, emit) { - var mailbox = {}; - var store = cfg.store; - var mailboxes = store.proxy.mailboxes = store.proxy.mailboxes || {}; - var ctx = { - Store: cfg.Store, - store, - pinPads: cfg.pinPads, - updateMetadata: cfg.updateMetadata, - updateDrive: cfg.updateDrive, - mailboxes, - emit, - clients: [], - boxes: {}, - req: {}, - loggedIn: store.loggedIn && store.proxy.edPublic - }; - initializeMailboxes(ctx, mailboxes); - if (ctx.loggedIn) { - initializeHistory(ctx); - } - ctx.boxes.reminders = { - content: {} - }; - Object.keys(mailboxes).forEach((function(key) { - if (TYPES.indexOf(key) === -1) { - return; - } - var m = mailboxes[key]; - if (BLOCKING_TYPES.indexOf(key) === -1) { - openChannel(ctx, key, m, (function() {})); - } else { - openChannel(ctx, key, m, waitFor((function() {}))); - } - })); - if (ctx.loggedIn) { - Object.keys(store.proxy.teams || {}).forEach((function(teamId) { - var team = store.proxy.teams[teamId]; - if (!team) { - return; - } - var teamMailbox = team.keys.mailbox || {}; - if (!teamMailbox.channel) { - return; - } - var opts = { - owners: [ Util.find(team, [ "keys", "drive", "edPublic" ]) ] - }; - openChannel(ctx, "team-" + teamId, teamMailbox, (function() {}), opts); - })); - } - mailbox.post = function(box, type, content) { - var b = ctx.boxes[box]; - if (!b) { - return; - } - b.sendMessage({ - type, - content, - sender: store.proxy.curvePublic - }); - }; - mailbox.hideMessage = function(type, msg) { - hideMessage(ctx, type, msg.hash, ctx.clients); - }; - mailbox.showMessage = function(type, msg, cId, cb) { - if (type === "reminders" && msg) { - ctx.boxes.reminders.content[msg.hash] = msg.msg; - if (!ctx.clients.length) { - ctx.boxes.reminders.content[msg.hash].requiresNotif = true; - } - hideMessage(ctx, type, msg.hash, ctx.clients); - } - showMessage(ctx, type, msg, cId, (function(obj) { - Notify.system(undefined, obj.msg); - if (cb) { - cb(); - } - })); - }; - mailbox.open = function(key, m, cb, team, opts) { - if (TYPES.indexOf(key) === -1 && !team) { - return; - } - openChannel(ctx, key, m, cb, opts); - }; - mailbox.close = function(key, cb) { - leaveChannel(ctx, key, cb); - }; - mailbox.dismiss = function(data, cb) { - dismiss(ctx, data, "", cb); - }; - mailbox.sendTo = function(type, msg, user, cb) { - if (!ctx.loggedIn) { - return void cb({ - error: "NOT_LOGGED_IN" - }); - } - sendTo(ctx, type, msg, user, cb); - }; - mailbox.removeClient = function(clientId) { - removeClient(ctx, clientId); - }; - mailbox.execCommand = function(clientId, obj, cb) { - var cmd = obj.cmd; - var data = obj.data; - if (cmd === "SUBSCRIBE") { - return void subscribe(ctx, data, clientId, cb); - } - if (cmd === "DISMISS") { - return void dismiss(ctx, data, clientId, cb); - } - if (cmd === "SENDTO") { - return void sendTo(ctx, data.type, data.msg, data.user, cb); - } - if (cmd === "LOAD_HISTORY") { - return void loadHistory(ctx, clientId, data, cb); - } - }; - return mailbox; - }; - return Mailbox; - }; - if (module.exports) { - module.exports = factory(undefined, requireCommonUtil(), requireCommonHash(), requireCommonRealtime(), requireCommonMessaging(), requireNotify(), requireMailboxHandlers(), requireChainpadNetflux(), requireCrypto()); - } - })(); - })(mailbox$1); - return mailbox$1.exports; - } - var hasRequiredMigrateUserObject; - function requireMigrateUserObject() { - if (hasRequiredMigrateUserObject) return migrateUserObject$1.exports; - hasRequiredMigrateUserObject = 1; - (function(module) { - (() => { - const factory = (Feedback, Hash, Util, Messaging, Crypt, Mailbox, Messages = {}, Realtime, nThen, Crypto) => { - const setCustomize = data => { - Messages = data.Messages; - }; - let migrate = function(userObject, cb, progress, store) { - var version = userObject.version || 0; - nThen((function() {})).nThen((function() { - var migrateAttributes = function() { - var drawer = "cryptpad.userlist-drawer"; - var polls = "cryptpad.hide_poll_text"; - var indentKey = "cryptpad.indentUnit"; - var useTabsKey = "cryptpad.indentWithTabs"; - var settings = userObject.settings = userObject.settings || {}; - if (typeof userObject[indentKey] !== "undefined") { - settings.codemirror = settings.codemirror || {}; - settings.codemirror.indentUnit = userObject[indentKey]; - delete userObject[indentKey]; - } - if (typeof userObject[useTabsKey] !== "undefined") { - settings.codemirror = settings.codemirror || {}; - settings.codemirror.indentWithTabs = userObject[useTabsKey]; - delete userObject[useTabsKey]; - } - if (typeof userObject[drawer] !== "undefined") { - settings.toolbar = settings.toolbar || {}; - settings.toolbar["userlist-drawer"] = userObject[drawer]; - delete userObject[drawer]; - } - if (typeof userObject[polls] !== "undefined") { - settings.poll = settings.poll || {}; - settings.poll["hide-text"] = userObject[polls]; - delete userObject[polls]; - } - }; - if (version < 2) { - migrateAttributes(); - Feedback.send("Migrate-2", true); - userObject.version = version = 2; - } - })).nThen((function() { - var migrateLanguage = function() { - if (!localStorage.CRYPTPAD_LANG) { - return; - } - var l = localStorage.CRYPTPAD_LANG; - userObject.settings.language = l; - }; - if (version < 3) { - migrateLanguage(); - Feedback.send("Migrate-3", true); - userObject.version = version = 3; - } - })).nThen((function() { - var migrateFeedback = function() { - var settings = userObject.settings = userObject.settings || {}; - if (typeof userObject["allowUserFeedback"] !== "undefined") { - settings.general = settings.general || {}; - settings.general.allowUserFeedback = userObject["allowUserFeedback"]; - delete userObject["allowUserFeedback"]; - } - }; - if (version < 4) { - migrateFeedback(); - Feedback.send("Migrate-4", true); - userObject.version = version = 4; - } - })).nThen((function() { - var migrateDates = function() { - var data = userObject.drive && userObject.drive.filesData; - if (data) { - for (var id in data) { - if (typeof data[id].ctime !== "number") { - data[id].ctime = +new Date(data[id].ctime); - } - if (typeof data[id].atime !== "number") { - data[id].atime = +new Date(data[id].atime); - } - } - } - }; - if (version < 5) { - migrateDates(); - Feedback.send("Migrate-5", true); - userObject.version = version = 5; - } - })).nThen((function(waitFor) { - var addChannelId = function() { - var data = userObject.drive.filesData || {}; - var el, parsed; - var n = nThen((function() {})); - var padsLength = Object.keys(data).length; - Object.keys(data).forEach((function(k, i) { - n = n.nThen((function(w) { - setTimeout(w((function() { - el = data[k]; - parsed = Hash.parsePadUrl(el.href); - if (!el.href) { - return; - } - if (!el.channel) { - var secret = Hash.getSecrets(parsed.type, parsed.hash, el.password); - el.channel = secret.channel; - progress(6, Math.round(100 * i / padsLength)); - console.log("Adding missing channel in filesData ", el.channel); - } - }))); - })); - })); - n.nThen(waitFor((function() { - Feedback.send("Migrate-6", true); - userObject.version = version = 6; - }))); - }; - if (version < 6) { - addChannelId(); - } - })).nThen((function(waitFor) { - var addRoHref = function() { - var data = userObject.drive.filesData; - var el, parsed; - var n = nThen((function() {})); - var padsLength = Object.keys(data).length; - Object.keys(data).forEach((function(k, i) { - n = n.nThen((function(w) { - setTimeout(w((function() { - el = data[k]; - if (!el.href) { - return void progress(7, Math.round(100 * i / padsLength)); - } - if (el.href.indexOf("#") === -1) { - return void progress(7, Math.round(100 * i / padsLength)); - } - parsed = Hash.parsePadUrl(el.href); - if (parsed.hashData.type !== "pad") { - return void progress(7, Math.round(100 * i / padsLength)); - } - if (parsed.hashData.mode === "view") { - el.roHref = el.href; - delete el.href; - console.log("Move href to roHref in filesData ", el.roHref); - } else { - var secret = Hash.getSecrets(parsed.type, parsed.hash, el.password); - var hash = Hash.getViewHashFromKeys(secret); - if (hash) { - el.roHref = "/" + parsed.type + "/#" + hash; - console.log("Adding missing roHref in filesData ", el.href); - } - } - progress(6, Math.round(100 * i / padsLength)); - }))); - })); - })); - n.nThen(waitFor((function() { - Feedback.send("Migrate-7", true); - userObject.version = version = 7; - }))); - }; - if (version < 7) { - addRoHref(); - } - })).nThen((function() { - var fixDuplicate = function() { - userObject.FS_hashes = Util.deduplicateString(userObject.FS_hashes || []); - }; - if (version < 8) { - fixDuplicate(); - Feedback.send("Migrate-8", true); - userObject.version = version = 8; - } - })).nThen((function() { - var migrateFriends = function() { - var network = store.network; - var channels = {}; - var ctx = { - store - }; - var myData = Messaging.createData(userObject); - var close = function(chan) { - var channel = channels[chan]; - if (!channel) { - return; - } - try { - channel.wc.leave(); - } catch (e) {} - delete channels[chan]; - }; - var onDirectMessage = function(msg, sender) { - if (sender !== network.historyKeeper) { - return; - } - var parsed = JSON.parse(msg); - if ((parsed.validateKey || parsed.owners) && parsed.channel) { - return; - } - if (parsed.channel && channels[parsed.channel]) { - if (parsed.error && parsed.error === "EINVAL") { - var histMsg = [ "GET_HISTORY", parsed.channel, {} ]; - network.sendto(network.historyKeeper, JSON.stringify(histMsg)).then((function() {}), (function() {})); - return; - } - if (parsed.state && parsed.state === 1) { - myData.channel = parsed.channel; - var updateMsg = [ "UPDATE", myData.curvePublic, +new Date, myData ]; - var cryptMsg = channels[parsed.channel].encrypt(JSON.stringify(updateMsg)); - channels[parsed.channel].wc.bcast(cryptMsg).then((function() {}), (function(err) { - console.error("Can't migrate this friend", channels[parsed.channel].friend, err); - })); - close(parsed.channel); - return; - } - } else if (parsed.channel) { - return; - } - var chan = parsed[3]; - if (!chan || !channels[chan]) { - return; - } - var channel = channels[chan]; - var msgIn = channel.decrypt(parsed[4]); - var parsedMsg = JSON.parse(msgIn); - if (parsedMsg[0] === "UPDATE") { - if (parsedMsg[1] === myData.curvePublic) { - return; - } - var data = parsedMsg[3]; - if (!data.notifications) { - return; - } - channel.friend.notifications = data.notifications; - myData.channel = chan; - Mailbox.sendTo(ctx, "UPDATE_DATA", myData, { - channel: data.notifications, - curvePublic: data.curvePublic - }, (function(obj) { - if (obj && obj.error) { - return void console.error(obj); - } - console.log("friend migrated", channel.friend); - })); - close(chan); - } - }; - network.on("message", (function(msg, sender) { - try { - onDirectMessage(msg, sender); - } catch (e) { - console.error(e); - } - })); - var friends = userObject.friends || {}; - Object.keys(friends).forEach((function(curve) { - if (curve.length !== 44) { - return; - } - var friend = friends[curve]; - if (friend.notifications) { - return; - } - network.join(friend.channel).then((function(wc) { - var keys = Crypto.Curve.deriveKeys(friend.curvePublic, userObject.curvePrivate); - var encryptor = Crypto.Curve.createEncryptor(keys); - channels[friend.channel] = { - wc, - friend, - decrypt: encryptor.decrypt, - encrypt: encryptor.encrypt - }; - var cfg = { - lastKnownHash: friend.lastKnownHash - }; - var msg = [ "GET_HISTORY", friend.channel, cfg ]; - network.sendto(network.historyKeeper, JSON.stringify(msg)).then((function() {}), (function(err) { - console.error("Can't migrate this friend", friend, err); - })); - }), (function(err) { - console.error("Can't migrate this friend", friend, err); - })); - })); - }; - if (version < 9) { - migrateFriends(); - Feedback.send("Migrate-9", true); - userObject.version = version = 9; - } - })).nThen((function(waitFor) { - var fixTodo = function() { - var h = store.proxy.todo; - if (!h) { - return; - } - var next = waitFor((function() { - Feedback.send("Migrate-10", true); - userObject.version = version = 10; - })); - var old; - var opts = { - network: store.network, - initialState: "{}", - metadata: { - owners: store.proxy.edPublic ? [ store.proxy.edPublic ] : [] - } - }; - nThen((function(w) { - Crypt.get(h, w((function(err, val) { - if (err || !val) { - w.abort(); - next(); - return; - } - try { - old = JSON.parse(val); - } catch (e) {} - })), opts); - })).nThen((function(w) { - if (!old || typeof old !== "object") { - w.abort(); - next(); - return; - } - var k = { - content: { - data: { - 1: { - id: "1", - color: "color6", - item: [], - title: Messages.kanban_todo - }, - 2: { - id: "2", - color: "color3", - item: [], - title: Messages.kanban_working - }, - 3: { - id: "3", - color: "color5", - item: [], - title: Messages.kanban_done - } - }, - items: {}, - list: [ 1, 2, 3 ] - }, - metadata: { - title: Messages.type.todo, - defaultTitle: Messages.type.todo, - type: "kanban" - } - }; - var i = 4; - var items = false; - (old.order || []).forEach((function(key) { - var data = old.data[key]; - if (!data || !data.task) { - return; - } - items = true; - var column = data.state ? "3" : "1"; - k.content.data[column].item.push(i); - k.content.items[i] = { - id: i, - title: data.task - }; - i++; - })); - if (!items) { - w.abort(); - next(); - return; - } - var newH = Hash.createRandomHash("kanban"); - var secret = Hash.getSecrets("kanban", newH); - var oldSecret = Hash.getSecrets("todo", h); - Crypt.put(newH, JSON.stringify(k), w((function(err) { - if (err) { - w.abort(); - next(); - return; - } - if (store.rpc) { - store.rpc.pin([ secret.channel ], (function() {})); - store.rpc.unpin([ oldSecret.channel ], (function() {})); - } - var href = Hash.hashToHref(newH, "kanban"); - store.manager.addPad([ "root" ], { - title: Messages.type.todo, - owners: opts.metadata.owners, - channel: secret.channel, - href, - roHref: Hash.hashToHref(Hash.getViewHashFromKeys(secret), "kanban"), - atime: +new Date, - ctime: +new Date - }, w((function(e) { - if (e) { - return void console.error(e); - } - delete store.proxy.todo; - var myData = Messaging.createData(userObject); - var ctx = { - store - }; - Mailbox.sendTo(ctx, "MOVE_TODO", { - user: myData, - href - }, { - channel: myData.notifications, - curvePublic: myData.curvePublic - }, (function(obj) { - if (obj && obj.error) { - return void console.error(obj); - } - })); - }))); - })), opts); - })).nThen((function() { - next(); - })); - }; - if (version < 10) { - fixTodo(); - } - })).nThen((function(waitFor) { - if (version >= 11) { - return; - } - var done = function() { - Feedback.send("Migrate-11", true); - userObject.version = version = 11; - }; - var unsafeLinks = Util.find(userObject, [ "settings", "security", "unsafeLinks" ]); - if (unsafeLinks !== undefined) { - return void done(); - } - var ctx = { - store - }; - var myData = Messaging.createData(userObject); - if (!myData.curvePublic) { - return void done(); - } - Mailbox.sendTo(ctx, "SAFE_LINKS_DEFAULT", { - user: myData - }, { - channel: myData.notifications, - curvePublic: myData.curvePublic - }, waitFor((function(obj) { - if (obj && obj.error) { - return void console.error(obj); - } - done(); - }))); - })).nThen((function() { - Realtime.whenRealtimeSyncs(store.realtime, Util.mkAsync(Util.bake(cb))); - })); - }; - migrate.setCustomize = setCustomize; - return migrate; - }; - if (module.exports) { - module.exports = factory(requireCommonFeedback(), requireCommonHash(), requireCommonUtil(), requireCommonMessaging(), requireCryptget(), requireMailbox(), undefined, requireCommonRealtime(), requireNthen(), requireCrypto()); - } - })(); - })(migrateUserObject$1); - return migrateUserObject$1.exports; - } - var mergeDrive = { - exports: {} - }; - var hasRequiredMergeDrive; - function requireMergeDrive() { - if (hasRequiredMergeDrive) return mergeDrive.exports; - hasRequiredMergeDrive = 1; - (function(module) { - (() => { - const factory = (Crypt, FO, Hash, Realtime) => { - var exp = {}; - exp.anonDriveIntoUser = function(proxyData, fsHash, cb) { - if (!fsHash || !proxyData.loggedIn) { - if (typeof cb === "function") { - return void cb(); - } - } - var todo = function(err, doc) { - if (err) { - console.error("Cannot migrate recent pads", err); - return; - } - var parsed; - if (!doc) { - if (typeof cb === "function") { - cb(); - } - return; - } - try { - parsed = JSON.parse(doc); - } catch (e) { - if (typeof cb === "function") { - cb(); - } - console.error("Cannot parsed recent pads", e); - return; - } - if (parsed) { - var proxy = proxyData.proxy; - var oldFo = FO.init(parsed.drive, { - readOnly: false, - loggedIn: true, - outer: true - }); - var onMigrated = function() { - oldFo.fixFiles(true); - var manager = proxyData.manager; - var oldFiles = oldFo.getFiles([ oldFo.FILES_DATA ]); - oldFiles.forEach((function(id) { - var data = oldFo.getFileData(id); - var channel = data.channel; - var datas = manager.findChannel(channel); - if (datas.length !== 0) { - if (!data.href) { - return; - } - datas.forEach((function(pad) { - if (pad.data && !pad.data.href) { - pad.userObject.setHref(channel, null, data.href); - } - })); - return; - } - if (data) { - manager.addPad(null, data, (function(err) { - if (err) { - return void console.error("Cannot import file:", data, err); - } - })); - } - })); - if (!proxy.FS_hashes || !Array.isArray(proxy.FS_hashes)) { - proxy.FS_hashes = []; - } - if (proxy.FS_hashes.indexOf(fsHash) === -1) { - proxy.FS_hashes.push(fsHash); - } - if (typeof cb === "function") { - Realtime.whenRealtimeSyncs(proxyData.realtime, cb); - } - }; - if (oldFo && typeof oldFo.migrate === "function") { - oldFo.migrate(onMigrated); - } else { - console.log("oldFo.migrate is not a function"); - onMigrated(); - } - return; - } - if (typeof cb === "function") { - cb(); - } - }; - Crypt.get(fsHash, todo); - }; - return exp; - }; - if (module.exports) { - module.exports = factory(requireCryptget(), requireUserObject(), requireCommonHash(), requireCommonRealtime()); - } - })(); - })(mergeDrive); - return mergeDrive.exports; - } - var require$$15 = getAugmentedNamespace(account); - const onCacheReadyEvt = commonUtilExports.mkEvent(true); - const onReadyEvt = commonUtilExports.mkEvent(true); - const onDisconnectEvt = commonUtilExports.mkEvent(); - const onReconnectEvt = commonUtilExports.mkEvent(); - const init = config => { - var _a; - const {broadcast, store, account} = config; - const drive = store.drive = store.drive || {}; - let data = (_a = store.proxy) === null || _a === void 0 ? void 0 : _a.drive; - console.error(data, store.proxy); - (data === null || data === void 0 ? void 0 : data.hash) || commonHashExports.createRandomHash("drive"); - if (!data.hash) { - drive.proxy = data; - account.onAccountCacheReady((() => { - onCacheReadyEvt.fire(); - })); - account.onAccountReady((() => { - onReadyEvt.fire(); - })); - return { - channel: "", - onDriveCacheReady: onCacheReadyEvt.reg, - onDriveReady: onReadyEvt.reg, - onDisconnect: onDisconnectEvt.reg, - onReconnect: onReconnectEvt.reg - }; - } - throw new Error("NOT IMPLEMENTED"); - }; - const Drive = { - init - }; - var drive = Object.freeze({ - __proto__: null, - Drive - }); - var require$$16 = getAugmentedNamespace(drive); - var cursor$1 = { - exports: {} - }; - var hasRequiredCursor; - function requireCursor() { - if (hasRequiredCursor) return cursor$1.exports; - hasRequiredCursor = 1; - (function(module) { - (() => { - const factory = (Util, Constants, Messages = {}, AppConfig = {}, Crypto) => { - var Cursor = {}; - Cursor.setCustomize = data => { - Messages = data.Messages; - AppConfig = data.AppConfig; - }; - var DEGRADED = AppConfig.degradedLimit || 8; - var convertToUint8 = function(obj) { - var l = Object.keys(obj).length; - var u = new Uint8Array(l); - for (var i = 0; i < l; i++) { - u[i] = obj[i]; - } - return u; - }; - var sendMyCursor = function(ctx, clientId) { - var client = ctx.clients[clientId]; - if (!client || !client.cursor) { - return; - } - var chan = ctx.channels[client.channel]; - if (!chan) { - return; - } - if (chan.degraded) { - return; - } - if (!chan.sendMsg) { - return; - } - var data = { - id: client.id, - cursor: client.cursor - }; - chan.sendMsg(JSON.stringify(data)); - ctx.emit("MESSAGE", data, chan.clients.filter((function(cl) { - return cl !== clientId; - }))); - }; - var sendOurCursors = function(ctx, chan) { - if (chan.degraded) { - return; - } - chan.clients.forEach((function(c) { - var client = ctx.clients[c]; - if (!client) { - return; - } - var data = { - id: client.id, - cursor: client.cursor - }; - chan.sendMsg(JSON.stringify(data)); - })); - }; - var updateDegraded = function(ctx, wc, chan) { - var m = wc.members; - chan.degraded = m.length - 1 >= DEGRADED; - ctx.emit("DEGRADED", { - degraded: chan.degraded - }, chan.clients); - }; - var initCursor = function(ctx, obj, client, cb) { - var channel = obj.channel; - var secret = obj.secret; - if (secret.keys.cryptKey) { - secret.keys.cryptKey = convertToUint8(secret.keys.cryptKey); - } - var padChan = secret.channel; - var network = ctx.store.network; - var first = true; - var c = ctx.clients[client]; - if (!c) { - c = ctx.clients[client] = { - channel, - cursor: {} - }; - } else { - return void cb(); - } - var chan = ctx.channels[channel]; - if (chan) { - if (!c.id) { - c.id = chan.wc.myID + "-" + client; - } - chan.clients.forEach((function(cl) { - var clientObj = ctx.clients[cl]; - if (chan.degraded) { - return; - } - if (!clientObj) { - return; - } - ctx.emit("MESSAGE", { - id: clientObj.id, - cursor: clientObj.cursor - }, [ client ]); - })); - chan.sendMsg(JSON.stringify({ - join: true, - id: c.id - })); - chan.clients.push(client); - updateDegraded(ctx, chan.wc, chan); - return void cb(); - } - var onOpen = function(wc) { - ctx.channels[channel] = ctx.channels[channel] || {}; - var chan = ctx.channels[channel]; - chan.padChan = padChan; - if (!c.id) { - c.id = wc.myID + "-" + client; - } - if (chan.clients) { - chan.clients.forEach((function(cl) { - if (ctx.clients[cl] && !ctx.clients[cl].id) { - ctx.clients[cl].id = wc.myID + "-" + cl; - } - })); - } - if (!chan.encryptor) { - chan.encryptor = Crypto.createEncryptor(secret.keys); - } - wc.on("join", (function() { - sendOurCursors(ctx, chan); - updateDegraded(ctx, wc, chan); - })); - wc.on("leave", (function(peer) { - ctx.emit("MESSAGE", { - leave: true, - id: peer - }, chan.clients); - updateDegraded(ctx, wc, chan); - })); - wc.on("message", (function(cryptMsg) { - if (chan.degraded) { - return; - } - var msg = chan.encryptor.decrypt(cryptMsg, secret.keys && secret.keys.validateKey); - var parsed; - try { - parsed = JSON.parse(msg); - if (parsed && parsed.join) { - return void sendOurCursors(ctx, chan); - } - ctx.emit("MESSAGE", parsed, chan.clients); - } catch (e) { - console.error(e); - } - })); - chan.wc = wc; - chan.sendMsg = function(msg, cb) { - cb = cb || function() {}; - var cmsg = chan.encryptor.encrypt(msg); - wc.bcast(cmsg).then((function() { - cb(); - }), (function(err) { - cb({ - error: err - }); - })); - }; - if (!first) { - return; - } - chan.clients = [ client ]; - first = false; - cb(); - updateDegraded(ctx, wc, chan); - }; - network.join(channel).then(onOpen, (function(err) { - return void cb({ - error: err - }); - })); - var onReconnect = function() { - if (!ctx.channels[channel]) { - console.log("cant reconnect", channel); - return; - } - network.join(channel).then(onOpen, (function(err) { - console.error(err); - })); - }; - ctx.channels[channel] = ctx.channels[channel] || {}; - ctx.channels[channel].onReconnect = onReconnect; - network.on("reconnect", onReconnect); - }; - var updateCursor = function(ctx, data, client, cb) { - var c = ctx.clients[client]; - if (!c) { - return void cb({ - error: "NO_CLIENT" - }); - } - var proxy = ctx.store.proxy || {}; - data.color = Util.find(proxy, [ "settings", "general", "cursor", "color" ]); - data.name = proxy[Constants.displayNameKey] || ctx.store.noDriveName || Messages.anonymous; - data.avatar = Util.find(proxy, [ "profile", "avatar" ]); - data.uid = Util.find(proxy, [ "uid" ]) || ctx.store.noDriveUid; - c.cursor = data; - sendMyCursor(ctx, client); - cb(); - }; - var leaveChannel = function(ctx, padChan) { - Object.keys(ctx.channels).some((function(cursorChan) { - var channel = ctx.channels[cursorChan]; - if (channel.padChan !== padChan) { - return; - } - if (channel.wc) { - channel.wc.leave(); - } - if (channel.onReconnect) { - var network = ctx.store.network; - network.off("reconnect", channel.onReconnect); - } - delete ctx.channels[cursorChan]; - return true; - })); - }; - var removeClient = function(ctx, clientId) { - var filter = function(c) { - return c !== clientId; - }; - var chan; - for (var k in ctx.channels) { - chan = ctx.channels[k]; - chan.clients = chan.clients.filter(filter); - if (chan.clients.length === 0) { - if (chan.wc) { - chan.wc.leave(); - } - if (chan.onReconnect) { - var network = ctx.store.network; - network.off("reconnect", chan.onReconnect); - } - delete ctx.channels[k]; - } - } - if (ctx.clients[clientId]) { - var leaveMsg = { - leave: true, - id: ctx.clients[clientId].id - }; - chan = ctx.channels[ctx.clients[clientId].channel]; - if (chan) { - chan.sendMsg(JSON.stringify(leaveMsg)); - ctx.emit("MESSAGE", leaveMsg, chan.clients); - } - } - delete ctx.clients[clientId]; - }; - Cursor.init = function(cfg, waitFor, emit) { - var cursor = {}; - if (cfg.store && cfg.store.modules && cfg.store.modules["cursor"]) { - return cfg.store.modules["cursor"]; - } - var ctx = { - store: cfg.store, - emit, - channels: {}, - clients: {} - }; - cursor.removeClient = function(clientId) { - removeClient(ctx, clientId); - }; - cursor.leavePad = function(padChan) { - leaveChannel(ctx, padChan); - }; - cursor.execCommand = function(clientId, obj, cb) { - var cmd = obj.cmd; - var data = obj.data; - if (cmd === "INIT_CURSOR") { - return void initCursor(ctx, data, clientId, cb); - } - if (cmd === "UPDATE") { - return void updateCursor(ctx, data, clientId, cb); - } - }; - return cursor; - }; - return Cursor; - }; - if (module.exports) { - module.exports = factory(requireCommonUtil(), requireCommonConstants(), undefined, undefined, requireCrypto()); - } - })(); - })(cursor$1); - return cursor$1.exports; - } - var support$1 = { - exports: {} - }; - var hasRequiredSupport; - function requireSupport() { - if (hasRequiredSupport) return support$1.exports; - hasRequiredSupport = 1; - (function(module) { - (() => { - const factory = (ApiConfig = {}, Util, Hash, Realtime, Pinpad, Crypt, nThen, Crypto, Listmap, ChainPad, CpNetflux) => { - var Support = {}; - Support.setCustomize = data => { - ApiConfig = data.ApiConfig; - }; - var Nacl = Crypto.Nacl; - var notifyClient = function(ctx, admin, type, channel) { - let notifyList = Object.keys(ctx.clients).filter((cId => Boolean(ctx.clients[cId].admin) === admin)); - if (!notifyList.length) { - return; - } - ctx.emit(type, { - channel - }, [ notifyList ]); - }; - var getKeys = function(ctx, isAdmin, data, _cb) { - var cb = Util.mkAsync(_cb); - if (isAdmin && !ctx.adminRdyEvt) { - return void cb("EFORBIDDEN"); - } - let origin = ApiConfig.httpUnsafeOrigin; - Util.fetchApi(origin, "config", true, (NewConfig => { - ctx.moderatorKeys = NewConfig.moderatorKeys; - ctx.adminKeys = NewConfig.adminKeys; - var supportKey = NewConfig.supportMailboxKey; - if (!supportKey) { - return void cb("E_NOT_INIT"); - } - if (isAdmin && Util.find(ctx.store.proxy, [ "mailboxes", "supportteam", "keys", "curvePublic" ]) !== supportKey) { - return void cb("EFORBIDDEN"); - } - if (isAdmin) { - return ctx.adminRdyEvt.reg((() => { - cb(null, { - supportKey, - myCurve: data.adminCurvePrivate || Util.find(ctx.store.proxy, [ "mailboxes", "supportteam", "keys", "curvePrivate" ]), - theirPublic: data.curvePublic, - notifKey: data.curvePublic - }); - })); - } - cb(null, { - supportKey, - myCurve: ctx.store.proxy.curvePrivate, - theirPublic: data.curvePublic || supportKey, - notifKey: supportKey - }); - })); - }; - var getContent = function(ctx, data, isAdmin, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - var theirPublic, myCurve; - nThen((waitFor => { - getKeys(ctx, isAdmin, data, waitFor(((err, obj) => { - if (err) { - waitFor.abort(); - return void cb({ - error: err - }); - } - theirPublic = obj.theirPublic; - myCurve = obj.myCurve; - }))); - })).nThen((() => { - var keys = Crypto.Curve.deriveKeys(theirPublic, myCurve); - var crypto = Crypto.Curve.createEncryptor(keys); - var cfg = { - network: ctx.store.network, - channel: data.channel, - noChainPad: true, - crypto, - owners: [] - }; - var all = []; - var cpNf; - var close = function() { - if (!cpNf) { - return; - } - if (typeof cpNf.stop !== "function") { - return; - } - cpNf.stop(); - }; - cb = Util.both(close, cb); - cfg.onMessage = function(msg, user, vKey, isCp, hash, author, data) { - var time = data && data.time; - try { - msg = JSON.parse(msg); - } catch (e) { - console.error(e); - return; - } - msg.time = time; - if (author) { - msg.author = author; - } - all.push(msg); - }; - cfg.onError = cb; - cfg.onChannelError = cb; - cfg.onReady = function() { - cb(null, all); - }; - cpNf = CpNetflux.start(cfg); - })); - }; - var makeTicket = function(ctx, data, isAdmin, cb) { - var mailbox = Util.find(ctx, [ "store", "mailbox" ]); - var anonRpc = Util.find(ctx, [ "store", "anon_rpc" ]); - if (!mailbox) { - return void cb({ - error: "E_NOT_READY" - }); - } - if (!anonRpc) { - return void cb({ - error: "anonymous rpc session not ready" - }); - } - var channel = data.channel; - var title = data.title; - var ticket = data.ticket; - var supportKey, theirPublic, myCurve; - var time = +new Date; - nThen((waitFor => { - getKeys(ctx, isAdmin, data, waitFor(((err, obj) => { - if (err) { - waitFor.abort(); - return void cb({ - error: err - }); - } - supportKey = obj.supportKey; - theirPublic = obj.theirPublic; - myCurve = obj.myCurve; - }))); - })).nThen((waitFor => { - var keys = Crypto.Curve.deriveKeys(theirPublic, myCurve); - var crypto = Crypto.Curve.createEncryptor(keys); - var text = JSON.stringify(ticket); - var ciphertext = crypto.encrypt(text); - anonRpc.send("WRITE_PRIVATE_MESSAGE", [ channel, ciphertext ], waitFor(((err, res) => { - if (err) { - waitFor.abort(); - return void cb({ - error: err - }); - } - time = res && res[0]; - }))); - })).nThen((waitFor => { - if (!isAdmin) { - return; - } - var doc = ctx.adminDoc.proxy; - var active = doc.tickets.active; - if (active[channel]) { - waitFor.abort(); - return void cb({ - error: "EEXISTS" - }); - } - active[channel] = { - title: ticket.title, - restored: ticket.legacy, - premium: false, - time, - author: data.name, - supportKey, - lastAdmin: true, - authorKey: data.curvePublic, - notifications: data.notifications - }; - })).nThen((waitFor => { - if (isAdmin) { - return; - } - ctx.supportData[channel] = { - time: +new Date, - title, - curvePublic: supportKey - }; - ctx.Store.onSync(null, waitFor()); - })).nThen((() => { - var notifChannel = isAdmin ? data.notifications : Hash.getChannelIdFromKey(supportKey); - mailbox.sendTo("NEW_TICKET", { - title, - channel, - time, - isAdmin, - supportKey, - premium: isAdmin ? "" : Util.find(ctx, [ "store", "account", "plan" ]), - user: Util.find(data.ticket, [ "sender", "curvePublic" ]) ? undefined : { - supportTeam: true - } - }, { - channel: notifChannel, - curvePublic: theirPublic - }, (obj => { - console.error(obj); - if (obj && obj.error) { - delete ctx.supportData[channel]; - } - cb(obj); - })); - mailbox.sendTo("NOTIF_TICKET", { - title, - channel, - time, - isAdmin, - isNewTicket: true, - user: Util.find(data.ticket, [ "sender", "curvePublic" ]) ? undefined : { - supportTeam: true - } - }, { - channel: notifChannel, - curvePublic: theirPublic - }, (() => {})); - })); - }; - var replyTicket = function(ctx, data, isAdmin, cb) { - var mailbox = Util.find(ctx, [ "store", "mailbox" ]); - var anonRpc = Util.find(ctx, [ "store", "anon_rpc" ]); - if (!mailbox) { - return void cb("E_NOT_READY"); - } - if (!anonRpc) { - return void cb("anonymous rpc session not ready"); - } - if (!data?.ticket) { - return void cb("E_NO_DATA"); - } - var theirPublic, myCurve, notifKey; - var time; - nThen((waitFor => { - getKeys(ctx, isAdmin, data, waitFor(((err, obj) => { - if (err) { - waitFor.abort(); - return void cb(err); - } - theirPublic = obj.theirPublic; - myCurve = obj.myCurve; - notifKey = obj.notifKey; - }))); - })).nThen((waitFor => { - var keys = Crypto.Curve.deriveKeys(theirPublic, myCurve); - var crypto = Crypto.Curve.createEncryptor(keys); - var text = JSON.stringify(data.ticket); - var ciphertext = crypto.encrypt(text); - anonRpc.send("WRITE_PRIVATE_MESSAGE", [ data.channel, ciphertext ], waitFor(((err, res) => { - if (err) { - waitFor.abort(); - return void cb(err); - } - time = res && res[0]; - cb(void 0, time); - }))); - })).nThen((() => { - var notifChannel = isAdmin ? data.notifChannel : Hash.getChannelIdFromKey(notifKey); - if (!notifChannel) { - return; - } - mailbox.sendTo("NOTIF_TICKET", { - isAdmin, - title: data.ticket.title, - isClose: data.ticket.close, - channel: data.channel, - time, - user: Util.find(data.ticket, [ "sender", "curvePublic" ]) ? undefined : { - supportTeam: true - } - }, { - channel: notifChannel, - curvePublic: notifKey - }, (() => {})); - })); - }; - var getPinList = function(ctx) { - if (!ctx.adminDoc || !ctx.supportRpc) { - return; - } - let adminChan = ctx.adminDoc.metadata && ctx.adminDoc.metadata.channel; - let doc = ctx.adminDoc.proxy; - let t = doc.tickets; - let list = [ adminChan, ...Object.keys(t.active), ...Object.keys(t.pending), ...Object.keys(t.closed) ]; - return Util.deduplicateString(list).sort(); - }; - var initAdminRpc = function(ctx, _cb) { - let cb = Util.mkAsync(_cb); - let proxy = ctx.store.proxy; - let curvePrivate = Util.find(proxy, [ "mailboxes", "supportteam", "keys", "curvePrivate" ]); - if (!curvePrivate) { - return void cb("EFORBIDDEN"); - } - let edPrivate, edPublic; - try { - let pair = Nacl.sign.keyPair.fromSeed(Nacl.util.decodeBase64(curvePrivate)); - edPrivate = Nacl.util.encodeBase64(pair.secretKey); - edPublic = Nacl.util.encodeBase64(pair.publicKey); - } catch (e) { - return void cb(e); - } - Pinpad.create(ctx.store.network, { - edPublic, - edPrivate - }, ((e, call) => { - if (e) { - return void cb(e); - } - console.log("Support RPC ready, public key is ", edPublic); - ctx.supportRpc = call; - cb(); - })); - }; - var loadAdminDoc = function(ctx, hash, cb) { - var secret = Hash.getSecrets("support", hash); - var listmapConfig = { - data: {}, - channel: secret.channel, - crypto: Crypto.createEncryptor(secret.keys), - userName: "support", - ChainPad, - classic: true, - network: ctx.store.network, - metadata: { - validateKey: secret.keys.validateKey || undefined - } - }; - var rt = ctx.adminDoc = Listmap.create(listmapConfig); - rt.proxy.on("ready", (function() { - var doc = rt.proxy; - doc.tickets = doc.tickets || {}; - doc.tickets.active = doc.tickets.active || {}; - doc.tickets.closed = doc.tickets.closed || {}; - doc.tickets.pending = doc.tickets.pending || {}; - ctx.adminRdyEvt.fire(); - cb(); - if (!ctx.supportRpc) { - return; - } - let list = getPinList(ctx); - let local = Hash.hashChannelList(list); - ctx.supportRpc.getServerHash((function(e, hash) { - if (e) { - return void console.warn(e); - } - if (hash !== local) { - ctx.supportRpc.reset(list, (function(e) { - if (e) { - console.warn(e); - } - })); - } - })); - })); - rt.proxy.on("change", [ "recorded" ], (function() { - notifyClient(ctx, true, "RECORDED_CHANGE", ""); - })); - rt.proxy.on("remove", [ "recorded" ], (function() { - notifyClient(ctx, true, "RECORDED_CHANGE", ""); - })); - }; - var initializeSupportAdmin = function(ctx, isReset, waitFor) { - let unlock = waitFor(); - let proxy = ctx.store.proxy; - let supportKey = Util.find(proxy, [ "mailboxes", "supportteam", "keys", "curvePublic" ]); - let privateKey = Util.find(proxy, [ "mailboxes", "supportteam", "keys", "curvePrivate" ]); - if (!isReset) { - ctx.adminRdyEvt = Util.mkEvent(true); - } - nThen((waitFor => { - getKeys(ctx, false, {}, waitFor(((err, obj) => { - setTimeout(unlock); - if (err) { - return void waitFor.abort(); - } - if (obj.theirPublic !== supportKey) { - try { - delete proxy.mailboxes.supportteam; - ctx.store.mailbox.close("supportteam"); - } catch (e) {} - delete ctx.adminRdyEvt; - return void waitFor.abort(); - } - }))); - })).nThen((waitFor => { - initAdminRpc(ctx, waitFor((err => { - if (err) { - console.error("Support RPC not ready", err); - } - }))); - })).nThen((waitFor => { - let seed = privateKey.slice(0, 24); - let hash = Hash.getEditHashFromKeys({ - version: 2, - type: "support", - keys: { - editKeyStr: seed - } - }); - loadAdminDoc(ctx, hash, waitFor()); - })).nThen((() => { - console.log("Support admin loaded"); - })); - }; - var getMyTickets = function(ctx, data, cId, cb) { - var all = []; - var n = nThen; - if (!ctx.clients[cId]) { - ctx.clients[cId] = { - admin: false - }; - } - Object.keys(ctx.supportData).forEach((function(ticket) { - n = n((waitFor => { - var t = Util.clone(ctx.supportData[ticket]); - getContent(ctx, { - channel: ticket, - curvePublic: t.curvePublic - }, false, waitFor(((err, messages) => { - if (err) { - if (err.type === "EDELETED") { - delete ctx.supportData[ticket]; - return; - } - t.error = err; - } else { - t.messages = messages; - if (messages.length && messages[messages.length - 1].close) { - ctx.supportData[ticket].closed = true; - t.closed = true; - } - } - t.id = ticket; - all.push(t); - }))); - })).nThen; - })); - n((() => { - all.sort(((t1, t2) => { - if (t1.closed && t2.closed) { - return t1.time - t2.time; - } - if (t1.closed) { - return 1; - } - if (t2.closed) { - return -1; - } - return t1.time - t2.time; - })); - cb({ - tickets: all - }); - })); - }; - var makeMyTicket = function(ctx, data, cId, cb) { - makeTicket(ctx, data, false, cb); - }; - var replyMyTicket = function(ctx, data, cId, cb) { - replyTicket(ctx, data, false, (err => { - if (err) { - return void cb({ - error: err - }); - } - cb({ - sent: true - }); - })); - }; - var closeMyTicket = function(ctx, data, cId, cb) { - replyTicket(ctx, data, false, (err => { - if (err) { - return void cb({ - error: err - }); - } - cb({ - closed: true - }); - })); - }; - var deleteMyTicket = function(ctx, data, cId, cb) { - let support = ctx.supportData; - let channel = data.channel; - if (!support[channel] || !support[channel].closed) { - return void cb({ - error: "ENOTCLOSED" - }); - } - delete support[channel]; - cb({ - deleted: true - }); - }; - var listTicketsAdmin = function(ctx, data, cId, cb) { - if (!ctx.adminRdyEvt) { - return void cb({ - error: "EFORBIDDEN" - }); - } - if (!ctx.clients[cId]) { - ctx.clients[cId] = { - admin: true - }; - } - ctx.adminRdyEvt.reg((() => { - var doc = ctx.adminDoc.proxy; - if (data.type === "pending") { - return cb(Util.clone(doc.tickets.pending)); - } - if (data.type === "closed") { - return cb(Util.clone(doc.tickets.closed)); - } - cb(Util.clone(doc.tickets.active)); - })); - }; - var loadTicketAdmin = function(ctx, data, cId, cb) { - let supportKey = data.supportKey; - ctx.adminRdyEvt.reg((() => { - let doc = ctx.adminDoc.proxy; - if (doc.oldKeys && doc.oldKeys[supportKey]) { - data.adminCurvePrivate = doc.oldKeys[supportKey].curvePrivate; - } - getContent(ctx, data, true, (function(err, res) { - if (err) { - return void cb({ - error: err - }); - } - var doc = ctx.adminDoc.proxy; - if (!Array.isArray(res) || !res.length) { - return void cb(res); - } - res.sort(((t1, t2) => t1.time - t2.time)); - let last = res[res.length - 1]; - let premium = res.some((msg => { - let curve = Util.find(msg, [ "sender", "curvePublic" ]); - if (data.curvePublic !== curve) { - return; - } - return Util.find(msg, [ "sender", "quota", "plan" ]); - })); - var entry = doc.tickets.active[data.channel]; - if (entry) { - if (last.legacy) { - let lastMsg = Array.isArray(last.messages) && last.messages[last.messages.length - 1]; - last = lastMsg; - } - entry.time = last.time; - entry.premium = premium; - if (last.sender) { - entry.lastAdmin = !last.sender.blockLocation; - } - if (last.close) { - doc.tickets.closed[data.channel] = entry; - delete doc.tickets.active[data.channel]; - notifyClient(ctx, true, "UPDATE_TICKET", data.channel); - } - } - cb(res); - })); - })); - }; - var makeTicketAdmin = function(ctx, data, cId, cb) { - if (!ctx.adminRdyEvt) { - return void cb({ - error: "EFORBIDDEN" - }); - } - ctx.adminRdyEvt.reg((() => { - makeTicket(ctx, data, true, cb); - })); - }; - var replyTicketAdmin = function(ctx, data, cId, cb) { - if (!ctx.adminRdyEvt) { - return void cb({ - error: "EFORBIDDEN" - }); - } - let supportKey = data.supportKey; - ctx.adminRdyEvt.reg((() => { - let doc = ctx.adminDoc.proxy; - if (doc.oldKeys && doc.oldKeys[supportKey]) { - data.adminCurvePrivate = doc.oldKeys[supportKey].curvePrivate; - } - replyTicket(ctx, data, true, ((err, time) => { - if (err) { - return void cb({ - error: err - }); - } - var doc = ctx.adminDoc.proxy; - var entry = doc.tickets.active[data.channel] || doc.tickets.pending[data.channel]; - entry.time = time; - entry.lastAdmin = true; - cb({ - sent: true - }); - })); - })); - }; - var closeTicketAdmin = function(ctx, data, cId, cb) { - if (!ctx.adminRdyEvt) { - return void cb({ - error: "EFORBIDDEN" - }); - } - let supportKey = data.supportKey; - ctx.adminRdyEvt.reg((() => { - let doc = ctx.adminDoc.proxy; - if (doc.oldKeys && doc.oldKeys[supportKey]) { - data.adminCurvePrivate = doc.oldKeys[supportKey].curvePrivate; - } - replyTicket(ctx, data, true, (err => { - if (err) { - return void cb({ - error: err - }); - } - var doc = ctx.adminDoc.proxy; - var entry = doc.tickets.active[data.channel] || doc.tickets.pending[data.channel]; - entry.time = +new Date; - entry.lastAdmin = true; - doc.tickets.closed[data.channel] = entry; - delete doc.tickets.active[data.channel]; - delete doc.tickets.pending[data.channel]; - Realtime.whenRealtimeSyncs(ctx.adminDoc.realtime, (function() { - cb({ - closed: true - }); - })); - })); - })); - }; - var moveTicketAdmin = function(ctx, data, cId, cb) { - if (!ctx.adminRdyEvt) { - return void cb({ - error: "EFORBIDDEN" - }); - } - let ticketId = data.channel; - let from = data.from; - let to = data.to; - ctx.adminRdyEvt.reg((() => { - let doc = ctx.adminDoc.proxy; - let fromDoc = doc.tickets[from]; - let toDoc = doc.tickets[to]; - if (!from || !to) { - return void cb({ - error: "EINVAL" - }); - } - let ticket = fromDoc[ticketId]; - if (!ticket || toDoc[ticketId]) { - return void cb({ - error: "CANT_MOVE" - }); - } - toDoc[ticketId] = ticket; - delete fromDoc[ticketId]; - Realtime.whenRealtimeSyncs(ctx.adminDoc.realtime, (function() { - cb({ - moved: true - }); - })); - })); - }; - var getRecorded = function(ctx, data, cId, cb) { - if (!ctx.adminRdyEvt) { - return void cb({ - error: "EFORBIDDEN" - }); - } - ctx.adminRdyEvt.reg((() => { - let doc = ctx.adminDoc.proxy; - let recorded = doc.recorded = doc.recorded || {}; - cb({ - messages: Util.clone(recorded) - }); - })); - }; - var setRecorded = function(ctx, data, cId, cb) { - if (!ctx.adminRdyEvt) { - return void cb({ - error: "EFORBIDDEN" - }); - } - let id = data.id; - let content = data.content; - let remove = Boolean(data.remove); - ctx.adminRdyEvt.reg((() => { - let doc = ctx.adminDoc.proxy; - let recorded = doc.recorded = doc.recorded || {}; - if (remove) { - delete recorded[id]; - } else { - recorded[id] = { - content, - count: 0 - }; - } - Realtime.whenRealtimeSyncs(ctx.adminDoc.realtime, (function() { - cb({ - done: true - }); - })); - })); - }; - var useRecorded = function(ctx, data, cId, cb) { - if (!ctx.adminRdyEvt) { - return void cb({ - error: "EFORBIDDEN" - }); - } - let id = data.id; - ctx.adminRdyEvt.reg((() => { - let doc = ctx.adminDoc.proxy; - let recorded = doc.recorded = doc.recorded || {}; - let entry = recorded[id]; - if (entry) { - entry.count = (entry.count || 0) + 1; - } - cb(); - })); - }; - var searchAdmin = (ctx, data, cId, cb) => { - if (!ctx.adminRdyEvt) { - return void cb({ - error: "EFORBIDDEN" - }); - } - let tags = data.tags || []; - let text = (data.text || "").toLowerCase(); - ctx.adminRdyEvt.reg((() => { - let doc = ctx.adminDoc.proxy; - let t = doc.tickets; - let all = {}; - let add = (id, data, category) => { - let clone = Util.clone(data); - clone.category = category; - all[id] = clone; - }; - [ "active", "pending", "closed" ].some((cat => { - let tickets = t[cat]; - return Object.keys(tickets).some((id => { - let ticket = tickets[id]; - let hasTag = !tags.length || (ticket.tags || []).some((tag => tags.includes(tag))); - if (!hasTag) { - return; - } - let id64 = Util.hexToBase64(id).slice(0, 10); - if (text === id64) { - all = {}; - add(id, ticket, cat); - return true; - } - let hasText = !text || ticket.title.toLowerCase().includes(text); - if (!hasText) { - return; - } - add(id, ticket, cat); - })); - })); - cb({ - tickets: all - }); - })); - }; - var setTagsAdmin = (ctx, data, cId, cb) => { - if (!ctx.adminRdyEvt) { - return void cb({ - error: "EFORBIDDEN" - }); - } - ctx.adminRdyEvt.reg((() => { - let doc = ctx.adminDoc.proxy; - let t = doc.tickets; - let chan = data.channel; - let ticket = t.active[chan] || t.pending[chan] || t.closed[chan]; - ticket.tags = data.tags || []; - Realtime.whenRealtimeSyncs(ctx.adminDoc.realtime, (function() { - let allTags = []; - [ "active", "pending", "closed" ].forEach((cat => { - let tickets = t[cat]; - Object.keys(tickets).forEach((id => { - let ticket = tickets[id]; - (ticket.tags || []).forEach((tag => { - if (!allTags.includes(tag)) { - allTags.push(tag); - } - })); - })); - })); - cb({ - done: true, - allTags - }); - })); - })); - }; - var filterTagsAdmin = (ctx, data, cId, cb) => { - if (!ctx.adminRdyEvt) { - return void cb({ - error: "EFORBIDDEN" - }); - } - let tags = data.tags || []; - ctx.adminRdyEvt.reg((() => { - let doc = ctx.adminDoc.proxy; - let t = doc.tickets; - if (!tags.length) { - return void cb({ - all: true - }); - } - let all = []; - [ "active", "pending", "closed" ].forEach((cat => { - let tickets = t[cat]; - Object.keys(tickets).forEach((id => { - let ticket = tickets[id]; - let hasTag = (ticket.tags || []).some((tag => tags.includes(tag))); - if (!hasTag) { - all.push(id); - } - })); - })); - cb({ - tickets: all - }); - })); - }; - var clearLegacy = function(ctx, data, cId, cb) { - let proxy = ctx.store.proxy; - ctx.store.mailbox.close("supportadmin", (function() { - delete proxy.mailboxes.supportadmin; - ctx.Store.onSync(null, (function() { - cb({ - done: true - }); - })); - })); - }; - var dumpLegacy = function(ctx, data, cId, cb) { - let proxy = ctx.store.proxy; - let _legacy = Util.find(proxy, [ "mailboxes", "supportadmin" ]); - if (!_legacy) { - return void cb({ - error: "ENOENT" - }); - } - let legacy = Util.clone(_legacy); - legacy.lastKnownHash = undefined; - legacy.viewed = []; - ctx.store.mailbox.open("supportadmin", legacy, (function(contentByHash) { - ctx.store.mailbox.close("supportadmin", (function() {})); - cb(contentByHash); - }), true, { - dump: true - }); - }; - let findLegacy = (ctx, author, title) => { - let doc = ctx.adminDoc.proxy; - return [ "active", "pending", "closed" ].some((k => { - let all = doc.tickets[k]; - return Object.keys(all).some((id => { - let ticket = all[id]; - return ticket.authorKey === author && ticket.title === title && ticket.restored; - })); - })); - }; - var getLegacy = function(ctx, data, cId, cb) { - let proxy = ctx.store.proxy; - let legacy = Util.find(proxy, [ "mailboxes", "supportadmin" ]); - if (!legacy) { - return void cb({ - error: "ENOENT" - }); - } - ctx.store.mailbox.open("supportadmin", legacy, (function(contentByHash) { - ctx.store.mailbox.close("supportadmin", (function() {})); - let c = Util.clone(contentByHash || {}); - let toFilter = []; - Object.keys(c).forEach((h => { - let msg = c[h]; - if (msg.type === "CLOSE") { - if (!toFilter.includes(msg.content.id)) { - toFilter.push(msg.content.id); - } - return; - } - let author = msg.author; - let title = msg.content && msg.content.title; - if (findLegacy(ctx, author, title)) { - if (!toFilter.includes(msg.content.id)) { - toFilter.push(msg.content.id); - } - } - })); - Object.keys(c).forEach((h => { - let msg = c[h]; - if (msg.content && toFilter.includes(msg.content.id)) { - delete c[h]; - } - })); - cb(c); - }), true, { - dump: true - }); - }; - var restoreLegacy = function(ctx, data, cId, cb) { - let proxy = ctx.store.proxy; - let legacy = Util.find(proxy, [ "mailboxes", "supportadmin" ]); - if (!legacy) { - return void cb({ - error: "ENOENT" - }); - } - if (!ctx.adminRdyEvt) { - return void cb({ - error: "EFORBIDDEN" - }); - } - let messages = data.messages; - let hashes = data.hashes; - let first = messages[0]; - let last = messages[messages.length - 1]; - if (!first) { - return void cb({ - error: "EINVAL" - }); - } - ctx.adminRdyEvt.reg((() => { - let ticketData = { - name: Util.find(first, [ "sender", "name" ]), - notifications: Util.find(first, [ "sender", "notifications" ]), - curvePublic: Util.find(first, [ "sender", "curvePublic" ]), - channel: Hash.createChannelId(), - title: first.title, - time: last.time, - ticket: { - legacy: true, - title: first.title, - sender: first.sender, - messages - } - }; - makeTicket(ctx, ticketData, true, (obj => { - if (obj && obj.error) { - return void cb(obj); - } - hashes.forEach((hash => { - legacy.viewed.push(hash); - })); - ctx.Store.onSync(null, (function() { - cb({ - done: true - }); - })); - })); - })); - }; - var addAdminTicket = function(ctx, data, cb) { - if (!ctx.adminRdyEvt) { - return void cb(true); - } - ctx.adminRdyEvt.reg((() => { - let supportKey; - nThen((waitFor => { - getKeys(ctx, true, data, waitFor(((err, obj) => { - if (err) { - waitFor.abort(); - return void cb(true); - } - supportKey = obj.supportKey; - }))); - })).nThen((() => { - var rdmTo = Math.floor(Math.random() * 2e3); - setTimeout((() => { - var doc = ctx.adminDoc.proxy; - if (doc.tickets.active[data.channel] || doc.tickets.closed[data.channel] || doc.tickets.pending[data.channel]) { - return void cb(true); - } - doc.tickets.active[data.channel] = { - title: data.title, - premium: data.premium, - time: data.time, - author: data.user && data.user.displayName, - supportKey: data.supportKey || supportKey, - authorKey: data.user && data.user.curvePublic - }; - Realtime.whenRealtimeSyncs(ctx.adminDoc.realtime, (function() { - cb(true); - })); - notifyClient(ctx, true, "NEW_TICKET", data.channel); - if (ctx.supportRpc) { - ctx.supportRpc.pin([ data.channel ], (() => {})); - } - }), rdmTo); - })); - })); - }; - var updateAdminTicket = function(ctx, data) { - if (!ctx.adminRdyEvt) { - return; - } - ctx.adminRdyEvt.reg((() => { - var rdmTo = Math.floor(Math.random() * 2e3); - setTimeout((() => { - var doc = ctx.adminDoc.proxy; - let t = doc.tickets.active[data.channel] || doc.tickets.pending[data.channel]; - if (!t) { - return; - } - if (data.time <= t.time) { - return; - } - if (data.isClose) { - doc.tickets.closed[data.channel] = t; - delete doc.tickets.active[data.channel]; - delete doc.tickets.pending[data.channel]; - } - t.time = data.time; - t.lastAdmin = false; - notifyClient(ctx, true, "UPDATE_TICKET", data.channel); - }), rdmTo); - })); - }; - var checkAdminTicket = function(ctx, data, cb) { - if (!ctx.adminRdyEvt) { - return void cb(true); - } - ctx.adminRdyEvt.reg((() => { - let doc = ctx.adminDoc.proxy; - let exists = doc.tickets.active[data.channel] || doc.tickets.pending[data.channel]; - cb(exists); - })); - }; - var addUserTicket = function(ctx, data, cb) { - if (!ctx.supportData) { - return void cb(true); - } - let channel = data.channel; - ctx.supportData[channel] = { - time: data.time, - title: data.title, - curvePublic: data.supportKey - }; - ctx.Store.onSync(null, (function() { - cb(true); - })); - }; - var updateUserTicket = function(ctx, data) { - notifyClient(ctx, false, "UPDATE_TICKET", data.channel); - if (data.isClose) { - let ticket = ctx.supportData[data.channel]; - if (!ticket) { - return; - } - ticket.closed = true; - } - }; - var updateAdminKey = (ctx, data, cb) => { - let newKey = data.supportKey; - let newKeyPub = Hash.getBoxPublicFromSecret(newKey); - let proxy = ctx.store.proxy; - const oldKey = Util.find(proxy, [ "mailboxes", "supportteam", "keys", "curvePrivate" ]); - const oldKeyPub = Util.find(proxy, [ "mailboxes", "supportteam", "keys", "curvePublic" ]); - getKeys(ctx, false, {}, ((err, obj) => { - if (err) { - return void cb(true); - } - if (newKeyPub !== obj.theirPublic) { - return void cb(true); - } - if (oldKey === newKey || oldKeyPub === newKeyPub) { - return void cb(true); - } - let mailbox = Util.find(ctx, [ "store", "mailbox" ]); - try { - if (ctx.adminDoc) { - ctx.adminDoc.stop(); - } - if (mailbox) { - mailbox.close("supportteam"); - } - if (ctx.supportRpc) { - ctx.supportRpc.destroy(); - } - ctx.adminRdyEvt = Util.mkEvent(true); - } catch (e) { - console.error(e); - } - ctx.Store.addAdminMailbox(null, { - version: 2, - priv: newKey - }, (obj => { - if (obj && obj.error) { - return void cb(true); - } - nThen((waitFor => { - initializeSupportAdmin(ctx, true, waitFor); - ctx.adminRdyEvt.reg((() => { - notifyClient(ctx, true, "UPDATE_RIGHTS"); - cb(false); - })); - })); - })); - })); - }; - let updateServerKey = (ctx, curvePublic, curvePrivate, cb) => { - let edPublic; - try { - let pair = Nacl.sign.keyPair.fromSeed(Nacl.util.decodeBase64(curvePrivate)); - edPublic = Nacl.util.encodeBase64(pair.publicKey); - } catch (e) { - return void cb(e); - } - ctx.Store.adminRpc(null, { - cmd: "ADMIN_DECREE", - data: [ "SET_SUPPORT_KEYS", [ curvePublic, edPublic ] ] - }, cb); - }; - let getModerators = (ctx, data, cId, cb) => { - ctx.Store.adminRpc(null, { - cmd: "GET_MODERATORS", - data: {} - }, cb); - }; - let rotateKeys = function(ctx, data, cId, _cb) { - let cb = Util.once(Util.mkAsync(_cb)); - let oldSupportKey; - let proxy = ctx.store.proxy; - let edPublic = proxy.edPublic; - const keyPair = Nacl.box.keyPair(); - const newKeyPub = Nacl.util.encodeBase64(keyPair.publicKey); - const newKey = Nacl.util.encodeBase64(keyPair.secretKey); - const oldKey = Util.find(proxy, [ "mailboxes", "supportteam", "keys", "curvePrivate" ]); - const oldKeyPub = Util.find(proxy, [ "mailboxes", "supportteam", "keys", "curvePublic" ]); - if (!newKey || !newKeyPub) { - return void cb({ - error: "INVALID_KEY" - }); - } - let oldAdminChan; - nThen((waitFor => { - getKeys(ctx, false, {}, waitFor(((err, obj) => { - if (err === "E_NOT_INIT") { - return; - } - if (err) { - cb({ - error: err - }); - return void waitFor.abort(); - } - oldSupportKey = obj.theirPublic; - }))); - })).nThen((waitFor => { - if (!ctx.adminKeys.includes(edPublic)) { - waitFor.abort(); - return void cb({ - error: "EFORBIDDEN" - }); - } - })).nThen((waitFor => { - if (!oldSupportKey) { - return; - } - if (!ctx.moderatorKeys.includes(edPublic)) { - waitFor.abort(); - return void cb({ - error: "EINVAL" - }); - } - if (oldKeyPub !== oldSupportKey) { - waitFor.abort(); - return void cb({ - error: "EFORBIDDEN" - }); - } - })).nThen((waitFor => { - if (!oldSupportKey) { - return; - } - ctx.adminRdyEvt.reg((() => { - let oldDoc = ctx.adminDoc.proxy; - oldAdminChan = ctx.adminDoc.metadata && ctx.adminDoc.metadata.channel; - let seed = newKey.slice(0, 24); - let hash = Hash.getEditHashFromKeys({ - version: 2, - type: "support", - keys: { - editKeyStr: seed - } - }); - let cfg = { - network: ctx.store.network, - initialState: "{}" - }; - var oldKeys = oldDoc.oldKeys = oldDoc.oldKeys || {}; - oldKeys[oldKeyPub] = { - curvePrivate: oldKey, - rotatedOn: +new Date, - rotatedBy: edPublic - }; - Crypt.put(hash, JSON.stringify(oldDoc), waitFor((err => { - if (err) { - waitFor.abort(); - return void cb({ - error: err - }); - } - })), cfg); - })); - })).nThen((waitFor => { - updateServerKey(ctx, newKeyPub, newKey, waitFor((obj => { - if (obj && obj.error) { - waitFor.abort(); - return void cb(obj); - } - }))); - })).nThen((() => { - if (!oldSupportKey) { - return; - } - if (ctx.adminDoc) { - ctx.adminDoc.stop(); - } - let mailbox = Util.find(ctx, [ "store", "mailbox" ]); - if (mailbox) { - mailbox.close("supportteam"); - } - if (ctx.supportRpc) { - ctx.supportRpc.destroy(); - } - ctx.adminRdyEvt = Util.mkEvent(true); - })).nThen((waitFor => { - ctx.Store.addAdminMailbox(null, { - version: 2, - priv: newKey - }, waitFor((obj => { - if (obj && obj.error) { - waitFor.abort(); - if (oldSupportKey) { - return updateServerKey(ctx, oldKeyPub, oldKey, (() => void cb(obj))); - } - return void cb(obj); - } - }))); - })).nThen((waitFor => { - if (!oldSupportKey) { - return; - } - let mailbox = Util.find(ctx, [ "store", "mailbox" ]); - getModerators(ctx, null, null, waitFor((obj => { - if (obj && obj.error) { - return void cb({ - success: true, - noNotify: true - }); - } - let all = obj && obj[0]; - Object.keys(all || {}).forEach((modEdPub => { - let modData = all[modEdPub]; - mailbox.sendTo("MODERATOR_NEW_KEY", { - supportKey: newKey - }, { - channel: modData.mailbox, - curvePublic: modData.curvePublic - }, (() => {})); - })); - }))); - })).nThen((waitFor => { - initializeSupportAdmin(ctx, true, waitFor); - })).nThen((waitFor => { - if (!oldAdminChan) { - return; - } - ctx.Store.adminRpc(null, { - cmd: "ARCHIVE_DOCUMENT", - data: { - id: oldAdminChan, - reason: "Deprecated support pad" - } - }, waitFor()); - })).nThen((() => { - cb({ - success: true - }); - })); - }; - let disableSupport = function(ctx, data, cId, _cb) { - let cb = Util.once(Util.mkAsync(_cb)); - let proxy = ctx.store.proxy; - let edPublic = proxy.edPublic; - let moderators; - nThen((waitFor => { - getKeys(ctx, false, {}, waitFor((err => { - if (err) { - cb({ - error: err - }); - return void waitFor.abort(); - } - }))); - })).nThen((waitFor => { - if (!ctx.adminKeys.includes(edPublic)) { - waitFor.abort(); - return void cb({ - error: "EFORBIDDEN" - }); - } - })).nThen((waitFor => { - ctx.Store.adminRpc(null, { - cmd: "ARCHIVE_SUPPORT", - data: {} - }, waitFor((obj => { - if (obj && obj.error) { - waitFor.abort(); - return void cb(obj); - } - }))); - })).nThen((waitFor => { - ctx.Store.adminRpc(null, { - cmd: "ADMIN_DECREE", - data: [ "SET_SUPPORT_KEYS", [ "", "" ] ] - }, waitFor((function(obj) { - if (obj && obj.error) { - waitFor.abort(); - return void cb(obj); - } - }))); - })).nThen((waitFor => { - getModerators(ctx, null, null, waitFor((obj => { - if (!obj || obj.error) { - waitFor.abort(); - return void cb(); - } - moderators = obj[0] || {}; - }))); - })).nThen((() => { - let n = nThen; - Object.keys(moderators).forEach((ed => { - n = n((waitFor => { - ctx.Store.adminRpc(null, { - cmd: "REMOVE_MODERATOR", - data: ed - }, waitFor((obj => { - if (obj && obj.error) { - console.error("Error removing moderator data", ed, obj.error); - } - }))); - })).nThen; - })); - n((() => { - cb(); - })); - })); - }; - var getAdminKey = function(ctx, data, cId, cb) { - let proxy = ctx.store.proxy; - let supportKey = Util.find(proxy, [ "mailboxes", "supportteam", "keys", "curvePublic" ]); - let privateKey = Util.find(proxy, [ "mailboxes", "supportteam", "keys", "curvePrivate" ]); - getKeys(ctx, false, {}, ((err, obj) => { - if (err) { - return void cb({ - error: err - }); - } - if (supportKey && obj.theirPublic !== supportKey) { - privateKey = undefined; - } - cb({ - curvePrivate: privateKey, - curvePublic: obj.theirPublic - }); - })); - }; - var addModerator = function(ctx, data, cId, cb) { - let proxy = ctx.store.proxy; - var mailbox = Util.find(ctx, [ "store", "mailbox" ]); - let supportKey = Util.find(proxy, [ "mailboxes", "supportteam", "keys", "curvePublic" ]); - let privateKey = Util.find(proxy, [ "mailboxes", "supportteam", "keys", "curvePrivate" ]); - let lastKnownHash = Util.find(proxy, [ "mailboxes", "supportteam", "lastKnownHash" ]); - let edPublic = proxy.edPublic; - getKeys(ctx, false, {}, ((err, obj) => { - if (err) { - return void cb({ - error: err - }); - } - if (obj.theirPublic !== supportKey) { - return void cb({ - error: "EFORBIDDEN" - }); - } - if (!ctx.moderatorKeys.includes(edPublic)) { - return void cb({ - error: "EFORBIDDEN" - }); - } - mailbox.sendTo("ADD_MODERATOR", { - supportKey: privateKey, - lastKnownHash - }, { - channel: data.mailbox, - curvePublic: data.curvePublic - }, (() => { - cb(); - })); - })); - }; - Support.init = function(cfg, waitFor, emit) { - var support = {}; - if (cfg.store && cfg.store.modules && cfg.store.modules["support"]) { - return cfg.store.modules["support"]; - } - var store = cfg.store; - var proxy = store.proxy.support = store.proxy.support || {}; - var ctx = { - moderatorKeys: ApiConfig.moderatorKeys, - adminKeys: ApiConfig.adminKeys, - supportData: proxy, - store: cfg.store, - Store: cfg.Store, - emit, - clients: {} - }; - if (Util.find(store, [ "proxy", "mailboxes", "supportteam" ])) { - initializeSupportAdmin(ctx, false, waitFor); - } - support.ctx = ctx; - support.removeClient = function(clientId) { - delete ctx.clients[clientId]; - }; - support.leavePad = function() {}; - support.addAdminTicket = function(content, cb) { - addAdminTicket(ctx, content, cb); - }; - support.updateAdminTicket = function(content) { - updateAdminTicket(ctx, content); - }; - support.updateAdminKey = function(content, cb) { - updateAdminKey(ctx, content, cb); - }; - support.checkAdminTicket = function(content, cb) { - checkAdminTicket(ctx, content, cb); - }; - support.addUserTicket = function(content, cb) { - addUserTicket(ctx, content, cb); - }; - support.updateUserTicket = function(content) { - updateUserTicket(ctx, content); - }; - support.execCommand = function(clientId, obj, cb) { - var cmd = obj.cmd; - var data = obj.data; - if (cmd === "MAKE_TICKET") { - return void makeMyTicket(ctx, data, clientId, cb); - } - if (cmd === "GET_MY_TICKETS") { - return void getMyTickets(ctx, data, clientId, cb); - } - if (cmd === "REPLY_TICKET") { - return void replyMyTicket(ctx, data, clientId, cb); - } - if (cmd === "CLOSE_TICKET") { - return void closeMyTicket(ctx, data, clientId, cb); - } - if (cmd === "DELETE_TICKET") { - return void deleteMyTicket(ctx, data, clientId, cb); - } - if (cmd === "MAKE_TICKET_ADMIN") { - return void makeTicketAdmin(ctx, data, clientId, cb); - } - if (cmd === "LIST_TICKETS_ADMIN") { - return void listTicketsAdmin(ctx, data, clientId, cb); - } - if (cmd === "LOAD_TICKET_ADMIN") { - return void loadTicketAdmin(ctx, data, clientId, cb); - } - if (cmd === "REPLY_TICKET_ADMIN") { - return void replyTicketAdmin(ctx, data, clientId, cb); - } - if (cmd === "CLOSE_TICKET_ADMIN") { - return void closeTicketAdmin(ctx, data, clientId, cb); - } - if (cmd === "MOVE_TICKET_ADMIN") { - return void moveTicketAdmin(ctx, data, clientId, cb); - } - if (cmd === "GET_RECORDED") { - return void getRecorded(ctx, data, clientId, cb); - } - if (cmd === "SET_RECORDED") { - return void setRecorded(ctx, data, clientId, cb); - } - if (cmd === "USE_RECORDED") { - return void useRecorded(ctx, data, clientId, cb); - } - if (cmd === "SEARCH_ADMIN") { - return void searchAdmin(ctx, data, clientId, cb); - } - if (cmd === "FILTER_TAGS_ADMIN") { - return void filterTagsAdmin(ctx, data, clientId, cb); - } - if (cmd === "SET_TAGS_ADMIN") { - return void setTagsAdmin(ctx, data, clientId, cb); - } - if (cmd === "GET_LEGACY") { - return void getLegacy(ctx, data, clientId, cb); - } - if (cmd === "DUMP_LEGACY") { - return void dumpLegacy(ctx, data, clientId, cb); - } - if (cmd === "CLEAR_LEGACY") { - return void clearLegacy(ctx, data, clientId, cb); - } - if (cmd === "RESTORE_LEGACY") { - return void restoreLegacy(ctx, data, clientId, cb); - } - if (cmd === "GET_PRIVATE_KEY") { - return void getAdminKey(ctx, data, clientId, cb); - } - if (cmd === "DISABLE_SUPPORT") { - return void disableSupport(ctx, data, clientId, cb); - } - if (cmd === "ROTATE_KEYS") { - return void rotateKeys(ctx, data, clientId, cb); - } - if (cmd === "ADD_MODERATOR") { - return void addModerator(ctx, data, clientId, cb); - } - cb({ - error: "NOT_SUPPORTED" - }); - }; - return support; - }; - return Support; - }; - if (module.exports) { - module.exports = factory(undefined, requireCommonUtil(), requireCommonHash(), requireCommonRealtime(), requirePinpad(), requireCryptget(), requireNthen(), requireCrypto(), requireChainpadListmap(), requireChainpad_dist(), requireChainpadNetflux()); - } - })(); - })(support$1); - return support$1.exports; - } - var integration = { - exports: {} - }; - var hasRequiredIntegration; - function requireIntegration() { - if (hasRequiredIntegration) return integration.exports; - hasRequiredIntegration = 1; - (function(module) { - (() => { - const factory = Crypto => { - var Integration = {}; - var convertToUint8 = function(obj) { - var l = Object.keys(obj).length; - var u = new Uint8Array(l); - for (var i = 0; i < l; i++) { - u[i] = obj[i]; - } - return u; - }; - var sendMsg = function(ctx, data, client, cb) { - var c = ctx.clients[client]; - if (!c) { - return void cb({ - error: "NO_CLIENT" - }); - } - var chan = ctx.channels[c.channel]; - if (!chan) { - return void cb({ - error: "NO_CHAN" - }); - } - var obj = { - id: client, - msg: data.msg, - uid: data.uid - }; - chan.sendMsg(JSON.stringify(obj), cb); - ctx.emit("MESSAGE", obj, chan.clients.filter((function(cl) { - return cl !== client; - }))); - }; - var initIntegration = function(ctx, obj, client, cb) { - var channel = obj.channel; - var secret = obj.secret; - if (secret.keys.cryptKey) { - secret.keys.cryptKey = convertToUint8(secret.keys.cryptKey); - } - var padChan = secret.channel; - var network = ctx.store.network; - var first = true; - var c = ctx.clients[client]; - if (!c) { - c = ctx.clients[client] = { - channel - }; - } else { - return void cb(); - } - var chan = ctx.channels[channel]; - if (chan) { - if (!c.id) { - c.id = chan.wc.myID + "-" + client; - } - chan.clients.push(client); - return void cb(); - } - var onOpen = function(wc) { - ctx.channels[channel] = ctx.channels[channel] || {}; - var chan = ctx.channels[channel]; - chan.padChan = padChan; - if (!c.id) { - c.id = wc.myID + "-" + client; - } - if (chan.clients) { - chan.clients.forEach((function(cl) { - if (ctx.clients[cl] && !ctx.clients[cl].id) { - ctx.clients[cl].id = wc.myID + "-" + cl; - } - })); - } - if (!chan.encryptor) { - chan.encryptor = Crypto.createEncryptor(secret.keys); - } - wc.on("message", (function(cryptMsg) { - var msg = chan.encryptor.decrypt(cryptMsg, secret.keys && secret.keys.validateKey); - var parsed; - try { - parsed = JSON.parse(msg); - ctx.emit("MESSAGE", parsed, chan.clients); - } catch (e) { - console.error(e); - } - })); - chan.wc = wc; - chan.sendMsg = function(msg, cb) { - cb = cb || function() {}; - var cmsg = chan.encryptor.encrypt(msg); - wc.bcast(cmsg).then((function() { - cb(); - }), (function(err) { - cb({ - error: err - }); - })); - }; - if (!first) { - return; - } - chan.clients = [ client ]; - first = false; - cb(); - }; - network.join(channel).then(onOpen, (function(err) { - return void cb({ - error: err - }); - })); - var onReconnect = function() { - if (!ctx.channels[channel]) { - console.log("cant reconnect", channel); - return; - } - network.join(channel).then(onOpen, (function(err) { - console.error(err); - })); - }; - ctx.channels[channel] = ctx.channels[channel] || {}; - ctx.channels[channel].onReconnect = onReconnect; - network.on("reconnect", onReconnect); - }; - var leaveChannel = function(ctx, padChan) { - Object.keys(ctx.channels).some((function(cursorChan) { - var channel = ctx.channels[cursorChan]; - if (channel.padChan !== padChan) { - return; - } - if (channel.wc) { - channel.wc.leave(); - } - if (channel.onReconnect) { - var network = ctx.store.network; - network.off("reconnect", channel.onReconnect); - } - delete ctx.channels[cursorChan]; - return true; - })); - }; - var removeClient = function(ctx, clientId) { - var filter = function(c) { - return c !== clientId; - }; - var chan; - for (var k in ctx.channels) { - chan = ctx.channels[k]; - chan.clients = chan.clients.filter(filter); - if (chan.clients.length === 0) { - if (chan.wc) { - chan.wc.leave(); - } - if (chan.onReconnect) { - var network = ctx.store.network; - network.off("reconnect", chan.onReconnect); - } - delete ctx.channels[k]; - } - } - delete ctx.clients[clientId]; - }; - Integration.init = function(cfg, waitFor, emit) { - var integration = {}; - if (cfg.store && cfg.store.modules && cfg.store.modules["integration"]) { - return cfg.store.modules["integration"]; - } - var ctx = { - store: cfg.store, - emit, - channels: {}, - clients: {} - }; - integration.removeClient = function(clientId) { - removeClient(ctx, clientId); - }; - integration.leavePad = function(padChan) { - leaveChannel(ctx, padChan); - }; - integration.execCommand = function(clientId, obj, cb) { - var cmd = obj.cmd; - var data = obj.data; - if (cmd === "INIT") { - return void initIntegration(ctx, data, clientId, cb); - } - if (cmd === "SEND") { - return void sendMsg(ctx, data, clientId, cb); - } - }; - return integration; - }; - return Integration; - }; - if (module.exports) { - module.exports = factory(requireCrypto()); - } - })(); - })(integration); - return integration.exports; - } - var onlyoffice = { - exports: {} - }; - var hasRequiredOnlyoffice; - function requireOnlyoffice() { - if (hasRequiredOnlyoffice) return onlyoffice.exports; - hasRequiredOnlyoffice = 1; - (function(module) { - (() => { - const factory = () => { - var OO = {}; - var getHistory = function(ctx, client, cb) { - var c = ctx.clients[client]; - if (!c) { - return void cb({ - error: "ENOENT" - }); - } - var chan = ctx.channels[c.channel]; - if (!chan) { - return void cb({ - error: "ENOCHAN" - }); - } - cb(); - chan.history.forEach((function(msg) { - ctx.emit("MESSAGE", { - msg, - validateKey: chan.validateKey - }, [ client ]); - })); - ctx.emit("HISTORY_SYNCED", {}, [ client ]); - }; - var openChannel = function(ctx, obj, client, cb) { - var channel = obj.channel; - var padChan = obj.padChan; - var network = ctx.store.network; - var first = true; - var c = ctx.clients[client]; - if (!c) { - c = ctx.clients[client] = { - channel - }; - } else { - return void cb(); - } - var chan = ctx.channels[channel]; - if (chan) { - if (!c.id) { - c.id = chan.wc.myID + "-" + client; - } - getHistory(ctx, client, (function() { - ctx.emit("READY", chan.clients, [ client ]); - })); - chan.clients.push(client); - return void cb(); - } - var txid = Math.floor(Math.random() * 1e6); - var onOpen = function(wc) { - ctx.channels[channel] = ctx.channels[channel] || { - history: [], - validateKey: obj.validateKey - }; - chan = ctx.channels[channel]; - chan.padChan = padChan; - if (!c.id) { - c.id = wc.myID + "-" + client; - } - if (chan.clients) { - chan.clients.forEach((function(cl) { - if (ctx.clients[cl]) { - ctx.clients[cl].id = wc.myID + "-" + cl; - } - })); - } - wc.on("join", (function() {})); - wc.on("leave", (function() {})); - wc.on("message", (function(msg) { - chan.history.push(msg); - ctx.emit("MESSAGE", { - msg, - validateKey: chan.validateKey - }, chan.clients); - })); - chan.wc = wc; - chan.sendMsg = function(msg, cb) { - cb = cb || function() {}; - var hash = msg.slice(0, 64); - wc.bcast(msg).then((function() { - chan.history.push(msg); - chan.lastKnownHash = hash; - cb(); - }), (function(err) { - cb({ - error: err - }); - })); - }; - if (first) { - chan.clients = [ client ]; - chan.lastCpHash = obj.lastCpHash; - first = false; - cb(); - } - var hk = network.historyKeeper; - var cfg = { - txid, - lastKnownHash: chan.lastKnownHash || chan.lastCpHash, - metadata: { - validateKey: obj.validateKey, - owners: obj.owners, - expire: obj.expire - } - }; - var msg = [ "GET_HISTORY", wc.id, cfg ]; - if (hk) { - network.sendto(hk, JSON.stringify(msg)).then((function() {}), (function(err) { - console.error(err); - })); - } - }; - network.on("message", (function(msg, sender) { - if (!ctx.channels[channel]) { - return; - } - var hk = network.historyKeeper; - if (sender !== hk) { - return; - } - var parsed; - try { - parsed = JSON.parse(msg); - } catch (e) {} - if (!parsed) { - return; - } - if (parsed.txid && parsed.txid !== txid) { - return; - } - if (parsed.channel && parsed.channel !== channel) { - return; - } - if (parsed.validateKey && parsed.channel) { - if (!chan.validateKey) { - chan.validateKey = parsed.validateKey; - } - return; - } - if (parsed.state && parsed.state === 1 && parsed.channel) { - ctx.emit("READY", chan.clients, chan.clients); - return; - } - if (parsed.error && parsed.channel) { - return; - } - if (Array.isArray(parsed) && parsed[0] && parsed[0] !== txid) { - return; - } - msg = parsed[4]; - if (parsed[3] !== channel) { - return; - } - var hash = msg.slice(0, 64); - if (hash === chan.lastKnownHash || hash === chan.lastCpHash) { - return; - } - chan.lastKnownHash = hash; - ctx.emit("MESSAGE", { - msg - }, chan.clients); - chan.history.push(msg); - })); - network.join(channel).then(onOpen, (function(err) { - return void cb({ - error: err - }); - })); - network.on("reconnect", (function() { - if (!ctx.channels[channel]) { - return; - } - network.join(channel).then(onOpen, (function(err) { - console.error(err); - })); - })); - }; - var updateHash = function(ctx, data, clientId, cb) { - var c = ctx.clients[clientId]; - if (!c) { - return void cb({ - error: "NOT_IN_CHANNEL" - }); - } - var chan = ctx.channels[c.channel]; - if (!chan) { - return void cb({ - error: "INVALID_CHANNEL" - }); - } - var hash = data; - var index = -1; - chan.history.some((function(msg, idx) { - if (msg.slice(0, 64) === hash) { - index = idx + 1; - return true; - } - })); - if (index !== -1) { - chan.history = chan.history.slice(index); - } - cb(); - }; - var sendMessage = function(ctx, data, clientId, cb) { - var c = ctx.clients[clientId]; - if (!c) { - return void cb({ - error: "NOT_IN_CHANNEL" - }); - } - var chan = ctx.channels[c.channel]; - if (!chan) { - return void cb({ - error: "INVALID_CHANNEL" - }); - } - var _cb = function(obj) { - if (obj && obj.error) { - return void cb(obj); - } - ctx.emit("MESSAGE", { - msg: data.msg - }, chan.clients.filter((function(cl) { - return cl !== clientId; - }))); - cb(); - }; - if (data.isCp) { - return void chan.sendMsg(data.isCp, _cb); - } - chan.sendMsg(data.msg, _cb); - }; - var reencrypt = function(ctx, data, cId, cb) { - var channel = data.channel; - var network = ctx.store.network; - var onOpen = function(wc) { - var hk = network.historyKeeper; - var cfg = { - metadata: data.metadata - }; - var msg = [ "GET_HISTORY", wc.id, cfg ]; - network.sendto(hk, JSON.stringify(msg)); - data.msgs.forEach((function(msg) { - wc.bcast(msg); - })); - wc.leave(); - cb(); - }; - ctx.store.anon_rpc.send("IS_NEW_CHANNEL", channel, (function(e, response) { - if (e) { - return void cb({ - error: e - }); - } - var isNew; - if (response && response.length && typeof response[0] === "object") { - isNew = response[0].isNew; - } else { - cb({ - error: "INVALID_RESPONSE" - }); - } - if (!isNew) { - return void cb({ - error: "EEXISTS" - }); - } - network.join(channel).then(onOpen, (function(err) { - return void cb({ - error: err - }); - })); - })); - }; - var leaveChannel = function(ctx, padChan) { - Object.keys(ctx.channels).some((function(ooChan) { - var channel = ctx.channels[ooChan]; - if (channel.padChan !== padChan) { - return; - } - if (channel.wc) { - channel.wc.leave(); - } - delete ctx.channels[ooChan]; - return true; - })); - }; - var removeClient = function(ctx, clientId) { - var filter = function(c) { - return c !== clientId; - }; - var chan; - for (var k in ctx.channels) { - chan = ctx.channels[k]; - chan.clients = chan.clients.filter(filter); - if (chan.clients.length === 0) { - if (chan.wc) { - chan.wc.leave(); - } - delete ctx.channels[k]; - } - } - if (ctx.clients[clientId]) { - var oldChannel = ctx.clients[clientId].channel; - var oldChan = ctx.channels[oldChannel]; - if (oldChan) { - ctx.emit("LEAVE", { - id: clientId - }, [ oldChan.clients[0] ]); - } - delete ctx.clients[clientId]; - } - }; - OO.init = function(store, emit) { - var oo = {}; - var ctx = { - store, - emit, - channels: {}, - clients: {} - }; - oo.removeClient = function(clientId) { - removeClient(ctx, clientId); - }; - oo.leavePad = function(padChan) { - leaveChannel(ctx, padChan); - }; - oo.execCommand = function(clientId, obj, cb) { - var cmd = obj.cmd; - var data = obj.data; - if (cmd === "SEND_MESSAGE") { - return void sendMessage(ctx, data, clientId, cb); - } - if (cmd === "UPDATE_HASH") { - return void updateHash(ctx, data, clientId, cb); - } - if (cmd === "OPEN_CHANNEL") { - return void openChannel(ctx, data, clientId, cb); - } - if (cmd === "GET_HISTORY") { - return void getHistory(ctx, clientId, cb); - } - if (cmd === "REENCRYPT") { - return void reencrypt(ctx, data, clientId, cb); - } - }; - return oo; - }; - return OO; - }; - if (module.exports) { - module.exports = factory(); - } - })(); - })(onlyoffice); - return onlyoffice.exports; - } - var profile = { - exports: {} - }; - var hasRequiredProfile; - function requireProfile() { - if (hasRequiredProfile) return profile.exports; - hasRequiredProfile = 1; - (function(module) { - (() => { - const factory = (Util, Hash, Constants, Realtime, Listmap, Crypto, ChainPad) => { - var Profile = {}; - var initializeProfile = function(ctx, cb) { - var profile = ctx.profile; - if (!profile.edit || !profile.view) { - var hash = Hash.createRandomHash("profile"); - var secret = Hash.getSecrets("profile", hash); - ctx.pinPads([ secret.channel ], (function(res) { - if (res.error) { - return void cb(res.error); - } - profile.edit = Hash.getEditHashFromKeys(secret); - profile.view = Hash.getViewHashFromKeys(secret); - setTimeout(cb); - })); - return; - } - setTimeout(cb); - }; - var openChannel = function(ctx) { - var profile = ctx.profile; - var secret = Hash.getSecrets("profile", profile.edit); - var crypto = Crypto.createEncryptor(secret.keys); - var cfg = { - data: {}, - network: ctx.store.network, - channel: secret.channel, - crypto, - owners: [ ctx.store.proxy.edPublic ], - ChainPad, - validateKey: secret.keys.validateKey || undefined, - userName: "profile", - classic: true - }; - var lm = Listmap.create(cfg); - lm.proxy.on("create", (function() {})).on("ready", (function() { - lm.proxy.name = ctx.store.proxy[Constants.displayNameKey] || ""; - ctx.listmap = lm; - if (!lm.proxy.curvePublic) { - lm.proxy.curvePublic = ctx.store.proxy.curvePublic; - } - if (!lm.proxy.notifications) { - lm.proxy.notifications = Util.find(ctx.store.proxy, [ "mailboxes", "notifications", "channel" ]); - } - if (!lm.proxy.edPublic) { - lm.proxy.edPublic = ctx.store.proxy.edPublic; - } - if (ctx.onReadyHandlers.length) { - ctx.onReadyHandlers.forEach((function(f) { - try { - f(lm.proxy); - } catch (e) { - console.error(e); - } - })); - ctx.onReadyHandlers = []; - } - })).on("change", [], (function() { - ctx.emit("UPDATE", lm.proxy, ctx.clients); - })); - }; - var setName = function(ctx, value) { - ctx.listmap.proxy.name = value; - Realtime.whenRealtimeSyncs(ctx.listmap.realtime, (function() { - if (!ctx.listmap) { - return; - } - ctx.emit("UPDATE", ctx.listmap.proxy, ctx.clients); - })); - }; - var subscribe = function(ctx, data, cId, cb) { - var idx = ctx.clients.indexOf(cId); - if (idx === -1) { - ctx.clients.push(cId); - } - if (ctx.listmap) { - return void cb(ctx.listmap.proxy); - } - ctx.onReadyHandlers.push((function(proxy) { - cb(proxy); - })); - }; - var setValue = function(ctx, data, cId, cb) { - var key = data.key; - var value = data.value; - if (!key) { - return; - } - ctx.listmap.proxy[key] = value; - Realtime.whenRealtimeSyncs(ctx.listmap.realtime, (function() { - ctx.emit("UPDATE", ctx.listmap.proxy, ctx.clients.filter((function(clientId) { - return clientId !== cId; - }))); - cb(ctx.listmap.proxy); - })); - }; - var removeClient = function(ctx, cId) { - var idx = ctx.clients.indexOf(cId); - if (idx !== -1) { - ctx.clients.splice(idx, 1); - } - }; - Profile.init = function(cfg, waitFor, emit) { - var profile = {}; - var store = cfg.store; - if (!store.loggedIn || !store.proxy.edPublic) { - return; - } - var ctx = { - store, - pinPads: cfg.pinPads, - updateMetadata: cfg.updateMetadata, - emit, - onReadyHandlers: [], - clients: [] - }; - ctx.profile = store.proxy.profile = store.proxy.profile || {}; - initializeProfile(ctx, waitFor((function(err) { - if (err) { - return; - } - openChannel(ctx); - }))); - profile.setName = function(value) { - setName(ctx, value); - }; - profile.removeClient = function(clientId) { - removeClient(ctx, clientId); - }; - profile.update = function() { - if (!ctx.listmap) { - return; - } - ctx.emit("UPDATE", ctx.listmap.proxy, ctx.clients); - }; - profile.execCommand = function(clientId, obj, cb) { - console.log(obj); - var cmd = obj.cmd; - var data = obj.data; - if (cmd === "SUBSCRIBE") { - return void subscribe(ctx, data, clientId, cb); - } - if (cmd === "SET") { - return void setValue(ctx, data, clientId, cb); - } - }; - return profile; - }; - return Profile; - }; - if (module.exports) { - module.exports = factory(requireCommonUtil(), requireCommonHash(), requireCommonConstants(), requireCommonRealtime(), requireChainpadListmap(), requireCrypto(), requireChainpad_dist()); - } - })(); - })(profile); - return profile.exports; - } - var team = { - exports: {} - }; - var roster = { - exports: {} - }; - var hasRequiredRoster; - function requireRoster() { - if (hasRequiredRoster) return roster.exports; - hasRequiredRoster = 1; - (function(module) { - (function() { - var factory = function(Util, Hash, CPNetflux, Sortify, nThen, Crypto, Feedback) { - var Roster = {}; - var CHECKPOINT_INTERVAL = 25; - var TIMEOUT_INTERVAL = 3e4; - var isMap = function(obj) { - return Boolean(obj && typeof obj === "object" && !Array.isArray(obj)); - }; - var getMessageId = function(msgString) { - return msgString.slice(0, 64); - }; - var canCheckpoint = function(author, members) { - var role = Util.find(members, [ author, "role" ]); - return [ "OWNER", "ADMIN" ].indexOf(role) !== -1; - }; - var isValidRole = function(role) { - return [ "OWNER", "ADMIN", "MEMBER", "VIEWER" ].indexOf(role) !== -1; - }; - var isSelfDowngrade = function(author, curve, role, state) { - var selfDescribe = author === curve && state[curve]; - if (!selfDescribe) { - return false; - } - var authorRole = Util.find(state, [ author, "role" ]); - if (authorRole === "MEMBER") { - return role === "VIEWER"; - } - }; - var canAddRole = function(author, role, members) { - var authorRole = Util.find(members, [ author, "role" ]); - if (!authorRole) { - return false; - } - if (!isValidRole(role)) { - return false; - } - if (authorRole === "OWNER") { - return true; - } - if (authorRole === "ADMIN") { - return [ "ADMIN", "MEMBER", "VIEWER" ].indexOf(role) !== -1; - } - return false; - }; - var isValidId = function(id) { - return typeof id === "string" && id.length === 44; - }; - var canDescribeTarget = function(author, curve, state) { - if (!state[curve]) { - return false; - } - if (author === curve && state[curve]) { - return true; - } - var authorRole = Util.find(state, [ author, "role" ]); - var targetRole = Util.find(state, [ curve, "role" ]); - if (!authorRole) { - return false; - } - if (authorRole === "OWNER") { - return true; - } - if (authorRole === "ADMIN" && targetRole !== "OWNER") { - return true; - } - return false; - }; - var canRemoveRole = function(author, role, members) { - var authorRole = Util.find(members, [ author, "role" ]); - if (!authorRole) { - return false; - } - if (authorRole === "OWNER") { - return true; - } - if (authorRole === "ADMIN") { - return [ "ADMIN", "MEMBER", "VIEWER" ].indexOf(role) !== -1; - } - return false; - }; - var canUpdateMetadata = function(author, members) { - var authorRole = Util.find(members, [ author, "role" ]); - return Boolean(authorRole && [ "OWNER", "ADMIN" ].indexOf(authorRole) !== -1); - }; - var shouldCheckpoint = function(me, ref) { - if (!canCheckpoint(me, ref.state.members)) { - return false; - } - var since = ref.internal.sinceLastCheckpoint; - if (!since || typeof since !== "number" || since < CHECKPOINT_INTERVAL) { - return false; - } - return true; - }; - var commands = Roster.commands = {}; - commands.ADD = function(args, author, roster) { - if (!isMap(args)) { - throw new Error("INVALID ARGS"); - } - if (!roster.internal.initialized) { - throw new Error("UNITIALIZED"); - } - if (typeof roster.state.members === "undefined") { - throw new Error("CANNOT_ADD_TO_UNITIALIZED_ROSTER"); - } - var members = roster.state.members; - Object.keys(args).forEach((function(curve) { - if (!isValidId(curve)) { - console.log(curve, curve.length); - throw new Error("INVALID_CURVE_KEY"); - } - if (!isMap(args[curve])) { - throw new Error("INVALID_CONTENT"); - } - if (members[curve]) { - throw new Error("ALREADY_PRESENT"); - } - var data = args[curve]; - if (typeof data.role !== "string") { - data.role = "MEMBER"; - } - if (!canAddRole(author, data.role, members)) { - throw new Error("INSUFFICIENT_PERMISSIONS"); - } - if (typeof data.displayName !== "string") { - throw new Error("DISPLAYNAME_REQUIRED"); - } - if (typeof data.notifications !== "string") { - throw new Error("NOTIFICATIONS_REQUIRED"); - } - })); - var changed = false; - Object.keys(args).forEach((function(curve) { - changed = true; - members[curve] = args[curve]; - })); - return changed; - }; - commands.RM = function(args, author, roster) { - if (!Array.isArray(args)) { - throw new Error("INVALID_ARGS"); - } - if (typeof roster.state.members === "undefined") { - throw new Error("CANNOT_RM_FROM_UNITIALIZED_ROSTER"); - } - var members = roster.state.members; - args.forEach((function(curve) { - if (!isValidId(curve)) { - throw new Error("INVALID_CURVE_KEY"); - } - if (curve === author) { - return; - } - var role = members[curve].role; - if (!canRemoveRole(author, role, members)) { - throw new Error("INSUFFICIENT_PERMISSIONS"); - } - })); - var changed = false; - args.forEach((function(curve) { - if (!members[curve]) { - return; - } - changed = true; - delete members[curve]; - })); - return changed; - }; - commands.DESCRIBE = function(args, author, roster) { - if (!args || typeof args !== "object" || Array.isArray(args)) { - throw new Error("INVALID_ARGUMENTS"); - } - if (typeof roster.state.members === "undefined") { - throw new Error("NOT_READY"); - } - var members = roster.state.members; - Object.keys(args).forEach((function(curve) { - if (!isValidId(curve)) { - throw new Error("INVALID_ID"); - } - if (!members[curve]) { - throw new Error("NOT_PRESENT"); - } - if (!canDescribeTarget(author, curve, members)) { - throw new Error("INSUFFICIENT_PERMISSIONS"); - } - var data = args[curve]; - if (!isMap(data)) { - throw new Error("INVALID_ARGUMENTS"); - } - var current = Util.clone(members[curve]); - if (typeof data.role === "string") { - if (!isSelfDowngrade(author, curve, data.role, members) && !canAddRole(author, data.role, members)) { - throw new Error("INSUFFICIENT_PERMISSIONS"); - } - } - if (typeof current.displayName !== "string" && typeof data.displayName !== "string") { - throw new Error("DISPLAYNAME_REQUIRED"); - } - if ([ "undefined", "string" ].indexOf(typeof data.displayName) === -1) { - throw new Error("INVALID_DISPLAYNAME"); - } - if (typeof current.notifications !== "string" && typeof data.notifications !== "string") { - throw new Error("NOTIFICATIONS_REQUIRED"); - } - if ([ "undefined", "string" ].indexOf(typeof data.notifications) === -1) { - throw new Error("INVALID_NOTIFICATIONS"); - } - })); - var changed = false; - Object.keys(args).forEach((function(curve) { - var current = Util.clone(members[curve]); - var data = args[curve]; - Object.keys(data).forEach((function(key) { - if (typeof current[key] !== "undefined" && data[key] === null) { - return void delete current[key]; - } - current[key] = data[key]; - })); - if (Sortify(current) !== Sortify(members[curve])) { - changed = true; - members[curve] = current; - } - })); - return changed; - }; - commands.CHECKPOINT = function(args, author, roster) { - if (!isMap(args)) { - throw new Error("INVALID_CHECKPOINT_STATE"); - } - if (!roster.internal.initialized) { - roster.state = args; - var metadata = roster.state.metadata = roster.state.metadata || {}; - metadata.topic = metadata.topic || ""; - metadata.name = metadata.name || ""; - metadata.avatar = metadata.avatar || ""; - roster.internal.initialized = true; - return true; - } else if (Sortify(args) !== Sortify(roster.state)) { - throw new Error("CHECKPOINT_DOES_NOT_MATCH_PREVIOUS_STATE"); - } - if (!canCheckpoint(author, roster.state.members)) { - throw new Error("INSUFFICIENT_PERMISSIONS"); - } - roster.state = args; - return true; - }; - var MANDATORY_METADATA_FIELDS = [ "avatar", "name", "topic" ]; - commands.METADATA = function(args, author, roster) { - if (!isMap(args)) { - throw new Error("INVALID_ARGS"); - } - if (!canUpdateMetadata(author, roster.state.members)) { - throw new Error("INSUFFICIENT_PERMISSIONS"); - } - Object.keys(args).forEach((function(k) { - if (args[k] === null) { - if (MANDATORY_METADATA_FIELDS.indexOf(k) === -1) { - return; - } - throw new Error("CANNOT_REMOVE_MANDATORY_METADATA"); - } - if (typeof args[k] !== "string") { - throw new Error("INVALID_ARGUMENTS"); - } - })); - var changed = false; - Object.keys(args).forEach((function(k) { - if (typeof roster.state.metadata[k] !== "undefined" && args[k] === null) { - changed = true; - delete roster.state.metadata[k]; - } - if (args[k] === roster.state.metadata[k]) { - return; - } - changed = true; - roster.state.metadata[k] = args[k]; - })); - return changed; - }; - commands.INVITE = function(args, author, roster) { - if (!isMap(args)) { - throw new Error("INVALID_ARGS"); - } - if (!roster.internal.initialized) { - throw new Error("UNINITIALIED"); - } - if (typeof roster.state.members === "undefined") { - throw new Error("CANNOT+INVITE_TO_UNINITIALIED_ROSTER"); - } - var members = roster.state.members; - Object.keys(args).forEach((function(curve) { - if (!isValidId(curve)) { - console.log(curve, curve.length); - throw new Error("INVALID_CURVE_KEY"); - } - if (!isMap(args[curve])) { - throw new Error("INVALID_CONTENT"); - } - if (members[curve]) { - throw new Error("ARLEADY_PRESENT"); - } - var data = args[curve]; - if (typeof data.role !== "string") { - data.role = "VIEWER"; - } - if (typeof data.pending === "undefined") { - data.pending = true; - } - if (!canAddRole(author, data.role, members)) { - throw new Error("INSUFFICIENT_PERMISSIONS"); - } - if (typeof data.displayName !== "string" || !data.displayName) { - throw new Error("DISPLAYNAME_REQUIRED"); - } - })); - var changed = false; - Object.keys(args).forEach((function(curve) { - changed = true; - members[curve] = args[curve]; - })); - return changed; - }; - commands.ACCEPT = function(args, author, roster) { - if (!roster.internal.initialized) { - throw new Error("UNINITIALIED"); - } - if (typeof roster.state.members === "undefined") { - throw new Error("CANNOT_ADD_TO_UNINITIALIED_ROSTER"); - } - var members = roster.state.members; - if (!isMap(members[author])) { - throw new Error("INSUFFICIENT_PERMISSIONS"); - } - if (!members[author].pending) { - throw new Error("ALREADY_PRESENT"); - } - if (typeof args !== "string") { - throw new Error("INVALID_ARGS"); - } - if (!isValidId(args)) { - throw new Error("INVALID_CURVE_KEY"); - } - var curve = args; - if (typeof members[curve] !== "undefined") { - throw new Error("MEMBER_ALREADY_PRESENT"); - } - var clone = Util.clone(members[author]); - delete clone.remaining; - delete clone.totalUses; - delete clone.inviteChannel; - delete clone.previewChannel; - members[curve] = clone; - var remaining = members[author].remaining || 1; - if (remaining === -1) { - return true; - } - if (remaining > 1) { - members[author].remaining = remaining - 1; - } else { - delete members[author]; - } - return true; - }; - var handleCommand = function(content, author, roster) { - if (!(Array.isArray(content) && typeof author === "string")) { - throw new Error("INVALID ARGUMENTS"); - } - var command = content[0]; - if (typeof commands[command] !== "function") { - throw new Error("INVALID_COMMAND"); - } - return commands[command](content[1], author, roster); - }; - var simulate = function(content, author, roster) { - return handleCommand(content, author, Util.clone(roster)); - }; - Roster.create = function(config, _cb) { - if (typeof _cb !== "function") { - throw new Error("EXPECTED_CALLBACK"); - } - var cb = Util.once(Util.mkAsync(_cb)); - if (!config.network) { - return void cb("EXPECTED_NETWORK"); - } - if (!config.channel || typeof config.channel !== "string" || config.channel.length !== 32) { - return void cb("EXPECTED_CHANNEL"); - } - if (!config.keys || typeof config.keys !== "object") { - return void cb("EXPECTED_CRYPTO_KEYS"); - } - if (!config.store) { - return void cb("EXPECTED_STORE"); - } - var response = Util.response((function(label, info) { - console.error("ROSTER_RESPONSE__" + label, info); - })); - var store = config.store; - var keys = config.keys; - var me = keys.myCurvePublic; - var channel = config.channel; - var lastKnownHash = config.lastKnownHash || -1; - if (config.newTeam) { - lastKnownHash = undefined; - } - var ref = { - state: { - members: {}, - metadata: {} - }, - internal: { - initialized: false, - sinceLastCheckpoint: 0, - lastCheckpointHash: lastKnownHash - } - }; - var roster = {}; - var events = { - change: Util.mkEvent(), - checkpoint: Util.mkEvent() - }; - roster.on = function(key, handler) { - if (typeof events[key] !== "object") { - throw new Error("unsupported event"); - } - events[key].reg(handler); - return roster; - }; - roster.off = function(key, handler) { - if (typeof events[key] !== "object") { - throw new Error("unsupported event"); - } - events[key].unreg(handler); - return roster; - }; - roster.once = function(key, handler) { - if (typeof events[key] !== "object") { - throw new Error("unsupported event"); - } - var f = function() { - handler.apply(null, Array.prototype.slice.call(arguments)); - events[key].unreg(f); - }; - events[key].reg(f); - return roster; - }; - roster.getState = function() { - return Util.clone(ref.state); - }; - roster.getLastCheckpointHash = function() { - return ref.internal.lastCheckpointHash || -1; - }; - var clearPendingCheckpoints = function() { - if (ref.internal.pendingCheckpointId) { - response.clear(ref.internal.pendingCheckpointId); - delete ref.internal.pendingCheckpointId; - } - clearTimeout(ref.internal.checkpointTimeout); - delete ref.internal.checkpointTimeout; - }; - roster.stop = function() { - if (ref.internal.cpNetflux && typeof ref.internal.cpNetflux.stop === "function") { - ref.internal.cpNetflux.stop(); - clearPendingCheckpoints(); - } else { - console.log("FAILED TO LEAVE"); - } - }; - var ready = false; - var onCacheReady = function() { - if (!config.onCacheReady) { - return; - } - var state = ref.state; - if (!Object.keys(state.members || {}).length) { - try { - ref.internal.cpNetflux.resetCache(); - } catch (e) { - console.error(e); - } - return void config.onCacheReady({ - error: "CORRUPTED" - }); - } - config.onCacheReady(roster); - }; - var onReady = function() { - ready = true; - cb(void 0, roster); - }; - var onChannelError = function(info) { - if (info && info.type === "EUNKNOWN") { - return; - } - if (!ready) { - return void cb(info); - } - console.error("CHANNEL_ERROR", info); - }; - var onConnectionChange = function(info) { - if (info.state) { - return; - } - ready = false; - }; - var onConnect = function() { - console.log("ROSTER CONNECTED"); - }; - var isReady = function() { - return Boolean(ready && me); - }; - var onMessage = function(msg, user, vKey, isCp, hash, author) { - ref.internal.sinceLastCheckpoint++; - var parsed = Util.tryParse(msg); - if (!parsed) { - return void console.error("could not parse"); - } - var changed; - var error; - try { - changed = handleCommand(parsed, author, ref); - } catch (err) { - error = err.message; - } - var id = getMessageId(hash); - if (response.expected(id)) { - if (error) { - return void response.handle(id, [ error ]); - } - try { - if (!changed) { - response.handle(id, [ "NO_CHANGE" ]); - console.log(msg); - } else { - response.handle(id, [ void 0, roster.getState() ]); - } - } catch (err) { - console.log("CAUGHT", err); - } - } - if (parsed[0] === "CHECKPOINT" && changed) { - if (isReady()) { - events.checkpoint.fire(hash); - } - ref.internal.sinceLastCheckpoint = 0; - ref.internal.lastCheckpointHash = hash; - } else if (changed) { - if (isReady()) { - events.change.fire(); - } - } - clearPendingCheckpoints(); - if (!isReady() || !shouldCheckpoint(me, ref)) { - return; - } - var delay = 1e3 * Math.floor(Math.random() * 20) + 5e3; - ref.internal.checkpointTimeout = setTimeout((function() { - ref.internal.pendingCheckpointId = roster.checkpoint((function(err) { - if (err) { - console.error(err); - } - })); - }), delay); - }; - var isCacheCheckpoint = function(msg, author) { - var parsed = Util.tryParse(msg); - if (parsed[0] !== "CHECKPOINT") { - return false; - } - var changed = simulate(parsed, author, ref); - return changed; - }; - var metadata, crypto; - var send = function(msg, cb) { - if (!isReady()) { - return void cb("NOT_READY"); - } - var anon_rpc = store.anon_rpc; - if (!anon_rpc) { - return void cb("ANON_RPC_NOT_READY"); - } - var changed = false; - try { - changed = simulate(msg, keys.myCurvePublic, ref); - } catch (err) { - return void cb(err.message); - } - if (!changed) { - return void cb("NO_CHANGE"); - } - var ciphertext = crypto.encrypt(Sortify(msg)); - var id = getMessageId(ciphertext); - response.expect(id, (function(err, state) { - if (err) { - return void cb(err); - } - cb(void 0, state, id); - }), TIMEOUT_INTERVAL); - anon_rpc.send("WRITE_PRIVATE_MESSAGE", [ channel, ciphertext ], (function(err) { - if (err) { - return response.handle(id, [ err.message || err ]); - } - })); - return id; - }; - roster.init = function(_data, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - if (ref.internal.initialized) { - return void cb("ALREADY_INITIALIZED"); - } - if (!isMap(_data)) { - return void cb("INVALID_ARGUMENTS"); - } - var data = Util.clone(_data); - data.role = "OWNER"; - var members = {}; - members[me] = data; - send([ "CHECKPOINT", { - members - } ], cb); - }; - roster.checkpoint = function(_cb) { - var cb = Util.once(Util.mkAsync(_cb)); - send([ "CHECKPOINT", Util.clone(ref.state) ], cb); - }; - roster.add = function(_data, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - if (!ref.internal.initialized) { - return cb("UNINITIALIZED"); - } - if (!isMap(_data)) { - return void cb("INVALID_ARGUMENTS"); - } - var data = Util.clone(_data); - Object.keys(data).forEach((function(curve) { - if (!isValidId(curve) || isMap(ref.state.members[curve])) { - return delete data[curve]; - } - })); - send([ "ADD", data ], cb); - }; - roster.remove = function(_data, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - var state = ref.state; - if (!state) { - return cb("UNINITIALIZED"); - } - if (!Array.isArray(_data)) { - return void cb("INVALID_ARGUMENTS"); - } - var data = Util.clone(_data); - var toRemove = []; - var current = Object.keys(state.members); - data.forEach((function(curve) { - if (current.indexOf(curve) === -1) { - return; - } - toRemove.push(curve); - })); - send([ "RM", toRemove ], cb); - }; - roster.describe = function(_data, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - var state = ref.state; - if (!state) { - return cb("UNINITIALIZED"); - } - if (!isMap(_data)) { - return void cb("INVALID_ARGUMENTS"); - } - var data = Util.clone(_data); - if (Object.keys(data).some((function(curve) { - var member = data[curve]; - if (!isMap(member)) { - delete data[curve]; - } - if (!isMap(state.members[curve])) { - return true; - } - Object.keys(member).forEach((function(k) { - if (member[k] === state.members[curve][k]) { - delete member[k]; - } - })); - }))) { - return void cb("INVALID_ARGUMENTS"); - } - send([ "DESCRIBE", data ], cb); - }; - roster.metadata = function(_data, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - var metadata = ref.state.metadata; - if (!isMap(_data)) { - return void cb("INVALID_ARGUMENTS"); - } - var data = Util.clone(_data); - Object.keys(data).forEach((function(k) { - if (data[k] === metadata[k]) { - delete data[k]; - } - })); - send([ "METADATA", data ], cb); - }; - roster.invite = function(_data, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - var state = ref.state; - if (!state) { - return cb("UNINITIALIZED"); - } - if (!ref.internal.initialized) { - return cb("UNINITIALIZED"); - } - if (!isMap(_data)) { - return void cb("INVALID_ARGUMENTS"); - } - var data = Util.clone(_data); - Object.keys(data).forEach((function(curve) { - if (!isValidId(curve) || isMap(ref.state.members[curve])) { - return delete data[curve]; - } - })); - send([ "INVITE", data ], cb); - }; - roster.accept = function(_data, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - if (typeof _data !== "string" || !isValidId(_data)) { - return void cb("INVALID_ARGUMENTS"); - } - send([ "ACCEPT", _data ], cb); - }; - nThen((function(w) { - if (!store.anon_rpc) { - return; - } - store.anon_rpc.send("GET_METADATA", channel, (function(err, data) { - if (err) { - w.abort(); - return void console.error(err); - } - metadata = ref.internal.metadata = data && data[0] || undefined; - })); - })).nThen((function(w) { - if (!config.keys.teamEdPublic && metadata && metadata.validateKey) { - config.keys.teamEdPublic = metadata.validateKey; - } - if (!config.keys.teamEdPublic) { - w.abort(); - return void cb("NO_VALIDATE_KEY"); - } - try { - crypto = Crypto.Team.createEncryptor(config.keys); - } catch (err) { - w.abort(); - return void cb(err); - } - })).nThen((function() { - if (typeof lastKnownHash === "string") { - console.log("Synchronizing from checkpoint"); - } - ref.internal.cpNetflux = CPNetflux.start({ - lastKnownHash, - network: config.network, - channel: config.channel, - crypto, - validateKey: config.keys.teamEdPublic, - owners: config.owners, - Cache: config.Cache, - isCacheCheckpoint, - onCacheReady, - onChannelError, - onReady, - onConnect, - onConnectionChange, - onMessage, - noChainPad: true - }); - })); - }; - return Roster; - }; - if (module.exports) { - module.exports = factory(requireCommonUtil(), requireCommonHash(), requireChainpadNetflux(), requireJSON_sortify(), requireNthen(), requireCrypto()); - } - })(); - })(roster); - return roster.exports; - } - var invitation = { - exports: {} - }; - var hasRequiredInvitation; - function requireInvitation() { - if (hasRequiredInvitation) return invitation.exports; - hasRequiredInvitation = 1; - (function(module) { - (function() { - var factory = function(Util, Cred, Nacl, Crypto) { - var Invite = {}; - var encode64 = Nacl.util.encodeBase64; - var decode64 = Nacl.util.decodeBase64; - Invite.generateKeys = function() { - var ed = Nacl.sign.keyPair(); - var curve = Nacl.box.keyPair(); - return { - edPublic: encode64(ed.publicKey), - edPrivate: encode64(ed.secretKey), - curvePublic: encode64(curve.publicKey), - curvePrivate: encode64(curve.secretKey) - }; - }; - Invite.generateSignPair = function() { - var ed = Nacl.sign.keyPair(); - return { - validateKey: encode64(ed.publicKey), - signKey: encode64(ed.secretKey) - }; - }; - var b64ToChannelKeys = function(b64) { - var dispense = Cred.dispenser(decode64(b64)); - return { - channel: Util.uint8ArrayToHex(dispense(16)), - cryptKey: dispense(Nacl.secretbox.keyLength) - }; - }; - Invite.deriveInviteKeys = b64ToChannelKeys; - Invite.derivePreviewKeys = b64ToChannelKeys; - Invite.createRosterEntry = function(roster, data, cb) { - var toInvite = {}; - toInvite[data.curvePublic] = data.content; - roster.invite(toInvite, cb); - }; - var decodeUTF8 = Nacl.util.decodeUTF8; - Invite.encryptHash = function(data, seedStr) { - var array = decodeUTF8(seedStr); - var bytes = Nacl.hash(array); - var cryptKey = bytes.subarray(0, 32); - return Crypto.encrypt(data, cryptKey); - }; - Invite.decryptHash = function(encryptedStr, seedStr) { - var array = decodeUTF8(seedStr); - var bytes = Nacl.hash(array); - var cryptKey = bytes.subarray(0, 32); - return Crypto.decrypt(encryptedStr, cryptKey); - }; - return Invite; - }; - if (module.exports) { - module.exports = factory(requireCommonUtil(), requireCommonCredential(), requireNaclFast(), requireCrypto()); - } - })(); - })(invitation); - return invitation.exports; - } - var hasRequiredTeam; - function requireTeam() { - if (hasRequiredTeam) return team.exports; - hasRequiredTeam = 1; - (function(module) { - (() => { - const factory = (Util, Hash, Constants, Realtime, ProxyManager, UserObject, SF, Roster, Messaging, Feedback, Invite, Crypt, Cache, Pinpad, Listmap, Crypto, CpNetflux, ChainPad, nThen, Nacl) => { - var Team = {}; - Nacl = Nacl || typeof window !== "undefined" && window.nacl; - var onStoreReady = Util.mkEvent(true); - var openCachedTeamChat = function() {}; - var registerChangeEvents = function(ctx, team, proxy, fId) { - if (!team) { - return; - } - if (!fId) { - proxy.on("change", [ "drive", UserObject.SHARED_FOLDERS ], (function(o, n, p) { - if (p.length > 3 && p[3] === "password") { - var id = p[2]; - var data = proxy.drive[UserObject.SHARED_FOLDERS][id]; - var href = team.manager.user.userObject.getHref ? team.manager.user.userObject.getHref(data) : data.href; - var parsed = Hash.parsePadUrl(href); - var secret = Hash.getSecrets(parsed.type, parsed.hash, o); - setTimeout((function() { - SF.updatePassword(ctx.Store, { - oldChannel: secret.channel, - password: n, - href - }, ctx.store.network, (function() { - console.log("Shared folder password changed"); - })); - })); - return false; - } - })); - proxy.on("disconnect", (function() { - team.offline = true; - team.sendEvent("NETWORK_DISCONNECT", team.id); - })); - proxy.on("reconnect", (function() { - team.offline = false; - team.sendEvent("NETWORK_RECONNECT", team.id); - })); - } - proxy.on("change", [], (function(o, n, p) { - if (fId) { - if (p[0] === UserObject.FILES_DATA && typeof n === "object" && n.channel && !n.owners) { - var toPin = [ n.channel ]; - if (n.rtChannel) { - toPin.push(n.rtChannel); - } - if (n.lastVersion) { - toPin.push(n.lastVersion); - } - team.pin(toPin, (function(obj) { - if (obj && obj.error) { - console.error(obj.error); - } - })); - } - if (p[0] === UserObject.FILES_DATA && typeof o === "object" && o.channel && !n) { - var toUnpin = [ o.channel ]; - var c = team.manager.findChannel(o.channel); - var exists = c.some((function(data) { - return data.fId !== fId; - })); - if (!exists) { - if (o.rtChannel) { - toUnpin.push(o.rtChannel); - } - if (o.lastVersion) { - toUnpin.push(o.lastVersion); - } - team.unpin(toUnpin, (function(obj) { - if (obj && obj.error) { - console.error(obj); - } - })); - } - } - } - if (o && !n && Array.isArray(p) && (p[0] === UserObject.FILES_DATA || p[0] === "drive" && p[1] === UserObject.FILES_DATA)) { - setTimeout((function() { - ctx.Store.checkDeletedPad(o && o.channel); - })); - } - team.sendEvent("DRIVE_CHANGE", { - id: fId, - old: o, - new: n, - path: p - }); - })); - proxy.on("remove", [], (function(o, p) { - team.sendEvent("DRIVE_REMOVE", { - id: fId, - old: o, - path: p - }); - })); - }; - var closeTeam = function(ctx, teamId) { - var team = ctx.teams[teamId]; - if (!team) { - return; - } - try { - team.listmap.stop(); - } catch (e) {} - try { - team.roster.stop(); - } catch (e) {} - team.proxy = {}; - team.stopped = true; - delete ctx.teams[teamId]; - delete ctx.cache[teamId]; - delete ctx.store.proxy.teams[teamId]; - ctx.emit("LEAVE_TEAM", teamId, team.clients); - ctx.updateMetadata(); - if (ctx.store.calendar) { - ctx.store.calendar.closeTeam(teamId); - } - if (ctx.store.mailbox) { - ctx.store.mailbox.close("team-" + teamId, (function() {})); - } - }; - var getTeamChannelList = function(ctx, id) { - var store = ctx.teams[id]; - if (!store) { - return null; - } - var list = store.manager.getChannelsList("pin"); - var team = ctx.store.proxy.teams[id]; - list.push(`${team.channel}#drive`); - var chatChannel = Util.find(team, [ "keys", "chat", "channel" ]); - var membersChannel = Util.find(team, [ "keys", "roster", "channel" ]); - var mailboxChannel = Util.find(team, [ "keys", "mailbox", "channel" ]); - if (chatChannel) { - list.push(chatChannel); - } - if (membersChannel) { - list.push(membersChannel); - } - if (mailboxChannel) { - list.push(mailboxChannel); - } - if (store.proxy.calendars) { - var cList = Object.keys(store.proxy.calendars).map((function(c) { - return store.proxy.calendars[c].channel; - })); - list = list.concat(cList); - } - var state = store.roster.getState(); - if (state.members) { - Object.keys(state.members).forEach((function(curve) { - var m = state.members[curve]; - if (m.inviteChannel && m.pending) { - list.push(m.inviteChannel); - } - if (m.previewChannel && m.pending) { - list.push(m.previewChannel); - } - })); - } - list.sort(); - return list; - }; - var handleSharedFolder = function(ctx, id, sfId, rt) { - var t = ctx.teams[id]; - if (!t) { - return; - } - if (!rt) { - delete t.sharedFolders[sfId]; - return; - } - t.sharedFolders[sfId] = rt; - registerChangeEvents(ctx, t, rt.proxy, sfId); - }; - var initRpc = function(ctx, team, data, cb) { - if (team.rpc) { - return void cb(); - } - if (!data.edPrivate || !data.edPublic) { - return void cb("EFORBIDDEN"); - } - Pinpad.create(ctx.store.network, data, (function(e, call) { - if (e) { - return void cb(e); - } - team.rpc = call; - if (team && team.onRpcReadyEvt) { - team.onRpcReadyEvt.fire(); - } - cb(); - }), Cache); - }; - var onCacheReady = function(ctx, id, lm, roster, keys, cId, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - if (ctx.cache[id]) { - return void cb(); - } - var proxy = lm.proxy; - var team = { - id, - proxy, - listmap: lm, - clients: [], - realtime: lm.realtime, - handleSharedFolder: function(sfId, rt) { - handleSharedFolder(ctx, id, sfId, rt); - }, - sharedFolders: {}, - roster, - onRpcReadyEvt: Util.mkEvent(true), - offline: true - }; - ctx.cache[id] = team; - if (cId) { - team.clients.push(cId); - } - roster.on("change", (function() { - var state = roster.getState(); - var me = Util.find(ctx, [ "store", "proxy", "curvePublic" ]); - if (!state.members || !Object.keys(state.members).length) { - console.error(JSON.stringify(state)); - return; - } - if (!state.members[me]) { - return void closeTeam(ctx, id); - } - var teamData = Util.find(ctx, [ "store", "proxy", "teams", id ]); - if (teamData) { - teamData.metadata = state.metadata; - } - ctx.updateMetadata(); - ctx.emit("ROSTER_CHANGE", id, team.clients); - })); - roster.on("checkpoint", (function(hash) { - var rosterData = Util.find(ctx, [ "store", "proxy", "teams", id, "keys", "roster" ]); - rosterData.lastKnownHash = hash; - })); - team.sendEvent = function(q, data, sender) { - ctx.emit(q, data, team.clients.filter((function(cId) { - return cId !== sender; - }))); - }; - team.getChatData = function() { - var chatKeys = keys.chat || {}; - var hash = chatKeys.edit || chatKeys.view; - if (!hash) { - return {}; - } - var secret = Hash.getSecrets("chat", hash); - return { - teamId: id, - channel: secret.channel, - secret, - validateKey: chatKeys.validateKey - }; - }; - team.pin = function(data, cb) { - if (!keys.drive.edPrivate) { - return void cb({ - error: "EFORBIDDEN" - }); - } - if (!team.rpc) { - return void cb({ - error: "TEAM_RPC_NOT_READY" - }); - } - if (typeof cb !== "function") { - console.error("expected a callback"); - } - team.rpc.pin(data, (function(e, hash) { - if (e) { - return void cb({ - error: e - }); - } - cb({ - hash - }); - })); - }; - team.unpin = function(data, cb) { - if (!keys.drive.edPrivate) { - return void cb({ - error: "EFORBIDDEN" - }); - } - if (!team.rpc) { - return void cb({ - error: "TEAM_RPC_NOT_READY" - }); - } - if (typeof cb !== "function") { - console.error("expected a callback"); - } - team.rpc.unpin(data, (function(e, hash) { - if (e) { - return void cb({ - error: e - }); - } - cb({ - hash - }); - })); - }; - var loadSharedFolder = function(id, data, cb, isNew) { - SF.load({ - isNew, - network: ctx.store.network || ctx.store.networkPromise, - store: team, - isNewChannel: ctx.Store.isNewChannel, - Store: ctx.Store - }, id, data, cb); - }; - var teamData = ctx.store.proxy.teams[team.id]; - var hash = teamData.hash || teamData.roHash; - var secret = Hash.getSecrets("team", hash, teamData.password); - var manager = team.manager = ProxyManager.create(proxy.drive, { - onSync: function(cb) { - ctx.Store.onSync(id, cb); - }, - edPublic: keys.drive.edPublic, - pin: team.pin, - unpin: team.unpin, - loadSharedFolder, - settings: { - drive: Util.find(ctx.store, [ "proxy", "settings", "drive" ]) - }, - removeOwnedChannel: function(channel, cb) { - var data; - if (typeof channel === "object") { - channel.teamId = id; - data = channel; - } else { - data = { - channel, - teamId: id - }; - } - ctx.Store.removeOwnedChannel("", data, cb); - }, - Store: ctx.Store, - store: ctx.store - }, { - teamId: team.id, - outer: true, - edPublic: keys.drive.edPublic, - loggedIn: true, - log: function(msg) { - team.sendEvent("DRIVE_LOG", msg); - }, - rt: team.realtime, - editKey: secret.keys.secondaryKey, - readOnly: Boolean(!secret.keys.secondaryKey) - }); - team.secondaryKey = secret && secret.keys.secondaryKey; - team.userObject = manager.user.userObject; - nThen((function(waitFor) { - ctx.teams[id] = team; - registerChangeEvents(ctx, team, proxy); - var network = ctx.store.network || ctx.store.networkPromise; - SF.loadSharedFolders(ctx.Store, network, team, team.proxy.drive, team.userObject, waitFor, (function(data) { - ctx.progress += 70 / (ctx.numberOfTeams * data.max); - ctx.updateProgress({ - progress: ctx.progress - }); - }), true); - })).nThen((function() { - if (ctx.store.modules.calendar) { - ctx.store.modules.calendar.openTeam(id); - } - cb(); - })); - }; - var onReady = function(ctx, id, lm, roster, keys, cId, cb) { - var state = roster.getState(); - var teamData = Util.find(ctx, [ "store", "proxy", "teams", id ]); - if (teamData) { - teamData.metadata = state.metadata; - } - delete ctx.nocache[id]; - var team; - if (!ctx.store.proxy.teams[id]) { - return; - } - nThen((function(waitFor) { - onCacheReady(ctx, id, lm, roster, keys, cId, waitFor()); - team = ctx.teams[id] || ctx.cache[id]; - if (!keys.drive.edPrivate) { - return; - } - initRpc(ctx, team, keys.drive, waitFor((function() {}))); - })).nThen((function(waitFor) { - team.userObject.fixFiles(); - SF.checkMigration(team.secondaryKey, team.proxy?.drive, team.userObject, waitFor()); - SF.loadSharedFolders(ctx.Store, ctx.store.network, team, team.proxy?.drive, team.userObject, waitFor, (function(data) { - ctx.progress += 70 / (ctx.numberOfTeams * data.max); - ctx.updateProgress({ - progress: ctx.progress - }); - })); - })).nThen((function() { - if (!team.rpc) { - return; - } - var list = getTeamChannelList(ctx, id); - var local = Hash.hashChannelList(list); - team.rpc.getServerHash((function(e, hash) { - if (e) { - return void console.warn(e); - } - if (hash !== local) { - team.rpc.reset(list, (function(e) { - if (e) { - console.warn(e); - } - })); - } - })); - })).nThen((function() { - team.offline = false; - if (ctx.onReadyHandlers[id]) { - ctx.onReadyHandlers[id].forEach((function(obj) { - if (typeof obj.cb === "function") { - obj.cb(); - } - if (!obj.cId) { - return; - } - var idx = team.clients.indexOf(obj.cId); - if (idx === -1) { - team.clients.push(obj.cId); - } - })); - } - delete ctx.onReadyHandlers[id]; - if (ctx.store.modules.calendar) { - ctx.store.modules.calendar.openTeam(id); - } - cb(); - })); - }; - var checkTeamChannels = function(ctx, id, channel, roster, waitFor, cb) { - var close = function() { - if (ctx.cache[id] || ctx.teams[id]) { - closeTeam(ctx, id); - } - delete ctx.store.proxy.teams[id]; - delete ctx.onReadyHandlers[id]; - waitFor.abort(); - cb({ - error: "ENOENT" - }); - }; - if (channel) { - ctx.store.anon_rpc.send("IS_NEW_CHANNEL", channel, waitFor((function(e, res) { - if (res && res.length && typeof res[0] === "object" && res[0].isNew) { - close(); - } - }))); - } - if (roster) { - ctx.store.anon_rpc.send("IS_NEW_CHANNEL", roster, waitFor((function(e, res) { - if (res && res.length && typeof res[0] === "object" && res[0].isNew) { - close(); - } - }))); - } - }; - var openChannel = function(ctx, teamData, id, _cb, cache) { - var cb = Util.once(Util.mkAsync(_cb)); - var hash = teamData.hash || teamData.roHash; - var secret = Hash.getSecrets("team", hash, teamData.password); - var crypto = Crypto.createEncryptor(secret.keys); - if (!teamData.roHash) { - teamData.roHash = Hash.getViewHashFromKeys(secret); - } - var keys = teamData.keys; - if (!keys.chat.validateKey && keys.chat.edit) { - var chatSecret = Hash.getSecrets("chat", keys.chat.edit); - keys.chat.validateKey = chatSecret.keys.validateKey; - } - var roster; - var lm; - var myKeys = { - curvePublic: ctx.store.proxy.curvePublic, - curvePrivate: ctx.store.proxy.curvePrivate - }; - var rosterData = keys.roster || {}; - var rosterKeys = rosterData.edit ? Crypto.Team.deriveMemberKeys(rosterData.edit, myKeys) : Crypto.Team.deriveGuestKeys(rosterData.view || ""); - nThen((function(waitFor) { - if (cache) { - Cache.getChannelCache(secret.channel, waitFor((function(err, obj) { - var c = obj && obj.c; - if (!c) { - waitFor.abort(); - cb({ - error: "NOCACHE" - }); - } - }))); - Cache.getChannelCache(rosterKeys.channel, waitFor((function(err, obj) { - var c = obj && obj.c; - var k = obj && obj.k; - if (k && !rosterKeys.teamEdPublic) { - rosterKeys.teamEdPublic = k; - } - if (!c) { - waitFor.abort(); - cb({ - error: "NOCACHE" - }); - } - }))); - return; - } - ctx.Store.onReadyEvt.reg((() => { - checkTeamChannels(ctx, id, secret.channel, rosterKeys.channel, waitFor, cb); - })); - })).nThen((function(waitFor) { - var cacheRdy = { - lm: false, - roster: false, - check: function() { - if (!this.lm || !this.roster) { - return; - } - if (!cache) { - return; - } - ctx.progress += 30 / ctx.numberOfTeams; - ctx.updateProgress({ - progress: ctx.progress - }); - onCacheReady(ctx, id, lm, roster, keys, null, waitFor(cb)); - this.check = function() {}; - } - }; - var cfg = { - data: {}, - readOnly: !Boolean(secret.keys.signKey), - network: ctx.store.network || ctx.store.networkPromise, - channel: secret.channel, - crypto, - ChainPad, - Cache, - metadata: { - validateKey: secret.keys.validateKey || undefined - }, - userName: "team", - classic: true - }; - cfg.onMetadataUpdate = function() { - var team = ctx.teams[id]; - if (!team) { - return; - } - ctx.emit("ROSTER_CHANGE", id, team.clients); - }; - lm = Listmap.create(cfg); - lm.proxy.on("cacheready", (function() { - cacheRdy.lm = true; - cacheRdy.check(); - })); - lm.proxy.on("ready", waitFor()); - lm.proxy.on("error", (function(info) { - if (info && typeof info.loaded !== "undefined" && !info.loaded) { - cb({ - error: "ECONNECT" - }); - } - if (info && info.error) { - if (info.error === "EDELETED") { - closeTeam(ctx, id); - } - } - })); - Roster.create({ - network: ctx.store.network || ctx.store.networkPromise, - channel: rosterKeys.channel, - keys: rosterKeys, - store: ctx.store, - lastKnownHash: rosterData.lastKnownHash, - onCacheReady: function(_roster) { - if (!cache) { - return; - } - if (_roster && _roster.error === "CORRUPTED") { - console.error("Corrupted roster cache, cant load this team offline", teamData); - if (lm && typeof lm.stop === "function") { - lm.stop(); - } - waitFor.abort(); - cb({ - error: "CACHE_CORRUPTED_ROSTER" - }); - return; - } - roster = _roster; - cacheRdy.roster = true; - cacheRdy.check(); - }, - Cache - }, waitFor((function(err, _roster) { - if (err) { - waitFor.abort(); - console.error(err); - return void cb({ - error: "ROSTER_ERROR" - }); - } - roster = _roster; - rosterData.lastKnownHash = roster.getLastCheckpointHash(); - var state = roster.getState(); - var me = Util.find(ctx, [ "store", "proxy", "curvePublic" ]); - if (!state.members[me]) { - return; - } - onStoreReady.reg((function() { - if (!rosterData.edit) { - return; - } - var data = {}; - var myData = Messaging.createData(ctx.store.proxy, false); - myData.pending = false; - data[ctx.store.proxy.curvePublic] = myData; - roster.describe(data, (function(err) { - if (!err) { - return; - } - if (err === "NO_CHANGE") { - return; - } - console.error(err); - })); - })); - }))); - })).nThen((function(waitFor) { - var state = roster.getState(); - var me = Util.find(ctx, [ "store", "proxy", "curvePublic" ]); - if (!state.members || !Object.keys(state.members).length) { - lm.stop(); - roster.stop(); - lm.proxy = {}; - cb({ - error: "EINVAL" - }); - waitFor.abort(); - console.error(JSON.stringify(state)); - Feedback.send("ROSTER_CORRUPTED"); - return; - } - if (!state.members[me]) { - lm.stop(); - roster.stop(); - lm.proxy = {}; - delete ctx.store.proxy.teams[id]; - ctx.updateMetadata(); - cb({ - error: "EFORBIDDEN" - }); - waitFor.abort(); - return; - } - var s = state.members[me]; - var teamEdPrivate = Util.find(teamData, [ "keys", "drive", "edPrivate" ]); - if ((!teamData.hash || !teamEdPrivate) && [ "ADMIN", "MEMBER" ].indexOf(s.role) !== -1) { - console.warn("Missing edit rights: demote to viewer"); - var data = {}; - data[ctx.store.proxy.curvePublic] = { - role: "VIEWER" - }; - roster.describe(data, (function(err) { - Feedback.send("TEAM_RIGHTS_FIXED"); - delete teamData.hash; - delete teamData.keys.drive.edPrivate; - delete teamData.keys.chat.edit; - if (!err) { - return; - } - if (err === "NO_CHANGE") { - return; - } - console.error(err); - })); - } else if ((!teamData.hash || !teamEdPrivate) && s.role === "OWNER") { - Feedback.send("TEAM_RIGHTS_OWNER"); - } - })).nThen((function() { - if (!cache) { - ctx.progress += 30 / ctx.numberOfTeams; - ctx.updateProgress({ - progress: ctx.progress - }); - } - onReady(ctx, id, lm, roster, keys, null, cb); - })); - }; - var createTeam = function(ctx, data, cId, _cb) { - var cb = Util.once(_cb); - var password = Hash.createChannelId(); - var hash = Hash.createRandomHash("team", password); - var secret = Hash.getSecrets("team", hash, password); - var roHash = Hash.getViewHashFromKeys(secret); - var keyPair = Nacl.sign.keyPair(); - var curvePair = Nacl.box.keyPair(); - var rosterSeed = Crypto.Team.createSeed(); - var rosterKeys = Crypto.Team.deriveMemberKeys(rosterSeed, { - curvePublic: ctx.store.proxy.curvePublic, - curvePrivate: ctx.store.proxy.curvePrivate - }); - var roster; - var chatSecret = Hash.getSecrets("chat"); - var chatHashes = Hash.getHashes(chatSecret); - var config = { - network: ctx.store.network, - channel: secret.channel, - data: {}, - validateKey: secret.keys.validateKey, - crypto: Crypto.createEncryptor(secret.keys), - logLevel: 1, - classic: true, - ChainPad, - Cache, - owners: [ ctx.store.proxy.edPublic ] - }; - nThen((function(waitFor) { - Roster.create({ - network: ctx.store.network || ctx.store.networkPromise, - channel: rosterKeys.channel, - owners: [ ctx.store.proxy.edPublic ], - keys: rosterKeys, - store: ctx.store, - lastKnownHash: void 0, - newTeam: true, - Cache - }, waitFor((function(err, _roster) { - if (err) { - waitFor.abort(); - console.error(err); - return void cb({ - error: "ROSTER_ERROR" - }); - } - roster = _roster; - var myData = Messaging.createData(ctx.store.proxy); - delete myData.channel; - roster.init(myData, waitFor((function(err) { - if (err) { - waitFor.abort(); - return void cb({ - error: "ROSTER_INIT_ERROR" - }); - } - }))); - }))); - var crypto = Crypto.createEncryptor(chatSecret.keys); - var chatCfg = { - network: ctx.store.network, - channel: chatSecret.channel, - noChainPad: true, - crypto, - metadata: { - validateKey: chatSecret.keys.validateKey, - owners: [ ctx.store.proxy.edPublic ] - } - }; - var chatReady = waitFor(); - var cpNf2; - chatCfg.onReady = function() { - if (cpNf2) { - cpNf2.stop(); - } - chatReady(); - }; - chatCfg.onError = function() { - waitFor.abort(); - return void cb({ - error: "CHAT_INIT_ERROR" - }); - }; - cpNf2 = CpNetflux.start(chatCfg); - })).nThen((function(waitFor) { - roster.metadata({ - name: data.name - }, waitFor((function(err) { - if (err) { - waitFor.abort(); - return void cb({ - error: "ROSTER_INIT_ERROR" - }); - } - }))); - })).nThen((function() { - var id = Util.createRandomInteger(); - config.onMetadataUpdate = function() { - var team = ctx.teams[id]; - if (!team) { - return; - } - ctx.emit("ROSTER_CHANGE", id, team.clients); - }; - var lm = Listmap.create(config); - var proxy = lm.proxy; - proxy.version = 2; - proxy.on("ready", (function() { - var keys = { - mailbox: { - channel: Hash.createChannelId(), - viewed: [], - keys: { - curvePrivate: Nacl.util.encodeBase64(curvePair.secretKey), - curvePublic: Nacl.util.encodeBase64(curvePair.publicKey) - } - }, - drive: { - edPrivate: Nacl.util.encodeBase64(keyPair.secretKey), - edPublic: Nacl.util.encodeBase64(keyPair.publicKey) - }, - chat: { - edit: chatHashes.editHash, - view: chatHashes.viewHash, - validateKey: chatSecret.keys.validateKey, - channel: chatSecret.channel - }, - roster: { - channel: rosterKeys.channel, - edit: rosterSeed, - view: rosterKeys.viewKeyStr - } - }; - var t = ctx.store.proxy.teams[id] = { - owner: true, - channel: secret.channel, - hash, - roHash, - password, - keys, - metadata: { - name: data.name - } - }; - proxy.drive = {}; - onReady(ctx, id, lm, roster, keys, cId, (function() { - Feedback.send("TEAM_CREATION"); - ctx.store.mailbox.open("team-" + id, t.keys.mailbox, (function() {}), true, { - owners: t.keys.drive.edPublic - }); - ctx.updateMetadata(); - cb(); - })); - })).on("error", (function(info) { - if (info && typeof info.loaded !== "undefined" && !info.loaded) { - cb({ - error: "ECONNECT" - }); - } - if (info && info.error) { - if (info.error === "EDELETED") { - closeTeam(ctx, id); - } - } - })); - })); - }; - var deleteTeam = function(ctx, data, cId, cb) { - var teamId = data.teamId; - if (!teamId) { - return void cb({ - error: "EINVAL" - }); - } - var team = ctx.teams[teamId]; - var teamData = Util.find(ctx, [ "store", "proxy", "teams", teamId ]); - if (!team || !teamData) { - return void cb({ - error: "ENOENT" - }); - } - var state = team.roster.getState(); - var curvePublic = Util.find(ctx, [ "store", "proxy", "curvePublic" ]); - var me = state.members[curvePublic]; - if (!me || me.role !== "OWNER") { - return cb({ - error: "EFORBIDDEN" - }); - } - var edPublic = Util.find(ctx, [ "store", "proxy", "edPublic" ]); - var teamEdPublic = Util.find(teamData, [ "keys", "drive", "edPublic" ]); - nThen((function(waitFor) { - ctx.Store.anonRpcMsg(null, { - msg: "GET_METADATA", - data: teamData.channel - }, waitFor((function(obj) { - if (obj && obj.error) { - waitFor.abort(); - return cb({ - error: obj.error - }); - } - var metadata = obj[0]; - if (metadata && Array.isArray(metadata.owners) && metadata.owners.indexOf(edPublic) !== -1) { - return; - } - waitFor.abort(); - cb({ - error: "EFORBIDDEN" - }); - }))); - })).nThen((function(waitFor) { - team.proxy.delete = true; - var ownedPads = team.manager.getChannelsList("owned"); - var sem = Util.Saferphore.create(10); - ownedPads.forEach((function(c) { - var w = waitFor(); - sem.take((function(give) { - var otherOwners = false; - nThen((function(_w) { - if (c.length !== 32) { - return; - } - ctx.Store.anonRpcMsg(null, { - msg: "GET_METADATA", - data: c - }, _w((function(obj) { - if (obj && obj.error) { - give(); - return void _w.abort(); - } - var md = obj[0]; - var isOwner = md && Array.isArray(md.owners) && md.owners.indexOf(teamEdPublic) !== -1; - if (!isOwner) { - give(); - return void _w.abort(); - } - otherOwners = md.owners.some((function(ed) { - return ed !== teamEdPublic; - })); - }))); - })).nThen((function(_w) { - if (otherOwners) { - ctx.Store.setPadMetadata(null, { - channel: c, - command: "RM_OWNERS", - value: [ teamEdPublic ] - }, _w()); - return; - } - team.rpc.removeOwnedChannel(c, _w((function(err) { - if (err) { - console.error(err); - } - }))); - })).nThen((function() { - give(); - w(); - })); - })); - })); - })).nThen((function(waitFor) { - team.rpc.removePins(waitFor((function(err) { - if (err) { - console.error(err); - } - }))); - var mailboxChan = Util.find(teamData, [ "keys", "mailbox", "channel" ]); - team.rpc.removeOwnedChannel(mailboxChan, waitFor((function(err) { - if (err) { - console.error(err); - } - }))); - var rosterChan = Util.find(teamData, [ "keys", "roster", "channel" ]); - ctx.store.rpc.removeOwnedChannel(rosterChan, waitFor((function(err) { - if (err) { - console.error(err); - } - }))); - var chatChan = Util.find(teamData, [ "keys", "chat", "channel" ]); - ctx.store.rpc.removeOwnedChannel(chatChan, waitFor((function(err) { - if (err) { - console.error(err); - } - }))); - ctx.store.rpc.removeOwnedChannel(teamData.channel, waitFor((function(err) { - if (err) { - console.error(err); - } - }))); - })).nThen((function() { - Feedback.send("TEAM_DELETION"); - closeTeam(ctx, teamId); - cb(); - })); - }; - var joinTeam = function(ctx, data, cId, cb) { - var team = data.team; - if (!(team.hash || team.roHash) || !team.channel || !team.password || !team.keys || !team.metadata) { - return void cb({ - error: "EINVAL" - }); - } - let myTeams = ctx.store.proxy.teams; - if (Object.values(myTeams).some((obj => obj.channel === team.channel))) { - return void cb({ - error: "EEXISTS" - }); - } - var id = Util.createRandomInteger(); - ctx.store.proxy.teams[id] = team; - ctx.onReadyHandlers[id] = []; - openChannel(ctx, team, id, (function(obj) { - if (!(obj && obj.error)) { - console.debug("Team joined:" + id); - } - var t = ctx.store.proxy.teams[id]; - ctx.store.mailbox.open("team-" + id, t.keys.mailbox, (function() {}), true, { - owners: t.keys.drive.edPublic - }); - ctx.updateMetadata(); - cb(obj); - })); - }; - var leaveTeam = function(ctx, data, cId, cb) { - var teamId = data.teamId; - if (!teamId) { - return void cb({ - error: "EINVAL" - }); - } - var team = ctx.teams[teamId]; - if (!team) { - return void cb({ - error: "ENOENT" - }); - } - if (!team.roster) { - return void cb({ - error: "NO_ROSTER" - }); - } - var curvePublic = ctx.store.proxy.curvePublic; - team.roster.remove([ curvePublic ], (function(err) { - if (err) { - return void cb({ - error: err - }); - } - closeTeam(ctx, teamId); - cb(); - })); - }; - var getTeamRoster = function(ctx, data, cId, cb) { - var teamId = data.teamId; - if (!teamId) { - return void cb({ - error: "EINVAL" - }); - } - var teamData = Util.find(ctx, [ "store", "proxy", "teams", teamId ]); - if (!teamData) { - return void cb({ - error: "ENOENT" - }); - } - var team = ctx.teams[teamId]; - if (!team) { - return void cb({ - error: "ENOENT" - }); - } - if (!team.roster) { - return void cb({ - error: "NO_ROSTER" - }); - } - var state = team.roster.getState() || {}; - var members = state.members || {}; - var md; - nThen((function(waitFor) { - ctx.Store.getPadMetadata(null, { - channel: teamData.channel - }, waitFor((function(obj) { - if (obj && obj.error) { - md = team.listmap.metadata || {}; - return; - } - md = obj; - }))); - })).nThen((function() { - ctx.pending_owners = md.pending_owners; - if (Array.isArray(md.pending_owners)) { - md.pending_owners.forEach((function(ed) { - var member; - Object.keys(members).some((function(curve) { - if (members[curve].edPublic === ed) { - member = members[curve]; - return true; - } - })); - if (!member && teamData.owner) { - var removeOwnership = function(chan) { - ctx.Store.setPadMetadata(null, { - channel: chan, - command: "RM_PENDING_OWNERS", - value: [ ed ] - }, (function() {})); - }; - removeOwnership(teamData.channel); - removeOwnership(Util.find(teamData, [ "keys", "roster", "channel" ])); - removeOwnership(Util.find(teamData, [ "keys", "chat", "channel" ])); - return; - } - member.pendingOwner = true; - })); - } - if (ctx.store.messenger) { - var chatData = team.getChatData(); - var online = ctx.store.messenger.getOnlineList(chatData.channel) || []; - online.forEach((function(curve) { - if (members[curve]) { - members[curve].online = true; - } - })); - } - Object.keys(members).forEach((function(curve) { - var member = members[curve]; - if (!member.inviteChannel) { - return; - } - if (!member.hash) { - return; - } - if (!teamData.hash) { - delete member.hash; - return; - } - try { - member.hash = Invite.decryptHash(member.hash, teamData.hash); - } catch (e) { - console.error(e); - } - })); - cb(members); - })); - }; - var getEditableFolders = function(ctx, data, cId, cb) { - var teamId = data.teamId; - if (!teamId) { - return void cb({ - error: "EINVAL" - }); - } - var team = ctx.teams[teamId]; - if (!team) { - return void cb({ - error: "ENOENT" - }); - } - var folders = team.manager.folders || {}; - var ids = Object.keys(folders).filter((function(id) { - return !folders[id].proxy.version; - })); - cb(ids.map((function(id) { - var uo = Util.find(team, [ "user", "userObject" ]); - return { - name: Util.find(folders, [ id, "proxy", "metadata", "title" ]), - path: uo ? uo.findFile(id)[0] : [] - }; - }))); - }; - var getTeamMetadata = function(ctx, data, cId, cb) { - var teamId = data.teamId; - if (!teamId) { - return void cb({ - error: "EINVAL" - }); - } - var team = ctx.teams[teamId]; - if (!team) { - return void cb({ - error: "ENOENT" - }); - } - if (!team.roster) { - return void cb({ - error: "NO_ROSTER" - }); - } - var state = team.roster.getState() || {}; - var md = state.metadata || {}; - md.offline = team.offline; - cb(md); - }; - var setTeamMetadata = function(ctx, data, cId, cb) { - var teamId = data.teamId; - if (!teamId) { - return void cb({ - error: "EINVAL" - }); - } - var team = ctx.teams[teamId]; - if (!team) { - return void cb({ - error: "ENOENT" - }); - } - if (team.offline) { - return void cb({ - error: "OFFLINE" - }); - } - if (!team.roster) { - return void cb({ - error: "NO_ROSTER" - }); - } - if (data.metadata) { - delete data.metadata.offline; - } - team.roster.metadata(data.metadata, (function(err) { - if (err) { - return void cb({ - error: err - }); - } - var localTeam = ctx.store.proxy.teams[teamId]; - if (localTeam) { - localTeam.metadata = data.metadata; - } - cb(); - })); - }; - var offerOwnership = function(ctx, data, cId, _cb) { - var cb = Util.once(_cb); - var teamId = data.teamId; - if (!teamId) { - return void cb({ - error: "EINVAL" - }); - } - var teamData = Util.find(ctx, [ "store", "proxy", "teams", teamId ]); - if (!teamData) { - return void cb({ - error: "ENOENT" - }); - } - var team = ctx.teams[teamId]; - if (!team) { - return void cb({ - error: "ENOENT" - }); - } - if (!team.roster) { - return void cb({ - error: "NO_ROSTER" - }); - } - if (!data.curvePublic) { - return void cb({ - error: "MISSING_DATA" - }); - } - var state = team.roster.getState(); - var user = state.members[data.curvePublic]; - nThen((function(waitFor) { - var onError = function(res) { - var err = res && res.error; - if (err) { - console.error(err); - waitFor.abort(); - return void cb({ - error: err - }); - } - }; - var addPendingOwner = function(chan) { - ctx.Store.setPadMetadata(null, { - channel: chan, - command: "ADD_PENDING_OWNERS", - value: [ user.edPublic ] - }, waitFor(onError)); - }; - addPendingOwner(teamData.channel); - addPendingOwner(Util.find(teamData, [ "keys", "roster", "channel" ])); - addPendingOwner(Util.find(teamData, [ "keys", "chat", "channel" ])); - })).nThen((function(waitFor) { - var obj = {}; - obj[user.curvePublic] = { - role: "OWNER" - }; - team.roster.describe(obj, waitFor((function(err) { - if (err) { - console.error(err); - } - }))); - })).nThen((function(waitFor) { - ctx.store.mailbox.sendTo("ADD_OWNER", { - teamChannel: teamData.channel, - chatChannel: Util.find(teamData, [ "keys", "chat", "channel" ]), - rosterChannel: Util.find(teamData, [ "keys", "roster", "channel" ]), - title: teamData.metadata.name - }, { - channel: user.notifications, - curvePublic: user.curvePublic - }, waitFor()); - })).nThen((function() { - cb(); - })); - }; - var revokeOwnership = function(ctx, teamId, user, _cb) { - var cb = Util.once(_cb); - if (!teamId) { - return void cb({ - error: "EINVAL" - }); - } - var teamData = Util.find(ctx, [ "store", "proxy", "teams", teamId ]); - if (!teamData) { - return void cb({ - error: "ENOENT" - }); - } - var team = ctx.teams[teamId]; - if (!team) { - return void cb({ - error: "ENOENT" - }); - } - var isPendingOwner = user.pendingOwner; - nThen((function(waitFor) { - var cmd = isPendingOwner ? "RM_PENDING_OWNERS" : "RM_OWNERS"; - var onError = function(res) { - var err = res && res.error; - if (err) { - console.error(err); - waitFor.abort(); - return void cb(err); - } - }; - var removeOwnership = function(chan) { - ctx.Store.setPadMetadata(null, { - channel: chan, - command: cmd, - value: [ user.edPublic ] - }, waitFor(onError)); - }; - removeOwnership(teamData.channel); - removeOwnership(Util.find(teamData, [ "keys", "roster", "channel" ])); - removeOwnership(Util.find(teamData, [ "keys", "chat", "channel" ])); - })).nThen((function(waitFor) { - var obj = {}; - obj[user.curvePublic] = { - role: "ADMIN", - pendingOwner: false - }; - team.roster.describe(obj, waitFor((function(err) { - if (err) { - console.error(err); - } - }))); - })).nThen((function(waitFor) { - ctx.store.mailbox.sendTo("RM_OWNER", { - teamChannel: teamData.channel, - title: teamData.metadata.name, - pending: isPendingOwner - }, { - channel: user.notifications, - curvePublic: user.curvePublic - }, waitFor()); - })).nThen((function() { - cb(); - })); - }; - var answerOwnership = function(ctx, data, cId, cb) { - var myTeams = ctx.store.proxy.teams; - var teamId; - Object.keys(myTeams).forEach((function(id) { - if (myTeams[id].channel === data.teamChannel) { - teamId = id; - return true; - } - })); - if (!teamId) { - return void cb({ - error: "EINVAL" - }); - } - var teamData = Util.find(ctx, [ "store", "proxy", "teams", teamId ]); - if (!teamData) { - return void cb({ - error: "ENOENT" - }); - } - var team = ctx.teams[teamId]; - if (!team) { - return void cb({ - error: "ENOENT" - }); - } - if (!team.roster) { - return void cb({ - error: "NO_ROSTER" - }); - } - var obj = {}; - if (data.answer) { - teamData.owner = true; - return; - } - obj[ctx.store.proxy.curvePublic] = { - role: "ADMIN" - }; - team.roster.describe(obj, (function(err) { - if (err) { - return void cb({ - error: err - }); - } - cb(); - })); - }; - var getInviteData = function(ctx, teamId, edit) { - var teamData = Util.find(ctx, [ "store", "proxy", "teams", teamId ]); - if (!teamData) { - return {}; - } - var data = Util.clone(teamData); - if (!edit) { - delete data.hash; - delete data.keys.drive.edPrivate; - delete data.keys.chat.edit; - } - delete data.owner; - return data; - }; - var updateMyRights = function(ctx, teamId, hash) { - if (!teamId) { - return true; - } - var teamData = Util.find(ctx, [ "store", "proxy", "teams", teamId ]); - if (!teamData) { - return true; - } - var team = ctx.teams[teamId]; - if (!team) { - return true; - } - var secret = Hash.getSecrets("team", hash || teamData.roHash, teamData.password); - SF.upgrade(teamData.channel, secret); - if (team.userObject) { - team.userObject.setReadOnly(!secret.keys.secondaryKey, secret.keys.secondaryKey); - } - if (secret.keys.secondaryKey) { - try { - ctx.store.modules.calendar.upgradeTeam(teamId); - } catch (e) { - console.error(e); - } - } - if (!secret.keys.secondaryKey && team.rpc) { - team.rpc.destroy(); - } - var folders = Util.find(team, [ "proxy", "drive", "sharedFolders" ]); - Object.keys(folders || {}).forEach((function(sfId) { - var data = team.manager.getSharedFolderData(sfId); - var parsed = Hash.parsePadUrl(data.href || data.roHref); - var secret = Hash.getSecrets(parsed.type, parsed.hash, data.password); - SF.upgrade(secret.channel, secret); - var uo = Util.find(team, [ "manager", "folders", sfId, "userObject" ]); - if (uo) { - uo.setReadOnly(!secret.keys.secondaryKey, secret.keys.secondaryKey); - } - })); - ctx.updateMetadata(); - ctx.emit("ROSTER_CHANGE_RIGHTS", teamId, team.clients); - }; - var changeMyRights = function(ctx, teamId, state, data, cb) { - if (!teamId) { - return void cb(false); - } - var teamData = Util.find(ctx, [ "store", "proxy", "teams", teamId ]); - if (!teamData) { - return void cb(false); - } - var onReady = ctx.onReadyHandlers[teamId]; - var team = ctx.teams[teamId]; - if (teamData.channel !== data.channel || teamData.password !== data.password) { - return void cb(false); - } - if (state) { - teamData.hash = data.hash; - teamData.keys.drive.edPrivate = data.keys.drive.edPrivate; - teamData.keys.chat.edit = data.keys.chat.edit; - } else { - delete teamData.hash; - delete teamData.keys.drive.edPrivate; - delete teamData.keys.chat.edit; - } - if (!team && Array.isArray(onReady)) { - onReady.push({ - cb: function() { - changeMyRights(ctx, teamId, state, data, cb); - } - }); - return; - } - if (!team) { - return void cb(false); - } - if (state) { - initRpc(ctx, team, teamData.keys.drive, (function() { - team.manager.addPin(team.pin, team.unpin); - })); - var secret = Hash.getSecrets("team", data.hash, teamData.password); - team.secondaryKey = secret && secret.keys.secondaryKey; - var crypto = Crypto.createEncryptor(secret.keys); - team.listmap.setReadOnly(false, crypto); - } else { - delete team.secondaryKey; - if (team.rpc && team.rpc.destroy) { - team.rpc.destroy(); - } - team.manager.removePin(); - team.listmap.setReadOnly(true); - } - updateMyRights(ctx, teamId, data.hash); - cb(true); - }; - var changeEditRights = function(ctx, teamId, user, state, cb) { - if (!teamId) { - return void cb({ - error: "EINVAL" - }); - } - var teamData = Util.find(ctx, [ "store", "proxy", "teams", teamId ]); - if (!teamData) { - return void cb({ - error: "ENOENT" - }); - } - var team = ctx.teams[teamId]; - if (!team) { - return void cb({ - error: "ENOENT" - }); - } - ctx.store.mailbox.sendTo("TEAM_EDIT_RIGHTS", { - state, - teamData: getInviteData(ctx, teamId, state) - }, { - channel: user.notifications, - curvePublic: user.curvePublic - }, cb); - }; - var describeUser = function(ctx, data, cId, cb) { - var teamId = data.teamId; - if (!teamId) { - return void cb({ - error: "EINVAL" - }); - } - var teamData = Util.find(ctx, [ "store", "proxy", "teams", teamId ]); - var team = ctx.teams[teamId]; - if (!teamData || !team) { - return void cb({ - error: "ENOENT" - }); - } - if (!team.roster) { - return void cb({ - error: "NO_ROSTER" - }); - } - if (!data.curvePublic || !data.data) { - return void cb({ - error: "MISSING_DATA" - }); - } - var state = team.roster.getState(); - var user = state.members[data.curvePublic]; - var md; - nThen((function(waitFor) { - ctx.Store.getPadMetadata(null, { - channel: teamData.channel - }, waitFor((function(obj) { - if (obj && obj.error) { - md = team.listmap.metadata || {}; - return; - } - md = obj; - }))); - })).nThen((function() { - user.pendingOwner = Array.isArray(md.pending_owners) && md.pending_owners.indexOf(user.edPublic) !== -1; - if (user.role === "OWNER" && data.data.role !== "OWNER") { - revokeOwnership(ctx, teamId, user, (function(err) { - if (!err) { - return void cb(); - } - console.error(err); - return void cb({ - error: err - }); - })); - return; - } - if (user.role === "VIEWER" && data.data.role !== "VIEWER") { - changeEditRights(ctx, teamId, user, true, (function(obj) { - return void cb(obj); - })); - } - if (user.role !== "VIEWER" && data.data.role === "VIEWER") { - changeEditRights(ctx, teamId, user, false, (function(obj) { - return void cb(obj); - })); - } - var obj = {}; - obj[data.curvePublic] = data.data; - team.roster.describe(obj, (function(err) { - if (err) { - return void cb({ - error: err - }); - } - cb(); - })); - })); - }; - var inviteToTeam = function(ctx, data, cId, cb) { - var teamId = data.teamId; - if (!teamId) { - return void cb({ - error: "EINVAL" - }); - } - var team = ctx.teams[teamId]; - if (!team) { - return void cb({ - error: "ENOENT" - }); - } - if (!team.roster) { - return void cb({ - error: "NO_ROSTER" - }); - } - var user = data.user; - if (!user || !user.curvePublic || !user.notifications) { - return void cb({ - error: "MISSING_DATA" - }); - } - delete user.channel; - delete user.lastKnownHash; - user.pending = true; - var obj = {}; - obj[user.curvePublic] = user; - obj[user.curvePublic].role = "VIEWER"; - team.roster.add(obj, (function(err) { - if (err && err !== "NO_CHANGE") { - return void cb({ - error: err - }); - } - ctx.store.mailbox.sendTo("INVITE_TO_TEAM", { - team: getInviteData(ctx, teamId) - }, { - channel: user.notifications, - curvePublic: user.curvePublic - }, (function(obj) { - cb(obj); - })); - })); - }; - var removeUser = function(ctx, data, cId, cb) { - var teamId = data.teamId; - if (!teamId) { - return void cb({ - error: "EINVAL" - }); - } - var team = ctx.teams[teamId]; - if (!team) { - return void cb({ - error: "ENOENT" - }); - } - if (!team.roster) { - return void cb({ - error: "NO_ROSTER" - }); - } - if (!data.curvePublic) { - return void cb({ - error: "MISSING_DATA" - }); - } - var state = team.roster.getState(); - var userData = state.members[data.curvePublic]; - team.roster.remove([ data.curvePublic ], (function(err) { - if (err) { - return void cb({ - error: err - }); - } - if (!userData || !userData.notifications) { - return cb(); - } - ctx.store.mailbox.sendTo("KICKED_FROM_TEAM", { - pending: data.pending, - teamChannel: getInviteData(ctx, teamId).channel, - teamName: getInviteData(ctx, teamId).metadata.name - }, { - channel: userData.notifications, - curvePublic: userData.curvePublic - }, (function(obj) { - cb(obj); - })); - })); - }; - var removeClient = function(ctx, cId) { - Object.keys(ctx.onReadyHandlers).forEach((function(teamId) { - var idx = -1; - ctx.onReadyHandlers[teamId].some((function(obj, _idx) { - if (obj.cId === cId) { - idx = _idx; - return true; - } - })); - if (idx !== -1) { - ctx.onReadyHandlers[teamId].splice(idx, 1); - } - })); - Object.keys(ctx.teams).forEach((function(id) { - var clients = ctx.teams[id].clients; - var idx = clients.indexOf(cId); - if (idx !== -1) { - clients.splice(idx, 1); - } - })); - }; - var subscribe = function(ctx, id, cId, cb) { - removeClient(ctx, cId); - try { - ctx.store.messenger.removeClient(cId); - } catch (e) {} - openCachedTeamChat = function() {}; - if (!id) { - return void cb(); - } - if (ctx.onReadyHandlers[id] && !ctx.teams[id]) { - var _idx = ctx.onReadyHandlers[id].indexOf(cId); - if (_idx === -1) { - ctx.onReadyHandlers[id].push({ - cId, - cb - }); - } - return; - } - if (!ctx.teams[id]) { - return void cb({ - error: "EINVAL" - }); - } - var clients = ctx.teams[id].clients; - var idx = clients.indexOf(cId); - if (idx === -1) { - clients.push(cId); - } - cb(); - }; - var openTeamChat = function(ctx, data, cId, cb) { - var team = ctx.teams[data.teamId]; - if (!team) { - return void cb({ - error: "ENOENT" - }); - } - var onUpdate = function() { - ctx.emit("ROSTER_CHANGE", data.teamId, team.clients); - }; - if (ctx.store.messenger) { - ctx.store.messenger.openTeamChat(team.getChatData(), onUpdate, cId, cb); - } else { - openCachedTeamChat = function() { - ctx.store.messenger.openTeamChat(team.getChatData(), onUpdate, cId, cb); - }; - } - }; - var createInviteLink = function(ctx, data, cId, _cb) { - var cb = Util.mkAsync(Util.once(_cb)); - var teamId = data.teamId; - var team = ctx.teams[data.teamId]; - var seeds = data.seeds; - var bytes64 = data.bytes64; - if (!teamId || !team) { - return void cb({ - error: "EINVAL" - }); - } - var roster = team.roster; - var teamName; - try { - teamName = roster.getState().metadata.name; - } catch (err) { - return void cb({ - error: "TEAM_NAME_ERR" - }); - } - var message = data.message; - var name = data.name; - var hash = data.hash; - var teamData = Util.find(ctx, [ "store", "proxy", "teams", teamId ]); - try { - var encryptedHash = Invite.encryptHash(hash, teamData.hash); - } catch (e) { - console.error(e); - } - var previewKeys = Invite.derivePreviewKeys(seeds.preview); - var inviteKeys = Invite.deriveInviteKeys(bytes64); - var ephemeralKeys = Invite.generateKeys(); - var role = data.role || "VIEWER"; - var uses = data.uses || 1; - nThen((function(w) { - (function() { - var sign = Invite.generateSignPair(); - var putOpts = { - initialState: "{}", - network: ctx.store.network, - metadata: { - owners: [ ctx.store.proxy.edPublic, ephemeralKeys.edPublic ] - } - }; - putOpts.metadata.validateKey = sign.validateKey; - var previewContent = { - teamName, - message, - author: Messaging.createData(ctx.store.proxy, false), - displayName: name - }; - var cryptput_config = { - channel: previewKeys.channel, - type: "pad", - version: 2, - keys: { - cryptKey: previewKeys.cryptKey, - validateKey: sign.validateKey, - signKey: sign.signKey - } - }; - Crypt.put(cryptput_config, JSON.stringify(previewContent), w((function(err) { - if (err) { - console.error("CRYPTPUT_ERR", err); - w.abort(); - return void cb({ - error: "SET_PREVIEW_CONTENT" - }); - } - })), putOpts); - })(); - (function() { - var sign = Invite.generateSignPair(); - var putOpts = { - initialState: "{}", - network: ctx.store.network, - metadata: { - owners: [ ctx.store.proxy.edPublic, ephemeralKeys.edPublic ] - } - }; - putOpts.metadata.validateKey = sign.validateKey; - var inviteContent = { - teamData: getInviteData(ctx, teamId, role === "MEMBER"), - ephemeral: { - edPublic: ephemeralKeys.edPublic, - edPrivate: ephemeralKeys.edPrivate, - curvePublic: ephemeralKeys.curvePublic, - curvePrivate: ephemeralKeys.curvePrivate - } - }; - var cryptput_config = { - channel: inviteKeys.channel, - type: "pad", - version: 2, - keys: { - cryptKey: inviteKeys.cryptKey, - validateKey: sign.validateKey, - signKey: sign.signKey - } - }; - Crypt.put(cryptput_config, JSON.stringify(inviteContent), w((function(err) { - if (err) { - console.error("CRYPTPUT_ERR", err); - w.abort(); - return void cb({ - error: "SET_PREVIEW_CONTENT" - }); - } - })), putOpts); - })(); - })).nThen((function(w) { - team.pin([ inviteKeys.channel, previewKeys.channel ], (function(obj) { - if (obj && obj.error) { - console.error(obj.error); - } - })); - Invite.createRosterEntry(team.roster, { - curvePublic: ephemeralKeys.curvePublic, - content: { - curvePublic: ephemeralKeys.curvePublic, - displayName: data.name, - pending: true, - remaining: uses, - totalUses: uses, - role, - hash: encryptedHash, - inviteChannel: inviteKeys.channel, - previewChannel: previewKeys.channel - } - }, w((function(err) { - if (err) { - w.abort(); - cb(err); - } - }))); - })).nThen((function() { - cb(); - })); - }; - var getPreviewContent = function(ctx, data, cId, cb) { - var seeds = data.seeds; - var previewKeys; - try { - previewKeys = Invite.derivePreviewKeys(seeds.preview); - } catch (err) { - return void cb({ - error: "INVALID_SEEDS" - }); - } - Crypt.get({ - channel: previewKeys.channel, - type: "pad", - version: 2, - keys: { - cryptKey: previewKeys.cryptKey - } - }, (function(err, val) { - if (err) { - return void cb({ - error: err - }); - } - if (!val) { - return void cb({ - error: "DELETED" - }); - } - var json = Util.tryParse(val); - if (!json) { - return void cb({ - error: "parseError" - }); - } - cb(json); - }), { - network: ctx.store.network, - initialState: "{}" - }); - }; - var getInviteContent = function(ctx, data, cId, cb) { - var bytes64 = data.bytes64; - var previewKeys; - try { - previewKeys = Invite.deriveInviteKeys(bytes64); - } catch (err) { - return void cb({ - error: "INVALID_SEEDS" - }); - } - Crypt.get({ - channel: previewKeys.channel, - type: "pad", - version: 2, - keys: { - cryptKey: previewKeys.cryptKey - } - }, (function(err, val) { - if (err) { - return void cb({ - error: err - }); - } - if (!val) { - return void cb({ - error: "DELETED" - }); - } - var json = Util.tryParse(val); - if (!json) { - return void cb({ - error: "parseError" - }); - } - cb(json); - }), { - network: ctx.store.network, - initialState: "{}" - }); - }; - var acceptLinkInvitation = function(ctx, data, cId, cb) { - var inviteContent; - var rosterState; - nThen((function(waitFor) { - getInviteContent(ctx, data, cId, waitFor((function(obj) { - if (obj && obj.error) { - waitFor.abort(); - return void cb(obj); - } - inviteContent = obj; - }))); - })).nThen((function(waitFor) { - var chan = Util.find(inviteContent, [ "teamData", "channel" ]); - var myTeams = ctx.store.proxy.teams || {}; - var isMember = Object.keys(myTeams).some((function(k) { - var t = myTeams[k]; - return t.channel === chan; - })); - if (isMember) { - waitFor.abort(); - return void cb({ - error: "ALREADY_MEMBER" - }); - } - var rosterData = Util.find(inviteContent, [ "teamData", "keys", "roster" ]); - var myKeys = inviteContent.ephemeral; - if (!rosterData || !myKeys) { - waitFor.abort(); - return void cb({ - error: "INVALID_INVITE_CONTENT" - }); - } - var rosterKeys = Crypto.Team.deriveMemberKeys(rosterData.edit, myKeys); - Roster.create({ - network: ctx.store.network || ctx.store.networkPromise, - channel: rosterData.channel, - keys: rosterKeys, - store: ctx.store, - Cache - }, waitFor((function(err, roster) { - if (err) { - waitFor.abort(); - console.error(err); - return void cb({ - error: "ROSTER_ERROR" - }); - } - var myData = Messaging.createData(ctx.store.proxy, false); - var state = roster.getState(); - rosterState = state.members[myKeys.curvePublic]; - roster.accept(myData.curvePublic, waitFor((function(err) { - roster.stop(); - if (err) { - waitFor.abort(); - console.error(err); - return void cb({ - error: "ACCEPT_ERROR" - }); - } - }))); - }))); - })).nThen((function() { - var tempRpc = {}; - if (!rosterState.remaining || rosterState.remaining === 1) { - initRpc(ctx, tempRpc, inviteContent.ephemeral, (function(err) { - if (err) { - return; - } - var rpc = tempRpc.rpc; - if (rosterState.inviteChannel) { - rpc.removeOwnedChannel(rosterState.inviteChannel, (function(err) { - if (err) { - console.error(err); - } - })); - } - if (rosterState.previewChannel) { - rpc.removeOwnedChannel(rosterState.previewChannel, (function(err) { - if (err) { - console.error(err); - } - })); - } - })); - } - joinTeam(ctx, { - team: inviteContent.teamData - }, cId, cb); - })); - }; - var deriveMailbox = function(team) { - if (!team) { - return; - } - if (team.keys && team.keys.mailbox) { - return team.keys.mailbox; - } - var strSeed = Util.find(team, [ "keys", "roster", "edit" ]); - if (!strSeed) { - return; - } - var hash = Nacl.hash(Nacl.util.decodeUTF8(strSeed)); - var seed = hash.slice(0, 32); - var mailboxChannel = Util.uint8ArrayToHex(hash.slice(32, 48)); - var curvePair = Nacl.box.keyPair.fromSecretKey(seed); - return { - channel: mailboxChannel, - viewed: [], - keys: { - curvePrivate: Nacl.util.encodeBase64(curvePair.secretKey), - curvePublic: Nacl.util.encodeBase64(curvePair.publicKey) - } - }; - }; - Team.init = function(cfg, waitFor, emit) { - var team = {}; - var store = cfg.store; - if (!store.loggedIn || !store.proxy.edPublic) { - return; - } - if (store.modules?.["team"]) { - return; - } - var ctx = { - store, - Store: cfg.Store, - pinPads: cfg.pinPads, - emit, - onReadyHandlers: {}, - teams: {}, - cache: {}, - nocache: {}, - updateMetadata: cfg.updateMetadata, - updateProgress: cfg.updateLoadingProgress, - progress: 0 - }; - if (!store.proxy.teams) { - store.proxy.teams = {}; - } - var teams = store.proxy.teams; - ctx.numberOfTeams = Object.keys(teams).length; - ctx.store.proxy.on("change", [ "teams" ], (function(o, n, p) { - if (p[2] !== "hash") { - return; - } - updateMyRights(ctx, p[1], n); - })); - ctx.store.proxy.on("remove", [ "teams" ], (function(o, p) { - if (p[2] !== "hash") { - return; - } - updateMyRights(ctx, p[1]); - })); - var checkKeyPair = function(edPrivate, edPublic) { - if (!edPrivate || !edPublic) { - return true; - } - try { - var secretKey = Nacl.util.decodeBase64(edPrivate); - var pair = Nacl.sign.keyPair.fromSecretKey(secretKey); - return Nacl.util.encodeBase64(pair.publicKey) === edPublic; - } catch (e) { - return false; - } - }; - var removeDuplicates = function() { - var _teams = {}; - Object.keys(teams).forEach((function(id) { - try { - var t = teams[id]; - var _t = _teams[t.channel]; - var edPrivate = Util.find(t, [ "keys", "drive", "edPrivate" ]); - var edPublic = Util.find(t, [ "keys", "drive", "edPublic" ]); - if (!edPublic) { - Feedback.send("TEAM_CORRUPTED_EDPUBLIC"); - } else if (edPrivate && edPublic && !checkKeyPair(edPrivate, edPublic)) { - Feedback.send("TEAM_CORRUPTED_EDPRIVATE"); - delete teams[id].keys.drive.edPrivate; - edPrivate = undefined; - } - if (t.hash) { - var parsed = Hash.parseTypeHash("drive", t.hash); - if (parsed.version === 2 && t.hash.length !== 40) { - Feedback.send("TEAM_CORRUPTED_HASH"); - } - } - if (!_t) { - _teams[t.channel] = id; - return; - } - var best = teams[_t]; - var bestPrivate = Util.find(best, [ "keys", "drive", "edPrivate" ]); - var bestChat = Util.find(best, [ "keys", "chat", "edit" ]); - var chat = Util.find(t, [ "keys", "chat", "edit" ]); - if (!best.hash && t.hash) { - best.hash = t.hash; - } - if (!bestPrivate && edPrivate) { - best.keys.drive.edPrivate = edPrivate; - } - if (!bestChat && chat) { - best.keys.chat.edit = chat; - } - ctx.store.proxy.duplicateTeams = ctx.store.proxy.duplicateTeams || {}; - ctx.store.proxy.duplicateTeams[id] = teams[id]; - delete teams[id]; - } catch (e) { - console.error(e); - } - })); - }; - Object.keys(teams).forEach((function(id) { - ctx.onReadyHandlers[id] = []; - if (!Util.find(teams, [ id, "keys", "mailbox" ])) { - teams[id].keys.mailbox = deriveMailbox(teams[id]); - } - openChannel(ctx, teams[id], id, waitFor((function(err) { - if (err) { - delete ctx.onReadyHandlers[id]; - delete ctx.cache[id]; - if (err?.error === "NOCACHE") { - ctx.nocache[id] = true; - } - var txt = typeof err === "string" ? err : err.type || err.message; - Feedback.send("TEAM_LOADING_ERROR=" + txt); - return void console.error(err); - } - console.debug("Team " + id + " cache ready"); - })), Cache.isEnabled()); - })); - team.onReady = function(waitFor) { - removeDuplicates(); - var checkTeam = function(id) { - if (!teams[id]) { - closeTeam(ctx, id); - delete ctx.onReadyHandlers[id]; - return true; - } - return false; - }; - Object.keys(ctx.teams).forEach(checkTeam); - Object.keys(ctx.onReadyHandlers).forEach((function(id) { - var closed = checkTeam(id); - if (closed) { - return; - } - var team = ctx.store.proxy.teams[id]; - var rosterChan = Util.find(team, [ "keys", "roster", "channel" ]); - var _cb = Util.once(Util.mkAsync(waitFor())); - nThen((function(w) { - checkTeamChannels(ctx, id, team.channel, rosterChan, w, _cb); - })); - ctx.onReadyHandlers[id].push({ - cb: _cb - }); - })); - Object.keys(teams).forEach((function(id) { - if (ctx.onReadyHandlers[id] || ctx.teams[id]) { - return; - } - ctx.onReadyHandlers[id] = []; - if (!Util.find(teams, [ id, "keys", "mailbox" ])) { - teams[id].keys.mailbox = deriveMailbox(teams[id]); - } - openChannel(ctx, teams[id], id, waitFor((function(err) { - if (err) { - var txt = typeof err === "string" ? err : err.type || err.message; - Feedback.send("TEAM_LOADING_ERROR=" + txt); - return void console.error(err); - } - console.debug("Team " + id + " ready"); - }))); - })); - openCachedTeamChat(); - onStoreReady.fire(); - }; - team.getTeam = function(id) { - return ctx.teams[id]; - }; - team.getTeamsData = function(app) { - var t = {}; - var safe = false; - if ([ "drive", "teams", "settings" ].indexOf(app) !== -1) { - safe = true; - } - Object.keys(teams).forEach((function(id) { - if (!ctx.teams[id]) { - return; - } - var proxy = ctx.teams[id].proxy || {}; - var nPads = proxy.drive && Object.keys(proxy.drive.filesData || {}).length; - var nSf = proxy.drive && Object.keys(proxy.drive.sharedFolders || {}).length; - t[id] = { - owner: teams[id].owner, - name: teams[id].metadata.name, - channel: teams[id].channel, - numberPads: nPads, - numberSf: nSf, - roster: Util.find(teams[id], [ "keys", "roster", "channel" ]), - edPublic: Util.find(teams[id], [ "keys", "drive", "edPublic" ]), - avatar: Util.find(teams[id], [ "metadata", "avatar" ]), - viewer: !Util.find(teams[id], [ "keys", "drive", "edPrivate" ]), - notifications: Util.find(teams[id], [ "keys", "mailbox", "channel" ]), - curvePublic: Util.find(teams[id], [ "keys", "mailbox", "keys", "curvePublic" ]), - validKeys: checkKeyPair(Util.find(teams[id], [ "keys", "drive", "edPrivate" ]), Util.find(teams[id], [ "keys", "drive", "edPublic" ])) - }; - if (safe && ctx.teams[id]) { - t[id].secondaryKey = ctx.teams[id].secondaryKey; - } - if (ctx.teams[id]) { - t[id].hasSecondaryKey = Boolean(ctx.teams[id].secondaryKey); - } - })); - return t; - }; - team.getTeams = function() { - return Object.keys(ctx.teams); - }; - var isPending = function(teamId, curve) { - var team = ctx.teams[teamId]; - if (!team) { - return; - } - var state = team.roster && team.roster.getState(); - if (!state.members) { - return; - } - var m = state.members[curve] || {}; - return m.pending; - }; - team.removeFromTeam = function(teamId, curve, pendingOnly) { - if (!teams[teamId]) { - return; - } - if (pendingOnly && !isPending(teamId, curve)) { - return; - } - if (ctx.onReadyHandlers[teamId]) { - ctx.onReadyHandlers[teamId].push({ - cb: function() { - ctx.teams[teamId].roster.remove([ curve ], (function(err) { - if (err && err !== "NO_CHANGE") { - console.error(err); - } - })); - } - }); - return; - } - var team = ctx.teams[teamId]; - if (!team) { - return void console.error("TEAM MODULE ERROR"); - } - team.roster.remove([ curve ], (function(err) { - if (err && err !== "NO_CHANGE") { - console.error(err); - } - })); - }; - team.changeMyRights = function(id, edit, teamData, cb) { - changeMyRights(ctx, id, edit, teamData, cb); - }; - team.updateMyData = function(data) { - Object.keys(ctx.teams).forEach((function(id) { - var team = ctx.teams[id]; - if (!team.roster) { - return; - } - var obj = {}; - obj[data.curvePublic] = data; - team.roster.describe(obj, (function(err) { - if (err) { - console.error(err); - } - })); - })); - }; - team.removeClient = function(clientId) { - removeClient(ctx, clientId); - }; - var listTeams = function(cb) { - var t = Util.clone(teams); - Object.keys(t).forEach((function(id) { - if (ctx.teams[id]) { - t[id].offline = ctx.teams[id].offline; - return; - } - t[id].error = true; - if (ctx.nocache[id]) { - t[id].offline = true; - } - })); - cb(t); - }; - team.execCommand = function(clientId, obj, cb) { - var cmd = obj.cmd; - var data = obj.data; - if (cmd === "SUBSCRIBE") { - return void subscribe(ctx, data, clientId, cb); - } - if (cmd === "LIST_TEAMS") { - return void listTeams(cb); - } - if (cmd === "OPEN_TEAM_CHAT") { - return void openTeamChat(ctx, data, clientId, cb); - } - if (cmd === "GET_TEAM_ROSTER") { - return void getTeamRoster(ctx, data, clientId, cb); - } - if (cmd === "GET_TEAM_METADATA") { - return void getTeamMetadata(ctx, data, clientId, cb); - } - if (cmd === "SET_TEAM_METADATA") { - return void setTeamMetadata(ctx, data, clientId, cb); - } - if (cmd === "OFFER_OWNERSHIP") { - if (ctx.store.offline) { - return void cb({ - error: "OFFLINE" - }); - } - return void offerOwnership(ctx, data, clientId, cb); - } - if (cmd === "ANSWER_OWNERSHIP") { - if (ctx.store.offline) { - return void cb({ - error: "OFFLINE" - }); - } - return void answerOwnership(ctx, data, clientId, cb); - } - if (cmd === "DESCRIBE_USER") { - return void describeUser(ctx, data, clientId, cb); - } - if (cmd === "INVITE_TO_TEAM") { - if (ctx.store.offline) { - return void cb({ - error: "OFFLINE" - }); - } - return void inviteToTeam(ctx, data, clientId, cb); - } - if (cmd === "LEAVE_TEAM") { - return void leaveTeam(ctx, data, clientId, cb); - } - if (cmd === "JOIN_TEAM") { - if (ctx.store.offline) { - return void cb({ - error: "OFFLINE" - }); - } - return void joinTeam(ctx, data, clientId, cb); - } - if (cmd === "REMOVE_USER") { - return void removeUser(ctx, data, clientId, cb); - } - if (cmd === "DELETE_TEAM") { - if (ctx.store.offline) { - return void cb({ - error: "OFFLINE" - }); - } - return void deleteTeam(ctx, data, clientId, cb); - } - if (cmd === "CREATE_TEAM") { - if (ctx.store.offline) { - return void cb({ - error: "OFFLINE" - }); - } - return void createTeam(ctx, data, clientId, cb); - } - if (cmd === "GET_EDITABLE_FOLDERS") { - return void getEditableFolders(ctx, data, clientId, cb); - } - if (cmd === "CREATE_INVITE_LINK") { - return void createInviteLink(ctx, data, clientId, cb); - } - if (cmd === "GET_PREVIEW_CONTENT") { - return void getPreviewContent(ctx, data, clientId, cb); - } - if (cmd === "ACCEPT_LINK_INVITATION") { - if (ctx.store.offline) { - return void cb({ - error: "OFFLINE" - }); - } - return void acceptLinkInvitation(ctx, data, clientId, cb); - } - }; - return team; - }; - Team.anonGetPreviewContent = function(cfg, data, cb) { - getPreviewContent(cfg, data, null, cb); - }; - return Team; - }; - if (module.exports) { - module.exports = factory(requireCommonUtil(), requireCommonHash(), requireCommonConstants(), requireCommonRealtime(), requireProxyManager(), requireUserObject(), requireSharedfolder(), requireRoster(), requireCommonMessaging(), requireCommonFeedback(), requireInvitation(), requireCryptget(), requireCacheStore(), requirePinpad(), requireChainpadListmap(), requireCrypto(), requireChainpadNetflux(), requireChainpad_dist(), requireNthen(), requireNaclFast()); - } - })(); - })(team); - return team.exports; - } - var messenger = { - exports: {} - }; - var hasRequiredMessenger; - function requireMessenger() { - if (hasRequiredMessenger) return messenger.exports; - hasRequiredMessenger = 1; - (function(module) { - (() => { - const factory = (Crypto, Hash, Util, Realtime, Messaging, Constants, Messages = {}, PadTypes, nThen) => { - var Curve = Crypto.Curve; - var Msg = {}; - Msg.setCustomize = data => { - Messages = data.Messages; - }; - var Types = { - message: "MSG", - unfriend: "UNFRIEND", - mapId: "MAP_ID", - mapIdAck: "MAP_ID_ACK" - }; - var clone = function(o) { - return JSON.parse(JSON.stringify(o)); - }; - var convertToUint8 = function(obj) { - var l = Object.keys(obj).length; - var u = new Uint8Array(l); - for (var i = 0; i < l; i++) { - u[i] = obj[i]; - } - return u; - }; - var createData = Messaging.createData; - var getFriend = function(proxy, pubkey) { - if (pubkey === proxy.curvePublic) { - var data = createData(proxy); - delete data.channel; - return data; - } - return proxy.friends ? proxy.friends[pubkey] : undefined; - }; - var getFriendList = Msg.getFriendList = function(proxy) { - if (!proxy.friends) { - proxy.friends = {}; - } - return proxy.friends; - }; - var msgAlreadyKnown = function(channel, sig) { - return channel.messages.some((function(message) { - return message.sig === sig; - })); - }; - var getFriendFromChannel = function(ctx, id) { - var proxy = ctx.store.proxy; - var friends = getFriendList(proxy); - var friend; - for (var k in friends) { - if (friends[k].channel === id) { - friend = friends[k]; - break; - } - } - return friend; - }; - var initRangeRequest = function(ctx, txid, chanId, cb) { - if (!ctx.range_requests) { - ctx.range_requests = {}; - } - ctx.range_requests[txid] = { - messages: [], - cb, - chanId - }; - }; - var getRangeRequest = function(ctx, txid) { - return ctx.range_requests[txid]; - }; - var deleteRangeRequest = function(ctx, txid) { - delete ctx.range_requests[txid]; - }; - var getMoreHistory = function(ctx, chanId, hash, count, cb) { - if (typeof cb !== "function") { - return; - } - if (typeof hash !== "string") { - return void cb([]); - } - var chan = ctx.channels[chanId]; - if (typeof chan === "undefined") { - console.error("chan is undefined. we're going to have a problem here"); - return; - } - var txid = Util.uid(); - initRangeRequest(ctx, txid, chanId, cb); - var msg = [ "GET_HISTORY_RANGE", chan.id, { - from: hash, - count, - txid - } ]; - var network = ctx.store.network; - network.sendto(network.historyKeeper, JSON.stringify(msg)).then((function() {}), (function(err) { - console.error(err); - })); - }; - var getChannelMessagesSince = function(ctx, channel, data, keys) { - var network = ctx.store.network; - console.log("Fetching [%s] messages since [%s]", channel.id, data.lastKnownHash || ""); - if (channel.isPadChat || channel.isTeamChat) { - var txid = Util.uid(); - initRangeRequest(ctx, txid, channel.id, undefined); - var msg0 = [ "GET_HISTORY_RANGE", channel.id, { - count: 10, - txid - } ]; - network.sendto(network.historyKeeper, JSON.stringify(msg0)).then((function() {}), (function(err) { - console.error(err); - })); - return; - } - var proxy = ctx.store.proxy; - var friend = getFriendFromChannel(ctx, channel.id) || {}; - var cfg = { - metadata: { - validateKey: keys ? keys.validateKey : undefined, - owners: [ proxy.edPublic, friend.edPublic ] - }, - lastKnownHash: data.lastKnownHash - }; - var msg = [ "GET_HISTORY", channel.id, cfg ]; - network.sendto(network.historyKeeper, JSON.stringify(msg)).then((function() {}), (function(err) { - console.error(err); - })); - }; - var setChannelHead = function(ctx, id, hash, cb) { - var channel = ctx.channels[id]; - if (channel.isFriendChat) { - var friend = getFriendFromChannel(ctx, id); - if (!friend) { - return void cb({ - error: "NO_SUCH_FRIEND" - }); - } - friend.lastKnownHash = hash; - } else if (channel.isPadChat) ; else if (channel.isTeamChat) ; else { - return void cb({ - error: "NOT_IMPLEMENTED" - }); - } - cb(); - }; - var onChannelReady = function(ctx, chanId) { - var channel = ctx.channels[chanId]; - if (!channel) { - return; - } - channel.ready = true; - channel.onReady.fire(); - }; - var onIdMessage = function(ctx, msg, sender) { - var channel, parsed0; - try { - parsed0 = JSON.parse(msg); - channel = ctx.channels[parsed0.channel]; - if (!channel || channel.wc.members.indexOf(sender) === -1) { - return; - } - } catch (e) { - return void console.error(e, msg); - } - var decryptedMsg = channel.decrypt(parsed0.msg); - if (!decryptedMsg) { - return void console.error("Failed to decrypt message"); - } - var parsed = Util.tryParse(decryptedMsg); - if (!parsed) { - return void console.error(decryptedMsg); - } - if (parsed[0] !== Types.mapId && parsed[0] !== Types.mapIdAck) { - return; - } - if (parsed[2] !== sender || !parsed[1]) { - return; - } - channel.mapId[sender] = parsed[1]; - ctx.emit("JOIN", { - info: parsed[1], - id: channel.id - }, channel.clients); - if (channel.readOnly) { - return; - } - if (parsed[0] !== Types.mapId) { - return; - } - var proxy = ctx.store.proxy || {}; - var myData = createData(proxy); - delete myData.channel; - var rMsg = [ Types.mapIdAck, myData, channel.wc.myID ]; - var rMsgStr = JSON.stringify(rMsg); - var cryptMsg = channel.encrypt(rMsgStr); - var data = { - channel: channel.id, - msg: cryptMsg - }; - var network = ctx.store.network; - network.sendto(sender, JSON.stringify(data)); - }; - var orderMessages = function(channel, new_messages) { - var messages = channel.messages; - new_messages.reverse().forEach((function(msg) { - messages.unshift(msg); - })); - }; - var removeFromFriendList = function(ctx, curvePublic, cb) { - var proxy = ctx.store.proxy; - var friends = proxy.friends; - if (!friends) { - return; - } - delete friends[curvePublic]; - Realtime.whenRealtimeSyncs(ctx.store.realtime, (function() { - ctx.updateMetadata(); - cb(); - })); - }; - var pushMsg = function(ctx, channel, cryptMsg) { - var sig = cryptMsg.slice(0, 64); - if (msgAlreadyKnown(channel, sig)) { - return; - } - var msg = channel.decrypt(cryptMsg); - var parsedMsg = JSON.parse(msg); - var curvePublic; - if (parsedMsg[0] === Types.message) { - var res = { - type: parsedMsg[0], - sig, - author: parsedMsg[1], - time: parsedMsg[2], - text: parsedMsg[3], - channel: channel.id, - name: parsedMsg[4] - }; - channel.messages.push(res); - if (channel.ready) { - ctx.emit("MESSAGE", res, channel.clients); - } - return true; - } - var proxy = ctx.store.proxy; - if (parsedMsg[0] === Types.unfriend) { - curvePublic = parsedMsg[1]; - if (curvePublic === proxy.curvePublic) { - return; - } - removeFromFriendList(ctx, curvePublic, (function() { - channel.wc.leave(Types.unfriend); - var network = ctx.store.network; - if (channel.onReconnect) { - network.off("reconnect", channel.onReconnect); - } - delete ctx.channels[channel.id]; - ctx.emit("UNFRIEND", { - curvePublic, - fromMe: false - }, channel.clients); - })); - return; - } - }; - var onDirectMessage = function(ctx, msg, sender) { - var hk = ctx.store.network.historyKeeper; - if (sender !== hk) { - return void onIdMessage(ctx, msg, sender); - } - var parsed = JSON.parse(msg); - if ((parsed.validateKey || parsed.owners) && parsed.channel) { - return; - } - var channel; - if (/HISTORY_RANGE/.test(parsed[0])) { - var txid = parsed[1]; - var req = getRangeRequest(ctx, txid); - var type = parsed[0]; - if (!req) { - return; - } - channel = ctx.channels[req.chanId]; - if (!channel) { - return; - } - if (!req.cb) { - if (type === "HISTORY_RANGE") { - if (!Array.isArray(parsed[2])) { - return; - } - pushMsg(ctx, channel, parsed[2][4]); - } else if (type === "HISTORY_RANGE_END") { - onChannelReady(ctx, req.chanId); - return deleteRangeRequest(ctx, txid); - } - return; - } - if (type === "HISTORY_RANGE") { - req.messages.push(parsed[2]); - } else if (type === "HISTORY_RANGE_END") { - var decrypted = req.messages.map((function(msg) { - if (msg[2] !== "MSG") { - return; - } - try { - return { - d: JSON.parse(channel.decrypt(msg[4])), - sig: msg[4].slice(0, 64) - }; - } catch (e) { - return void console.log("failed to decrypt"); - } - })).filter((function(decrypted) { - if (!decrypted || !decrypted.d || decrypted.d[0] !== Types.message) { - return; - } - if (msgAlreadyKnown(channel, decrypted.sig)) { - return; - } - return decrypted; - })).map((function(O) { - return { - type: O.d[0], - sig: O.sig, - author: O.d[1], - time: O.d[2], - text: O.d[3], - channel: req.chanId, - name: O.d[4] - }; - })); - orderMessages(channel, decrypted); - req.cb(decrypted); - return deleteRangeRequest(ctx, txid); - } else { - console.log(parsed); - } - return; - } - if (parsed.channel && ctx.channels[parsed.channel]) { - channel = ctx.channels[parsed.channel]; - if (parsed.error === "ECLEARED") { - setChannelHead(ctx, parsed.channel, "", (function() {})); - channel.messages = []; - ctx.emit("CLEAR_CHANNEL", parsed.channel, channel.clients); - return; - } - if (parsed.error && (parsed.error === "EINVAL" || parsed.error === "EUNKNOWN")) { - setChannelHead(ctx, parsed.channel, "", (function() { - getChannelMessagesSince(ctx, channel, {}, {}); - })); - return; - } - if (parsed.state && parsed.state === 1 && parsed.channel) { - return void onChannelReady(ctx, parsed.channel); - } - } - channel = ctx.channels[parsed[3]]; - if (!channel) { - return; - } - pushMsg(ctx, channel, parsed[4]); - }; - var onMessage = function(ctx, msg, sender, chan) { - var channel = ctx.channels[chan.id]; - if (!channel) { - return; - } - pushMsg(ctx, channel, msg); - }; - var onFriendRemoved = function(ctx, curvePublic, chanId) { - var channel = ctx.channels[chanId]; - if (!channel) { - return; - } - if (channel.wc) { - channel.wc.leave(Types.unfriend); - } - var network = ctx.store.network; - if (channel.onReconnect) { - network.off("reconnect", channel.onReconnect); - } - delete ctx.channels[channel.id]; - ctx.emit("UNFRIEND", { - curvePublic, - fromMe: true - }, ctx.friendsClients); - }; - var removeFriend = function(ctx, curvePublic, _cb) { - var cb = Util.once(_cb); - if (typeof cb !== "function") { - return void console.error("NO_CALLBACK"); - } - var proxy = ctx.store.proxy; - var data = getFriend(proxy, curvePublic); - if (!data) { - console.error("friend is not valid"); - return void cb({ - error: "INVALID_FRIEND" - }); - } - var channel = ctx.channels[data.channel]; - if (ctx.store.mailbox && data.curvePublic && data.notifications) { - Messaging.removeFriend(ctx.store, curvePublic, (function(obj) { - if (obj && obj.error) { - return void cb({ - error: obj.error - }); - } - ctx.updateMetadata(); - cb(obj); - })); - return; - } - if (!channel) { - return void cb({ - error: "NO_SUCH_CHANNEL" - }); - } - try { - var msg = [ Types.unfriend, proxy.curvePublic, +new Date ]; - var msgStr = JSON.stringify(msg); - var cryptMsg = channel.encrypt(msgStr); - channel.wc.bcast(cryptMsg).then((function() { - onFriendRemoved(ctx, curvePublic, data.channel); - removeFromFriendList(ctx, curvePublic, (function() { - cb(); - })); - }), (function(err) { - if (err) { - return void cb({ - error: err - }); - } - onFriendRemoved(ctx, curvePublic, data.channel); - removeFromFriendList(ctx, curvePublic, (function() { - cb(); - })); - })); - } catch (e) { - cb({ - error: e - }); - } - }; - var cancelFriend = function(ctx, data, _cb) { - var cb = Util.once(_cb); - if (typeof cb !== "function") { - return void console.error("NO_CALLBACK"); - } - ctx.Store.cancelFriendRequest(data, cb); - }; - var getAllClients = function(ctx) { - var all = []; - Array.prototype.push.apply(all, ctx.friendsClients); - Object.keys(ctx.channels).forEach((function(id) { - Array.prototype.push.apply(all, ctx.channels[id].clients); - })); - return Util.deduplicateString(all); - }; - var muteUser = function(ctx, data, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - var proxy = ctx.store.proxy; - var muted = proxy.mutedUsers = proxy.mutedUsers || {}; - if (muted[data.curvePublic]) { - return void cb(); - } - muted[data.curvePublic] = data; - ctx.emit("UPDATE_MUTED", null, getAllClients(ctx)); - cb(); - }; - var unmuteUser = function(ctx, curvePublic, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - var proxy = ctx.store.proxy; - var muted = proxy.mutedUsers = proxy.mutedUsers || {}; - delete muted[curvePublic]; - ctx.emit("UPDATE_MUTED", null, getAllClients(ctx)); - cb(Object.keys(muted).length); - }; - var getMutedUsers = function(ctx, cb) { - var proxy = ctx.store.proxy; - if (cb) { - return void cb(proxy.mutedUsers || {}); - } - return proxy.mutedUsers || {}; - }; - var openChannel = function(ctx, data) { - var proxy = ctx.store.proxy; - var network = ctx.store.network; - var hk = network.historyKeeper; - var keys = data.keys; - var encryptor = data.encryptor || Curve.createEncryptor(keys); - var channel = { - id: data.channel, - isFriendChat: data.isFriendChat, - isPadChat: data.isPadChat, - isTeamChat: data.isTeamChat, - padChan: data.padChan, - readOnly: data.readOnly, - ready: false, - onReady: Util.mkEvent(true), - sending: false, - messages: [], - clients: data.clients || [], - onUserlistUpdate: data.onUserlistUpdate || function() {}, - mapId: {} - }; - if (data.onReady) { - channel.onReady.reg(data.onReady); - } - channel.encrypt = function(msg) { - if (channel.readOnly) { - return; - } - return encryptor.encrypt(msg); - }; - channel.decrypt = data.decrypt || function(msg) { - return encryptor.decrypt(msg); - }; - var onJoining = function(peer) { - if (peer === hk) { - return; - } - if (channel.readOnly) { - return; - } - if (channel.isPadChat) { - return; - } - var myData = createData(proxy); - delete myData.channel; - var msg = [ Types.mapId, myData, channel.wc.myID ]; - var msgStr = JSON.stringify(msg); - var cryptMsg = channel.encrypt(msgStr); - var data = { - channel: channel.id, - msg: cryptMsg - }; - network.sendto(peer, JSON.stringify(data)); - }; - var onLeaving = function(peer) { - if (peer === hk) { - return; - } - var otherData = channel.mapId[peer]; - if (!otherData) { - return; - } - if (channel.wc.members.some((function(nId) { - return channel.mapId[nId] && channel.mapId[nId].curvePublic === otherData.curvePublic; - }))) { - return; - } - ctx.emit("LEAVE", { - info: otherData, - id: channel.id - }, channel.clients); - }; - var onOpen = function(chan) { - channel.wc = chan; - ctx.channels[data.channel] = channel; - chan.on("message", (function(msg, sender) { - onMessage(ctx, msg, sender, chan); - })); - chan.on("join", onJoining); - chan.on("leave", onLeaving); - getChannelMessagesSince(ctx, channel, data, keys); - }; - network.join(data.channel).then(onOpen, (function(err) { - console.error(err); - })); - channel.onReconnect = function() { - if (channel && channel.stopped) { - return; - } - if (!ctx.channels[data.channel]) { - return; - } - network.join(data.channel).then(onOpen, (function(err) { - console.error(err); - })); - }; - network.on("reconnect", channel.onReconnect); - }; - var sendMessage = function(ctx, id, payload, cb) { - var channel = ctx.channels[id]; - if (!channel) { - return void cb({ - error: "NO_CHANNEL" - }); - } - if (channel.readOnly) { - return void cb({ - error: "FORBIDDEN" - }); - } - var network = ctx.store.network; - if (!network.webChannels.some((function(wc) { - if (wc.id === channel.wc.id) { - return true; - } - }))) { - return void cb({ - error: "NO_SUCH_CHANNEL" - }); - } - var proxy = ctx.store.proxy || {}; - var msg = [ Types.message, proxy.curvePublic, +new Date, payload ]; - if (!channel.isFriendChat) { - var name = proxy[Constants.displayNameKey] || Messages.anonymous + "#" + (proxy.uid || ctx.store.noDriveUid).slice(0, 5); - msg.push(name); - } - var msgStr = JSON.stringify(msg); - var cryptMsg = channel.encrypt(msgStr); - channel.wc.bcast(cryptMsg).then((function() { - pushMsg(ctx, channel, cryptMsg); - cb(); - }), (function(err) { - cb({ - error: err - }); - })); - }; - var getOnlineList = function(ctx, chanId) { - var channel = ctx.channels[chanId]; - if (!channel) { - return; - } - var online = []; - var myData = createData(ctx.store.proxy, false); - online.push(myData.curvePublic); - channel.wc.members.forEach((function(nId) { - if (nId === ctx.store.network.historyKeeper) { - return; - } - var data = channel.mapId[nId] || {}; - if (!data.curvePublic) { - return; - } - if (online.indexOf(data.curvePublic) !== -1) { - return; - } - online.push(data.curvePublic); - })); - return online; - }; - var getStatus = function(ctx, chanId, cb) { - var channel = ctx.channels[chanId]; - if (!channel) { - return void cb("NO_SUCH_CHANNEL"); - } - if (channel.onUserlistUpdate) { - channel.onUserlistUpdate(); - } - var proxy = ctx.store.proxy || {}; - var online = channel.wc.members.some((function(nId) { - if (nId === ctx.store.network.historyKeeper) { - return; - } - var data = channel.mapId[nId] || undefined; - if (!data) { - return false; - } - return data.curvePublic !== proxy.curvePublic; - })); - cb(online); - }; - var getMyInfo = function(ctx, cb) { - var proxy = ctx.store.proxy || {}; - cb({ - curvePublic: proxy.curvePublic, - displayName: proxy[Constants.displayNameKey] - }); - }; - var loadFriend = function(ctx, clientId, friend, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - var chanId = friend.channel; - var channel = ctx.channels[chanId]; - if (channel) { - return void channel.onReady.reg((function() { - if (channel.clients.indexOf(clientId) === -1) { - channel.clients.push(clientId); - } - cb(); - })); - } - var proxy = ctx.store.proxy; - var keys = Curve.deriveKeys(friend.curvePublic, proxy.curvePrivate); - var data = { - keys, - channel: friend.channel, - lastKnownHash: friend.lastKnownHash, - owners: [ proxy.edPublic, friend.edPublic ], - isFriendChat: true, - clients: clientId ? [ clientId ] : ctx.friendsClients, - onReady: cb - }; - openChannel(ctx, data); - }; - var initFriends = function(ctx, clientId, cb) { - var friends = getFriendList(ctx.store.proxy); - nThen((function(waitFor) { - Object.keys(friends).forEach((function(key) { - if (key === "me") { - delete friends.me.channel; - return; - } - var friend = clone(friends[key]); - if (typeof friend !== "object") { - return; - } - if (!friend.channel) { - return; - } - loadFriend(ctx, clientId, friend, waitFor()); - })); - })).nThen((function() { - if (ctx.friendsClients.indexOf(clientId) === -1) { - ctx.friendsClients.push(clientId); - } - cb(); - })); - }; - var getRooms = function(ctx, data, cb) { - var proxy = ctx.store.proxy; - if (data && data.curvePublic) { - var curvePublic = data.curvePublic; - var friend = getFriend(proxy, curvePublic); - if (!friend) { - return void cb({ - error: "NO_SUCH_FRIEND" - }); - } - var channel = ctx.channels[friend.channel]; - if (!channel) { - return void cb({ - error: "NO_SUCH_CHANNEL" - }); - } - return void cb([ { - id: channel.id, - isFriendChat: true, - name: friend.displayName, - lastKnownHash: friend.lastKnownHash, - curvePublic: friend.curvePublic, - messages: channel.messages - } ]); - } - if (data && data.padChat) { - var pCChannel = ctx.channels[data.padChat]; - if (!pCChannel) { - return void cb({ - error: "NO_SUCH_CHANNEL" - }); - } - return void cb([ { - id: pCChannel.id, - isPadChat: true, - messages: pCChannel.messages - } ]); - } - if (data && data.teamChat) { - var tCChannel = ctx.channels[data.teamChat]; - if (!tCChannel) { - return void cb({ - error: "NO_SUCH_CHANNEL" - }); - } - return void cb([ { - id: tCChannel.id, - isTeamChat: true, - messages: tCChannel.messages - } ]); - } - var rooms = Object.keys(ctx.channels).map((function(id) { - var r = ctx.channels[id]; - var name, lastKnownHash, curvePublic; - if (r.isFriendChat) { - var friend = getFriendFromChannel(ctx, id); - if (!friend) { - return null; - } - name = friend.displayName; - lastKnownHash = friend.lastKnownHash; - curvePublic = friend.curvePublic; - } else if (r.isPadChat) { - return; - } else if (r.isTeamChat) { - return; - } else ; - return { - id: r.id, - isFriendChat: r.isFriendChat, - name, - lastKnownHash, - curvePublic, - messages: r.messages - }; - })).filter((function(x) { - return x; - })); - cb(rooms); - }; - var getUserList = function(ctx, data, cb) { - var room = ctx.channels[data.id]; - if (!room) { - return void cb({ - error: "NO_SUCH_CHANNEL" - }); - } - if (room.isFriendChat) { - var friend = getFriendFromChannel(ctx, data.id); - if (!friend) { - return void cb({ - error: "NO_SUCH_FRIEND" - }); - } - cb([ friend ]); - } else { - cb([]); - } - }; - var openPadChat = function(ctx, clientId, data, _cb) { - var chanId = data.channel; - var cb = Util.once(Util.mkAsync((function() { - ctx.emit("PADCHAT_READY", chanId, [ clientId ]); - _cb(); - }))); - var channel = ctx.channels[chanId]; - if (channel) { - return void channel.onReady.reg((function() { - if (channel.clients.indexOf(clientId) === -1) { - channel.clients.push(clientId); - } - cb(); - })); - } - var secret = data.secret; - if (secret.keys.cryptKey) { - secret.keys.cryptKey = convertToUint8(secret.keys.cryptKey); - } - var encryptor = Crypto.createEncryptor(secret.keys); - var vKey = secret.keys && secret.keys.validateKey || ctx.validateKeys[secret.channel]; - var chanData = { - padChan: data.secret && data.secret.channel, - readOnly: typeof secret.keys === "object" && !secret.keys.validateKey, - encryptor, - channel: data.channel, - isPadChat: true, - decrypt: function(msg) { - return encryptor.decrypt(msg, vKey); - }, - clients: [ clientId ], - onReady: cb - }; - openChannel(ctx, chanData); - }; - var openTeamChat = function(ctx, clientId, data, onUpdate, _cb) { - var chatData = data; - var chanId = chatData.channel; - var secret = chatData.secret; - if (!chanId || !secret) { - return void _cb({ - error: "EINVAL" - }); - } - var cb = Util.once(Util.mkAsync((function() { - ctx.emit("TEAMCHAT_READY", chanId, [ clientId ]); - _cb({ - readOnly: typeof secret.keys === "object" && !secret.keys.validateKey, - channel: chanId - }); - }))); - var channel = ctx.channels[chanId]; - if (channel) { - return void channel.onReady.reg((function() { - if (channel.clients.indexOf(clientId) === -1) { - channel.clients.push(clientId); - } - cb(); - })); - } - if (secret.keys.cryptKey) { - secret.keys.cryptKey = convertToUint8(secret.keys.cryptKey); - } - var encryptor = Crypto.createEncryptor(secret.keys); - var vKey = secret.keys && secret.keys.validateKey || chatData.validateKey; - var chanData = { - teamId: data.teamId, - readOnly: typeof secret.keys === "object" && !secret.keys.validateKey, - encryptor, - channel: chanId, - isTeamChat: true, - decrypt: function(msg) { - return encryptor.decrypt(msg, vKey); - }, - clients: [ clientId ], - onUserlistUpdate: onUpdate, - onReady: cb - }; - openChannel(ctx, chanData); - }; - var clearOwnedChannel = function(ctx, id, cb) { - var channel = ctx.channels[id]; - if (!channel) { - return void cb({ - error: "NO_CHANNEL" - }); - } - if (!ctx.store.rpc) { - return void cb({ - error: "RPC_NOT_READY" - }); - } - ctx.store.rpc.clearOwnedChannel(id, (function(err) { - cb({ - error: err - }); - if (!err) { - channel.messages = []; - ctx.emit("CLEAR_CHANNEL", id, channel.clients); - } - })); - }; - var removeClient = function(ctx, cId) { - var friendsIdx = ctx.friendsClients.indexOf(cId); - if (friendsIdx !== -1) { - ctx.friendsClients.splice(friendsIdx, 1); - } - Object.keys(ctx.channels).forEach((function(id) { - var channel = ctx.channels[id]; - var clients = channel.clients; - var idx = clients.indexOf(cId); - if (idx !== -1) { - clients.splice(idx, 1); - } - if (clients.length === 0) { - if (channel.wc) { - channel.wc.leave(); - } - var network = ctx.store.network; - if (channel.onReconnect) { - network.off("reconnect", channel.onReconnect); - } - channel.stopped = true; - delete ctx.channels[id]; - return true; - } - })); - }; - Msg.init = function(cfg, waitFor, emit) { - var messenger = {}; - var store = cfg.store; - if (store.messenger) { - store.messenger.addListener(); - return store.messenger; - } - if (!PadTypes.isAvailable("contacts")) { - return; - } - var ctx = { - store, - Store: cfg.Store, - updateMetadata: cfg.updateMetadata, - pinPads: cfg.pinPads, - emit, - friendsClients: [], - channels: {}, - validateKeys: {}, - range_requests: {} - }; - messenger.addListener = function() { - if (store.proxy) { - store.proxy.on("change", [ "mutedUsers" ], (function() { - ctx.emit("UPDATE_MUTED", null, getAllClients(ctx)); - })); - } - }; - messenger.addListener(); - let onNetwork = Util.once((_network => { - const network = ctx.store.network || _network; - network.on("message", (function(msg, sender) { - onDirectMessage(ctx, msg, sender); - })); - network.on("disconnect", (function() { - ctx.emit("DISCONNECT", null, getAllClients(ctx)); - })); - network.on("reconnect", (function() { - ctx.emit("RECONNECT", null, getAllClients(ctx)); - })); - })); - store.networkPromise?.then(onNetwork); - if (ctx.store.network) { - onNetwork(); - } - messenger.onFriendUpdate = function(curve) { - var friend = getFriend(store.proxy, curve); - if (!friend || !friend.channel) { - return; - } - var chan = ctx.channels[friend.channel]; - if (chan) { - ctx.emit("UPDATE_DATA", { - info: clone(friend), - channel: friend.channel - }, chan.clients); - } - }; - messenger.onFriendAdded = function(friendData) { - if (!ctx.friendsClients.length) { - return; - } - var friend = getFriend(ctx.store.proxy, friendData.curvePublic); - if (typeof friend !== "object") { - return; - } - var channel = friend.channel; - if (!channel) { - return; - } - var chanId = friend.channel; - var chan = ctx.channels[chanId]; - if (chan) { - return; - } - loadFriend(ctx, null, friend, (function() { - emit("FRIEND", { - curvePublic: friend.curvePublic - }, ctx.friendsClients); - })); - }; - messenger.onFriendRemoved = function(curvePublic, chanId) { - onFriendRemoved(ctx, curvePublic, chanId); - }; - messenger.getOnlineList = function(chanId) { - return getOnlineList(ctx, chanId); - }; - messenger.storeValidateKey = function(chan, key) { - ctx.validateKeys[chan] = key; - }; - messenger.leavePad = function(padChan) { - delete ctx.validateKeys[padChan]; - Object.keys(ctx.channels).some((function(chatChan) { - var channel = ctx.channels[chatChan]; - if (channel.padChan !== padChan) { - return; - } - if (channel.wc) { - channel.wc.leave(); - } - var network = ctx.store.network; - if (channel.onReconnect) { - network.off("reconnect", channel.onReconnect); - } - channel.stopped = true; - delete ctx.channels[chatChan]; - return true; - })); - }; - messenger.openTeamChat = function(data, onUpdate, cId, cb) { - openTeamChat(ctx, cId, data, onUpdate, cb); - }; - messenger.removeClient = function(clientId) { - removeClient(ctx, clientId); - }; - messenger.execCommand = function(clientId, obj, cb) { - var cmd = obj.cmd; - var data = obj.data; - if (cmd === "INIT_FRIENDS") { - return void initFriends(ctx, clientId, cb); - } - if (cmd === "GET_ROOMS") { - return void getRooms(ctx, data, cb); - } - if (cmd === "GET_MUTED_USERS") { - return void getMutedUsers(ctx, cb); - } - if (cmd === "GET_USERLIST") { - return void getUserList(ctx, data, cb); - } - if (cmd === "OPEN_PAD_CHAT") { - return void openPadChat(ctx, clientId, data, cb); - } - if (cmd === "GET_MY_INFO") { - return void getMyInfo(ctx, cb); - } - if (cmd === "REMOVE_FRIEND") { - return void removeFriend(ctx, data, cb); - } - if (cmd === "CANCEL_FRIEND") { - return void cancelFriend(ctx, data, cb); - } - if (cmd === "MUTE_USER") { - return void muteUser(ctx, data, cb); - } - if (cmd === "UNMUTE_USER") { - return void unmuteUser(ctx, data, cb); - } - if (cmd === "GET_STATUS") { - return void getStatus(ctx, data, cb); - } - if (cmd === "GET_MORE_HISTORY") { - return void getMoreHistory(ctx, data.id, data.sig, data.count, cb); - } - if (cmd === "SEND_MESSAGE") { - return void sendMessage(ctx, data.id, data.content, cb); - } - if (cmd === "SET_CHANNEL_HEAD") { - return void setChannelHead(ctx, data.id, data.sig, cb); - } - if (cmd === "CLEAR_OWNED_CHANNEL") { - return void clearOwnedChannel(ctx, data, cb); - } - }; - return messenger; - }; - return Msg; - }; - if (module.exports) { - module.exports = factory(requireCrypto(), requireCommonHash(), requireCommonUtil(), requireCommonRealtime(), requireCommonMessaging(), requireCommonConstants(), undefined, requirePadTypes(), requireNthen()); - } - })(); - })(messenger); - return messenger.exports; - } - var history = { - exports: {} - }; - var hasRequiredHistory; - function requireHistory() { - if (hasRequiredHistory) return history.exports; - hasRequiredHistory = 1; - (function(module) { - (() => { - const factory = (Util, Hash, UserObject, nThen) => { - var History = {}; - var commands = {}; - var getAccountChannels = function(ctx) { - var channels = []; - var edPublic = Util.find(ctx.store, [ "proxy", "edPublic" ]); - var driveOwned = (Util.find(ctx.store, [ "driveMetadata", "owners" ]) || []).indexOf(edPublic) !== -1; - if (driveOwned) { - channels.push(ctx.store.driveChannel); - } - var profile = ctx.store.proxy.profile; - if (profile) { - var profileChan = profile.edit ? Hash.hrefToHexChannelId("/profile/#" + profile.edit, null) : null; - if (profileChan) { - channels.push(profileChan); - } - } - if (ctx.store.proxy.todo) { - channels.push(Hash.hrefToHexChannelId("/todo/#" + ctx.store.proxy.todo, null)); - } - var mailboxes = ctx.store.proxy.mailboxes; - if (mailboxes) { - var mList = Object.keys(mailboxes).map((function(m) { - return { - lastKnownHash: mailboxes[m].lastKnownHash, - channel: mailboxes[m].channel - }; - })); - Array.prototype.push.apply(channels, mList); - } - var sf = ctx.store.proxy[UserObject.SHARED_FOLDERS]; - if (sf) { - var sfChannels = Object.keys(sf).map((function(fId) { - var data = sf[fId]; - if (!data || !data.owners) { - return; - } - var isOwner = Array.isArray(data.owners) && data.owners.indexOf(edPublic) !== -1; - if (!isOwner) { - return; - } - return data.channel; - })).filter(Boolean); - Array.prototype.push.apply(channels, sfChannels); - } - return channels; - }; - let getTeamChannels = function(ctx, teamId) { - let team = Util.find(ctx.store, [ "proxy", "teams", teamId ]); - if (!team) { - return []; - } - let channels = [ team.channel ]; - let roster = team.keys.roster; - channels.push({ - channel: roster.channel, - lastKnownHash: roster.lastKnownHash - }); - return channels; - }; - var getEdPublic = function(ctx, teamId) { - if (!teamId) { - return Util.find(ctx.store, [ "proxy", "edPublic" ]); - } - var teamData = Util.find(ctx, [ "store", "proxy", "teams", teamId ]); - return Util.find(teamData, [ "keys", "drive", "edPublic" ]); - }; - var getRpc = function(ctx, teamId) { - if (!teamId) { - return ctx.store.rpc; - } - var teams = ctx.store.modules["team"]; - if (!teams) { - return; - } - var team = teams.getTeam(teamId); - if (!team) { - return; - } - return team.rpc; - }; - var getHistoryData = function(ctx, channel, lastKnownHash, teamId, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - var edPublic = getEdPublic(ctx, teamId); - var Store = ctx.Store; - var total = 0; - var history = 0; - var metadata = 0; - var hash; - nThen((function(waitFor) { - Store.getFileSize(null, { - channel - }, waitFor((function(obj) { - if (obj && obj.error) { - waitFor.abort(); - return void cb(obj); - } - if (typeof obj.size === "undefined") { - waitFor.abort(); - return void cb({ - error: "ENOENT" - }); - } - total = obj.size; - }))); - Store.getHistory(null, { - channel, - lastKnownHash - }, waitFor((function(obj) { - if (obj && obj.error) { - waitFor.abort(); - return void cb(obj); - } - if (!Array.isArray(obj)) { - waitFor.abort(); - return void cb({ - error: "EINVAL" - }); - } - if (!obj.length) { - return; - } - hash = obj[0].hash; - var messages = obj.map((function(data) { - return data.msg; - })); - history = messages.join("\n").length; - })), true); - Store.getPadMetadata(null, { - channel - }, waitFor((function(obj) { - if (obj && obj.error) { - return; - } - if (!obj || typeof obj !== "object") { - return; - } - metadata = JSON.stringify(obj).length; - if (!obj || !Array.isArray(obj.owners) || obj.owners.indexOf(edPublic) === -1) { - waitFor.abort(); - return void cb({ - error: "INSUFFICIENT_PERMISSIONS" - }); - } - }))); - })).nThen((function() { - cb({ - size: total - metadata - history, - hash - }); - })); - }; - commands.GET_HISTORY_SIZE = function(ctx, data, cId, cb) { - if (!ctx.store.loggedIn || !ctx.store.rpc) { - return void cb({ - error: "INSUFFICIENT_PERMISSIONS" - }); - } - var channels = data.channels; - if (!Array.isArray(channels)) { - return void cb({ - error: "EINVAL" - }); - } - var warning = []; - if (data.account) { - channels = getAccountChannels(ctx); - } else if (data.team) { - channels = getTeamChannels(ctx, data.team); - } - var size = 0; - var res = []; - nThen((function(waitFor) { - channels.forEach((function(chan) { - var channel = chan; - var lastKnownHash; - if (typeof chan === "object" && chan.channel) { - channel = chan.channel; - lastKnownHash = chan.lastKnownHash; - } - getHistoryData(ctx, channel, lastKnownHash, data.teamId, waitFor((function(obj) { - if (obj && obj.error) { - warning.push(obj.error); - return; - } - size += obj.size; - if (!obj.hash) { - return; - } - res.push({ - channel, - hash: obj.hash - }); - }))); - })); - })).nThen((function() { - cb({ - warning: warning.length ? warning : undefined, - channels: res, - size - }); - })); - }; - commands.TRIM_HISTORY = function(ctx, data, cId, cb) { - if (!ctx.store.loggedIn || !ctx.store.rpc) { - return void cb({ - error: "INSUFFICIENT_PERMISSIONS" - }); - } - var channels = data.channels; - if (!Array.isArray(channels)) { - return void cb({ - error: "EINVAL" - }); - } - var rpc = getRpc(ctx, data.teamId); - if (!rpc) { - return void cb({ - error: "ENORPC" - }); - } - var warning = []; - nThen((function(waitFor) { - channels.forEach((function(obj) { - rpc.trimHistory(obj, waitFor((function(err) { - if (err) { - warning.push(err); - return; - } - }))); - })); - })).nThen((function() { - if (channels.length === 1 && warning.length) { - return void cb({ - error: warning[0] - }); - } - cb({ - warning: warning.length ? warning : undefined - }); - })); - }; - History.init = function(cfg, waitFor, emit) { - var history = {}; - if (!cfg.store) { - return; - } - var ctx = { - store: cfg.store, - Store: cfg.Store, - pinPads: cfg.pinPads, - updateMetadata: cfg.updateMetadata, - emit - }; - history.execCommand = function(clientId, obj, cb) { - var cmd = obj.cmd; - var data = obj.data; - try { - commands[cmd](ctx, data, clientId, cb); - } catch (e) { - console.error(e); - } - }; - return history; - }; - return History; - }; - if (module.exports) { - module.exports = factory(requireCommonUtil(), requireCommonHash(), requireUserObject(), requireNthen()); - } - })(); - })(history); - return history.exports; - } - var calendar$1 = { - exports: {} - }; - var recurrence = { - exports: {} - }; - var hasRequiredRecurrence; - function requireRecurrence() { - if (hasRequiredRecurrence) return recurrence.exports; - hasRequiredRecurrence = 1; - (function(module) { - (() => { - const factory = Util => { - var Rec = {}; - const window = globalThis; - var debug = function() {}; - var getWeekNo = Rec.getWeekNo = function(date, wkst) { - if (typeof wkst !== "number") { - wkst = 1; - } - var newYear = new Date(date.getFullYear(), 0, 1); - var day = newYear.getDay() - wkst; - day = day >= 0 ? day : day + 7; - var daynum = Math.floor((date.getTime() - newYear.getTime()) / 864e5) + 1; - var weeknum; - if (day < 4) { - weeknum = Math.floor((daynum + day - 1) / 7) + 1; - if (weeknum > 52) { - var nYear = new Date(date.getFullYear() + 1, 0, 1); - var nday = nYear.getDay() - wkst; - nday = nday >= 0 ? nday : nday + 7; - weeknum = nday < 4 ? 1 : 53; - } - } else { - weeknum = Math.floor((daynum + day - 1) / 7); - } - return weeknum; - }; - var getYearDay = function(date) { - var start = new Date(date.getFullYear(), 0, 0); - var diff = date - start + (start.getTimezoneOffset() - date.getTimezoneOffset()) * 60 * 1e3; - var oneDay = 1e3 * 60 * 60 * 24; - return Math.floor(diff / oneDay); - }; - var setYearDay = function(date, day) { - if (typeof day !== "number" || Math.abs(day) < 1 || Math.abs(day) > 366) { - return; - } - if (day < 0) { - var max = getYearDay(new Date(date.getFullYear(), 11, 31)); - day = max + day + 1; - } - date.setMonth(0); - date.setDate(day); - return true; - }; - var getEndData = function(s, e) { - if (s > e) { - return void console.error("Wrong data"); - } - var days; - if (e.getFullYear() === s.getFullYear()) { - days = getYearDay(e) - getYearDay(s); - } else { - var tmp = new Date(s.getFullYear(), 11, 31); - var d1 = getYearDay(tmp) - getYearDay(s); - var de = getYearDay(e); - days = d1 + de; - while (tmp.getFullYear() + 1 < e.getFullYear()) { - tmp.setFullYear(tmp.getFullYear() + 1); - days += getYearDay(tmp); - } - } - return { - h: e.getHours(), - m: e.getMinutes(), - days - }; - }; - var setEndData = function(s, e, data) { - e.setTime(+s); - if (!data) { - return; - } - e.setHours(data.h); - e.setMinutes(data.m); - e.setSeconds(0); - e.setDate(s.getDate() + data.days); - }; - var DAYORDER = Rec.DAYORDER = [ "SU", "MO", "TU", "WE", "TH", "FR", "SA" ]; - var getDayData = function(str) { - var pos = Number(str.slice(0, -2)); - var day = DAYORDER.indexOf(str.slice(-2)); - return pos ? [ pos, day ] : day; - }; - var goToFirstWeekDay = function(date, wkst) { - var d = date.getDay(); - wkst = typeof wkst === "number" ? wkst : 1; - if (d >= wkst) { - date.setDate(date.getDate() - (d - wkst)); - } else { - date.setDate(date.getDate() - (7 + d - wkst)); - } - }; - var getDateStr = function(date) { - return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate(); - }; - var FREQ = {}; - FREQ["daily"] = function(s, i) { - s.setDate(s.getDate() + i); - }; - FREQ["weekly"] = function(s, i) { - s.setDate(s.getDate() + i * 7); - }; - FREQ["monthly"] = function(s, i) { - s.setMonth(s.getMonth() + i); - }; - FREQ["yearly"] = function(s, i) { - s.setFullYear(s.getFullYear() + i); - }; - var EXPAND = {}; - EXPAND["month"] = function(dateS, origin, b) { - var oS = new Date(origin.start); - var a = dateS.getMonth() + 1; - var toAdd = (b - a + 12) % 12; - var m = dateS.getMonth() + toAdd; - dateS.setMonth(m); - dateS.setDate(oS.getDate()); - if (dateS.getMonth() !== m) { - return; - } - return true; - }; - EXPAND["weekno"] = function(dateS, origin, week, rule) { - var wkst = rule && rule.wkst; - if (typeof wkst !== "number") { - wkst = 1; - } - var oS = new Date(origin.start); - var lastD = new Date(dateS.getFullYear(), 11, 31); - var lastW = getWeekNo(lastD, wkst); - var doubleOne = lastW === 1; - if (lastW === 1) { - lastW = 52; - } - var a = getWeekNo(dateS, wkst); - if (!week || week > lastW) { - return false; - } - if (week < 0) { - week = lastW + week + 1; - } - var toAdd = week - a; - var weekS = new Date(+dateS); - weekS.setDate(weekS.getDate() + toAdd * 7); - goToFirstWeekDay(weekS, wkst); - var all = "aaaaaaa".split("").map((function(o, i) { - var date = new Date(+weekS); - date.setDate(date.getDate() + i); - if (date.getFullYear() !== dateS.getFullYear()) { - return; - } - return date.toLocaleDateString() !== oS.toLocaleDateString() && date; - })).filter(Boolean); - if (week === 1 && doubleOne) { - goToFirstWeekDay(lastD, wkst); - "aaaaaaa".split("").some((function(o, i) { - var date = new Date(+lastD); - date.setDate(date.getDate() + i); - if (date.toLocaleDateString() === oS.toLocaleDateString()) { - return; - } - if (date.getFullYear() > dateS.getFullYear()) { - return true; - } - all.push(date); - })); - } - return all.length ? all : undefined; - }; - EXPAND["yearday"] = function(dateS, origin, b) { - var y = dateS.getFullYear(); - var state = setYearDay(dateS, b); - if (!state) { - return; - } - if (dateS.getFullYear() !== y) { - return; - } - return true; - }; - EXPAND["monthday"] = function(dateS, origin, b, rule) { - if (typeof b !== "number" || Math.abs(b) < 1 || Math.abs(b) > 31) { - return false; - } - var setMonthDay = function(date, day) { - var m = date.getMonth(); - if (day < 0) { - var tmp = new Date(date.getFullYear(), date.getMonth() + 1, 0); - day = tmp.getDate() + day + 1; - } - date.setDate(day); - return date.getMonth() === m; - }; - if (rule.freq === "monthly") { - return setMonthDay(dateS, b); - } - var all = "aaaaaaaaaaaa".split("").map((function(o, i) { - var date = new Date(dateS.getFullYear(), i, 1); - var ok = setMonthDay(date, b); - return ok ? date : undefined; - })).filter(Boolean); - return all.length ? all : undefined; - }; - EXPAND["day"] = function(dateS, origin, b, rule) { - var day = getDayData(b); - var pos; - if (Array.isArray(day)) { - pos = day[0]; - day = day[1]; - } - var all = []; - if (![ 0, 1, 2, 3, 4, 5, 6 ].includes(day)) { - return false; - } - var filterPos = function(m) { - if (!pos) { - return; - } - var _all = []; - "aaaaaaaaaaaa".split("").some((function(a, i) { - if (typeof m !== "undefined" && i !== m) { - return; - } - var _pos; - var tmp = all.filter((function(d) { - return d.getMonth() === i; - })); - if (pos < 0) { - _pos = tmp.length + pos; - } else { - _pos = pos - 1; - } - _all.push(tmp[_pos]); - return typeof m !== "undefined" && i === m; - })); - all = _all.filter(Boolean); - }; - var tmp; - if (rule.freq === "yearly") { - tmp = new Date(+dateS); - var y = dateS.getFullYear(); - while (tmp.getDay() !== day) { - tmp.setDate(tmp.getDate() + 1); - } - while (tmp.getFullYear() === y) { - all.push(new Date(+tmp)); - tmp.setDate(tmp.getDate() + 7); - } - filterPos(); - return all; - } - if (rule.freq === "monthly") { - tmp = new Date(+dateS); - var m = dateS.getMonth(); - while (tmp.getDay() !== day) { - tmp.setDate(tmp.getDate() + 1); - } - while (tmp.getMonth() === m) { - all.push(new Date(+tmp)); - tmp.setDate(tmp.getDate() + 7); - } - filterPos(m); - return all; - } - if (rule.freq === "weekly") { - while (dateS.getDay() !== day) { - dateS.setDate(dateS.getDate() + 1); - } - } - return true; - }; - var LIMIT = {}; - LIMIT["month"] = function(events, rule) { - return events.filter((function(s) { - return rule.includes(s.getMonth() + 1); - })); - }; - LIMIT["weekno"] = function(events, weeks, rules) { - return events.filter((function(s) { - var wkst = rules && rules.wkst; - if (typeof wkst !== "number") { - wkst = 1; - } - var lastD = new Date(s.getFullYear(), 11, 31); - var lastW = getWeekNo(lastD, wkst); - if (lastW === 1) { - lastW = 52; - } - var w = getWeekNo(s, wkst); - return weeks.some((function(week) { - if (week > 0) { - return week === w; - } - return w === lastW + week + 1; - })); - })); - }; - LIMIT["yearday"] = function(events, days) { - return events.filter((function(s) { - var d = getYearDay(s); - var max = getYearDay(new Date(s.getFullYear(), 11, 31)); - return days.some((function(day) { - if (day > 0) { - return day === d; - } - return d === max + day + 1; - })); - })); - }; - LIMIT["monthday"] = function(events, rule) { - return events.filter((function(s) { - var r = Util.clone(rule); - r = r.map((function(b) { - if (b < 0) { - var tmp = new Date(s.getFullYear(), s.getMonth() + 1, 0); - b = tmp.getDate() + b + 1; - } - return b; - })); - return r.includes(s.getDate()); - })); - }; - LIMIT["day"] = function(events, days, rules) { - return events.filter((function(s) { - var dayStr = s.toLocaleDateString(); - var type = "yearly"; - if (rules.freq === "monthly" || rules.freq === "yearly" && rules.by && rules.by.month) { - type = "monthly"; - } - return days.some((function(r) { - var day = getDayData(r); - var pos; - if (Array.isArray(day)) { - pos = day[0]; - day = day[1]; - } - if (!pos) { - return s.getDay() === day; - } - var d = new Date(s.getFullYear(), s.getMonth(), 1); - if (type === "yearly") { - d.setMonth(0); - } - var res = EXPAND["day"](d, {}, r, { - freq: type - }); - return res.some((function(date) { - return date.toLocaleDateString() === dayStr; - })); - })); - })); - }; - LIMIT["setpos"] = function(events, rule) { - var init = events.slice(); - var rules = Util.deduplicateString(rule.slice().map((function(n) { - if (n > 0) { - return n - 1; - } - if (n === 0) { - return; - } - return init.length + n; - }))); - return events.filter((function(ev) { - var idx = init.indexOf(ev); - return rules.includes(idx); - })); - }; - var BYORDER = [ "month", "weekno", "yearday", "monthday", "day" ]; - var BYDAYORDER = [ "month", "monthday", "day" ]; - Rec.getMonthId = function(d) { - return d.getFullYear() + "-" + d.getMonth(); - }; - var cache = window.CP_calendar_cache = {}; - var recurringAcross = {}; - Rec.resetCache = function() { - cache = window.CP_calendar_cache = {}; - recurringAcross = {}; - }; - var iterate = function(rule, _origin, s) { - var origin = Util.clone(_origin); - var oS = new Date(origin.start); - var id = origin.id.split("|")[0]; - var uid = s.toLocaleDateString(); - cache[id] = cache[id] || {}; - var inter = rule.interval || 1; - var freq = rule.freq; - var all = []; - var limit = function(byrule, n) { - all = LIMIT[byrule](all, n, rule); - }; - var expand = function(byrule) { - return function(n) { - var _s = new Date(+s); - if (rule.freq === "yearly") { - _s.setMonth(0); - _s.setDate(1); - } else if (rule.freq === "monthly") { - _s.setDate(1); - } else if (rule.freq === "weekly") { - goToFirstWeekDay(_s, rule.wkst); - } else if (rule.freq === "daily") ; - var add = EXPAND[byrule](_s, origin, n, rule); - if (!add) { - return; - } - if (Array.isArray(add)) { - add = add.filter((function(dateS) { - return dateS.toLocaleDateString() !== oS.toLocaleDateString(); - })); - Array.prototype.push.apply(all, add); - } else { - if (_s.toLocaleDateString() === oS.toLocaleDateString()) { - return; - } - all.push(_s); - } - }; - }; - var it = Util.once((function() { - FREQ[freq](s, inter); - })); - var addDefault = function() { - if (freq === "monthly") { - s.setDate(15); - } else if (freq === "yearly" && oS.getMonth() === 1 && oS.getDate() === 29) { - s.setDate(28); - } - it(); - var _s = new Date(+s); - if (freq === "monthly" || freq === "yearly") { - _s.setDate(oS.getDate()); - if (_s.getDate() !== oS.getDate()) { - return; - } - if (freq === "yearly" && _s.getMonth() !== oS.getMonth()) { - return; - } - } - all.push(_s); - }; - if (Array.isArray(cache[id][uid])) { - debug("Get cache", id, uid); - if (freq === "monthly") { - s.setDate(15); - } else if (freq === "yearly" && oS.getMonth() === 1 && oS.getDate() === 29) { - s.setDate(28); - } - it(); - return cache[id][uid]; - } - if (rule.by && freq === "yearly") { - var order = BYORDER.slice(); - var monthLimit = false; - if (rule.by.weekno || rule.by.yearday || rule.by.monthday || rule.by.day) { - order.shift(); - monthLimit = true; - } - var first = true; - order.forEach((function(_order) { - var r = rule.by[_order]; - if (!r) { - return; - } - if (first) { - r.forEach(expand(_order)); - first = false; - } else if (_order === "day") { - if (rule.by.yearday || rule.by.monthday || rule.by.weekno) { - limit("day", rule.by.day); - } else { - rule.by.day.forEach(expand("day")); - } - } else { - limit(_order, r); - } - })); - if (rule.by.month && monthLimit) { - limit("month", rule.by.month); - } - } - if (rule.by && freq === "monthly") { - if (!rule.by.monthday && !rule.by.day) { - addDefault(); - } else if (rule.by.monthday) { - rule.by.monthday.forEach(expand("monthday")); - } else if (rule.by.day) { - rule.by.day.forEach(expand("day")); - } - if (rule.by.month) { - limit("month", rule.by.month); - } - if (rule.by.day && rule.by.monthday) { - limit("day", rule.by.day); - } - } - if (rule.by && freq === "weekly") { - if (!rule.by.day) { - addDefault(); - } else { - rule.by.day.forEach(expand("day")); - } - if (rule.by.month) { - limit("month", rule.by.month); - } - } - if (rule.by && freq === "daily") { - addDefault(); - BYDAYORDER.forEach((function(_order) { - var r = rule.by[_order]; - if (!r) { - return; - } - limit(_order, r); - })); - } - all.sort((function(a, b) { - return a - b; - })); - if (rule.by && rule.by.setpos) { - limit("setpos", rule.by.setpos); - } - if (!rule.by || !Object.keys(rule.by).length) { - addDefault(); - } else { - it(); - } - var done = []; - all = all.filter((function(newS) { - var start = new Date(+newS).toLocaleDateString(); - if (done.includes(start)) { - return false; - } - done.push(start); - return true; - })); - debug("Set cache", id, uid); - cache[id][uid] = all; - return all; - }; - var getNextRules = function(obj) { - if (!obj.recUpdate) { - return []; - } - var _allRules = {}; - var _obj = obj.recUpdate.from; - Object.keys(_obj || {}).forEach((function(d) { - var u = _obj[d]; - if (u.recurrenceRule) { - _allRules[d] = u.recurrenceRule; - } - })); - return Object.keys(_allRules).sort((function(a, b) { - return Number(a) - Number(b); - })).map((function(k) { - var r = Util.clone(_allRules[k]); - if (!FREQ[r.freq]) { - return; - } - if (r.interval && r.interval < 1) { - return; - } - r._start = Number(k); - return r; - })).filter(Boolean); - }; - var fixTimeZone = function(evTimeZone, origin, target) { - var getOffset = function(date, tz) { - let iso = date.toLocaleString("en-CA", { - timeZone: tz, - hour12: false - }).replace(", ", "T"); - iso += "." + date.getMilliseconds().toString().padStart(3, "0"); - let utcDate = new Date(iso + "Z"); - return -(utcDate - date); - }; - var myTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; - var offset = getOffset(origin, evTimeZone) - getOffset(target, evTimeZone); - var myOffset = getOffset(origin, myTimeZone) - getOffset(target, myTimeZone); - return myOffset - offset; - }; - Rec.getRecurring = function(months, events) { - if (window.CP_DEV_MODE) { - debug = console.warn; - } - var toAdd = []; - months.forEach((function(monthId) { - var ms = monthId.split("-"); - var _startMonth = new Date(ms[0], ms[1]); - var _endMonth = new Date(+_startMonth); - _endMonth.setMonth(_endMonth.getMonth() + 1); - _endMonth.setMilliseconds(-1); - debug("Compute month", _startMonth.toLocaleDateString()); - var rec = events || []; - rec.forEach((function(obj) { - var _start = new Date(obj.start); - var _end = new Date(obj.end); - var _origin = obj; - var rule = obj.recurrenceRule; - if (!rule) { - return; - } - var nextRules = getNextRules(obj); - var nextRule = nextRules.shift(); - if (_start >= _endMonth) { - return; - } - var until = rule.until; - var _nextRules = nextRules.slice(); - var _nextRule = nextRule; - while (_nextRule && _nextRule._start && _nextRule._start < _startMonth) { - until = nextRule.until; - _nextRule = _nextRules.shift(); - } - if (until < _startMonth) { - return; - } - var endData = getEndData(_start, _end); - if (rule.interval && rule.interval < 1) { - return; - } - if (!FREQ[rule.freq]) { - return; - } - debug("Iterate over", obj.title, obj); - debug("Use rule", rule); - var count = rule.count; - var c = 1; - var next = function(start) { - var evS = new Date(+start); - if (count && c >= count) { - return; - } - debug("Start iteration", evS.toLocaleDateString()); - var _toAdd = iterate(rule, obj, evS); - debug("Iteration results", JSON.stringify(_toAdd.map((function(o) { - return new Date(o).toLocaleDateString(); - })))); - if (!_toAdd.length) { - if (evS.getFullYear() < _startMonth.getFullYear() || evS < _endMonth) { - return void next(evS); - } - return; - } - var stop = false; - var newrule = false; - _toAdd.some((function(_newS) { - var _ev = Util.clone(obj); - _ev.id = _origin.id + "|" + +_newS; - var _evS = new Date(+_newS); - var _evE = new Date(+_newS); - setEndData(_evS, _evE, endData); - _ev.start = +_evS; - _ev.end = +_evE; - _ev._count = c; - if (_ev.isAllDay && _ev.startDay) { - _ev.startDay = getDateStr(_evS); - } - if (_ev.isAllDay && _ev.endDay) { - _ev.endDay = getDateStr(_evE); - } - if (nextRule && _ev.start === nextRule._start) { - newrule = true; - } - var useNewRule = function() { - if (!newrule) { - return; - } - debug("Use new rule", nextRule); - _ev._count = c; - count = nextRule.count; - c = 1; - evS = +_evS; - obj = _ev; - rule = nextRule; - nextRule = nextRules.shift(); - }; - if (c >= count) { - debug(_evS.toLocaleDateString(), "count"); - stop = true; - return true; - } - if (_evS >= _endMonth) { - debug(_evS.toLocaleDateString(), "endMonth"); - stop = true; - return true; - } - if (rule.until && _evS > rule.until) { - debug(_evS.toLocaleDateString(), "until"); - stop = true; - return true; - } - if (_evS < _start) { - debug(_evS.toLocaleDateString(), "start"); - return; - } - c++; - if (_evE < _startMonth) { - debug(_evS.toLocaleDateString(), "startMonth"); - if (newrule) { - useNewRule(); - } - return; - } - if (_evS < _endMonth && _evE >= _endMonth || _evS < _startMonth && _evE >= _startMonth) { - if (recurringAcross[_ev.id] && recurringAcross[_ev.id].includes(_ev.start)) { - return; - } else { - recurringAcross[_ev.id] = recurringAcross[_ev.id] || []; - recurringAcross[_ev.id].push(_ev.start); - } - } - if (_origin.timeZone && !_ev.isAllDay) { - var offset = fixTimeZone(_origin.timeZone, _start, _evS); - _ev.start += offset; - _ev.end += offset; - } - toAdd.push(_ev); - if (newrule) { - useNewRule(); - return true; - } - })); - if (!stop) { - next(evS); - } - }; - next(_start); - debug("Added this month (all events)", toAdd.map((function(ev) { - return new Date(ev.start).toLocaleDateString(); - }))); - })); - })); - return toAdd; - }; - Rec.getAllOccurrences = function(ev) { - if (!ev.recurrenceRule) { - return [ ev.start ]; - } - var r = ev.recurrenceRule; - if (!r.until && !r.count) { - return false; - } - var all = [ ev.start ]; - var d = new Date(ev.start); - d.setDate(15); - var toAdd = []; - var i = 0; - var check = function() { - return r.count ? all.length < r.count : +d <= r.until; - }; - while ((toAdd = Rec.getRecurring([ Rec.getMonthId(d) ], [ ev ])) && check() && i < r.count * 12) { - Array.prototype.push.apply(all, toAdd.map((function(_ev) { - return _ev.start; - }))); - d.setMonth(d.getMonth() + 1); - i++; - } - return all; - }; - Rec.diffDate = function(oldTime, newTime) { - var n = new Date(newTime); - var o = new Date(oldTime); - var d = 0; - var mult = n < o ? -1 : 1; - while (n.toLocaleDateString() !== o.toLocaleDateString() || mult >= 1e4) { - n.setDate(n.getDate() - mult); - d++; - } - d = mult * d; - n = new Date(newTime); - var h = n.getHours() - o.getHours(); - var m = n.getMinutes() - o.getMinutes(); - return { - d, - h, - m - }; - }; - var sortUpdate = function(obj) { - return Object.keys(obj).sort((function(d1, d2) { - return Number(d1) - Number(d2); - })); - }; - Rec.applyUpdates = function(events) { - events.forEach((function(ev) { - ev.raw = { - start: ev.start, - end: ev.end - }; - if (!ev.recUpdate) { - return; - } - var from = ev.recUpdate.from || {}; - var one = ev.recUpdate.one || {}; - var s = ev.start; - var nextRules = getNextRules(ev).filter((function(r) { - return r._start > s; - })); - var nextRule = nextRules.shift(); - var applyDiff = function(obj, k) { - var diff = obj[k]; - var d = new Date(ev.raw[k]); - d.setDate(d.getDate() + diff.d); - d.setHours(d.getHours() + diff.h); - d.setMinutes(d.getMinutes() + diff.m); - ev[k] = +d; - }; - sortUpdate(from).forEach((function(d) { - if (s < Number(d)) { - return; - } - Object.keys(from[d]).forEach((function(k) { - if (k === "start" || k === "end") { - return void applyDiff(from[d], k); - } - if (k === "recurrenceRule" && !from[d][k]) { - return; - } - ev[k] = from[d][k]; - })); - })); - Object.keys(one[s] || {}).forEach((function(k) { - if (k === "start" || k === "end") { - return void applyDiff(one[s], k); - } - if (k === "recurrenceRule" && !one[s][k]) { - return; - } - ev[k] = one[s][k]; - })); - if (ev.deleted) { - Object.keys(ev).forEach((function(k) { - delete ev[k]; - })); - } - if (nextRule && ev.recurrenceRule) { - ev.recurrenceRule._next = nextRule._start - 1; - } - if (ev.reminders) { - ev.raw.reminders = ev.reminders; - } - })); - return events; - }; - return Rec; - }; - if (module.exports) { - module.exports = factory(requireCommonUtil()); - } - })(); - })(recurrence); - return recurrence.exports; - } - var flatpickr$1 = { - exports: {} - }; - /* flatpickr v4.6.9,, @license MIT */ var flatpickr = flatpickr$1.exports; - var hasRequiredFlatpickr; - function requireFlatpickr() { - if (hasRequiredFlatpickr) return flatpickr$1.exports; - hasRequiredFlatpickr = 1; - (function(module, exports) { - !function(e, t) { - module.exports = t(); - }(flatpickr, (function() { - var e = function() { - return (e = Object.assign || function(e) { - for (var t, n = 1, a = arguments.length; n < a; n++) for (var i in t = arguments[n]) Object.prototype.hasOwnProperty.call(t, i) && (e[i] = t[i]); - return e; - }).apply(this, arguments); - }; - function t() { - for (var e = 0, t = 0, n = arguments.length; t < n; t++) e += arguments[t].length; - var a = Array(e), i = 0; - for (t = 0; t < n; t++) for (var o = arguments[t], r = 0, l = o.length; r < l; r++, - i++) a[i] = o[r]; - return a; - } - var n = [ "onChange", "onClose", "onDayCreate", "onDestroy", "onKeyDown", "onMonthChange", "onOpen", "onParseConfig", "onReady", "onValueUpdate", "onYearChange", "onPreCalendarPosition" ], a = { - _disable: [], - allowInput: !1, - allowInvalidPreload: !1, - altFormat: "F j, Y", - altInput: !1, - altInputClass: "form-control input", - animate: "object" == typeof window && -1 === window.navigator.userAgent.indexOf("MSIE"), - ariaDateFormat: "F j, Y", - autoFillDefaultTime: !0, - clickOpens: !0, - closeOnSelect: !0, - conjunction: ", ", - dateFormat: "Y-m-d", - defaultHour: 12, - defaultMinute: 0, - defaultSeconds: 0, - disable: [], - disableMobile: !1, - enableSeconds: !1, - enableTime: !1, - errorHandler: function(e) { - return "undefined" != typeof console && console.warn(e); - }, - getWeek: function(e) { - var t = new Date(e.getTime()); - t.setHours(0, 0, 0, 0), t.setDate(t.getDate() + 3 - (t.getDay() + 6) % 7); - var n = new Date(t.getFullYear(), 0, 4); - return 1 + Math.round(((t.getTime() - n.getTime()) / 864e5 - 3 + (n.getDay() + 6) % 7) / 7); - }, - hourIncrement: 1, - ignoredFocusElements: [], - inline: !1, - locale: "default", - minuteIncrement: 5, - mode: "single", - monthSelectorType: "dropdown", - nextArrow: "", - noCalendar: !1, - now: new Date, - onChange: [], - onClose: [], - onDayCreate: [], - onDestroy: [], - onKeyDown: [], - onMonthChange: [], - onOpen: [], - onParseConfig: [], - onReady: [], - onValueUpdate: [], - onYearChange: [], - onPreCalendarPosition: [], - plugins: [], - position: "auto", - positionElement: void 0, - prevArrow: "", - shorthandCurrentMonth: !1, - showMonths: 1, - static: !1, - time_24hr: !1, - weekNumbers: !1, - wrap: !1 - }, i = { - weekdays: { - shorthand: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], - longhand: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ] - }, - months: { - shorthand: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ], - longhand: [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ] - }, - daysInMonth: [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ], - firstDayOfWeek: 0, - ordinal: function(e) { - var t = e % 100; - if (t > 3 && t < 21) return "th"; - switch (t % 10) { - case 1: - return "st"; - - case 2: - return "nd"; - - case 3: - return "rd"; - - default: - return "th"; - } - }, - rangeSeparator: " to ", - weekAbbreviation: "Wk", - scrollTitle: "Scroll to increment", - toggleTitle: "Click to toggle", - amPM: [ "AM", "PM" ], - yearAriaLabel: "Year", - monthAriaLabel: "Month", - hourAriaLabel: "Hour", - minuteAriaLabel: "Minute", - time_24hr: !1 - }, o = function(e, t) { - return void 0 === t && (t = 2), ("000" + e).slice(-1 * t); - }, r = function(e) { - return !0 === e ? 1 : 0; - }; - function l(e, t) { - var n; - return function() { - var a = this; - clearTimeout(n), n = setTimeout((function() { - return e.apply(a, arguments); - }), t); - }; - } - var c = function(e) { - return e instanceof Array ? e : [ e ]; - }; - function d(e, t, n) { - if (!0 === n) return e.classList.add(t); - e.classList.remove(t); - } - function s(e, t, n) { - var a = window.document.createElement(e); - return t = t || "", n = n || "", a.className = t, void 0 !== n && (a.textContent = n), - a; - } - function u(e) { - for (;e.firstChild; ) e.removeChild(e.firstChild); - } - function f(e, t) { - return t(e) ? e : e.parentNode ? f(e.parentNode, t) : void 0; - } - function m(e, t) { - var n = s("div", "numInputWrapper"), a = s("input", "numInput " + e), i = s("span", "arrowUp"), o = s("span", "arrowDown"); - if (-1 === navigator.userAgent.indexOf("MSIE 9.0") ? a.type = "number" : (a.type = "text", - a.pattern = "\\d*"), void 0 !== t) for (var r in t) a.setAttribute(r, t[r]); - return n.appendChild(a), n.appendChild(i), n.appendChild(o), n; - } - function g(e) { - try { - return "function" == typeof e.composedPath ? e.composedPath()[0] : e.target; - } catch (t) { - return e.target; - } - } - var p = function() {}, h = function(e, t, n) { - return n.months[t ? "shorthand" : "longhand"][e]; - }, v = { - D: p, - F: function(e, t, n) { - e.setMonth(n.months.longhand.indexOf(t)); - }, - G: function(e, t) { - e.setHours(parseFloat(t)); - }, - H: function(e, t) { - e.setHours(parseFloat(t)); - }, - J: function(e, t) { - e.setDate(parseFloat(t)); - }, - K: function(e, t, n) { - e.setHours(e.getHours() % 12 + 12 * r(new RegExp(n.amPM[1], "i").test(t))); - }, - M: function(e, t, n) { - e.setMonth(n.months.shorthand.indexOf(t)); - }, - S: function(e, t) { - e.setSeconds(parseFloat(t)); - }, - U: function(e, t) { - return new Date(1e3 * parseFloat(t)); - }, - W: function(e, t, n) { - var a = parseInt(t), i = new Date(e.getFullYear(), 0, 2 + 7 * (a - 1), 0, 0, 0, 0); - return i.setDate(i.getDate() - i.getDay() + n.firstDayOfWeek), i; - }, - Y: function(e, t) { - e.setFullYear(parseFloat(t)); - }, - Z: function(e, t) { - return new Date(t); - }, - d: function(e, t) { - e.setDate(parseFloat(t)); - }, - h: function(e, t) { - e.setHours(parseFloat(t)); - }, - i: function(e, t) { - e.setMinutes(parseFloat(t)); - }, - j: function(e, t) { - e.setDate(parseFloat(t)); - }, - l: p, - m: function(e, t) { - e.setMonth(parseFloat(t) - 1); - }, - n: function(e, t) { - e.setMonth(parseFloat(t) - 1); - }, - s: function(e, t) { - e.setSeconds(parseFloat(t)); - }, - u: function(e, t) { - return new Date(parseFloat(t)); - }, - w: p, - y: function(e, t) { - e.setFullYear(2e3 + parseFloat(t)); - } - }, D = { - D: "(\\w+)", - F: "(\\w+)", - G: "(\\d\\d|\\d)", - H: "(\\d\\d|\\d)", - J: "(\\d\\d|\\d)\\w+", - K: "", - M: "(\\w+)", - S: "(\\d\\d|\\d)", - U: "(.+)", - W: "(\\d\\d|\\d)", - Y: "(\\d{4})", - Z: "(.+)", - d: "(\\d\\d|\\d)", - h: "(\\d\\d|\\d)", - i: "(\\d\\d|\\d)", - j: "(\\d\\d|\\d)", - l: "(\\w+)", - m: "(\\d\\d|\\d)", - n: "(\\d\\d|\\d)", - s: "(\\d\\d|\\d)", - u: "(.+)", - w: "(\\d\\d|\\d)", - y: "(\\d{2})" - }, w = { - Z: function(e) { - return e.toISOString(); - }, - D: function(e, t, n) { - return t.weekdays.shorthand[w.w(e, t, n)]; - }, - F: function(e, t, n) { - return h(w.n(e, t, n) - 1, !1, t); - }, - G: function(e, t, n) { - return o(w.h(e, t, n)); - }, - H: function(e) { - return o(e.getHours()); - }, - J: function(e, t) { - return void 0 !== t.ordinal ? e.getDate() + t.ordinal(e.getDate()) : e.getDate(); - }, - K: function(e, t) { - return t.amPM[r(e.getHours() > 11)]; - }, - M: function(e, t) { - return h(e.getMonth(), !0, t); - }, - S: function(e) { - return o(e.getSeconds()); - }, - U: function(e) { - return e.getTime() / 1e3; - }, - W: function(e, t, n) { - return n.getWeek(e); - }, - Y: function(e) { - return o(e.getFullYear(), 4); - }, - d: function(e) { - return o(e.getDate()); - }, - h: function(e) { - return e.getHours() % 12 ? e.getHours() % 12 : 12; - }, - i: function(e) { - return o(e.getMinutes()); - }, - j: function(e) { - return e.getDate(); - }, - l: function(e, t) { - return t.weekdays.longhand[e.getDay()]; - }, - m: function(e) { - return o(e.getMonth() + 1); - }, - n: function(e) { - return e.getMonth() + 1; - }, - s: function(e) { - return e.getSeconds(); - }, - u: function(e) { - return e.getTime(); - }, - w: function(e) { - return e.getDay(); - }, - y: function(e) { - return String(e.getFullYear()).substring(2); - } - }, b = function(e) { - var t = e.config, n = void 0 === t ? a : t, o = e.l10n, r = void 0 === o ? i : o, l = e.isMobile, c = void 0 !== l && l; - return function(e, t, a) { - var i = a || r; - return void 0 === n.formatDate || c ? t.split("").map((function(t, a, o) { - return w[t] && "\\" !== o[a - 1] ? w[t](e, i, n) : "\\" !== t ? t : ""; - })).join("") : n.formatDate(e, t, i); - }; - }, C = function(e) { - var t = e.config, n = void 0 === t ? a : t, o = e.l10n, r = void 0 === o ? i : o; - return function(e, t, i, o) { - if (0 === e || e) { - var l, c = o || r, d = e; - if (e instanceof Date) l = new Date(e.getTime()); else if ("string" != typeof e && void 0 !== e.toFixed) l = new Date(e); else if ("string" == typeof e) { - var s = t || (n || a).dateFormat, u = String(e).trim(); - if ("today" === u) l = new Date, i = !0; else if (/Z$/.test(u) || /GMT$/.test(u)) l = new Date(e); else if (n && n.parseDate) l = n.parseDate(e, s); else { - l = n && n.noCalendar ? new Date((new Date).setHours(0, 0, 0, 0)) : new Date((new Date).getFullYear(), 0, 1, 0, 0, 0, 0); - for (var f = void 0, m = [], g = 0, p = 0, h = ""; g < s.length; g++) { - var w = s[g], b = "\\" === w, C = "\\" === s[g - 1] || b; - if (D[w] && !C) { - h += D[w]; - var M = new RegExp(h).exec(e); - M && (f = !0) && m["Y" !== w ? "push" : "unshift"]({ - fn: v[w], - val: M[++p] - }); - } else b || (h += "."); - m.forEach((function(e) { - var t = e.fn, n = e.val; - return l = t(l, n, c) || l; - })); - } - l = f ? l : void 0; - } - } - if (l instanceof Date && !isNaN(l.getTime())) return !0 === i && l.setHours(0, 0, 0, 0), - l; - n.errorHandler(new Error("Invalid date provided: " + d)); - } - }; - }; - function M(e, t, n) { - return void 0 === n && (n = !0), !1 !== n ? new Date(e.getTime()).setHours(0, 0, 0, 0) - new Date(t.getTime()).setHours(0, 0, 0, 0) : e.getTime() - t.getTime(); - } - var y = 864e5; - function x(e) { - var t = e.defaultHour, n = e.defaultMinute, a = e.defaultSeconds; - if (void 0 !== e.minDate) { - var i = e.minDate.getHours(), o = e.minDate.getMinutes(), r = e.minDate.getSeconds(); - t < i && (t = i), t === i && n < o && (n = o), t === i && n === o && a < r && (a = e.minDate.getSeconds()); - } - if (void 0 !== e.maxDate) { - var l = e.maxDate.getHours(), c = e.maxDate.getMinutes(); - (t = Math.min(t, l)) === l && (n = Math.min(c, n)), t === l && n === c && (a = e.maxDate.getSeconds()); - } - return { - hours: t, - minutes: n, - seconds: a - }; - } - "function" != typeof Object.assign && (Object.assign = function(e) { - for (var t = [], n = 1; n < arguments.length; n++) t[n - 1] = arguments[n]; - if (!e) throw TypeError("Cannot convert undefined or null to object"); - for (var a = function(t) { - t && Object.keys(t).forEach((function(n) { - return e[n] = t[n]; - })); - }, i = 0, o = t; i < o.length; i++) { - var r = o[i]; - a(r); - } - return e; - }); - function E(p, v) { - var w = { - config: e(e({}, a), T.defaultConfig), - l10n: i - }; - function E(e) { - return e.bind(w); - } - function k() { - var e = w.config; - !1 === e.weekNumbers && 1 === e.showMonths || !0 !== e.noCalendar && window.requestAnimationFrame((function() { - if (void 0 !== w.calendarContainer && (w.calendarContainer.style.visibility = "hidden", - w.calendarContainer.style.display = "block"), void 0 !== w.daysContainer) { - var t = (w.days.offsetWidth + 1) * e.showMonths; - w.daysContainer.style.width = t + "px", w.calendarContainer.style.width = t + (void 0 !== w.weekWrapper ? w.weekWrapper.offsetWidth : 0) + "px", - w.calendarContainer.style.removeProperty("visibility"), w.calendarContainer.style.removeProperty("display"); - } - })); - } - function I(e) { - if (0 === w.selectedDates.length) { - var t = void 0 === w.config.minDate || M(new Date, w.config.minDate) >= 0 ? new Date : new Date(w.config.minDate.getTime()), n = x(w.config); - t.setHours(n.hours, n.minutes, n.seconds, t.getMilliseconds()), w.selectedDates = [ t ], - w.latestSelectedDateObj = t; - } - void 0 !== e && "blur" !== e.type && function(e) { - e.preventDefault(); - var t = "keydown" === e.type, n = g(e), a = n; - void 0 !== w.amPM && n === w.amPM && (w.amPM.textContent = w.l10n.amPM[r(w.amPM.textContent === w.l10n.amPM[0])]); - var i = parseFloat(a.getAttribute("min")), l = parseFloat(a.getAttribute("max")), c = parseFloat(a.getAttribute("step")), d = parseInt(a.value, 10), s = e.delta || (t ? 38 === e.which ? 1 : -1 : 0), u = d + c * s; - if (void 0 !== a.value && 2 === a.value.length) { - var f = a === w.hourElement, m = a === w.minuteElement; - u < i ? (u = l + u + r(!f) + (r(f) && r(!w.amPM)), m && j(void 0, -1, w.hourElement)) : u > l && (u = a === w.hourElement ? u - l - r(!w.amPM) : i, - m && j(void 0, 1, w.hourElement)), w.amPM && f && (1 === c ? u + d === 23 : Math.abs(u - d) > c) && (w.amPM.textContent = w.l10n.amPM[r(w.amPM.textContent === w.l10n.amPM[0])]), - a.value = o(u); - } - }(e); - var a = w._input.value; - S(), be(), w._input.value !== a && w._debouncedChange(); - } - function S() { - if (void 0 !== w.hourElement && void 0 !== w.minuteElement) { - var e, t, n = (parseInt(w.hourElement.value.slice(-2), 10) || 0) % 24, a = (parseInt(w.minuteElement.value, 10) || 0) % 60, i = void 0 !== w.secondElement ? (parseInt(w.secondElement.value, 10) || 0) % 60 : 0; - void 0 !== w.amPM && (e = n, t = w.amPM.textContent, n = e % 12 + 12 * r(t === w.l10n.amPM[1])); - var o = void 0 !== w.config.minTime || w.config.minDate && w.minDateHasTime && w.latestSelectedDateObj && 0 === M(w.latestSelectedDateObj, w.config.minDate, !0); - if (void 0 !== w.config.maxTime || w.config.maxDate && w.maxDateHasTime && w.latestSelectedDateObj && 0 === M(w.latestSelectedDateObj, w.config.maxDate, !0)) { - var l = void 0 !== w.config.maxTime ? w.config.maxTime : w.config.maxDate; - (n = Math.min(n, l.getHours())) === l.getHours() && (a = Math.min(a, l.getMinutes())), - a === l.getMinutes() && (i = Math.min(i, l.getSeconds())); - } - if (o) { - var c = void 0 !== w.config.minTime ? w.config.minTime : w.config.minDate; - (n = Math.max(n, c.getHours())) === c.getHours() && a < c.getMinutes() && (a = c.getMinutes()), - a === c.getMinutes() && (i = Math.max(i, c.getSeconds())); - } - O(n, a, i); - } - } - function _(e) { - var t = e || w.latestSelectedDateObj; - t && O(t.getHours(), t.getMinutes(), t.getSeconds()); - } - function O(e, t, n) { - void 0 !== w.latestSelectedDateObj && w.latestSelectedDateObj.setHours(e % 24, t, n || 0, 0), - w.hourElement && w.minuteElement && !w.isMobile && (w.hourElement.value = o(w.config.time_24hr ? e : (12 + e) % 12 + 12 * r(e % 12 == 0)), - w.minuteElement.value = o(t), void 0 !== w.amPM && (w.amPM.textContent = w.l10n.amPM[r(e >= 12)]), - void 0 !== w.secondElement && (w.secondElement.value = o(n))); - } - function F(e) { - var t = g(e), n = parseInt(t.value) + (e.delta || 0); - (n / 1e3 > 1 || "Enter" === e.key && !/[^\d]/.test(n.toString())) && Q(n); - } - function A(e, t, n, a) { - return t instanceof Array ? t.forEach((function(t) { - return A(e, t, n, a); - })) : e instanceof Array ? e.forEach((function(e) { - return A(e, t, n, a); - })) : (e.addEventListener(t, n, a), void w._handlers.push({ - remove: function() { - return e.removeEventListener(t, n); - } - })); - } - function N() { - pe("onChange"); - } - function P(e, t) { - var n = void 0 !== e ? w.parseDate(e) : w.latestSelectedDateObj || (w.config.minDate && w.config.minDate > w.now ? w.config.minDate : w.config.maxDate && w.config.maxDate < w.now ? w.config.maxDate : w.now), a = w.currentYear, i = w.currentMonth; - try { - void 0 !== n && (w.currentYear = n.getFullYear(), w.currentMonth = n.getMonth()); - } catch (e) { - e.message = "Invalid date supplied: " + n, w.config.errorHandler(e); - } - t && w.currentYear !== a && (pe("onYearChange"), K()), !t || w.currentYear === a && w.currentMonth === i || pe("onMonthChange"), - w.redraw(); - } - function Y(e) { - var t = g(e); - ~t.className.indexOf("arrow") && j(e, t.classList.contains("arrowUp") ? 1 : -1); - } - function j(e, t, n) { - var a = e && g(e), i = n || a && a.parentNode && a.parentNode.firstChild, o = he("increment"); - o.delta = t, i && i.dispatchEvent(o); - } - function H(e, t, n, a) { - var i = X(t, !0), o = s("span", "flatpickr-day " + e, t.getDate().toString()); - return o.dateObj = t, o.$i = a, o.setAttribute("aria-label", w.formatDate(t, w.config.ariaDateFormat)), - -1 === e.indexOf("hidden") && 0 === M(t, w.now) && (w.todayDateElem = o, o.classList.add("today"), - o.setAttribute("aria-current", "date")), i ? (o.tabIndex = -1, ve(t) && (o.classList.add("selected"), - w.selectedDateElem = o, "range" === w.config.mode && (d(o, "startRange", w.selectedDates[0] && 0 === M(t, w.selectedDates[0], !0)), - d(o, "endRange", w.selectedDates[1] && 0 === M(t, w.selectedDates[1], !0)), "nextMonthDay" === e && o.classList.add("inRange")))) : o.classList.add("flatpickr-disabled"), - "range" === w.config.mode && function(e) { - return !("range" !== w.config.mode || w.selectedDates.length < 2) && (M(e, w.selectedDates[0]) >= 0 && M(e, w.selectedDates[1]) <= 0); - }(t) && !ve(t) && o.classList.add("inRange"), w.weekNumbers && 1 === w.config.showMonths && "prevMonthDay" !== e && n % 7 == 1 && w.weekNumbers.insertAdjacentHTML("beforeend", "" + w.config.getWeek(t) + ""), - pe("onDayCreate", o), o; - } - function L(e) { - e.focus(), "range" === w.config.mode && ae(e); - } - function W(e) { - for (var t = e > 0 ? 0 : w.config.showMonths - 1, n = e > 0 ? w.config.showMonths : -1, a = t; a != n; a += e) for (var i = w.daysContainer.children[a], o = e > 0 ? 0 : i.children.length - 1, r = e > 0 ? i.children.length : -1, l = o; l != r; l += e) { - var c = i.children[l]; - if (-1 === c.className.indexOf("hidden") && X(c.dateObj)) return c; - } - } - function R(e, t) { - var n = ee(document.activeElement || document.body), a = void 0 !== e ? e : n ? document.activeElement : void 0 !== w.selectedDateElem && ee(w.selectedDateElem) ? w.selectedDateElem : void 0 !== w.todayDateElem && ee(w.todayDateElem) ? w.todayDateElem : W(t > 0 ? 1 : -1); - void 0 === a ? w._input.focus() : n ? function(e, t) { - for (var n = -1 === e.className.indexOf("Month") ? e.dateObj.getMonth() : w.currentMonth, a = t > 0 ? w.config.showMonths : -1, i = t > 0 ? 1 : -1, o = n - w.currentMonth; o != a; o += i) for (var r = w.daysContainer.children[o], l = n - w.currentMonth === o ? e.$i + t : t < 0 ? r.children.length - 1 : 0, c = r.children.length, d = l; d >= 0 && d < c && d != (t > 0 ? c : -1); d += i) { - var s = r.children[d]; - if (-1 === s.className.indexOf("hidden") && X(s.dateObj) && Math.abs(e.$i - d) >= Math.abs(t)) return L(s); - } - w.changeMonth(i), R(W(i), 0); - }(a, t) : L(a); - } - function B(e, t) { - for (var n = (new Date(e, t, 1).getDay() - w.l10n.firstDayOfWeek + 7) % 7, a = w.utils.getDaysInMonth((t - 1 + 12) % 12, e), i = w.utils.getDaysInMonth(t, e), o = window.document.createDocumentFragment(), r = w.config.showMonths > 1, l = r ? "prevMonthDay hidden" : "prevMonthDay", c = r ? "nextMonthDay hidden" : "nextMonthDay", d = a + 1 - n, u = 0; d <= a; d++, - u++) o.appendChild(H(l, new Date(e, t - 1, d), d, u)); - for (d = 1; d <= i; d++, u++) o.appendChild(H("", new Date(e, t, d), d, u)); - for (var f = i + 1; f <= 42 - n && (1 === w.config.showMonths || u % 7 != 0); f++, - u++) o.appendChild(H(c, new Date(e, t + 1, f % i), f, u)); - var m = s("div", "dayContainer"); - return m.appendChild(o), m; - } - function J() { - if (void 0 !== w.daysContainer) { - u(w.daysContainer), w.weekNumbers && u(w.weekNumbers); - for (var e = document.createDocumentFragment(), t = 0; t < w.config.showMonths; t++) { - var n = new Date(w.currentYear, w.currentMonth, 1); - n.setMonth(w.currentMonth + t), e.appendChild(B(n.getFullYear(), n.getMonth())); - } - w.daysContainer.appendChild(e), w.days = w.daysContainer.firstChild, "range" === w.config.mode && 1 === w.selectedDates.length && ae(); - } - } - function K() { - if (!(w.config.showMonths > 1 || "dropdown" !== w.config.monthSelectorType)) { - var e = function(e) { - return !(void 0 !== w.config.minDate && w.currentYear === w.config.minDate.getFullYear() && e < w.config.minDate.getMonth()) && !(void 0 !== w.config.maxDate && w.currentYear === w.config.maxDate.getFullYear() && e > w.config.maxDate.getMonth()); - }; - w.monthsDropdownContainer.tabIndex = -1, w.monthsDropdownContainer.innerHTML = ""; - for (var t = 0; t < 12; t++) if (e(t)) { - var n = s("option", "flatpickr-monthDropdown-month"); - n.value = new Date(w.currentYear, t).getMonth().toString(), n.textContent = h(t, w.config.shorthandCurrentMonth, w.l10n), - n.tabIndex = -1, w.currentMonth === t && (n.selected = !0), w.monthsDropdownContainer.appendChild(n); - } - } - } - function U() { - var e, t = s("div", "flatpickr-month"), n = window.document.createDocumentFragment(); - w.config.showMonths > 1 || "static" === w.config.monthSelectorType ? e = s("span", "cur-month") : (w.monthsDropdownContainer = s("select", "flatpickr-monthDropdown-months"), - w.monthsDropdownContainer.setAttribute("aria-label", w.l10n.monthAriaLabel), A(w.monthsDropdownContainer, "change", (function(e) { - var t = g(e), n = parseInt(t.value, 10); - w.changeMonth(n - w.currentMonth), pe("onMonthChange"); - })), K(), e = w.monthsDropdownContainer); - var a = m("cur-year", { - tabindex: "-1" - }), i = a.getElementsByTagName("input")[0]; - i.setAttribute("aria-label", w.l10n.yearAriaLabel), w.config.minDate && i.setAttribute("min", w.config.minDate.getFullYear().toString()), - w.config.maxDate && (i.setAttribute("max", w.config.maxDate.getFullYear().toString()), - i.disabled = !!w.config.minDate && w.config.minDate.getFullYear() === w.config.maxDate.getFullYear()); - var o = s("div", "flatpickr-current-month"); - return o.appendChild(e), o.appendChild(a), n.appendChild(o), t.appendChild(n), { - container: t, - yearElement: i, - monthElement: e - }; - } - function q() { - u(w.monthNav), w.monthNav.appendChild(w.prevMonthNav), w.config.showMonths && (w.yearElements = [], - w.monthElements = []); - for (var e = w.config.showMonths; e--; ) { - var t = U(); - w.yearElements.push(t.yearElement), w.monthElements.push(t.monthElement), w.monthNav.appendChild(t.container); - } - w.monthNav.appendChild(w.nextMonthNav); - } - function $() { - w.weekdayContainer ? u(w.weekdayContainer) : w.weekdayContainer = s("div", "flatpickr-weekdays"); - for (var e = w.config.showMonths; e--; ) { - var t = s("div", "flatpickr-weekdaycontainer"); - w.weekdayContainer.appendChild(t); - } - return z(), w.weekdayContainer; - } - function z() { - if (w.weekdayContainer) { - var e = w.l10n.firstDayOfWeek, n = t(w.l10n.weekdays.shorthand); - e > 0 && e < n.length && (n = t(n.splice(e, n.length), n.splice(0, e))); - for (var a = w.config.showMonths; a--; ) w.weekdayContainer.children[a].innerHTML = "\n \n " + n.join("") + "\n \n "; - } - } - function G(e, t) { - void 0 === t && (t = !0); - var n = t ? e : e - w.currentMonth; - n < 0 && !0 === w._hidePrevMonthArrow || n > 0 && !0 === w._hideNextMonthArrow || (w.currentMonth += n, - (w.currentMonth < 0 || w.currentMonth > 11) && (w.currentYear += w.currentMonth > 11 ? 1 : -1, - w.currentMonth = (w.currentMonth + 12) % 12, pe("onYearChange"), K()), J(), pe("onMonthChange"), - De()); - } - function V(e) { - return !(!w.config.appendTo || !w.config.appendTo.contains(e)) || w.calendarContainer.contains(e); - } - function Z(e) { - if (w.isOpen && !w.config.inline) { - var t = g(e), n = V(t), a = t === w.input || t === w.altInput || w.element.contains(t) || e.path && e.path.indexOf && (~e.path.indexOf(w.input) || ~e.path.indexOf(w.altInput)), i = "blur" === e.type ? a && e.relatedTarget && !V(e.relatedTarget) : !a && !n && !V(e.relatedTarget), o = !w.config.ignoredFocusElements.some((function(e) { - return e.contains(t); - })); - i && o && (void 0 !== w.timeContainer && void 0 !== w.minuteElement && void 0 !== w.hourElement && "" !== w.input.value && void 0 !== w.input.value && I(), - w.close(), w.config && "range" === w.config.mode && 1 === w.selectedDates.length && (w.clear(!1), - w.redraw())); - } - } - function Q(e) { - if (!(!e || w.config.minDate && e < w.config.minDate.getFullYear() || w.config.maxDate && e > w.config.maxDate.getFullYear())) { - var t = e, n = w.currentYear !== t; - w.currentYear = t || w.currentYear, w.config.maxDate && w.currentYear === w.config.maxDate.getFullYear() ? w.currentMonth = Math.min(w.config.maxDate.getMonth(), w.currentMonth) : w.config.minDate && w.currentYear === w.config.minDate.getFullYear() && (w.currentMonth = Math.max(w.config.minDate.getMonth(), w.currentMonth)), - n && (w.redraw(), pe("onYearChange"), K()); - } - } - function X(e, t) { - var n; - void 0 === t && (t = !0); - var a = w.parseDate(e, void 0, t); - if (w.config.minDate && a && M(a, w.config.minDate, void 0 !== t ? t : !w.minDateHasTime) < 0 || w.config.maxDate && a && M(a, w.config.maxDate, void 0 !== t ? t : !w.maxDateHasTime) > 0) return !1; - if (!w.config.enable && 0 === w.config.disable.length) return !0; - if (void 0 === a) return !1; - for (var i = !!w.config.enable, o = null !== (n = w.config.enable) && void 0 !== n ? n : w.config.disable, r = 0, l = void 0; r < o.length; r++) { - if ("function" == typeof (l = o[r]) && l(a)) return i; - if (l instanceof Date && void 0 !== a && l.getTime() === a.getTime()) return i; - if ("string" == typeof l) { - var c = w.parseDate(l, void 0, !0); - return c && c.getTime() === a.getTime() ? i : !i; - } - if ("object" == typeof l && void 0 !== a && l.from && l.to && a.getTime() >= l.from.getTime() && a.getTime() <= l.to.getTime()) return i; - } - return !i; - } - function ee(e) { - return void 0 !== w.daysContainer && (-1 === e.className.indexOf("hidden") && -1 === e.className.indexOf("flatpickr-disabled") && w.daysContainer.contains(e)); - } - function te(e) { - !(e.target === w._input) || !(w.selectedDates.length > 0 || w._input.value.length > 0) || e.relatedTarget && V(e.relatedTarget) || w.setDate(w._input.value, !0, e.target === w.altInput ? w.config.altFormat : w.config.dateFormat); - } - function ne(e) { - var t = g(e), n = w.config.wrap ? p.contains(t) : t === w._input, a = w.config.allowInput, i = w.isOpen && (!a || !n), o = w.config.inline && n && !a; - if (13 === e.keyCode && n) { - if (a) return w.setDate(w._input.value, !0, t === w.altInput ? w.config.altFormat : w.config.dateFormat), - t.blur(); - w.open(); - } else if (V(t) || i || o) { - var r = !!w.timeContainer && w.timeContainer.contains(t); - switch (e.keyCode) { - case 13: - r ? (e.preventDefault(), I(), se()) : ue(e); - break; - - case 27: - e.preventDefault(), se(); - break; - - case 8: - case 46: - n && !w.config.allowInput && (e.preventDefault(), w.clear()); - break; - - case 37: - case 39: - if (r || n) w.hourElement && w.hourElement.focus(); else if (e.preventDefault(), - void 0 !== w.daysContainer && (!1 === a || document.activeElement && ee(document.activeElement))) { - var l = 39 === e.keyCode ? 1 : -1; - e.ctrlKey ? (e.stopPropagation(), G(l), R(W(1), 0)) : R(void 0, l); - } - break; - - case 38: - case 40: - e.preventDefault(); - var c = 40 === e.keyCode ? 1 : -1; - w.daysContainer && void 0 !== t.$i || t === w.input || t === w.altInput ? e.ctrlKey ? (e.stopPropagation(), - Q(w.currentYear - c), R(W(1), 0)) : r || R(void 0, 7 * c) : t === w.currentYearElement ? Q(w.currentYear - c) : w.config.enableTime && (!r && w.hourElement && w.hourElement.focus(), - I(e), w._debouncedChange()); - break; - - case 9: - if (r) { - var d = [ w.hourElement, w.minuteElement, w.secondElement, w.amPM ].concat(w.pluginElements).filter((function(e) { - return e; - })), s = d.indexOf(t); - if (-1 !== s) { - var u = d[s + (e.shiftKey ? -1 : 1)]; - e.preventDefault(), (u || w._input).focus(); - } - } else !w.config.noCalendar && w.daysContainer && w.daysContainer.contains(t) && e.shiftKey && (e.preventDefault(), - w._input.focus()); - } - } - if (void 0 !== w.amPM && t === w.amPM) switch (e.key) { - case w.l10n.amPM[0].charAt(0): - case w.l10n.amPM[0].charAt(0).toLowerCase(): - w.amPM.textContent = w.l10n.amPM[0], S(), be(); - break; - - case w.l10n.amPM[1].charAt(0): - case w.l10n.amPM[1].charAt(0).toLowerCase(): - w.amPM.textContent = w.l10n.amPM[1], S(), be(); - } - (n || V(t)) && pe("onKeyDown", e); - } - function ae(e) { - if (1 === w.selectedDates.length && (!e || e.classList.contains("flatpickr-day") && !e.classList.contains("flatpickr-disabled"))) { - for (var t = e ? e.dateObj.getTime() : w.days.firstElementChild.dateObj.getTime(), n = w.parseDate(w.selectedDates[0], void 0, !0).getTime(), a = Math.min(t, w.selectedDates[0].getTime()), i = Math.max(t, w.selectedDates[0].getTime()), o = !1, r = 0, l = 0, c = a; c < i; c += y) X(new Date(c), !0) || (o = o || c > a && c < i, - c < n && (!r || c > r) ? r = c : c > n && (!l || c < l) && (l = c)); - for (var d = 0; d < w.config.showMonths; d++) for (var s = w.daysContainer.children[d], u = function(a, i) { - var c, d, u, f = s.children[a], m = f.dateObj.getTime(), g = r > 0 && m < r || l > 0 && m > l; - return g ? (f.classList.add("notAllowed"), [ "inRange", "startRange", "endRange" ].forEach((function(e) { - f.classList.remove(e); - })), "continue") : o && !g ? "continue" : ([ "startRange", "inRange", "endRange", "notAllowed" ].forEach((function(e) { - f.classList.remove(e); - })), void (void 0 !== e && (e.classList.add(t <= w.selectedDates[0].getTime() ? "startRange" : "endRange"), - n < t && m === n ? f.classList.add("startRange") : n > t && m === n && f.classList.add("endRange"), - m >= r && (0 === l || m <= l) && (d = n, u = t, (c = m) > Math.min(d, u) && c < Math.max(d, u)) && f.classList.add("inRange")))); - }, f = 0, m = s.children.length; f < m; f++) u(f); - } - } - function ie() { - !w.isOpen || w.config.static || w.config.inline || ce(); - } - function oe(e) { - return function(t) { - var n = w.config["_" + e + "Date"] = w.parseDate(t, w.config.dateFormat), a = w.config["_" + ("min" === e ? "max" : "min") + "Date"]; - void 0 !== n && (w["min" === e ? "minDateHasTime" : "maxDateHasTime"] = n.getHours() > 0 || n.getMinutes() > 0 || n.getSeconds() > 0), - w.selectedDates && (w.selectedDates = w.selectedDates.filter((function(e) { - return X(e); - })), w.selectedDates.length || "min" !== e || _(n), be()), w.daysContainer && (de(), - void 0 !== n ? w.currentYearElement[e] = n.getFullYear().toString() : w.currentYearElement.removeAttribute(e), - w.currentYearElement.disabled = !!a && void 0 !== n && a.getFullYear() === n.getFullYear()); - }; - } - function re() { - return w.config.wrap ? p.querySelector("[data-input]") : p; - } - function le() { - "object" != typeof w.config.locale && void 0 === T.l10ns[w.config.locale] && w.config.errorHandler(new Error("flatpickr: invalid locale " + w.config.locale)), - w.l10n = e(e({}, T.l10ns.default), "object" == typeof w.config.locale ? w.config.locale : "default" !== w.config.locale ? T.l10ns[w.config.locale] : void 0), - D.K = "(" + w.l10n.amPM[0] + "|" + w.l10n.amPM[1] + "|" + w.l10n.amPM[0].toLowerCase() + "|" + w.l10n.amPM[1].toLowerCase() + ")", - void 0 === e(e({}, v), JSON.parse(JSON.stringify(p.dataset || {}))).time_24hr && void 0 === T.defaultConfig.time_24hr && (w.config.time_24hr = w.l10n.time_24hr), - w.formatDate = b(w), w.parseDate = C({ - config: w.config, - l10n: w.l10n - }); - } - function ce(e) { - if ("function" != typeof w.config.position) { - if (void 0 !== w.calendarContainer) { - pe("onPreCalendarPosition"); - var t = e || w._positionElement, n = Array.prototype.reduce.call(w.calendarContainer.children, (function(e, t) { - return e + t.offsetHeight; - }), 0), a = w.calendarContainer.offsetWidth, i = w.config.position.split(" "), o = i[0], r = i.length > 1 ? i[1] : null, l = t.getBoundingClientRect(), c = window.innerHeight - l.bottom, s = "above" === o || "below" !== o && c < n && l.top > n, u = window.pageYOffset + l.top + (s ? -n - 2 : t.offsetHeight + 2); - if (d(w.calendarContainer, "arrowTop", !s), d(w.calendarContainer, "arrowBottom", s), - !w.config.inline) { - var f = window.pageXOffset + l.left, m = !1, g = !1; - "center" === r ? (f -= (a - l.width) / 2, m = !0) : "right" === r && (f -= a - l.width, - g = !0), d(w.calendarContainer, "arrowLeft", !m && !g), d(w.calendarContainer, "arrowCenter", m), - d(w.calendarContainer, "arrowRight", g); - var p = window.document.body.offsetWidth - (window.pageXOffset + l.right), h = f + a > window.document.body.offsetWidth, v = p + a > window.document.body.offsetWidth; - if (d(w.calendarContainer, "rightMost", h), !w.config.static) if (w.calendarContainer.style.top = u + "px", - h) if (v) { - var D = function() { - for (var e = null, t = 0; t < document.styleSheets.length; t++) { - var n = document.styleSheets[t]; - try { - n.cssRules; - } catch (e) { - continue; - } - e = n; - break; - } - return null != e ? e : (a = document.createElement("style"), document.head.appendChild(a), - a.sheet); - var a; - }(); - if (void 0 === D) return; - var b = window.document.body.offsetWidth, C = Math.max(0, b / 2 - a / 2), M = D.cssRules.length, y = "{left:" + l.left + "px;right:auto;}"; - d(w.calendarContainer, "rightMost", !1), d(w.calendarContainer, "centerMost", !0), - D.insertRule(".flatpickr-calendar.centerMost:before,.flatpickr-calendar.centerMost:after" + y, M), - w.calendarContainer.style.left = C + "px", w.calendarContainer.style.right = "auto"; - } else w.calendarContainer.style.left = "auto", w.calendarContainer.style.right = p + "px"; else w.calendarContainer.style.left = f + "px", - w.calendarContainer.style.right = "auto"; - } - } - } else w.config.position(w, e); - } - function de() { - w.config.noCalendar || w.isMobile || (K(), De(), J()); - } - function se() { - w._input.focus(), -1 !== window.navigator.userAgent.indexOf("MSIE") || void 0 !== navigator.msMaxTouchPoints ? setTimeout(w.close, 0) : w.close(); - } - function ue(e) { - e.preventDefault(), e.stopPropagation(); - var t = f(g(e), (function(e) { - return e.classList && e.classList.contains("flatpickr-day") && !e.classList.contains("flatpickr-disabled") && !e.classList.contains("notAllowed"); - })); - if (void 0 !== t) { - var n = t, a = w.latestSelectedDateObj = new Date(n.dateObj.getTime()), i = (a.getMonth() < w.currentMonth || a.getMonth() > w.currentMonth + w.config.showMonths - 1) && "range" !== w.config.mode; - if (w.selectedDateElem = n, "single" === w.config.mode) w.selectedDates = [ a ]; else if ("multiple" === w.config.mode) { - var o = ve(a); - o ? w.selectedDates.splice(parseInt(o), 1) : w.selectedDates.push(a); - } else "range" === w.config.mode && (2 === w.selectedDates.length && w.clear(!1, !1), - w.latestSelectedDateObj = a, w.selectedDates.push(a), 0 !== M(a, w.selectedDates[0], !0) && w.selectedDates.sort((function(e, t) { - return e.getTime() - t.getTime(); - }))); - if (S(), i) { - var r = w.currentYear !== a.getFullYear(); - w.currentYear = a.getFullYear(), w.currentMonth = a.getMonth(), r && (pe("onYearChange"), - K()), pe("onMonthChange"); - } - if (De(), J(), be(), i || "range" === w.config.mode || 1 !== w.config.showMonths ? void 0 !== w.selectedDateElem && void 0 === w.hourElement && w.selectedDateElem && w.selectedDateElem.focus() : L(n), - void 0 !== w.hourElement && void 0 !== w.hourElement && w.hourElement.focus(), w.config.closeOnSelect) { - var l = "single" === w.config.mode && !w.config.enableTime, c = "range" === w.config.mode && 2 === w.selectedDates.length && !w.config.enableTime; - (l || c) && se(); - } - N(); - } - } - w.parseDate = C({ - config: w.config, - l10n: w.l10n - }), w._handlers = [], w.pluginElements = [], w.loadedPlugins = [], w._bind = A, - w._setHoursFromDate = _, w._positionCalendar = ce, w.changeMonth = G, w.changeYear = Q, - w.clear = function(e, t) { - void 0 === e && (e = !0); - void 0 === t && (t = !0); - w.input.value = "", void 0 !== w.altInput && (w.altInput.value = ""); - void 0 !== w.mobileInput && (w.mobileInput.value = ""); - w.selectedDates = [], w.latestSelectedDateObj = void 0, !0 === t && (w.currentYear = w._initialDate.getFullYear(), - w.currentMonth = w._initialDate.getMonth()); - if (!0 === w.config.enableTime) { - var n = x(w.config), a = n.hours, i = n.minutes, o = n.seconds; - O(a, i, o); - } - w.redraw(), e && pe("onChange"); - }, w.close = function() { - w.isOpen = !1, w.isMobile || (void 0 !== w.calendarContainer && w.calendarContainer.classList.remove("open"), - void 0 !== w._input && w._input.classList.remove("active")); - pe("onClose"); - }, w._createElement = s, w.destroy = function() { - void 0 !== w.config && pe("onDestroy"); - for (var e = w._handlers.length; e--; ) w._handlers[e].remove(); - if (w._handlers = [], w.mobileInput) w.mobileInput.parentNode && w.mobileInput.parentNode.removeChild(w.mobileInput), - w.mobileInput = void 0; else if (w.calendarContainer && w.calendarContainer.parentNode) if (w.config.static && w.calendarContainer.parentNode) { - var t = w.calendarContainer.parentNode; - if (t.lastChild && t.removeChild(t.lastChild), t.parentNode) { - for (;t.firstChild; ) t.parentNode.insertBefore(t.firstChild, t); - t.parentNode.removeChild(t); - } - } else w.calendarContainer.parentNode.removeChild(w.calendarContainer); - w.altInput && (w.input.type = "text", w.altInput.parentNode && w.altInput.parentNode.removeChild(w.altInput), - delete w.altInput); - w.input && (w.input.type = w.input._type, w.input.classList.remove("flatpickr-input"), - w.input.removeAttribute("readonly")); - [ "_showTimeInput", "latestSelectedDateObj", "_hideNextMonthArrow", "_hidePrevMonthArrow", "__hideNextMonthArrow", "__hidePrevMonthArrow", "isMobile", "isOpen", "selectedDateElem", "minDateHasTime", "maxDateHasTime", "days", "daysContainer", "_input", "_positionElement", "innerContainer", "rContainer", "monthNav", "todayDateElem", "calendarContainer", "weekdayContainer", "prevMonthNav", "nextMonthNav", "monthsDropdownContainer", "currentMonthElement", "currentYearElement", "navigationCurrentMonth", "selectedDateElem", "config" ].forEach((function(e) { - try { - delete w[e]; - } catch (e) {} - })); - }, w.isEnabled = X, w.jumpToDate = P, w.open = function(e, t) { - void 0 === t && (t = w._positionElement); - if (!0 === w.isMobile) { - if (e) { - e.preventDefault(); - var n = g(e); - n && n.blur(); - } - return void 0 !== w.mobileInput && (w.mobileInput.focus(), w.mobileInput.click()), - void pe("onOpen"); - } - if (w._input.disabled || w.config.inline) return; - var a = w.isOpen; - w.isOpen = !0, a || (w.calendarContainer.classList.add("open"), w._input.classList.add("active"), - pe("onOpen"), ce(t)); - !0 === w.config.enableTime && !0 === w.config.noCalendar && (!1 !== w.config.allowInput || void 0 !== e && w.timeContainer.contains(e.relatedTarget) || setTimeout((function() { - return w.hourElement.select(); - }), 50)); - }, w.redraw = de, w.set = function(e, t) { - if (null !== e && "object" == typeof e) for (var a in Object.assign(w.config, e), - e) void 0 !== fe[a] && fe[a].forEach((function(e) { - return e(); - })); else w.config[e] = t, void 0 !== fe[e] ? fe[e].forEach((function(e) { - return e(); - })) : n.indexOf(e) > -1 && (w.config[e] = c(t)); - w.redraw(), be(!0); - }, w.setDate = function(e, t, n) { - void 0 === t && (t = !1); - void 0 === n && (n = w.config.dateFormat); - if (0 !== e && !e || e instanceof Array && 0 === e.length) return w.clear(t); - me(e, n), w.latestSelectedDateObj = w.selectedDates[w.selectedDates.length - 1], - w.redraw(), P(void 0, t), _(), 0 === w.selectedDates.length && w.clear(!1); - be(t), t && pe("onChange"); - }, w.toggle = function(e) { - if (!0 === w.isOpen) return w.close(); - w.open(e); - }; - var fe = { - locale: [ le, z ], - showMonths: [ q, k, $ ], - minDate: [ P ], - maxDate: [ P ], - clickOpens: [ function() { - !0 === w.config.clickOpens ? (A(w._input, "focus", w.open), A(w._input, "click", w.open)) : (w._input.removeEventListener("focus", w.open), - w._input.removeEventListener("click", w.open)); - } ] - }; - function me(e, t) { - var n = []; - if (e instanceof Array) n = e.map((function(e) { - return w.parseDate(e, t); - })); else if (e instanceof Date || "number" == typeof e) n = [ w.parseDate(e, t) ]; else if ("string" == typeof e) switch (w.config.mode) { - case "single": - case "time": - n = [ w.parseDate(e, t) ]; - break; - - case "multiple": - n = e.split(w.config.conjunction).map((function(e) { - return w.parseDate(e, t); - })); - break; - - case "range": - n = e.split(w.l10n.rangeSeparator).map((function(e) { - return w.parseDate(e, t); - })); - } else w.config.errorHandler(new Error("Invalid date supplied: " + JSON.stringify(e))); - w.selectedDates = w.config.allowInvalidPreload ? n : n.filter((function(e) { - return e instanceof Date && X(e, !1); - })), "range" === w.config.mode && w.selectedDates.sort((function(e, t) { - return e.getTime() - t.getTime(); - })); - } - function ge(e) { - return e.slice().map((function(e) { - return "string" == typeof e || "number" == typeof e || e instanceof Date ? w.parseDate(e, void 0, !0) : e && "object" == typeof e && e.from && e.to ? { - from: w.parseDate(e.from, void 0), - to: w.parseDate(e.to, void 0) - } : e; - })).filter((function(e) { - return e; - })); - } - function pe(e, t) { - if (void 0 !== w.config) { - var n = w.config[e]; - if (void 0 !== n && n.length > 0) for (var a = 0; n[a] && a < n.length; a++) n[a](w.selectedDates, w.input.value, w, t); - "onChange" === e && (w.input.dispatchEvent(he("change")), w.input.dispatchEvent(he("input"))); - } - } - function he(e) { - var t = document.createEvent("Event"); - return t.initEvent(e, !0, !0), t; - } - function ve(e) { - for (var t = 0; t < w.selectedDates.length; t++) if (0 === M(w.selectedDates[t], e)) return "" + t; - return !1; - } - function De() { - w.config.noCalendar || w.isMobile || !w.monthNav || (w.yearElements.forEach((function(e, t) { - var n = new Date(w.currentYear, w.currentMonth, 1); - n.setMonth(w.currentMonth + t), w.config.showMonths > 1 || "static" === w.config.monthSelectorType ? w.monthElements[t].textContent = h(n.getMonth(), w.config.shorthandCurrentMonth, w.l10n) + " " : w.monthsDropdownContainer.value = n.getMonth().toString(), - e.value = n.getFullYear().toString(); - })), w._hidePrevMonthArrow = void 0 !== w.config.minDate && (w.currentYear === w.config.minDate.getFullYear() ? w.currentMonth <= w.config.minDate.getMonth() : w.currentYear < w.config.minDate.getFullYear()), - w._hideNextMonthArrow = void 0 !== w.config.maxDate && (w.currentYear === w.config.maxDate.getFullYear() ? w.currentMonth + 1 > w.config.maxDate.getMonth() : w.currentYear > w.config.maxDate.getFullYear())); - } - function we(e) { - return w.selectedDates.map((function(t) { - return w.formatDate(t, e); - })).filter((function(e, t, n) { - return "range" !== w.config.mode || w.config.enableTime || n.indexOf(e) === t; - })).join("range" !== w.config.mode ? w.config.conjunction : w.l10n.rangeSeparator); - } - function be(e) { - void 0 === e && (e = !0), void 0 !== w.mobileInput && w.mobileFormatStr && (w.mobileInput.value = void 0 !== w.latestSelectedDateObj ? w.formatDate(w.latestSelectedDateObj, w.mobileFormatStr) : ""), - w.input.value = we(w.config.dateFormat), void 0 !== w.altInput && (w.altInput.value = we(w.config.altFormat)), - !1 !== e && pe("onValueUpdate"); - } - function Ce(e) { - var t = g(e), n = w.prevMonthNav.contains(t), a = w.nextMonthNav.contains(t); - n || a ? G(n ? -1 : 1) : w.yearElements.indexOf(t) >= 0 ? t.select() : t.classList.contains("arrowUp") ? w.changeYear(w.currentYear + 1) : t.classList.contains("arrowDown") && w.changeYear(w.currentYear - 1); - } - return function() { - w.element = w.input = p, w.isOpen = !1, function() { - var t = [ "wrap", "weekNumbers", "allowInput", "allowInvalidPreload", "clickOpens", "time_24hr", "enableTime", "noCalendar", "altInput", "shorthandCurrentMonth", "inline", "static", "enableSeconds", "disableMobile" ], i = e(e({}, JSON.parse(JSON.stringify(p.dataset || {}))), v), o = {}; - w.config.parseDate = i.parseDate, w.config.formatDate = i.formatDate, Object.defineProperty(w.config, "enable", { - get: function() { - return w.config._enable; - }, - set: function(e) { - w.config._enable = ge(e); - } - }), Object.defineProperty(w.config, "disable", { - get: function() { - return w.config._disable; - }, - set: function(e) { - w.config._disable = ge(e); - } - }); - var r = "time" === i.mode; - if (!i.dateFormat && (i.enableTime || r)) { - var l = T.defaultConfig.dateFormat || a.dateFormat; - o.dateFormat = i.noCalendar || r ? "H:i" + (i.enableSeconds ? ":S" : "") : l + " H:i" + (i.enableSeconds ? ":S" : ""); - } - if (i.altInput && (i.enableTime || r) && !i.altFormat) { - var d = T.defaultConfig.altFormat || a.altFormat; - o.altFormat = i.noCalendar || r ? "h:i" + (i.enableSeconds ? ":S K" : " K") : d + " h:i" + (i.enableSeconds ? ":S" : "") + " K"; - } - Object.defineProperty(w.config, "minDate", { - get: function() { - return w.config._minDate; - }, - set: oe("min") - }), Object.defineProperty(w.config, "maxDate", { - get: function() { - return w.config._maxDate; - }, - set: oe("max") - }); - var s = function(e) { - return function(t) { - w.config["min" === e ? "_minTime" : "_maxTime"] = w.parseDate(t, "H:i:S"); - }; - }; - Object.defineProperty(w.config, "minTime", { - get: function() { - return w.config._minTime; - }, - set: s("min") - }), Object.defineProperty(w.config, "maxTime", { - get: function() { - return w.config._maxTime; - }, - set: s("max") - }), "time" === i.mode && (w.config.noCalendar = !0, w.config.enableTime = !0); - Object.assign(w.config, o, i); - for (var u = 0; u < t.length; u++) w.config[t[u]] = !0 === w.config[t[u]] || "true" === w.config[t[u]]; - n.filter((function(e) { - return void 0 !== w.config[e]; - })).forEach((function(e) { - w.config[e] = c(w.config[e] || []).map(E); - })), w.isMobile = !w.config.disableMobile && !w.config.inline && "single" === w.config.mode && !w.config.disable.length && !w.config.enable && !w.config.weekNumbers && /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); - for (u = 0; u < w.config.plugins.length; u++) { - var f = w.config.plugins[u](w) || {}; - for (var m in f) n.indexOf(m) > -1 ? w.config[m] = c(f[m]).map(E).concat(w.config[m]) : void 0 === i[m] && (w.config[m] = f[m]); - } - i.altInputClass || (w.config.altInputClass = re().className + " " + w.config.altInputClass); - pe("onParseConfig"); - }(), le(), function() { - if (w.input = re(), !w.input) return void w.config.errorHandler(new Error("Invalid input element specified")); - w.input._type = w.input.type, w.input.type = "text", w.input.classList.add("flatpickr-input"), - w._input = w.input, w.config.altInput && (w.altInput = s(w.input.nodeName, w.config.altInputClass), - w._input = w.altInput, w.altInput.placeholder = w.input.placeholder, w.altInput.disabled = w.input.disabled, - w.altInput.required = w.input.required, w.altInput.tabIndex = w.input.tabIndex, - w.altInput.type = "text", w.input.setAttribute("type", "hidden"), !w.config.static && w.input.parentNode && w.input.parentNode.insertBefore(w.altInput, w.input.nextSibling)); - w.config.allowInput || w._input.setAttribute("readonly", "readonly"); - w._positionElement = w.config.positionElement || w._input; - }(), function() { - w.selectedDates = [], w.now = w.parseDate(w.config.now) || new Date; - var e = w.config.defaultDate || ("INPUT" !== w.input.nodeName && "TEXTAREA" !== w.input.nodeName || !w.input.placeholder || w.input.value !== w.input.placeholder ? w.input.value : null); - e && me(e, w.config.dateFormat); - w._initialDate = w.selectedDates.length > 0 ? w.selectedDates[0] : w.config.minDate && w.config.minDate.getTime() > w.now.getTime() ? w.config.minDate : w.config.maxDate && w.config.maxDate.getTime() < w.now.getTime() ? w.config.maxDate : w.now, - w.currentYear = w._initialDate.getFullYear(), w.currentMonth = w._initialDate.getMonth(), - w.selectedDates.length > 0 && (w.latestSelectedDateObj = w.selectedDates[0]); - void 0 !== w.config.minTime && (w.config.minTime = w.parseDate(w.config.minTime, "H:i")); - void 0 !== w.config.maxTime && (w.config.maxTime = w.parseDate(w.config.maxTime, "H:i")); - w.minDateHasTime = !!w.config.minDate && (w.config.minDate.getHours() > 0 || w.config.minDate.getMinutes() > 0 || w.config.minDate.getSeconds() > 0), - w.maxDateHasTime = !!w.config.maxDate && (w.config.maxDate.getHours() > 0 || w.config.maxDate.getMinutes() > 0 || w.config.maxDate.getSeconds() > 0); - }(), w.utils = { - getDaysInMonth: function(e, t) { - return void 0 === e && (e = w.currentMonth), void 0 === t && (t = w.currentYear), - 1 === e && (t % 4 == 0 && t % 100 != 0 || t % 400 == 0) ? 29 : w.l10n.daysInMonth[e]; - } - }, w.isMobile || function() { - var e = window.document.createDocumentFragment(); - if (w.calendarContainer = s("div", "flatpickr-calendar"), w.calendarContainer.tabIndex = -1, - !w.config.noCalendar) { - if (e.appendChild((w.monthNav = s("div", "flatpickr-months"), w.yearElements = [], - w.monthElements = [], w.prevMonthNav = s("span", "flatpickr-prev-month"), w.prevMonthNav.innerHTML = w.config.prevArrow, - w.nextMonthNav = s("span", "flatpickr-next-month"), w.nextMonthNav.innerHTML = w.config.nextArrow, - q(), Object.defineProperty(w, "_hidePrevMonthArrow", { - get: function() { - return w.__hidePrevMonthArrow; - }, - set: function(e) { - w.__hidePrevMonthArrow !== e && (d(w.prevMonthNav, "flatpickr-disabled", e), w.__hidePrevMonthArrow = e); - } - }), Object.defineProperty(w, "_hideNextMonthArrow", { - get: function() { - return w.__hideNextMonthArrow; - }, - set: function(e) { - w.__hideNextMonthArrow !== e && (d(w.nextMonthNav, "flatpickr-disabled", e), w.__hideNextMonthArrow = e); - } - }), w.currentYearElement = w.yearElements[0], De(), w.monthNav)), w.innerContainer = s("div", "flatpickr-innerContainer"), - w.config.weekNumbers) { - var t = function() { - w.calendarContainer.classList.add("hasWeeks"); - var e = s("div", "flatpickr-weekwrapper"); - e.appendChild(s("span", "flatpickr-weekday", w.l10n.weekAbbreviation)); - var t = s("div", "flatpickr-weeks"); - return e.appendChild(t), { - weekWrapper: e, - weekNumbers: t - }; - }(), n = t.weekWrapper, a = t.weekNumbers; - w.innerContainer.appendChild(n), w.weekNumbers = a, w.weekWrapper = n; - } - w.rContainer = s("div", "flatpickr-rContainer"), w.rContainer.appendChild($()), - w.daysContainer || (w.daysContainer = s("div", "flatpickr-days"), w.daysContainer.tabIndex = -1), - J(), w.rContainer.appendChild(w.daysContainer), w.innerContainer.appendChild(w.rContainer), - e.appendChild(w.innerContainer); - } - w.config.enableTime && e.appendChild(function() { - w.calendarContainer.classList.add("hasTime"), w.config.noCalendar && w.calendarContainer.classList.add("noCalendar"); - var e = x(w.config); - w.timeContainer = s("div", "flatpickr-time"), w.timeContainer.tabIndex = -1; - var t = s("span", "flatpickr-time-separator", ":"), n = m("flatpickr-hour", { - "aria-label": w.l10n.hourAriaLabel - }); - w.hourElement = n.getElementsByTagName("input")[0]; - var a = m("flatpickr-minute", { - "aria-label": w.l10n.minuteAriaLabel - }); - w.minuteElement = a.getElementsByTagName("input")[0], w.hourElement.tabIndex = w.minuteElement.tabIndex = -1, - w.hourElement.value = o(w.latestSelectedDateObj ? w.latestSelectedDateObj.getHours() : w.config.time_24hr ? e.hours : function(e) { - switch (e % 24) { - case 0: - case 12: - return 12; - - default: - return e % 12; - } - }(e.hours)), w.minuteElement.value = o(w.latestSelectedDateObj ? w.latestSelectedDateObj.getMinutes() : e.minutes), - w.hourElement.setAttribute("step", w.config.hourIncrement.toString()), w.minuteElement.setAttribute("step", w.config.minuteIncrement.toString()), - w.hourElement.setAttribute("min", w.config.time_24hr ? "0" : "1"), w.hourElement.setAttribute("max", w.config.time_24hr ? "23" : "12"), - w.hourElement.setAttribute("maxlength", "2"), w.minuteElement.setAttribute("min", "0"), - w.minuteElement.setAttribute("max", "59"), w.minuteElement.setAttribute("maxlength", "2"), - w.timeContainer.appendChild(n), w.timeContainer.appendChild(t), w.timeContainer.appendChild(a), - w.config.time_24hr && w.timeContainer.classList.add("time24hr"); - if (w.config.enableSeconds) { - w.timeContainer.classList.add("hasSeconds"); - var i = m("flatpickr-second"); - w.secondElement = i.getElementsByTagName("input")[0], w.secondElement.value = o(w.latestSelectedDateObj ? w.latestSelectedDateObj.getSeconds() : e.seconds), - w.secondElement.setAttribute("step", w.minuteElement.getAttribute("step")), w.secondElement.setAttribute("min", "0"), - w.secondElement.setAttribute("max", "59"), w.secondElement.setAttribute("maxlength", "2"), - w.timeContainer.appendChild(s("span", "flatpickr-time-separator", ":")), w.timeContainer.appendChild(i); - } - w.config.time_24hr || (w.amPM = s("span", "flatpickr-am-pm", w.l10n.amPM[r((w.latestSelectedDateObj ? w.hourElement.value : w.config.defaultHour) > 11)]), - w.amPM.title = w.l10n.toggleTitle, w.amPM.tabIndex = -1, w.timeContainer.appendChild(w.amPM)); - return w.timeContainer; - }()); - d(w.calendarContainer, "rangeMode", "range" === w.config.mode), d(w.calendarContainer, "animate", !0 === w.config.animate), - d(w.calendarContainer, "multiMonth", w.config.showMonths > 1), w.calendarContainer.appendChild(e); - var i = void 0 !== w.config.appendTo && void 0 !== w.config.appendTo.nodeType; - if ((w.config.inline || w.config.static) && (w.calendarContainer.classList.add(w.config.inline ? "inline" : "static"), - w.config.inline && (!i && w.element.parentNode ? w.element.parentNode.insertBefore(w.calendarContainer, w._input.nextSibling) : void 0 !== w.config.appendTo && w.config.appendTo.appendChild(w.calendarContainer)), - w.config.static)) { - var l = s("div", "flatpickr-wrapper"); - w.element.parentNode && w.element.parentNode.insertBefore(l, w.element), l.appendChild(w.element), - w.altInput && l.appendChild(w.altInput), l.appendChild(w.calendarContainer); - } - w.config.static || w.config.inline || (void 0 !== w.config.appendTo ? w.config.appendTo : window.document.body).appendChild(w.calendarContainer); - }(), function() { - w.config.wrap && [ "open", "close", "toggle", "clear" ].forEach((function(e) { - Array.prototype.forEach.call(w.element.querySelectorAll("[data-" + e + "]"), (function(t) { - return A(t, "click", w[e]); - })); - })); - if (w.isMobile) return void function() { - var e = w.config.enableTime ? w.config.noCalendar ? "time" : "datetime-local" : "date"; - w.mobileInput = s("input", w.input.className + " flatpickr-mobile"), w.mobileInput.tabIndex = 1, - w.mobileInput.type = e, w.mobileInput.disabled = w.input.disabled, w.mobileInput.required = w.input.required, - w.mobileInput.placeholder = w.input.placeholder, w.mobileFormatStr = "datetime-local" === e ? "Y-m-d\\TH:i:S" : "date" === e ? "Y-m-d" : "H:i:S", - w.selectedDates.length > 0 && (w.mobileInput.defaultValue = w.mobileInput.value = w.formatDate(w.selectedDates[0], w.mobileFormatStr)); - w.config.minDate && (w.mobileInput.min = w.formatDate(w.config.minDate, "Y-m-d")); - w.config.maxDate && (w.mobileInput.max = w.formatDate(w.config.maxDate, "Y-m-d")); - w.input.getAttribute("step") && (w.mobileInput.step = String(w.input.getAttribute("step"))); - w.input.type = "hidden", void 0 !== w.altInput && (w.altInput.type = "hidden"); - try { - w.input.parentNode && w.input.parentNode.insertBefore(w.mobileInput, w.input.nextSibling); - } catch (e) {} - A(w.mobileInput, "change", (function(e) { - w.setDate(g(e).value, !1, w.mobileFormatStr), pe("onChange"), pe("onClose"); - })); - }(); - var e = l(ie, 50); - w._debouncedChange = l(N, 300), w.daysContainer && !/iPhone|iPad|iPod/i.test(navigator.userAgent) && A(w.daysContainer, "mouseover", (function(e) { - "range" === w.config.mode && ae(g(e)); - })); - A(window.document.body, "keydown", ne), w.config.inline || w.config.static || A(window, "resize", e); - void 0 !== window.ontouchstart ? A(window.document, "touchstart", Z) : A(window.document, "mousedown", Z); - A(window.document, "focus", Z, { - capture: !0 - }), !0 === w.config.clickOpens && (A(w._input, "focus", w.open), A(w._input, "click", w.open)); - void 0 !== w.daysContainer && (A(w.monthNav, "click", Ce), A(w.monthNav, [ "keyup", "increment" ], F), - A(w.daysContainer, "click", ue)); - if (void 0 !== w.timeContainer && void 0 !== w.minuteElement && void 0 !== w.hourElement) { - var t = function(e) { - return g(e).select(); - }; - A(w.timeContainer, [ "increment" ], I), A(w.timeContainer, "blur", I, { - capture: !0 - }), A(w.timeContainer, "click", Y), A([ w.hourElement, w.minuteElement ], [ "focus", "click" ], t), - void 0 !== w.secondElement && A(w.secondElement, "focus", (function() { - return w.secondElement && w.secondElement.select(); - })), void 0 !== w.amPM && A(w.amPM, "click", (function(e) { - I(e), N(); - })); - } - w.config.allowInput && A(w._input, "blur", te); - }(), (w.selectedDates.length || w.config.noCalendar) && (w.config.enableTime && _(w.config.noCalendar ? w.latestSelectedDateObj : void 0), - be(!1)), k(); - var t = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); - !w.isMobile && t && ce(), pe("onReady"); - }(), w; - } - function k(e, t) { - for (var n = Array.prototype.slice.call(e).filter((function(e) { - return e instanceof HTMLElement; - })), a = [], i = 0; i < n.length; i++) { - var o = n[i]; - try { - if (null !== o.getAttribute("data-fp-omit")) continue; - void 0 !== o._flatpickr && (o._flatpickr.destroy(), o._flatpickr = void 0), o._flatpickr = E(o, t || {}), - a.push(o._flatpickr); - } catch (e) { - console.error(e); - } - } - return 1 === a.length ? a[0] : a; - } - "undefined" != typeof HTMLElement && "undefined" != typeof HTMLCollection && "undefined" != typeof NodeList && (HTMLCollection.prototype.flatpickr = NodeList.prototype.flatpickr = function(e) { - return k(this, e); - }, HTMLElement.prototype.flatpickr = function(e) { - return k([ this ], e); - }); - var T = function(e, t) { - return "string" == typeof e ? k(window.document.querySelectorAll(e), t) : e instanceof Node ? k([ e ], t) : k(e, t); - }; - return T.defaultConfig = {}, T.l10ns = { - en: e({}, i), - default: e({}, i) - }, T.localize = function(t) { - T.l10ns.default = e(e({}, T.l10ns.default), t); - }, T.setDefaults = function(t) { - T.defaultConfig = e(e({}, T.defaultConfig), t); - }, T.parseDate = C({}), T.formatDate = b({}), T.compareDates = M, "undefined" != typeof jQuery && void 0 !== jQuery.fn && (jQuery.fn.flatpickr = function(e) { - return k(this, e); - }), Date.prototype.fp_incr = function(e) { - return new Date(this.getFullYear(), this.getMonth(), this.getDate() + ("string" == typeof e ? parseInt(e, 10) : e)); - }, "undefined" != typeof window && (window.flatpickr = T), T; - })); - })(flatpickr$1); - return flatpickr$1.exports; - } - var hasRequiredCalendar; - function requireCalendar() { - if (hasRequiredCalendar) return calendar$1.exports; - hasRequiredCalendar = 1; - (function(module) { - (() => { - const factory = (Util, Hash, Constants, Realtime, Cache, Rec, nThen, Listmap, FP, Crypto, ChainPad) => { - var Calendar = {}; - Calendar.setCustomize = () => {}; - var getStore = function(ctx, id) { - if (!id || id === 1) { - return ctx.store; - } - var m = ctx.store.modules && ctx.store.modules.team; - if (!m) { - return; - } - return m.getTeam(id); - }; - var makeCalendar = function() { - var hash = Hash.createRandomHash("calendar"); - var secret = Hash.getSecrets("calendar", hash); - var roHash = Hash.getViewHashFromKeys(secret); - var href = Hash.hashToHref(hash, "calendar"); - var roHref = Hash.hashToHref(roHash, "calendar"); - return { - href, - roHref, - channel: secret.channel - }; - }; - var initializeCalendars = function(ctx, cb) { - var proxy = ctx.store.proxy; - proxy.calendars = proxy.calendars || {}; - setTimeout(cb); - }; - var sendUpdate = function(ctx, c) { - ctx.emit("UPDATE", { - teams: c.stores, - roTeams: c.roStores, - id: c.channel, - loading: !c.ready && !c.cacheready, - readOnly: c.readOnly || !c.ready && c.cacheready || c.offline, - offline: c.offline, - deleted: !c.stores.length, - restricted: c.restricted, - owned: ctx.Store.isOwned(c.owners), - content: Util.clone(c.proxy), - hashes: c.hashes - }, ctx.clients); - }; - var clearReminders = function(ctx, id) { - var calendar = ctx.calendars[id]; - if (!calendar || !calendar.reminders) { - return; - } - Object.keys(calendar.reminders).forEach((function(uid) { - if (!Array.isArray(calendar.reminders[uid])) { - return; - } - calendar.reminders[uid].forEach((function(to) { - clearTimeout(to); - })); - })); - }; - var closeCalendar = function(ctx, id) { - var ctxCal = ctx.calendars[id]; - if (!ctxCal) { - return; - } - if (!ctxCal.stores.length) { - ctxCal.lm.stop(); - clearReminders(ctx, id); - delete ctx.calendars[id]; - } - }; - var updateLocalCalendars = function(ctx, c, data) { - c.stores.forEach((function(id) { - var s = getStore(ctx, id); - if (!s || !s.proxy) { - return; - } - if (!s.rpc) { - return; - } - if (!s.proxy.calendars) { - return; - } - var cal = s.proxy.calendars[c.channel]; - if (!cal) { - return; - } - if (cal.color !== data.color) { - cal.color = data.color; - } - if (cal.title !== data.title) { - cal.title = data.title; - } - })); - }; - var getRecurring = function(ev) { - var mid = new Date; - var start = new Date(mid.getFullYear(), mid.getMonth() - 1, 15); - var end = new Date(mid.getFullYear(), mid.getMonth() + 1, 15); - var startId = Rec.getMonthId(start); - var midId = Rec.getMonthId(mid); - var endId = Rec.getMonthId(end); - var toAdd = Rec.getRecurring([ startId, midId, endId ], [ ev ]); - var all = [ ev ]; - Array.prototype.push.apply(all, toAdd); - return Rec.applyUpdates(all); - }; - var clearDismissed = function(ctx, uid) { - var h = Util.find(ctx, [ "store", "proxy", "hideReminders" ]) || {}; - Object.keys(h).filter((function(id) { - return id === uid; - })).forEach((function(id) { - delete h[id]; - })); - }; - var _updateEventReminders = function(ctx, reminders, _ev, useLastVisit) { - var now = +new Date; - var ev = Util.clone(_ev); - var uid = ev.id; - if (Array.isArray(reminders[uid])) { - reminders[uid].forEach((function(to) { - clearTimeout(to); - })); - } - reminders[uid] = []; - if (_ev.deleted) { - return; - } - var d = Util.find(ctx, [ "store", "proxy", "hideReminders", uid ]) || []; - var last = ctx.store.data.lastVisit; - if (ev.isAllDay) { - if (ev.startDay) { - ev.start = +FP.parseDate(ev.startDay); - } - if (ev.endDay) { - var endDate = FP.parseDate(ev.endDay); - endDate.setHours(23); - endDate.setMinutes(59); - endDate.setSeconds(59); - ev.end = +endDate; - } - } - var oneWeekAgo = now - 7 * 24 * 3600 * 1e3; - var missed = useLastVisit && ev.start > last && ev.end <= now && ev.end > oneWeekAgo; - if (ev.end <= now && !missed) { - delete reminders[uid]; - clearDismissed(ctx, uid); - return; - } - var send = function(d) { - var hide = Util.find(ctx, [ "store", "proxy", "settings", "general", "calendar", "hideNotif" ]); - if (hide) { - return; - } - var ctime = ev.start <= now ? ev.start : +new Date; - ctx.store.mailbox.showMessage("reminders", { - msg: { - ctime, - type: "REMINDER", - missed: Boolean(missed), - content: ev - }, - hash: "REMINDER|" + uid + "-" + d - }, null, (function() {})); - }; - var sent = false; - var sendNotif = function(delay) { - sent = true; - ctx.Store.onReadyEvt.reg((function() { - send(delay); - })); - }; - var notifs = ev.reminders || []; - notifs.sort((function(a, b) { - return a - b; - })); - notifs.some((function(delayMinutes) { - var delay = delayMinutes * 6e4; - var time = now + delay; - if (d.some((function(minutes) { - return delayMinutes >= minutes; - }))) { - return; - } - if (ev.start - time >= 2147483647) { - return true; - } - if (ev.start <= time) { - sendNotif(delayMinutes); - return true; - } - reminders[uid].push(setTimeout((function() { - sendNotif(delayMinutes); - }), ev.start - time)); - })); - if (!sent) { - ctx.Store.onReadyEvt.reg((function() { - ctx.store.mailbox.hideMessage("reminders", { - hash: "REMINDER|" + uid - }, null, (function() {})); - })); - } - }; - var updateEventReminders = function(ctx, reminders, ev, useLastVisit) { - var all = getRecurring(Util.clone(ev)); - all.forEach((function(_ev) { - _updateEventReminders(ctx, reminders, _ev, useLastVisit); - })); - }; - var addReminders = function(ctx, id, ev) { - var calendar = ctx.calendars[id]; - if (!ev) { - return; - } - if (!calendar || !calendar.reminders) { - return; - } - if (calendar.stores.length === 1 && calendar.stores[0] === 0) { - return; - } - updateEventReminders(ctx, calendar.reminders, ev); - }; - var addInitialReminders = function(ctx, id, useLastVisit) { - var calendar = ctx.calendars[id]; - if (!calendar || !calendar.reminders) { - return; - } - if (Object.keys(calendar.reminders).length) { - return; - } - if (calendar.stores.length === 1 && calendar.stores[0] === 0) { - return; - } - var content = Util.find(calendar, [ "proxy", "content" ]); - if (!content) { - return; - } - Object.keys(content).forEach((function(uid) { - updateEventReminders(ctx, calendar.reminders, content[uid], useLastVisit); - })); - }; - var openChannel = function(ctx, cfg, _cb) { - var cb = Util.once(Util.mkAsync(_cb || function() {})); - var teamId = cfg.storeId; - var data = cfg.data; - var channel = data.channel; - if (!channel) { - return; - } - var c = ctx.calendars[channel]; - var update = function() { - sendUpdate(ctx, c); - }; - if (c) { - if (c.readOnly && data.href) { - var upgradeParsed = Hash.parsePadUrl(data.href); - var upgradeSecret = Hash.getSecrets("calendar", upgradeParsed.hash, data.password); - var upgradeCrypto = Crypto.createEncryptor(upgradeSecret.keys); - c.hashes.editHash = Hash.getEditHashFromKeys(upgradeSecret); - c.lm.setReadOnly(false, upgradeCrypto); - c.readOnly = false; - } else if (teamId === 0) { - if (c.stores.length === 1 && c.stores[0] === 0 && c.tempId.length && cfg.cId) { - c.tempId.push(cfg.cId); - } - return void cb(); - } - if (c.roStores.indexOf(teamId) !== -1 && data.href) { - c.roStores.splice(c.roStores.indexOf(teamId), 1); - if (c.stores.indexOf(0) !== -1) { - c.stores.splice(c.stores.indexOf(0), 1); - } - update(); - } - if (c.stores && c.stores.indexOf(teamId) !== -1) { - return void cb(); - } - if (c.stores.indexOf(0) !== -1) { - c.stores.splice(c.stores.indexOf(0), 1); - c.tempId = []; - } - c.stores.push(teamId); - if (!data.href) { - c.roStores.push(teamId); - } - update(); - return void cb(); - } - c = ctx.calendars[channel] = { - ready: false, - channel, - readOnly: !data.href, - tempId: [], - stores: [ teamId ], - roStores: data.href ? [] : [ teamId ], - reminders: {}, - hashes: {} - }; - if (teamId === 0) { - c.tempId.push(cfg.cId); - } - var parsed = Hash.parsePadUrl(data.href || data.roHref); - var secret = Hash.getSecrets("calendar", parsed.hash, data.password); - var crypto = Crypto.createEncryptor(secret.keys); - c.hashes.viewHash = Hash.getViewHashFromKeys(secret); - if (data.href) { - c.hashes.editHash = Hash.getEditHashFromKeys(secret); - } - c.proxy = { - metadata: { - color: data.color, - title: data.title - } - }; - update(); - var onDeleted = function() { - c.stores.forEach((function(storeId) { - var store = getStore(ctx, storeId); - if (!store || !store.rpc || !store.proxy.calendars) { - return; - } - delete store.proxy.calendars[channel]; - var unpin = store.unpin || ctx.unpinPads; - unpin([ channel ], (function(res) { - if (res && res.error) { - console.error(res.error); - } - })); - })); - if (c.lm) { - c.lm.stop(); - } - c.stores = []; - sendUpdate(ctx, c); - clearReminders(ctx, channel); - delete ctx.calendars[channel]; - }; - nThen((function(waitFor) { - if (!ctx.store.network || cfg.isNew) { - return; - } - ctx.Store.isNewChannel(null, channel, waitFor((function(obj) { - if (obj && obj.error) { - return; - } - if (obj && typeof obj.isNew === "boolean") { - if (obj.isNew) { - onDeleted(); - cb({ - error: "EDELETED" - }); - waitFor.abort(); - return; - } - } - }))); - })).nThen((function() { - var edPublic; - if (teamId === 1 || !teamId) { - edPublic = ctx.store.proxy.edPublic; - } else { - var teams = ctx.store.modules.team && ctx.store.modules.team.getTeamsData(); - var team = teams && teams[teamId]; - edPublic = team ? team.edPublic : undefined; - } - var config = { - data: {}, - network: ctx.store.network || ctx.store.networkPromise, - channel: secret.channel, - crypto, - owners: [ edPublic ], - ChainPad, - validateKey: secret.keys.validateKey || undefined, - userName: "calendar", - Cache, - classic: true, - onRejected: ctx.Store && ctx.Store.onRejected - }; - var lm = Listmap.create(config); - c.lm = lm; - var proxy = c.proxy = lm.proxy; - var _updateCalled = false; - var _update = function() { - if (_updateCalled) { - return; - } - _updateCalled = true; - setTimeout((function() { - _updateCalled = false; - update(); - })); - }; - lm.proxy.on("cacheready", (function() { - if (!proxy.metadata) { - return; - } - c.cacheready = true; - _update(); - if (cb) { - cb(null, lm.proxy); - } - addInitialReminders(ctx, channel, cfg.lastVisitNotif); - })).on("ready", (function(info) { - var md = info.metadata; - c.owners = md.owners || []; - c.ready = true; - if (!proxy.metadata) { - if (!cfg.isNew) { - return void onDeleted(); - } - proxy.metadata = { - color: data.color, - title: data.title - }; - } - _update(); - if (cb) { - cb(null, lm.proxy); - } - addInitialReminders(ctx, channel, cfg.lastVisitNotif); - })).on("change", [], (function() { - if (!c.ready) { - return; - } - _update(); - })).on("change", [ "content" ], (function(o, n, p) { - if (p.length === 2 && n && !o) { - return void addReminders(ctx, channel, n); - } - if (p.length === 2 && !n && o) { - return void addReminders(ctx, channel, { - id: p[1], - start: 0 - }); - } - if (p.length >= 3 && [ "start", "reminders", "isAllDay" ].includes(p[2])) { - return void setTimeout((function() { - addReminders(ctx, channel, proxy.content[p[1]]); - })); - } - if (p.length >= 6 && [ "start", "reminders", "isAllDay" ].includes(p[5])) { - return void setTimeout((function() { - addReminders(ctx, channel, proxy.content[p[1]]); - })); - } - })).on("remove", [ "content" ], (function(x, p) { - _update(); - if (p.length >= 3 && p[2] === "reminders" || p.length >= 6 && p[5] === "reminders") { - return void setTimeout((function() { - addReminders(ctx, channel, proxy.content[p[1]]); - })); - } - })).on("change", [ "metadata" ], (function() { - var md = proxy.metadata; - if (!md || !md.title || !md.color) { - return; - } - updateLocalCalendars(ctx, c, md); - })).on("disconnect", (function() { - c.offline = true; - _update(); - })).on("reconnect", (function() { - c.offline = false; - _update(); - })).on("error", (function(info) { - if (!info || !info.error) { - return; - } - if (info.error === "EDELETED") { - return void onDeleted(); - } - if (info.error === "ERESTRICTED") { - c.restricted = true; - _update(); - } - cb(info); - })); - })); - }; - var decryptTeamCalendarHref = function(store, calData) { - if (!calData.href) { - return; - } - if (calData.href.indexOf("#") !== -1) { - return; - } - if (store.secondaryKey) { - try { - calData.href = store.userObject.cryptor.decrypt(calData.href); - } catch (e) { - console.error(e); - delete calData.href; - } - } else { - delete calData.href; - } - }; - var initializeStore = function(ctx, store) { - var c = store.proxy.calendars; - var storeId = store.id || 1; - store.proxy.on("change", [ "calendars" ], (function(o, n, p) { - if (p.length < 2) { - return; - } - if (o && !n) { - (function() { - var id = p[1]; - var ctxCal = ctx.calendars[id]; - if (!ctxCal) { - return; - } - var idx = ctxCal.stores.indexOf(storeId); - if (idx === -1) { - return; - } - ctxCal.stores.splice(idx, 1); - var roIdx = ctxCal.roStores.indexOf(storeId); - if (roIdx !== -1) { - ctxCal.roStores.splice(roIdx, 1); - } - closeCalendar(ctx, id); - sendUpdate(ctx, ctxCal); - })(); - } - if (!o && n) { - (function() { - var id = p[1]; - var _cal = store.proxy.calendars[id]; - if (!_cal) { - return; - } - var cal = Util.clone(_cal); - decryptTeamCalendarHref(store, cal); - openChannel(ctx, { - storeId, - data: cal - }); - })(); - } - })); - Object.keys(c || {}).forEach((function(channel) { - var cal = Util.clone(c[channel]); - decryptTeamCalendarHref(store, cal); - openChannel(ctx, { - storeId, - lastVisitNotif: true, - data: cal - }); - })); - }; - var openChannels = function(ctx) { - initializeStore(ctx, ctx.store); - var teams = ctx.store.modules.team && ctx.store.modules.team.getTeamsData(); - if (!teams) { - return; - } - Object.keys(teams).forEach((function(id) { - var store = getStore(ctx, id); - initializeStore(ctx, store); - })); - }; - var subscribe = function(ctx, data, cId, cb) { - var idx = ctx.clients.indexOf(cId); - if (idx === -1) { - ctx.clients.push(cId); - } - cb({ - length: Object.keys(ctx.calendars).length - }); - Object.keys(ctx.calendars).forEach((function(channel) { - var c = ctx.calendars[channel] || {}; - sendUpdate(ctx, c); - })); - }; - var importICSCalendar = function(ctx, data, cId, cb) { - var id = data.id; - var c = ctx.calendars[id]; - if (!c || !c.proxy) { - return void cb({ - error: "ENOENT" - }); - } - var json = data.json; - c.proxy.content = c.proxy.content || {}; - Object.keys(json).forEach((function(uid) { - c.proxy.content[uid] = json[uid]; - addReminders(ctx, id, json[uid]); - })); - Realtime.whenRealtimeSyncs(c.lm.realtime, (function() { - sendUpdate(ctx, c); - cb(); - })); - }; - var openCalendar = function(ctx, data, cId, cb) { - var secret = Hash.getSecrets("calendar", data.hash, data.password); - var hash = Hash.getEditHashFromKeys(secret); - var roHash = Hash.getViewHashFromKeys(secret); - var cal = { - href: hash && Hash.hashToHref(hash, "calendar"), - roHref: roHash && Hash.hashToHref(roHash, "calendar"), - channel: secret.channel, - color: Util.getRandomColor(), - title: "..." - }; - openChannel(ctx, { - cId, - storeId: 0, - data: cal - }, cb); - }; - var importCalendar = function(ctx, data, cId, cb) { - var id = data.id; - var c = ctx.calendars[id]; - if (!c) { - return void cb({ - error: "ENOENT" - }); - } - if (!Array.isArray(c.stores) || c.stores.indexOf(data.teamId) === -1) { - return void cb({ - error: "EINVAL" - }); - } - var store = ctx.store; - var calendars = store.proxy.calendars = store.proxy.calendars || {}; - var hash = c.hashes.editHash; - var roHash = c.hashes.viewHash; - calendars[id] = { - href: hash && Hash.hashToHref(hash, "calendar"), - roHref: roHash && Hash.hashToHref(roHash, "calendar"), - channel: id, - color: Util.find(c, [ "proxy", "metadata", "color" ]) || Util.getRandomColor(), - title: Util.find(c, [ "proxy", "metadata", "title" ]) || "..." - }; - ctx.Store.onSync(null, cb); - openChannel(ctx, { - storeId: 1, - data: { - href: calendars[id].href, - toHref: calendars[id].roHref, - channel: id - } - }); - }; - var addCalendar = function(ctx, data, cId, cb) { - var store = getStore(ctx, data.teamId); - if (!store) { - return void cb({ - error: "NO_STORE" - }); - } - if (!store.rpc) { - return void cb({ - error: "EFORBIDDEN" - }); - } - var c = store.proxy.calendars = store.proxy.calendars || {}; - var parsed = Hash.parsePadUrl(data.href); - var secret = Hash.getSecrets(parsed.type, parsed.hash, data.password); - if (secret.channel !== data.channel) { - return void cb({ - error: "EINVAL" - }); - } - var hash = Hash.getEditHashFromKeys(secret); - var roHash = Hash.getViewHashFromKeys(secret); - var href = hash && Hash.hashToHref(hash, "calendar"); - var cal = { - href, - roHref: roHash && Hash.hashToHref(roHash, "calendar"), - color: data.color, - title: data.title, - channel: data.channel - }; - if (c[data.channel] && (c[data.channel].href || !cal.href)) { - return void cb(); - } - cal.color = data.color; - cal.title = data.title; - openChannel(ctx, { - storeId: store.id || 1, - data: Util.clone(cal) - }, (function(err) { - if (err) { - console.error(err); - return void cb({ - error: err.error - }); - } - if (href && store.id && store.secondaryKey) { - try { - cal.href = store.userObject.cryptor.encrypt(href); - } catch (e) { - console.error(e); - } - } - c[cal.channel] = cal; - var pin = store.pin || ctx.pinPads; - pin([ cal.channel ], (function(res) { - if (res && res.error) { - console.error(res.error); - } - })); - ctx.Store.onSync(store.id, cb); - })); - }; - var createCalendar = function(ctx, data, cId, cb) { - var store = getStore(ctx, data.teamId); - if (!store) { - return void cb({ - error: "NO_STORE" - }); - } - if (!store.rpc) { - return void cb({ - error: "EFORBIDDEN" - }); - } - var c = store.proxy.calendars = store.proxy.calendars || {}; - var cal = makeCalendar(); - cal.color = data.color; - cal.title = data.title; - openChannel(ctx, { - storeId: store.id || 1, - data: cal, - isNew: true - }, (function(err) { - if (err) { - console.error(err); - return void cb({ - error: err.error - }); - } - var ctxCal = ctx.calendars[cal.channel]; - Realtime.whenRealtimeSyncs(ctxCal.lm.realtime, (function() { - c[cal.channel] = cal; - var pin = store.pin || ctx.pinPads; - pin([ cal.channel ], (function(res) { - if (res && res.error) { - console.error(res.error); - } - })); - ctx.Store.onSync(store.id, cb); - })); - })); - }; - var updateCalendar = function(ctx, data, cId, cb) { - var id = data.id; - var c = ctx.calendars[id]; - if (!c) { - return void cb({ - error: "ENOENT" - }); - } - var md = Util.find(c, [ "proxy", "metadata" ]); - if (!md) { - return void cb({ - error: "EINVAL" - }); - } - md.title = data.title; - md.color = data.color; - Realtime.whenRealtimeSyncs(c.lm.realtime, cb); - sendUpdate(ctx, c); - updateLocalCalendars(ctx, c, data); - }; - var deleteCalendar = function(ctx, data, cId, cb) { - var store = getStore(ctx, data.teamId); - if (!store) { - return void cb({ - error: "NO_STORE" - }); - } - if (!store.rpc) { - return void cb({ - error: "EFORBIDDEN" - }); - } - if (!store.proxy.calendars) { - return; - } - var id = data.id; - var cal = store.proxy.calendars[id]; - if (!cal) { - return void cb(); - } - delete store.proxy.calendars[id]; - var unpin = store.unpin || ctx.unpinPads; - unpin([ id ], (function(res) { - if (res && res.error) { - console.error(res.error); - } - })); - var ctxCal = ctx.calendars[id]; - var idx = ctxCal.stores.indexOf(store.id || 1); - ctxCal.stores.splice(idx, 1); - closeCalendar(ctx, id); - ctx.Store.onSync(store.id, (function() { - sendUpdate(ctx, ctxCal); - cb(); - })); - }; - var createEvent = function(ctx, data, cId, cb) { - var id = data.calendarId; - var c = ctx.calendars[id]; - if (!c) { - return void cb({ - error: "ENOENT" - }); - } - var startDate = new Date(data.start); - var endDate = new Date(data.end); - if (data.isAllDay) { - data.startDay = startDate.getFullYear() + "-" + (startDate.getMonth() + 1) + "-" + startDate.getDate(); - data.endDay = endDate.getFullYear() + "-" + (endDate.getMonth() + 1) + "-" + endDate.getDate(); - } else { - delete data.startDay; - delete data.endDay; - } - c.proxy.content = c.proxy.content || {}; - c.proxy.content[data.id] = data; - Realtime.whenRealtimeSyncs(c.lm.realtime, (function() { - addReminders(ctx, id, data); - sendUpdate(ctx, c); - cb(); - })); - }; - var updateEvent = function(ctx, data, cId, cb) { - if (!data || !data.ev) { - return void cb({ - error: "EINVAL" - }); - } - var id = data.ev.calendarId; - var c = ctx.calendars[id]; - if (!c || !c.proxy || !c.proxy.content) { - return void cb({ - error: "ENOENT" - }); - } - var ev = c.proxy.content[data.ev.id]; - if (!ev) { - return void cb({ - error: "EINVAL" - }); - } - data.rawData = data.rawData || {}; - var changes = data.changes || {}; - var type = data.type || {}; - var newC; - if (changes.calendarId) { - newC = ctx.calendars[changes.calendarId]; - if (!newC || !newC.proxy) { - return void cb({ - error: "ENOENT" - }); - } - newC.proxy.content = newC.proxy.content || {}; - } - var RECUPDATE = { - one: {}, - from: {} - }; - if ([ "one", "from", "all" ].includes(type.which)) { - ev.recUpdate = ev.recUpdate || RECUPDATE; - if (!ev.recUpdate.one) { - ev.recUpdate.one = {}; - } - if (!ev.recUpdate.from) { - ev.recUpdate.from = {}; - } - } - var update = ev.recUpdate; - var alwaysAll = [ "calendarId" ]; - var keys = Object.keys(changes).filter((function(s) { - return !alwaysAll.includes(s); - })); - var cleanAfter = function(time) { - [ update.from, update.one ].forEach((function(obj) { - Object.keys(obj).forEach((function(d) { - if (Number(d) < time) { - return; - } - delete obj[d]; - })); - })); - }; - var cleanKeys = function(obj, when) { - Object.keys(obj).forEach((function(d) { - if (when && Number(d) < when) { - return; - } - keys.forEach((function(k) { - delete obj[d][k]; - })); - })); - }; - var dontSendUpdate = false; - if (typeof changes.recurrenceRule !== "undefined") { - if (type.which === "all" && changes.recurrenceRule.until) { - cleanAfter(changes.recurrenceRule.until); - } else if ([ "one", "from" ].includes(type.which) && !data.rawData.isOrigin) { - cleanAfter(type.when + 1); - } else { - update = ev.recUpdate = RECUPDATE; - } - } - if (type.which === "one") { - update.one[type.when] = update.one[type.when] || {}; - } else if (type.which === "from") { - update.from[type.when] = update.from[type.when] || {}; - cleanKeys(update.from, type.when); - cleanKeys(update.one, type.when); - } else if (type.which === "all") { - cleanKeys(update.from); - cleanKeys(update.one); - } - if (changes.start && update && (!type.which || type.which === "all")) { - var diff = changes.start - ev.start; - var newOne = {}; - var newFrom = {}; - Object.keys(update.one || {}).forEach((function(time) { - newOne[Number(time) + diff] = update.one[time]; - })); - Object.keys(update.from || {}).forEach((function(time) { - newFrom[Number(time) + diff] = update.from[time]; - })); - update.one = newOne; - update.from = newFrom; - } - var h = Util.find(ctx, [ "store", "proxy", "hideReminders" ]) || {}; - if (changes.reminders) { - if (type.which === "one") { - if (!type.when || type.when === ev.start) { - delete h[data.ev.id]; - } else { - delete h[data.ev.id + "|" + type.when]; - } - } else if (type.which === "from") { - Object.keys(h).filter((function(id) { - return id.indexOf(data.ev.id) === 0; - })).forEach((function(id) { - var time = Number(id.split("|")[1]); - if (!time) { - return; - } - if (time < type.when) { - return; - } - delete h[id]; - })); - } else { - Object.keys(h).filter((function(id) { - return id.indexOf(data.ev.id) === 0; - })).forEach((function(id) { - delete h[id]; - })); - } - } - Object.keys(changes).forEach((function(key) { - if (!alwaysAll.includes(key) && type.which === "one") { - if (key === "recurrenceRule") { - if (data.rawData && data.rawData.isOrigin) { - return ev[key] = changes[key]; - } - update.from[type.when] = update.from[type.when] || {}; - return update.from[type.when][key] = changes[key]; - } - update.one[type.when][key] = changes[key]; - return; - } - if (!alwaysAll.includes(key) && type.which === "from") { - update.from[type.when][key] = changes[key]; - return; - } - ev[key] = changes[key]; - })); - var startDate = new Date(ev.start); - var endDate = new Date(ev.end); - if (ev.isAllDay) { - ev.startDay = startDate.getFullYear() + "-" + (startDate.getMonth() + 1) + "-" + startDate.getDate(); - ev.endDay = endDate.getFullYear() + "-" + (endDate.getMonth() + 1) + "-" + endDate.getDate(); - } else { - delete ev.startDay; - delete ev.endDay; - } - if (changes.calendarId && newC) { - newC.proxy.content[data.ev.id] = Util.clone(ev); - delete c.proxy.content[data.ev.id]; - } - nThen((function(waitFor) { - Realtime.whenRealtimeSyncs(c.lm.realtime, waitFor()); - if (newC) { - Realtime.whenRealtimeSyncs(newC.lm.realtime, waitFor()); - } - })).nThen((function() { - if (newC) { - addReminders(ctx, id, { - id: ev.id, - start: 0 - }); - addReminders(ctx, ev.calendarId, ev); - } else if (changes.start || changes.reminders || changes.isAllDay) { - addReminders(ctx, id, ev); - } - { - sendUpdate(ctx, c); - } - if (newC && !dontSendUpdate) { - sendUpdate(ctx, newC); - } - cb(); - })); - }; - var deleteEvent = function(ctx, data, cId, cb) { - var id = data.calendarId; - var c = ctx.calendars[id]; - if (!c) { - return void cb({ - error: "ENOENT" - }); - } - c.proxy.content = c.proxy.content || {}; - var evId = data.id.split("|")[0]; - if (data.id === evId) { - delete c.proxy.content[data.id]; - } else { - var ev = c.proxy.content[evId]; - var s = data.raw && data.raw.start; - if (s) { - ev.recUpdate = ev.recUpdate || { - one: {}, - from: {} - }; - ev.recUpdate.one[s] = { - deleted: true - }; - } - } - Realtime.whenRealtimeSyncs(c.lm.realtime, (function() { - addReminders(ctx, id, { - id: data.id, - start: 0 - }); - sendUpdate(ctx, c); - cb(); - })); - }; - var removeClient = function(ctx, cId) { - var idx = ctx.clients.indexOf(cId); - if (idx !== -1) { - ctx.clients.splice(idx, 1); - } - Object.keys(ctx.calendars).forEach((function(id) { - var cal = ctx.calendars[id]; - if (cal.stores.length !== 1 || cal.stores[0] !== 0 || !cal.tempId.length) { - return; - } - var idx = cal.tempId.indexOf(cId); - if (idx !== -1) { - cal.tempId.splice(idx, 1); - } - if (!cal.tempId.length) { - cal.stores = []; - closeCalendar(ctx, id); - } - })); - }; - Calendar.init = function(cfg, waitFor, emit) { - var calendar = {}; - var store = cfg.store; - var ctx = { - loggedIn: store.loggedIn && store.proxy.edPublic, - store, - Store: cfg.Store, - pinPads: cfg.pinPads, - unpinPads: cfg.unpinPads, - updateMetadata: cfg.updateMetadata, - emit, - onReady: Util.mkEvent(true), - calendars: {}, - clients: [] - }; - initializeCalendars(ctx, waitFor((function(err) { - if (err) { - return; - } - openChannels(ctx); - }))); - ctx.store.proxy.on("change", [ "hideReminders" ], (function(o, n, p) { - var uid = p[1].split("|")[0]; - Object.keys(ctx.calendars).some((function(calId) { - var c = ctx.calendars[calId]; - if (!c || !c.proxy || !c.proxy.content) { - return; - } - if (c.proxy.content[uid]) { - setTimeout((function() { - addReminders(ctx, calId, c.proxy.content[uid]); - })); - return true; - } - })); - })); - calendar.closeTeam = function(teamId) { - Object.keys(ctx.calendars).forEach((function(id) { - var ctxCal = ctx.calendars[id]; - var idx = ctxCal.stores.indexOf(teamId); - if (idx === -1) { - return; - } - ctxCal.stores.splice(idx, 1); - var roIdx = ctxCal.roStores.indexOf(teamId); - if (roIdx !== -1) { - ctxCal.roStores.splice(roIdx, 1); - } - closeCalendar(ctx, id); - sendUpdate(ctx, ctxCal); - })); - }; - calendar.openTeam = function(teamId) { - var store = getStore(ctx, teamId); - if (!store) { - return; - } - initializeStore(ctx, store); - }; - calendar.upgradeTeam = function(teamId) { - if (!teamId) { - return; - } - var store = getStore(ctx, teamId); - if (!store) { - return; - } - Object.keys(ctx.calendars).forEach((function(id) { - var ctxCal = ctx.calendars[id]; - var idx = ctxCal.stores.indexOf(teamId); - if (idx === -1) { - return; - } - var _cal = store.proxy.calendars[id]; - var cal = Util.clone(_cal); - decryptTeamCalendarHref(store, cal); - openChannel(ctx, { - storeId: teamId, - data: cal - }); - sendUpdate(ctx, ctxCal); - })); - }; - calendar.removeClient = function(clientId) { - removeClient(ctx, clientId); - }; - calendar.execCommand = function(clientId, obj, cb) { - var cmd = obj.cmd; - var data = obj.data; - if (cmd === "SUBSCRIBE") { - return void subscribe(ctx, data, clientId, cb); - } - if (cmd === "OPEN") { - ctx.Store.onReadyEvt.reg((function() { - openCalendar(ctx, data, clientId, cb); - })); - return; - } - if (cmd === "IMPORT") { - if (ctx.store.offline) { - return void cb({ - error: "OFFLINE" - }); - } - if (!ctx.loggedIn) { - return void cb({ - error: "NOT_LOGGED_IN" - }); - } - return void importCalendar(ctx, data, clientId, cb); - } - if (cmd === "IMPORT_ICS") { - if (ctx.store.offline) { - return void cb({ - error: "OFFLINE" - }); - } - return void importICSCalendar(ctx, data, clientId, cb); - } - if (cmd === "ADD") { - if (ctx.store.offline) { - return void cb({ - error: "OFFLINE" - }); - } - if (!ctx.loggedIn) { - return void cb({ - error: "NOT_LOGGED_IN" - }); - } - return void addCalendar(ctx, data, clientId, cb); - } - if (cmd === "CREATE") { - if (!ctx.loggedIn) { - return void cb({ - error: "NOT_LOGGED_IN" - }); - } - if (data.initialCalendar) { - return void ctx.Store.onReadyEvt.reg((function() { - createCalendar(ctx, data, clientId, cb); - })); - } - if (ctx.store.offline) { - return void cb({ - error: "OFFLINE" - }); - } - return void createCalendar(ctx, data, clientId, cb); - } - if (cmd === "UPDATE") { - if (ctx.store.offline) { - return void cb({ - error: "OFFLINE" - }); - } - return void updateCalendar(ctx, data, clientId, cb); - } - if (cmd === "DELETE") { - if (ctx.store.offline) { - return void cb({ - error: "OFFLINE" - }); - } - if (!ctx.loggedIn) { - return void cb({ - error: "NOT_LOGGED_IN" - }); - } - return void deleteCalendar(ctx, data, clientId, cb); - } - if (cmd === "CREATE_EVENT") { - if (ctx.store.offline) { - return void cb({ - error: "OFFLINE" - }); - } - return void createEvent(ctx, data, clientId, cb); - } - if (cmd === "UPDATE_EVENT") { - if (ctx.store.offline) { - return void cb({ - error: "OFFLINE" - }); - } - return void updateEvent(ctx, data, clientId, cb); - } - if (cmd === "DELETE_EVENT") { - if (ctx.store.offline) { - return void cb({ - error: "OFFLINE" - }); - } - return void deleteEvent(ctx, data, clientId, cb); - } - }; - return calendar; - }; - return Calendar; - }; - if (module.exports) { - module.exports = factory(requireCommonUtil(), requireCommonHash(), requireCommonConstants(), requireCommonRealtime(), requireCacheStore(), requireRecurrence(), requireNthen(), requireChainpadListmap(), requireFlatpickr(), requireCrypto(), requireChainpad_dist()); - } - })(); - })(calendar$1); - return calendar$1.exports; - } - var hasRequiredAsyncStore; - function requireAsyncStore() { - if (hasRequiredAsyncStore) return asyncStore$1.exports; - hasRequiredAsyncStore = 1; - (function(module) { - (() => { - const factory = (ApiConfig = {}, Sortify, UserObject, ProxyManager, Migrate, Hash, Util, Constants, Feedback, Realtime, Messaging, Pinpad, Rpc, Merge, Cache, SF, AccountTS, DriveTS, Cursor, Support, Integration, OnlyOffice, Mailbox, Profile, Team, Messenger, History, Calendar, Block, NetConfig, AppConfig = {}, Crypto, ChainPad, CpNetflux, Listmap, Netflux, nThen) => { - const Account = AccountTS.Account; - const Drive = DriveTS.Drive; - const window = globalThis; - globalThis.nacl = globalThis.nacl || Crypto.Nacl; - const Saferphore = Util.Saferphore; - var onReadyEvt = Util.mkEvent(true); - var onCacheReadyEvt = Util.mkEvent(true); - var onJoinedEvt = Util.mkEvent(true); - var onPadRejectedEvt = Util.mkEvent(true); - const setCustomize = data => { - ApiConfig = data.ApiConfig; - AppConfig = data.AppConfig; - }; - var CACHE_MAX_AGE = 90; - var NEW_USER_SETTINGS = { - drive: { - hideDuplicate: true - }, - pad: { - width: true, - spellcheck: true - }, - security: { - unsafeLinks: false - }, - general: { - allowUserFeedback: true - } - }; - var create = function(config) { - var Store = window.Cryptpad_Store = {}; - let postMessage = config.query || function() {}; - let broadcast = config.broadcast || function() {}; - var store = window.CryptPad_AsyncStore = { - modules: {} - }; - Store.onReadyEvt = onReadyEvt; - var driveEventClients = []; - var sendDriveEvent = function(q, data, sender) { - driveEventClients.forEach((function(cId) { - if (cId === sender) { - return; - } - postMessage(cId, q, data); - })); - }; - var getStore = function(teamId) { - if (!teamId) { - return store; - } - try { - var teams = store.modules["team"]; - var team = teams.getTeam(teamId); - if (!team) { - console.error("Team not found", teamId); - return; - } - return team; - } catch (e) { - console.error(e); - console.error("Team not found", teamId); - return; - } - }; - var onSync = Store.onSync = function(teamId, cb) { - var s = getStore(teamId); - if (!s) { - return void cb({ - error: "ENOTFOUND" - }); - } - nThen((function(waitFor) { - if (s.realtime) { - Realtime.whenRealtimeSyncs(s.realtime, waitFor()); - } - if (!s.id && s.drive?.realtime) { - Realtime.whenRealtimeSyncs(s.drive.realtime, waitFor()); - } - if (s.sharedFolders && typeof s.sharedFolders === "object") { - for (var k in s.sharedFolders) { - if (!s.sharedFolders[k].realtime) { - continue; - } - Realtime.whenRealtimeSyncs(s.sharedFolders[k].realtime, waitFor()); - } - } - })).nThen((function() { - cb(); - })); - }; - Store.get = function(clientId, data, cb) { - var s = getStore(data.teamId); - if (!s) { - return void cb({ - error: "ENOTFOUND" - }); - } - if (!s.proxy) { - return void cb({ - error: "ENODRIVE" - }); - } - cb(Util.find(s.proxy, data.key)); - }; - Store.set = function(clientId, data, cb) { - var s = getStore(data.teamId); - if (!s) { - return void cb({ - error: "ENOTFOUND" - }); - } - if (!s.proxy) { - return void cb({ - error: "ENODRIVE" - }); - } - var path = data.key.slice(); - var key = path.pop(); - var obj = Util.find(s.proxy, path); - if (!obj || typeof obj !== "object") { - return void cb({ - error: "INVALID_PATH" - }); - } - if (typeof data.value === "undefined") { - delete obj[key]; - } else { - obj[key] = data.value; - } - if (!data.teamId) { - broadcast([ clientId ], "UPDATE_METADATA"); - if (Array.isArray(path) && path[0] === "profile" && store.messenger) { - Messaging.updateMyData(store); - } - } - onSync(data.teamId, cb); - }; - const copyObject = (src, target) => { - Object.keys(src).forEach((k => { - delete src[k]; - })); - Object.keys(target).forEach((k => { - src[k] = Util.clone(target[k]); - })); - }; - const getProxy = teamId => { - let proxy; - if (!teamId) { - proxy = store.drive?.proxy; - } else { - const s = getStore(teamId); - proxy = s?.drive?.proxy; - } - return proxy; - }; - Store.drive = { - get: (clientId, data, cb) => { - let proxy = getProxy(data.teamId); - if (!proxy) { - return void cb({ - error: "ENOTFOUND" - }); - } - cb(proxy); - }, - set: (clientId, data, cb) => { - let proxy = getProxy(data.teamId); - if (!proxy) { - return void cb({ - error: "ENOTFOUND" - }); - } - copyObject(proxy, data.value); - onSync(data.teamId, cb); - } - }; - Store.getSharedFolder = function(clientId, data, cb) { - var s = getStore(data.teamId); - var id = data.id; - var proxy; - if (!s || !s.manager) { - return void cb({ - error: "ENOTFOUND" - }); - } - if (s.manager.folders[id]) { - proxy = Util.clone(s.manager.folders[id].proxy); - proxy.offline = Boolean(s.manager.folders[id].offline); - return void cb(proxy); - } else { - var shared = Util.find(s.proxy, [ "drive", UserObject.SHARED_FOLDERS ]) || {}; - if (shared[id]) { - return void Store.loadSharedFolder(data.teamId, id, shared[id], (function() { - cb(s.manager.folders[id].proxy); - })); - } - } - cb({}); - }; - Store.restoreSharedFolder = function(clientId, data, cb) { - if (!data.sfId || !data.drive) { - return void cb({ - error: "EINVAL" - }); - } - var s = getStore(data.teamId); - if (s.sharedFolders[data.sfId]) { - Object.keys(data.drive).forEach((function(k) { - s.sharedFolders[data.sfId].proxy[k] = data.drive[k]; - })); - Object.keys(s.sharedFolders[data.sfId].proxy).forEach((function(k) { - if (data.drive[k]) { - return; - } - delete s.sharedFolders[data.sfId].proxy[k]; - })); - } - onSync(data.teamId, cb); - }; - Store.hasSigningKeys = function() { - if (!store.proxy) { - return; - } - return typeof store.proxy.edPrivate === "string" && typeof store.proxy.edPublic === "string"; - }; - Store.hasCurveKeys = function() { - if (!store.proxy) { - return; - } - return typeof store.proxy.curvePrivate === "string" && typeof store.proxy.curvePublic === "string"; - }; - Store.isOwned = function(owners) { - var edPublic = store.proxy.edPublic; - if (!edPublic) { - return false; - } - if (!Array.isArray(owners) || !owners.length) { - return false; - } - if (owners.indexOf(edPublic) !== -1) { - return true; - } - var teams = store.proxy.teams; - if (!teams) { - return false; - } - return Object.keys(teams).some((function(id) { - var ed = Util.find(teams[id], [ "keys", "drive", "edPublic" ]); - return ed && owners.indexOf(ed) !== -1; - })); - }; - var getUserChannelList = function() { - var userChannel = `${store.driveChannel}#drive`; - if (!userChannel) { - return null; - } - var list = store.manager.getChannelsList("pin"); - var profile = store.proxy.profile; - if (profile) { - var profileChan = profile.edit ? Hash.hrefToHexChannelId("/profile/#" + profile.edit, null) : null; - if (profileChan) { - list.push(profileChan); - } - var avatarChan = profile.avatar ? Hash.hrefToHexChannelId(profile.avatar, null) : null; - if (avatarChan) { - list.push(avatarChan); - } - } - if (store.proxy.todo) { - list.push(Hash.hrefToHexChannelId("/todo/#" + store.proxy.todo, null)); - } - if (store.proxy.friends) { - var fList = Messaging.getFriendChannelsList(store.proxy); - list = list.concat(fList); - } - if (store.proxy.mailboxes) { - var mList = Object.keys(store.proxy.mailboxes).map((function(m) { - if (m === "broadcast" && !store.isAdmin) { - return; - } - return store.proxy.mailboxes[m].channel; - })).filter(Boolean); - list = list.concat(mList); - } - if (store.proxy.calendars) { - var cList = Object.keys(store.proxy.calendars).map((function(c) { - return store.proxy.calendars[c].channel; - })); - list = list.concat(cList); - } - list.push(userChannel); - if (store.data && store.data.blockId) { - list.push(`${store.data.blockId}#block`); - } - list.sort(); - return list; - }; - var getExpirableChannelList = function() { - return store.manager.getChannelsList("expirable"); - }; - var getCanonicalChannelList = function(expirable) { - var list = expirable ? getExpirableChannelList() : getUserChannelList(); - return Util.deduplicateString(list).sort(); - }; - Store.pinPads = function(clientId, data, cb) { - if (!data) { - return void cb({ - error: "EINVAL" - }); - } - var s = getStore(data && data.teamId); - if (!s.rpc) { - return void cb({ - error: "RPC_NOT_READY" - }); - } - if (typeof cb !== "function") { - console.error("expected a callback"); - cb = function() {}; - } - var pads = data.pads || data; - s.rpc.pin(pads, (function(e) { - if (e) { - return void cb({ - error: e - }); - } - cb({}); - })); - }; - Store.unpinPads = function(clientId, data, cb) { - if (!data) { - return void cb({ - error: "EINVAL" - }); - } - var s = getStore(data && data.teamId); - if (!s.rpc) { - return void cb({ - error: "RPC_NOT_READY" - }); - } - var pads = data.pads || data; - s.rpc.unpin(pads, (function(e) { - if (e) { - return void cb({ - error: e - }); - } - cb({}); - })); - }; - var account = store.account = {}; - Store.getPinnedUsage = function(clientId, data, cb) { - var s = getStore(data && data.teamId); - if (!s || !s.rpc) { - return void cb({ - error: "RPC_NOT_READY" - }); - } - s.rpc.getFileListSize((function(err, bytes) { - if (!s.id && typeof bytes === "number") { - account.usage = bytes; - } - cb({ - bytes - }); - })); - }; - Store.updatePinLimit = function(clientId, data, cb) { - if (!store.rpc) { - return void cb({ - error: "RPC_NOT_READY" - }); - } - store.rpc.updatePinLimits((function(e, limit, plan, note) { - if (e) { - return void cb({ - error: e - }); - } - account.limit = limit; - account.plan = plan; - account.note = note; - cb(account); - })); - }; - Store.getPinLimit = function(clientId, data, cb) { - var s = getStore(data && data.teamId); - if (!s.rpc) { - return void cb({ - error: "RPC_NOT_READY" - }); - } - { - return void s.rpc.getLimit((function(e, limit, plan, note) { - if (e) { - return void cb({ - error: e - }); - } - var data = s.id ? {} : account; - data.limit = limit; - data.plan = plan; - data.note = note; - cb(data); - })); - } - }; - Store.clearOwnedChannel = function(clientId, data, cb) { - var s = getStore(data && data.teamId); - if (!s.rpc) { - return void cb({ - error: "RPC_NOT_READY" - }); - } - s.rpc.clearOwnedChannel(data.channel, (function(err) { - cb({ - error: err - }); - })); - }; - var myDeletions = {}; - Store.removeOwnedChannel = function(clientId, data, cb) { - var channel = data; - var force = false; - var teamId; - var reason; - if (data && typeof data === "object") { - channel = data.channel; - force = data.force; - teamId = data.teamId; - reason = data.reason; - } - if (channel === store.driveChannel && !force) { - return void cb({ - error: "User drive removal blocked!" - }); - } - var s = getStore(teamId); - if (!s) { - return void cb({ - error: "ENOTFOUND" - }); - } - if (!s.rpc) { - return void cb({ - error: "RPC_NOT_READY" - }); - } - if (Store.channels[channel]) { - myDeletions[channel] = true; - } - s.rpc.removeOwnedChannel(channel, (function(err) { - if (err) { - delete myDeletions[channel]; - } - cb({ - error: err - }); - }), reason); - }; - var arePinsSynced = function(cb) { - if (!store.rpc) { - return void cb({ - error: "RPC_NOT_READY" - }); - } - var list = getCanonicalChannelList(false); - var local = Hash.hashChannelList(list); - store.rpc.getServerHash((function(e, hash) { - if (e) { - return void cb(e); - } - cb(null, hash === local); - })); - }; - var resetPins = function(cb) { - if (!store.rpc) { - return void cb({ - error: "RPC_NOT_READY" - }); - } - var list = getCanonicalChannelList(false); - store.rpc.reset(list, (function(e) { - if (e) { - return void cb(e); - } - cb(null); - })); - }; - Store.uploadComplete = function(clientId, data, cb) { - var s = getStore(data.teamId); - if (!s) { - return void cb({ - error: "ENOTFOUND" - }); - } - if (!s.rpc) { - return void cb({ - error: "RPC_NOT_READY" - }); - } - if (data.owned) { - s.rpc.ownedUploadComplete(data.id, (function(err, res) { - if (err) { - return void cb({ - error: err - }); - } - cb(res); - })); - return; - } - s.rpc.uploadComplete(data.id, (function(err, res) { - if (err) { - return void cb({ - error: err - }); - } - cb(res); - })); - }; - Store.uploadStatus = function(clientId, data, cb) { - var s = getStore(data.teamId); - if (!s) { - return void cb({ - error: "ENOTFOUND" - }); - } - if (!s.rpc) { - return void cb({ - error: "RPC_NOT_READY" - }); - } - s.rpc.uploadStatus(data.size, (function(err, res) { - if (err) { - return void cb({ - error: err - }); - } - cb(res); - })); - }; - Store.uploadCancel = function(clientId, data, cb) { - var s = getStore(data.teamId); - if (!s) { - return void cb({ - error: "ENOTFOUND" - }); - } - if (!s.rpc) { - return void cb({ - error: "RPC_NOT_READY" - }); - } - s.rpc.uploadCancel(data.size, (function(err, res) { - if (err) { - return void cb({ - error: err - }); - } - cb(res); - })); - }; - Store.uploadChunk = function(clientId, data, cb) { - var s = getStore(data.teamId); - if (!s) { - return void cb({ - error: "ENOTFOUND" - }); - } - if (!s.rpc) { - return void cb({ - error: "RPC_NOT_READY" - }); - } - s.rpc.send.unauthenticated("UPLOAD", data.chunk, (function(e, msg) { - cb({ - error: e, - msg - }); - })); - }; - var initTempRpc = (clientId, cb) => { - if (store.rpc) { - return void cb(store.rpc); - } - var kp = Crypto.Nacl.sign.keyPair(); - var keys = { - edPublic: Crypto.Nacl.util.encodeBase64(kp.publicKey), - edPrivate: Crypto.Nacl.util.encodeBase64(kp.secretKey) - }; - Pinpad.create(store.network, keys, (function(e, call) { - if (e) { - return void cb({ - error: e - }); - } - store.rpc = call; - cb(call); - })); - }; - var initRpc = function(clientId, data, cb) { - if (!store.loggedIn) { - return cb(); - } - if (store.rpc) { - return void cb(account); - } - Pinpad.create(store.network, store.proxy, (function(e, call) { - if (e) { - return void cb({ - error: e - }); - } - store.rpc = call; - store.onRpcReadyEvt.fire(); - Store.getPinLimit(null, null, (function(obj) { - if (obj.error) { - console.error(obj.error); - } - account.limit = obj.limit; - account.plan = obj.plan; - account.note = obj.note; - cb(obj); - })); - }), Cache); - }; - Store.anonRpcMsg = function(clientId, data, cb) { - if (!store.anon_rpc) { - return void cb({ - error: "ANON_RPC_NOT_READY" - }); - } - store.anon_rpc.send(data.msg, data.data, (function(err, res) { - if (err) { - return void cb({ - error: err - }); - } - cb(res); - })); - }; - Store.getFileSize = function(clientId, data, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - if (!store.anon_rpc) { - return void cb({ - error: "ANON_RPC_NOT_READY" - }); - } - var channelId = data.channel || Hash.hrefToHexChannelId(data.href, data.password); - store.anon_rpc.send("GET_FILE_SIZE", channelId, (function(e, response) { - if (e) { - return void cb({ - error: e - }); - } - if (response && response.length && typeof response[0] === "number") { - if (response[0] === 0) { - Cache.clearChannel(channelId); - } - return void cb({ - size: response[0] - }); - } else { - cb({ - error: "INVALID_RESPONSE" - }); - } - })); - }; - Store.isNewChannel = function(clientId, data, cb) { - if (!store.anon_rpc) { - return void cb({ - error: "ANON_RPC_NOT_READY" - }); - } - var channelId = data.channel || Hash.hrefToHexChannelId(data.href, data.password); - store.anon_rpc.send("IS_NEW_CHANNEL", channelId, (function(e, response) { - if (e) { - return void cb({ - error: e - }); - } - if (response && response.length && typeof response[0] === "object") { - if (response[0].isNew) { - Cache.clearChannel(channelId); - } - return void cb(response[0]); - } else { - cb({ - error: "INVALID_RESPONSE" - }); - } - })); - }; - Store.getMultipleFileSize = function(clientId, data, cb) { - if (!store.anon_rpc) { - return void cb({ - error: "ANON_RPC_NOT_READY" - }); - } - if (!Array.isArray(data.files)) { - return void cb({ - error: "INVALID_FILE_LIST" - }); - } - store.anon_rpc.send("GET_MULTIPLE_FILE_SIZE", data.files, (function(e, res) { - if (e) { - return void cb({ - error: e - }); - } - if (res && res.length && typeof res[0] === "object") { - cb({ - size: res[0] - }); - } else { - cb({ - error: "UNEXPECTED_RESPONSE" - }); - } - })); - }; - Store.getDeletedPads = function(clientId, data, cb) { - if (!store.anon_rpc) { - return void cb({ - error: "ANON_RPC_NOT_READY" - }); - } - var list = data && data.list || getCanonicalChannelList(true); - if (!Array.isArray(list)) { - return void cb({ - error: "INVALID_FILE_LIST" - }); - } - store.anon_rpc.send("GET_DELETED_PADS", list, (function(e, res) { - if (e) { - return void cb({ - error: e - }); - } - if (res && res.length && Array.isArray(res[0])) { - cb(res[0]); - } else { - cb({ - error: "UNEXPECTED_RESPONSE" - }); - } - })); - }; - var initAnonRpc = function(clientId, data, cb) { - if (store.anon_rpc) { - return void cb(); - } - Rpc.createAnonymous(store.network, (function(e, call) { - if (e) { - return void cb({ - error: e - }); - } - store.anon_rpc = call; - cb(); - })); - }; - var getAllStores = Store.getAllStores = function() { - if (!store.proxy || !store.manager) { - return []; - } - var stores = [ store ]; - var teamModule = store.modules["team"]; - if (teamModule) { - var teams = teamModule.getTeams().map((function(id) { - return teamModule.getTeam(id); - })); - Array.prototype.push.apply(stores, teams); - } - return stores; - }; - Store.getUserColor = function() { - var color = Util.find(store, [ "proxy", "settings", "general", "cursor", "color" ]); - if (!color) { - color = Util.getRandomColor(true); - Store.setAttribute(null, { - attr: [ "general", "cursor", "color" ], - value: color - }, (function() {})); - } - return color; - }; - Store.getMetadata = function(clientId, app, cb) { - var proxy = store.proxy || {}; - var disableThumbnails = Util.find(proxy, [ "settings", "general", "disableThumbnails" ]); - var teams = store.modules["team"] && store.modules["team"].getTeamsData(app) || {}; - if (!proxy.uid) { - store.noDriveUid = store.noDriveUid || Hash.createChannelId(); - } - var metadata = { - user: { - name: proxy[Constants.displayNameKey] || store.noDriveName || "", - uid: proxy.uid || store.noDriveUid, - avatar: Util.find(proxy, [ "profile", "avatar" ]), - profile: Util.find(proxy, [ "profile", "view" ]), - color: Store.getUserColor(), - notifications: Util.find(proxy, [ "mailboxes", "notifications", "channel" ]), - curvePublic: proxy.curvePublic - }, - priv: { - clientId, - edPublic: proxy.edPublic, - friends: proxy.friends || {}, - settings: proxy.settings || NEW_USER_SETTINGS, - thumbnails: disableThumbnails === false, - isDriveOwned: Boolean(Util.find(store, [ "driveMetadata", "owners" ])), - driveChannel: store.driveChannel, - pendingFriends: proxy.friends_pending || {}, - supportPrivateKey: Util.find(proxy, [ "mailboxes", "supportadmin", "keys", "curvePrivate" ]), - accountName: proxy.login_name || "", - offline: store.proxy && store.offline, - teams, - plan: store.ready ? account.plan || "" : undefined, - mutedChannels: proxy.mutedChannels - } - }; - cb(JSON.parse(JSON.stringify(metadata))); - return metadata; - }; - Store.onMaintenanceUpdate = function() { - let origin = ApiConfig.httpUnsafeOrigin; - Util.fetchApi(origin, "broadcast", true, (Broadcast => { - if (!Broadcast) { - return; - } - broadcast([], "UNIVERSAL_EVENT", { - type: "broadcast", - data: { - ev: "MAINTENANCE", - data: Broadcast.maintenance - } - }); - })); - }; - Store.onSurveyUpdate = function() { - let origin = ApiConfig.httpUnsafeOrigin; - Util.fetchApi(origin, "broadcast", true, (Broadcast => { - broadcast([], "UNIVERSAL_EVENT", { - type: "broadcast", - data: { - ev: "SURVEY", - data: Broadcast.surveyURL - } - }); - })); - }; - var makePad = function(href, roHref, title) { - var now = +new Date; - return { - href, - roHref, - atime: now, - ctime: now, - title: title || UserObject.getDefaultName(Hash.parsePadUrl(href)) - }; - }; - Store.addPad = function(clientId, data, cb) { - if (!data.href && !data.roHref) { - return void cb({ - error: "NO_HREF" - }); - } - var secret; - if (!data.roHref) { - var parsed = Hash.parsePadUrl(data.href); - if (parsed.hashData.type === "pad") { - secret = Hash.getSecrets(parsed.type, parsed.hash, data.password); - data.roHref = "/" + parsed.type + "/#" + Hash.getViewHashFromKeys(secret); - } - } - var pad = makePad(data.href, data.roHref, data.title); - if (data.owners) { - pad.owners = data.owners; - } - if (data.expire) { - pad.expire = data.expire; - } - if (data.password) { - pad.password = data.password; - } - if (data.channel || secret) { - pad.channel = data.channel || secret.channel; - } - if (data.readme) { - pad.readme = 1; - } - if (data.teamId === -1) { - data.teamId = undefined; - } - var s = getStore(data.teamId); - if (!s || !s.manager) { - return void cb({ - error: "ENOTFOUND" - }); - } - s.manager.addPad(data.path, pad, (function(e) { - if (e) { - return void cb({ - error: e - }); - } - getAllStores().forEach((function(_s) { - var send = _s.id ? _s.sendEvent : sendDriveEvent; - send("DRIVE_CHANGE", { - path: [ "drive", UserObject.FILES_DATA ] - }, clientId); - })); - onSync(data.teamId, cb); - })); - }; - var getOwnedPads = function(account) { - var list = []; - if (account) { - if (store.proxy.todo) { - list.push(Hash.hrefToHexChannelId("/todo/#" + store.proxy.todo, null)); - } - if (store.proxy.profile && store.proxy.profile.edit) { - list.push(Hash.hrefToHexChannelId("/profile/#" + store.proxy.profile.edit, null)); - } - if (store.proxy.mailboxes) { - Object.keys(store.proxy.mailboxes || {}).forEach((function(id) { - if (id === "supportadmin") { - return; - } - var m = store.proxy.mailboxes[id]; - list.push(m.channel); - })); - } - } else { - list = store.manager.getChannelsList("owned"); - } - return list.filter((function(channel) { - if (typeof channel !== "string") { - return; - } - return [ 32, 48 ].indexOf(channel.length) !== -1; - })); - }; - var removeOwnedPads = function(account, waitFor) { - var edPublic = Util.find(store, [ "proxy", "edPublic" ]); - var ownedPads = getOwnedPads(account); - var sem = Saferphore.create(10); - var deleteChannel = function(c) { - if (account) { - return; - } - var all = store.manager.findChannel(c); - all.forEach((function(d) { - var p = store.manager.findFile(d.id); - store.manager.delete({ - paths: p - }); - })); - }; - ownedPads.forEach((function(c) { - var w = waitFor(); - sem.take((function(give) { - var otherOwners = false; - nThen((function(_w) { - if (c.length !== 32) { - return; - } - Store.anonRpcMsg(null, { - msg: "GET_METADATA", - data: c - }, _w((function(obj) { - if (obj && obj.error) { - give(); - w(); - return void _w.abort(); - } - var md = obj[0]; - if (!Object.keys(md || {}).length) { - deleteChannel(c); - give(); - w(); - return void _w.abort(); - } - var isOwner = md && Array.isArray(md.owners) && md.owners.indexOf(edPublic) !== -1; - if (!isOwner) { - give(); - w(); - return void _w.abort(); - } - otherOwners = md.owners.some((function(ed) { - return ed !== edPublic; - })); - }))); - })).nThen((function(_w) { - if (otherOwners) { - Store.setPadMetadata(null, { - channel: c, - command: "RM_OWNERS", - value: [ edPublic ] - }, _w()); - return; - } - store.rpc.removeOwnedChannel(c, _w((function(err) { - if (err) { - return void console.error(err); - } - deleteChannel(c); - }))); - })).nThen((function() { - give(); - w(); - })); - })); - })); - }; - Store.removeOwnedPads = function(clientId, data, cb) { - var edPublic = store.proxy.edPublic; - if (!edPublic) { - return void cb({ - error: "NOT_LOGGED_IN" - }); - } - nThen((function(waitFor) { - removeOwnedPads(false, waitFor); - })).nThen(cb); - }; - Store.deleteAccount = function(clientId, data, cb) { - var edPublic = store.proxy.edPublic; - var blockKeys = data && data.keys; - var auth = data && data.auth; - Store.anonRpcMsg(clientId, { - msg: "GET_METADATA", - data: store.driveChannel - }, (function(data) { - var metadata = data[0]; - if (metadata && metadata.owners && metadata.owners.length === 1 && metadata.owners.indexOf(edPublic) !== -1) { - nThen((function(waitFor) { - Block.checkRights({ - auth, - blockKeys - }, waitFor((function(err) { - if (err) { - waitFor.abort(); - console.error(err); - return void cb({ - error: "INVALID_CODE" - }); - } - }))); - })).nThen((function(waitFor) { - globalThis.accountDeletion = clientId; - store.proxy[Constants.tokenKey] = "DELETED"; - onSync(null, waitFor()); - })).nThen((function(waitFor) { - store.rpc.removePins(waitFor((function(err) { - if (err) { - console.error(err); - } - }))); - })).nThen((function(waitFor) { - store.ownDeletion = true; - Store.removeOwnedChannel(clientId, { - channel: store.driveChannel, - force: true - }, waitFor()); - })).nThen((function(waitFor) { - if (!blockKeys) { - return; - } - Block.removeLoginBlock({ - reason: "ARCHIVE_OWNED", - auth, - edPublic, - blockKeys - }, waitFor((function(err) { - if (err) { - console.error(err); - } - }))); - })).nThen((function(waitFor) { - removeOwnedPads(true, waitFor); - })).nThen((function() { - broadcast([ clientId ], "DRIVE_DELETED", "ARCHIVE_OWNED"); - postMessage(clientId, "DELETE_ACCOUNT", "DELETED", (function() {})); - store.network.disconnect(); - cb({ - state: true - }); - })); - return; - } - var toSign = { - intent: "Please delete my account." - }; - toSign.drive = store.driveChannel; - toSign.edPublic = edPublic; - var signKey = Crypto.Nacl.util.decodeBase64(store.proxy.edPrivate); - var proof = Crypto.Nacl.sign.detached(Crypto.Nacl.util.decodeUTF8(Sortify(toSign)), signKey); - var check = Crypto.Nacl.sign.detached.verify(Crypto.Nacl.util.decodeUTF8(Sortify(toSign)), proof, Crypto.Nacl.util.decodeBase64(edPublic)); - if (!check) { - console.error("signed message failed verification"); - } - var proofTxt = Crypto.Nacl.util.encodeBase64(proof); - cb({ - proof: proofTxt, - toSign: JSON.parse(Sortify(toSign)) - }); - })); - }; - Store.migrateAnonDrive = function(clientId, data, cb) { - var hash = data.anonHash; - Merge.anonDriveIntoUser(store, hash, cb); - }; - Store.setDisplayName = function(clientId, value, cb) { - if (!store.proxy) { - store.noDriveName = value; - broadcast([ clientId ], "UPDATE_METADATA"); - return void cb(); - } - if (store.modules["profile"]) { - store.modules["profile"].setName(value); - } - store.proxy[Constants.displayNameKey] = value; - broadcast([ clientId ], "UPDATE_METADATA"); - Messaging.updateMyData(store); - onSync(null, cb); - }; - Store.resetDrive = function(clientId, data, cb) { - nThen((function(waitFor) { - removeOwnedPads(waitFor); - })).nThen((function() { - store.proxy.drive = store.userObject.getStructure(); - sendDriveEvent("DRIVE_CHANGE", { - path: [ "drive", "filesData" ] - }, clientId); - onSync(null, cb); - })); - }; - Store.setPadAttribute = function(clientId, data, cb) { - nThen((function(waitFor) { - getAllStores().forEach((function(s) { - s.manager.setPadAttribute(data, waitFor((function() { - var send = s.id ? s.sendEvent : sendDriveEvent; - send("DRIVE_CHANGE", { - path: [ "drive", UserObject.FILES_DATA ] - }, clientId); - onSync(s.id, waitFor()); - }))); - })); - })).nThen(cb); - }; - Store.getPadAttribute = function(clientId, data, cb) { - var res = {}; - nThen((function(waitFor) { - getAllStores().forEach((function(s) { - s.manager.getPadAttribute(data, waitFor((function(err, val) { - if (err) { - return; - } - if (!val || typeof val !== "object") { - return void console.error("Not an object!"); - } - if (!res.value || res.atime < val.atime) { - res.atime = val.atime; - res.value = val.value; - } - }))); - })); - })).nThen((function() { - cb(res.value); - })); - }; - var getAttributeObject = function(attr) { - if (typeof attr === "string") { - console.error("DEPRECATED: use setAttribute with an array, not a string"); - return { - path: [ "settings" ], - obj: store.proxy.settings, - key: attr - }; - } - if (!Array.isArray(attr)) { - return void console.error("Attribute must be string or array"); - } - if (attr.length === 0) { - return void console.error("Attribute can't be empty"); - } - var obj = store.proxy.settings; - attr.forEach((function(el, i) { - if (i === attr.length - 1) { - return; - } - if (!obj[el]) { - obj[el] = {}; - } else if (typeof obj[el] !== "object") { - return void console.error("Wrong attribute"); - } - obj = obj[el]; - })); - return { - path: [ "settings" ].concat(attr), - obj, - key: attr[attr.length - 1] - }; - }; - Store.setAttribute = function(clientId, data, cb) { - try { - var object = getAttributeObject(data.attr); - object.obj[object.key] = data.value; - } catch (e) { - return void cb({ - error: e - }); - } - onSync(null, (function() { - cb(); - broadcast([], "UPDATE_METADATA"); - })); - }; - Store.getAttribute = function(clientId, data, cb) { - var object; - try { - object = getAttributeObject(data.attr); - } catch (e) { - return void cb({ - error: e - }); - } - cb(object.obj[object.key]); - }; - Store.listAllTags = function(clientId, data, cb) { - var tags = {}; - getAllStores().forEach((function(s) { - var l = s.manager.getTagsList(); - Object.keys(l).forEach((function(tag) { - tags[tag] = (tags[tag] || 0) + l[tag]; - })); - })); - cb(tags); - }; - Store.getTemplates = function(clientId, data, cb) { - var res = []; - var channels = []; - getAllStores().forEach((function(s) { - var templateFiles = s.userObject.getFiles([ "template" ]); - templateFiles.forEach((function(f) { - var data = s.userObject.getFileData(f); - if (channels.indexOf(data.channel) !== -1) { - return; - } - channels.push(data.channel); - res.push(JSON.parse(JSON.stringify(data))); - })); - })); - cb(res); - }; - Store.incrementTemplateUse = function(clientId, href) { - getAllStores().forEach((function(s) { - s.userObject.getPadAttribute(href, "used", (function(err, data) { - if (err) { - return; - } - var used = typeof data === "number" ? ++data : 1; - s.userObject.setPadAttribute(href, "used", used); - })); - })); - }; - Store.isOnlyInSharedFolder = function(clientId, channel, cb) { - var res = false; - var isInMainDrive = function(obj) { - return !obj.fId; - }; - getAllStores().some((function(s) { - var _res = s.manager.findChannel(channel); - if (!_res.length) { - return; - } - if (_res.some(isInMainDrive)) { - res = false; - return true; - } - res = true; - })); - return cb(res); - }; - Store.moveToTrash = function(clientId, data, cb) { - var href = Hash.getRelativeHref(data.href); - var allErrors = true; - nThen((function(waitFor) { - getAllStores().forEach((function(s) { - var deleted = s.userObject.forget(href); - if (!deleted) { - return; - } - allErrors = false; - var send = s.id ? s.sendEvent : sendDriveEvent; - send("DRIVE_CHANGE", { - path: [ "drive", UserObject.FILES_DATA ] - }, clientId); - onSync(s.id, waitFor()); - })); - })).nThen((function() { - cb({ - error: allErrors ? "FORBIDDEN" : undefined - }); - })); - }; - Store.setPadTitle = function(clientId, data, cb) { - onReadyEvt.reg((function() { - var title = data.title; - var href = data.href; - var channel = data.channel; - var p = Hash.parsePadUrl(href); - var h = p.hashData; - if (title.trim() === "") { - title = UserObject.getDefaultName(p); - } - if (AppConfig.disableAnonymousStore && !store.loggedIn) { - return void cb({ - notStored: true - }); - } - if (p.type === "debug") { - return void cb({ - notStored: true - }); - } - var channelData = Store.channels && Store.channels[channel]; - var owners; - if (channelData && channelData.wc && channel === channelData.wc.id) { - owners = channelData.data.owners || undefined; - } - if (data.owners) { - owners = data.owners; - } - var expire; - if (channelData && channelData.wc && channel === channelData.wc.id) { - expire = +channelData.data.expire || undefined; - } - if (data.expire) { - expire = data.expire; - } - if (data.teamId) { - data.teamId = Number(data.teamId); - } - var allData = []; - var sendTo = []; - var inTargetDrive, inMyDrive; - getAllStores().forEach((function(s) { - if (h.mode === "edit" && s.id && !s.secondaryKey) { - return; - } - var res = s.manager.findChannel(channel, true); - if (res.length) { - sendTo.push(s.id); - } - if (!s.id && (!data.teamId || data.teamId === -1) || Number(s.id) === data.teamId) { - if (!inTargetDrive) { - inTargetDrive = res.length; - } - } - if (!s.id) { - inMyDrive = res.length; - } - Array.prototype.push.apply(allData, res); - })); - var contains = allData.length !== 0; - if (store.offline && !contains) { - return void cb({ - error: "OFFLINE" - }); - } else if (store.offline) { - return void cb(); - } - allData.forEach((function(obj) { - var pad = obj.data; - pad.atime = +new Date; - pad.title = title; - if (owners || h.type !== "file") { - pad.owners = owners; - } - pad.expire = expire; - if (pad.readme) { - delete pad.readme; - Feedback.send("OPEN_README"); - } - if (h.mode === "view") { - return; - } - if (!pad.href) { - obj.userObject.restoreHref(href); - } - obj.userObject.setHref(channel, null, href); - })); - if (!contains || data.forceSave && !inTargetDrive) { - var autoStore = Util.find(store.proxy, [ "settings", "general", "autostore" ]); - if (autoStore !== 1 && !data.forceSave && !data.path) { - postMessage(clientId, "AUTOSTORE_DISPLAY_POPUP", { - autoStore - }); - return void cb({ - notStored: true - }); - } else { - var roHref; - if (h.mode === "view") { - roHref = href; - href = undefined; - } - Store.addPad(clientId, { - teamId: data.teamId, - href, - roHref, - channel, - title, - owners, - expire, - password: data.password, - path: data.path - }, cb); - postMessage(clientId, "AUTOSTORE_DISPLAY_POPUP", { - stored: true, - inMyDrive: inMyDrive || !contains && !data.teamId - }); - return; - } - } - sendTo.forEach((function(teamId) { - var send = teamId ? getStore(teamId).sendEvent : sendDriveEvent; - send("DRIVE_CHANGE", { - path: [ "drive", UserObject.FILES_DATA ] - }, clientId); - })); - postMessage(clientId, "AUTOSTORE_DISPLAY_POPUP", { - stored: true, - inMyDrive - }); - nThen((function(waitFor) { - sendTo.forEach((function(teamId) { - onSync(teamId, waitFor()); - })); - })).nThen(cb); - })); - }; - Store.getSecureFilesList = function(clientId, query, cb) { - var list = {}; - var types = query.types; - var where = query.where; - var filter = query.filter || {}; - var isFiltered = function(type, data) { - var filtered; - var fType = filter.fileType || []; - if (type === "file" && fType.length) { - if (!data.fileType) { - return true; - } - filtered = !fType.some((function(t) { - return data.fileType.indexOf(t) === 0; - })); - } - return filtered; - }; - var channels = []; - getAllStores().forEach((function(s) { - s.manager.getSecureFilesList(where).forEach((function(obj) { - var data = obj.data; - if (channels.indexOf(data.channel || data.id) !== -1) { - return; - } - var id = obj.id; - if (data.channel) { - channels.push(data.channel || data.id); - } - if (data.static) { - if (types.indexOf("link") !== -1) { - list[id] = data; - } - return; - } - var parsed = Hash.parsePadUrl(data.href || data.roHref); - if ((!types || types.length === 0 || types.indexOf(parsed.type) !== -1) && !isFiltered(parsed.type, data)) { - list[id] = data; - } - })); - })); - cb(list); - }; - Store.getPadData = function(clientId, id, cb) { - var res = {}; - getAllStores().some((function(s) { - var d = s.userObject.getFileData(id); - if (!d.roHref && !d.href) { - return; - } - res = d; - return true; - })); - cb(res); - }; - Store.getPadDataFromChannel = function(clientId, obj, cb) { - var channel = obj.channel; - var edit = obj.edit; - var isFile = obj.file; - var res; - var viewRes; - getAllStores().some((function(s) { - var chans = s.manager.findChannel(channel); - if (!Array.isArray(chans)) { - return; - } - return chans.some((function(pad) { - if (!pad || !pad.data) { - return; - } - var data = pad.data; - if (edit && data.href || !edit && data.roHref || isFile) { - res = data; - return true; - } - if (edit && !viewRes && data.roHref) { - viewRes = data; - } - })); - })); - var result = res || viewRes; - if (!result && store.offline) { - onReadyEvt.reg((function() { - Store.getPadDataFromChannel(clientId, obj, cb); - })); - return; - } - cb(result || {}); - }; - Store.checkDeletedPad = function(channel, cb) { - if (!channel) { - return; - } - Store.getPadDataFromChannel(null, { - channel, - isFile: true - }, (function(res) { - if (typeof cb === "function") { - setTimeout(cb); - } - if (Object.keys(res).length) { - return; - } - broadcast([], "CHANNEL_DELETED", channel); - })); - }; - Store.answerFriendRequest = function(clientId, obj, cb) { - var value = obj.value; - var data = obj.data; - if (data.type !== "notifications") { - return void cb({ - error: "EINVAL" - }); - } - var hash = data.content.hash; - var msg = data.content.msg; - var dismiss = function(cb) { - cb = cb || function() {}; - store.mailbox.dismiss({ - hash, - type: "notifications" - }, cb); - }; - if (value) { - Messaging.acceptFriendRequest(store, msg.content.user, (function(obj) { - if (obj && obj.error) { - return void cb(obj); - } - Messaging.addToFriendList({ - proxy: store.proxy, - realtime: store.realtime, - pinPads: function(data, cb) { - Store.pinPads(null, data, cb); - } - }, msg.content.user, (function(err) { - if (store.messenger) { - store.messenger.onFriendAdded(msg.content.user); - } - broadcast([], "UPDATE_METADATA"); - if (err) { - return void cb({ - error: err - }); - } - dismiss(cb); - })); - })); - return; - } - Messaging.declineFriendRequest(store, msg.content.user, (function(obj) { - broadcast([], "UPDATE_METADATA"); - cb(obj); - })); - dismiss(); - }; - Store.sendFriendRequest = function(clientId, data, cb) { - var friend = Messaging.getFriend(store.proxy, data.curvePublic); - if (friend) { - return void cb({ - error: "ALREADY_FRIEND" - }); - } - if (!data.notifications || !data.curvePublic) { - return void cb({ - error: "INVALID_USER" - }); - } - store.proxy.friends_pending = store.proxy.friends_pending || {}; - var p = store.proxy.friends_pending[data.curvePublic]; - if (p) { - return void cb({ - error: "ALREADY_SENT" - }); - } - store.proxy.friends_pending[data.curvePublic] = { - time: +new Date, - channel: data.notifications, - curvePublic: data.curvePublic - }; - broadcast([], "UPDATE_METADATA"); - store.mailbox.sendTo("FRIEND_REQUEST", { - user: Messaging.createData(store.proxy) - }, { - channel: data.notifications, - curvePublic: data.curvePublic - }, (function(obj) { - cb(obj); - })); - }; - Store.cancelFriendRequest = function(data, cb) { - if (!data.curvePublic || !data.notifications) { - return void cb({ - error: "EINVAL" - }); - } - var proxy = store.proxy; - var f = Messaging.getFriend(proxy, data.curvePublic); - if (f) { - console.error("You can't cancel an accepted friend request"); - return void cb({ - error: "ALREADY_FRIEND" - }); - } - var pending = Util.find(store, [ "proxy", "friends_pending" ]) || {}; - if (!pending) { - return void cb(); - } - store.mailbox.sendTo("CANCEL_FRIEND_REQUEST", { - user: Messaging.createData(store.proxy) - }, { - channel: data.notifications, - curvePublic: data.curvePublic - }, (function(obj) { - if (obj && obj.error) { - return void cb(obj); - } - delete store.proxy.friends_pending[data.curvePublic]; - broadcast([], "UPDATE_METADATA"); - onSync(null, (function() { - cb(obj); - })); - })); - }; - Store.anonGetPreviewContent = function(clientId, data, cb) { - Team.anonGetPreviewContent({ - store - }, data, cb); - }; - Store.getStrongerHash = function(clientId, data, _cb) { - var cb = Util.once(_cb); - var found = getAllStores().some((function(s) { - var stronger = s.manager.getEditHash(data.channel); - if (stronger) { - cb(stronger); - return true; - } - })); - if (!found) { - cb(); - } - }; - Store.universal = { - execCommand: function(clientId, obj, cb) { - var todo = function() { - var type = obj.type; - var data = obj.data; - if (store.modules[type]) { - store.modules[type].execCommand(clientId, data, cb); - } else { - return void cb({ - error: type + " is disabled" - }); - } - }; - if ([ "team", "calendar" ].indexOf(obj.type) !== -1) { - return void todo(); - } - if (!store.proxy) { - return void todo(); - } - onReadyEvt.reg(todo); - } - }; - var loadUniversal = function(Module, type, waitFor, clientId) { - if (store.modules[type]) { - return; - } - store.modules[type] = Module.init({ - Store, - store, - updateLoadingProgress: function(data) { - data.type = "team"; - postMessage(clientId, "LOADING_DRIVE", data); - }, - updateMetadata: function() { - broadcast([], "UPDATE_METADATA"); - }, - pinPads: function(data, cb) { - Store.pinPads(null, data, cb); - }, - unpinPads: function(data, cb) { - Store.unpinPads(null, data, cb); - } - }, waitFor, (function(ev, data, clients) { - clients.forEach((function(cId) { - postMessage(cId, "UNIVERSAL_EVENT", { - type, - data: { - ev, - data - } - }); - })); - })); - }; - Store.onlyoffice = { - execCommand: function(clientId, data, cb) { - if (!store.onlyoffice) { - return void cb({ - error: "OnlyOffice is disabled" - }); - } - store.onlyoffice.execCommand(clientId, data, cb); - } - }; - Store.mailbox = { - execCommand: function(clientId, data, cb) { - onReadyEvt.reg((function() { - if (!store.mailbox) { - return void cb({ - error: "Mailbox is disabled" - }); - } - store.mailbox.execCommand(clientId, data, cb); - })); - } - }; - Store.adminRpc = function(clientId, data, cb) { - store.rpc.adminRpc(data, (function(err, res) { - if (err) { - return void cb({ - error: err - }); - } - cb(res); - })); - }; - Store.addAdminMailbox = function(clientId, data, cb) { - var priv = data && data.priv; - var pub = Hash.getBoxPublicFromSecret(priv); - var isNewSupport = data && data.version === 2; - if (!priv || !pub) { - return void cb({ - error: "EINVAL" - }); - } - var channel = Hash.getChannelIdFromKey(pub); - var mailboxes = store.proxy.mailboxes = store.proxy.mailboxes || {}; - var key = isNewSupport ? "supportteam" : "supportadmin"; - var box = mailboxes[key] = { - channel, - viewed: [], - lastKnownHash: data.lastKnownHash || "", - keys: { - curvePublic: pub, - curvePrivate: priv - } - }; - Store.pinPads(null, [ channel ], (function() {})); - store.mailbox.open(key, box, (function() { - console.log("ready"); - })); - onSync(null, cb); - }; - var channels = Store.channels = store.channels = {}; - Store.getSnapshot = function(clientId, data, cb) { - Store.getHistoryRange(clientId, { - cpCount: 1, - channel: data.channel, - lastKnownHash: data.hash - }, cb); - }; - var getVersionHash = function(clientId, data) { - var validateKey; - var fakeNetflux = Hash.createChannelId(); - nThen((function(waitFor) { - Store.getPadMetadata(null, { - channel: data.channel - }, waitFor((function(md) { - if (md && md.rejected) { - postMessage(clientId, "PAD_ERROR", { - type: "ERESTRICTED" - }); - waitFor.abort(); - return; - } - validateKey = md.validateKey; - }))); - })).nThen((function() { - Store.getHistoryRange(clientId, { - cpCount: 1, - channel: data.channel, - lastKnownHash: data.versionHash - }, (function(obj) { - if (obj && obj.error) { - postMessage(clientId, "PAD_ERROR", obj.error); - return; - } - var msgs = obj.messages || []; - if (msgs.length && msgs[msgs.length - 1].serverHash !== data.versionHash) { - postMessage(clientId, "PAD_ERROR", { - type: "HASH_NOT_FOUND" - }); - return; - } - postMessage(clientId, "PAD_CONNECT", { - myID: fakeNetflux, - id: data.channel, - members: [ fakeNetflux ] - }); - (obj.messages || []).forEach((function(data) { - postMessage(clientId, "PAD_MESSAGE", { - msg: data.msg, - time: data.time, - user: fakeNetflux.slice(0, 16) - }); - })); - if (validateKey && store.messenger) { - store.messenger.storeValidateKey(data.channel, validateKey); - } - postMessage(clientId, "PAD_READY"); - })); - })); - }; - Store.onRejected = function(allowed, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - if (!Array.isArray(allowed)) { - return void cb("ERESTRICTED"); - } - onPadRejectedEvt.fire(); - onReadyEvt.reg((() => { - if (!store.loggedIn || !store.proxy.edPublic) { - return void cb("ERESTRICTED"); - } - var teamModule = store.modules["team"]; - var teams = teamModule && teamModule.getTeams() || []; - var _store; - if (allowed.indexOf(store.proxy.edPublic) !== -1) { - _store = store; - } else if (teams.some((function(teamId) { - var ed = Util.find(store, [ "proxy", "teams", teamId, "keys", "drive", "edPublic" ]); - var edPrivate = Util.find(store, [ "proxy", "teams", teamId, "keys", "drive", "edPrivate" ]); - if (allowed.indexOf(ed) === -1) { - return false; - } - if (!edPrivate) { - return false; - } - var t = teamModule.getTeam(teamId); - _store = t; - return true; - }))) ; - var auth = function() { - if (!_store) { - return void cb("ERESTRICTED"); - } - var rpc = _store.rpc; - if (!rpc) { - return void cb("ERESTRICTED"); - } - rpc.send("COOKIE", "", (function(err) { - cb(err); - })); - }; - if (_store && _store.onRpcReadyEvt) { - _store.onRpcReadyEvt.reg((function() { - auth(); - })); - return; - } - auth(); - })); - }; - Store.joinPad = function(clientId, data) { - if (data.versionHash) { - return void getVersionHash(clientId, data); - } - if (!Hash.isValidChannel(data.channel)) { - return void postMessage(clientId, "PAD_ERROR", "INVALID_CHAN"); - } - var isNew = typeof channels[data.channel] === "undefined"; - var channel = channels[data.channel] = channels[data.channel] || { - queue: [], - data: {}, - clients: [], - bcast: function(cmd, data, notMe) { - channel.clients.forEach((function(cId) { - if (cId === notMe) { - return; - } - postMessage(cId, cmd, data); - })); - }, - history: [], - pushHistory: function(msg, isCp) { - if (isCp) { - channel.history.push("cp|" + msg); - var i; - for (i = channel.history.length - 101; i > 0; i--) { - if (/^cp\|/.test(channel.history[i])) { - break; - } - } - channel.history = channel.history.slice(Math.max(i, 0)); - return; - } - channel.history.push(msg); - } - }; - if (channel.clients.indexOf(clientId) === -1) { - channel.clients.push(clientId); - } - if (!isNew && channel.wc) { - postMessage(clientId, "PAD_CONNECT", { - myID: channel.wc.myID, - id: channel.wc.id, - members: channel.wc.members - }); - channel.wc.members.forEach((function(m) { - postMessage(clientId, "PAD_JOIN", m); - })); - channel.history.forEach((function(msg) { - postMessage(clientId, "PAD_MESSAGE", { - msg: CpNetflux.removeCp(msg), - user: channel.wc.myID, - validateKey: channel.data.validateKey - }); - })); - postMessage(clientId, "PAD_READY"); - return; - } - var onError = function(err) { - if (err && err.type === "EDELETED" && myDeletions[data.channel]) { - delete myDeletions[channel]; - err.ownDeletion = true; - } - channel.bcast("PAD_ERROR", err); - if (err && err.type === "EDELETED" && Cache && Cache.clearChannel) { - Cache.clearChannel(data.channel); - } - if ([ "EDELETED", "EEXPIRED", "ERESTRICTED" ].indexOf(err.type) === -1) { - return; - } - Store.leavePad(null, data, (function() {})); - }; - var conf = { - Cache: store.neverCache ? undefined : Cache, - priority: 1, - onCacheStart: function() { - postMessage(clientId, "PAD_CACHE"); - }, - onCacheReady: function() { - console.error("PAD CACHE READY"); - postMessage(clientId, "PAD_CACHE_READY"); - }, - onReady: function(pad) { - console.error("PAD READY"); - var padData = pad.metadata || {}; - channel.data = padData; - if (padData && padData.validateKey && store.messenger) { - store.messenger.storeValidateKey(data.channel, padData.validateKey); - } - postMessage(clientId, "PAD_READY", pad.noCache); - }, - onMessage: function(m, user, validateKey, isCp, hash) { - channel.lastHash = hash; - channel.pushHistory(m, isCp); - channel.bcast("PAD_MESSAGE", { - user, - msg: m, - validateKey - }); - }, - onJoin: function(m) { - channel.bcast("PAD_JOIN", m); - }, - onLeave: function(m) { - channel.bcast("PAD_LEAVE", m); - }, - onError, - onChannelError: onError, - onRejected: Store.onRejected, - onConnectionChange: function(info) { - if (!info.state) { - channel.bcast("PAD_DISCONNECT"); - } - }, - onMetadataUpdate: function(metadata) { - channel.data = metadata || {}; - getAllStores().forEach((function(s) { - var allData = s.manager.findChannel(data.channel, true); - allData.forEach((function(obj) { - obj.data.owners = metadata.owners; - obj.data.atime = +new Date; - if (metadata.expire) { - obj.data.expire = +metadata.expire; - } - })); - var send = s.sendEvent || sendDriveEvent; - send("DRIVE_CHANGE", { - path: [ "drive", UserObject.FILES_DATA ] - }); - })); - channel.bcast("PAD_METADATA", metadata); - }, - crypto: { - encrypt: function(m) { - return m; - }, - decrypt: function(m) { - return m; - } - }, - noChainPad: true, - channel: data.channel, - metadata: data.metadata, - network: store.network || store.networkPromise, - websocketURL: NetConfig.getWebsocketURL(), - onInit: function() { - onJoinedEvt.fire(); - }, - onConnect: function(wc, sendMessage) { - channel.sendMessage = function(msg, cId, cb) { - sendMessage(msg, (function(err) { - if (err) { - return void cb({ - error: err - }); - } - channel.lastHash = msg.slice(0, 64); - channel.pushHistory(CpNetflux.removeCp(msg), /^cp\|/.test(msg)); - channel.bcast("PAD_MESSAGE", { - user: wc.myID, - msg: CpNetflux.removeCp(msg), - validateKey: channel.data.validateKey - }, cId); - cb(); - })); - }; - channel.wc = wc; - channel.queue.forEach((function(data) { - channel.sendMessage(data.message, clientId); - })); - channel.queue = []; - channel.bcast("PAD_CONNECT", { - myID: wc.myID, - id: wc.id, - members: wc.members - }); - } - }; - channel.cpNf = CpNetflux.start(conf); - }; - Store.leavePad = function(clientId, data, cb) { - var channel = channels[data.channel]; - if (!channel || !channel.cpNf) { - return void cb({ - error: "EINVAL" - }); - } - Store.dropChannel(data.channel); - cb(); - }; - Store.sendPadMsg = function(clientId, data, cb) { - var msg = data.msg; - var channel = channels[data.channel]; - if (!channel) { - return; - } - if (!channel.wc) { - channel.queue.push(msg); - return void cb(); - } - channel.sendMessage(msg, clientId, cb); - }; - Store.corruptedCache = function(clientId, channel) { - var chan = channels[channel]; - if (!chan || !chan.cpNf) { - return; - } - Cache.clearChannel(channel); - if (!chan.cpNf.resetCache) { - return; - } - chan.cpNf.resetCache(); - }; - Store.changePadPasswordPin = function(clientId, data, cb) { - var oldChannel = data.oldChannel; - var channel = data.channel; - nThen((function(waitFor) { - getAllStores().forEach((function(s) { - var allData = s.manager.findChannel(channel); - if (!allData.length) { - return; - } - s.rpc.unpin([ oldChannel ], waitFor()); - s.rpc.pin([ channel ], waitFor()); - })); - })).nThen(cb); - }; - Store.contactPadOwner = function(clientId, data, cb) { - var owners = data.owners; - if (!Array.isArray(owners) || !owners.length) { - return cb({ - state: false - }); - } - if (!data.send) { - return void cb({ - state: true - }); - } - nThen((function(waitFor) { - owners.forEach((function(owner) { - var sendTo = function(query, msg, user, _cb) { - if (store.mailbox && !data.anon) { - return store.mailbox.sendTo(query, msg, user, _cb); - } - Mailbox.sendToAnon(store.anon_rpc, query, msg, user, _cb); - }; - sendTo(data.query, { - channel: data.channel, - data: data.msgData - }, { - channel: owner.notifications, - curvePublic: owner.curvePublic - }, waitFor()); - })); - })).nThen((function() { - cb({ - state: true - }); - })); - }; - Store.givePadAccess = function(clientId, data, cb) { - var edPublic = store.proxy.edPublic; - var channel = data.channel; - var res = store.manager.findChannel(channel); - if (!data.user || !data.user.notifications || !data.user.curvePublic) { - return void cb({ - error: "EINVAL" - }); - } - var href, title; - if (!res.some((function(obj) { - if (obj.data && Array.isArray(obj.data.owners) && obj.data.owners.indexOf(edPublic) !== -1 && obj.data.href) { - href = obj.data.href; - title = obj.data.title; - return true; - } - }))) { - return void cb({ - error: "ENOTFOUND" - }); - } - store.mailbox.sendTo("GIVE_PAD_ACCESS", { - channel, - href, - title - }, { - channel: data.user.notifications, - curvePublic: data.user.curvePublic - }); - cb(); - }; - Store.getLastHash = function(clientId, data, cb) { - var chan = channels[data.channel]; - if (!chan) { - return void cb({ - error: "ENOCHAN" - }); - } - if (!chan.lastHash) { - return void cb({ - error: "EINVAL" - }); - } - cb({ - hash: chan.lastHash - }); - }; - var notifyOwnerPadRemoved = function(data, obj) { - var channel = data.channel; - var href = data.href; - var parsed = Hash.parsePadUrl(href); - var secret = Hash.getSecrets(parsed.type, parsed.hash, data.password); - if (obj && obj.error) { - return; - } - if (!obj.mailbox) { - return; - } - var crypto = Crypto.createEncryptor(secret.keys); - var m = []; - try { - if (typeof obj.mailbox === "string") { - m.push(crypto.decrypt(obj.mailbox, true, true)); - } else { - Object.keys(obj.mailbox).forEach((function(k) { - m.push(crypto.decrypt(obj.mailbox[k], true, true)); - })); - } - } catch (e) { - console.error(e); - } - var curvePublic; - try { - curvePublic = store.proxy.curvePublic; - } catch (err) { - console.error(err); - return; - } - m.forEach((function(obj) { - var mb = JSON.parse(obj); - if (mb.curvePublic === curvePublic) { - return; - } - store.mailbox.sendTo("OWNED_PAD_REMOVED", { - channel - }, { - channel: mb.notifications, - curvePublic: mb.curvePublic - }, (function() {})); - })); - }; - Store.burnPad = function(clientId, data) { - var channel = data.channel; - var ownerKey = Crypto.b64AddSlashes(data.ownerKey || ""); - if (!channel || !ownerKey) { - return void console.error("Can't delete BAR pad"); - } - try { - var signKey = Hash.decodeBase64(ownerKey); - var pair = Crypto.Nacl.sign.keyPair.fromSecretKey(signKey); - Pinpad.create(store.network, { - edPublic: Hash.encodeBase64(pair.publicKey), - edPrivate: Hash.encodeBase64(pair.secretKey) - }, (function(e, rpc) { - if (e) { - return void console.error(e); - } - Store.getPadMetadata(null, { - channel - }, (function(md) { - rpc.removeOwnedChannel(channel, (function(err) { - if (err) { - return void console.error(err); - } - notifyOwnerPadRemoved(data, md); - })); - })); - })); - } catch (e) { - console.error(e); - } - }; - Store.getPadMetadata = function(clientId, data, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - if (store.offline || !store.anon_rpc) { - return void cb({ - error: "OFFLINE" - }); - } - if (!data.channel) { - return void cb({ - error: "ENOTFOUND" - }); - } - if (data.channel.length !== 32) { - return void cb({ - error: "EINVAL" - }); - } - if (!Hash.isValidChannel(data.channel)) { - Feedback.send("METADATA_INVALID_CHAN"); - return void cb({ - error: "EINVAL" - }); - } - store.anon_rpc.send("GET_METADATA", data.channel, (function(err, obj) { - if (err) { - return void cb({ - error: err - }); - } - var metadata = obj && obj[0] || {}; - cb(metadata); - if (metadata.rejected) { - return; - } - getAllStores().forEach((function(s) { - var allData = s.manager.findChannel(data.channel, true); - var changed = false; - allData.forEach((function(obj) { - if (Sortify(obj.data.owners) !== Sortify(metadata.owners)) { - changed = true; - } - obj.data.owners = metadata.owners; - obj.data.atime = +new Date; - if (metadata.expire) { - obj.data.expire = +metadata.expire; - } - })); - if (!changed) { - return; - } - var send = s.sendEvent || sendDriveEvent; - send("DRIVE_CHANGE", { - path: [ "drive", UserObject.FILES_DATA ] - }); - })); - })); - }; - Store.setPadMetadata = function(clientId, data, cb) { - if (!data.channel) { - return void cb({ - error: "ENOTFOUND" - }); - } - if (!data.command) { - return void cb({ - error: "EINVAL" - }); - } - var s = getStore(data.teamId); - if (!s) { - return void cb({ - error: "ENOTFOUND" - }); - } - var otherChannels = data.channels; - delete data.channels; - s.rpc.setMetadata(data, (function(err, res) { - if (err) { - return void cb({ - error: err - }); - } - if (!Array.isArray(res) || !res.length) { - return void cb({}); - } - cb(res[0]); - })); - if (Array.isArray(otherChannels)) { - otherChannels.forEach((function(chan) { - var _d = Util.clone(data); - _d.channel = chan; - Store.setPadMetadata(clientId, _d, (function() {})); - })); - } - }; - Store.deleteMailboxMessage = function(clientId, data, cb) { - if (!store.anon_rpc) { - return void cb({ - error: "RPC_NOT_READY" - }); - } - store.anon_rpc.send("DELETE_MAILBOX_MESSAGE", data, (function(e) { - cb({ - error: e - }); - })); - }; - Store.getFullHistory = function(clientId, data, cb) { - var network = store.network; - var hk = network.historyKeeper; - var parse = function(msg) { - try { - return JSON.parse(msg); - } catch (e) { - return null; - } - }; - var msgs = []; - var completed = false; - var onMsg = function(msg) { - if (completed) { - return; - } - var parsed = parse(msg); - if (!parsed) { - return; - } - if (parsed[0] === "FULL_HISTORY_END") { - cb(msgs); - network.off("message", onMsg); - completed = true; - return; - } - if (parsed[0] !== "FULL_HISTORY") { - return; - } - if (parsed[1] && parsed[1].validateKey) { - return; - } - if (parsed[1][3] !== data.channel) { - return; - } - msg = parsed[1][4]; - if (msg) { - msg = msg.replace(/cp\|(([A-Za-z0-9+\/=]+)\|)?/, ""); - if (data.debug) { - msgs.push({ - serverHash: msg.slice(0, 64), - msg, - author: parsed[1][1], - time: parsed[1][5] - }); - } else { - msgs.push(msg); - } - } - }; - network.on("message", onMsg); - network.sendto(hk, JSON.stringify([ "GET_FULL_HISTORY", data.channel, data.validateKey ])); - }; - Store.getHistory = function(clientId, data, _cb, full) { - var cb = Util.once(Util.mkAsync(_cb)); - var network = store.network; - var hk = network.historyKeeper; - var parse = function(msg) { - try { - return JSON.parse(msg); - } catch (e) { - return null; - } - }; - var txid = Math.floor(Math.random() * 1e6); - var msgs = []; - var completed = false; - var onMsg = function(msg, sender) { - if (completed) { - return; - } - if (sender !== hk) { - return; - } - var parsed = parse(msg); - if (!parsed) { - return; - } - if (parsed.txid && parsed.txid !== txid) { - return; - } - if (parsed.validateKey && parsed.channel) { - return; - } - if (parsed.error && parsed.channel) { - if (parsed.channel === data.channel) { - network.off("message", onMsg); - completed = true; - cb({ - error: parsed.error - }); - } - return; - } - if (parsed.state === 1 && parsed.channel) { - if (parsed.channel !== data.channel) { - return; - } - cb(msgs); - network.off("message", onMsg); - completed = true; - return; - } - if (Array.isArray(parsed) && parsed[0] && parsed[0] !== txid) { - return; - } - if (parsed[3] !== data.channel) { - return; - } - if (parsed[4] && full) { - msgs.push({ - msg, - hash: parsed[4].slice(0, 64) - }); - return; - } - msg = parsed[4]; - if (msg) { - msg = msg.replace(/cp\|(([A-Za-z0-9+\/=]+)\|)?/, ""); - msgs.push(msg); - } - }; - network.on("message", onMsg); - var cfg = { - txid, - lastKnownHash: data.lastKnownHash - }; - var msg = [ "GET_HISTORY", data.channel, cfg ]; - network.sendto(hk, JSON.stringify(msg)); - }; - Store.getHistoryRange = function(clientId, data, cb) { - var network = store.network; - var hk = network.historyKeeper; - var parse = function(msg) { - try { - return JSON.parse(msg); - } catch (e) { - return null; - } - }; - var msgs = []; - var first = true; - var fullHistory = false; - var completed = false; - var lastKnownHash; - var txid = Util.uid(); - var onMsg = function(msg) { - if (completed) { - return; - } - var parsed = parse(msg); - if (parsed[1] !== txid) { - console.log("bad txid"); - return; - } - if (parsed[0] === "HISTORY_RANGE_ERROR") { - cb({ - error: parsed[2] - }); - return; - } - if (parsed[0] === "HISTORY_RANGE_END") { - cb({ - messages: msgs, - isFull: fullHistory, - lastKnownHash - }); - completed = true; - return; - } - if (parsed[0] !== "HISTORY_RANGE") { - return; - } - if (parsed[2] && parsed[1].validateKey) { - return; - } - if (parsed[2][3] !== data.channel) { - return; - } - msg = parsed[2][4]; - if (msg) { - if (first) { - if (!/^cp\|/.test(msg) && !data.toHash) { - fullHistory = true; - } - lastKnownHash = msg.slice(0, 64); - first = false; - } - msg = msg.replace(/cp\|(([A-Za-z0-9+\/=]+)\|)?/, ""); - msgs.push({ - serverHash: msg.slice(0, 64), - msg, - author: parsed[2][1], - time: parsed[2][5] - }); - } - }; - network.on("message", onMsg); - network.sendto(hk, JSON.stringify([ "GET_HISTORY_RANGE", data.channel, { - from: data.lastKnownHash, - to: data.toHash, - cpCount: data.cpCount || 2, - txid - } ])); - }; - var registerProxyEvents = function(proxy, fId) { - if (!proxy) { - return; - } - if (proxy.deprecated || proxy.restricted) { - return; - } - if (!fId) { - proxy.on("change", [ "drive", UserObject.SHARED_FOLDERS ], (function(o, n, p) { - if (p.length > 3 && p[3] === "password") { - var id = p[2]; - var data = proxy.drive[UserObject.SHARED_FOLDERS][id]; - var href = store.manager.user.userObject.getHref ? store.manager.user.userObject.getHref(data) : data.href; - var parsed = Hash.parsePadUrl(href); - var secret = Hash.getSecrets(parsed.type, parsed.hash, o); - SF.updatePassword(Store, { - oldChannel: secret.channel, - password: n, - href - }, store.network, (function() { - console.log("Shared folder password changed"); - })); - return false; - } - })); - } - proxy.on("change", [], (function(o, n, p) { - if (fId) { - if (p[0] === UserObject.FILES_DATA && typeof n === "object" && n.channel && !n.owners) { - var toPin = [ n.channel ]; - if (n.rtChannel) { - toPin.push(n.rtChannel); - } - if (n.lastVersion) { - toPin.push(n.lastVersion); - } - Store.pinPads(null, toPin, (function(obj) { - console.error(obj); - })); - } - if (p[0] === UserObject.FILES_DATA && typeof o === "object" && o.channel && !n) { - var toUnpin = [ o.channel ]; - var c = store.manager.findChannel(o.channel); - var exists = c.some((function(data) { - return data.fId !== fId; - })); - if (!exists) { - if (o.rtChannel) { - toUnpin.push(o.rtChannel); - } - if (o.lastVersion) { - toUnpin.push(o.lastVersion); - } - Store.unpinPads(null, toUnpin, (function(obj) { - console.error(obj); - })); - } - } - } - if (o && !n && Array.isArray(p) && (p[0] === UserObject.FILES_DATA || p[0] === "drive" && p[1] === UserObject.FILES_DATA)) { - setTimeout((function() { - Store.checkDeletedPad(o && o.channel); - })); - } - sendDriveEvent("DRIVE_CHANGE", { - id: fId, - old: o, - new: n, - path: p - }); - })); - proxy.on("remove", [], (function(o, p) { - sendDriveEvent("DRIVE_REMOVE", { - id: fId, - old: o, - path: p - }); - })); - }; - var addSharedFolderHandler = function() { - store.sharedFolders = {}; - store.handleSharedFolder = function(id, rt) { - if (!rt) { - delete store.sharedFolders[id]; - return; - } - store.sharedFolders[id] = rt; - if (store.driveEvents) { - registerProxyEvents(rt.proxy, id); - } - }; - }; - Store.loadSharedFolder = function(teamId, id, data, cb, isNew) { - var s = getStore(teamId); - if (!s) { - return void cb({ - error: "ENOTFOUND" - }); - } - var parsed = Hash.parsePadUrl(data.href || data.roHref); - if (!parsed && !parsed.hashData) { - return void cb({ - error: "EINVAL" - }); - } - SF.load({ - isNew, - network: store.network || store.networkPromise, - store: s, - Store, - isNewChannel: Store.isNewChannel - }, id, data, cb); - }; - var loadSharedFolder = function(id, data, cb, isNew) { - Store.loadSharedFolder(null, id, data, cb, isNew); - }; - Store.loadSharedFolderAnon = function(clientId, data, cb) { - Store.loadSharedFolder(null, data.id, data.data, (function(rt) { - cb({ - error: rt ? undefined : "EDELETED" - }); - })); - }; - Store.addSharedFolder = function(clientId, data, cb) { - onReadyEvt.reg((function() { - var s = getStore(data.teamId); - s.manager.addSharedFolder(data, (function(id) { - if (id && typeof id === "object" && id.error) { - return void cb(id); - } - var send = data.teamId ? s.sendEvent : sendDriveEvent; - send("DRIVE_CHANGE", { - path: [ "drive", UserObject.FILES_DATA ] - }, clientId); - cb(id); - })); - })); - }; - Store.updateSharedFolderPassword = function(clientId, data, cb) { - SF.updatePassword(Store, data, store.network, cb); - }; - Store.userObjectCommand = function(clientId, cmdData, cb) { - if (!cmdData || !cmdData.cmd) { - return; - } - var s = getStore(cmdData.teamId); - if (s.offline) { - var send = s.id ? s.sendEvent : sendDriveEvent; - send("NETWORK_DISCONNECT"); - return void cb({ - error: "OFFLINE" - }); - } - var cb2 = function(data2) { - getAllStores().forEach((function(_s) { - var send = _s.id ? _s.sendEvent : sendDriveEvent; - send("DRIVE_CHANGE", { - path: [ "drive", UserObject.FILES_DATA ] - }, clientId); - })); - onSync(cmdData.teamId, (function() { - cb(data2); - })); - }; - s.manager.command(cmdData, cb2); - }; - var alwaysOnline = function(chanId) { - if (!store) { - return; - } - if (store.driveChannel === chanId) { - return true; - } - if (SF.isSharedFolderChannel(chanId)) { - return true; - } - if (Util.find(store, [ "proxy", "teams" ])) { - var t = Util.find(store, [ "proxy", "teams" ]) || {}; - return Object.keys(t).some((function(id) { - return t[id].channel === chanId; - })); - } - if (Util.find(store, [ "proxy", "profile", "href" ])) { - return Hash.hrefToHexChannelId(Util.find(store, [ "proxy", "profile", "href" ])) === chanId; - } - }; - var dropChannel = Store.dropChannel = function(chanId) { - console.error("Drop channel", chanId); - try { - store.messenger.leavePad(chanId); - } catch (e) { - console.error(e); - } - try { - store.modules["cursor"].leavePad(chanId); - } catch (e) { - console.error(e); - } - try { - store.modules["integration"].leavePad(chanId); - } catch (e) { - console.error(e); - } - try { - store.onlyoffice.leavePad(chanId); - } catch (e) { - console.error(e); - } - try { - if (alwaysOnline(chanId)) { - delete Store.channels[chanId]; - return; - } - } catch (e) { - console.error(e); - } - try { - Cache.leaveChannel(chanId); - } catch (e) { - console.error(e); - } - if (!Store.channels[chanId]) { - return; - } - if (Store.channels[chanId].cpNf) { - Store.channels[chanId].cpNf.stop(); - } - delete Store.channels[chanId]; - }; - Store._removeClient = function(clientId) { - var driveIdx = driveEventClients.indexOf(clientId); - if (driveIdx !== -1) { - driveEventClients.splice(driveIdx, 1); - } - try { - store.onlyoffice?.removeClient(clientId); - } catch (e) { - console.error(e); - } - try { - store.mailbox?.removeClient(clientId); - } catch (e) { - console.error(e); - } - Object.keys(store.modules).forEach((function(key) { - if (!store.modules[key]) { - return; - } - if (!store.modules[key].removeClient) { - return; - } - try { - store.modules[key].removeClient(clientId); - } catch (e) { - console.error(e); - } - })); - Object.keys(Store.channels).forEach((function(chanId) { - var chanIdx = Store.channels[chanId].clients.indexOf(clientId); - if (chanIdx !== -1) { - Store.channels[chanId].clients.splice(chanIdx, 1); - } - if (Store.channels[chanId].clients.length === 0) { - dropChannel(chanId); - } - })); - }; - var loadOnlyOffice = function() { - if (store.onlyoffice) { - return; - } - store.onlyoffice = OnlyOffice.init(store, (function(ev, data, clients) { - clients.forEach((function(cId) { - postMessage(cId, "OO_EVENT", { - ev, - data - }); - })); - })); - }; - var loadMailbox = function(waitFor) { - store.mailbox = Mailbox.init({ - Store, - store, - updateMetadata: function() { - broadcast([], "UPDATE_METADATA"); - }, - updateDrive: function() { - sendDriveEvent("DRIVE_CHANGE", { - path: [ "drive", "filesData" ] - }); - }, - pinPads: function(data, cb) { - Store.pinPads(null, data, cb); - } - }, waitFor, (function(ev, data, clients, _cb) { - var cb = Util.once(_cb || function() {}); - clients.forEach((function(cId) { - postMessage(cId, "MAILBOX_EVENT", { - ev, - data - }, cb); - })); - })); - }; - Store.refreshDriveUI = function() { - getAllStores().forEach((function(_s) { - var send = _s.id ? _s.sendEvent : sendDriveEvent; - send("DRIVE_CHANGE", { - path: [ "drive", UserObject.FILES_DATA ] - }); - })); - }; - var onCacheReady = function(clientId, _cb) { - const cb = Util.mkAsync(_cb); - var proxy = store.proxy; - var drive = store.drive; - if (store.manager) { - return void cb(); - } - var unpin = function(data, cb) { - if (!store.loggedIn) { - return void cb(); - } - Store.unpinPads(null, data, cb); - }; - var pin = function(data, cb) { - if (!store.loggedIn) { - return void cb(); - } - Store.pinPads(null, data, cb); - }; - var manager = store.manager = ProxyManager.create(drive.proxy, { - onSync: function(cb) { - onSync(null, cb); - }, - edPublic: proxy.edPublic, - pin, - unpin, - loadSharedFolder, - settings: proxy.settings, - removeOwnedChannel: function(channel, cb) { - Store.removeOwnedChannel("", channel, cb); - }, - store, - Store - }, { - outer: true, - edPublic: store.proxy.edPublic, - loggedIn: store.loggedIn, - log: function(msg) { - sendDriveEvent("DRIVE_LOG", msg); - }, - rt: drive.realtime - }); - var userObject = store.userObject = manager.user.userObject; - nThen((function(waitFor) { - addSharedFolderHandler(); - userObject.migrate(waitFor()); - })).nThen((function(waitFor) { - console.error("START LOADING SF"); - var network = store.network || store.networkPromise; - SF.loadSharedFolders(Store, network, store, drive.proxy, userObject, waitFor, (obj => { - var data = { - type: "sf", - progress: 100 * obj.progress / obj.max - }; - postMessage(clientId, "LOADING_DRIVE", data); - }), true); - })).nThen((function(waitFor) { - console.error("SF CACHE READY"); - loadUniversal(Team, "team", waitFor, clientId); - })).nThen((function(waitFor) { - console.error("TEAM CACHE READY"); - loadUniversal(Calendar, "calendar", waitFor); - })).nThen((function() { - cb(); - })); - }; - const loadSyncModules = (waitFor = function() {}) => { - loadUniversal(Cursor, "cursor", waitFor); - loadUniversal(Integration, "integration", waitFor); - loadUniversal(Messenger, "messenger", waitFor); - loadUniversal(History, "history", waitFor); - loadOnlyOffice(); - if (store) { - store.messenger = store.modules["messenger"]; - } - }; - var onReady = function(clientId, returned, cb) { - store.ready = true; - var proxy = store.proxy; - var manager = store.manager; - var userObject = store.userObject; - nThen((function(waitFor) { - if (!proxy.settings) { - proxy.settings = NEW_USER_SETTINGS; - } - if (!proxy.forms) { - proxy.forms = {}; - } - if (!proxy.friends_pending) { - proxy.friends_pending = {}; - } - if (!proxy.form_seed) { - proxy.form_seed = Hash.createChannelId(); - } - if (!manager) { - onCacheReady(clientId, waitFor()); - manager = store.manager; - userObject = store.userObject; - } - initAnonRpc(null, null, waitFor()); - initRpc(null, null, waitFor()); - postMessage(clientId, "LOADING_DRIVE", { - type: "migrate", - progress: 0 - }); - })).nThen((function(waitFor) { - if (typeof proxy.version === "undefined") { - proxy.version = 11; - } - Migrate(proxy, waitFor(), (function(version, progress) { - postMessage(clientId, "LOADING_DRIVE", { - type: "migrate", - progress - }); - }), store); - })).nThen((function(waitFor) { - postMessage(clientId, "LOADING_DRIVE", { - type: "sf", - progress: 0 - }); - userObject.fixFiles(); - SF.loadSharedFolders(Store, store.network, store, store.drive.proxy, userObject, waitFor, (obj => { - var data = { - type: "sf", - progress: 100 * obj.progress / obj.max - }; - postMessage(clientId, "LOADING_DRIVE", data); - })); - loadSyncModules(waitFor); - loadUniversal(Profile, "profile", waitFor); - loadUniversal(Calendar, "calendar", waitFor); - if (store.modules["team"]) { - store.modules["team"].onReady(waitFor); - } - loadUniversal(Support, "support", waitFor); - })).nThen((function() { - console.error("SF & TEAM READY"); - var requestLogin = function() { - broadcast([], "REQUEST_LOGIN"); - }; - if (store.loggedIn) { - arePinsSynced((function(err, yes) { - if (!yes) { - resetPins((function(err) { - if (err) { - return console.error(err); - } - console.log("RESET DONE"); - })); - } - })); - if (typeof proxy.loginToken !== "number") { - proxy[Constants.tokenKey] = store.data.localToken || Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); - } - returned[Constants.tokenKey] = proxy[Constants.tokenKey]; - if (store.data.localToken && store.data.localToken !== proxy[Constants.tokenKey]) { - return void requestLogin(); - } - } - returned.feedback = Util.find(proxy, [ "settings", "general", "allowUserFeedback" ]); - Feedback.init(returned.feedback); - store.returned = returned; - if (typeof cb === "function") { - cb(returned); - } - store.offline = false; - sendDriveEvent("NETWORK_RECONNECT"); - broadcast([], "UPDATE_METADATA"); - broadcast([], "STORE_READY", returned); - if (typeof proxy.uid !== "string" || proxy.uid.length !== 32) { - console.log("generating a persistent identifier"); - proxy.uid = Hash.createChannelId(); - } - if (store.loggedIn && (!Store.hasSigningKeys() || !Store.hasCurveKeys())) { - return void requestLogin(); - } - proxy.on("change", [ Constants.displayNameKey ], (function(o, n) { - if (typeof n !== "string") { - return; - } - broadcast([], "UPDATE_METADATA"); - })); - proxy.on("change", [ "profile" ], (function() { - broadcast([], "UPDATE_METADATA"); - })); - proxy.on("change", [ "friends" ], (function(o, n, p) { - broadcast([], "UPDATE_METADATA"); - if (!store.messenger) { - return; - } - if (o !== undefined) { - return; - } - var curvePublic = p.slice(-1)[0]; - var friend = proxy.friends && proxy.friends[curvePublic]; - store.messenger.onFriendAdded(friend); - })); - proxy.on("remove", [ "friends" ], (function(o, p) { - broadcast([], "UPDATE_METADATA"); - if (!store.messenger) { - return; - } - var curvePublic = p[1]; - if (!curvePublic) { - return; - } - if (p[2] !== "channel") { - return; - } - store.messenger.onFriendRemoved(curvePublic, o); - })); - proxy.on("change", [ "friends_pending" ], (function() { - broadcast([], "UPDATE_METADATA"); - })); - proxy.on("remove", [ "friends_pending" ], (function() { - broadcast([], "UPDATE_METADATA"); - })); - proxy.on("change", [ "settings" ], (function() { - broadcast([], "UPDATE_METADATA"); - })); - proxy.on("change", [ Constants.tokenKey ], (function() { - if (store.isDeleted || proxy[Constants.tokenKey] === "DELETED") { - return; - } - broadcast([], "UPDATE_TOKEN", { - token: proxy[Constants.tokenKey] - }); - })); - loadMailbox(); - onReadyEvt.fire(); - })); - }; - const loadAccount = (clientId, data, cacheCb, cb) => { - if (store.accountModule) { - return store.accountModule; - } - const account = Account.init({ - userHash: data.userHash, - anonHash: data.anonHash, - cache: data.cache, - form_seed: data.form_seed, - store, - broadcast, - postMessage - }); - store.accountModule = account; - const {channel, onAccountReady, onAccountCacheReady, onDisconnect, onReconnect} = account; - store.driveChannel = channel; - onAccountCacheReady((returned => { - store.returned ||= returned; - cacheCb(returned); - })); - onAccountReady((returned => { - store.returned ||= returned; - cb(returned); - })); - onDisconnect((() => { - sendDriveEvent("NETWORK_DISCONNECT"); - })); - onReconnect((() => { - sendDriveEvent("NETWORK_RECONNECT"); - })); - const PING_INTERVAL = 12e4; - const MAX_PING = 3e4; - const MAX_FAILED_PING = 2; - setInterval((function() { - var clients = []; - Object.keys(Store.channels).forEach((function(chanId) { - var c = Store.channels[chanId].clients; - Array.prototype.push.apply(clients, c); - })); - clients = Util.deduplicateString(clients); - clients.forEach((function(cId) { - var nb = 0; - var ping = function() { - if (nb >= MAX_FAILED_PING) { - Store._removeClient(cId); - postMessage(cId, "TIMEOUT"); - console.error("TIMEOUT", cId); - return; - } - nb++; - var to = setTimeout(ping, MAX_PING); - postMessage(cId, "PING", null, (function(err) { - if (err) { - console.error(err); - } - clearTimeout(to); - })); - }; - ping(); - })); - }), PING_INTERVAL); - return account; - }; - const loadDrive = (clientId, data, cacheCb, cb) => { - const startDrive = Util.once((account => { - const drive = Drive.init({ - account, - store, - broadcast, - postMessage - }); - const {onDriveReady, onDriveCacheReady, onDisconnect, onReconnect} = drive; - onDriveCacheReady((() => { - cacheCb(store.returned); - })); - onDriveReady((() => { - cb(store.returned); - })); - onDisconnect((() => {})); - onReconnect((() => {})); - })); - const noop = () => {}; - const account = loadAccount(clientId, data, noop, noop); - account.onAccountCacheReady((() => { - startDrive(account); - })); - account.onAccountReady((() => { - startDrive(account); - })); - }; - Store.disableCache = function(clientId, disabled, cb) { - if (disabled) { - Cache.disable(); - } else { - Cache.enable(); - } - cb(); - }; - var initialized = false; - Store.hasDrive = function(clientId, data, cb) { - cb({ - state: Boolean(store.proxy) - }); - }; - const loadHK = cb => { - if (store?.network?.historyKeeper) { - return setTimeout(cb); - } - const onNetwork = network => { - store.network ||= network; - const chan = "0000000000000000000000000000000000"; - network.join(chan).then((function(wc) { - let hk; - wc.members.forEach((p => { - if (p.length === 16) { - hk = p; - } - })); - network.historyKeeper = hk; - wc.leave(); - cb(); - }), (function(err) { - console.error(err); - cb({ - error: "GET_HK" - }); - })); - }; - if (store.network) { - return onNetwork(store.network); - } - store.networkPromise?.then(onNetwork); - }; - var onNoDrive = function(clientId, cb, initRpc) { - var andThen = function() { - loadSyncModules(); - let getAnon = () => { - initAnonRpc(null, null, (function() { - Feedback.send("NO_DRIVE", true); - cb({}); - })); - }; - if (initRpc) { - return initTempRpc(clientId, getAnon); - } - getAnon(); - }; - if (!store.network) { - var wsUrl = NetConfig.getWebsocketURL(); - return void Netflux.connect(wsUrl).then((function(network) { - if (!store.network) { - store.network = network; - } else { - network.disconnect(); - network = store.network; - } - loadHK((err => { - if (err) { - return void cb(err); - } - andThen(); - })); - }), (function(err) { - console.error(err); - cb({ - error: "OFFLINE" - }); - })); - } - andThen(); - }; - const startCacheModules = (clientId, returned, cb) => { - onCacheReady(clientId, (function() { - cb(returned); - onCacheReadyEvt.fire(); - })); - }; - const startModules = (clientId, returned, cb) => { - if (store.manager) { - return void onCacheReadyEvt.reg((function() { - const onNetwork = _network => { - store.network ||= _network; - onReady(clientId, returned, (() => { - cb(returned); - })); - }; - loadHK(onNetwork); - })); - } - onReady(clientId, returned, (() => { - cb(returned); - })); - }; - const start = (clientId, data, cb) => { - const noDrive = data.neverDrive || data.noDrive && !data.userHash && !data.anonHash; - if (noDrive) { - if (data.neverDrive) { - store.neverCache = true; - } - return void onNoDrive(clientId, (obj => { - if (obj?.error) { - Feedback.send("NO_DRIVE_ERROR", true); - } - cb(obj); - }), !!data.neverDrive); - } - const requires = data.requires; - initialized = true; - store.data = data; - let onInit = ret => { - if (Object.keys(store.proxy).length === 1) { - Feedback.send("FIRST_APP_USE", true); - } - if (ret && ret.error) { - initialized = false; - } - }; - if (requires === "pad") { - return void onNoDrive(clientId, (function(obj) { - if (obj && obj.error) { - return; - } - cb(obj); - let next = Util.once((() => { - loadDrive(clientId, data, (ret => { - startCacheModules(clientId, ret, onInit); - }), (ret => { - startModules(clientId, ret, onInit); - })); - })); - onJoinedEvt.reg(next); - onPadRejectedEvt.reg(next); - })); - } - if (requires === "file") { - return void onNoDrive(clientId, (function(obj) { - if (obj && obj.error) { - return; - } - cb(obj); - loadDrive(clientId, data, (ret => { - startCacheModules(clientId, ret, onInit); - }), (ret => { - startModules(clientId, ret, onInit); - })); - })); - } - if (requires === "team") { - const initTeams = Util.once((ret => { - nThen((w => { - loadUniversal(Team, "team", w, clientId); - })).nThen((() => { - cb(ret); - loadDrive(clientId, data, (ret => { - startCacheModules(clientId, ret, onInit); - }), (ret => { - startModules(clientId, ret, onInit); - })); - })); - })); - return void loadAccount(clientId, data, initTeams, initTeams); - } - if (requires === "drive") { - return void loadDrive(clientId, data, (ret => { - cb(ret); - startCacheModules(clientId, ret, onInit); - }), (ret => { - cb(ret); - startModules(clientId, ret, onInit); - })); - } - let done = ret => { - onInit(ret); - const redirect = Constants.prefersDriveRedirectKey; - const redirectPreference = Util.find(store, [ "proxy", "settings", "general", redirect ]); - ret[redirect] = redirectPreference; - cb(ret); - }; - loadDrive(clientId, data, (ret => { - startCacheModules(clientId, ret, done); - }), (ret => { - startModules(clientId, ret, done); - })); - }; - let subscribeToDrive = function(clientId) { - onCacheReadyEvt.reg((() => { - if (driveEventClients.indexOf(clientId) === -1) { - driveEventClients.push(clientId); - } - if (!store.driveEvents) { - store.driveEvents = true; - registerProxyEvents(store.proxy); - Object.keys(store.manager.folders).forEach((function(fId) { - var proxy = store.manager.folders[fId].proxy; - registerProxyEvents(proxy, fId); - })); - } - })); - }; - Store.init = function(clientId, data, _callback) { - var callback = Util.once((function(obj) { - if (data.driveEvents) { - subscribeToDrive(clientId); - } - _callback(obj); - })); - if (initialized && !store.returned && data.cache) { - return void onCacheReadyEvt.reg((function() { - callback({ - state: "ALREADY_INIT", - returned: store.cacheReturned - }); - })); - } - if (initialized) { - if (store.networkTimeout) { - postMessage(clientId, "LOADING_DRIVE", { - type: "offline" - }); - } - return void onReadyEvt.reg((function() { - callback({ - state: "ALREADY_INIT", - returned: store.returned - }); - })); - } - if (data.disableCache) { - Cache.disable(); - } - if (data.noDrive && !data.requires) { - data.requires = "pad"; - } - start(clientId, data, Util.once((obj => { - if (obj.error === "GET_HK") { - return void callback({ - error: "ERROR" - }); - } - callback(obj); - }))); - }; - onReadyEvt.reg((function() { - var inactiveTime = +new Date - CACHE_MAX_AGE * (24 * 3600 * 1e3); - Cache.getKeys((function(err, keys) { - if (err) { - return void console.error(err); - } - var next = function() { - if (!keys.length) { - return; - } - var key = keys.pop(); - Cache.getTime(key, (function(err, atime) { - if (err) { - return void next(); - } - if (!atime || atime < inactiveTime) { - Cache.clearChannel(key, next()); - return; - } - next(); - })); - }; - next(); - })); - })); - Store.disconnect = function() { - if (globalThis.accountDeletion) { - return; - } - if (!store.network) { - return; - } - store.network.disconnect(); - }; - return Store; - }; - return { - setCustomize, - create - }; - }; - if (module.exports) { - module.exports = factory(undefined, requireJSON_sortify(), requireUserObject(), requireProxyManager(), requireMigrateUserObject(), requireCommonHash(), requireCommonUtil(), requireCommonConstants(), requireCommonFeedback(), requireCommonRealtime(), requireCommonMessaging(), requirePinpad(), requireRpc(), requireMergeDrive(), requireCacheStore(), requireSharedfolder(), require$$15, require$$16, requireCursor(), requireSupport(), requireIntegration(), requireOnlyoffice(), requireMailbox(), requireProfile(), requireTeam(), requireMessenger(), requireHistory(), requireCalendar(), requireLoginBlock(), requireNetworkConfig(), undefined, requireCrypto(), requireChainpad_dist(), requireChainpadNetflux(), requireChainpadListmap(), requireNetfluxClient(), requireNthen()); - } - })(); - })(asyncStore$1); - return asyncStore$1.exports; - } - var asyncStoreExports = requireAsyncStore(); - var asyncStore = getDefaultExportFromCjs(asyncStoreExports); - var Store = _mergeNamespaces({ - __proto__: null, - default: asyncStore - }, [ asyncStoreExports ]); - var _interface = { - exports: {} - }; - var storeRpc = { - exports: {} - }; - var hasRequiredStoreRpc; - function requireStoreRpc() { - if (hasRequiredStoreRpc) return storeRpc.exports; - hasRequiredStoreRpc = 1; - (function(module) { - (() => { - const factory = AStore => { - var create = function(config) { - var Store = AStore.create(config); - var Rpc = {}; - var queries = Rpc.queries = { - CONNECT: Store.init, - DISCONNECT: Store.disconnect, - MIGRATE_ANON_DRIVE: Store.migrateAnonDrive, - PING: function(cId, data, cb) { - cb(); - }, - CACHE_DISABLE: Store.disableCache, - HAS_DRIVE: Store.hasDrive, - UPDATE_PIN_LIMIT: Store.updatePinLimit, - GET_PIN_LIMIT: Store.getPinLimit, - CLEAR_OWNED_CHANNEL: Store.clearOwnedChannel, - REMOVE_OWNED_CHANNEL: Store.removeOwnedChannel, - UPLOAD_CHUNK: Store.uploadChunk, - UPLOAD_COMPLETE: Store.uploadComplete, - UPLOAD_STATUS: Store.uploadStatus, - UPLOAD_CANCEL: Store.uploadCancel, - PIN_PADS: Store.pinPads, - UNPIN_PADS: Store.unpinPads, - GET_DELETED_PADS: Store.getDeletedPads, - GET_PINNED_USAGE: Store.getPinnedUsage, - ANON_RPC_MESSAGE: Store.anonRpcMsg, - GET_FILE_SIZE: Store.getFileSize, - GET_MULTIPLE_FILE_SIZE: Store.getMultipleFileSize, - GET: Store.get, - SET: Store.set, - GET_DRIVE: Store.drive.get, - SET_DRIVE: Store.drive.set, - ADD_PAD: Store.addPad, - SET_PAD_TITLE: Store.setPadTitle, - MOVE_TO_TRASH: Store.moveToTrash, - RESET_DRIVE: Store.resetDrive, - GET_METADATA: Store.getMetadata, - IS_ONLY_IN_SHARED_FOLDER: Store.isOnlyInSharedFolder, - SET_DISPLAY_NAME: Store.setDisplayName, - SET_PAD_ATTRIBUTE: Store.setPadAttribute, - GET_PAD_ATTRIBUTE: Store.getPadAttribute, - SET_ATTRIBUTE: Store.setAttribute, - GET_ATTRIBUTE: Store.getAttribute, - LIST_ALL_TAGS: Store.listAllTags, - GET_TEMPLATES: Store.getTemplates, - GET_SECURE_FILES_LIST: Store.getSecureFilesList, - GET_PAD_DATA: Store.getPadData, - GET_PAD_DATA_FROM_CHANNEL: Store.getPadDataFromChannel, - GET_STRONGER_HASH: Store.getStrongerHash, - INCREMENT_TEMPLATE_USE: Store.incrementTemplateUse, - GET_SHARED_FOLDER: Store.getSharedFolder, - ADD_SHARED_FOLDER: Store.addSharedFolder, - LOAD_SHARED_FOLDER: Store.loadSharedFolderAnon, - RESTORE_SHARED_FOLDER: Store.restoreSharedFolder, - UPDATE_SHARED_FOLDER_PASSWORD: Store.updateSharedFolderPassword, - ANSWER_FRIEND_REQUEST: Store.answerFriendRequest, - SEND_FRIEND_REQUEST: Store.sendFriendRequest, - ANON_GET_PREVIEW_CONTENT: Store.anonGetPreviewContent, - OO_COMMAND: Store.onlyoffice.execCommand, - MAILBOX_COMMAND: Store.mailbox.execCommand, - UNIVERSAL_COMMAND: Store.universal.execCommand, - SEND_PAD_MSG: Store.sendPadMsg, - JOIN_PAD: Store.joinPad, - LEAVE_PAD: Store.leavePad, - GET_FULL_HISTORY: Store.getFullHistory, - GET_HISTORY: Store.getHistory, - GET_HISTORY_RANGE: Store.getHistoryRange, - IS_NEW_CHANNEL: Store.isNewChannel, - CONTACT_PAD_OWNER: Store.contactPadOwner, - GIVE_PAD_ACCESS: Store.givePadAccess, - BURN_PAD: Store.burnPad, - GET_PAD_METADATA: Store.getPadMetadata, - SET_PAD_METADATA: Store.setPadMetadata, - CHANGE_PAD_PASSWORD_PIN: Store.changePadPasswordPin, - GET_LAST_HASH: Store.getLastHash, - GET_SNAPSHOT: Store.getSnapshot, - CORRUPTED_CACHE: Store.corruptedCache, - DELETE_MAILBOX_MESSAGE: Store.deleteMailboxMessage, - DRIVE_USEROBJECT: Store.userObjectCommand, - DELETE_ACCOUNT: Store.deleteAccount, - REMOVE_OWNED_PADS: Store.removeOwnedPads, - ADMIN_RPC: Store.adminRpc, - ADMIN_ADD_MAILBOX: Store.addAdminMailbox - }; - Rpc.query = function(cmd, data, cb) { - if (queries[cmd]) { - queries[cmd]("0", data, cb); - } else { - console.error("UNHANDLED_STORE_RPC"); - } - }; - Rpc._removeClient = Store._removeClient; - return Rpc; - }; - return { - create - }; - }; - if (module.exports) { - module.exports = factory(requireAsyncStore()); - } - })(); - })(storeRpc); - return storeRpc.exports; - } - var workerChannel = { - exports: {} - }; - var hasRequiredWorkerChannel; - function requireWorkerChannel() { - if (hasRequiredWorkerChannel) return workerChannel.exports; - hasRequiredWorkerChannel = 1; - (function(module) { - (() => { - const factory = (Util, ApiConfig = {}) => { - var mkTxid = function() { - return Math.random().toString(16).replace("0.", "") + Math.random().toString(16).replace("0.", ""); - }; - var create = function(onMsg, postMsg, cb) { - var chanLoaded; - var waitingData = []; - var evReady = Util.mkEvent(true); - onMsg.reg((function(msg) { - if (chanLoaded) { - return; - } - var data = msg.data; - if (data === "_READY") { - postMsg("_READY"); - chanLoaded = true; - evReady.fire(); - waitingData.forEach((function(d) { - onMsg.fire(d); - })); - return; - } - waitingData.push(data); - })); - var handlers = {}; - var queries = {}; - var acks = {}; - var insideHandlers = []; - var callWhenRegistered = {}; - var chan = {}; - chan.query = function(q, content, cb, opts) { - var txid = mkTxid(); - opts = opts || {}; - var to = opts.timeout || 3e4; - var timeout; - if (to > 0) { - timeout = setTimeout((function() { - delete queries[txid]; - cb("TIMEOUT"); - }), to); - } - acks[txid] = function(err) { - clearTimeout(timeout); - delete acks[txid]; - if (err) { - delete queries[txid]; - cb("UNHANDLED"); - } - }; - queries[txid] = function(data, msg) { - delete queries[txid]; - cb(undefined, data.content, msg); - }; - evReady.reg((function() { - var toSend = { - txid, - content, - q, - raw: opts.raw - }; - postMsg(opts.raw ? toSend : JSON.stringify(toSend)); - })); - }; - var event = chan.event = function(e, content, opts) { - opts = opts || {}; - evReady.reg((function() { - var toSend = { - content, - q: e, - raw: opts.raw - }; - postMsg(opts.raw ? toSend : JSON.stringify(toSend)); - })); - }; - chan.on = function(queryType, handler, quiet) { - var h = function(data, msg, raw) { - handler(data.content, (function(replyContent) { - var toSend = { - txid: data.txid, - content: replyContent - }; - postMsg(raw ? toSend : JSON.stringify(toSend)); - }), msg); - }; - (handlers[queryType] = handlers[queryType] || []).push(h); - if (!quiet) { - event("EV_REGISTER_HANDLER", queryType); - } - return { - stop: function() { - var idx = handlers[queryType].indexOf(h); - if (idx === -1) { - return; - } - handlers[queryType].splice(idx, 1); - } - }; - }; - chan.whenReg = function(queryType, cb, always) { - var reg = always; - if (insideHandlers.indexOf(queryType) > -1) { - cb(); - } else { - reg = true; - } - if (reg) { - (callWhenRegistered[queryType] = callWhenRegistered[queryType] || []).push(cb); - } - }; - chan.onReg = function(queryType, cb) { - chan.whenReg(queryType, cb, true); - }; - chan.on("EV_REGISTER_HANDLER", (function(content) { - if (callWhenRegistered[content]) { - callWhenRegistered[content].forEach((function(f) { - f(); - })); - delete callWhenRegistered[content]; - } - insideHandlers.push(content); - })); - var isReady = false; - chan.onReady = function(h) { - if (isReady) { - return void h(); - } - if (typeof h !== "function") { - return; - } - chan.on("EV_RPC_READY", (function() { - isReady = true; - h(); - })); - }; - chan.ready = function() { - chan.whenReg("EV_RPC_READY", (function() { - chan.event("EV_RPC_READY"); - })); - }; - var trusted = [ "" ]; - if (ApiConfig.httpUnsafeOrigin) { - trusted.push(ApiConfig.httpUnsafeOrigin); - trusted.push(ApiConfig.httpSafeOrigin); - } else if (globalThis.location) { - trusted.push(globalThis.location.origin); - } - onMsg.reg((function(msg) { - if (!chanLoaded) { - return; - } - if (!msg.data || msg.data === "_READY") { - return; - } - if (!trusted.includes(msg.origin)) { - return; - } - var data; - try { - data = typeof msg.data === "object" ? msg.data : JSON.parse(msg.data); - } catch (err) { - console.warn(err); - return; - } - if (typeof data.ack !== "undefined") { - if (acks[data.txid]) { - acks[data.txid](!data.ack); - } - } else if (typeof data.q === "string") { - if (handlers[data.q]) { - if (data.txid) { - postMsg(JSON.stringify({ - txid: data.txid, - ack: true - })); - } - handlers[data.q].forEach((function(f) { - f(data || JSON.parse(msg.data), msg, data && data.raw); - data = undefined; - })); - } else { - if (data.txid) { - postMsg(JSON.stringify({ - txid: data.txid, - ack: false - })); - } - } - } else if (typeof data.q === "undefined" && queries[data.txid]) { - queries[data.txid](data, msg); - } else ; - })); - postMsg("_READY"); - cb(chan); - }; - return { - create - }; - }; - if (module.exports) { - module.exports = factory(requireCommonUtil()); - } - })(); - })(workerChannel); - return workerChannel.exports; - } - var hasRequired_interface; - function require_interface() { - if (hasRequired_interface) return _interface.exports; - hasRequired_interface = 1; - (function(module) { - (() => { - const factory = (SRpc, Channel, Util) => { - const Interface = {}; - let store; - let Rpc; - let clients = {}; - let closeStore = () => {}; - Interface.init = _closeStore => { - if (Rpc) { - return; - } - const query = (cId, cmd, data, cb) => { - cb = cb || function() {}; - clients[cId].chan.query(cmd, data, (function(err, res) { - if (err) { - return void cb({ - error: err - }); - } - cb(res); - })); - }; - const broadcast = (excludes, cmd, data, cb) => { - cb = cb || function() {}; - Object.keys(clients).forEach((cId => { - if (excludes.indexOf(+cId) !== -1) { - return; - } - clients[cId].chan.query(cmd, data, ((err, res) => { - if (err) { - return void cb({ - error: err - }); - } - cb(res); - })); - })); - }; - Rpc = SRpc.create({ - query, - broadcast - }); - closeStore = _closeStore; - }; - Interface.initClient = (cfg, cb) => { - if (!Rpc) { - console.error("Not initialized"); - return void cb("NOT_INIT"); - } - const {postMsg} = cfg; - const onMsg = Util.mkEvent(); - const clientId = Number(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)); - const onClose = () => { - Rpc._removeClient(clientId); - }; - Channel.create(onMsg, postMsg, (function(chan) { - let client = clients[clientId] = { - chan - }; - console.debug("SharedW Channel created"); - Object.keys(Rpc.queries).forEach((function(q) { - if (q === "CONNECT") { - return; - } - if (q === "JOIN_PAD") { - return; - } - if (q === "SEND_PAD_MSG") { - return; - } - if (q === "STOPWORKER") { - return; - } - chan.on(q, (function(data, cb) { - try { - Rpc.queries[q](clientId, data, cb); - } catch (e) { - console.error("Error in webworker when executing query " + q); - console.error(e); - console.log(data); - } - if (q === "DISCONNECT") { - onClose(); - if (globalThis.accountDeletion && globalThis.accountDeletion === client.id) { - Rpc = undefined; - store = undefined; - } - } - })); - })); - chan.on("STOPWORKER", (function(data, cb) { - closeStore(); - Rpc.queries["DISCONNECT"](clientId, data, cb); - })); - chan.on("CONNECT", (function(cfg, cb) { - console.debug("Connecting to store..."); - Rpc.queries["CONNECT"](clientId, cfg, (function(data) { - if (data && data.state === "ALREADY_INIT") { - console.debug("Store already exists!"); - store = store || data.returned; - return void cb(data); - } - store = data; - cb(data); - })); - })); - chan.on("JOIN_PAD", (function(data, cb) { - client.channelId = data.channel; - try { - Rpc.queries["JOIN_PAD"](clientId, data, cb); - } catch (e) { - console.error("Error in webworker when executing query JOIN_PAD"); - console.error(e); - console.log(data); - } - })); - chan.on("SEND_PAD_MSG", (function(msg, cb) { - var data = { - msg, - channel: client.channelId - }; - try { - Rpc.queries["SEND_PAD_MSG"](clientId, data, cb); - } catch (e) { - console.error("Error in webworker when executing query SEND_PAD_MSG"); - console.error(e); - console.log(data); - } - })); - cb(onMsg, onClose); - }), true); - }; - return Interface; - }; - if (module.exports) { - module.exports = factory(requireStoreRpc(), requireWorkerChannel(), requireCommonUtil()); - } - })(); - })(_interface); - return _interface.exports; - } - var swConnector; - var hasRequiredSwConnector; - function requireSwConnector() { - if (hasRequiredSwConnector) return swConnector; - hasRequiredSwConnector = 1; - const Interface = require_interface(); - let start = setConfig => { - let ready = false; - let closeStore = () => { - globalThis.close(); - }; - let initBuild = cfg => { - if (ready) { - return; - } - setConfig(cfg); - Interface.init(closeStore); - ready = true; - }; - globalThis.window = globalThis; - addEventListener("connect", (e => { - console.error("TEST"); - console.debug("New SharedWorker client"); - const port = e.ports[0]; - const postMsg = data => { - port.postMessage(data); - }; - console.error(port); - let connected = false; - let onMsg; - let onClose = () => {}; - port.onmessage = function(e) { - if (e.data?.type === "INIT") { - let cfg = e.data.cfg; - initBuild(cfg); - if (connected) { - return; - } - connected = true; - Interface.initClient({ - postMsg - }, (function(_onMsg, _onClose) { - onMsg = _onMsg; - onClose = _onClose; - postMsg("SW_READY"); - })); - } else if (e.data === "CLOSE") { - console.debug("leave"); - onClose(); - } else if (onMsg) { - onMsg.fire(e); - } - }; - })); - }; - swConnector = { - start - }; - return swConnector; - } - var swConnectorExports = requireSwConnector(); - var wwConnector; - var hasRequiredWwConnector; - function requireWwConnector() { - if (hasRequiredWwConnector) return wwConnector; - hasRequiredWwConnector = 1; - const Interface = require_interface(); - let start = setConfig => { - let onMsg; - let ready = false; - const closeStore = () => { - globalThis.close(); - }; - const postMsg = data => { - postMessage(data); - }; - globalThis.window = globalThis; - onmessage = function(e) { - if (e.data?.type === "INIT") { - let cfg = e.data.cfg; - if (ready) { - return; - } - setConfig(cfg); - Interface.init(closeStore); - ready = true; - Interface.initClient({ - postMsg - }, (function(_onMsg) { - onMsg = _onMsg; - postMsg("WW_READY"); - })); - return; - } - if (!onMsg) { - return; - } - onMsg.fire(e); - }; - }; - wwConnector = { - start - }; - return wwConnector; - } - var wwConnectorExports = requireWwConnector(); - var asyncConnector; - var hasRequiredAsyncConnector; - function requireAsyncConnector() { - if (hasRequiredAsyncConnector) return asyncConnector; - hasRequiredAsyncConnector = 1; - const Interface = require_interface(); - const Util = requireCommonUtil(); - let start = setConfig => { - let ready = false; - let closed = false; - let onMsg; - const sendMsgEv = Util.mkEvent(); - const closeStore = () => { - closed = true; - }; - const onMessage = f => { - sendMsgEv.reg((data => { - setTimeout((() => { - f(data); - })); - })); - }; - const postMsg = data => { - if (closed) { - return; - } - sendMsgEv.fire(data); - }; - const query = data => { - if (!onMsg || closed) { - return; - } - onMsg.fire({ - data, - origin: "" - }); - }; - let init = cfg => { - if (ready) { - return; - } - setConfig(cfg); - Interface.init(closeStore); - ready = true; - Interface.initClient({ - postMsg - }, (function(_onMsg) { - onMsg = _onMsg; - postMsg("STORE_READY"); - })); - }; - return { - init, - onMessage, - query - }; - }; - asyncConnector = { - start - }; - return asyncConnector; - } - var asyncConnectorExports = requireAsyncConnector(); - var migrateUserObjectExports = requireMigrateUserObject(); - var migrateUserObject = getDefaultExportFromCjs(migrateUserObjectExports); - var Migrate = _mergeNamespaces({ - __proto__: null, - default: migrateUserObject - }, [ migrateUserObjectExports ]); - var mailboxExports = requireMailbox(); - var mailbox = getDefaultExportFromCjs(mailboxExports); - var Mailbox = _mergeNamespaces({ - __proto__: null, - default: mailbox - }, [ mailboxExports ]); - var cursorExports = requireCursor(); - var cursor = getDefaultExportFromCjs(cursorExports); - var Cursor = _mergeNamespaces({ - __proto__: null, - default: cursor - }, [ cursorExports ]); - var supportExports = requireSupport(); - var support = getDefaultExportFromCjs(supportExports); - var Support = _mergeNamespaces({ - __proto__: null, - default: support - }, [ supportExports ]); - var calendarExports = requireCalendar(); - var calendar = getDefaultExportFromCjs(calendarExports); - var Calendar = _mergeNamespaces({ - __proto__: null, - default: calendar - }, [ calendarExports ]); - let start = cfg => { - [ Feedback, UO, Constants, ProxyManager, NetworkConfig, Migrate, LoginBlock, PadTypes, Credential, Cursor, Support, Calendar, Store, Account, Mailbox ].forEach((dep => { - if (typeof dep.setCustomize === "function") { - dep.setCustomize(cfg); - } - })); - }; - let inWorker = typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope; - let inSharedWorker = typeof SharedWorkerGlobalScope !== "undefined" && self instanceof SharedWorkerGlobalScope; - exports.store = {}; - if (inSharedWorker) { - console.error("SHAREDWORKER"); - swConnectorExports.start(start); - } else if (inWorker) { - console.error("WEBWORKER"); - wwConnectorExports.start(start); - } else if (typeof module !== "undefined" && typeof module.exports) { - console.error("NODEJS"); - exports.store = asyncConnectorExports.start(start); - } else { - console.error("BROWSER"); - exports.store = asyncConnectorExports.start(start); - } - exports.start = start; -})); diff --git a/www/common/worker.bundle.min.js b/www/common/worker.bundle.min.js index 655d651c2..94baa87cd 100644 --- a/www/common/worker.bundle.min.js +++ b/www/common/worker.bundle.min.js @@ -1 +1 @@ -!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self)["cryptpad-worker-min"]={})}(this,(function(e){"use strict";function n(e,n){return n.forEach((function(n){n&&"string"!=typeof n&&!Array.isArray(n)&&Object.keys(n).forEach((function(t){if("default"!==t&&!(t in e)){var r=Object.getOwnPropertyDescriptor(n,t);Object.defineProperty(e,t,r.get?r:{enumerable:!0,get:function(){return n[t]}})}}))})),Object.freeze(e)}var t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function r(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function o(e){if(e.__esModule)return e;var n=e.default;if("function"==typeof n){var t=function e(){return this instanceof e?Reflect.construct(n,arguments,this.constructor):n.apply(this,arguments)};t.prototype=n.prototype}else t={};return Object.defineProperty(t,"__esModule",{value:!0}),Object.keys(e).forEach((function(n){var r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:function(){return e[n]}})})),t}var a,i,s,c,u,f,l,d={exports:{}},h={exports:{}},p={exports:{}};function v(){return a||(a=1,function(e){var n;n=function(){var e=function(){},n=function(){return(new Date).getTime()},t=function(e,n,t){e.timeouts.push(setTimeout(n,t))},r=function(n,r){n.ws&&(n.ws.onmessage=e,n.ws.onopen=e,n.ws.close(),r?n.ws.onclose({reason:"offline"}):t(n,(function(){n.ws&&n.ws.onclose({reason:"forced closed because websocket failed to close"})}),1e4))},o=function(e,n){return!!e.ws&&(e.ws.send(JSON.stringify(n)),!0)},a=function(e,n){return function(e,t){var r=n[e];if(!r)throw new Error("no such event "+e);r.push(t)}},i=function(e,n,t,r){var o=r[n];if(!o)throw new Error("no such event "+n);var a=o.indexOf(t);-1!==a&&o.splice(a,1)},s=function(e,t,r){if(e.channels[t])return new Promise((function(n){n(e.channels[t])}));var s=e.queues.p2;1===r?s=e.queues.p1:3===r&&(s=e.queues.p3);var c={queue:s,onMessage:[],onJoin:[],onLeave:[],members:[],jSeq:e.seq++},u={message:c.onMessage,join:c.onJoin,leave:c.onLeave},f={_:c,time:n(),id:t,members:c.members,bcast:function(t){return function(e,t,r){var a=e.channels[t],i=e.seq++,s=[i,"MSG",t,r];if(!a)return new Promise((function(e,n){n({type:"NO_SUCH_CHANNEL",message:JSON.stringify(s)})}));var c=o(e,s);return new Promise((function(t,r){c?e.requests[i]={reject:r,resolve:t,time:n()}:r({type:"DISCONNECTED",message:JSON.stringify(s)})}))}(e,f.id,t)},leave:function(t){return function(e,t,r){if(e.channels[t]){if(delete e.channels[t],e.ws&&1===e.ws.readyState){var a=e.seq++;o(e,[a,"LEAVE",t,r]);var i=function(){};e.requests[a]={reject:i,resolve:i,time:n()}}}else console.debug("no such channel",t)}(e,f.id,t)},on:a(0,u),off:function(e,n){i(0,e,n,u)}};e.requests[c.jSeq]=f;var l=[c.jSeq,"JOIN",t],d=o(e,l);return new Promise((function(e,n){d?(f._.resolve=e,f._.reject=n):n({type:"DISCONNECTED",message:JSON.stringify(l)})}))},c=function(t){var r={message:t.onMessage,disconnect:t.onDisconnect,reconnect:t.onReconnect},c={webChannels:t.channels,getLag:function(){return function(e){return e.ws?e.pingOutstanding?Math.max(n()-e.timeOfLastPingSent,e.lastObservedLag):e.lastObservedLag:null}(t)},sendto:function(e,r){return function(e,t,r){var a=e.seq++,i=[a,"MSG",t,r],s=o(e,i);return new Promise((function(t,r){s?e.requests[a]={reject:r,resolve:t,time:n()}:r({type:"DISCONNECTED",message:JSON.stringify(i)})}))}(t,e,r)},join:function(e,n){return s(t,e,n)},disconnect:function(){return function(n){if(n.ws){var t=n.ws.onclose;n.ws.onclose=e,n.ws.close(),t({reason:"network.disconnect() called"})}n.timeouts.forEach(clearTimeout),n.timeouts=[]}(t)},on:a(0,r),off:function(e,n){i(0,e,n,r)}};return c.__defineGetter__("webChannels",(function(){return Object.keys(t.channels).map((function(e){return t.channels[e]}))})),c},u=function(e,t){var a=void 0;try{a=JSON.parse(t.data)}catch(e){return void console.log(e.stack)}if(e.timeOfLastMsgReceived=n(),0===a[0]){if("IDENT"===a[2])return e.uid=a[3],e.ws._onident(),void(e.pingInterval=setInterval((function(){if(!(n()-e.timeOfLastPingReceived<15e3||(n()-e.timeOfLastMsgReceived>6e4&&r(e),e.pingOutstanding))){var t=e.seq++,a=n();e.timeOfLastPingSent=a,e.pingOutstanding++,e.requests[t]={time:a,ping:a},o(e,[t,"PING"])}}),5e3));if(e.uid){if("PING"===a[2])return a[2]="PONG",void o(e,a);if("MSG"===a[2]){var i=void 0,s=e.queues.p2;if(a[3]===e.uid)i=e.onMessage,"number"==typeof a[5]&&(1===a[5]&&(s=e.queues.p1),3===a[5]&&(s=e.queues.p3));else{var c=e.channels[a[3]];if(!c)return void console.log("message to non-existent chan "+JSON.stringify(a));i=c._.onMessage,c._.queue&&(s=c._.queue)}s.push({msg:a,h:i}),function(e){if(!e.queues.busy){var n=function(){var t=e.queues.p1.shift()||e.queues.p2.shift()||e.queues.p3.shift();if(t){e.queues.busy=!0;var r=t.h,o=t.msg;r.forEach((function(e){setTimeout((function(){try{e(o[4],o[1])}catch(e){console.error(e)}}))})),setTimeout((function(){n()}))}else e.queues.busy=!1};n()}}(e)}if("LEAVE"===a[2]){var u=e.channels[a[3]];if(!u)return void(a[1]!==e.uid&&console.log("leaving non-existent chan "+JSON.stringify(a)));var f=u._.members.indexOf(a[1]);-1!==f&&u._.members.splice(f,1),u._.onLeave.forEach((function(e){try{e(a[1],a[4])}catch(e){console.log(e.stack)}}))}if("JOIN"===a[2]){var l=e.channels[a[3]];if(!l)return void console.log("ERROR: join to non-existent chan "+JSON.stringify(a));if(-1!==l._.members.indexOf(a[1]))return;var d=-1!==l._.members.indexOf(e.uid);l._.members.push(a[1]),d||a[1]!==e.uid||(l.myID=e.uid,l._.resolve(l)),d&&l._.onJoin.forEach((function(e){try{e(a[1])}catch(e){console.log(e.stack)}}))}}}else{var h=e.requests[a[0]];if(!h)return void console.log("error: "+JSON.stringify(a));if(delete e.requests[a[0]],"ACK"===a[1]){if(h.ping)return e.lastObservedLag=n()-Number(h.ping),e.timeOfLastPingReceived=n(),void e.pingOutstanding--;h.resolve()}else if("JACK"===a[1]){if(h._){if(!a[2])throw new Error("wrong type of ACK for channel join");return h.id=a[2],void(e.channels[h.id]=h)}h.resolve()}else if("ERROR"===a[1])if("function"==typeof h.reject)h.reject({type:a[2],message:a[3]});else if(h._&&"function"==typeof h._.reject){if("EJOINED"===a[2]&&!e.channels[a[3]])return h.id=a[3],void(e.channels[h.id]=h);h._.reject({type:a[2],message:a[3]})}else console.error(a);else h.reject({type:"UNKNOWN",message:JSON.stringify(a)})}};return{connect:function(o,a){a=a||function(e){return new window.WebSocket(e)};var i={ws:null,seq:1,uid:null,network:null,channels:{},onMessage:[],onDisconnect:[],onReconnect:[],timeouts:[],requests:{},pingInterval:null,queues:{p1:[],p2:[],p3:[]},timeOfLastPingSent:-1,timeOfLastPingReceived:-1,timeOfLastMsgReceived:-1,lastObservedLag:0,pingOutstanding:0};i.network=c(i);var s=e,f=e;"undefined"!=typeof window&&window.addEventListener("offline",(function(){-1===["localhost","127.0.0.1",""].indexOf(window.location.hostname)&&r(i,!0)}));var l=function(){var c=i.ws=a(o);i.timeOfLastPingSent=i.timeOfLastPingReceived=n(),i.timeOfLastMsgReceived=n(),c.onmessage=function(e){return u(i,e)},c.onclose=function(n){c.onclose=e,clearInterval(i.pingInterval),i.timeouts.forEach(clearTimeout),i.ws=null,i.uid&&(i.uid=null,i.onDisconnect.forEach((function(e){try{e(n.reason)}catch(e){console.log(e.stack)}}))),t(i,l,i.uid?0:7e3)},c.onopen=function(){t(i,(function(){i.uid||(f({type:"TIMEOUT",message:"waited 30000ms"}),s=f=e,r(i))}),3e4)},i.ws._onident=function(){i.timeOfLastPingReceived=n(),i.timeOfLastMsgReceived=n(),i.lastObservedLag=n()-i.timeOfLastPingSent,s!==e?(s(i.network),s=f=e):(i.channels={},i.requests={},i.pingOutstanding=0,i.onReconnect.forEach((function(e){try{e(i.uid)}catch(e){console.log(e.stack)}})))}};return new Promise((function(e,n){s=e,f=n,l()}))}}},e.exports?e.exports=n():window.netflux_websocket=n()}(p)),p.exports}function y(){return i||(i=1,function(e){var n,t,r,o;e.exports&&(e.exports=(n=v(),r=function(e){return e.replace(/^\d+:/,"")},o=(t={}).removeCp=function(e){return e.replace(/^cp\|([A-Za-z0-9+\/=]{0,20}\|)?/,"")},t.start=function(e){var t,a=(e=e||{}).network,i=e.websocketURL,s=e.userName,c=e.channel,u=e.crypto,f=e.readOnly||!1,l=!e.noChainPad&&(e.ChainPad||window.ChainPad),d=void 0===e.useHistory||!!e.useHistory,h=!1,p=e.lastKnownHash,v={},y=[],m=e.priority||2,g=e.Cache,E=!1,b=Math.floor(1e6*Math.random()),O=e.metadata||{},A=O.validateKey=e.validateKey||O.validateKey;O.owners=e.owners||O.owners,O.expire=e.expire||O.expire;var w,D,_=!0,T={setReadOnly:function(e,n){f=e,n&&(u=n)}},S=function(){},x=[],N={send:function(){}},I=function(){w&&"function"==typeof w.abort&&w.abort();var n=l.create({userName:s,initialState:e.initialState,transformFunction:e.transformFunction,patchTransformer:e.patchTransformer,validateContent:e.validateContent,avgSyncMilliseconds:e.avgSyncMilliseconds,logLevel:void 0!==e.logLevel?e.logLevel:1});return g&&Array.isArray(t)&&t.length&&(t.forEach((function(e){var t=e.patch;if(!/^\[/.test(t)){try{t=u.decrypt(t,A,!0)}catch(e){console.error(t,A,c),console.error(e)}t=r(t)}n.message(t)})),""===n.getUserDoc())?(n.abort(),t=[],g.clearChannel(c),I()):(n.onMessage((function(e,n,t){N.send(e,n,t)})),n.onPatch((function(t){e.onRemote&&e.onRemote({realtime:n,patch:t})})),n)},C={change:[],onChange:function(e){C.change.forEach((function(n){n(e)}))},users:[]},R=function(n){e.onJoin&&e.onJoin(n),32===n.length&&(-1===C.users.indexOf(n)&&C.users.push(n),C.onChange())},P=function(){},k=function(n){e.onLeave&&e.onLeave(n);var t=C.users.indexOf(n);-1!==t&&C.users.splice(t,1),C.onChange()},M=function(n,t){if(_){try{var r=w&&w.getUserDoc();if(E&&w&&(""===r||r===e.initialState))return void T.resetCache()}catch(e){console.error(e)}w&&w.start(),e.setMyID&&e.setMyID({myID:n.myID}),_=!1,e.onReady&&e.onReady({realtime:w,network:t,userList:C,myId:n.myID,leave:n.leave,metadata:O}),y.length&&(y.forEach((function(e){"function"==typeof e&&e()})),y=[])}},F=function(n,r){if(e.onChannelError&&e.onChannelError({channel:r.id,type:n.error,loaded:!_,error:n.error,message:n.message}),"EUNKNOWN"===n.error)return p=void 0,r&&r.leave(),g?(t=[],void g.clearChannel(c,(function(){l&&(T.realtime=w=I()),S(a,P)}))):void S(a,P);if("function"==typeof T.stop)try{T.stop()}catch(e){}},L=!0,H=function(e){g&&(t.length&&t[t.length-1].hash===e.hash||(!t.length&&L&&(e.isCheckpoint=!0,L=!1),(t.length||e.isCheckpoint)&&(t.push(e),g.storeCache(c,A,t,(function(e){if(e){g.clearChannel(c,(function(){console.warn("Cache cleared",c)}));var n=t;return t=[],void console.error(e,c,n,A)}})))))},j=function(n,t,a,i,s){var f=i.historyKeeper,l=n===f;if(!a||0!==t&&"0"!==t){if(!s||n===f){if(s){var d=JSON.parse(t);if(d.txid&&d.txid!==b)return;if(d.validateKey&&d.channel)return d.channel!==a.id||A||(A=d.validateKey),void(d.channel===a.id&&(O=d,e.onMetadataUpdate&&!_&&e.onMetadataUpdate(O)));if(d.state&&1===d.state&&d.channel)return void(d.channel===a.id&&(Object.keys(v).forEach((function(e){"function"==typeof v[e]&&v[e]("FAILED")})),v={},M(a,i)))}if(l){var h=JSON.parse(t);if(Array.isArray(h)&&h[0]&&h[0]!==b)return;if(h.channel===a.id&&h.error)return void F(h,a);if(t=h[4],h[3]!==a.id)return}if(p=t.slice(0,64),"function"==typeof v[p])return v[p](null,p),void delete v[p];var m,g=/^cp\|/.test(t);t=o(t);try{t=u.decrypt(t,A,l)}catch(e){console.error(t,A,c),console.error(e)}var E="string"==typeof t;!E&&t.content&&(m=t.author,t=t.content),_||e.onLocal&&e.onLocal(!0);var D=E?r(t):t,T=function(){try{if(w&&E&&w.message(D),e.onMessage){var t={time:h?h[5]:+new Date};e.onMessage(D,n,A,g,p,m,t)}var r=g;e.isCacheCheckpoint&&(r=e.isCacheCheckpoint(D,m)),H({patch:D,hash:p,isCheckpoint:r,author:m,time:h?h[5]:+new Date})}catch(e){console.error(e)}};_&&n!==f?y.push(T):T()}}else M(a,i)},K=function(n,r,a){N.wc=n,c=n.id,n.members.forEach(R);var i,s=function(e,t){j(t,e,n,r)};n.on("message",s),n.on("join",R),n.on("leave",k),N.stop=function(){n.off("message",s),n.off("join",R),n.off("leave",k),n.leave(),w&&w.abort()},a&&(N.send=function(n,t,a){var i=function(e,n){if(!f)try{var t=u.encrypt(e,n);if(0===e.indexOf("[4")){var r="";if(window.nacl){var o=window.nacl.hash(window.nacl.util.decodeUTF8(e));r=window.nacl.util.encodeBase64(o.slice(0,8))+"|"}else console.log("Checkpoint sent without an ID. Nacl is missing.");t="cp|"+r+t}return t}catch(n){throw console.log(e),n}}(n,a);if(i){var s=i.slice(0,64),l=/^cp\|/.test(i);e.isCacheCheckpoint&&(l=e.isCacheCheckpoint(n,a)),v[s]=function(e,r){!e&&r&&H({patch:o(n),hash:s,isCheckpoint:l,author:a,time:+new Date}),t(e,r)},N.wc.bcast(i).then((function(){p=s,delete v[s],H({patch:o(n),hash:s,isCheckpoint:l,author:a,time:+new Date}),t(null,s)}),(function(e){if(console.error(e),!e||"enoent"!==e.type&&"ENOENT"!==e.type)delete v[s],t(e&&e.type||e);else{if(N.wc.leave(),h)return delete v[s],void t("STOPPED");_=!0,r.join(c,m).then((function(e){K(e,r,!1),N.send(n,t,a)}))}}))}},l&&!w&&(T.realtime=w=I()),e.onInit&&e.onInit({myID:n.myID,realtime:w,getLag:r.getLag,userList:C,network:r,channel:c})),e.onConnect&&e.onConnect(n,N.send),d?(n.members.forEach((function(e){16===e.length&&(i=e)})),D!==i&&(r.historyKeeper=i,D=i,x.forEach((function(e){e(i)}))),function(){var e={txid:b,priority:m,lastKnownHash:p,metadata:O};g&&Array.isArray(t)&&t.length&&(e.lastKnownHash=t[t.length-1].hash),y=[];var o=["GET_HISTORY",n.id,e];i&&r.sendto(i,JSON.stringify(o))}(),T.resetCache=function(){_=!0,t=[],g&&g.clearChannel(c),b=Math.floor(1e6*Math.random()),F({error:"EUNKNOWN",message:"Corrupted cache"},n)}):M(n,r)},U=!1;"undefined"!=typeof window&&window.addEventListener("beforeunload",(function(){U=!0}));var B=function(e,n){var t;return e.some((function(e){if(e.id===n)return t=e,!0})),t},V=function(n){e.onError&&e.onError({type:n.type||n,message:n.message,error:n.type,loaded:!_})};S=function(r,o){var a;"string"==typeof r&&(a=n.connect(r));var i=function(){"string"==typeof r?a.then(o,V):"function"==typeof r.then?r.then(o,V):o(r)};if(g)return g.getChannelCache(c,(function(n,r){A=r?r.k:void 0,(t=r?r.c:[]).length?(E=!0,e.onCacheStart&&e.onCacheStart(),l&&(T.realtime=w=I()),t.length?(e.onMessage&&t.forEach((function(n){var t={time:n.time};e.onMessage(n.patch,"cache",A,n.isCheckpoint,n.hash,n.author,t)})),e.onCacheReady&&e.onCacheReady({id:c,realtime:w,networkPromise:a}),i()):i()):i()})),void(T.resetCache=function(){g&&g.clearChannel(c),t=[]});i()};var Y=!0;return P=function(n,t){h||n.join(c||null,m).then((function(e){if(h)try{e.leave()}catch(e){}else K(e,n,t)}),(function(r){r&&"ERESTRICTED"===r.type&&Array.isArray(r.message)&&e.onRejected?e.onRejected(r.message,(function(e){e?V(r):P(n,t)})):V(r)}))},T.stop=function(){h=!0},S(a||i,(function(n){if(a=n,Y){if(Y=!1,h)return;var t=function(n){U||"network.disconnect() called"!==n&&(e.onConnectionChange?e.onConnectionChange({state:!1}):e.onAbort&&e.onAbort({reason:n}))},r=function(n){if(e.onConnectionChange){e.onConnectionChange({state:!0,myId:n});var t=function(){_=!0,C.users=[],S(a,P)};if(e.beforeReconnecting)return void e.beforeReconnecting((function(n,r){c=n,e.initialState=r,t()}));t()}},o=function(e,n){var t=B(a.webChannels,c);t&&j(n,e,t,a,!0)};a.on("disconnect",t),a.on("reconnect",r),a.on("message",o),T.network=a,T.stop=function(){N&&N.stop&&N.stop();var e=B(a.webChannels,c);if(e)try{e.leave("")}catch(e){}a.off("disconnect",t),a.off("reconnect",r),a.off("message",o),h=!0},a.onHistoryKeeperChange=function(e){x.push(e)}}P(a,!0)})),T},t))}(h)),h.exports}function m(){return f?u:(f=1,u=function(){if(c)return s;c=1;const e=n=>{if(Array.isArray(n))return n.map(e);if(n instanceof Object){let t=[],r=[];return Object.keys(n).forEach((e=>{/^(0|[1-9][0-9]*)$/.test(e)?t.push(+e):r.push(e)})),t.sort((function(e,n){return e-n})).concat(r.sort()).reduce(((t,r)=>(t[r]=e(n[r]),t)),{})}return n},n=JSON.stringify.bind(JSON);return s=(t,r,o)=>{let a=n(t,r,0);if(!a||"{"!==a[0]&&"["!==a[0])return a;let i=JSON.parse(a);return n(e(i),null,o)}}())}function g(){return l||(l=1,function(e){e.exports&&(e.exports=function(e,n){const t=globalThis;var r,o={},a=void 0===t.Proxy,i=o.DeepProxy=function(){var e={},r=e.isArray=Array.isArray||function(e){return"[object Array]"===Object.toString(e)},o=e.type=function(e){return null===e?"null":r(e)?"array":typeof e},i=e.isProxyable=function(e,n){return(void 0!==n||!a)&&-1!==["object","array"].indexOf(o(e))},s=e.set=function(n){return function(t,r,o){if("on"===r)throw new Error("'on' is a reserved attribute name for realtime lists and maps");return i(o)?t[r]=e.create(o,n):t[r]=o,n(),t[r]||!0}},c=e.pathMatches=function(e,n){return!n.some((function(n,t){return n!==e[t]}))},u=function(e,n){return n.pattern.length-e.pattern.length},f=function(e){return function(n,t,r){switch(n){case"change":t="array"===o(t)?t:[t],e.change.push({cb:function(e,n,o,a){if(c(o,t))return r(e,n,o,a)},pattern:t}),e.change.sort(u);break;case"remove":t="array"===o(t)?t:[t],e.remove.push({cb:function(e,n,o){if(c(n,t))return r(e,n,o)},pattern:t}),e.remove.sort(u);break;case"ready":e.ready.push({cb:function(e){t(e)}});break;case"cacheready":e.cacheready.push({cb:function(e){t(e)}});break;case"disconnect":e.disconnect.push({cb:function(e){t(e)}});break;case"reconnect":e.reconnect.push({cb:function(e){t(e)}});break;case"create":e.create.push({cb:function(e){t(e)}});break;case"error":e.error.push({cb:function(e){t(e)}})}return this}},l=e.get=function(){var e={cacheready:[],disconnect:[],reconnect:[],change:[],ready:[],remove:[],create:[],error:[]};return function(n,t){return"on"===t?f(e):"_isProxy"===t||("_events"===t?e:n[t])}},d=e.delete=function(e){return function(n,t){return void 0===n[t]||(delete n[t],e()),!0}},h=e.handlers=function(e,n){return n?{set:s(e),get:l(e),deleteProperty:d(e)}:{set:s(e),get:function(e,n){return"_isProxy"===n||e[n]},deleteProperty:d(e)}},p=e.remoteChangeFlag=!1,v=e.stringifyFakeProxy=function(e){var t=JSON.parse(n(e));return delete t._events,delete t._isProxy,n(t)};e.checkLocalChange=function(n,r){if(a&&!e.interval){var o=v(n);e.interval=t.setInterval((function(){var e=v(n);e!==o&&(o=e,p?p=!1:r())}),300)}};var y=e.create=function(e,n,r){var s="function"===o(n)?h(n,r):n;switch(o(e)){case"object":Object.keys(e).forEach((function(t){i(e[t])&&!e[t]._isProxy&&(e[t]=y(e[t],n))}));break;case"array":e.forEach((function(t,r){i(t)&&!t._isProxy&&(e[r]=y(e[r],n))}));break;default:throw new Error("attempted to make a proxy of an unproxyable object")}if(!a)return e._isProxy?e:new t.Proxy(e,s);var c=JSON.parse(JSON.stringify(e));if(r){var u={cacheready:[],disconnect:[],reconnect:[],change:[],ready:[],remove:[],create:[],error:[]};c.on=f(u),c._events=u}return c},m=function(e,n,t,r,o){var a=e.slice(0);a.push(n),t._events.change.some((function(e){return!1===e.cb(r,o,a,t)}))},g=e.find=function(e,n){for(var t=n.length,r=0;rs)for(var c,u=s;u<=s;u++)c=e[u],E(r,u,a,c,!0);e.length=s}};return e.update=function(e,n,t){var r=o(e),a=o(n);if(r!==a)throw new Error("Proxy updates can't result in type changes");switch(a){case"array":O.call(e,e,n,(function(e){return y(e,t)}),[],e);break;case"object":b.call(e,e,n,(function(e){return y(e,t)}),[],e);break;default:throw new Error("unsupported realtime datatype:"+a)}},e}();return o.create=function(o){if(!i.isProxyable(o.data,!0))throw new Error("unsupported datatype: "+i.type(o.data));if("function"!=typeof(r=o.ChainPad||t.ChainPad).SmartJSONTransformer)throw new Error("Please update ChainPad");o.classic&&!o.crypto&&(console.error("[chainpad-listmap] no crypto module provided. messages will not be encrypted"),o.crypto={encrypt:function(e){return e},decrypt:function(e){return e}});var s=o.readOnly,c={initialState:n(o.data),patchTransformer:r.SmartJSONTransformer,validateContent:o.validateContent||function(e){try{return JSON.parse(e),!0}catch(n){return console.log(e),console.error("Failed to parse, rejecting patch"),!1}},readOnly:o.readOnly,userName:o.userName||"listmap",Cache:o.Cache,logLevel:void 0===o.logLevel?0:o.logLevel};o.classic&&(c.channel=o.channel,c.crypto=o.crypto,c.network=o.network,c.websocketURL=o.websocketURL,c.metadata=o.metadata||{validateKey:o.validateKey,owners:o.owners,expire:o.expire},c.onRejected=o.onRejected);var u,f,l,d={metadata:{}},h=!0,p=!1,v=a?i.stringifyFakeProxy:n,y=function(){var e=v(f);try{u.contentUpdate(e)}catch(e){f._events.error.forEach((function(n){n.cb({type:"CHAINPAD",error:e.message})}))}o.onLocal&&o.onLocal()},m=c.onLocal=function(e){h||s||(clearTimeout(l),e?y():l=setTimeout(y))},g=function(){i.remoteChangeFlag||m()};f=i.create(o.data,g,!0),c.onInit=function(e){f._events.create.forEach((function(n){n.cb(e)}))},c.onCacheReady=function(e){u&&u===e.realtime||(u=d.realtime=e.realtime);var n=u.getUserDoc(),t=JSON.parse(n);i.update(f,t,g),i.checkLocalChange(f,m),p||f._events.cacheready.forEach((function(n){n.cb(e)}))};var E=0;c.onReady=function(e){if(E=-1,p)return h=!1,c.onRemote(),void f._events.reconnect.forEach((function(n){n.cb(e)}));u&&u===e.realtime||(u=d.realtime=e.realtime),d.metadata=e.metadata;var n=u.getUserDoc(),t=JSON.parse(n);i.update(f,t,g),i.checkLocalChange(f,m),h=!1,p=!0,f._events.ready.forEach((function(n){n.cb(e)}))},c.onRemote=function(){if(!h){var e=u.getUserDoc(),n=JSON.parse(e);i.remoteChangeFlag=!0,i.update(f,n,g),i.remoteChangeFlag=!1}},c.onMessage=function(){-1!==E&&o.updateProgress&&o.updateProgress({progress:E++})},c.onAbort=function(e){f._events.disconnect.forEach((function(n){n.cb(e)}))},c.onConnectionChange=function(e){e.state?h=!0:f._events.disconnect.forEach((function(n){n.cb(e)}))},c.onMetadataUpdate=function(e){d.metadata=e,"function"==typeof o.onMetadataUpdate&&o.onMetadataUpdate(e)},c.onError=function(e){f._events.error.forEach((function(n){n.cb(e)}))},c.onChannelError=function(e){f._events.error.forEach((function(n){n.cb(e)}))},o.common&&"function"==typeof o.common.startRealtime?u=d.cpCnInner=o.common.startRealtime(c):d=e.start(c),d.proxy=f,d.realtime=u;var b=d.setReadOnly;return d.setReadOnly=function(e,n){s=e,b&&b(e,n)},d},o}(y(),m()))}(d)),d.exports}var E=g();function b(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var O,A={exports:{}};function w(){return O||(O=1,function(e){var n,r,o,a;a=function(){var e=b,n=function(t,r,o){r||(r=0);var a=n.resolve(t,r),i=n.m[r][a];if(!i&&e){if(i=e(a))return i}else if(i&&i.c&&(r=i.c,a=i.m,!(i=n.m[r][i.m])))throw new Error('failed to require "'+a+'" from '+r);if(!i)throw new Error('failed to require "'+t+'" from '+o);return i.exports||(i.exports={},i.call(i.exports,i,i.exports,n.relative(a,r))),i.exports};return n.resolve=function(e,t){var r=e,o=e+".js",a=e+"/index.js";return n.m[t][o]&&o?o:n.m[t][a]&&a?a:r},n.relative=function(e,t){return function(r){if("."!=r.charAt(0))return n(r,t,e);var o=e.split("/"),a=r.split("/");o.pop();for(var i=0;i=0;t--)o.check(e.operations[t],n),t>0&&r.assert(!o.shouldMerge(e.operations[t],e.operations[t-1])),"number"==typeof n&&(n+=o.lengthChange(e.operations[t]));return e.isCheckpoint&&(r.assert(1===e.operations.length),r.assert(0===e.operations[0].offset),"number"==typeof n&&r.assert(!n||e.operations[0].toRemove===n)),e};i.toObj=function(e){r.PARANOIA&&c(e);var n,t=new Array(e.operations.length+1);for(n=0;n0);var t,i=s(a.check(e[e.length-1]),n);for(t=0;t=0;t--)f(e,n.operations[t]);return e},i.apply=function(e,n){r.PARANOIA&&(c(e),r.assert("string"==typeof n),r.assert(a.hex_sha256(n)===e.parentHash));for(var t=n,i=e.operations.length-1;i>=0;i--)t=o.apply(e.operations[i],t);return t},i.lengthChange=function(e){r.PARANOIA&&c(e);for(var n=0,t=0;t=0;u--)i[u]=o.invert(e.operations[u],t),t=o.apply(e.operations[u],t);var f=new Array(e.operations.length);!function(){for(var e=i.length-1;e>=0;e--){f[e]=i[e].offset;for(var n=e-1;n>=0;n--)f[e]+=i[n].toRemove-i[n].toInsert.length}}();var l=s(a.hex_sha256(t),e.isCheckpoint);l.operations.splice(0,l.operations.length);for(var d=0;d=0;d--){var h=t(e.operations[d],u,o.simplify);h&&(u=o.apply(h,u),f[l++]=h)}return Array.prototype.push.apply(i.operations,f.reverse()),i.operations[0]||i.operations.shift(),r.PARANOIA&&c(i),i},i.equals=function(e,n){if(e.operations.length!==n.operations.length)return!1;for(var t=0;t0;){var u=o.random(i);i+=o.lengthChange(u),f(t,u)}return c(t),t},Object.freeze(e.exports)},"SHA256.js":function(e,n,t){!function(){function n(e,n){var t=(65535&e)+(65535&n);return(e>>16)+(n>>16)+(t>>16)<<16|65535&t}function t(e,n){return e>>>n|e<<32-n}function r(e,n){return e>>>n}function o(e,n,t){return e&n^~e&t}function a(e,n,t){return e&n^e&t^n&t}function i(e){return t(e,2)^t(e,13)^t(e,22)}function s(e){return t(e,6)^t(e,11)^t(e,25)}function c(e){return t(e,7)^t(e,18)^r(e,3)}e.exports.hex_sha256=function(e){return function(e){for(var n="0123456789abcdef",t="",r=0;r<4*e.length;r++)t+=n.charAt(e[r>>2]>>8*(3-r%4)+4&15)+n.charAt(e[r>>2]>>8*(3-r%4)&15);return t}(function(e,u){var f,l,d,h,p,v,y,m,g,E,b,O=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],A=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],w=function(e){for(var n=[];e>0;e--)n.push(void 0);return n}(64);e[u>>5]|=128<<24-u%32,e[15+(u+64>>9<<4)]=u;for(var D=0;D>5]|=(255&e.charCodeAt(t/8))<<24-t%32;return n}(e),8*e.length))}}()},"Common.js":function(e,n,r){e.exports.global=function(){if("undefined"!=typeof self)return self;if(void 0!==t)return t;if("undefined"!=typeof window)return window;throw new Error("no self, nor global, nor window")}();var o=function(n){return"undefined"!=typeof localStorage&&localStorage[n]?localStorage[n]:e.exports.global[n]},a=e.exports.PARANOIA=o("ChainPad_PARANOIA");e.exports.VALIDATE_ENTIRE_CHAIN_EACH_MSG=o("ChainPad_VALIDATE_ENTIRE_CHAIN_EACH_MSG"),e.exports.TESTING=o("ChainPad_TESTING"),e.exports.assert=function(e){if(!e)throw new Error("Failed assertion")},e.exports.isUint=function(e){return"number"==typeof e&&Math.floor(e)===e&&e>=0},e.exports.randomASCII=function(e){for(var n=[],t=0;tn?1:-1},Object.freeze(e.exports)},"sha256.js":function(e,n,t){var r=t("./sha256/exports.js"),o=t("./SHA256.js"),a=t("./Common");e.exports.check=function(e){if("string"!=typeof e)throw new Error;if(!/[a-f0-9]{64}/.test(e))throw new Error;return e},e.exports.hex_sha256=function(e){e+="";var n=r.hex(function(e){for(var n=new Uint8Array(e.length),t=0;t1&&console.log("["+e.userName+"] "+n)},d=function(e,n){e.logLevel>0&&console.error("["+e.userName+"] "+n)},h=function(e,n,t){if(!e.aborted){t||(t=Math.floor(2*Math.random()*e.config.avgSyncMilliseconds));var r=setTimeout((function(){e.schedules.splice(e.schedules.indexOf(r),1),n()}),t);return e.schedules.push(r),r}},p=function(e,n){var t=e.schedules.indexOf(n);t>-1&&e.schedules.splice(t,1),clearTimeout(n)},v=function(e,n,t,o){var a=i.toStr(n);if(function(e,n,t){e.messageHandlers.length||t("no onMessage() handler registered");try{e.messageHandlers.forEach((function(e){e(n,(function(){t.apply(null,arguments),t=function(){}}))}))}catch(e){t(e.stack)}}(e,a,(function(t){if(t)l(e,"Posting to server failed ["+t+"]"),e.pending=null,e.syncSchedule=h(e,(function(){g(e)}));else{var o=e.pending;if(e.pending=null,!o)throw new Error;r.assert(o.hash===n.hashOf),R(e,a,!0)?(e.timeOfLastSuccess=+new Date,e.lag=+new Date-o.timeSent):l(e,"Our message ["+n.hashOf+"] failed validation"),o.callback()}})),e.pending)throw new Error("there is already a pending message");-1===e.timeOfLastSuccess&&(e.timeOfLastSuccess=+new Date),e.pending={hash:n.hashOf,timeSent:+new Date,callback:function(){e.syncSchedule=h(e,(function(){g(e)}),0),t()}},r.PARANOIA&&A(e)},y=function(e){var n=e.onSettle;e.onSettle=[],n.forEach((function(n){try{n()}catch(n){d(e,"Error in onSettle handler ["+n.stack+"]")}}))},m=function(e){if(!e.mut.inverseOf)throw new Error;return e.mut.inverseOf},g=function(e,n){if(r.PARANOIA&&A(e),e.syncSchedule&&!e.pending){if(p(e,e.syncSchedule),e.syncSchedule=null,e.uncommitted=a.simplify(e.uncommitted,e.authDoc,e.config.operationSimplify),0===e.uncommitted.operations.length)return y(e),e.timeOfLastSuccess=+new Date,void(e.syncSchedule=h(e,(function(){g(e)})));var t=_(e,e.best)+1;if(t%e.config.checkpointInterval!=0){var o;o=e.setContentPatch?e.setContentPatch:i.create(i.PATCH,e.uncommitted,e.best.hashOf),v(e,o,(function(){e.setContentPatch&&(l(e,"initial Ack received ["+o.hashOf+"]"),e.setContentPatch=null)}))}else{var s=e.best;if(l(e,"Sending checkpoint (interval ["+e.config.checkpointInterval+"]) patch no ["+t+"]"),l(e,_(e,e.best)),!s||!s.content||!m(s.content))throw new Error;var c=a.createCheckpoint(e.authDoc,e.authDoc,m(s.content).parentHash),u=i.create(i.CHECKPOINT,c,s.hashOf);v(e,u,(function(){l(e,"Checkpoint sent and accepted")}))}}},E=function(e,n){r.assert(n.lastMsgHash),r.assert(n.hashOf),e.messages[n.hashOf]=n,(e.messagesByParent[n.lastMsgHash]=e.messagesByParent[n.lastMsgHash]||[]).push(n)},b=function(e,n){r.assert(n.lastMsgHash),r.assert(n.hashOf),delete e.messages[n.hashOf];var t=e.messagesByParent[n.lastMsgHash];r.assert(t.indexOf(n)>-1),t.splice(t.indexOf(n),1),0===t.length&&delete e.messagesByParent[n.lastMsgHash];var o=e.messagesByParent[n.hashOf];if(o)for(var a=0;a_(e,t)&&(t=o)})),t},x=function(e,n){n.operations.length&&(e.patchHandlers.forEach((function(e){e(n)})),e.changeHandlers.forEach((function(e){n.operations.forEach((function(n){e(n.offset,n.toRemove,n.toInsert)}))})))},N=function(e,n){try{return e.config.validateContent(n())}catch(n){d(e,"Error in content validator ["+n.stack+"]")}return!1},I=function(e,n,t){for(var r=O(e,n);r;r=O(e,r))if(!1===t(r))return},C=function(e,n){e.mut.inverseOf||((e.mut.inverseOf=a.invert(e,n)).mut.inverseOf=e)},R=function(e,n,t){r.PARANOIA&&A(e);var c=i.fromString(n);if(l(e,JSON.stringify([c.hashOf,c.content.operations])),e.messages[c.hashOf]){if(e.setContentPatch&&e.setContentPatch.hashOf===c.hashOf)e.setContentPatch=null;else{if(c.content.isCheckpoint)return l(e,"["+(t?"our":"their")+"] Checkpoint ["+c.hashOf+"] is already known"),!0;l(e,"Patch ["+c.hashOf+"] is already known")}r.PARANOIA&&A(e)}else if(!c.content.isCheckpoint||N(e,(function(){return c.content.operations[0].toInsert}))){if(E(e,c),!D(e,e.rootMessage,c)){if(c.content.isCheckpoint&&e.best.mut.isInitialMessage){l(e,"applying checkpoint ["+c.hashOf+"]");var u=a.apply(e.uncommitted,e.authDoc);r.assert(!r.PARANOIA||e.userInterfaceContent===u);var f=a.invert(e.uncommitted,e.authDoc);return a.addOperation(f,o.create(0,e.authDoc.length,c.content.operations[0].toInsert)),f=a.simplify(f,u,e.config.operationSimplify),c.mut.parentCount=0,e.rootMessage=e.best=c,e.authDoc=c.content.operations[0].toInsert,e.uncommitted=a.create(s.hex_sha256(e.authDoc)),x(e,f),r.PARANOIA&&(e.userInterfaceContent=e.authDoc),!0}return l(e,"Patch ["+c.hashOf+"] not connected to root (parent: ["+c.lastMsgHash+"])"),void(r.PARANOIA&&A(e))}(c=S(e,c)).mut.isFromMe=t;var d=c.content,h=[],p=e.best;if(!D(e,e.best,c)){var v=_(e,e.best),g=_(e,c);if(!(v0))return l(e,"Patch ["+c.hashOf+"] chain is ["+g+"] best chain is ["+v+"]"),r.PARANOIA&&A(e),!0;for(;p&&!D(e,p,c);)h.push(p),p=O(e,p);r.assert(p),l(e,"Patch ["+c.hashOf+"] better than best chain, switching")}var R=[],P=c;do{R.unshift(P),P=O(e,P),r.assert(P)}while(P!==p);var k=e.authDoc;h.forEach((function(e){k=a.apply(m(e.content),k)})),R.forEach((function(e,n){n!==R.length-1&&(C(e.content,k),k=a.apply(e.content,k))}));var M=e.best;if(R.length>1?(M=R[R.length-2],r.assert(M)):h.length&&(M=O(e,h[h.length-1]),r.assert(M)),r.assert(m(M.content).parentHash),r.assert(!r.PARANOIA||m(M.content).parentHash===s.hex_sha256(k)),m(M.content).parentHash===d.parentHash){if(d.isCheckpoint&&e.config.noPrune);else if(d.isCheckpoint){var F;if(I(e,c,(function(e){if(e.content.isCheckpoint){if(F)return F=e,!1;F=e}})),F&&F!==e.rootMessage){var L=_(e,F);if(e.config.strictCheckpointValidation&&L%e.config.checkpointInterval!=0){if(l(e,"checkpoint ["+c.hashOf+"] at invalid point ["+L+"]"),r.PARANOIA&&A(e),r.TESTING)throw new Error;return void b(e,c)}l(e,"checkpoint ["+c.hashOf+"]"),I(e,F,(function(n){l(e,"pruning ["+n.hashOf+"]"),b(e,n)})),e.rootMessage=F}}else{var H=a.simplify(d,k,e.config.operationSimplify);if(!a.equals(H,d)){if(l(e,"patch ["+c.hashOf+"] can be simplified"),r.PARANOIA&&A(e),r.TESTING)throw new Error;return void b(e,c)}if(!N(e,(function(){return a.apply(d,k)})))return void l(e,"Patch ["+c.hashOf+"] failed content validation")}C(d,k),e.uncommitted=a.simplify(e.uncommitted,e.authDoc,e.config.operationSimplify);var j=a.apply(e.uncommitted,e.authDoc);r.PARANOIA&&r.assert(j===e.userInterfaceContent);var K=a.invert(e.uncommitted,e.authDoc);if(h.forEach((function(n){l(e,"reverting ["+n.hashOf+"]"),n.mut.isFromMe&&l(e,"reverting patch 'from me' ["+JSON.stringify(n.content.operations)+"]"),K=a.merge(K,m(n.content)),function(e,n,t){T(e,n,m(t))}(e,n.mut.isFromMe,n.content)})),R.forEach((function(n){l(e,"applying ["+n.hashOf+"]"),K=a.merge(K,n.content),T(e,n.mut.isFromMe,n.content)})),K=a.merge(K,e.uncommitted),K=a.simplify(K,j,e.config.operationSimplify),e.best=c,r.PARANOIA){var U=a.apply(K,j);r.assert(e.userInterfaceContent.length===w(e)),r.assert(U===e.userInterfaceContent)}return x(e,K),e.uncommitted.operations.length||y(e),r.PARANOIA&&A(e),!0}if(l(e,"patch ["+c.hashOf+"] parentHash is not valid"),r.PARANOIA&&A(e),r.TESTING)throw new Error;b(e,c)}else l(e,"Checkpoint ["+c.hashOf+"] failed content validation")},P=function(e,n){return Object.freeze({type:"Block",hashOf:n.hashOf,lastMsgHash:n.lastMsgHash,isCheckpoint:!!n.content.isCheckpoint,isFromMe:n.mut&&n.mut.isFromMe,author:n.mut&&n.mut.author,serverHash:n.mut&&n.mut.serverHash,time:n.mut&&n.mut.time,getParent:function(){var t=O(e,n);if(t)return P(e,t)},getContent:function(){return function(e,n){for(var t=[n];t[0]!==e.rootMessage;){var o=O(e,t[0]);if(!o)return{error:"not connected to root",doc:void 0};t.unshift(o)}var i="";e.rootMessage.content.operations.length&&(r.assert(1===e.rootMessage.content.operations.length),i=e.rootMessage.content.operations[0].toInsert);for(var s=1;s=0;t--)n=s(e[t],n);return n};var c=o.invert=function(e,n){return r.PARANOIA&&(a(e),r.assert("string"==typeof n),r.assert(e.offset+e.toRemove<=n.length)),i(e.offset,e.toInsert.length,(" "+n.substring(e.offset,e.offset+e.toRemove)).slice(1))},u=/[\uD800-\uDBFF]|[\uDC00-\uDFFF]/,f=o.hasSurrogate=function(e){return u.test(e)};o.simplify=function(e,n){r.PARANOIA&&(a(e),r.assert("string"==typeof n),r.assert(e.offset+e.toRemove<=n.length));for(var t=c(e,n),o=Math.min(e.toInsert.length,t.toInsert.length),s=0;s=0&&h[s]===d[s];s--);d=d.substring(0,s+1),l=s+1}return 0===l&&0===d.length?null:i(u,l,d)},o.equals=function(e,n){return e.toRemove===n.toRemove&&e.toInsert===n.toInsert&&e.offset===n.offset},o.lengthChange=function(e){return r.PARANOIA&&a(e),e.toInsert.length-e.toRemove},o.merge=function(e,n){r.PARANOIA&&(a(n),a(e));var t=e.offset,o=e.toRemove,s=e.toInsert,c=n.offset,u=n.toRemove,f=n.toInsert,l=c-t;if(u>0){var d=s;s=s.substring(0,l)+s.substring(l+u),(u-=d.length-s.length)<0&&(u=0),o+=u,u=0}if(l<0)t+=l,s=f+s;else if(s.length===l)s+=f;else{if(!(s.length>l))throw new Error("should never happen\n"+JSON.stringify([e,n],null," "));s=s.substring(0,l)+f+s.substring(l)}return""===s&&0===o?null:i(t,o,s)},o.shouldMerge=function(e,n){return r.PARANOIA&&(a(e),a(n)),n.offset0;)a+=c=r._heap_write(t,o+a,e,i,s),i+=c,s-=c,o+=c=n.process(o,a),(a-=c)||(o=0);return this.pos=o,this.len=a,this},e.exports.hash_finish=function(){if(null!==this.result)throw new IllegalStateError("state must be reset before processing new data");return this.asm.finish(this.pos,this.len,0),this.result=new Uint8Array(this.HASH_SIZE),this.result.set(this.heap.subarray(0,this.HASH_SIZE)),this.pos=0,this.len=0,this}},"sha256/utils.js":function(e,n,t){var r=e.exports.string_to_bytes=function(e,n){n=!!n;for(var t=e.length,r=new Uint8Array(n?4*t:t),o=0,a=0;o=t)throw new Error("Malformed string, low surrogate expected at position "+o);i=(55296^i)<<10|65536|56320^e.charCodeAt(o)}else if(!n&&i>>>8)throw new Error("Wide characters are not allowed.");!n||i<=127?r[a++]=i:i<=2047?(r[a++]=192|i>>6,r[a++]=128|63&i):i<=65535?(r[a++]=224|i>>12,r[a++]=128|i>>6&63,r[a++]=128|63&i):(r[a++]=240|i>>18,r[a++]=128|i>>12&63,r[a++]=128|i>>6&63,r[a++]=128|63&i)}return r.subarray(0,a)};e.exports.hex_to_bytes=function(e){var n=e.length;1&n&&(e="0"+e,n++);for(var t=new Uint8Array(n>>1),r=0;r>1]=parseInt(e.substr(r,2),16);return t},e.exports.base64_to_bytes=function(e){return r(atob(e))};var o=e.exports.bytes_to_string=function(e,n){n=!!n;for(var t=e.length,r=new Array(t),o=0,a=0;o=192&&i<224&&o+1=224&&i<240&&o+2=240&&i<248&&o+3>10,r[a++]=56320|1023&s)}}for(var c="",u=16384,f=0;f>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e+=1},e.exports.is_number=function(e){return"number"==typeof e},e.exports.is_string=function(e){return"string"==typeof e},e.exports.is_buffer=function(e){return e instanceof ArrayBuffer},e.exports.is_bytes=function(e){return e instanceof Uint8Array},e.exports.is_typed_array=function(e){return e instanceof Int8Array||e instanceof Uint8Array||e instanceof Int16Array||e instanceof Uint16Array||e instanceof Int32Array||e instanceof Uint32Array||e instanceof Float32Array||e instanceof Float64Array},e.exports._heap_init=function(e,n){var t=n.heap,r=t?t.byteLength:n.heapSize||65536;if(4095&r||r<=0)throw new Error("heap size must be a positive integer and a multiple of 4096");return t=t||new e(new ArrayBuffer(r))},e.exports._heap_write=function(e,n,t,r,o){var a=e.length-n,i=a>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x428a2f98|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=n+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x71374491|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=t+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xb5c0fbcf|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=l+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xe9b5dba5|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=d+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x3956c25b|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=h+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x59f111f1|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=p+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x923f82a4|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=v+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xab1c5ed5|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=y+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xd807aa98|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=m+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x12835b01|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=g+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x243185be|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=E+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x550c7dc3|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=b+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x72be5d74|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=O+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x80deb1fe|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=A+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x9bdc06a7|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=w+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xc19bf174|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;e=R=(n>>>7^n>>>18^n>>>3^n<<25^n<<14)+(A>>>17^A>>>19^A>>>10^A<<15^A<<13)+e+m|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xe49b69c1|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;n=R=(t>>>7^t>>>18^t>>>3^t<<25^t<<14)+(w>>>17^w>>>19^w>>>10^w<<15^w<<13)+n+g|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xefbe4786|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;t=R=(l>>>7^l>>>18^l>>>3^l<<25^l<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+t+E|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x0fc19dc6|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;l=R=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(n>>>17^n>>>19^n>>>10^n<<15^n<<13)+l+b|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x240ca1cc|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;d=R=(h>>>7^h>>>18^h>>>3^h<<25^h<<14)+(t>>>17^t>>>19^t>>>10^t<<15^t<<13)+d+O|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x2de92c6f|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;h=R=(p>>>7^p>>>18^p>>>3^p<<25^p<<14)+(l>>>17^l>>>19^l>>>10^l<<15^l<<13)+h+A|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x4a7484aa|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;p=R=(v>>>7^v>>>18^v>>>3^v<<25^v<<14)+(d>>>17^d>>>19^d>>>10^d<<15^d<<13)+p+w|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x5cb0a9dc|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;v=R=(y>>>7^y>>>18^y>>>3^y<<25^y<<14)+(h>>>17^h>>>19^h>>>10^h<<15^h<<13)+v+e|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x76f988da|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;y=R=(m>>>7^m>>>18^m>>>3^m<<25^m<<14)+(p>>>17^p>>>19^p>>>10^p<<15^p<<13)+y+n|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x983e5152|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;m=R=(g>>>7^g>>>18^g>>>3^g<<25^g<<14)+(v>>>17^v>>>19^v>>>10^v<<15^v<<13)+m+t|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xa831c66d|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;g=R=(E>>>7^E>>>18^E>>>3^E<<25^E<<14)+(y>>>17^y>>>19^y>>>10^y<<15^y<<13)+g+l|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xb00327c8|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;E=R=(b>>>7^b>>>18^b>>>3^b<<25^b<<14)+(m>>>17^m>>>19^m>>>10^m<<15^m<<13)+E+d|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xbf597fc7|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;b=R=(O>>>7^O>>>18^O>>>3^O<<25^O<<14)+(g>>>17^g>>>19^g>>>10^g<<15^g<<13)+b+h|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xc6e00bf3|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;O=R=(A>>>7^A>>>18^A>>>3^A<<25^A<<14)+(E>>>17^E>>>19^E>>>10^E<<15^E<<13)+O+p|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xd5a79147|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;A=R=(w>>>7^w>>>18^w>>>3^w<<25^w<<14)+(b>>>17^b>>>19^b>>>10^b<<15^b<<13)+A+v|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x06ca6351|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;w=R=(e>>>7^e>>>18^e>>>3^e<<25^e<<14)+(O>>>17^O>>>19^O>>>10^O<<15^O<<13)+w+y|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x14292967|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;e=R=(n>>>7^n>>>18^n>>>3^n<<25^n<<14)+(A>>>17^A>>>19^A>>>10^A<<15^A<<13)+e+m|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x27b70a85|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;n=R=(t>>>7^t>>>18^t>>>3^t<<25^t<<14)+(w>>>17^w>>>19^w>>>10^w<<15^w<<13)+n+g|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x2e1b2138|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;t=R=(l>>>7^l>>>18^l>>>3^l<<25^l<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+t+E|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x4d2c6dfc|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;l=R=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(n>>>17^n>>>19^n>>>10^n<<15^n<<13)+l+b|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x53380d13|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;d=R=(h>>>7^h>>>18^h>>>3^h<<25^h<<14)+(t>>>17^t>>>19^t>>>10^t<<15^t<<13)+d+O|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x650a7354|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;h=R=(p>>>7^p>>>18^p>>>3^p<<25^p<<14)+(l>>>17^l>>>19^l>>>10^l<<15^l<<13)+h+A|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x766a0abb|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;p=R=(v>>>7^v>>>18^v>>>3^v<<25^v<<14)+(d>>>17^d>>>19^d>>>10^d<<15^d<<13)+p+w|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x81c2c92e|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;v=R=(y>>>7^y>>>18^y>>>3^y<<25^y<<14)+(h>>>17^h>>>19^h>>>10^h<<15^h<<13)+v+e|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x92722c85|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;y=R=(m>>>7^m>>>18^m>>>3^m<<25^m<<14)+(p>>>17^p>>>19^p>>>10^p<<15^p<<13)+y+n|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xa2bfe8a1|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;m=R=(g>>>7^g>>>18^g>>>3^g<<25^g<<14)+(v>>>17^v>>>19^v>>>10^v<<15^v<<13)+m+t|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xa81a664b|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;g=R=(E>>>7^E>>>18^E>>>3^E<<25^E<<14)+(y>>>17^y>>>19^y>>>10^y<<15^y<<13)+g+l|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xc24b8b70|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;E=R=(b>>>7^b>>>18^b>>>3^b<<25^b<<14)+(m>>>17^m>>>19^m>>>10^m<<15^m<<13)+E+d|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xc76c51a3|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;b=R=(O>>>7^O>>>18^O>>>3^O<<25^O<<14)+(g>>>17^g>>>19^g>>>10^g<<15^g<<13)+b+h|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xd192e819|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;O=R=(A>>>7^A>>>18^A>>>3^A<<25^A<<14)+(E>>>17^E>>>19^E>>>10^E<<15^E<<13)+O+p|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xd6990624|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;A=R=(w>>>7^w>>>18^w>>>3^w<<25^w<<14)+(b>>>17^b>>>19^b>>>10^b<<15^b<<13)+A+v|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xf40e3585|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;w=R=(e>>>7^e>>>18^e>>>3^e<<25^e<<14)+(O>>>17^O>>>19^O>>>10^O<<15^O<<13)+w+y|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x106aa070|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;e=R=(n>>>7^n>>>18^n>>>3^n<<25^n<<14)+(A>>>17^A>>>19^A>>>10^A<<15^A<<13)+e+m|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x19a4c116|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;n=R=(t>>>7^t>>>18^t>>>3^t<<25^t<<14)+(w>>>17^w>>>19^w>>>10^w<<15^w<<13)+n+g|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x1e376c08|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;t=R=(l>>>7^l>>>18^l>>>3^l<<25^l<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+t+E|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x2748774c|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;l=R=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(n>>>17^n>>>19^n>>>10^n<<15^n<<13)+l+b|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x34b0bcb5|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;d=R=(h>>>7^h>>>18^h>>>3^h<<25^h<<14)+(t>>>17^t>>>19^t>>>10^t<<15^t<<13)+d+O|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x391c0cb3|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;h=R=(p>>>7^p>>>18^p>>>3^p<<25^p<<14)+(l>>>17^l>>>19^l>>>10^l<<15^l<<13)+h+A|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x4ed8aa4a|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;p=R=(v>>>7^v>>>18^v>>>3^v<<25^v<<14)+(d>>>17^d>>>19^d>>>10^d<<15^d<<13)+p+w|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x5b9cca4f|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;v=R=(y>>>7^y>>>18^y>>>3^y<<25^y<<14)+(h>>>17^h>>>19^h>>>10^h<<15^h<<13)+v+e|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x682e6ff3|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;y=R=(m>>>7^m>>>18^m>>>3^m<<25^m<<14)+(p>>>17^p>>>19^p>>>10^p<<15^p<<13)+y+n|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x748f82ee|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;m=R=(g>>>7^g>>>18^g>>>3^g<<25^g<<14)+(v>>>17^v>>>19^v>>>10^v<<15^v<<13)+m+t|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x78a5636f|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;g=R=(E>>>7^E>>>18^E>>>3^E<<25^E<<14)+(y>>>17^y>>>19^y>>>10^y<<15^y<<13)+g+l|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x84c87814|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;E=R=(b>>>7^b>>>18^b>>>3^b<<25^b<<14)+(m>>>17^m>>>19^m>>>10^m<<15^m<<13)+E+d|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x8cc70208|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;b=R=(O>>>7^O>>>18^O>>>3^O<<25^O<<14)+(g>>>17^g>>>19^g>>>10^g<<15^g<<13)+b+h|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x90befffa|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;O=R=(A>>>7^A>>>18^A>>>3^A<<25^A<<14)+(E>>>17^E>>>19^E>>>10^E<<15^E<<13)+O+p|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xa4506ceb|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;A=R=(w>>>7^w>>>18^w>>>3^w<<25^w<<14)+(b>>>17^b>>>19^b>>>10^b<<15^b<<13)+A+v|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xbef9a3f7|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;w=R=(e>>>7^e>>>18^e>>>3^e<<25^e<<14)+(O>>>17^O>>>19^O>>>10^O<<15^O<<13)+w+y|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xc67178f2|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;r=r+D|0;o=o+_|0;a=a+T|0;i=i+S|0;s=s+x|0;c=c+N|0;u=u+I|0;f=f+C|0}function C(e){e=e|0;I(N[e|0]<<24|N[e|1]<<16|N[e|2]<<8|N[e|3],N[e|4]<<24|N[e|5]<<16|N[e|6]<<8|N[e|7],N[e|8]<<24|N[e|9]<<16|N[e|10]<<8|N[e|11],N[e|12]<<24|N[e|13]<<16|N[e|14]<<8|N[e|15],N[e|16]<<24|N[e|17]<<16|N[e|18]<<8|N[e|19],N[e|20]<<24|N[e|21]<<16|N[e|22]<<8|N[e|23],N[e|24]<<24|N[e|25]<<16|N[e|26]<<8|N[e|27],N[e|28]<<24|N[e|29]<<16|N[e|30]<<8|N[e|31],N[e|32]<<24|N[e|33]<<16|N[e|34]<<8|N[e|35],N[e|36]<<24|N[e|37]<<16|N[e|38]<<8|N[e|39],N[e|40]<<24|N[e|41]<<16|N[e|42]<<8|N[e|43],N[e|44]<<24|N[e|45]<<16|N[e|46]<<8|N[e|47],N[e|48]<<24|N[e|49]<<16|N[e|50]<<8|N[e|51],N[e|52]<<24|N[e|53]<<16|N[e|54]<<8|N[e|55],N[e|56]<<24|N[e|57]<<16|N[e|58]<<8|N[e|59],N[e|60]<<24|N[e|61]<<16|N[e|62]<<8|N[e|63])}function R(e){e=e|0;N[e|0]=r>>>24;N[e|1]=r>>>16&255;N[e|2]=r>>>8&255;N[e|3]=r&255;N[e|4]=o>>>24;N[e|5]=o>>>16&255;N[e|6]=o>>>8&255;N[e|7]=o&255;N[e|8]=a>>>24;N[e|9]=a>>>16&255;N[e|10]=a>>>8&255;N[e|11]=a&255;N[e|12]=i>>>24;N[e|13]=i>>>16&255;N[e|14]=i>>>8&255;N[e|15]=i&255;N[e|16]=s>>>24;N[e|17]=s>>>16&255;N[e|18]=s>>>8&255;N[e|19]=s&255;N[e|20]=c>>>24;N[e|21]=c>>>16&255;N[e|22]=c>>>8&255;N[e|23]=c&255;N[e|24]=u>>>24;N[e|25]=u>>>16&255;N[e|26]=u>>>8&255;N[e|27]=u&255;N[e|28]=f>>>24;N[e|29]=f>>>16&255;N[e|30]=f>>>8&255;N[e|31]=f&255}function P(){r=0x6a09e667;o=0xbb67ae85;a=0x3c6ef372;i=0xa54ff53a;s=0x510e527f;c=0x9b05688c;u=0x1f83d9ab;f=0x5be0cd19;l=d=0}function k(e,n,t,h,p,v,y,m,g,E){e=e|0;n=n|0;t=t|0;h=h|0;p=p|0;v=v|0;y=y|0;m=m|0;g=g|0;E=E|0;r=e;o=n;a=t;i=h;s=p;c=v;u=y;f=m;l=g;d=E}function M(e,n){e=e|0;n=n|0;var t=0;if(e&63)return-1;while((n|0)>=64){C(e);e=e+64|0;n=n-64|0;t=t+64|0}l=l+t|0;if(l>>>0>>0)d=d+1|0;return t|0}function F(e,n,t){e=e|0;n=n|0;t=t|0;var r=0,o=0;if(e&63)return-1;if(~t)if(t&31)return-1;if((n|0)>=64){r=M(e,n)|0;if((r|0)==-1)return-1;e=e+r|0;n=n-r|0}r=r+n|0;l=l+n|0;if(l>>>0>>0)d=d+1|0;N[e|n]=0x80;if((n|0)>=56){for(o=n+1|0;(o|0)<64;o=o+1|0)N[e|o]=0x00;C(e);n=0;N[e|0]=0}for(o=n+1|0;(o|0)<59;o=o+1|0)N[e|o]=0;N[e|56]=d>>>21&255;N[e|57]=d>>>13&255;N[e|58]=d>>>5&255;N[e|59]=d<<3&255|l>>>29;N[e|60]=l>>>21&255;N[e|61]=l>>>13&255;N[e|62]=l>>>5&255;N[e|63]=l<<3&255;C(e);if(~t)R(t);return r|0}function L(){r=h;o=p;a=v;i=y;s=m;c=g;u=E;f=b;l=64;d=0}function H(){r=O;o=A;a=w;i=D;s=_;c=T;u=S;f=x;l=64;d=0}function j(e,n,t,N,C,R,k,M,F,L,H,j,K,U,B,V){e=e|0;n=n|0;t=t|0;N=N|0;C=C|0;R=R|0;k=k|0;M=M|0;F=F|0;L=L|0;H=H|0;j=j|0;K=K|0;U=U|0;B=B|0;V=V|0;P();I(e^0x5c5c5c5c,n^0x5c5c5c5c,t^0x5c5c5c5c,N^0x5c5c5c5c,C^0x5c5c5c5c,R^0x5c5c5c5c,k^0x5c5c5c5c,M^0x5c5c5c5c,F^0x5c5c5c5c,L^0x5c5c5c5c,H^0x5c5c5c5c,j^0x5c5c5c5c,K^0x5c5c5c5c,U^0x5c5c5c5c,B^0x5c5c5c5c,V^0x5c5c5c5c);O=r;A=o;w=a;D=i;_=s;T=c;S=u;x=f;P();I(e^0x36363636,n^0x36363636,t^0x36363636,N^0x36363636,C^0x36363636,R^0x36363636,k^0x36363636,M^0x36363636,F^0x36363636,L^0x36363636,H^0x36363636,j^0x36363636,K^0x36363636,U^0x36363636,B^0x36363636,V^0x36363636);h=r;p=o;v=a;y=i;m=s;g=c;E=u;b=f;l=64;d=0}function K(e,n,t){e=e|0;n=n|0;t=t|0;var l=0,d=0,h=0,p=0,v=0,y=0,m=0,g=0,E=0;if(e&63)return-1;if(~t)if(t&31)return-1;E=F(e,n,-1)|0;l=r,d=o,h=a,p=i,v=s,y=c,m=u,g=f;H();I(l,d,h,p,v,y,m,g,0x80000000,0,0,0,0,0,0,768);if(~t)R(t);return E|0}function U(e,n,t,l,d){e=e|0;n=n|0;t=t|0;l=l|0;d=d|0;var h=0,p=0,v=0,y=0,m=0,g=0,E=0,b=0,O=0,A=0,w=0,D=0,_=0,T=0,S=0,x=0;if(e&63)return-1;if(~d)if(d&31)return-1;N[e+n|0]=t>>>24;N[e+n+1|0]=t>>>16&255;N[e+n+2|0]=t>>>8&255;N[e+n+3|0]=t&255;K(e,n+4|0,-1)|0;h=O=r,p=A=o,v=w=a,y=D=i,m=_=s,g=T=c,E=S=u,b=x=f;l=l-1|0;while((l|0)>0){L();I(O,A,w,D,_,T,S,x,0x80000000,0,0,0,0,0,0,768);O=r,A=o,w=a,D=i,_=s,T=c,S=u,x=f;H();I(O,A,w,D,_,T,S,x,0x80000000,0,0,0,0,0,0,768);O=r,A=o,w=a,D=i,_=s,T=c,S=u,x=f;h=h^r;p=p^o;v=v^a;y=y^i;m=m^s;g=g^c;E=E^u;b=b^f;l=l-1|0}r=h;o=p;a=v;i=y;s=m;c=g;u=E;f=b;if(~d)R(d);return 0}return{reset:P,init:k,process:M,finish:F,hmac_reset:L,hmac_init:j,hmac_finish:K,pbkdf2_generate_block:U}}},"transform/TextTransformer.js":function(e,n,t){var r=t("../Operation"),o=t("../Common"),a=function(e,n){o.PARANOIA&&(r.check(e),r.check(n));var t=function(e,n){if(e.offset>n.offset){if(e.offset>n.offset+n.toRemove)return r.create(e.offset-n.toRemove+n.toInsert.length,e.toRemove,e.toInsert);var t=e.toRemove-(n.offset+n.toRemove-e.offset);return t<0&&(t=0),0===t&&0===e.toInsert.length?null:r.create(n.offset+n.toInsert.length,t,e.toInsert)}if(e.offset+e.toRemove=0;i--)s=r.apply(n[i],s);var c=[];for(i=e.length-1;i>=0;i--){for(var u=e[i],f=n.length-1;f>=0;f--){try{u=a(u,n[f])}catch(e){return console.error("The pluggable transform function threw an error, failing operational transformation"),console.error(e.stack),[]}if(!u)break}u&&(o.PARANOIA&&r.check(u,s.length),c.unshift(u))}return c}},"transform/NaiveJSONTransformer.js":function(e,n,t){var r=t("./TextTransformer"),o=t("../Operation"),a=t("../Common");e.exports=function(e,n,t){var i,s,c,u=a.global.REALTIME_DEBUG=a.global.REALTIME_DEBUG||{};try{i=r(e,n,t),s=o.applyMulti(n,t),c=o.applyMulti(i,s);try{return JSON.parse(c),i}catch(r){console.error(r),u.ot_parseError={type:"resultParseError",resultOps:i,toTransform:e,transformBy:n,text1:t,text2:s,text3:c,error:r},console.log("Debugging info available at `window.REALTIME_DEBUG.ot_parseError`")}}catch(r){console.error(r),u.ot_applyError={type:"resultParseError",resultOps:i,toTransform:e,transformBy:n,text1:t,text2:s,text3:c,error:r},console.log("Debugging info available at `window.REALTIME_DEBUG.ot_applyError`")}return[]}},"transform/SmartJSONTransformer.js":function(e,n,t){var r,o,a,i=t("json.sortify"),s=t("../Diff"),c=t("../Operation"),u=t("./TextTransformer"),f=function(e){return null===e?"null":(n=e,"[object Array]"===Object.prototype.toString.call(n)?"array":typeof e);var n},l=function(e,n){for(var t=n.length,r=0;r1)return!0}))&&("splice"!==n.type||!e.some((function(e){if("splice"===e.type&&y(e.path,n.path)&&e.path.length-n.path.length<0){if(!e.removals)return;for(var t=e.offset,r=e.offset+e.removals;te.offset+n.removals)return void(n.offset+=e.value.length-e.removals);if(n.offseti)){var d=n.slice(0,l);if((y=n.slice(l))===u){var p=Math.min(s,l);if((g=c.slice(0,p))===(b=d.slice(0,p)))return h(g,c.slice(p),d.slice(p),u)}}if(null===f||f===s){var v=s,y=(d=n.slice(0,v),n.slice(v));if(d===c){var m=Math.min(a-v,i-v);if((E=u.slice(u.length-m))===(O=y.slice(y.length-m)))return h(c,u.slice(0,u.length-m),y.slice(0,y.length-m),E)}}}if(r.length>0&&o&&0===o.length){var g=e.slice(0,r.index),E=e.slice(r.index+r.length);if(!(i<(p=g.length)+(m=E.length))){var b=n.slice(0,p),O=n.slice(i-m);if(g===b&&E===O)return h(g,e.slice(p,a-m),n.slice(p,i-m),E)}}return null}(e,n,t);if(f)return f}var l=i(e,n),d=e.substring(0,l);l=s(e=e.substring(l),n=n.substring(l));var p=e.substring(e.length-l),v=function(e,n){var t;if(!e)return[[1,n]];if(!n)return[[r,e]];var c=e.length>n.length?e:n,u=e.length>n.length?n:e,f=c.indexOf(u);if(-1!==f)return t=[[1,c.substring(0,f)],[0,u],[1,c.substring(f+u.length)]],e.length>n.length&&(t[0][0]=t[2][0]=r),t;if(1===u.length)return[[r,e],[1,n]];var l=function(e,n){var t=e.length>n.length?e:n,r=e.length>n.length?n:e;if(t.length<4||2*r.length=e.length?[r,o,a,c,l]:null}var a,c,u,f,l,d=o(t,r,Math.ceil(t.length/4)),h=o(t,r,Math.ceil(t.length/2));if(!d&&!h)return null;a=h?d&&d[4].length>h[4].length?d:h:d,e.length>n.length?(c=a[0],u=a[1],f=a[2],l=a[3]):(f=a[0],l=a[1],c=a[2],u=a[3]);var p=a[4];return[c,u,f,l,p]}(e,n);if(l){var d=l[0],h=l[1],p=l[2],v=l[3],y=l[4],m=o(d,p),g=o(h,v);return m.concat([[0,y]],g)}return function(e,n){for(var t=e.length,o=n.length,i=Math.ceil((t+o)/2),s=i,c=2*i,u=new Array(c),f=new Array(c),l=0;lt)v+=2;else if(O>o)p+=2;else if(h&&(D=s+d-E)>=0&&D=(w=t-f[D]))return a(e,n,T,O)}for(var A=-g+y;A<=g-m;A+=2){for(var w,D=s+A,_=(w=A===-g||A!==g&&f[D-1]t)m+=2;else if(_>o)y+=2;else if(!h){var T;if((b=s+d-A)>=0&&b=(w=t-w))return a(e,n,T,O)}}}return[[r,e],[1,n]]}(e,n)}(e=e.substring(0,e.length-l),n=n.substring(0,n.length-l));return d&&v.unshift([0,d]),p&&v.push([0,p]),c(v,u),v}function a(e,n,t,r){var a=e.substring(0,t),i=n.substring(0,r),s=e.substring(t),c=n.substring(r),u=o(a,i),f=o(s,c);return u.concat(f)}function i(e,n){if(!e||!n||e.charAt(0)!==n.charAt(0))return 0;for(var t=0,r=Math.min(e.length,n.length),o=r,a=0;t=0&&d(e[p][1])){var v=e[p][1].slice(-1);if(e[p][1]=e[p][1].slice(0,-1),f=v+f,h=v+h,!e[p][1]){e.splice(p,1),o--;var y=p-1;e[y]&&1===e[y][0]&&(u++,h=e[y][1]+h,y--),e[y]&&e[y][0]===r&&(a++,f=e[y][1]+f,y--),p=y}}l(e[o][1])&&(v=e[o][1].charAt(0),e[o][1]=e[o][1].slice(1),f+=v,h+=v)}if(o0||h.length>0){f.length>0&&h.length>0&&(0!==(t=i(h,f))&&(p>=0?e[p][1]+=h.substring(0,t):(e.splice(0,0,[0,h.substring(0,t)]),o++),h=h.substring(t),f=f.substring(t)),0!==(t=s(h,f))&&(e[o][1]=h.substring(h.length-t)+e[o][1],h=h.substring(0,h.length-t),f=f.substring(0,f.length-t)));var m=u+a;0===f.length&&0===h.length?(e.splice(o-m,m),o-=m):0===f.length?(e.splice(o-m,m,[1,h]),o=o-m+1):0===h.length?(e.splice(o-m,m,[r,f]),o=o-m+1):(e.splice(o-m,m,[r,f],[1,h]),o=o-m+2)}0!==o&&0===e[o-1][0]?(e[o-1][1]+=e[o][1],e.splice(o,1)):o++,u=0,a=0,f="",h=""}""===e[e.length-1][1]&&e.pop();var g=!1;for(o=1;o=55296&&e<=56319}function f(e){return e>=56320&&e<=57343}function l(e){return f(e.charCodeAt(0))}function d(e){return u(e.charCodeAt(e.length-1))}function h(e,n,t,o){return d(e)||l(o)?null:function(e){for(var n=[],t=0;t0&&n.push(e[t]);return n}([[0,e],[r,n],[1,t],[0,o]])}function p(e,n,t){return o(e,n,t,!0)}p.INSERT=1,p.DELETE=r,p.EQUAL=0,e.exports=p}},n=a("ChainPad.js"),r="ChainPad",e.exports=n,"undefined"!=typeof window?o=window:void 0!==t?o=t:"undefined"!=typeof self&&(o=self),o[r]=n}(A)),A.exports}var D,_,T=w(),S=n({__proto__:null,default:r(T)},[T]),x={exports:{}},N={exports:{}};function I(){return D||(D=1,function(e){!function(e){var n=function(e){var n,t=new Float64Array(16);if(e)for(n=0;n>24&255,e[n+1]=t>>16&255,e[n+2]=t>>8&255,e[n+3]=255&t,e[n+4]=r>>24&255,e[n+5]=r>>16&255,e[n+6]=r>>8&255,e[n+7]=255&r}function p(e,n,t,r,o){var a,i=0;for(a=0;a>>8)-1}function v(e,n,t,r){return p(e,n,t,r,16)}function y(e,n,t,r){return p(e,n,t,r,32)}function m(e,n,t,r){!function(e,n,t,r){for(var o,a=255&r[0]|(255&r[1])<<8|(255&r[2])<<16|(255&r[3])<<24,i=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,s=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,c=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,u=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,f=255&r[4]|(255&r[5])<<8|(255&r[6])<<16|(255&r[7])<<24,l=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,d=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,h=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,p=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,v=255&r[8]|(255&r[9])<<8|(255&r[10])<<16|(255&r[11])<<24,y=255&t[16]|(255&t[17])<<8|(255&t[18])<<16|(255&t[19])<<24,m=255&t[20]|(255&t[21])<<8|(255&t[22])<<16|(255&t[23])<<24,g=255&t[24]|(255&t[25])<<8|(255&t[26])<<16|(255&t[27])<<24,E=255&t[28]|(255&t[29])<<8|(255&t[30])<<16|(255&t[31])<<24,b=255&r[12]|(255&r[13])<<8|(255&r[14])<<16|(255&r[15])<<24,O=a,A=i,w=s,D=c,_=u,T=f,S=l,x=d,N=h,I=p,C=v,R=y,P=m,k=g,M=E,F=b,L=0;L<20;L+=2)O^=(o=(P^=(o=(N^=(o=(_^=(o=O+P|0)<<7|o>>>25)+O|0)<<9|o>>>23)+_|0)<<13|o>>>19)+N|0)<<18|o>>>14,T^=(o=(A^=(o=(k^=(o=(I^=(o=T+A|0)<<7|o>>>25)+T|0)<<9|o>>>23)+I|0)<<13|o>>>19)+k|0)<<18|o>>>14,C^=(o=(S^=(o=(w^=(o=(M^=(o=C+S|0)<<7|o>>>25)+C|0)<<9|o>>>23)+M|0)<<13|o>>>19)+w|0)<<18|o>>>14,F^=(o=(R^=(o=(x^=(o=(D^=(o=F+R|0)<<7|o>>>25)+F|0)<<9|o>>>23)+D|0)<<13|o>>>19)+x|0)<<18|o>>>14,O^=(o=(D^=(o=(w^=(o=(A^=(o=O+D|0)<<7|o>>>25)+O|0)<<9|o>>>23)+A|0)<<13|o>>>19)+w|0)<<18|o>>>14,T^=(o=(_^=(o=(x^=(o=(S^=(o=T+_|0)<<7|o>>>25)+T|0)<<9|o>>>23)+S|0)<<13|o>>>19)+x|0)<<18|o>>>14,C^=(o=(I^=(o=(N^=(o=(R^=(o=C+I|0)<<7|o>>>25)+C|0)<<9|o>>>23)+R|0)<<13|o>>>19)+N|0)<<18|o>>>14,F^=(o=(M^=(o=(k^=(o=(P^=(o=F+M|0)<<7|o>>>25)+F|0)<<9|o>>>23)+P|0)<<13|o>>>19)+k|0)<<18|o>>>14;O=O+a|0,A=A+i|0,w=w+s|0,D=D+c|0,_=_+u|0,T=T+f|0,S=S+l|0,x=x+d|0,N=N+h|0,I=I+p|0,C=C+v|0,R=R+y|0,P=P+m|0,k=k+g|0,M=M+E|0,F=F+b|0,e[0]=O>>>0&255,e[1]=O>>>8&255,e[2]=O>>>16&255,e[3]=O>>>24&255,e[4]=A>>>0&255,e[5]=A>>>8&255,e[6]=A>>>16&255,e[7]=A>>>24&255,e[8]=w>>>0&255,e[9]=w>>>8&255,e[10]=w>>>16&255,e[11]=w>>>24&255,e[12]=D>>>0&255,e[13]=D>>>8&255,e[14]=D>>>16&255,e[15]=D>>>24&255,e[16]=_>>>0&255,e[17]=_>>>8&255,e[18]=_>>>16&255,e[19]=_>>>24&255,e[20]=T>>>0&255,e[21]=T>>>8&255,e[22]=T>>>16&255,e[23]=T>>>24&255,e[24]=S>>>0&255,e[25]=S>>>8&255,e[26]=S>>>16&255,e[27]=S>>>24&255,e[28]=x>>>0&255,e[29]=x>>>8&255,e[30]=x>>>16&255,e[31]=x>>>24&255,e[32]=N>>>0&255,e[33]=N>>>8&255,e[34]=N>>>16&255,e[35]=N>>>24&255,e[36]=I>>>0&255,e[37]=I>>>8&255,e[38]=I>>>16&255,e[39]=I>>>24&255,e[40]=C>>>0&255,e[41]=C>>>8&255,e[42]=C>>>16&255,e[43]=C>>>24&255,e[44]=R>>>0&255,e[45]=R>>>8&255,e[46]=R>>>16&255,e[47]=R>>>24&255,e[48]=P>>>0&255,e[49]=P>>>8&255,e[50]=P>>>16&255,e[51]=P>>>24&255,e[52]=k>>>0&255,e[53]=k>>>8&255,e[54]=k>>>16&255,e[55]=k>>>24&255,e[56]=M>>>0&255,e[57]=M>>>8&255,e[58]=M>>>16&255,e[59]=M>>>24&255,e[60]=F>>>0&255,e[61]=F>>>8&255,e[62]=F>>>16&255,e[63]=F>>>24&255}(e,n,t,r)}function g(e,n,t,r){!function(e,n,t,r){for(var o,a=255&r[0]|(255&r[1])<<8|(255&r[2])<<16|(255&r[3])<<24,i=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,s=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,c=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,u=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,f=255&r[4]|(255&r[5])<<8|(255&r[6])<<16|(255&r[7])<<24,l=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,d=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,h=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,p=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,v=255&r[8]|(255&r[9])<<8|(255&r[10])<<16|(255&r[11])<<24,y=255&t[16]|(255&t[17])<<8|(255&t[18])<<16|(255&t[19])<<24,m=255&t[20]|(255&t[21])<<8|(255&t[22])<<16|(255&t[23])<<24,g=255&t[24]|(255&t[25])<<8|(255&t[26])<<16|(255&t[27])<<24,E=255&t[28]|(255&t[29])<<8|(255&t[30])<<16|(255&t[31])<<24,b=255&r[12]|(255&r[13])<<8|(255&r[14])<<16|(255&r[15])<<24,O=0;O<20;O+=2)a^=(o=(m^=(o=(h^=(o=(u^=(o=a+m|0)<<7|o>>>25)+a|0)<<9|o>>>23)+u|0)<<13|o>>>19)+h|0)<<18|o>>>14,f^=(o=(i^=(o=(g^=(o=(p^=(o=f+i|0)<<7|o>>>25)+f|0)<<9|o>>>23)+p|0)<<13|o>>>19)+g|0)<<18|o>>>14,v^=(o=(l^=(o=(s^=(o=(E^=(o=v+l|0)<<7|o>>>25)+v|0)<<9|o>>>23)+E|0)<<13|o>>>19)+s|0)<<18|o>>>14,b^=(o=(y^=(o=(d^=(o=(c^=(o=b+y|0)<<7|o>>>25)+b|0)<<9|o>>>23)+c|0)<<13|o>>>19)+d|0)<<18|o>>>14,a^=(o=(c^=(o=(s^=(o=(i^=(o=a+c|0)<<7|o>>>25)+a|0)<<9|o>>>23)+i|0)<<13|o>>>19)+s|0)<<18|o>>>14,f^=(o=(u^=(o=(d^=(o=(l^=(o=f+u|0)<<7|o>>>25)+f|0)<<9|o>>>23)+l|0)<<13|o>>>19)+d|0)<<18|o>>>14,v^=(o=(p^=(o=(h^=(o=(y^=(o=v+p|0)<<7|o>>>25)+v|0)<<9|o>>>23)+y|0)<<13|o>>>19)+h|0)<<18|o>>>14,b^=(o=(E^=(o=(g^=(o=(m^=(o=b+E|0)<<7|o>>>25)+b|0)<<9|o>>>23)+m|0)<<13|o>>>19)+g|0)<<18|o>>>14;e[0]=a>>>0&255,e[1]=a>>>8&255,e[2]=a>>>16&255,e[3]=a>>>24&255,e[4]=f>>>0&255,e[5]=f>>>8&255,e[6]=f>>>16&255,e[7]=f>>>24&255,e[8]=v>>>0&255,e[9]=v>>>8&255,e[10]=v>>>16&255,e[11]=v>>>24&255,e[12]=b>>>0&255,e[13]=b>>>8&255,e[14]=b>>>16&255,e[15]=b>>>24&255,e[16]=l>>>0&255,e[17]=l>>>8&255,e[18]=l>>>16&255,e[19]=l>>>24&255,e[20]=d>>>0&255,e[21]=d>>>8&255,e[22]=d>>>16&255,e[23]=d>>>24&255,e[24]=h>>>0&255,e[25]=h>>>8&255,e[26]=h>>>16&255,e[27]=h>>>24&255,e[28]=p>>>0&255,e[29]=p>>>8&255,e[30]=p>>>16&255,e[31]=p>>>24&255}(e,n,t,r)}var E=new Uint8Array([101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107]);function O(e,n,t,r,o,a,i){var s,c,u=new Uint8Array(16),f=new Uint8Array(64);for(c=0;c<16;c++)u[c]=0;for(c=0;c<8;c++)u[c]=a[c];for(;o>=64;){for(m(f,u,i,E),c=0;c<64;c++)e[n+c]=t[r+c]^f[c];for(s=1,c=8;c<16;c++)s=s+(255&u[c])|0,u[c]=255&s,s>>>=8;o-=64,n+=64,r+=64}if(o>0)for(m(f,u,i,E),c=0;c=64;){for(m(c,s,o,E),i=0;i<64;i++)e[n+i]=c[i];for(a=1,i=8;i<16;i++)a=a+(255&s[i])|0,s[i]=255&a,a>>>=8;t-=64,n+=64}if(t>0)for(m(c,s,o,E),i=0;i>>13|t<<3),r=255&e[4]|(255&e[5])<<8,this.r[2]=7939&(t>>>10|r<<6),o=255&e[6]|(255&e[7])<<8,this.r[3]=8191&(r>>>7|o<<9),a=255&e[8]|(255&e[9])<<8,this.r[4]=255&(o>>>4|a<<12),this.r[5]=a>>>1&8190,i=255&e[10]|(255&e[11])<<8,this.r[6]=8191&(a>>>14|i<<2),s=255&e[12]|(255&e[13])<<8,this.r[7]=8065&(i>>>11|s<<5),c=255&e[14]|(255&e[15])<<8,this.r[8]=8191&(s>>>8|c<<8),this.r[9]=c>>>5&127,this.pad[0]=255&e[16]|(255&e[17])<<8,this.pad[1]=255&e[18]|(255&e[19])<<8,this.pad[2]=255&e[20]|(255&e[21])<<8,this.pad[3]=255&e[22]|(255&e[23])<<8,this.pad[4]=255&e[24]|(255&e[25])<<8,this.pad[5]=255&e[26]|(255&e[27])<<8,this.pad[6]=255&e[28]|(255&e[29])<<8,this.pad[7]=255&e[30]|(255&e[31])<<8};function T(e,n,t,r,o,a){var i=new _(a);return i.update(t,r,o),i.finish(e,n),0}function S(e,n,t,r,o,a){var i=new Uint8Array(16);return T(i,0,t,r,o,a),v(e,n,i,0)}function x(e,n,t,r,o){var a;if(t<32)return-1;for(D(e,0,n,0,t,r,o),T(e,16,e,32,t-32,e),a=0;a<16;a++)e[a]=0;return 0}function N(e,n,t,r,o){var a,i=new Uint8Array(32);if(t<32)return-1;if(w(i,0,32,r,o),0!==S(n,16,n,32,t-32,i))return-1;for(D(e,0,n,0,t,r,o),a=0;a<32;a++)e[a]=0;return 0}function I(e,n){var t;for(t=0;t<16;t++)e[t]=0|n[t]}function C(e){var n,t,r=1;for(n=0;n<16;n++)t=e[n]+r+65535,r=Math.floor(t/65536),e[n]=t-65536*r;e[0]+=r-1+37*(r-1)}function R(e,n,t){for(var r,o=~(t-1),a=0;a<16;a++)r=o&(e[a]^n[a]),e[a]^=r,n[a]^=r}function P(e,t){var r,o,a,i=n(),s=n();for(r=0;r<16;r++)s[r]=t[r];for(C(s),C(s),C(s),o=0;o<2;o++){for(i[0]=s[0]-65517,r=1;r<15;r++)i[r]=s[r]-65535-(i[r-1]>>16&1),i[r-1]&=65535;i[15]=s[15]-32767-(i[14]>>16&1),a=i[15]>>16&1,i[14]&=65535,R(s,i,1-a)}for(r=0;r<16;r++)e[2*r]=255&s[r],e[2*r+1]=s[r]>>8}function k(e,n){var t=new Uint8Array(32),r=new Uint8Array(32);return P(t,e),P(r,n),y(t,0,r,0)}function M(e){var n=new Uint8Array(32);return P(n,e),1&n[0]}function F(e,n){var t;for(t=0;t<16;t++)e[t]=n[2*t]+(n[2*t+1]<<8);e[15]&=32767}function L(e,n,t){for(var r=0;r<16;r++)e[r]=n[r]+t[r]}function H(e,n,t){for(var r=0;r<16;r++)e[r]=n[r]-t[r]}function j(e,n,t){var r,o,a=0,i=0,s=0,c=0,u=0,f=0,l=0,d=0,h=0,p=0,v=0,y=0,m=0,g=0,E=0,b=0,O=0,A=0,w=0,D=0,_=0,T=0,S=0,x=0,N=0,I=0,C=0,R=0,P=0,k=0,M=0,F=t[0],L=t[1],H=t[2],j=t[3],K=t[4],U=t[5],B=t[6],V=t[7],Y=t[8],G=t[9],J=t[10],W=t[11],q=t[12],z=t[13],Q=t[14],X=t[15];a+=(r=n[0])*F,i+=r*L,s+=r*H,c+=r*j,u+=r*K,f+=r*U,l+=r*B,d+=r*V,h+=r*Y,p+=r*G,v+=r*J,y+=r*W,m+=r*q,g+=r*z,E+=r*Q,b+=r*X,i+=(r=n[1])*F,s+=r*L,c+=r*H,u+=r*j,f+=r*K,l+=r*U,d+=r*B,h+=r*V,p+=r*Y,v+=r*G,y+=r*J,m+=r*W,g+=r*q,E+=r*z,b+=r*Q,O+=r*X,s+=(r=n[2])*F,c+=r*L,u+=r*H,f+=r*j,l+=r*K,d+=r*U,h+=r*B,p+=r*V,v+=r*Y,y+=r*G,m+=r*J,g+=r*W,E+=r*q,b+=r*z,O+=r*Q,A+=r*X,c+=(r=n[3])*F,u+=r*L,f+=r*H,l+=r*j,d+=r*K,h+=r*U,p+=r*B,v+=r*V,y+=r*Y,m+=r*G,g+=r*J,E+=r*W,b+=r*q,O+=r*z,A+=r*Q,w+=r*X,u+=(r=n[4])*F,f+=r*L,l+=r*H,d+=r*j,h+=r*K,p+=r*U,v+=r*B,y+=r*V,m+=r*Y,g+=r*G,E+=r*J,b+=r*W,O+=r*q,A+=r*z,w+=r*Q,D+=r*X,f+=(r=n[5])*F,l+=r*L,d+=r*H,h+=r*j,p+=r*K,v+=r*U,y+=r*B,m+=r*V,g+=r*Y,E+=r*G,b+=r*J,O+=r*W,A+=r*q,w+=r*z,D+=r*Q,_+=r*X,l+=(r=n[6])*F,d+=r*L,h+=r*H,p+=r*j,v+=r*K,y+=r*U,m+=r*B,g+=r*V,E+=r*Y,b+=r*G,O+=r*J,A+=r*W,w+=r*q,D+=r*z,_+=r*Q,T+=r*X,d+=(r=n[7])*F,h+=r*L,p+=r*H,v+=r*j,y+=r*K,m+=r*U,g+=r*B,E+=r*V,b+=r*Y,O+=r*G,A+=r*J,w+=r*W,D+=r*q,_+=r*z,T+=r*Q,S+=r*X,h+=(r=n[8])*F,p+=r*L,v+=r*H,y+=r*j,m+=r*K,g+=r*U,E+=r*B,b+=r*V,O+=r*Y,A+=r*G,w+=r*J,D+=r*W,_+=r*q,T+=r*z,S+=r*Q,x+=r*X,p+=(r=n[9])*F,v+=r*L,y+=r*H,m+=r*j,g+=r*K,E+=r*U,b+=r*B,O+=r*V,A+=r*Y,w+=r*G,D+=r*J,_+=r*W,T+=r*q,S+=r*z,x+=r*Q,N+=r*X,v+=(r=n[10])*F,y+=r*L,m+=r*H,g+=r*j,E+=r*K,b+=r*U,O+=r*B,A+=r*V,w+=r*Y,D+=r*G,_+=r*J,T+=r*W,S+=r*q,x+=r*z,N+=r*Q,I+=r*X,y+=(r=n[11])*F,m+=r*L,g+=r*H,E+=r*j,b+=r*K,O+=r*U,A+=r*B,w+=r*V,D+=r*Y,_+=r*G,T+=r*J,S+=r*W,x+=r*q,N+=r*z,I+=r*Q,C+=r*X,m+=(r=n[12])*F,g+=r*L,E+=r*H,b+=r*j,O+=r*K,A+=r*U,w+=r*B,D+=r*V,_+=r*Y,T+=r*G,S+=r*J,x+=r*W,N+=r*q,I+=r*z,C+=r*Q,R+=r*X,g+=(r=n[13])*F,E+=r*L,b+=r*H,O+=r*j,A+=r*K,w+=r*U,D+=r*B,_+=r*V,T+=r*Y,S+=r*G,x+=r*J,N+=r*W,I+=r*q,C+=r*z,R+=r*Q,P+=r*X,E+=(r=n[14])*F,b+=r*L,O+=r*H,A+=r*j,w+=r*K,D+=r*U,_+=r*B,T+=r*V,S+=r*Y,x+=r*G,N+=r*J,I+=r*W,C+=r*q,R+=r*z,P+=r*Q,k+=r*X,b+=(r=n[15])*F,i+=38*(A+=r*H),s+=38*(w+=r*j),c+=38*(D+=r*K),u+=38*(_+=r*U),f+=38*(T+=r*B),l+=38*(S+=r*V),d+=38*(x+=r*Y),h+=38*(N+=r*G),p+=38*(I+=r*J),v+=38*(C+=r*W),y+=38*(R+=r*q),m+=38*(P+=r*z),g+=38*(k+=r*Q),E+=38*(M+=r*X),a=(r=(a+=38*(O+=r*L))+(o=1)+65535)-65536*(o=Math.floor(r/65536)),i=(r=i+o+65535)-65536*(o=Math.floor(r/65536)),s=(r=s+o+65535)-65536*(o=Math.floor(r/65536)),c=(r=c+o+65535)-65536*(o=Math.floor(r/65536)),u=(r=u+o+65535)-65536*(o=Math.floor(r/65536)),f=(r=f+o+65535)-65536*(o=Math.floor(r/65536)),l=(r=l+o+65535)-65536*(o=Math.floor(r/65536)),d=(r=d+o+65535)-65536*(o=Math.floor(r/65536)),h=(r=h+o+65535)-65536*(o=Math.floor(r/65536)),p=(r=p+o+65535)-65536*(o=Math.floor(r/65536)),v=(r=v+o+65535)-65536*(o=Math.floor(r/65536)),y=(r=y+o+65535)-65536*(o=Math.floor(r/65536)),m=(r=m+o+65535)-65536*(o=Math.floor(r/65536)),g=(r=g+o+65535)-65536*(o=Math.floor(r/65536)),E=(r=E+o+65535)-65536*(o=Math.floor(r/65536)),b=(r=b+o+65535)-65536*(o=Math.floor(r/65536)),a=(r=(a+=o-1+37*(o-1))+(o=1)+65535)-65536*(o=Math.floor(r/65536)),i=(r=i+o+65535)-65536*(o=Math.floor(r/65536)),s=(r=s+o+65535)-65536*(o=Math.floor(r/65536)),c=(r=c+o+65535)-65536*(o=Math.floor(r/65536)),u=(r=u+o+65535)-65536*(o=Math.floor(r/65536)),f=(r=f+o+65535)-65536*(o=Math.floor(r/65536)),l=(r=l+o+65535)-65536*(o=Math.floor(r/65536)),d=(r=d+o+65535)-65536*(o=Math.floor(r/65536)),h=(r=h+o+65535)-65536*(o=Math.floor(r/65536)),p=(r=p+o+65535)-65536*(o=Math.floor(r/65536)),v=(r=v+o+65535)-65536*(o=Math.floor(r/65536)),y=(r=y+o+65535)-65536*(o=Math.floor(r/65536)),m=(r=m+o+65535)-65536*(o=Math.floor(r/65536)),g=(r=g+o+65535)-65536*(o=Math.floor(r/65536)),E=(r=E+o+65535)-65536*(o=Math.floor(r/65536)),b=(r=b+o+65535)-65536*(o=Math.floor(r/65536)),a+=o-1+37*(o-1),e[0]=a,e[1]=i,e[2]=s,e[3]=c,e[4]=u,e[5]=f,e[6]=l,e[7]=d,e[8]=h,e[9]=p,e[10]=v,e[11]=y,e[12]=m,e[13]=g,e[14]=E,e[15]=b}function K(e,n){j(e,n,n)}function U(e,t){var r,o=n();for(r=0;r<16;r++)o[r]=t[r];for(r=253;r>=0;r--)K(o,o),2!==r&&4!==r&&j(o,o,t);for(r=0;r<16;r++)e[r]=o[r]}function B(e,t,r){var o,a,i=new Uint8Array(32),c=new Float64Array(80),u=n(),f=n(),l=n(),d=n(),h=n(),p=n();for(a=0;a<31;a++)i[a]=t[a];for(i[31]=127&t[31]|64,i[0]&=248,F(c,r),a=0;a<16;a++)f[a]=c[a],d[a]=u[a]=l[a]=0;for(u[0]=d[0]=1,a=254;a>=0;--a)R(u,f,o=i[a>>>3]>>>(7&a)&1),R(l,d,o),L(h,u,l),H(u,u,l),L(l,f,d),H(f,f,d),K(d,h),K(p,u),j(u,l,u),j(l,f,h),L(h,u,l),H(u,u,l),K(f,u),H(l,d,p),j(u,l,s),L(u,u,d),j(l,l,u),j(u,d,p),j(d,f,c),K(f,h),R(u,f,o),R(l,d,o);for(a=0;a<16;a++)c[a+16]=u[a],c[a+32]=l[a],c[a+48]=f[a],c[a+64]=d[a];var v=c.subarray(32),y=c.subarray(16);return U(v,v),j(y,y,v),P(e,y),0}function V(e,n){return B(e,n,o)}function Y(e,n){return t(n,32),V(e,n)}function G(e,n,t){var o=new Uint8Array(32);return B(o,t,n),g(e,r,o,E)}_.prototype.blocks=function(e,n,t){for(var r,o,a,i,s,c,u,f,l,d,h,p,v,y,m,g,E,b,O,A=this.fin?0:2048,w=this.h[0],D=this.h[1],_=this.h[2],T=this.h[3],S=this.h[4],x=this.h[5],N=this.h[6],I=this.h[7],C=this.h[8],R=this.h[9],P=this.r[0],k=this.r[1],M=this.r[2],F=this.r[3],L=this.r[4],H=this.r[5],j=this.r[6],K=this.r[7],U=this.r[8],B=this.r[9];t>=16;)d=l=0,d+=(w+=8191&(r=255&e[n+0]|(255&e[n+1])<<8))*P,d+=(D+=8191&(r>>>13|(o=255&e[n+2]|(255&e[n+3])<<8)<<3))*(5*B),d+=(_+=8191&(o>>>10|(a=255&e[n+4]|(255&e[n+5])<<8)<<6))*(5*U),d+=(T+=8191&(a>>>7|(i=255&e[n+6]|(255&e[n+7])<<8)<<9))*(5*K),l=(d+=(S+=8191&(i>>>4|(s=255&e[n+8]|(255&e[n+9])<<8)<<12))*(5*j))>>>13,d&=8191,d+=(x+=s>>>1&8191)*(5*H),d+=(N+=8191&(s>>>14|(c=255&e[n+10]|(255&e[n+11])<<8)<<2))*(5*L),d+=(I+=8191&(c>>>11|(u=255&e[n+12]|(255&e[n+13])<<8)<<5))*(5*F),d+=(C+=8191&(u>>>8|(f=255&e[n+14]|(255&e[n+15])<<8)<<8))*(5*M),h=l+=(d+=(R+=f>>>5|A)*(5*k))>>>13,h+=w*k,h+=D*P,h+=_*(5*B),h+=T*(5*U),l=(h+=S*(5*K))>>>13,h&=8191,h+=x*(5*j),h+=N*(5*H),h+=I*(5*L),h+=C*(5*F),l+=(h+=R*(5*M))>>>13,h&=8191,p=l,p+=w*M,p+=D*k,p+=_*P,p+=T*(5*B),l=(p+=S*(5*U))>>>13,p&=8191,p+=x*(5*K),p+=N*(5*j),p+=I*(5*H),p+=C*(5*L),v=l+=(p+=R*(5*F))>>>13,v+=w*F,v+=D*M,v+=_*k,v+=T*P,l=(v+=S*(5*B))>>>13,v&=8191,v+=x*(5*U),v+=N*(5*K),v+=I*(5*j),v+=C*(5*H),y=l+=(v+=R*(5*L))>>>13,y+=w*L,y+=D*F,y+=_*M,y+=T*k,l=(y+=S*P)>>>13,y&=8191,y+=x*(5*B),y+=N*(5*U),y+=I*(5*K),y+=C*(5*j),m=l+=(y+=R*(5*H))>>>13,m+=w*H,m+=D*L,m+=_*F,m+=T*M,l=(m+=S*k)>>>13,m&=8191,m+=x*P,m+=N*(5*B),m+=I*(5*U),m+=C*(5*K),g=l+=(m+=R*(5*j))>>>13,g+=w*j,g+=D*H,g+=_*L,g+=T*F,l=(g+=S*M)>>>13,g&=8191,g+=x*k,g+=N*P,g+=I*(5*B),g+=C*(5*U),E=l+=(g+=R*(5*K))>>>13,E+=w*K,E+=D*j,E+=_*H,E+=T*L,l=(E+=S*F)>>>13,E&=8191,E+=x*M,E+=N*k,E+=I*P,E+=C*(5*B),b=l+=(E+=R*(5*U))>>>13,b+=w*U,b+=D*K,b+=_*j,b+=T*H,l=(b+=S*L)>>>13,b&=8191,b+=x*F,b+=N*M,b+=I*k,b+=C*P,O=l+=(b+=R*(5*B))>>>13,O+=w*B,O+=D*U,O+=_*K,O+=T*j,l=(O+=S*H)>>>13,O&=8191,O+=x*L,O+=N*F,O+=I*M,O+=C*k,w=d=8191&(l=(l=((l+=(O+=R*P)>>>13)<<2)+l|0)+(d&=8191)|0),D=h+=l>>>=13,_=p&=8191,T=v&=8191,S=y&=8191,x=m&=8191,N=g&=8191,I=E&=8191,C=b&=8191,R=O&=8191,n+=16,t-=16;this.h[0]=w,this.h[1]=D,this.h[2]=_,this.h[3]=T,this.h[4]=S,this.h[5]=x,this.h[6]=N,this.h[7]=I,this.h[8]=C,this.h[9]=R},_.prototype.finish=function(e,n){var t,r,o,a,i=new Uint16Array(10);if(this.leftover){for(a=this.leftover,this.buffer[a++]=1;a<16;a++)this.buffer[a]=0;this.fin=1,this.blocks(this.buffer,0,16)}for(t=this.h[1]>>>13,this.h[1]&=8191,a=2;a<10;a++)this.h[a]+=t,t=this.h[a]>>>13,this.h[a]&=8191;for(this.h[0]+=5*t,t=this.h[0]>>>13,this.h[0]&=8191,this.h[1]+=t,t=this.h[1]>>>13,this.h[1]&=8191,this.h[2]+=t,i[0]=this.h[0]+5,t=i[0]>>>13,i[0]&=8191,a=1;a<10;a++)i[a]=this.h[a]+t,t=i[a]>>>13,i[a]&=8191;for(i[9]-=8192,r=(i[9]>>>15)-1,a=0;a<10;a++)i[a]&=r;for(r=~r,a=0;a<10;a++)this.h[a]=this.h[a]&r|i[a];for(this.h[0]=65535&(this.h[0]|this.h[1]<<13),this.h[1]=65535&(this.h[1]>>>3|this.h[2]<<10),this.h[2]=65535&(this.h[2]>>>6|this.h[3]<<7),this.h[3]=65535&(this.h[3]>>>9|this.h[4]<<4),this.h[4]=65535&(this.h[4]>>>12|this.h[5]<<1|this.h[6]<<14),this.h[5]=65535&(this.h[6]>>>2|this.h[7]<<11),this.h[6]=65535&(this.h[7]>>>5|this.h[8]<<8),this.h[7]=65535&(this.h[8]>>>8|this.h[9]<<5),o=this.h[0]+this.pad[0],this.h[0]=65535&o,a=1;a<8;a++)o=(this.h[a]+this.pad[a]|0)+(o>>>16)|0,this.h[a]=65535&o;e[n+0]=this.h[0]>>>0&255,e[n+1]=this.h[0]>>>8&255,e[n+2]=this.h[1]>>>0&255,e[n+3]=this.h[1]>>>8&255,e[n+4]=this.h[2]>>>0&255,e[n+5]=this.h[2]>>>8&255,e[n+6]=this.h[3]>>>0&255,e[n+7]=this.h[3]>>>8&255,e[n+8]=this.h[4]>>>0&255,e[n+9]=this.h[4]>>>8&255,e[n+10]=this.h[5]>>>0&255,e[n+11]=this.h[5]>>>8&255,e[n+12]=this.h[6]>>>0&255,e[n+13]=this.h[6]>>>8&255,e[n+14]=this.h[7]>>>0&255,e[n+15]=this.h[7]>>>8&255},_.prototype.update=function(e,n,t){var r,o;if(this.leftover){for((o=16-this.leftover)>t&&(o=t),r=0;r=16&&(o=t-t%16,this.blocks(e,n,o),n+=o,t-=o),t){for(r=0;r=128;){for(A=0;A<16;A++)w=8*A+z,I[A]=t[w+0]<<24|t[w+1]<<16|t[w+2]<<8|t[w+3],C[A]=t[w+4]<<24|t[w+5]<<16|t[w+6]<<8|t[w+7];for(A=0;A<80;A++)if(o=R,a=P,i=k,s=M,c=F,u=L,f=H,j,d=K,h=U,p=B,v=V,y=Y,m=G,g=J,W,T=65535&(_=W),S=_>>>16,x=65535&(D=j),N=D>>>16,T+=65535&(_=(Y>>>14|F<<18)^(Y>>>18|F<<14)^(F>>>9|Y<<23)),S+=_>>>16,x+=65535&(D=(F>>>14|Y<<18)^(F>>>18|Y<<14)^(Y>>>9|F<<23)),N+=D>>>16,T+=65535&(_=Y&G^~Y&J),S+=_>>>16,x+=65535&(D=F&L^~F&H),N+=D>>>16,T+=65535&(_=q[2*A+1]),S+=_>>>16,x+=65535&(D=q[2*A]),N+=D>>>16,D=I[A%16],S+=(_=C[A%16])>>>16,x+=65535&D,N+=D>>>16,x+=(S+=(T+=65535&_)>>>16)>>>16,T=65535&(_=O=65535&T|S<<16),S=_>>>16,x=65535&(D=b=65535&x|(N+=x>>>16)<<16),N=D>>>16,T+=65535&(_=(K>>>28|R<<4)^(R>>>2|K<<30)^(R>>>7|K<<25)),S+=_>>>16,x+=65535&(D=(R>>>28|K<<4)^(K>>>2|R<<30)^(K>>>7|R<<25)),N+=D>>>16,S+=(_=K&U^K&B^U&B)>>>16,x+=65535&(D=R&P^R&k^P&k),N+=D>>>16,l=65535&(x+=(S+=(T+=65535&_)>>>16)>>>16)|(N+=x>>>16)<<16,E=65535&T|S<<16,T=65535&(_=v),S=_>>>16,x=65535&(D=s),N=D>>>16,S+=(_=O)>>>16,x+=65535&(D=b),N+=D>>>16,P=o,k=a,M=i,F=s=65535&(x+=(S+=(T+=65535&_)>>>16)>>>16)|(N+=x>>>16)<<16,L=c,H=u,j=f,R=l,U=d,B=h,V=p,Y=v=65535&T|S<<16,G=y,J=m,W=g,K=E,A%16==15)for(w=0;w<16;w++)D=I[w],T=65535&(_=C[w]),S=_>>>16,x=65535&D,N=D>>>16,D=I[(w+9)%16],T+=65535&(_=C[(w+9)%16]),S+=_>>>16,x+=65535&D,N+=D>>>16,b=I[(w+1)%16],T+=65535&(_=((O=C[(w+1)%16])>>>1|b<<31)^(O>>>8|b<<24)^(O>>>7|b<<25)),S+=_>>>16,x+=65535&(D=(b>>>1|O<<31)^(b>>>8|O<<24)^b>>>7),N+=D>>>16,b=I[(w+14)%16],S+=(_=((O=C[(w+14)%16])>>>19|b<<13)^(b>>>29|O<<3)^(O>>>6|b<<26))>>>16,x+=65535&(D=(b>>>19|O<<13)^(O>>>29|b<<3)^b>>>6),N+=D>>>16,N+=(x+=(S+=(T+=65535&_)>>>16)>>>16)>>>16,I[w]=65535&x|N<<16,C[w]=65535&T|S<<16;T=65535&(_=K),S=_>>>16,x=65535&(D=R),N=D>>>16,D=e[0],S+=(_=n[0])>>>16,x+=65535&D,N+=D>>>16,N+=(x+=(S+=(T+=65535&_)>>>16)>>>16)>>>16,e[0]=R=65535&x|N<<16,n[0]=K=65535&T|S<<16,T=65535&(_=U),S=_>>>16,x=65535&(D=P),N=D>>>16,D=e[1],S+=(_=n[1])>>>16,x+=65535&D,N+=D>>>16,N+=(x+=(S+=(T+=65535&_)>>>16)>>>16)>>>16,e[1]=P=65535&x|N<<16,n[1]=U=65535&T|S<<16,T=65535&(_=B),S=_>>>16,x=65535&(D=k),N=D>>>16,D=e[2],S+=(_=n[2])>>>16,x+=65535&D,N+=D>>>16,N+=(x+=(S+=(T+=65535&_)>>>16)>>>16)>>>16,e[2]=k=65535&x|N<<16,n[2]=B=65535&T|S<<16,T=65535&(_=V),S=_>>>16,x=65535&(D=M),N=D>>>16,D=e[3],S+=(_=n[3])>>>16,x+=65535&D,N+=D>>>16,N+=(x+=(S+=(T+=65535&_)>>>16)>>>16)>>>16,e[3]=M=65535&x|N<<16,n[3]=V=65535&T|S<<16,T=65535&(_=Y),S=_>>>16,x=65535&(D=F),N=D>>>16,D=e[4],S+=(_=n[4])>>>16,x+=65535&D,N+=D>>>16,N+=(x+=(S+=(T+=65535&_)>>>16)>>>16)>>>16,e[4]=F=65535&x|N<<16,n[4]=Y=65535&T|S<<16,T=65535&(_=G),S=_>>>16,x=65535&(D=L),N=D>>>16,D=e[5],S+=(_=n[5])>>>16,x+=65535&D,N+=D>>>16,N+=(x+=(S+=(T+=65535&_)>>>16)>>>16)>>>16,e[5]=L=65535&x|N<<16,n[5]=G=65535&T|S<<16,T=65535&(_=J),S=_>>>16,x=65535&(D=H),N=D>>>16,D=e[6],S+=(_=n[6])>>>16,x+=65535&D,N+=D>>>16,N+=(x+=(S+=(T+=65535&_)>>>16)>>>16)>>>16,e[6]=H=65535&x|N<<16,n[6]=J=65535&T|S<<16,T=65535&(_=W),S=_>>>16,x=65535&(D=j),N=D>>>16,D=e[7],S+=(_=n[7])>>>16,x+=65535&D,N+=D>>>16,N+=(x+=(S+=(T+=65535&_)>>>16)>>>16)>>>16,e[7]=j=65535&x|N<<16,n[7]=W=65535&T|S<<16,z+=128,r-=128}return r}function Q(e,n,t){var r,o=new Int32Array(8),a=new Int32Array(8),i=new Uint8Array(256),s=t;for(o[0]=1779033703,o[1]=3144134277,o[2]=1013904242,o[3]=2773480762,o[4]=1359893119,o[5]=2600822924,o[6]=528734635,o[7]=1541459225,a[0]=4089235720,a[1]=2227873595,a[2]=4271175723,a[3]=1595750129,a[4]=2917565137,a[5]=725511199,a[6]=4215389547,a[7]=327033209,z(o,a,n,t),t%=128,r=0;r=0;--o)Z(e,n,r=t[o/8|0]>>(7&o)&1),X(n,e),X(e,e),Z(e,n,r)}function ne(e,t){var r=[n(),n(),n(),n()];I(r[0],f),I(r[1],l),I(r[2],i),j(r[3],f,l),ee(e,r,t)}function te(e,r,o){var a,i=new Uint8Array(64),s=[n(),n(),n(),n()];for(o||t(r,32),Q(i,r,32),i[0]&=248,i[31]&=127,i[31]|=64,ne(s,i),$(e,s),a=0;a<32;a++)r[a+32]=e[a];return 0}var re=new Float64Array([237,211,245,92,26,99,18,88,214,156,247,162,222,249,222,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16]);function oe(e,n){var t,r,o,a;for(r=63;r>=32;--r){for(t=0,o=r-32,a=r-12;o>8,n[o]-=256*t;n[o]+=t,n[r]=0}for(t=0,o=0;o<32;o++)n[o]+=t-(n[31]>>4)*re[o],t=n[o]>>8,n[o]&=255;for(o=0;o<32;o++)n[o]-=t*re[o];for(r=0;r<32;r++)n[r+1]+=n[r]>>8,e[r]=255&n[r]}function ae(e){var n,t=new Float64Array(64);for(n=0;n<64;n++)t[n]=e[n];for(n=0;n<64;n++)e[n]=0;oe(e,t)}function ie(e,t,r,o){var a,i,s=new Uint8Array(64),c=new Uint8Array(64),u=new Uint8Array(64),f=new Float64Array(64),l=[n(),n(),n(),n()];Q(s,o,32),s[0]&=248,s[31]&=127,s[31]|=64;var d=r+64;for(a=0;a=0;r--)K(o,o),1!==r&&j(o,o,t);for(r=0;r<16;r++)e[r]=o[r]}(r,r),j(r,r,s),j(r,r,u),j(r,r,u),j(e[0],r,u),K(o,e[0]),j(o,o,u),k(o,s)&&j(e[0],e[0],d),K(o,e[0]),j(o,o,u),k(o,s)?-1:(M(e[0])===t[31]>>7&&H(e[0],a,e[0]),j(e[3],e[0],e[1]),0)}function ce(e,t,r,o){var a,i=new Uint8Array(32),s=new Uint8Array(64),c=[n(),n(),n(),n()],u=[n(),n(),n(),n()];if(r<64)return-1;if(se(u,o))return-1;for(a=0;a=0},e.sign.keyPair=function(){var e=new Uint8Array(le),n=new Uint8Array(de);return te(e,n),{publicKey:e,secretKey:n}},e.sign.keyPair.fromSecretKey=function(e){if(pe(e),e.length!==de)throw new Error("bad secret key size");for(var n=new Uint8Array(le),t=0;t{var n={setCustomize:n=>{e=n.ApiConfig},getWebsocketURL:function(n){var t=e.websocketPath||"/cryptpad_websocket";if(/^ws{1,2}:\/\//.test(t))return t;var r=new URL(n||self?.location?.href);return n&&(r.href=n),r.protocol.replace(/http/,"ws")+"//"+r.host+t}};return n})())}(k)),k.exports}var F,L=M(),H=n({__proto__:null,default:r(L)},[L]),j={exports:{}};function K(){return F||(F=1,function(e){e.exports&&(e.exports=function(e={}){return{setCustomize:n=>{e=n.AppConfig},userHashKey:"User_hash",userNameKey:"User_name",blockHashKey:"Block_hash",fileHashKey:"FS_hash",sessionJWT:"Session_JWT",ssoSeed:"SSO_seed",displayNameKey:"cryptpad.username",oldStorageKey:"CryptPad_RECENTPADS",storageKey:"filesData",tokenKey:"loginToken",prefersDriveRedirectKey:"prefersDriveRedirect",isPremiumKey:"isPremiumUser",displayPadCreationScreen:"displayPadCreationScreen",deprecatedKey:"deprecated",MAX_TEAMS_SLOTS:e.maxTeamsSlots||5,MAX_TEAMS_OWNED:e.maxOwnedTeams||5,MAX_PREMIUM_TEAMS_SLOTS:Math.max(e.maxTeamsSlots||0,e.maxPremiumTeamsSlots||0)||5,MAX_PREMIUM_TEAMS_OWNED:Math.max(e.maxOwnedTeams||0,e.maxPremiumTeamsOwned||0)||5,criticalApps:["profile","settings","debug","admin","support","notifications","calendar","moderation","oldadmin"],earlyAccessApps:[]}}(void 0))}(j)),j.exports}var U,B=K(),V=n({__proto__:null,default:r(B)},[B]),Y={exports:{}},G={exports:{}},J=G.exports;function W(){return U||(U=1,function(e){!function(n){var t={};n.atob=n.atob||function(e){return Buffer.from(e,"base64").toString("binary")},n.btoa=n.btoa||function(e){return Buffer.from(e,"binary").toString("base64")},t.slice=function(e,n,t){return Array.prototype.slice.call(e,n,t)},t.u8ToBase64=(e,n)=>{const t=new FileReader;t.onload=()=>{let e=t.result,r=e.slice(e.indexOf(",")+1);n(r)},t.readAsDataURL(new Blob([e]))},t.shuffleArray=function(e){for(var n=e.length-1;n>0;n--){var t=Math.floor(Math.random()*(n+1)),r=e[n];e[n]=e[t],e[t]=r}},t.bake=function(e,n){return void 0===n&&(n=[]),Array.isArray(n)||(n=[n]),function(){return e.apply(null,n)}},t.both=function(e,n){if("function"!=typeof e)throw new Error("INVALID_USAGE");return"function"!=typeof n&&(n=function(e){return e}),function(){return e.apply(null,arguments),n.apply(null,arguments)}},t.clone=function(e){return null==e?e:JSON.parse(JSON.stringify(e))},t.serializeError=function(e){if(!(e instanceof Error))return e;var n={};return Object.getOwnPropertyNames(e).forEach((function(t){n[t]=e[t]})),n},t.tryParse=function(e){try{return JSON.parse(e)}catch(e){return}},t.mkAsync=function(e,n){if("function"!=typeof e)throw new Error("EXPECTED_FUNCTION");return function(){var t=Array.prototype.slice.call(arguments);setTimeout((function(){e.apply(null,t)}),n)}},t.mkEvent=function(e){var n=[],t=!1;let r;return{reg:function(r){e&&t?setTimeout(r):n.push(r)},unreg:function(e){-1!==n.indexOf(e)?n.splice(n.indexOf(e),1):console.log("event handler was already unregistered")},fire:function(){if(!e||!t){var o=Array.prototype.slice.call(arguments);t||r.apply(null,o),t=!0,n.forEach((function(e){e.apply(null,o)}))}},promise:new Promise((e=>{r=e}))}},t.mkTimeout=function(e,n){n=n||0;var r=t.once(e),o=setTimeout((function(){r("TIMEOUT")}),n);return t.both(r,(function(){clearTimeout(o)}))},t.onClickEnter=function(e,n,t){e.on("click keydown",(function(e){var r="click"===e.type,o="keydown"===e.type&&13===e.which,a="keydown"===e.type&&32===e.which&&t&&t.space;(r||o||a)&&("keydown"===e.type&&e.preventDefault(),n(e))}))},t.response=function(e){var n={},t={};"function"!=typeof e&&(e=function(e){throw new Error(e)});var r=function(e){clearTimeout(t[e]),delete t[e],delete n[e]};return{clear:r,expected:function(e){return Boolean(n[e])},expectation:function(e){return n[e]},expect:function(o,a,i){"string"!=typeof o&&e("EXPECTED_STRING"),"function"!=typeof a&&e("EXPECTED_CALLBACK"),n[o]=a,"number"==typeof i&&i&&(t[o]=setTimeout((function(){"function"==typeof n[o]&&n[o]("TIMEOUT"),r(o)}),i))},handle:function(t,o){var a=n[t];if("function"==typeof a){try{a.apply(null,Array.isArray(o)?o:[o])}catch(n){e("HANDLER_ERROR",{error:n,id:t,args:o})}r(t)}else e("MISSING_CALLBACK",{id:t,args:o})},_pending:n}},t.inc=function(e,n,t){e[n]=(e[n]||0)+("number"==typeof t?t:1)},t.values=function(e){return Object.keys(e).map((function(n){return e[n]}))},t.find=function(e,n){for(var t=n.length,r=0;r&"']/g,(function(e){return{"<":"<",">":">","&":"&",'"':""","'":"'"}[e]})):""},t.hexToBase64=function(e){var t=e.replace(/\r|\n/g,"").replace(/([\da-fA-F]{2}) ?/g,"0x$1 ").replace(/ +$/,"").split(" "),r=String.fromCharCode.apply(null,t);return n.btoa(r).replace(/\//g,"-").replace(/=+$/,"")},t.base64ToHex=function(e){var t=[];return n.atob(e.replace(/-/g,"/")).split("").forEach((function(e){var n=e.charCodeAt(0).toString(16);1===n.length&&(n="0"+n),t.push(n)})),t.join("")},t.uint8ArrayToHex=function(e){for(var n="",t=0;t=o?"GB":e>=r?"MB":"KB"};t.getBlock=function(e,n,r){var o=t.once(t.mkAsync(r)),a={};"string"==typeof n.bearer&&n.bearer&&(a.authorization=`Bearer ${n.bearer}`),fetch(e,{method:"GET",credentials:"include",headers:a}).then((e=>{e.ok?o(void 0,e):401!==e.status&&404!==e.status?o(e.status,e):e.json().then((n=>{o(e.status,n)})).catch((()=>{o(e.status)}))})).catch((e=>{o(e)}))},t.fetchApi=function(e,n,t,r){const o=new URL(e);o.pathname=`api/${n}`;let a=o.href+(t?"?"+ +new Date:"");if("undefined"!=typeof self&&self.crypto)fetch(a).then((e=>{if(!e.ok)throw new Error(`Fetch error: ${e.status}`);return e.text()})).then((e=>{r(JSON.parse(e.slice(27,-5)))})).catch((e=>{console.error(e.message),r({})}));else if(void 0!==b){("http:"===o.protocol?require("node:http"):require("node:https")).get(o.href,(e=>{let n="";e.on("data",(e=>{n+=e})),e.on("end",(()=>{try{r(JSON.parse(n.slice(27,-5)))}catch(e){console.error(e),r({})}}))}))}},t.fetch=function(e,n,r,o){var a,i=t.once(t.mkAsync(n)),s=function(e){var n=e.replace(/(\/)*$/,""),t=n.lastIndexOf("/"),r=n.slice(t+1);return/^[a-f0-9]{48}$/.test(r)||(r=void 0),r}(e),c=function(){(a=new XMLHttpRequest).open("GET",e,!0),r&&a.addEventListener("progress",(function(e){if(e.lengthComputable){var n=e.loaded/e.total;r(n)}}),!1),a.responseType="arraybuffer",a.onerror=function(e){i(e)},a.onload=function(){if(/^4/.test(""+this.status))return i("XHR_ERROR");var e=a.response;if(e){var n=new Uint8Array(e);return s?void function(e,n,t){o&&"function"==typeof o.setBlobCache?o.setBlobCache(e,n,t):t("EINVAL")}(s,n,(function(){i(null,n)})):void i(void 0,n)}i("ENOENT")},a.send(null)};if(s)return function(e,n){o&&"function"==typeof o.getBlobCache?o.getBlobCache(e,n):n("EINVAL")}(s,(function(e,n){!e&&n?i(void 0,n):c()})),{cancel:function(){a&&a.abort&&a.abort()}};c()},t.dataURIToBlob=function(e){for(var n=atob(e.split(",")[1]),t=e.split(",")[0].split(":")[1].split(";")[0],r=new ArrayBuffer(n.length),o=new Uint8Array(r),a=0;aparseInt(e,10).toString(16).padStart(2,"0"))).join("")}`},t.isSmallScreen=function(){return n.innerHeight<800||n.innerWidth<800},t.stripTags=function(e){var n=document.createElement("div");return n.innerHTML=e,n.innerText},t.parseFilename=function(e){if(!e||!e.trim())return{};var n=/^(\.?.+?)(\.[^.]+)?$/.exec(e)||[];return{name:n[1],ext:n[2]}},t.isPlainTextFile=function(e,n){if(e&&0===e.indexOf("text/"))return!0;var r=t.parseFilename(n);return!(e||!n||r.ext)||("application/x-javascript"===e||"application/xml"===e)},t.isSpreadsheet=function(e,n){return e&&("application/vnd.oasis.opendocument.spreadsheet"===e||"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"===e)||n&&(n.endsWith(".xlsx")||n.endsWith(".ods"))},t.isOfficeDoc=function(e,n){return e&&("application/vnd.oasis.opendocument.text"===e||"application/vnd.openxmlformats-officedocument.wordprocessingml.document"===e)||n&&(n.endsWith(".docx")||n.endsWith(".odt"))},t.isPresentation=function(e,n){return e&&("application/vnd.oasis.opendocument.presentation"===e||"application/vnd.openxmlformats-officedocument.presentationml.presentation"===e)||n&&(n.endsWith(".pptx")||n.endsWith(".odp"))},t.isValidURL=function(e){return!!new RegExp("^(https?:\\/\\/)((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?").test(e)};var a=/([\uD800-\uDBFF][\uDC00-\uDFFF])/;t.getFirstCharacter=function(e){if(!e||!e.trim())return"?";var n=function(e){for(var n=e.split(a),t=[],r=0;r{let n=/ver=([0-9.]+)(-[0-9]*)?/.exec(e);return Array.isArray(n)&&n[1]||void 0},t.Saferphore={create:e=>{var n,t=[];return n=function(){if(e<0)throw new Error("(resourceCount < 0) should never happen");var r;0!==e&&0!==t.length&&(e--,t.shift()((r=0,function(t){if(r++)throw new Error("returnAfter() called multiple times");var o=0;return function(){if(o++)throw new Error("returnAfter wrapped callback called multiple times");t&&t.apply(null,arguments),e++,n()}})))},{take:function(e){t.push(e),n()}}}},e.exports?e.exports=t:n.CryptPad_Util=t}("undefined"!=typeof self?self:J)}(G)),G.exports}var q,z,Q={exports:{}};function X(){return q||(q=1,function(e){e.exports&&(e.exports=function(){var e={},n=function(e){return e.replace(/-/g,"/")};return e.parseUser=function(e){var t,r,o,a=function(e){if(/^\[.*?@.*\]$/.test(e)){var t,r=e.slice(1,-1);if(r=r.replace(/\/([a-zA-Z0-9+-]{43}=)$/,(function(e,r){return t=n(r),""})),t){var o=r.lastIndexOf("@");if(!(o<1))return{domain:r.slice(o+1),user:r.slice(0,o),pubkey:t}}}}(e);if(function(e){if(e&&e.domain&&e.user&&e.pubkey)return!0}(a))return a;if(e.replace(/^https*:\/\/([^\/]+)\/user\/#\/1\/([^\/]+)\/([a-zA-Z0-9+-]{43}=)$/,(function(e,a,i,s){return t=a,r=i,o=n(s),""})),!t)throw new Error("Could not parse user id ["+e+"]");return{domain:t,user:r,pubkey:o}},e.serialize=function(e,n,t){return"["+n+"@"+e.replace(/https*:\/\//,"")+"/"+t.replace(/\//g,"-")+"]"},e.canonicalize=function(t){if("string"==typeof t){if(44===t.length)return n(t);try{return e.parseUser(t).pubkey}catch(e){return}}},e}())}(Q)),Q.exports}function Z(){return z||(z=1,function(e){!function(n){e.exports&&(e.exports=function(e,t,r,o){var a=n.CryptPad_Hash={},i=e.uint8ArrayToHex,s=e.hexToBase64,c=e.base64ToHex;a.encodeBase64=o.util.encodeBase64,a.decodeBase64=o.util.decodeBase64,a.hashChannelList=function(e){return o.util.encodeBase64(o.hash(o.util.decodeUTF8(JSON.stringify(e))))},a.generateSignPair=function(){var e=o.sign.keyPair(),n=function(e){return t.b64RemoveSlashes(e).replace(/=+$/g,"")};return{validateKey:a.encodeBase64(e.publicKey),signKey:a.encodeBase64(e.secretKey),safeValidateKey:n(a.encodeBase64(e.publicKey)),safeSignKey:n(a.encodeBase64(e.secretKey))}},a.getSignPublicFromPrivate=function(e){var n=t.b64AddSlashes(e),r=o.util.decodeBase64(n),a=o.sign.keyPair.fromSecretKey(r);return o.util.encodeBase64(a.publicKey)},a.getCurvePublicFromPrivate=function(e){var n=t.b64AddSlashes(e),r=o.util.decodeBase64(n),a=o.box.keyPair.fromSecretKey(r);return o.util.encodeBase64(a.publicKey)};var u=a.getEditHashFromKeys=function(e){var n=e.version,r=e.keys;if(0===n)return e.channel+e.key;if(1===n){if(!r.editKeyStr)return;return"/1/edit/"+s(e.channel)+"/"+t.b64RemoveSlashes(r.editKeyStr)+"/"}if(2===n){if(!r.editKeyStr)return;var o=e.password?"p/":"";return"/2/"+e.type+"/edit/"+t.b64RemoveSlashes(r.editKeyStr)+"/"+o}},f=a.getViewHashFromKeys=function(e){var n=e.version,r=e.keys;if(0!==n){if(1===n){if(!r.viewKeyStr)return;return"/1/view/"+s(e.channel)+"/"+t.b64RemoveSlashes(r.viewKeyStr)+"/"}if(2===n){if(!r.viewKeyStr)return;var o=e.password?"p/":"";return"/2/"+e.type+"/view/"+t.b64RemoveSlashes(r.viewKeyStr)+"/"+o}}};a.getHiddenHashFromKeys=function(e,n,t){t=t||{};var r=n.keys&&n.keys.editKeyStr||n.key,o=!t.view&&r?"edit/":"view/",i=n.password?"p/":"";n.keys&&n.keys.fileKeyStr&&(o="");var s="/3/"+e+"/"+o+n.channel+"/"+i,c=a.parseTypeHash(e,s);return c&&c.getHash?c.getHash(t||{}):s};var l=a.getFileHashFromKeys=function(e){var n=e.version,r=e.keys;if(0!==n){if(1===n)return"/1/"+s(e.channel)+"/"+t.b64RemoveSlashes(r.fileKeyStr)+"/";if(2===n){if(!r.fileKeyStr)return;var o=e.password?"p/":"";return"/2/"+e.type+"/"+t.b64RemoveSlashes(r.fileKeyStr)+"/"+o}}};a.getPublicSigningKeyString=r.serialize,a.ephemeralChannelLength=34,a.createChannelId=function(e){var n=i(t.Nacl.randomBytes(e?17:16));if(-1===[32,34].indexOf(n.length)||/[^a-f0-9]/.test(n))throw new Error("channel ids must consist of 32 hex characters");return n},a.getChannelIdFromKey=function(e){if(e)return i(a.decodeBase64(e).subarray(0,16))},a.getBoxPublicFromSecret=function(e){if(e){var n=a.decodeBase64(e),t=o.box.keyPair.fromSecretKey(n);return a.encodeBase64(t.publicKey)}},a.checkBoxKeyPair=function(e,n){if(!n||!e)return!1;var t=a.decodeBase64(e),r=o.box.keyPair.fromSecretKey(t);return n===a.encodeBase64(r.publicKey)},a.createRandomHash=function(e,n){var r;return"file"===e?(r=t.createFileCryptor2(void 0,n),l({password:Boolean(n),version:2,type:e,keys:r})):(r=t.createEditCryptor2(void 0,void 0,n),u({password:Boolean(n),version:2,type:e,keys:r}))};var d=a.parseTypeHash=function(e,n){if(n){var r,o=[],a={},i=(r=n,r.replace(/\/+/g,"/")).split("/"),s=function(){a.password=-1!==o.indexOf("p"),a.present=-1!==o.indexOf("present"),a.embed=-1!==o.indexOf("embed"),a.versionHash=function(e){var n;return e.some((function(e){if(/^hash=/.test(e))return n=e.slice(5),!0})),n?t.b64AddSlashes(n):""}(o),a.auditorKey=function(e){var n;return e.some((function(e){if(/^auditor=/.test(e))return n=e.slice(8),!0})),n?t.b64AddSlashes(n):""}(o),a.newPadOpts=function(e){var n;return e.some((function(e){if(/^newpad=/.test(e))return n=e.slice(7),!0})),n||""}(o),a.loginOpts=function(e){var n;return e.some((function(e){if(/^login=/.test(e))return n=e.slice(6),!0})),n||""}(o),a.ownerKey=function(e){var n;return e.some((function(e){if(86===e.length)return n=e,!0})),n}(o)};return i[1]&&"4"===i[1]?(a.getHash=function(n){if(!n||!Object.keys(n).length)return"";var t="/4/"+e+"/";return n.newPadOpts&&(t+="newpad="+n.newPadOpts+"/"),n.loginOpts&&(t+="login="+n.loginOpts+"/"),t},a.getOptions=function(){var e={};return a.newPadOpts&&(e.newPadOpts=a.newPadOpts),a.loginOpts&&(e.loginOpts=a.loginOpts),e},a.version=4,a.app=i[2],o=i.slice(3),s(),a):-1===["media","file","user","invite"].indexOf(e)?(a.type="pad",a.getHash=function(){return n},a.getOptions=function(){return{embed:a.embed,present:a.present,ownerKey:a.ownerKey,versionHash:a.versionHash,auditorKey:a.auditorKey,newPadOpts:a.newPadOpts,loginOpts:a.loginOpts,password:a.password}},"/"!==n.slice(0,1)&&n.length>=56?(a.channel=n.slice(0,32),a.key=n.slice(32,56),a.version=0,a):(a.getHash=function(e){var n=i.slice(0,5).join("/")+"/",r=void 0!==e.ownerKey?e.ownerKey:a.ownerKey;r&&(n+=r+"/"),(a.password||e.password)&&(n+="p/"),e.embed&&(n+="embed/"),e.present&&(n+="present/");var o=void 0!==e.versionHash?e.versionHash:a.versionHash;o&&(n+="hash="+t.b64RemoveSlashes(o)+"/");var s=void 0!==e.auditorKey?e.auditorKey:a.auditorKey;return s&&(n+="auditor="+t.b64RemoveSlashes(s)+"/"),e.newPadOpts&&(n+="newpad="+e.newPadOpts+"/"),e.loginOpts&&(n+="login="+e.loginOpts+"/"),n},i[1]&&"1"===i[1]?(a.version=1,a.mode=i[2],a.channel=i[3],a.key=t.b64AddSlashes(i[4]),o=i.slice(5),s(),a):i[1]&&"2"===i[1]?(a.version=2,a.app=i[2],a.mode=i[3],a.key=i[4],o=i.slice(5),s(),a):i[1]&&"3"===i[1]?(a.version=3,a.app=i[2],a.mode=i[3],a.channel=i[4],o=i.slice(5),s(),a):a)):(a.getHash=function(){return i.join("/")},-1!==["media","file"].indexOf(e)?(a.type="file",a.getOptions=function(){return{embed:a.embed,present:a.present,ownerKey:a.ownerKey,newPadOpts:a.newPadOpts,loginOpts:a.loginOpts,password:a.password}},a.getHash=function(e){var n=i.slice(0,4).join("/")+"/",t=void 0!==e.ownerKey?e.ownerKey:a.ownerKey;return t&&(n+=t+"/"),(a.password||e.password)&&(n+="p/"),e.embed&&(n+="embed/"),e.present&&(n+="present/"),e.newPadOpts&&(n+="newpad="+e.newPadOpts+"/"),e.loginOpts&&(n+="login="+e.loginOpts+"/"),n},i[1]&&"1"===i[1]?(a.version=1,a.channel=i[2].replace(/-/g,"/"),a.key=i[3].replace(/-/g,"/"),o=i.slice(4),s(),a):i[1]&&"2"===i[1]?(a.version=2,a.app=i[2],a.key=i[3],o=i.slice(4),s(),a):i[1]&&"3"===i[1]?(a.version=3,a.app=i[2],a.channel=i[3],o=i.slice(4),s(),a):a):-1!==["user"].indexOf(e)?(a.type="user",i[1]&&"1"===i[1]?(a.version=1,a.user=i[2],a.pubkey=i[3].replace(/-/g,"/"),a):a):-1!==["invite"].indexOf(e)?(a.type="invite",i[1]&&"2"===i[1]?(a.version=2,a.app=i[2],a.mode=i[3],a.key=i[4],o=i.slice(5),a.password=-1!==o.indexOf("p"),a):a):void 0)}},h=a.parsePadUrl=function(e){var n,t={};return e?("/"!==e.slice(-1)&&"#"!==e.slice(-1)&&(e+="/"),e=e.replace(/\/\?[^#]+#/,"/#"),t.getUrl=function(e){e=e||{};var n="/";return t.type?(n+=t.type+"/",!t.hashData&&e&&Object.keys(e).length?n+"#"+function(e){if(!e||!Object.keys(e).length)return"";var n="/4/"+t.type+"/";return e.newPadOpts&&(n+="newpad="+e.newPadOpts+"/"),e.loginOpts&&(n+="login="+e.loginOpts+"/"),n}(e):t.hashData?n+="#"+t.hashData.getHash(e):n):n},t.getOptions=function(){return t.hashData&&t.hashData.getOptions?t.hashData.getOptions():{}},/^https*:\/\//.test(e)?(e.replace(/^https*:\/\/([^\/]*)\/(.*?)\//i,(function(e,n,r){return t.domain=n,t.type=r,""})),-1===(n=e.indexOf("/#"))||(t.hash=e.slice(n+2),t.hashData=d(t.type,t.hash)),t):/^\/($|[^\/])/.test(e)?(n=e.indexOf("/#"),t.type=e.slice(1,n),-1===n||(t.hash=e.slice(n+2),t.hashData=d(t.type,t.hash)),t):t):t};return a.hashToHref=function(e,n){return"/"+n+"/#"+e},a.hrefToHash=function(e){return a.parsePadUrl(e).hash},a.getRelativeHref=function(e){if(e&&-1!==e.indexOf("#")){var n=h(e);return"/"+n.type+"/#"+n.hash}},a.getSecrets=function(e,n,r){var a,i,s={},u=function(){s.keys=t.createEditCryptor2(void 0,void 0,r),s.channel=c(s.keys.chanId),s.version=2,s.type=e};if(!n)return u(),s;if(n){if(!e)throw new Error("getSecrets with a hash requires a type parameter");a=d(e,n),i=n}if(0===i.length)return u(),s;if(0===a.version)s.channel=a.channel,s.key=a.key,s.version=0;else if(1===a.version){if(s.version=1,"pad"===a.type){if(s.channel=c(a.channel),"edit"===a.mode){if(s.keys=t.createEditCryptor(a.key),s.key=s.keys.editKeyStr,32!==s.channel.length||24!==s.key.length)throw new Error("The channel key and/or the encryption key is invalid")}else if("view"===a.mode&&(s.keys=t.createViewCryptor(a.key),32!==s.channel.length))throw new Error("The channel key is invalid")}else if("file"===a.type)s.channel=c(a.channel),s.keys={fileKeyStr:a.key,cryptKey:o.util.decodeBase64(a.key)};else if("user"===a.type)throw new Error("User hashes can't be opened (yet)")}else if(2===a.version)if(s.version=2,s.type=e,s.password=r,"pad"===a.type){if("edit"===a.mode){if(s.keys=t.createEditCryptor2(a.key,void 0,r),s.channel=c(s.keys.chanId),s.key=s.keys.editKeyStr,32!==s.channel.length||24!==s.key.length)throw new Error("The channel key and/or the encryption key is invalid")}else if("view"===a.mode&&(s.keys=t.createViewCryptor2(a.key,r),s.channel=c(s.keys.chanId),32!==s.channel.length))throw new Error("The channel key is invalid")}else if("file"===a.type){if(s.keys=t.createFileCryptor2(a.key,r),s.channel=c(s.keys.chanId),s.key=s.keys.fileKeyStr,48!==s.channel.length||24!==s.key.length)throw new Error("The channel key and/or the encryption key is invalid")}else if("user"===a.type)throw new Error("User hashes can't be opened (yet)");return s},a.getHashes=function(e){var n={};return(e=JSON.parse(JSON.stringify(e))).keys||e.key?(e.keys||(e.keys={}),(e.keys.editKeyStr||0===e.version&&e.key)&&(n.editHash=u(e)),e.keys.viewKeyStr&&(n.viewHash=f(e)),e.keys.fileKeyStr&&(n.fileHash=l(e)),n):n},a.getFormData=function(e,n,t){var r=(e=e||a.getSecrets("form",n,t))&&e.keys,i=r&&r.secondaryKey;if(i){var s=o.box.keyPair.fromSecretKey(o.util.decodeUTF8(i).slice(0,32)),c={};c.form_public=o.util.encodeBase64(s.publicKey);var u=c.form_private=o.util.encodeBase64(s.secretKey),f=a.getViewHashFromKeys({version:1,channel:e.channel,keys:{viewKeyStr:o.util.encodeBase64(r.cryptKey)}}),l=a.parseTypeHash("pad",f);return c.form_auditorHash=l.getHash({auditorKey:u}),c}},a.hrefToHexChannelId=function(e,n){var t=a.parsePadUrl(e);if(t&&t.hash)return a.getSecrets(t.type,t.hash,n).channel},a.getBlobPathFromHex=function(e){return"/blob/"+e.slice(0,2)+"/"+e},a.serializeHash=function(e){return e&&"/"!==e.slice(-1)&&(e+="/"),e},a.createInviteUrl=function(e,t){return t=t||a.createChannelId(),n.location.origin+"/invite/#/1/"+t+"/"+e.replace(/\//g,"-")+"/"},a.isValidChannel=function(e){return/^[a-zA-Z0-9]{32,48}$/.test(e)},a.isValidHref=function(e){if(e){var n=a.parsePadUrl(e);if(n&&n.type){if(n.hash){if(!n.hashData)return;if(void 0===n.hashData.version)return;if("pad"===n.hashData.type||"file"===n.hashData.type){if(!n.hashData.key&&!n.hashData.channel)return;if(n.hashData.key&&!/^[a-zA-Z0-9+-/=]+$/.test(n.hashData.key))return}}return n}}},a.decodeDataOptions=function(n){var t=decodeURIComponent(n),r=o.util.encodeUTF8(o.util.decodeBase64(t));return e.tryParse(r)||{}},a.encodeDataOptions=function(e){var n=JSON.stringify(e),t=o.util.encodeBase64(o.util.decodeUTF8(n));return encodeURIComponent(t)},a.getNewPadURL=function(e,n){var t=a.parsePadUrl(e),r=t.getOptions();return r.newPadOpts=a.encodeDataOptions(n),t.getUrl(r)},a.getLoginURL=function(e,n){var t=a.parsePadUrl(e),r=t.getOptions();return r.loginOpts=a.encodeDataOptions(n),t.getUrl(r)},a}(W(),C(),X(),I()))}("undefined"!=typeof window?window:{})}(Y)),Y.exports}var $,ee,ne=Z(),te=W(),re={exports:{}},oe={exports:{}};function ae(){return $||($=1,function(e){e.exports=function e(n,t,r){function o(i,s){if(!t[i]){if(!n[i]){if(!s&&b)return b(i);if(a)return a(i,!0);var c=new Error("Cannot find module '"+i+"'");throw c.code="MODULE_NOT_FOUND",c}var u=t[i]={exports:{}};n[i][0].call(u.exports,(function(e){var t=n[i][1][e];return o(t||e)}),u,u.exports,e,n,t,r)}return t[i].exports}for(var a=b,i=0;i=43)}})).catch((function(){return!1}))}function A(e){return"boolean"==typeof v?u.resolve(v):O(e).then((function(e){return v=e}))}function w(e){var n=y[e.name],t={};t.promise=new u((function(e,n){t.resolve=e,t.reject=n})),n.deferredOperations.push(t),n.dbReady?n.dbReady=n.dbReady.then((function(){return t.promise})):n.dbReady=t.promise}function D(e){var n=y[e.name].deferredOperations.pop();if(n)return n.resolve(),n.promise}function _(e,n){var t=y[e.name].deferredOperations.pop();if(t)return t.reject(n),t.promise}function T(e,n){return new u((function(t,r){if(y[e.name]=y[e.name]||F(),e.db){if(!n)return t(e.db);w(e),e.db.close()}var o=[e.name];n&&o.push(e.version);var a=i.open.apply(i,o);n&&(a.onupgradeneeded=function(n){var t=a.result;try{t.createObjectStore(e.storeName),n.oldVersion<=1&&t.createObjectStore(p)}catch(t){if("ConstraintError"!==t.name)throw t;console.warn('The database "'+e.name+'" has been upgraded from version '+n.oldVersion+" to version "+n.newVersion+', but the storage "'+e.storeName+'" already exists.')}}),a.onerror=function(e){e.preventDefault(),r(a.error)},a.onsuccess=function(){var n=a.result;n.onversionchange=function(e){e.target.close()},t(n),D(e)}}))}function S(e){return T(e,!1)}function x(e){return T(e,!0)}function N(e,n){if(!e.db)return!0;var t=!e.db.objectStoreNames.contains(e.storeName),r=e.versione.db.version;if(r&&(e.version!==n&&console.warn('The database "'+e.name+"\" can't be downgraded from version "+e.db.version+" to version "+e.version+"."),e.version=e.db.version),o||t){if(t){var a=e.db.version+1;a>e.version&&(e.version=a)}return!0}return!1}function I(e){return new u((function(n,t){var r=new FileReader;r.onerror=t,r.onloadend=function(t){var r=btoa(t.target.result||"");n({__local_forage_encoded_blob:!0,data:r,type:e.type})},r.readAsBinaryString(e)}))}function C(e){return c([b(atob(e.data))],{type:e.type})}function R(e){return e&&e.__local_forage_encoded_blob}function P(e){var n=this,t=n._initReady().then((function(){var e=y[n._dbInfo.name];if(e&&e.dbReady)return e.dbReady}));return l(t,e,e),t}function k(e){w(e);for(var n=y[e.name],t=n.forages,r=0;r0&&(!e.db||"InvalidStateError"===o.name||"NotFoundError"===o.name))return u.resolve().then((function(){if(!e.db||"NotFoundError"===o.name&&!e.db.objectStoreNames.contains(e.storeName)&&e.version<=e.db.version)return e.db&&(e.version=e.db.version+1),x(e)})).then((function(){return k(e).then((function(){M(e,n,t,r-1)}))})).catch(t);t(o)}}function F(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function L(e){var n=this,t={db:null};if(e)for(var r in e)t[r]=e[r];var o=y[t.name];o||(o=F(),y[t.name]=o),o.forages.push(n),n._initReady||(n._initReady=n.ready,n.ready=P);var a=[];function i(){return u.resolve()}for(var s=0;s>4,f[c++]=(15&r)<<4|o>>2,f[c++]=(3&o)<<6|63&a;return u}function pe(e){var n,t=new Uint8Array(e),r="";for(n=0;n>2],r+=z[(3&t[n])<<4|t[n+1]>>4],r+=z[(15&t[n+1])<<2|t[n+2]>>6],r+=z[63&t[n+2]];return t.length%3==2?r=r.substring(0,r.length-1)+"=":t.length%3==1&&(r=r.substring(0,r.length-2)+"=="),r}function ve(e,n){var t="";if(e&&(t=de.call(e)),e&&("[object ArrayBuffer]"===t||e.buffer&&"[object ArrayBuffer]"===de.call(e.buffer))){var r,o=Z;e instanceof ArrayBuffer?(r=e,o+=ee):(r=e.buffer,"[object Int8Array]"===t?o+=te:"[object Uint8Array]"===t?o+=re:"[object Uint8ClampedArray]"===t?o+=oe:"[object Int16Array]"===t?o+=ae:"[object Uint16Array]"===t?o+=se:"[object Int32Array]"===t?o+=ie:"[object Uint32Array]"===t?o+=ce:"[object Float32Array]"===t?o+=ue:"[object Float64Array]"===t?o+=fe:n(new Error("Failed to get type for BinaryArray"))),n(o+pe(r))}else if("[object Blob]"===t){var a=new FileReader;a.onload=function(){var t=Q+e.type+"~"+pe(this.result);n(Z+ne+t)},a.readAsArrayBuffer(e)}else try{n(JSON.stringify(e))}catch(t){console.error("Couldn't convert value into a JSON string: ",e),n(null,t)}}function ye(e){if(e.substring(0,$)!==Z)return JSON.parse(e);var n,t=e.substring(le),r=e.substring($,le);if(r===ne&&X.test(t)){var o=t.match(X);n=o[1],t=t.substring(o[0].length)}var a=he(t);switch(r){case ee:return a;case ne:return c([a],{type:n});case te:return new Int8Array(a);case re:return new Uint8Array(a);case oe:return new Uint8ClampedArray(a);case ae:return new Int16Array(a);case se:return new Uint16Array(a);case ie:return new Int32Array(a);case ce:return new Uint32Array(a);case ue:return new Float32Array(a);case fe:return new Float64Array(a);default:throw new Error("Unkown type: "+r)}}var me={serialize:ve,deserialize:ye,stringToBuffer:he,bufferToString:pe};function ge(e,n,t,r){e.executeSql("CREATE TABLE IF NOT EXISTS "+n.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],t,r)}function Ee(e){var n=this,t={db:null};if(e)for(var r in e)t[r]="string"!=typeof e[r]?e[r].toString():e[r];var o=new u((function(e,r){try{t.db=openDatabase(t.name,String(t.version),t.description,t.size)}catch(e){return r(e)}t.db.transaction((function(o){ge(o,t,(function(){n._dbInfo=t,e()}),(function(e,n){r(n)}))}),r)}));return t.serializer=me,o}function be(e,n,t,r,o,a){e.executeSql(t,r,o,(function(e,i){i.code===i.SYNTAX_ERR?e.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[n.storeName],(function(e,s){s.rows.length?a(e,i):ge(e,n,(function(){e.executeSql(t,r,o,a)}),a)}),a):a(e,i)}),a)}function Oe(e,n){var t=this;e=d(e);var r=new u((function(n,r){t.ready().then((function(){var o=t._dbInfo;o.db.transaction((function(t){be(t,o,"SELECT * FROM "+o.storeName+" WHERE key = ? LIMIT 1",[e],(function(e,t){var r=t.rows.length?t.rows.item(0).value:null;r&&(r=o.serializer.deserialize(r)),n(r)}),(function(e,n){r(n)}))}))})).catch(r)}));return f(r,n),r}function Ae(e,n){var t=this,r=new u((function(n,r){t.ready().then((function(){var o=t._dbInfo;o.db.transaction((function(t){be(t,o,"SELECT * FROM "+o.storeName,[],(function(t,r){for(var a=r.rows,i=a.length,s=0;s0)return void a(we.apply(o,[e,s,t,r-1]));i(n)}}))}))})).catch(i)}));return f(a,t),a}function De(e,n,t){return we.apply(this,[e,n,t,1])}function _e(e,n){var t=this;e=d(e);var r=new u((function(n,r){t.ready().then((function(){var o=t._dbInfo;o.db.transaction((function(t){be(t,o,"DELETE FROM "+o.storeName+" WHERE key = ?",[e],(function(){n()}),(function(e,n){r(n)}))}))})).catch(r)}));return f(r,n),r}function Te(e){var n=this,t=new u((function(e,t){n.ready().then((function(){var r=n._dbInfo;r.db.transaction((function(n){be(n,r,"DELETE FROM "+r.storeName,[],(function(){e()}),(function(e,n){t(n)}))}))})).catch(t)}));return f(t,e),t}function Se(e){var n=this,t=new u((function(e,t){n.ready().then((function(){var r=n._dbInfo;r.db.transaction((function(n){be(n,r,"SELECT COUNT(key) as c FROM "+r.storeName,[],(function(n,t){var r=t.rows.item(0).c;e(r)}),(function(e,n){t(n)}))}))})).catch(t)}));return f(t,e),t}function xe(e,n){var t=this,r=new u((function(n,r){t.ready().then((function(){var o=t._dbInfo;o.db.transaction((function(t){be(t,o,"SELECT key FROM "+o.storeName+" WHERE id = ? LIMIT 1",[e+1],(function(e,t){var r=t.rows.length?t.rows.item(0).key:null;n(r)}),(function(e,n){r(n)}))}))})).catch(r)}));return f(r,n),r}function Ne(e){var n=this,t=new u((function(e,t){n.ready().then((function(){var r=n._dbInfo;r.db.transaction((function(n){be(n,r,"SELECT key FROM "+r.storeName,[],(function(n,t){for(var r=[],o=0;o '__WebKitDatabaseInfoTable__'",[],(function(t,r){for(var o=[],a=0;a0}function Le(e){var n=this,t={};if(e)for(var r in e)t[r]=e[r];return t.keyPrefix=ke(e,n._defaultConfig),Fe()?(n._dbInfo=t,t.serializer=me,u.resolve()):u.reject()}function He(e){var n=this,t=n.ready().then((function(){for(var e=n._dbInfo.keyPrefix,t=localStorage.length-1;t>=0;t--){var r=localStorage.key(t);0===r.indexOf(e)&&localStorage.removeItem(r)}}));return f(t,e),t}function je(e,n){var t=this;e=d(e);var r=t.ready().then((function(){var n=t._dbInfo,r=localStorage.getItem(n.keyPrefix+e);return r&&(r=n.serializer.deserialize(r)),r}));return f(r,n),r}function Ke(e,n){var t=this,r=t.ready().then((function(){for(var n=t._dbInfo,r=n.keyPrefix,o=r.length,a=localStorage.length,i=1,s=0;s=0;n--){var t=localStorage.key(n);0===t.indexOf(e)&&localStorage.removeItem(t)}})):u.reject("Invalid arguments"),f(r,n),r}var We={_driver:"localStorageWrapper",_initStorage:Le,_support:Pe(),iterate:Ke,getItem:je,setItem:Ge,removeItem:Ye,clear:He,length:Ve,key:Ue,keys:Be,dropInstance:Je},qe=function(e,n){return e===n||"number"==typeof e&&"number"==typeof n&&isNaN(e)&&isNaN(n)},ze=function(e,n){for(var t=e.length,r=0;r{const n=(e,n)=>{let t=globalThis,r=globalThis;var o=t.CryptPad_Cache={},a=e.mkEvent(!0),i=!1,s=!1,c=!1;try{var u=t.indexedDB.open("test_db",1);u.onsuccess=function(){i=(c=!0)&&!s,a.fire()},u.onerror=function(){a.fire()}}catch(e){a.fire()}o.enable=function(){s=!1,i=c&&!s},o.disable=function(){s=!0,i=c&&!s},o.isEnabled=()=>i;var f=n.createInstance({driver:n.INDEXEDDB,name:"cp_cache"});o.getBlobCache=function(n,t){t=e.once(e.mkAsync(t||function(){})),a.reg((function(){i?f.getItem(n,(function(r,o){!r&&o&&o.c?(t(null,o.c),o.t=+new Date,f.setItem(n,o,(function(e){e&&console.error(e)}))):t(e.serializeError(r||"EINVAL"))})):t("NOCACHE")}))},o.setBlobCache=function(n,t,r){r=e.once(e.mkAsync(r||function(){})),a.reg((function(){i?t?f.setItem(n,{c:t,t:+new Date},(function(n){r(e.serializeError(n))})):r("EINVAL"):r("NOCACHE")}))},o.getChannelCache=function(n,t){t=e.once(e.mkAsync(t||function(){})),a.reg((function(){i?f.getItem(n,(function(r,o){!r&&o&&Array.isArray(o.c)?(t(null,o),o.t=+new Date,f.setItem(n,o,(function(e){e&&console.error(e)}))):t(e.serializeError(r||"EINVAL"))})):t("NOCACHE")}))};var l={};return o.storeCache=function(n,t,r,o){o=e.once(e.mkAsync(o||function(){})),a.reg((function(){l[n]=l[n]||e.throttle((function(t,r,o){var a,s;i?Array.isArray(r)&&t?(a=r,Array.isArray(a)&&(a.length>100&&a.splice(0,a.length-100),a.some((function(e,n){if(e.isCheckpoint)return s=n,!0})),a.splice(0,s)),f.setItem(n,{k:t,c:r,t:+new Date},(function(n){n&&o(e.serializeError(n))}))):o("EINVAL"):o("NOCACHE")}),50),l[n](t,r,o)}))},o.leaveChannel=function(e){delete l[e]},o.clearChannel=function(n,t){t=e.once(e.mkAsync(t||function(){})),a.reg((function(){i?f.removeItem(n,(function(){t()})):t("NOCACHE")}))},o.clear=function(n){n=e.once(e.mkAsync(n||function(){})),a.reg((function(){i?f.clear(n):n("NOCACHE")}))},o.getKeys=function(n){n=e.once(e.mkAsync(n||function(){})),a.reg((function(){i?f.keys().then((function(e){n(null,e)})).catch((function(e){n(e)})):n("NOCACHE")}))},o.getTime=function(n,t){t=e.once(e.mkAsync(t||function(){})),a.reg((function(){i?f.getItem(n,(function(n,r){!n&&r&&r.c?t(null,r.t):t(e.serializeError(n||"EINVAL"))})):t("NOCACHE")}))},r.CryptPad_clearIndexedDB=o.clear,o};e.exports&&(e.exports=n(W(),ae()))})()}(re)),re.exports}var se=ie(),ce=n({__proto__:null,default:r(se)},[se]);const ue=te.mkEvent(!0),fe=te.mkEvent(!0),le=te.mkEvent(),de=te.mkEvent();let he={};const pe={setCustomize:e=>{he=e.ApiConfig},init:e=>{var n,t;const{broadcast:r,userHash:o,anonHash:a}=e,i=o||a||ne.createRandomHash("drive"),s=e.store,c=ne.getSecrets("drive",i),u={data:{},websocketURL:L.getWebsocketURL(),network:null===(n=e.store)||void 0===n?void 0:n.network,channel:c.channel,readOnly:!1,validateKey:(null===(t=c.keys)||void 0===t?void 0:t.validateKey)||void 0,crypto:P.createEncryptor(c.keys),Cache:ce,userName:"fs",logLevel:1,ChainPad:S,updateProgress:function(e){e.type="drive",r([],"LOADING_DRIVE",e)},classic:!0},f=globalThis.CP_account_rt=E.create(u);s.driveSecret=c,s.proxy=f.proxy,s.onRpcReadyEvt=te.mkEvent(!0),s.loggedIn=void 0!==e.userHash;const l={loggedIn:s.loggedIn};return f.proxy.on("create",(function(e){s.realtime=e.realtime,s.network=e.network,s.loggedIn||(l.anonHash=ne.getEditHashFromKeys(c))})).on("cacheready",(function(n){if(s.realtime=n.realtime,s.offline=!0,s.networkPromise=n.networkPromise,s.cacheReturned=l,s.networkPromise&&s.networkPromise.then){const e=setTimeout((function(){s.networkTimeout=!0,r([],"LOADING_DRIVE",{type:"offline"})}),5e3);s.networkPromise.then((function(n){s.network||(s.network=n),clearTimeout(e)}),(function(n){console.error(n),clearTimeout(e)}))}e.cache&&(l.edPublic=f.proxy.edPublic,ue.fire(l))})).on("ready",(function(n){delete s.networkTimeout,s.ready||(s.driveMetadata=n.metadata,f.proxy.drive||(f.proxy.drive={}),!f.proxy[B.displayNameKey]&&s.noDriveName&&(f.proxy[B.displayNameKey]=s.noDriveName),!f.proxy.uid&&s.noDriveUid&&(f.proxy.uid=s.noDriveUid),!f.proxy.form_seed&&e.form_seed&&(f.proxy.form_seed=e.form_seed),f.proxy.edPublic&&Array.isArray(he.adminKeys)&&-1!==he.adminKeys.indexOf(f.proxy.edPublic)&&(s.isAdmin=!0),l.edPublic=f.proxy.edPublic,fe.fire(l))})).on("error",(function(e){"EDELETED"===e.error&&(s.ownDeletion||(s.isDeleted=!0,r([],"DRIVE_DELETED",e.message)))})).on("disconnect",(function(){s.offline=!0,le.fire(),r([],"UPDATE_METADATA")})).on("reconnect",(function(){s.offline=!1,de.fire(),r([],"UPDATE_METADATA")})),{channel:c.channel,onAccountCacheReady:ue.reg,onAccountReady:fe.reg,onDisconnect:le.reg,onReconnect:de.reg}}};var ve,ye=Object.freeze({__proto__:null,Account:pe}),me={exports:{}};function ge(){return ve||(ve=1,function(e){(()=>{const n=(e={},n={})=>{var t={setCustomize:t=>{n=t.Messages,e=t.AppConfig},init:function(e){t.state=e}};return t.send=function(n,r,o){("function"!=typeof o&&(o=function(){}),e.disableFeedback)?o():n&&(!0===r||t.state)?function(e,n){var t=new XMLHttpRequest;t.open("HEAD",e),t.onreadystatechange=function(){this.readyState===this.DONE&&n&&n()},t.send()}("/common/feedback.html?"+n+"="+Math.random().toString(16).replace(/0./,""),o):o()},t.reportAppUsage=function(){var e=window.location.pathname.split("/").filter((function(e){return e})).join(".");/^#\/1\/view\//.test(window.location.hash)?t.send(e+"_VIEW"):t.send(e)},t.reportScreenDimensions=function(){var e=window.innerHeight,n=window.innerWidth;t.send("DIMENSIONS:"+e+"x"+n)},t.reportLanguage=function(){n&&t.send("LANG_"+n._languageUsed)},t};e.exports&&(e.exports=n(void 0,void 0))})()}(me)),me.exports}var Ee,be,Oe=ge(),Ae=n({__proto__:null,default:r(Oe)},[Oe]),we={exports:{}},De={exports:{}};function _e(){return be||(be=1,function(e){e.exports&&(e.exports=function(e={},n){var t={setCustomize:n=>{e=n.AppConfig}};t.MINIMUM_PASSWORD_LENGTH="number"==typeof e.minimumPasswordLength?e.minimumPasswordLength:8,t.MINIMUM_NAME_LENGTH=1,t.MAXIMUM_NAME_LENGTH=64,t.isEmail=function(e){return/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(String(e).toLowerCase())},t.isLongEnoughPassword=function(e){return e.length>=t.MINIMUM_PASSWORD_LENGTH};var r=t.isString=function(e){return"string"==typeof e};return t.isValidUsername=function(e){return!!(r(e)&&e.length>=t.MINIMUM_NAME_LENGTH)},t.isValidPassword=function(e){return!(!e||!r(e))},t.passwordsMatch=function(e,n){return r(e)&&r(n)&&e===n},t.customSalt=function(){return"string"==typeof e.loginSalt?e.loginSalt:""},t.deriveFromPassphrase=function(e,r,o,a){n(r,e+t.customSalt(),8,1024,o||128,200,a,void 0)},t.dispenser=function(e){var n={used:0};return function(t){if(n.used+t>e.length)throw new Error("exceeded available entropy");if("number"!=typeof t)throw new Error("expected a number");if(t<=0)throw new Error("expected to consume a positive number of bytes");var r;return r=e.slice?e.slice(n.used,n.used+t):e.subarray(n.used,n.used+t),n.used+=t,r}},t}(void 0,(Ee||(Ee=1,function(e){e.exports=function(e,n,t,r,o,a,i,s){function c(e){var n=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],t=1779033703,r=3144134277,o=1013904242,a=2773480762,i=1359893119,s=2600822924,c=528734635,u=1541459225,f=new Array(64);function l(e){for(var l=0,d=e.length;d>=64;){var h,p,v,y,m,g=t,E=r,b=o,O=a,A=i,w=s,D=c,_=u;for(p=0;p<16;p++)v=l+4*p,f[p]=(255&e[v])<<24|(255&e[v+1])<<16|(255&e[v+2])<<8|255&e[v+3];for(p=16;p<64;p++)y=((h=f[p-2])>>>17|h<<15)^(h>>>19|h<<13)^h>>>10,m=((h=f[p-15])>>>7|h<<25)^(h>>>18|h<<14)^h>>>3,f[p]=(y+f[p-7]|0)+(m+f[p-16]|0)|0;for(p=0;p<64;p++)y=(((A>>>6|A<<26)^(A>>>11|A<<21)^(A>>>25|A<<7))+(A&w^~A&D)|0)+(_+(n[p]+f[p]|0)|0)|0,m=((g>>>2|g<<30)^(g>>>13|g<<19)^(g>>>22|g<<10))+(g&E^g&b^E&b)|0,_=D,D=w,w=A,A=O+y|0,O=b,b=E,E=g,g=y+m|0;t=t+g|0,r=r+E|0,o=o+b|0,a=a+O|0,i=i+A|0,s=s+w|0,c=c+D|0,u=u+_|0,l+=64,d-=64}}l(e);var d,h=e.length%64,p=e.length/536870912|0,v=e.length<<3,y=h<56?56:120,m=e.slice(e.length-h,e.length);for(m.push(128),d=h+1;d>>24&255),m.push(p>>>16&255),m.push(p>>>8&255),m.push(p>>>0&255),m.push(v>>>24&255),m.push(v>>>16&255),m.push(v>>>8&255),m.push(v>>>0&255),l(m),[t>>>24&255,t>>>16&255,t>>>8&255,t>>>0&255,r>>>24&255,r>>>16&255,r>>>8&255,r>>>0&255,o>>>24&255,o>>>16&255,o>>>8&255,o>>>0&255,a>>>24&255,a>>>16&255,a>>>8&255,a>>>0&255,i>>>24&255,i>>>16&255,i>>>8&255,i>>>0&255,s>>>24&255,s>>>16&255,s>>>8&255,s>>>0&255,c>>>24&255,c>>>16&255,c>>>8&255,c>>>0&255,u>>>24&255,u>>>16&255,u>>>8&255,u>>>0&255]}function u(e,n,t){e=e.length<=64?e:c(e);var r,o=64+n.length+4,a=new Array(o),i=new Array(64),s=[];for(r=0;r<64;r++)a[r]=54;for(r=0;r=o-4;e--){if(a[e]++,a[e]<=255)return;a[e]=0}}for(;t>=32;)u(),s=s.concat(c(i.concat(c(a)))),t-=32;return t>0&&(u(),s=s.concat(c(i.concat(c(a))).slice(0,t))),s}function f(e,n,t,r){var o,a,i=e[0]^n[t++],s=e[1]^n[t++],c=e[2]^n[t++],u=e[3]^n[t++],f=e[4]^n[t++],l=e[5]^n[t++],d=e[6]^n[t++],h=e[7]^n[t++],p=e[8]^n[t++],v=e[9]^n[t++],y=e[10]^n[t++],m=e[11]^n[t++],g=e[12]^n[t++],E=e[13]^n[t++],b=e[14]^n[t++],O=e[15]^n[t++],A=i,w=s,D=c,_=u,T=f,S=l,x=d,N=h,I=p,C=v,R=y,P=m,k=g,M=E,F=b,L=O;for(a=0;a<8;a+=2)A^=(o=(k^=(o=(I^=(o=(T^=(o=A+k)<<7|o>>>25)+A)<<9|o>>>23)+T)<<13|o>>>19)+I)<<18|o>>>14,S^=(o=(w^=(o=(M^=(o=(C^=(o=S+w)<<7|o>>>25)+S)<<9|o>>>23)+C)<<13|o>>>19)+M)<<18|o>>>14,R^=(o=(x^=(o=(D^=(o=(F^=(o=R+x)<<7|o>>>25)+R)<<9|o>>>23)+F)<<13|o>>>19)+D)<<18|o>>>14,L^=(o=(P^=(o=(N^=(o=(_^=(o=L+P)<<7|o>>>25)+L)<<9|o>>>23)+_)<<13|o>>>19)+N)<<18|o>>>14,A^=(o=(_^=(o=(D^=(o=(w^=(o=A+_)<<7|o>>>25)+A)<<9|o>>>23)+w)<<13|o>>>19)+D)<<18|o>>>14,S^=(o=(T^=(o=(N^=(o=(x^=(o=S+T)<<7|o>>>25)+S)<<9|o>>>23)+x)<<13|o>>>19)+N)<<18|o>>>14,R^=(o=(C^=(o=(I^=(o=(P^=(o=R+C)<<7|o>>>25)+R)<<9|o>>>23)+P)<<13|o>>>19)+I)<<18|o>>>14,L^=(o=(F^=(o=(M^=(o=(k^=(o=L+F)<<7|o>>>25)+L)<<9|o>>>23)+k)<<13|o>>>19)+M)<<18|o>>>14;n[r++]=e[0]=A+i|0,n[r++]=e[1]=w+s|0,n[r++]=e[2]=D+c|0,n[r++]=e[3]=_+u|0,n[r++]=e[4]=T+f|0,n[r++]=e[5]=S+l|0,n[r++]=e[6]=x+d|0,n[r++]=e[7]=N+h|0,n[r++]=e[8]=I+p|0,n[r++]=e[9]=C+v|0,n[r++]=e[10]=R+y|0,n[r++]=e[11]=P+m|0,n[r++]=e[12]=k+g|0,n[r++]=e[13]=M+E|0,n[r++]=e[14]=F+b|0,n[r++]=e[15]=L+O|0}function l(e,n,t,r,o){for(;o--;)e[n++]=t[r++]}function d(e,n,t,r,o){for(;o--;)e[n++]^=t[r++]}function h(e,n,t,r,o){l(e,0,n,t+16*(2*o-1),16);for(var a=0;a<2*o;a+=2)f(e,n,t+16*a,r+8*a),f(e,n,t+16*a+16,r+8*a+16*o)}function p(e,n,t){return e[n+16*(2*t-1)]}function v(e){for(var n=[],t=0;t127&&r<2048?(n.push(r>>6|192),n.push(63&r|128)):(n.push(r>>12|224),n.push(r>>6&63|128),n.push(63&r|128))}return n}if(t<1||t>31)throw new Error("scrypt: logN not be between 1 and 31");var y,m,g,E,b=1<>>0;if(1*r>=1<<30||r>16777216||r>8388608||b>16777216/r)throw new Error("scrypt: parameters are too large");"string"==typeof e&&(e=v(e)),"string"==typeof n&&(n=v(n)),"undefined"!=typeof Int32Array?(y=new Int32Array(64*r),m=new Int32Array(32*b*r),E=new Int32Array(16)):(y=[],m=[],E=new Array(16)),g=u(e,n,128*r);var O=32*r;function A(){for(var e=0;e<32*r;e++){var n=4*e;y[0+e]=(255&g[n+3])<<24|(255&g[n+2])<<16|(255&g[n+1])<<8|255&g[n+0]}}function w(e,n){for(var t=e;t>>0&255,g[4*e+1]=n>>>8&255,g[4*e+2]=n>>>16&255,g[4*e+3]=n>>>24&255}}var T="undefined"!=typeof setImmediate?setImmediate:setTimeout;function S(e,n,t,r,o){!function a(){T((function(){r(e,e+t>>18&63]),o.push(t[n>>>12&63]),o.push(t[n>>>6&63]),o.push(t[n>>>0&63]);return r%3>0&&(o[o.length-1]="=",r%3==1&&(o[o.length-2]="=")),o.join("")}(t):"hex"===n?function(e){for(var n="0123456789abcdef".split(""),t=e.length,r=[],o=0;o>>4&15]),r.push(n[e[o]>>>0&15]);return r.join("")}(t):t}"function"==typeof a&&(s=i,i=a,a=1e3),a<=0?(A(),w(0,b),D(0,b),_(),i(x(s))):(A(),S(0,b,2*a,w,(function(){S(0,b,2*a,D,(function(){_(),i(x(s))}))})))}}(De)),De.exports)))}(we)),we.exports}var Te,Se,xe,Ne=_e(),Ie=n({__proto__:null,default:r(Ne)},[Ne]),Ce={exports:{}},Re={exports:{}},Pe={exports:{}},ke={exports:{}};function Me(){return Te||(Te=1,function(e){e.exports&&(e.exports={whenRealtimeSyncs:function(e,n){"function"==typeof e.getAuthDoc?setTimeout((function(){e.getAuthDoc()!==e.getUserDoc()?e.onSettle(n):n()}),0):console.error("improper use of this function")}})}(ke)),ke.exports}function Fe(){return Se||(Se=1,function(e){(()=>{const n=(e,n,t)=>{let r=globalThis;var o={setCustomize:()=>{}},a=function(e){try{return JSON.parse(JSON.stringify(e))}catch(e){return}};return o.init=function(o,i,s){var c=o.loggedIn,u=o.sharedFolder,f=o.readOnly,l=o.Messages||{},d=i.ROOT,h=i.FILES_DATA,p=i.STATIC_DATA,v=i.OLD_FILES_DATA,y=i.UNSORTED,m=i.TRASH,g=i.TEMPLATE,E=i.SHARED_FOLDERS,b=i.SHARED_FOLDERS_TEMP,O=i.debug;i._setReadOnly=function(e){(f=e)||i.fixFiles()},i.setHref=function(e,n,t){(n||e)&&(f||(n?[n]:i.findChannels([e])).forEach((function(e){var n=i.getFileData(e,!0);i.getHref(n)!==t&&(n.href=i.cryptor.encrypt(t))})))},i.setPadAttribute=function(e,n,t,r){if(r=r||function(){},f)r("EFORBIDDEN");else{var o=i.getIdFromHref(e);if(o)if(n&&n.trim()){var s=i.getFileData(o,!0);"href"===n?i.setHref(null,o,t):s[n]=a(t),r(null)}else r("E_INVAL_ATTR");else r("E_INVAL_HREF")}},i.getPadAttribute=function(e,n,t){t=t||function(){};var r=i.getIdFromHref(e);if(r){var o=i.getFileData(r);t(null,a(o[n]))}else t(null,void 0)},i.pushData=function(n,t){if("function"!=typeof t&&(t=function(){}),f)t("EFORBIDDEN");else{var r=e.createRandomInteger(),o=a(n);o.href&&-1!==o.href.indexOf("#")&&(o.href=i.cryptor.encrypt(o.href)),s[h][r]=o,t(null,r)}},i.pushLink=function(n,t){if("function"!=typeof t&&(t=function(){}),f)t("EFORBIDDEN");else{var r=e.createRandomInteger(),o=a(n);s[p][r]=o,t(null,r)}},i.pushSharedFolder=function(n,t){if("function"!=typeof t&&(t=function(){}),f)t("EFORBIDDEN");else{var r,u=a(n);if(Object.keys(s[E]).some((function(e){if(s[E][e].channel===u.channel)return u.href&&!s[E][e].href&&(s[E][e].href=u.href),r=e,!0})))t("EEXISTS",r);else if(c&&!o.testMode){var l=e.createRandomInteger();u.href&&-1!==u.href.indexOf("#")&&(u.href=i.cryptor.encrypt(u.href)),s[E][l]=u,t(null,l)}else t("EAUTH")}},i.deprecateSharedFolder=function(e,n){if(!f){var t=s[E][e];if(t){if(!(!t.href||-1===i.cryptor.decrypt(t.href).indexOf("#")))(s[b][e]=JSON.parse(JSON.stringify(t))).legacy="PASSWORD_CHANGE"!==n;var r=i.findFile(Number(e));i.delete(r,null,!0),delete s[E][e]}}};var A=function(e){f||delete s[h][e]};i.checkDeletedFiles=function(e){if(c||o.testMode)if(f)e("EFORBIDDEN");else{var t=i.getFiles([d,"hrefArray",m]),r=[];i.getFiles([h,E,p]).forEach((function(e){if(-1===t.indexOf(e)){var a=i.isSharedFolder(e)?s[E][e]:i.getFileData(e),c=a.channel;a.lastVersion&&r.push(n.hrefToHexChannelId(a.lastVersion)),a.rtChannel&&r.push(a.rtChannel),c&&r.push(c),i.isSharedFolder(e)?(delete s[E][e],o.removeProxy&&o.removeProxy(e)):s[p][e]?delete s[p][e]:A(e)}})),r.length?e(null,r):e()}else e()};i.deleteMultiplePermanently=function(e,n,t){if(f)t("EFORBIDDEN");else{var r=e.filter((function(e){return i.isPathIn(e,[h])}));if(!c&&!o.testMode)return r.forEach((function(e){var n=e[1];n&&A(n)})),void t();var a=e.filter((function(e){return i.isPathIn(e,["hrefArray"])})),u=e.filter((function(e){return i.isPathIn(e,[d])})),l=e.filter((function(e){return i.isPathIn(e,[m])})),p=[];a.forEach((function(e){var n=i.find(e);p.push({root:e[0],id:n})})),function(e){f||e.forEach((function(e){var n=s[e.root].indexOf(e.id);s[e.root].splice(n,1)}))}(p),u.forEach((function(e){var n=e.slice(),t=n.pop();delete i.find(n)[t]}));var v,y=[];l.forEach((function(e){var n=e.slice(),t=n.pop(),r=i.find(n);4!==e.length?delete r[t]:y.push({name:e[1],el:r})})),v=y,f||v.forEach((function(e){var n=s[m][e.name].indexOf(e.el);s[m][e.name].splice(n,1)})),n?t():i.checkDeletedFiles(t)}},i.copyFromOtherDrive=function(e,t,r,o){if(!f){var a=[];if(Object.keys(r).forEach((function(e){e=Number(e);var n=r[e];if(n.static)return delete n.static,void(s[p][e]=n);n.href&&(n.href=i.cryptor.encrypt(n.href));var t=!1;for(var o in s[h])if(s[h][o].channel===n.channel){s[h][o].href||(s[h][o].href=n.href),t=!0;break}t?a.push(e):s[h][e]=n})),i.isFile(t)&&-1!==a.indexOf(t))i.log(l.sharedFolders_duplicate);else{if(i.isFolder(t)){var c=function(e){for(var n in e)i.isFile(e[n])?-1!==a.indexOf(e[n])&&(i.log(l.sharedFolders_duplicate),delete e[n]):i.isFolder(e[n])&&c(e[n])};c(t)}var u=i.find(e),d=i.isFile(t)?n.createChannelId():o,v=i.getAvailableName(u,d);Array.isArray(u)?u.push(t):u[v]=t}}};i.copyElement=function(e,t){if(!f&&!i.comparePath(e,t)){var r=i.find(e),o=i.find(t);if(i.isPathIn(t,[m])){if(!e||e.length<2||e[0]===m)return void O("Can't move an element from the trash to the trash: ",e);var a=e[e.length-1],c=i.isPathIn(e,["hrefArray"])?i.getTitle(r):a,u=e.slice();return u.pop(),function(e,n,t){if(!f){var r=s[m];void 0===r[e]&&(r[e]=[]);var o={element:n,path:t};r[e].push(o)}}(c,r,u),!0}if(i.isPathIn(t,["hrefArray"])){if(i.isFolder(r))return void i.log(l.fo_moveUnsortedError);if(e[0]===t[0])return;var d=t[0];return-1===s[d].indexOf(r)&&s[d].push(r),!0}var h=i.isFile(r)?i.getAvailableName(o,n.createChannelId()):i.isInTrashRoot(e)?e[1]:e.pop();if(void 0===o[h])return o[h]=r,!0;i.log(l.fo_unavailableName)}},i.forget=function(e){if(!f){var n=i.getIdFromHref(e);if(n){if(!c&&!o.testMode)return A(n),!0;var t=i.findFile(n);return i.move(t,[m]),!0}}},i.restoreHref=function(e){if(!f){var n=i.getIdFromHref(e);if(n&&i.isFile(n)){var t=i.findFile(n),r=!0;t.forEach((function(e){e[0]!==m?r=!1:i.delete(e,null,!0)})),r&&i.add(n)}}},i.add=function(e,t){if(!f&&(c||o.testMode)){e=Number(e);var r=s[h][e]||s[p][e]||s[E][e];if(r&&"object"==typeof r){var a,u=t;if(t&&!Array.isArray(t)&&(u=decodeURIComponent(t).split(",")),t&&i.isPathIn(u,["hrefArray"]))(a=i.find(u)).push(e);else if(-1!==i.getFiles([d,m,"hrefArray"]).indexOf(e)||u||(u=[d]),t&&i.isPathIn(u,[d])){if(a=i.find(u)){var l=i.getAvailableName(a,n.createChannelId());return void(a[l]=e)}a=i.find([d]),u.slice(1).forEach((function(e){a=a[e]=a[e]||{}})),a[n.createChannelId()]=e}}}},i.setFolderData=function(e,t,r,o){if(!f){var a=i.find(e);if(i.isFolder(a)&&!i.isSharedFolder(a)){if(!i.hasFolderData(a))a["000"+n.createChannelId().slice(0,-3)]={metadata:!0};i.getFolderData(a)[t]=r,o()}}};var w=function(e){i.rt?(i.rt.sync(),t.whenRealtimeSyncs(i.rt,e)):r.setTimeout(e,1e3)};return i.migrateReadOnly=function(e){if(!f&&o.editKey)if(s.version>=2)e();else{s.migrateRo=1;w((function(){var n=JSON.parse(JSON.stringify(s));i.reencrypt(o.editKey,o.editKey,n),setTimeout((function(){s.version>=2?e():(Object.keys(n).forEach((function(e){s[e]=n[e]})),s.version=2,delete s.migrateRo,w(e))}),1e3)}))}else e({error:"EFORBIDDEN"})},i.migrate=function(t){if(f)t();else{!function(){if(s[y]&&s[v]){O("UNSORTED still exists in the object, removing it...");var e=s[y];0!==e.length?(e.forEach((function(e){"string"==typeof e&&(0===s[v].filter((function(n){return n.href===e})).length&&s[v].push({href:e}))})),delete s[y]):delete s[y]}}(),function(t){if(s[v])try{O("Migrating file system..."),s.migrate=1;w((function(){var r=s[v].slice();s[h]||(s[h]={});var o=s[h];r.forEach((function(t){if(t&&t.href){var r=t.href,a=e.createRandomInteger(),s=i.findFile(r),c=t,u=n.createChannelId();o[a]=c||{href:r},s.forEach((function(e){var n=e.slice(),t=n.pop(),r=i.find(n);if(i.isInTrashRoot(e))return r.element=a,void(o[a].filename=e[1]);i.isPathIn(e,["hrefArray"])?r[t]=a:(r[u]=a,o[a].filename=t,delete r[t])}))}})),delete s[v],delete s.migrate,t()}))}catch(e){console.error(e),t()}else t()}(t)}},i.fixFiles=function(t){if(!f){t&&(O=function(){});var r=+new Date;O("Cleaning file system...");var a=JSON.stringify(s),l=function(t){"object"!=typeof s[d]&&(O("ROOT was not an object"),s[d]={});var r=t||s[d];if(!r)return console.error("Invalid element in root");var o,a=0,c=s[p],u=s[h];for(var f in r)if(null!==(o=r[f]))if(i.isFolderData(o))0!==a&&(O("Multiple metadata files in folder"),delete r[f]),a++;else if(i.isFile(o,!0)||i.isFolder(o))if(i.isFolder(o))l(o);else{if("string"==typeof o){var v=e.createRandomInteger(),y=n.createChannelId();u[v]={href:i.cryptor.encrypt(o),filename:f},r[y]=v,delete r[f]}if("number"==typeof o)u[o]||c[o]||(O("An element in ROOT doesn't have associated data",o,f),delete r[f])}else O("An element in ROOT was not a folder nor a file. ",o),delete r[f];else console.error("element[%s] is null",f),delete r[f]};e.isObject(s[p])||(O("STATIC_DATA was not an object"),s[p]={}),l(),function(){if(!u){"object"!=typeof s[m]&&(O("TRASH was not an object"),s[m]={});var n,t=s[m],r=function(t,r,o){if("object"==typeof t){if(!i.isSharedFolder(t.element))if(i.isFile(t.element,!0)||i.isFolder(t.element))if(Array.isArray(t.path)){if("string"==typeof t.element){var a=e.createRandomInteger();s[h][a]={href:i.cryptor.encrypt(t.element),filename:o},t.element=a}if(i.isFolder(t.element)&&l(t.element),"number"==typeof t.element)s[h][t.element]||s[p][t.element]||(O("An element in TRASH doesn't have associated data",t.element,o),n.push(r))}else n.push(r);else n.push(r)}else n.push(r)};for(var o in t)if(Array.isArray(t[o]))if(0===t[o].length)O("Empty array in TRASH root. ",t[o]),delete t[o];else{n=[];for(var a=0;a=0;c--)t[o].splice(n[c],1)}else O("An element in TRASH root is not an array. ",t[o]),delete t[o]}}(),function(){if(!u){Array.isArray(s[g])||(O("TEMPLATE was not an array"),s[g]=[]);var n=e.deduplicateString(s[g]);n.length!==s[g].length&&(s[g]=n);var t=s[g],r=i.getFiles([d]),o=[];t.forEach((function(n,a){if(i.isFile(n,!0)&&-1===r.indexOf(n)){if("string"==typeof n){var c=e.createRandomInteger();return s[h][c]={href:i.cryptor.encrypt(n)},void(t[a]=c)}if("number"==typeof n)s[h][n]||(O("An element in TEMPLATE doesn't have associated data",n),o.push(n))}else o.push(n)})),o.forEach((function(e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}))}}(),function(){"object"!=typeof s[h]&&(O("FILES_DATA was not an object"),s[h]={});var e=s[h],t=i.getFiles([d,m,"hrefArray"]),r=i.find([d]),a=[];for(var u in e)if(String(u)===String(Number(u))){var l=e[u=Number(u)];if(l&&"object"==typeof l)if(l.href||l.roHref){var v;try{v=l.href&&(-1!==l.href.indexOf("#")?l.href:i.cryptor.decrypt(l.href))}catch(e){}if(!v||-1!==v.indexOf("#")){var y,g=n.parsePadUrl(v||l.roHref);if(g.hash)if(g.type){if(v&&"pad"===g.hashData.type&&g.hashData.version)if("view"===g.hashData.mode)l.roHref=v,delete l.href;else if(l.roHref){var E=n.parsePadUrl(l.roHref);E.hash&&E.type||(y=n.getSecrets(g.type,g.hash,l.password),l.roHref="/"+g.type+"/#"+n.getViewHashFromKeys(y))}else y=n.getSecrets(g.type,g.hash,l.password),l.roHref="/"+g.type+"/#"+n.getViewHashFromKeys(y);if(0===g.hashData.version&&delete l.roHref,v&&"/"!==v.slice(0,1)&&(l.href=i.cryptor.encrypt(n.getRelativeHref(v))),l.ctime||(l.ctime=l.atime),l.title||(l.title=i.getDefaultName(g)),!l.channel)try{y||(y=n.getSecrets(g.type,g.hash,l.password)),l.channel=y.channel,console.log(l),O("Adding missing channel in filesData ",l.channel)}catch(e){console.error(e)}if(n.isValidChannel(l.channel)||console.error("Remove invalid channel",l.channel,l),!c&&!o.testMode||-1!==t.indexOf(u));else O("An element in filesData was not in ROOT, TEMPLATE or TRASH.",u,l),r[n.createChannelId()]=u}else O("Removing an element in filesData with a invalid type.",l),a.push(u);else O("Removing an element in filesData with a invalid href.",l),a.push(u)}}else O("Removing an element in filesData with a missing href.",l),a.push(u);else O("An element in filesData was not an object.",l),a.push(u)}else O("Invalid file ID in filesData.",u),a.push(u);a.forEach((function(e){A(e)}));var b=s[p],w=[];for(var D in b){var _=b[D=Number(D)];_&&"object"==typeof _&&_.href?!c&&!o.testMode||-1!==t.indexOf(D)||w.push(D):w.push(D)}w.forEach((function(e){f||delete s[p][e]}))}(),Object.keys(s).forEach((function(e){"/"===e.slice(0,1)&&delete s[e]})),function(){if(!u){"object"!=typeof s[E]&&(O("SHARED_FOLDER was not an object"),s[E]={});var e,t,r=s[E],o=i.getFiles([d,m]),a=i.find([d]);for(var c in r){var f;t=r[c],c=Number(c);try{f=t.href&&(-1!==t.href.indexOf("#")?t.href:i.cryptor.decrypt(t.href))}catch(e){}if((e=n.parsePadUrl(f||t.roHref))&&e.hash&&"undefined"!==e.hash){if(-1===o.indexOf(c))console.log("missing"+c),a[n.createChannelId()]=c}else delete r[c]}}}(),function(){if(!u){"object"!=typeof s[b]&&(O("SHARED_FOLDER_TEMP was not an object"),s[b]={});var e=s[b],n=s[E];for(var t in e)n[t]&&delete e[t]}}();var v=+new Date-r+"ms";JSON.stringify(s)===a?O("File system was clean.",v):O("Your file system was corrupted. It has been cleaned so that the pads you visit can be stored safely.",v)}},i},o};e.exports&&(e.exports=n(W(),Z(),Me()))})()}(Pe)),Pe.exports}function Le(){return xe||(xe=1,function(e){(()=>{const n=(e,n,t,r,o,a={})=>{let i=globalThis;var s={setCustomize:e=>{a=e.Messages,r.setCustomize(e)}},c=s.ROOT="root",u=s.UNSORTED="unsorted",f=s.TRASH="trash",l=s.TEMPLATE="template",d=s.SHARED_FOLDERS="sharedFolders",h=s.SHARED_FOLDERS_TEMP="sharedFoldersTemp",p=s.FILES_DATA=t.storageKey,v=s.OLD_FILES_DATA=t.oldStorageKey,y=s.STATIC_DATA="static";s.getDefaultName=function(e){var n=e.type;return a.type[n]+" - "+function(){if(i.Intl&&i.Intl.DateTimeFormat)return new i.Intl.DateTimeFormat(void 0,{weekday:"short",year:"numeric",month:"long",day:"numeric"}).format(new Date);return(new Date).toString().split(" ").slice(0,4).join(" ")}()};var m=s.createCryptor=function(e){var n={};if(!e)return n.encrypt=function(e){return e},n.decrypt=function(e){return e},n;try{var t=o.createEncryptor(e);n.encrypt=function(e){try{return"/file/#"===e.slice(0,7)?e:t.encrypt(e)}catch(e){return}},n.decrypt=function(e){try{return t.decrypt(e)}catch(e){return}}}catch(e){console.error(e)}return n};return s.getHref=function(e,n){if(e.href&&-1!==e.href.indexOf("#"))return e.href;if(e.href&&n){var t=n.decrypt(e.href);if(t&&-1!==t.indexOf("#"))return t}return e.roHref},s.reencrypt=function(e,n,t){if(t){var r=m(e),o=m(n);Object.keys(t[p]).forEach((function(e){var n=t[p][e]||{};if(n.href&&n.roHref&&!n.fileType){var a=n.href&&-1===n.href.indexOf("#")?r.decrypt(n.href):n.href;if(!a)return;n.href=o.encrypt(a)}})),Object.keys(t[d]||{}).forEach((function(e){var n=t[d][e]||{};if(n.href){var a=n.href&&-1===n.href.indexOf("#")?r.decrypt(n.href):n.href;if(!a)return;n.href=o.encrypt(a)}})),Object.keys(t[h]||{}).forEach((function(e){var n=t[h][e]||{};if(n.href){var a=n.href&&-1===n.href.indexOf("#")?r.decrypt(n.href):n.href;if(!a)return;n.href=o.encrypt(a)}}))}else console.error("Nothing to reencrypt")},s.init=function(t,o){var i={};i.cryptor=m(o.editKey),i.setReadOnly=function(e,n){o.editKey=n,i.cryptor=m(n),i.cryptor.k=Math.random(),i.readOnly=e,i._setReadOnly&&i._setReadOnly(e)},i.readOnly=o.readOnly,i.reencrypt=s.reencrypt,i.getDefaultName=s.getDefaultName;var g=o.sframeChan,E=a.fm_newFolder||"New folder",b=a.fm_newFile||"New file";i.ROOT=c,i.STATIC_DATA=y,i.UNSORTED=u,i.TRASH=f,i.TEMPLATE=l,i.SHARED_FOLDERS=d,i.SHARED_FOLDERS_TEMP=h,i.FILES_DATA=p,i.OLD_FILES_DATA=v;var O=i.sharedFolder=o.sharedFolder;i.id=o.id;var A=function(){console.debug.apply(console,arguments)},w=i.log=o.log||A,D=o.logError||A,_=i.debug=o.debug||A;i.fixFiles=function(){};var T=i.error=function(){g?g.query("Q_DRIVE_USEROBJECT",{cmd:"fixFiles",data:{}},(function(){})):("function"==typeof i.fixFiles&&i.fixFiles(),console.error.apply(console,arguments),i.fixFiles())};o.outer&&r.init(o,i,t),i.getStructure=function(){var e={};return e[c]={},e[f]={},e[p]={},e[l]=[],e[d]={},e};var S=i.getHref=function(e){return s.getHref(e,i.cryptor)},x=function(e){return null===e?"null":Array.isArray(e)?"array":typeof e};i.isValidDrive=function(e){var n=i.getStructure();return"object"==typeof e&&Object.keys(n).every((function(t){return e[t]&&x(n[t])===x(e[t])}))};var N=function(){return[l]},I=function(e,n){return e===n},C=i.isSharedFolder=function(e){return!O&&Boolean(t[d]&&t[d][e])},R=i.isFile=function(e,n){return!C(e)&&("number"==typeof e||(void 0!==t[v]||n)&&"string"==typeof e)},P=i.isFolderData=function(e){return"object"==typeof e&&!0===e.metadata};i.isReadOnlyFile=function(e){if(!R(e))return!1;var n=i.getFileData(e);return n.roHref?Boolean(n.roHref&&!n.href):void 0},i.isStaticFile=function(e){return Boolean(t[y]&&t[y][e])};var k=i.isFolder=function(e){return!P(e)&&("object"==typeof e&&!e.channel||C(e))};i.isFolderEmpty=function(e){return!!k(e)&&(0===Object.keys(e).length||!(1!==Object.keys(e).length||!P(e[Object.keys(e)[0]])))},i.hasSubfolder=function(e,n){if(!k(e))return!1;var t=0,r=function(e){t+=k(e.element)?1:0};for(var o in e)n?Array.isArray(e[o])&&e[o].forEach(r):t+=k(e[o])?1:0;return t},i.hasFile=function(e,n){if(!k(e))return!1;var t=0,r=function(e){t+=R(e.element)?1:0};for(var o in e)n?Array.isArray(e[o])&&e[o].forEach(r):t+=R(e[o])?1:0;return t},i.hasFolderData=function(e){for(var n in e)if(P(e[n]))return!0};var M=i.hasSubSharedFolder=function(e){for(var n in e){if(C(e[n]))return!0;if(k(e[n])&&M(e[n]))return!0}return!1},F=i.getFileData=function(n,r){if(n){var a,s;try{a=(t[y]||{})[n]}catch(e){console.error(e)}if(a){var c=r?a:e.clone(a);return r||(c.static=!0),c}try{s=t[p][n]||{}}catch(e){console.error(e),s={}}if(!r&&(s=JSON.parse(JSON.stringify(s))).href&&-1===s.href.indexOf("#"))if(o.editKey)try{s.href=i.cryptor.decrypt(s.href)}catch(e){delete s.href}else delete s.href;return s}};i.getFolderData=function(e){for(var n in e)if(P(e[n]))return e[n];return{}};var L=i.getTitle=function(e,n){if(C(e))return"??";var t=F(e);if(t){if(t.static)return t.name;if(e&&(t.href||t.roHref))return"title"===n?t.title:"name"===n?t.filename:t.filename||t.title||b;T("getTitle called with a non-existing file id: ",e,t)}else T("unable to retrieve data about the requested file: ",e,t)},H=i.comparePath=function(e,n){if(!(e&&n&&Array.isArray(e)&&Array.isArray(n)))return!1;if(e.length!==n.length)return!1;for(var t=!0,r=e.length-1;t&&r>=0;)t=e[r]===n[r],r--;return t},j=i.isSubpath=function(e,n){var t=n.slice(),r=e.slice(0,t.length);return H(t,r)},K=i.isPathIn=function(e,n){if(n){var t=n.indexOf("hrefArray");return-1!==t&&(n.splice(t,1),n=n.concat(N())),n.some((function(n){return Array.isArray(e)&&e[0]===n}))}},U=i.isInTrashRoot=function(e){return e[0]===f&&4===e.length},B=function(e,n){if(n){if(0===n.length)return e;var t=n.slice(),r=t.shift();if(void 0!==e[r])return B(e[r],t);_("Unable to find the key '"+r+"' in the root object provided:",e)}else T("Invalid path:\n",n,"\nin root\n",e)},V=i.find=function(e){return B(t,e)},Y=i.getFilesRecursively=function(e,n){for(var t in n=n||[],e)R(e[t])||C(e[t])?-1===n.indexOf(e[t])&&n.push(e[t]):P(e[t])||Y(e[t],n);return n},G={array:function(e){return t[e]||(t[e]=[]),t[e].slice()}};N().forEach((function(e){G[e]=function(){return G.array(e)}})),G.hrefArray=function(){var n=[];return O?n:(N().forEach((function(e){n=n.concat(G[e]())})),e.deduplicateString(n))},G[c]=function(){var e=[];return Y(t[c],e),e},G[f]=function(){var e=t[f],n=[],r=function(e){R(e.element)||C(e.element)?-1===n.indexOf(e.element)&&n.push(e.element):Y(e.element,n)};for(var o in e){if(!Array.isArray(e[o]))return void T("Trash contains a non-array element");e[o].forEach(r)}return n},G[v]=function(){var e=[];return t[v]?(t[v].forEach((function(n){n.href&&-1===e.indexOf(n.href)&&e.push(n.href)})),e):e},G[y]=function(){return t[y]?Object.keys(t[y]).map(Number).filter(Boolean):[]},G[p]=function(){return t[p]?Object.keys(t[p]).map(Number).filter(Boolean):[]},G[d]=function(){return t[d]?Object.keys(t[d]).map(Number).filter(Boolean):[]};var J=i.getFiles=function(n){var t=[];return n&&n.length||(n=[c,"hrefArray",f,v,p,d]),n.forEach((function(e){"function"==typeof G[e]&&(t=t.concat(G[e]()))})),e.deduplicateString(t)},W=i.getIdFromHref=function(e){var r,o=function(e){if(e)return n.parsePadUrl(e).getUrl().replace(/\/p\/?/,"/")},a=o(e);return J([p]).some((function(e){if(o(S(t[p][e]))===a||o(t[p][e].roHref)===a)return r=e,!0})),r};i.getSFIdFromHref=function(e){var r,o=function(e){if(e)return n.parsePadUrl(e).getUrl().replace(/\/p\/?/,"/")},a=o(e);return J([d]).some((function(e){if(o(S(t[d][e]))===a||o(t[d][e].roHref)===a)return r=e,!0})),r};var q=function(e,n){if(!K(e,[c,f]))return[];n=Array.isArray(n)?n:[n];var t={},r=V(e),o=function(e){Object.keys(e).forEach((n=>{t[n]||=[],Array.prototype.push.apply(t[n],e[n])}))};if(R(r)||C(r))return n.some((n=>{I(n,r)&&(t[n]||=[],t[n].push(e))})),t;if(k(r))for(var a in r){let t=e.slice();t.push(a),o(q(t,n))}return t},z=function(e,n){if(O)return{};if(!t[e])return{};var r=t[e].slice(),o={},a=-1;return n.forEach((n=>{for(;-1!==(a=r.indexOf(n,a+1));)o[n]||=[],o[n].push([e,a])})),o},Q=function(e,n){if(O)return[];var t=V(e),r={},o=function(e){Object.keys(e).forEach((n=>{r[n]||=[],Array.prototype.push.apply(r[n],e[n])}))};if(1===e.length&&"object"==typeof t&&Object.keys(t).forEach((function(r){var a=t[r];if(Array.isArray(a)){var i=e.slice();i.push(r),o(Q(i,n))}})),2===e.length){if(!Array.isArray(t))return[];t.forEach((function(t,a){var i=e.slice();i.push(a),i.push("element"),R(t.element)?n.some((e=>{I(e,t.element)&&(r[e]||=[],r[e].push(i))})):o(Q(i,n))}))}return e.length>=4&&o(q(e,n)),r},X=i.findFiles=function(e){var n=q([c],e),t=z(l,e),r=Q([f],e);let o={};return e.forEach((e=>{o[e]=[]})),[n,t,r].forEach((e=>{Object.keys(e).forEach((n=>{o[n]||=[],Array.prototype.push.apply(o[n],e[n])}))})),o},Z=i.findFile=function(e){return X([e])[e]||[]};i.findChannels=function(e,n){var r=t[p],o=t[d],a=[p];return n&&a.push(d),J(a).filter((function(n){var t=r[n]||o[n]||{};return-1!==e.indexOf(t.channel)}))},i.search=function(r){if("string"!=typeof r)return[];r=r.trim();var o,a=[],s=t[p],u=t[d],f=r.toLowerCase();/^#/.test(f)&&(o=[f.slice(1).trim()]);J([p,d]).forEach((function(e){var n=s[e]||u[e];if(n)if(Array.isArray(n.tags)&&(t=n.tags,o&&t.length&&(t=t.map((function(e){return e.toLowerCase()})),o.some((function(e){return t.some((function(n){return n===e}))})))))a.push(e);else{var t,r=n.title||n.lastTitle;(r&&-1!==r.toLowerCase().indexOf(f)||n.filename&&-1!==n.filename.toLowerCase().indexOf(f))&&a.push(e)}}));var l=n.getRelativeHref(r);if(l){var h=W(l);h&&a.push(h)}a=e.deduplicateString(a);var v=[];a.forEach((function(e){v.push({id:e,paths:Z(e),data:i.getFileData(e)})}));var y=[],m=function(e,n){for(var t in e)k(e[t])&&!C(e[t])&&(-1!==t.toLowerCase().indexOf(f)&&y.push({id:null,paths:[n.concat(t)],data:{title:t}}),m(e[t],n.concat(t)))};return m(t[c],[c]),y=y.sort((function(e,n){return e.data.title.toLowerCase()>n.data.title.toLowerCase()})),v=y.concat(v)},i.getRecentPads=function(){var e=t[p];return Object.keys(e).filter((function(n){return e[n]})).sort((function(n,t){return e[t].atime-e[n].atime})).map((function(e){return Number(e)}))},i.getOwnedPads=function(e){var n=t[p];return Object.keys(n).filter((function(t){return n[t].owners&&-1!==n[t].owners.indexOf(e)})).map((function(e){return Number(e)}))};var $=i.getAvailableName=function(e,n){if(void 0===e[n])return n;for(var t=n,r=1;void 0!==e[t];)t=n+"_"+r,r++;return t},ee=i.move=function(e,n,t){if(g)g.query("Q_DRIVE_USEROBJECT",{cmd:"move",data:{paths:e,newPath:n}},t);else{var r=[];e.forEach((function(e){var t=e.slice();t.pop(),H(t,n)||(j(n,e)?w(a.fo_moveFolderToChildError):i.copyElement(e.slice(),n)&&r.push(e))})),i.delete(r,t)}};return i.restore=function(e,n){if(g)g.query("Q_DRIVE_USEROBJECT",{cmd:"restore",data:{path:e}},n);else if(U(e)){var t=e.slice();t.pop();var r=V(t).path;ee([e],r,n)}},i.addFolder=function(e,n,t){if(g)g.query("Q_DRIVE_USEROBJECT",{cmd:"addFolder",data:{path:e,name:n}},t);else{var r=V(e),o=$(r,n||E);r[o]={};var a=e.slice();a.push(o),t({newPath:a})}},i.delete=function(e,n,t){g?g.query("Q_DRIVE_USEROBJECT",{cmd:"delete",data:{paths:e,nocheck:t}},n):(n=n||function(){},i.deleteMultiplePermanently(e,t,n))},i.emptyTrash=function(e){e=e||function(){},g?g.query("Q_DRIVE_USEROBJECT",{cmd:"emptyTrash"},e):(t[f]={},i.checkDeletedFiles(e))},i.ownedInTrash=function(e){return J([f]).map((function(n){var r=C(n)?t[d][n]:i.getFileData(n);if(r)return e(r.owners)?r.channel:void 0})).filter(Boolean)},i.rename=function(e,n,r){if(r=r||function(){},g)g.query("Q_DRIVE_USEROBJECT",{cmd:"rename",data:{path:e,newName:n}},r);else if(e.length<=1)D("Renaming `root` is forbidden");else{var o,i=V(e);if(k(i)&&!C(i)){var s=e.slice(),c=s.pop();if(!n||!n.trim()||c===n)return;var u=V(s);return void 0!==u[n]?void w(a.fo_existingNameError):(u[n]=i,delete u[c],void("function"==typeof r&&r()))}if(o=C(i)?t[d][i]:t[p][i]||t[y][i])return t[y][i]?n&&n.trim()?(o.name=n,void r()):void r():n&&""!==n.trim()?void(L(i,"name")!==n&&(o.filename=n,"function"==typeof r&&r())):(delete o.filename,void("function"==typeof r&&r()))}},i.getTagsList=function(){var e,n={},r=function(e){n[e]=n[e]?++n[e]:1};for(var o in t[p])(e=t[p][o]).tags&&Array.isArray(e.tags)&&e.tags.forEach(r);return n},i},s};e.exports&&(e.exports=n(W(),Z(),K(),Fe(),C(),void 0))})()}(Re)),Re.exports}var He,je,Ke,Ue={exports:{}},Be={exports:{}};function Ve(){return He||(He=1,function(e){e.exports=function(e){var n,t=[],r=[],o=0,a=function(e){return o++,function(){for(e&&e.apply(null,arguments),o=(o||1)-1;!o&&t.length&&!n;)t.shift()(a)}};a.abort=function(){r.forEach(clearTimeout),n=1};var i={nThen:function(e){return n||(o?t.push(e):e(a)),i},orTimeout:function(e,s){if(n)return i;if(!s)throw Error("Must specify milliseconds to orTimeout()");var c,u=setTimeout((function(){for(;t.shift()!==c;);for(e(a),o=(o||1)-1;!o&&t.length;)t.shift()(a)}),s);return t.push(c=function(){var e=r.indexOf(u);if(e>-1)return r.splice(e,1),void clearTimeout(u);throw new Error("timeout not listed in array")}),r.push(u),i}};return i.nThen(e)}}(Be)),Be.exports}function Ye(){return je||(je=1,function(e){e.exports&&(e.exports=((e,n,t,r,o,a,i,s)=>{var c={},u={};return c.checkMigration=function(e,t,r,o){var a=n.once(n.mkAsync(o));if(t)if(e)if(t.version>=2)a();else if(t.migrateRo){var i,s=!1,c=setInterval((function(){if(t.version>=2)return s=!0,clearTimeout(i),clearInterval(c),void a()}),100);i=setTimeout((function(){clearInterval(c),r.migrateReadOnly((function(){s=!0,a()}))}),2e4),t.on("change",["version"],(function(){s||t.version>=2&&(s=!0,clearTimeout(i),clearInterval(c),a())}))}else r.migrateReadOnly(a);else a();else a()},c.migrate=function(e){var t=u[e];if(t){var r=t.teams;if(Array.isArray(r)&&r.length){var o=r[0];if(o.secondaryKey){var a=n.find(o,["store","manager","folders",o.id]);a&&a.proxy&&!a.proxy.version&&a.userObject.migrateReadOnly((function(){r.forEach((function(e){n.find(e,["store","manager","folders",e.id,"userObject"]).setReadOnly(!1,e.secondarykey)}))}))}}}},c.load=function(t,f,l,d){var h=n.once(n.mkAsync(d)),p=t.network,v=t.store,y=t.isNew,m=t.isNewChannel,g=v.id,E=v.handleSharedFolder,b=v.manager.user.userObject.getHref(l),O=e.parsePadUrl(b),A=e.getSecrets("drive",O.hash,l.password);if(!A.keys)return v.manager.deprecateProxy(f),void h(null);var w=A.keys.secondaryKey;o((function(e){t.cache&&r.getChannelCache(A.channel,e((function(n){if("EINVAL"===n)return e.abort(),v.manager.restrictedProxy(f,A.channel),void h(null)})))})).nThen((function(e){m(null,{channel:A.channel},e((function(n){if(n.isNew&&!y)return v.manager.deprecateProxy(f,A.channel,n.reason),e.abort(),void h(null)})))})).nThen((function(){var e=u[A.channel];if(e&&e.readOnly&&w&&c.upgrade(A.channel,A),e&&e.ready&&e.rt)return setTimeout((function(){v.manager.addProxy(f,e.rt,(function(){c.leave(A.channel,g)}),w),h(e.rt)})),e.teams.push({cb:h,store:v,id:f}),void(E&&E(f,e.rt));if(e&&!e.ready&&e.rt)return e.teams.push({cb:h,store:v,secondaryKey:w,id:f}),void(E&&E(f,e.rt));e=u[A.channel]={teams:[{cb:h,store:v,secondaryKey:w,id:f}],readOnly:!Boolean(w)};var n=l.owners,o={data:{},channel:A.channel,readOnly:!Boolean(w),crypto:a.createEncryptor(A.keys),userName:"sharedFolder",logLevel:1,ChainPad:s,classic:!0,network:p,Cache:r,metadata:{validateKey:A.keys.validateKey||void 0,owners:n},onRejected:t.Store&&t.Store.onRejected},d=e.rt=i.create(o);d.proxy.on("cacheready",(function(){e.teams&&(e.teams.forEach((function(n){d.cache=!0,n.store.manager.addProxy(n.id,d,(function(){c.leave(A.channel,n.store.id)}),n.secondaryKey,t.updatePassword),t.updatePassword=!1,n.cb(e.rt)})),e.ready=!0)})),d.proxy.on("ready",(function(){y&&!Object.keys(d.proxy).length&&(d.proxy.version=2),e.teams&&(e.teams.forEach((function(n){d.cache=!1,n.store.manager.addProxy(n.id,d,(function(){c.leave(A.channel,n.store.id)}),n.secondaryKey,t.updatePassword),n.cb(e.rt)})),e.ready=!0)})),d.proxy.on("error",(function(n){if(n&&n.error){if("EDELETED"===n.error){try{e.teams.forEach((function(e){e.store.manager.deprecateProxy(e.id,A.channel,n.message),e.store.handleSharedFolder&&e.store.handleSharedFolder(e.id,null),e.cb()}))}catch(e){}return delete u[A.channel],void h()}if("ERESTRICTED"===n.error)return e.teams.forEach((function(e){e.store.manager.restrictedProxy(e.id,A.channel),e.cb()})),delete u[A.channel],void h()}})),E&&E(f,d)}))},c.upgrade=function(e,n){var t=u[e];if(t&&t.readOnly&&t.rt.setReadOnly&&n.keys&&n.keys.editKeyStr){var r=a.createEncryptor(n.keys);t.readOnly=!1,t.rt.setReadOnly(!1,r)}},c.leave=function(e,n){var t=u[e];if(t){var r,o=t.teams;Array.isArray(o)&&(o.some((function(e,t){if(e.store.id===n)return e.store.handleSharedFolder&&e.store.handleSharedFolder(e.id,null),r=t,!0})),void 0!==r&&(o.splice(r,1),o.length||t.rt&&t.rt.stop&&t.rt.stop()))}},c.updatePassword=function(r,a,i,s){var f=a.oldChannel,l=a.href,d=a.password,h=e.parsePadUrl(l),p=e.getSecrets(h.type,h.hash,d),v=u[f];if(v){if(v.rt&&v.rt.stop)try{v.rt.stop()}catch(e){}var y=o;v.teams.forEach((function(e){y=y((function(o){var a=e.store,s=e.id,u=n.find(a.proxy,["drive",t.SHARED_FOLDERS])||{};if(s&&u[s]){var l=JSON.parse(JSON.stringify(u[s]));l.password=d,c.load({network:i,store:a,updatePassword:!0,Store:r,isNewChannel:r.isNewChannel},s,l,o()),a.rpc&&(a.rpc.unpin([f],o()),a.rpc.pin([p.channel],o()))}})).nThen})),y((function(){s()}))}else s({error:"ENOTFOUND"})},c.loadSharedFolders=function(e,n,r,a,i,s,u,f){var l=a[t.SHARED_FOLDERS]||{},d=Object.keys(l).length,h=1,p=s();u=u||function(){},o((function(t){Object.keys(l).forEach((function(o){var a=l[o];c.load({network:n,store:r,Store:e,cache:f,isNewChannel:e.isNewChannel},o,a,t((function(){u({progress:h,max:d}),h++})))}))})).nThen((function(){setTimeout(p)}))},c.isSharedFolderChannel=function(e){return Object.keys(u).includes(e)},c})(Z(),W(),Le(),ie(),Ve(),C(),g(),w()))}(Ue)),Ue.exports}function Ge(){return Ke||(Ke=1,function(e){(()=>{const n=(e,n,t,r,o={},a,i)=>{var s=function(n,t,r,o,a,i){if(!n.folders[t]||i||n.folders[t].restricted){var s=function(e){var n={};for(var t in e.cfg)n[t]=e.cfg[t];return n}(n);s.sharedFolder=!0,s.id=t,s.editKey=a,s.rt=r.realtime,s.readOnly=Boolean(!a);var c=e.init(r.proxy,s);c.fixFiles&&c.fixFiles();var u=r.proxy;if(u.metadata&&u.metadata.title){var f=n.user.proxy[e.SHARED_FOLDERS][t];f&&(f.lastTitle=u.metadata.title)}return n.folders[t]={proxy:r.proxy,userObject:c,leave:o,restricted:u.restricted,offline:Boolean(r.cache)},u.on&&(u.on("disconnect",(function(){n.folders[t].offline=!0})),u.on("reconnect",(function(){n.folders[t].offline=!1}))),c}n.folders[t].offline&&!r.cache&&n.Store&&(n.folders[t].offline=!1,n.folders[t].userObject.fixFiles&&n.folders[t].userObject.fixFiles(),n.Store.refreshDriveUI())},c=function(e,n){var t=e.folders[n];t&&(t.leave(),delete e.folders[n])},u=function(t,r,o,a){if(!t.folders[r]||!t.folders[r].deleting){if(t.user.userObject.readOnly){return c(t,r),s(t,r,{proxy:{deprecated:!0}},(function(){})),void t.Store.refreshDriveUI()}if(o&&t.unpinPads([o],(function(){})),a&&"PASSWORD_CHANGE"!==a){let o=n.find(t,["user","proxy",e.SHARED_FOLDERS]),a=o[r]&&o[r].lastTitle;return a&&((e,n,t)=>{var r=e.store.mailbox;if(r){var o,a=e.cfg.teamId;o=a?e.store.modules.team.getTeamsData()[a]:e.Store.getMetadata(null,null,(()=>{})).user,r.sendTo("SF_DELETED",{sfId:n,team:a,title:t},{curvePublic:o.curvePublic,channel:o.notifications},(e=>{console.error(e)}))}})(t,r,a),delete o[r],void(t.Store&&t.Store.refreshDriveUI&&t.Store.refreshDriveUI())}t.user.userObject.deprecateSharedFolder(r,a),c(t,r),t.Store&&t.Store.refreshDriveUI&&t.Store.refreshDriveUI()}},f=function(e,n){c(e,n),s(e,n,{proxy:{restricted:!0,root:{},filesData:{}}},(function(){})),e.Store.refreshDriveUI()},l=function(e,n){return Array.isArray(n)&&-1!==n.indexOf(e.edPublic)},d=function(e){var n=[e.user.userObject],t=Object.keys(e.folders).map((function(n){return e.folders[n].userObject}));return Array.prototype.push.apply(n,t),n},h=function(e,n){var t=d(e),r=e.user.userObject;return t.some((function(e){if(Object.keys(e.getFileData(n)).length)return r=e,!0})),r},p=function(e,n){var t=Number(n.id);if(t)return e.user.userObject.findFile(t)[0]},v=function(n,t,r){var o=[];return n.user.userObject.findChannels([t],!0).forEach((function(t){var a=n.user.proxy[e.SHARED_FOLDERS][t];a&&!r&&(a=JSON.parse(JSON.stringify(a))),a||(a=n.user.userObject.getFileData(t,r)),o.push({id:t,data:a,userObject:n.user.userObject})})),Object.keys(n.folders).forEach((function(e){n.folders[e].userObject.findChannels([t]).forEach((function(t){o.push({id:t,fId:e,data:n.folders[e].userObject.getFileData(t,r),userObject:n.folders[e].userObject})}))})),o},y=function(e,n){var t=[],r=e.user.userObject.getIdFromHref(n);return r&&t.push({data:e.user.userObject.getFileData(r),userObject:e.user.userObject}),Object.keys(e.folders).forEach((function(r){var o=e.folders[r].userObject.getIdFromHref(n);o&&t.push({fId:r,data:e.folders[r].userObject.getFileData(o),userObject:e.folders[r].userObject})})),t},m=function(e,n){var t=[],r=d(e);let o={};return r.forEach((function(e){var a=Number(e.id);let i;if(a){i=e.findFile(n);let t=(o[a]||[])[0];if(!t)return;i.forEach((function(e){Array.prototype.unshift.apply(e,t)}))}else{let t=[n],a=r.map((e=>+e.id)).filter(Boolean);Array.prototype.push.apply(t,a),o=e.findFiles(t),i=o[n]}Array.prototype.push.apply(t,i)})),t},g=function(e,n){var t={},r=d(e);let o={};return r.forEach((function(e){var a=Number(e.id);if(!e.id){let e=r.map((e=>+e.id)).filter(Boolean);Array.prototype.push.apply(n,e)}var i=e.findFiles(n);if(e.id||(o=i),a){let e=(o[a]||[])[0];if(!e)return;Object.keys(i).forEach((n=>{i[n].forEach((n=>{Array.prototype.unshift.apply(n,e)}))}))}Object.keys(i).forEach((e=>{t[e]||=[],Array.prototype.push.apply(t[e],i[e])}))})),t},E=function(e,t,r){if(r)return e.user.userObject.findChannels(t);var o=[];return d(e).forEach((function(e){var n=e.findChannels(t);Array.prototype.push.apply(o,n)})),o=n.deduplicateString(o)},b=function(e,n,t){var r=d(e),o={};return r.some((function(e){if((o=e.getFileData(n,t))&&Object.keys(o).length)return!0})),o},O=function(t,r){var o;if(t.isHistoryMode&&!t.folders[r])o=!0;else if(!t.folders[r])return{};var a=o?{}:t.folders[r].proxy;Object.keys(a.metadata||{}).length>1&&(a.metadata={title:a.metadata.title});var i=n.clone(a.metadata||{});for(var s in t.user.proxy[e.SHARED_FOLDERS][r]||{})if(void 0!==t.user.proxy[e.SHARED_FOLDERS][r][s]){var c=n.clone(t.user.proxy[e.SHARED_FOLDERS][r][s]);if("href"===s&&-1===c.indexOf("#"))try{c=t.user.userObject.cryptor.decrypt(c)}catch(e){}"href"===s&&-1===c.indexOf("#")&&(c=void 0),i[s]=c}return i},A=function(e,n){var t,r={id:null,userObject:e.user.userObject,path:n};if(!Array.isArray(n)||n.length<=1)return r;for(var o=e.user.userObject,a=2;a{o=n.Messages,e.setCustomize(n)},create:function(n,t,r){var o={pinPads:t.pin,unpinPads:t.unpin,onSync:t.onSync,Store:t.Store,store:t.store,removeOwnedChannel:t.removeOwnedChannel,loadSharedFolder:t.loadSharedFolder,cfg:r,edPublic:t.edPublic,settings:t.settings,user:{proxy:n},folders:{}};r.removeProxy=function(e){c(o,e)},o.user.userObject=e.init(n,r);var a=function(e){return function(){return[].unshift.call(arguments,o),e.apply(null,arguments)}};return{addProxy:a(s),removeProxy:a(c),deprecateProxy:a(u),restrictedProxy:a(f),addSharedFolder:a(N),addPin:function(e,n){o.pinPads=e,o.unpinPads=n},removePin:function(){delete o.pinPads,delete o.unpinPads},command:a(P),getPadAttribute:a(M),setPadAttribute:a(k),getTagsList:a(F),getSecureFilesList:a(L),getSharedFolderData:a(O),getChannelsList:a(j),addPad:a(K),delete:a(I),deleteOwned:a(C),findChannel:a(v),findHref:a(y),findFile:a(m),getEditHash:a(S),user:o.user,folders:o.folders}},createInner:function(n,t,r,o){var a={cfg:o,sframeChan:t,edPublic:r,user:{proxy:n,userObject:e.init(n,o)},folders:{}},i=function(e){return function(){return[].unshift.call(arguments,a),e.apply(null,arguments)}};return{addProxy:i(s),removeProxy:i(c),setHistoryMode:i(le),rename:i(U),move:i(B),emptyTrash:i(V),addFolder:i(Y),addSharedFolder:i(G),addLink:i(J),restoreSharedFolder:i(W),convertFolderToSharedFolder:i(q),delete:i(z),deleteOwned:i(Q),restore:i(X),setFolderData:i(Z),updateStaticAccess:i($),getFileData:i(ne),find:i(re),getTitle:i(oe),isReadOnlyFile:i(ie),isStaticFile:i(ae),getFiles:i(se),search:i(ce),getRecentPads:i(ue),getOwnedPads:i(fe),getTagsList:i(F),findFile:i(m),findFiles:i(g),findChannels:i(ee),getSharedFolderData:i(O),getFolderData:i(de),isInSharedFolder:i(he),getUserObjectPath:i(te),isDuplicateOwned:i(Se),ownedInTrash:i(Te),isValidDrive:i(pe),isFile:i(ve),isFolder:i(ye),isSharedFolder:i(me),isFolderEmpty:i(ge),isPathIn:i(Ee),isSubpath:i(be),isInTrashRoot:i(Oe),comparePath:i(Ae),hasSubfolder:i(we),hasSubSharedFolder:i(De),hasFile:i(_e),user:a.user,folders:a.folders}}}};e.exports&&(e.exports=n(Le(),W(),Z(),Ye(),void 0,ge(),Ve()))})()}(Ce)),Ce.exports}var Je,We,qe=Ge(),ze=n({__proto__:null,default:r(qe)},[qe]),Qe=Le(),Xe=n({__proto__:null,default:r(Qe)},[Qe]),Ze={exports:{}},$e={exports:{}};function en(){return We||(We=1,function(e){e.exports&&(e.exports=((e={},n={},t)=>{let r=[];const o=["sheet","doc","presentation"],a=a=>{e=a.AppConfig;const i=(n=a.ApiConfig).onlyOffice&&n.onlyOffice.availableVersions.includes(t.currentVersion);r=e.availablePadTypes.filter((e=>i||!o.includes(e)))};Object.keys(e).length&&a({AppConfig:e,ApiConfig:n});const i={setCustomize:a};return i.__defineGetter__("availableTypes",(function(){return n.appsToDisable?r.filter((e=>!n.appsToDisable.includes(e))):r})),i.__defineGetter__("appsToSelect",(function(){return r.filter((e=>!["drive","teams","file","contacts","convert"].includes(e)))})),i.isAvailable=e=>Array.isArray(i.availableTypes)&&i.availableTypes.includes(e),i})(void 0,void 0,(Je||(Je=1,function(e){e.exports&&(e.exports={currentVersion:"v7"})}($e)),$e.exports)))}(Ze)),Ze.exports}var nn,tn,rn=en(),on=n({__proto__:null,default:r(rn)},[rn]),an={exports:{}},sn={exports:{}};function cn(){return nn||(nn=1,function(e){(()=>{const n=(e,n,t={},r)=>{const o=function(){if(Object.keys(t).length){var e,n=new URL(t.httpUnsafeOrigin);try{return(e=new URL(t.websocketPath,t.httpUnsafeOrigin)).protocol=n.protocol,e.origin}catch(e){return console.error(e),t.httpUnsafeOrigin}}};var a=o();var i=e=>JSON.parse(JSON.stringify(e)),s=function(e,t,r){var o=n.once(n.mkAsync(r));fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then((e=>{e.ok?e.text().then((e=>{o(void 0,n.tryParse(e))})):e.json().then().then((n=>{o(e.status,n)}))})).catch((e=>{o(e)}))},c=function(n,t,o){var c=i(t);c.publicKey=r.util.encodeBase64(n.publicKey),c.nonce=r.util.encodeBase64(r.randomBytes(24));var u,f,l=new URL("/api/auth/",a);e((function(e){s(l,c,e(((n,t)=>n?(e.abort(),console.error(n),t&&console.error(t),void o(n)):t.date&&t.txid?(u=t.txid,void(f=t.date)):(e.abort(),void o("REQUEST_REJECTED")))))})).nThen((function(e){var t=i(c);t.txid=u,t.date=f;var a=r.util.decodeUTF8(JSON.stringify(t)),d=r.sign.detached(a,n.secretKey),h=r.util.encodeBase64(d);s(l,{sig:h,txid:u},e(((n,t)=>{if(n)return e.abort(),console.error(n),t&&console.error(t),void o("RESPONSE_REJECTED",t);o(void 0,t)})))}))};return c.setCustomize=e=>{t=e.ApiConfig,a=o()},c};e.exports&&(e.exports=n(Ve(),W(),void 0,I()))})()}(sn)),sn.exports}function un(){return tn||(tn=1,function(e){e.exports&&(e.exports=((e,n={},t,r)=>{var o={setCustomize:e=>{n=e.ApiConfig,t.setCustomize(e)}};o.join=e.uint8ArrayJoin,o.seed=function(){return r.hash(r.util.decodeUTF8("pewpewpew"))},o.genkeys=function(e){if(!(e instanceof Uint8Array))throw new Error("INVALID_SEED_FORMAT");if(!e||"number"!=typeof e.length||e.length<64)throw new Error("INVALID_SEED_LENGTH");var n=e.subarray(0,r.sign.seedLength),t=e.subarray(r.sign.seedLength,r.sign.seedLength+r.secretbox.keyLength);return{sign:r.sign.keyPair.fromSeed(n),symmetric:t}},o.keysToRPCFormat=function(e){try{var n=e.sign;return{edPrivate:r.util.encodeBase64(n.secretKey),edPublic:r.util.encodeBase64(n.publicKey)}}catch(e){return void console.error(e)}},o.encrypt=function(e,n,t){var a=r.util.decodeUTF8(n),i=r.randomBytes(r.secretbox.nonceLength);return o.join([[0],i,r.secretbox(a,i,t.symmetric)])},o.decrypt=function(e,n){var t=e.subarray(1,1+r.secretbox.nonceLength),o=e.subarray(1+r.secretbox.nonceLength),a=r.secretbox.open(o,t,n.symmetric);try{return JSON.parse(r.util.encodeUTF8(a))}catch(e){return void console.error(e)}},o.sign=function(e,n){return r.sign.detached(r.hash(e),n.sign.secretKey)},o.serialize=function(e,n){var t=o.encrypt(0,e,n),a=o.sign(t,n);return{publicKey:r.util.encodeBase64(n.sign.publicKey),signature:r.util.encodeBase64(a),ciphertext:r.util.encodeBase64(t)}},o.proveAncestor=function(n){var t=e.find(n,["sign","publicKey"]),o=e.find(n,["sign","secretKey"]);try{var a=r.sign.detached(t,o);return JSON.stringify([t,a].map(r.util.encodeBase64))}catch(e){return void console.error(e)}};var a=function(e){return r.util.encodeBase64(e).replace(/\//g,"-")};o.getBlockUrl=function(e){var t=a(e.sign.publicKey);return(n.fileHost||n.httpUnsafeOrigin||window.location.origin)+"/block/"+t.slice(0,2)+"/"+t},o.getBlockHash=function(e){return o.getBlockUrl(e)+"#"+a(e.symmetric)};var i=function(e){try{return r.util.decodeBase64(e.replace(/\-/g,"/"))}catch(e){return void console.error(e)}};return o.parseBlockHash=function(e){if("string"==typeof e){var n=e.split("#");if(2===n.length)try{return{href:n[0],keys:{symmetric:i(n[1])}}}catch(e){return void console.error(e)}}},o.checkRights=function(n,r){const o=e.mkAsync(r),{blockKeys:a,auth:i}=n;var s="MFA_CHECK";i&&i.type&&(s=`${i.type.toUpperCase()}_`+s),t(a.sign,{command:s,auth:i&&i.data},o)},o.writeLoginBlock=function(e,n){const{content:r,blockKeys:a,oldBlockKeys:i,auth:s,pw:c,session:u,token:f,userData:l}=e;var d="WRITE_BLOCK";s&&s.type&&(d=`${s.type.toUpperCase()}_`+d);var h=o.serialize(JSON.stringify(r),a);h.auth=s&&s.data,h.hasPassword=c,h.registrationProof=i&&o.proveAncestor(i),f&&(h.inviteToken=f),l&&(h.userData=l),t(a.sign,{command:d,content:h,session:u},n)},o.removeLoginBlock=function(e,n){const{reason:r,blockKeys:o,auth:a,edPublic:i}=e;var s="REMOVE_BLOCK";a&&a.type&&(s=`${a.type.toUpperCase()}_`+s),t(o.sign,{command:s,auth:a&&a.data,edPublic:i,reason:r},n)},o.updateSSOBlock=function(e,n){const{blockKeys:r,oldBlockKeys:a}=e;var i=a&&o.proveAncestor(a);t(r.sign,{command:"SSO_UPDATE_BLOCK",ancestorProof:i},n)},o})(W(),void 0,cn(),I()))}(an)),an.exports}var fn,ln=un(),dn=n({__proto__:null,default:r(ln)},[ln]),hn={exports:{}},pn={exports:{}};function vn(){return fn||(fn=1,function(e){var n;n=function(){var e=function(n){if(Array.isArray(n))return n.map(e);if(n instanceof Object){var t=[],r=[];return Object.keys(n).forEach((function(e){/^(0|[1-9][0-9]*)$/.test(e)?t.push(+e):r.push(e)})),t.sort((function(e,n){return e-n})).concat(r.sort()).reduce((function(t,r){return t[r]=e(n[r]),t}),{})}return n},n=JSON.stringify.bind(JSON);return function(t,r,o){var a=n(t,r,0);if(!a||"{"!==a[0]&&"["!==a[0])return a;var i=JSON.parse(a);return n(e(i),null,o)}},e.exports?e.exports=n():JSON.sortify=n()}(pn)),pn.exports}var yn,mn={exports:{}},gn={exports:{}};function En(){return yn||(yn=1,function(e){var n,t,r,o,a,i,s,c;e.exports&&(e.exports=(C(),n=Z(),t=W(),K(),r=Me(),a=(o={}).createData=function(e,r){var o={channel:r||n.createChannelId(),displayName:e["cryptpad.username"],profile:e.profile&&e.profile.view,edPublic:e.edPublic,curvePublic:e.curvePublic,notifications:t.find(e,["mailboxes","notifications","channel"]),avatar:e.profile&&e.profile.avatar,uid:e.uid};return!1===r&&delete o.channel,o},i=o.getFriend=function(e,n){if(n){if(n===e.curvePublic){var t=a(e);return delete t.channel,t}return e.friends?e.friends[n]:void 0}},s=o.getFriendList=function(e){return e.friends||(e.friends={}),e.friends},c=function(e,n){Object.keys(e).forEach((function(t){"me"!==t&&n(e[t],t,e)}))},o.getFriendChannelsList=function(e){var n=[];return c(e.friends,(function(e){n.push(e.channel)})),n},o.declineFriendRequest=function(e,n,t){e.mailbox.sendTo("DECLINE_FRIEND_REQUEST",{},{channel:n.notifications,curvePublic:n.curvePublic},(function(e){t(e)}))},o.acceptFriendRequest=function(e,n,t){var r=i(e.proxy,n.curvePublic)||{},o=a(e.proxy,r.channel||n.channel);e.mailbox.sendTo("ACCEPT_FRIEND_REQUEST",{user:o},{channel:n.notifications,curvePublic:n.curvePublic},(function(e){t(e)}))},o.addToFriendList=function(e,n,t){var o=e.proxy,a=s(o),i=n.curvePublic;i!==o.curvePublic?(a[i]=n,r.whenRealtimeSyncs(e.realtime,(function(){t(),e.pinPads([n.channel],(function(e){e.error&&console.error(e.error)}))}))):t("E_MYKEY")},o.updateMyData=function(e,n){var r=a(e.proxy,!1);e.proxy.friends&&(e.proxy.friends.me=t.clone(r),delete e.proxy.friends.me.channel),e.modules.team&&e.modules.team.updateMyData(r);var o=function(n){n&&n.notifications&&(delete n.user,r.channel=n.channel,e.mailbox.sendTo("UPDATE_DATA",r,{channel:n.notifications,curvePublic:n.curvePublic},(function(e){e&&e.error&&console.error(e)})))};n?o(i(e.proxy,n)):c(e.proxy.friends||{},o)},o.removeFriend=function(e,n,t){var o=e.proxy,a=o.friends[n];a?a.notifications?e.mailbox.sendTo("UNFRIEND",{curvePublic:o.curvePublic},{channel:a.notifications,curvePublic:a.curvePublic},(function(i){i&&i.error?t(i):(e.messenger.onFriendRemoved(n,a.channel),delete o.friends[n],r.whenRealtimeSyncs(e.realtime,(function(){t(i)})))})):t({error:"EINVAL"}):t({error:"ENOENT"})},o))}(gn)),gn.exports}var bn,On,An,wn={exports:{}},Dn={exports:{}},_n={exports:{}};function Tn(){return bn||(bn=1,function(e){var n,t,r,o,a,i,s,c,u,f,l,d;e.exports&&(e.exports=(n=W(),t=I(),r=n.uid,o=n.tryParse,a=function(e,n){var r=t.util.decodeUTF8(JSON.stringify(e));return t.util.encodeBase64(t.sign.detached(r,n))},i=function(e,n,t){if("function"!=typeof t)throw new Error("expected callback");var o=e.network,a=o.historyKeeper;if("string"==typeof a){var i=r(),s=e.pending[i]=function(e,n){t(e,n)};return s.data=n,s.called=0,o.sendto(a,JSON.stringify([i,n]))}t("NO_HISTORY_KEEPER")},s=[],c=[],u=function(e){var n={network:e,connected:!0,anon:void 0,authenticated:[]};return s.push(e),c.push(n),e.on("message",(function(t,r){r===e.historyKeeper&&function(e,n){"string"!=typeof n&&console.error("received non-string message [%s]",n);var t=o(n);if(t){if(Array.isArray(t)&&!/(FULL_HISTORY|HISTORY_RANGE)/.test(t[0])){var r=t[0];"string"==typeof r&&(function(e,n){return!!e.anon&&"function"==typeof e.anon.pending[n]}(e,r)?function(e,n,t){var r=e.pending[n];"ERROR"===t[0]?r(t[1]):r(void 0,t.slice(1)),delete e.pending[n]}(e.anon,r,t.slice(1)):e.authenticated.some((function(e){var n=e.pending[r];return"function"==typeof n&&("ERROR"!==t[1]?(/\|/.test(t[1])&&e.cookie!==t[1]&&(e.cookie=t[1]),n(void 0,t.slice(2)),delete e.pending[r],!0):"NO_COOKIE"===t[2]?(e.send("COOKIE","",(function(t){if(t)return console.error(t),void n(t);e.resend(r)&&delete e.pending[r]})),!0):(n(t[2]),delete e.pending[r],!0))}))||console.error("UNHANDLED RPC MESSAGE",n))}}else console.error(new Error("could not parse message: %s",n))}(n,t)})),e.on("disconnect",(function(){n.connected=!1,n.anon&&(n.anon.connected=!1),n.authenticated.forEach((function(e){e.connected=!1}))})),e.on("reconnect",(function(){n.anon&&(n.anon.connected=!0),n.authenticated.forEach((function(e){e.connected=!0}))})),n},f=function(e){var n;return s.some((function(t,r){return e===t&&(n=r,!0)})),c[n]?c[n]:u(e)},l=function(e,t){if(!e)throw new Error("expected network context");var o,s=t.publicKeyString;return e.authenticated.some((function(e,n){return e.publicKey===s&&(o=n,!0)})),e.authenticated[o]?e.authenticated[o]:function(e,t){var o={network:e.network,publicKey:t.publicKeyString,timeouts:{},pending:{},cookie:null,connected:!0},s=o.send=function(e,r,s){var c=n.mkAsync(s);if(o.connected||"COOKIE"===e){var u=[e,r];o.cookie&&o.cookie.join?u.unshift(o.cookie.join("|")):u.unshift(o.cookie);var f=a(u,t.signKey);return u.unshift(t.publicKeyString),u.unshift(f),i(o,u,c)}c("DISCONNECTED")};return o.resend=function(e){var n=o.pending[e];if(n.called)return console.error("[%s] called too many times",e),!0;n.called++,n.data[2]=o.cookie,n.data[0]=a(n.data.slice(2),t.signKey);var i=r();o.pending[i]=n,delete o.pending[e];try{return o.network.sendto(o.network.historyKeeper,JSON.stringify([i,n.data]))}catch(e){console.log("failed to resend"),console.error(e)}},s.unauthenticated=function(e,r,a){var s=n.mkAsync(a);if(o.connected){var c=[null,t.publicKeyString,null,e,r];return o.cookie&&o.cookie.join?c[2]=o.cookie.join("|"):c[2]=o.cookie,i(o,c,s)}s("DISCONNECTED")},o.destroy=function(){Object.keys(o.timeouts).forEach((function(e){clearTimeout(e)}));var n=e.authenticated.indexOf(o);-1!==n&&e.authenticated.splice(n,1)},e.authenticated.push(o),o}(e,t)},d=function(e){return e.anon||function(e){var t={network:e.network,timeouts:{},pending:{},connected:!0};return e.anon=t,t.send=function(e,r,o){var a=n.mkAsync(o);if(t.connected)return i(t,[e,r],a);a("DISCONNECTED")},t.resend=function(e){var n=t.pending[e];if(n.called)return console.error("[%s] called too many times",e),!0;n.called++;try{return t.network.sendto(t.network.historyKeeper,JSON.stringify([e,n.data]))}catch(e){console.log("failed to resend"),console.error(e)}},t.destroy=function(){Object.keys(t.timeouts).forEach((function(e){clearTimeout(e)})),e.anon=void 0},t}(e)},{create:function(e,r,o,a){if("function"!=typeof a)throw new Error("expected callback");var i,s=n.mkAsync(a);try{if(64!==(i=t.util.decodeBase64(r)).length)throw new Error("private key did not match expected length of 64")}catch(e){return void s(e)}try{if(32!==t.util.decodeBase64(o).length)return void s("expected public key to be 32 uint")}catch(e){return void s(e)}if(e){var c=f(e),u=l(c,{publicKeyString:o,signKey:i});u.send("COOKIE","",(function(e){e?s(e):s(void 0,{send:u.send,destroy:u.destroy})}))}else s("NO_NETWORK")},createAnonymous:function(e,t){var r=n.mkAsync(t);if("function"!=typeof r)throw new Error("expected callback");if(e){var o=d(f(e));r(void 0,{send:o.send,destroy:o.destroy})}else r("NO_NETWORK")}}))}(_n)),_n.exports}function Sn(){return On||(On=1,function(e){var n,t;e.exports&&(e.exports=(n=W(),t=Tn(),{create:function(e,r,o,a){if("function"!=typeof o)throw new Error("Expected callback");var i=n.once(n.mkAsync(o));if(e)if(r){var s=r.edPrivate,c=r.edPublic;s&&c?t.create(e,s,c,(function(e,t){if(e)i(e);else{var r={};r.destroy=t.destroy,r.publicKey=c,r.send=t.send,r.pin=function(e,r){var o=n.once(n.mkAsync(r));Array.isArray(e)?t.send("PIN",e,o):o("[TypeError] pin expects an array")},r.unpin=function(e,r){var o=n.once(n.mkAsync(r));Array.isArray(e)?t.send("UNPIN",e,o):o("[TypeError] pin expects an array")},r.adminRpc=function(e,n){if(e.cmd){var r=[e.cmd,e.data];t.send("ADMIN",r,n)}else setTimeout((function(){n("[TypeError] admin rpc expects a command")}))},r.getServerHash=function(e){t.send("GET_HASH",c,(function(n,t){t&&t[0]?e(n,Array.isArray(t)&&t[0]||void 0):e("NO_HASH_RETURNED")}))},r.reset=function(e,r){var o=n.once(n.mkAsync(r));Array.isArray(e)?t.send("RESET",e,o):o("[TypeError] pin expects an array")},r.getFileListSize=function(e){t.send("GET_TOTAL_SIZE",void 0,(function(n,t){n?e(n):t&&t.length&&"number"==typeof t[0]?e(void 0,t[0]):e("INVALID_RESPONSE")}))},r.updatePinLimits=function(e){t.send("UPDATE_LIMITS",void 0,(function(n,t){n?e(n):t&&t.length&&"number"==typeof t[0]?e(void 0,t[0],t[1],t[2]):e("INVALID_RESPONSE")}))},r.getLimit=function(e){t.send("GET_LIMIT",void 0,(function(n,t){n?e(n):t&&t.length&&"number"==typeof t[0]?e(void 0,t[0],t[1],t[2]):e("INVALID_RESPONSE")}))},r.trimHistory=function(e,r){var o=n.once(n.mkAsync(r));"object"==typeof e&&e.channel&&e.hash?t.send("TRIM_HISTORY",e,(function(e){if(e)return o(e);o()})):o("INVALID_ARGUMENTS")},r.clearOwnedChannel=function(e,n){"string"==typeof e&&32===e.length?t.send("CLEAR_OWNED_CHANNEL",e,(function(e){if(e)return n(e);n()})):n("INVALID_ARGUMENTS")},r.removeOwnedChannel=function(e,n,r){if("string"!=typeof e||-1===[32,48].indexOf(e.length))return console.error("invalid channel to remove",e),void n("INVALID_ARGUMENTS");t.send("REMOVE_OWNED_CHANNEL",{channel:e,reason:r},(function(t,r){t?n(t):r&&r.length&&"OK"===r[0]?(n(),a&&a.clearChannel&&a.clearChannel(e)):n("INVALID_RESPONSE")}))},r.removePins=function(e){t.send("REMOVE_PINS",void 0,(function(n,t){n?e(n):t&&t.length&&"OK"===t[0]?e():e("INVALID_RESPONSE")}))},r.uploadComplete=function(e,n){t.send("UPLOAD_COMPLETE",e,(function(e,t){if(e)n(e);else{var r=t[0];"string"==typeof r?n(void 0,r):n("INVALID_ID")}}))},r.ownedUploadComplete=function(e,n){t.send("OWNED_UPLOAD_COMPLETE",e,(function(e,t){if(e)n(e);else{var r=t[0];"string"==typeof r?n(void 0,r):n("INVALID_ID")}}))},r.uploadStatus=function(e,n){"number"==typeof e?t.send("UPLOAD_STATUS",e,(function(e,t){if(e)n(e);else{var r=t[0];"boolean"==typeof r?n(void 0,r):n("INVALID_RESPONSE")}})):setTimeout((function(){n("INVALID_SIZE")}))},r.uploadCancel=function(e,n){t.send("UPLOAD_CANCEL",e,(function(e){e?n(e):n()}))},r.setMetadata=function(e,n){t.send("SET_METADATA",{channel:e.channel,command:e.command,value:e.value},n)},i(e,r)}})):i("INVALID_KEYS")}else i("INVALID_PROXY");else i("INVALID_NETWORK")}}))}(Dn)),Dn.exports}function xn(){return An||(An=1,function(e){(()=>{const n=(e,n,t,r,o,a,i,s,c,u)=>{var f=function(e,n,t){if(!e.done){if(e.cb(n&&n.error,t,n),e.done=!0,!e.hasNetwork){var o=r.find(e,["network","disconnect"]);"function"==typeof o&&o()}if(e.realtime&&e.realtime.stop)try{e.realtime.stop()}catch(e){console.error(e)}var a=r.find(e,["session","realtime","abort"]);"function"==typeof a&&(e.session.realtime.sync(),a())}},l=function(e,r){u((function(n){var o,a;e.hasNetwork||(o=n((function(e,n){e||(r.network=n)})),a=i.getWebsocketURL(),t.connect(a).then((function(e){o(null,e)}),(function(e){o(e)})))})).nThen((function(){e.realtime=n.start(r)}))},d=function(e,n,t,r){Array.isArray(t)&&t.length&&16===t[0].length&&Array.isArray(n.accessKeys)?(e.network.historyKeeper=t[0],u((function(t){n.accessKeys.forEach((function(n){c.create(e.network,n,t((function(e){console.log("done",n),e&&console.error(e)})))}))})).nThen((function(){r()}))):r(!0)},h=function(n,t){var r;return"string"==typeof n?r=o.getSecrets("pad",n,t.password):"object"==typeof n&&(r=n),r.keys||(r.keys=r.key),{websocketURL:i.getWebsocketURL(t.origin),channel:r.channel,validateKey:r.keys.validateKey||void 0,crypto:e.createEncryptor(r.keys),logLevel:0,initialState:t.initialState,Cache:s}},p=function(e){return"object"==typeof e},v=function(e,n){p(e)&&p(n)&&Object.keys(n).forEach((function(t){e[t]=n[t]}))};return{get:function(e,n,t,r){if("function"!=typeof n)throw new Error("Cryptget expects a callback");r=r||function(){};var o=h(e,t=t||{}),a={cb:n,accessKeys:t.accessKeys,hasNetwork:Boolean(t.network)};o.onRejected=function(e,n){d(o,a,e,n)},o.onReady=function(e){var n=a.session=e.realtime;a.network=e.network,r(1),f(a,void 0,n.getUserDoc())},o.onError=function(e){console.warn(e),f(a,e)},o.onChannelError=function(e){console.error(e),f(a,e)},o.onCacheReady=t.onCacheReady;var i=0;o.onMessage=function(){i++,r(Math.min(.99,i/100))},v(o,t),l(a,o)},put:function(e,n,t,r){if("function"!=typeof t)throw new Error("Cryptput expects a callback");var o=h(e,r=r||{}),i={cb:t,accessKeys:r.accessKeys,hasNetwork:Boolean(r.network)};o.onRejected=function(e,n){d(o,i,e,n)},o.onReady=function(e){var r=i.session=e.realtime;i.network=e.network,r.contentUpdate(n);var o=setTimeout((function(){t(new Error("Timeout"))}),15e3);a.whenRealtimeSyncs(r,(function(){clearTimeout(o);var e=r.getAuthDoc();r.abort(),f(i,void 0,e)}))},o.onChannelError=function(e){f(i,e)},v(o,r),l(i,o)}}};e.exports&&(e.exports=n(C(),y(),v(),W(),Z(),Me(),M(),ie(),Sn(),Ve(),w()))})()}(wn)),wn.exports}var Nn,In={exports:{}},Cn={exports:{}};var Rn,Pn,kn,Mn={exports:{}};function Fn(){return Rn||(Rn=1,function(e){e.exports&&(e.exports=((e,n,t,r,o)=>{var a=function(e){var n=e.store.realtime.getLag().lag||0;return 20*(Math.max(0,n)+300)*(.5+Math.random())},i={},s={},c=function(e,n){var r=e.store.proxy.mutedUsers||{},o=t.find(n,["msg","author"]);return!!o&&Boolean(r[o])},u={};i.FRIEND_REQUEST=function(n,t,r,o){var a=r.msg.content.user||r.msg.content;if(c(n,r))o(!0);else if(u[r.msg.author])o(!0);else{if(u[r.msg.author]={type:t.type,hash:r.hash},e.getFriend(n.store.proxy,r.msg.author)||n.store.proxy.friends_pending[r.msg.author])return delete n.store.proxy.friends_pending[r.msg.author],void e.acceptFriendRequest(n.store,a,(function(t){t&&t.error?o():e.addToFriendList({proxy:n.store.proxy,realtime:n.store.realtime,pinPads:n.pinPads},a,(function(e){if(e)return console.error(e),void o(!0);n.store.messenger&&n.store.messenger.onFriendAdded(a),n.updateMetadata(),o(!0)}))}));o()}},s.FRIEND_REQUEST=function(e,n,t){var r=t.content.user||t.content;u[r.curvePublic]&&delete u[r.curvePublic]};var f={},l={};i.DECLINE_FRIEND_REQUEST=function(e,n,t,r){var o=t.msg.content.user||t.msg.content;o.curvePublic||(o.curvePublic=t.msg.author),setTimeout((function(){r(!0),e.store.proxy.friends_pending[t.msg.author]&&(delete e.store.proxy.friends_pending[t.msg.author],e.updateMetadata(),f[t.msg.author]||n.sendMessage({type:"FRIEND_REQUEST_DECLINED",content:{user:o}},(function(e){f[t.msg.author]={type:n.type,hash:e}})))}),a(e))},i.FRIEND_REQUEST_DECLINED=function(e,n,t,r){e.updateMetadata();var o=t.msg.content.user.curvePublic||t.msg.content.user,a=l[o];delete l[o],f[o]?r(!0,a):(f[o]={type:n.type,hash:t.hash},r(!1,a))},s.FRIEND_REQUEST_DECLINED=function(e,n,t){var r=t.content.user.curvePublic||t.content.user;f[r]&&delete f[r]},i.ACCEPT_FRIEND_REQUEST=function(n,t,r,o){var i=r.msg.content.user||r.msg.content;setTimeout((function(){o(!0),n.store.proxy.friends_pending[r.msg.author]&&(delete n.store.proxy.friends_pending[r.msg.author],e.addToFriendList({proxy:n.store.proxy,realtime:n.store.realtime,pinPads:n.pinPads},i,(function(e){e?console.error(e):(n.store.messenger&&n.store.messenger.onFriendAdded(i),n.updateMetadata(),n.store.modules.profile&&n.store.modules.profile.update(),l[r.msg.author]||t.sendMessage({type:"FRIEND_REQUEST_ACCEPTED",content:{user:i}},(function(e){l[r.msg.author]={type:t.type,hash:e}})))})))}),a(n))},i.FRIEND_REQUEST_ACCEPTED=function(e,n,t,r){e.updateMetadata();var o=t.msg.content.user.curvePublic||t.msg.content.user,a=f[o];delete f[o],l[o]?r(!0,a):(l[o]={type:n.type,hash:t.hash},r(!1,a))},s.FRIEND_REQUEST_ACCEPTED=function(e,n,t){var r=t.content.user.curvePublic||t.content.user;l[r]&&delete l[r]},i.CANCEL_FRIEND_REQUEST=function(e,n,t,r){var o=u[t.msg.author];o?r(!0,o):r(!0)},i.UNFRIEND=function(n,t,r,o){var a=r.msg.author,i=e.getFriend(n.store.proxy,a);i?(delete n.store.proxy.friends[a],delete n.store.proxy.friends_pending[a],n.store.messenger&&n.store.messenger.onFriendRemoved(a,i.channel),n.updateMetadata(),o(!0)):o(!0)},i.UPDATE_DATA=function(e,n,t,r){var o=t.msg,a=o.author,i=e.store.proxy.friends&&e.store.proxy.friends[a];i&&"object"==typeof o.content?(Object.keys(o.content).forEach((function(e){i[e]=o.content[e]})),e.store.messenger&&e.store.messenger.onFriendUpdate(a),e.updateMetadata(),r(!0)):r(!0)};var d=function(e,n){let t=e.store.data.blockHash,a=o.parseBlockHash(t).keys.symmetric;return r.encrypt(n,a)},h={};i.SHARE_PAD=function(e,t,r,o){var a=r.msg,i=r.hash,s=a.content;if(c(e,r))o(!0);else{var u,f=s.isStatic?s.href:n.hrefToHexChannelId(s.href,s.password),l=n.parsePadUrl(s.href),p=l.hashData&&l.hashData.mode||"n/a",v=h[f];if(v){if("edit"===v.mode&&"view"===p)return void o(!0);u=v.data}s.password&&(s.password=d(e,s.password)),h[f]={mode:p,data:{type:t.type,hash:i}},o(!1,u)}},s.SHARE_PAD=function(e,t,r,o){var a=r.content,i=n.hrefToHexChannelId(a.href,a.password),s=h[i];s&&s.data&&s.data.hash===o&&delete h[i]};var p=!1;i.SUPPORT_MESSAGE=function(e,n,t,r){p?r(!0):(p=!0,r())},s.SUPPORT_MESSAGE=function(){p=!1},i.REQUEST_PAD_ACCESS=function(e,n,t,r){var o=t.msg.content;if(c(e,t))r(!0);else{var a=o.channel,i=e.store.manager.findChannel(a);if(i.length){var s,u,f=e.store.proxy.edPublic;i.some((function(e){if(e.data&&Array.isArray(e.data.owners)&&-1!==e.data.owners.indexOf(f)&&e.data.href)return u=e.data.href,s=e.data.filename||e.data.title,!0}))?(o.title=s,o.href=u,r(!1)):r(!0)}else r(!0)}},i.GIVE_PAD_ACCESS=function(e,n,t,r){var o,a=t.msg.content,i=a.channel;e.store.manager.findChannel(i,!0).forEach((function(e){e.data&&!e.data.href&&(o||(o=e.data.filename||e.data.title),e.userObject.setHref(i,null,a.href))})),a.title=o||a.title,r(!1)},i.ADD_TO_ACCESS_LIST=function(e,n,t,r){var o=t.msg.content.channel;e.Store.getAllStores().forEach((function(n){var t=n.manager.findChannel(o);if(t.length){var r=t[0].data,a=t[0].id,i=n.id;e.Store.loadSharedFolder(i,a,r,(function(){}),!1)}})),r(!0)};var v={};i.ADD_OWNER=function(e,n,t,r){var o=t.msg.content;if(c(e,t))r(!0);else{if(!(o.teamChannel||o.href&&o.title&&o.channel))return console.log("Remove invalid notification"),void r(!0);var a=o.channel||o.teamChannel;o.password&&(o.pw=o.password,o.password=d(e,o.password)),v[a]?r(!0):(v[a]={type:n.type,hash:t.hash},r(!1))}},s.ADD_OWNER=function(e,n,t){var r=t.content.channel||t.content.teamChannel;v[r]&&delete v[r]},i.RM_OWNER=function(e,n,t,r){var o=t.msg.content;if(!o.channel&&!o.teamChannel)return console.log("Remove invalid notification"),void r(!0);var a=o.channel||o.teamChannel;if(o.teamChannel){var i=e.store.proxy.teams||{};Object.keys(i).some((function(e){if(i[e].channel===a)return i[e].owner=!1,!0}))}v[a]&&o.pending?r(!1,v[a]):r(!1)};var y={};i.INVITE_TO_TEAM=function(e,n,r,o){var a=r.msg.content;if(c(e,r))o(!0);else{if(!a.team)return console.log("Remove invalid notification"),void o(!0);var i=y[a.team.channel];if(i)return console.log("removing old invitation"),o(!1,i),void(y[a.team.channel]={type:n.type,hash:r.hash});var s=t.find(e,["store","proxy","teams"])||{};Object.keys(s).some((function(e){return s[e].channel===a.team.channel}))?o(!0):(y[a.team.channel]={type:n.type,hash:r.hash},o(!1))}},s.INVITE_TO_TEAM=function(e,n,r){var o=t.find(r,["content","team","channel"]);delete y[o]},i.KICKED_FROM_TEAM=function(e,n,t,r){var o=t.msg.content;if(!o.teamChannel)return console.log("Remove invalid notification"),void r(!0);y[o.teamChannel]&&o.pending?r(!0,y[o.teamChannel]):r(!1)},i.INVITE_TO_TEAM_ANSWER=function(e,n,r,o){var a=r.msg,i=a.content;if(!i.teamChannel)return console.log("Remove invalid notification"),void o(!0);var s,c,u=t.find(e,["store","proxy","teams"])||{};if(Object.keys(u).some((function(e){var n=u[e];if(n.channel===i.teamChannel)return s=e,c=n,!0})),s){if(i.team=c,!i.answer)try{e.store.modules.team.removeFromTeam(s,a.author,!0)}catch(e){console.error(e)}var f=i.user||i;n.sendMessage({type:"INVITE_TO_TEAM_ANSWERED",content:{user:f,team:c,answer:i.answer}},(function(){})),o(!0)}else o(!0)},i.TEAM_EDIT_RIGHTS=function(e,n,r,o){var a=r.msg.content;if(!a.teamData)return console.log("Remove invalid notification"),void o(!0);var i,s=t.find(e,["store","proxy","teams"])||{};if(Object.keys(s).some((function(e){if(s[e].channel===a.teamData.channel)return i=e,!0})),i)try{e.store.modules.team.changeMyRights(i,a.state,a.teamData,(function(e){e||console.error("Can't update team rights"),o(!0)}))}catch(e){console.error(e)}else o(!0)},i.OWNED_PAD_REMOVED=function(e,n,t,r){var o=t.msg.content;if(!o.channel)return console.log("Remove invalid notification"),void r(!0);var a=o.channel;e.store.manager.findChannel(a).forEach((function(n){var t=e.store.manager.findFile(n.id);e.store.manager.delete({paths:t},(function(){e.updateDrive()}))})),r(!0)},i.MOVE_TODO=function(e,n,t,r){var o=e.store.proxy.curvePublic;t.msg.author===o?r():r(!0)},i.SAFE_LINKS_DEFAULT=function(e,n,t,r){var o=e.store.proxy.curvePublic;t.msg.author===o?r():r(!0)};var m={};i.FORM_RESPONSE=function(e,n,t,r){var o,a,i=t.msg,s=t.hash,c=i.content,u=c.channel;if(u)if(function(e,n){return(e.store.proxy.mutedChannels||[]).includes(n)}(e,u))r(!0);else if(e.Store.getAllStores().some((function(e){return e.manager.findChannel(u).some((function(e){if(e.data&&(!a||e.data.href))return a=e.data.href||e.data.roHref,o=e.data.filename||e.data.title,!!e.data.href||void 0}))})),a){c.href=a,c.title=o;var f=m[u],l=f?f.data:void 0;m[u]={data:{type:n.type,hash:s}},r(!1,l)}else r(!0);else r(!0)},s.FORM_RESPONSE=function(e,n,t,r){var o=t.content.channel,a=m[o];a&&a.data&&a.data.hash===r&&delete m[o]};var g={};i.COMMENT_REPLY=function(e,n,r,o){var a=r.msg,i=r.hash,s=a.content;if(t.find(e.store.proxy,["settings","pad","disableNotif"]))o(!0);else{var c,u,f=s.channel;if(f)if(e.Store.getAllStores().some((function(e){return e.manager.findChannel(f).some((function(e){if(e.data&&(!u||e.data.href))return u=e.data.href||e.data.roHref,c=e.data.filename||e.data.title,!!e.data.href||void 0}))})),u){s.href=u,s.title=c;var l=g[f],d=l?l.data:void 0;g[f]={data:{type:n.type,hash:i}},o(!1,d)}else o(!0);else o(!0)}},s.COMMENT_REPLY=function(e,n,t,r){var o=t.content.channel,a=g[o];a&&a.data&&a.data.hash===r&&delete g[o]};var E,b,O={};i.MENTION=function(e,n,t,r){var o=t.msg,a=t.hash,i=o.content;if(c(e,t))r(!0);else{var s=i.channel;if(s){var u,f;e.Store.getAllStores().some((function(e){return e.manager.findChannel(s).some((function(e){if(e.data&&(!f||e.data.href))return f=e.data.href||e.data.roHref,u=e.data.filename||e.data.title,!!e.data.href||void 0}))})),i.href=f,i.title=u;var l=O[s],d=l?l.data:void 0;O[s]={data:{type:n.type,hash:a}},r(!1,d)}else r(!0)}},s.MENTION=function(e,n,t,r){var o=t.content.channel,a=O[o];a&&a.data&&a.data.hash===r&&delete O[o]},i.BROADCAST_MAINTENANCE=function(e,n,t,r){var o=t.msg.uid;e.Store.onMaintenanceUpdate(o),r(!0)},i.BROADCAST_SURVEY=function(e,n,t,r){var o=t.msg,a=o.content,i=o.uid,s=E;E={type:n.type,hash:t.hash},e.Store.onSurveyUpdate(i),r(!a.url,s)},i.BROADCAST_CUSTOM=function(e,n,t,r){var o=t.msg.uid,a=b;b={uid:o,type:n.type,hash:t.hash},r(!1,a)},i.BROADCAST_DELETE=function(e,n,t,r){var o=t.msg.content.uid;if(b&&b.uid===o)return r(!0,b),void(b=void 0);r(!0)};var A,w,D={};return i.SF_DELETED=function(e,n,t,r){var o=t.msg.content,a=o.team,i=o.sfId;if(D[i])r(!0);else if(D[i]=1,a){var s=e.store.proxy.teams[a];o.teamName=s.metadata&&s.metadata.name,r(!1)}else r(!1)},s.SF_DELETED=function(e,n,t){var r=t.content.sfId;delete D[r]},i.NEW_TICKET=function(e,n,r,o){var a=r.msg.content;a.time||(a.time=r.time);var i=t.find(e,["store","modules","support"]);a.isAdmin&&i.addUserTicket(a,o),i.addAdminTicket(a,o)},i.NOTIF_TICKET=function(e,n,r,o){var a=r.msg.content;a.time||(a.time=r.time);var i=t.find(e,["store","modules","support"]);if(a.isAdmin)return t.find(e,["store","proxy","support",a.channel])?(i.updateUserTicket(a),A?void o(!1,A):(A={channel:a.channel,type:n.type,hash:r.hash},void o(!1))):void o(!0);i.checkAdminTicket(a,(s=>{s?(i.updateAdminTicket(a),t.find(e.store.proxy,["settings","general","disableSupportNotif"])?o(!0):w?o(!1,w):(w={channel:a.channel,type:n.type,hash:r.hash},o(!1))):o(!0)}))},s.NOTIF_TICKET=function(e,n,t){var r=t.content.channel;A&&A.channel===r&&(A=void 0),w&&w.channel===r&&(w=void 0)},i.ADD_MODERATOR=function(e,n,r,o){var a=r.msg.content;t.find(e,["store","modules","support"]).updateAdminKey(a,o)},i.MODERATOR_NEW_KEY=function(e,n,r,o){var a=r.msg.content;t.find(e,["store","modules","support"]).updateAdminKey(a,(function(){o(!0)}))},{add:function(e,n,r,o){if(r.msg){var a=t.find(e,["store","proxy","curvePublic"]),s=t.find(r,["msg","content","user","curvePublic"])||t.find(r,["msg","content","curvePublic"]);if(s&&r.msg.author!==s&&r.msg.author!==a)return console.error("blocked"),void o(null,null,!0);var c=r.msg.type;if(i[c])try{i[c](e,n,r,o)}catch(e){console.error(e),o()}else o()}else o(null,null,!0)},remove:function(e,n,t,r){if(t){var o=t.type;if(s[o])try{s[o](e,n,t,r)}catch(e){console.error(e)}}}}})(En(),Z(),W(),C(),un()))}(Mn)),Mn.exports}function Ln(){return Pn||(Pn=1,function(e){(()=>{const n=(e={},n,t,r,o,a,i,s,c)=>{var u={setCustomize:n=>{e=n.Broadcast}},f=["notifications","supportteam","broadcast"],l=[],d="000000000000000000000000000000000",h=function(e,n,t,r,o){e.emit("MESSAGE",{type:n,content:t},r?[r]:e.clients,o)},p=function(e,n,t,r){e.emit("VIEWED",{type:n,hash:t},r||e.clients)},v=function(e){var n=e.store&&e.store.proxy;if(n.curvePrivate&&n.curvePublic)return{curvePrivate:n.curvePrivate,curvePublic:n.curvePublic}},y=u.sendTo=function(e,t,r,a,i){a=a||{};var s=i||function(e){e&&e.error&&console.error(e.error)};if(c.Mailbox){var u=n.find(e,["store","anon_rpc"]);if(u){var f={encrypt:function(e){return e}},l=d,h={uid:n.uid(),type:t,content:r};if(!/^BROADCAST/.test(t)){var p=v(e);if(!p)return void s({error:"missing asymmetric encryption keys"});if(!a||!a.channel||!a.curvePublic)return void s({error:"no notification channel"});if(l=a.channel,f=c.Mailbox.createEncryptor(p),"object"==typeof r&&!r.user){var y=o.createData(e.store.proxy,!1);r.user=y}h={type:t,content:r}}var m=JSON.stringify(h),g=f.encrypt(m,a.curvePublic);if(a.viewed){var E=n.find(e,["store","proxy","teams",a.viewed]);if(E){var b=g.slice(0,64),O=n.find(E,["keys","mailbox","viewed"]);Array.isArray(O)&&O.push(b)}}u.send("WRITE_PRIVATE_MESSAGE",[l,g],(function(e){s(e?{error:e}:{hash:g.slice(0,64)})}))}else s({error:"anonymous rpc session not ready"})}else s({error:"chainpad-crypto is outdated and doesn't support mailboxes."})};u.sendToAnon=function(e,n,t,r,o){var a=c.Nacl,i=a.randomBytes(32),s=a.box.keyPair.fromSecretKey(new Uint8Array(i)),u=a.util.encodeBase64(s.secretKey),f=a.util.encodeBase64(s.publicKey);y({store:{anon_rpc:e,proxy:{curvePrivate:u,curvePublic:f}}},n,t,r,o)};var m=function(e,t,o,a){var s=t.type,c=t.hash;if(/^REMINDER\|/.test(c)){a(),delete e.boxes.reminders.content[c],p(e,s,c,e.clients.filter((function(e){return e!==o})));var u=c.slice(9).split("-")[0],f=n.find(e,["store","proxy","hideReminders",u]);if(!f){var l=e.store.proxy.hideReminders=e.store.proxy.hideReminders||{};f=l[u]=l[u]||[]}var d=c.split("-")[1];d&&!f.includes(d)&&f.push(Number(d))}else{var h=e.boxes[s];if(h){var v,y,m=h.data||{},g=h.history.indexOf(c);-1!==g&&(0===g?(m.lastKnownHash=c,h.history.shift()):-1===m.viewed.indexOf(c)&&m.viewed.push(c));var E=[];h.history.some((function(e,n){if(-1===m.viewed.indexOf(e))return!0;v=n+1,E.push(e),y=e})),m.viewed=m.viewed.filter((function(e){return-1===E.indexOf(e)})),v&&(h.history=h.history.slice(v),m.lastKnownHash=y),Object.keys(h.content).forEach((function(n){-1!==h.history.indexOf(n)&&-1===m.viewed.indexOf(n)||(i.remove(e,h,h.content[n],n),delete h.content[n])})),r.whenRealtimeSyncs(e.store.realtime,(function(){a(),p(e,s,c,e.clients.filter((function(e){return e!==o})))}))}else a({error:"NOT_LOADED"})}},g=function(e,n,t,r,u){u=u||{};var f=e.boxes[n]={channel:t.channel,type:n,queue:[],history:[],content:{},sendMessage:function(n){if("object"==typeof n&&!n.user){var t=o.createData(e.store.proxy,!1);n.user=t}try{n=JSON.stringify(n)}catch(e){console.error(e)}f.queue.push(n)},data:t};if(c.Mailbox){var l=t.keys||v(e);if(l||t.decrypted){var d=t.decrypted?{encrypt:function(e){return e},decrypt:function(e){return e}}:c.Mailbox.createEncryptor(l);f.encryptor=d;var y,g={network:e.store.network,channel:t.channel,noChainPad:!0,crypto:d,owners:"broadcast"===n?[]:u.owners||[e.store.proxy.edPublic],lastKnownHash:t.lastKnownHash};g.onConnectionChange=function(){},g.onConnect=function(t,r){f.sendMessage=function(t,o){var a;o=o||function(){};try{a=JSON.stringify(t)}catch(e){console.error(e)}r(a,(function(r,a){r?console.error(r):(f.history.push(a),t.ctime=+new Date,f.content[a]=t,h(e,n,{msg:t,hash:a}),o(a))}),l.curvePublic)},f.queue.forEach((function(e){f.sendMessage(e)})),f.queue=[]},f.onMessage=g.onMessage=function(r,o,s,c,l,d,p){if(l!==t.lastKnownHash&&l!==y){var v=p&&p.time;y=l;try{r=JSON.parse(r)}catch(e){console.error(e)}if(d&&(r.author=d),f.history.push(l),function(e,n){return-1===(n.viewed||[]).indexOf(e)&&e!==n.lastKnownHash}(l,t)){var g={msg:r,hash:l,time:v},E=f.ready;i.add(e,f,g,(function(t,o,i){o&&m(e,o,"",(function(){console.log("Notification handled automatically")})),i||t?m(e,{type:n,hash:l},"",(function(){console.log("Notification handled automatically")})):(r.ctime=v||0,f.content[l]=r,u.dump||h(e,n,g,null,(function(e){e&&e.msg&&E&&a.system(void 0,e.msg)})))}))}else if(0===Object.keys(f.content).length){t.lastKnownHash=l,f.history=[];var b=t.viewed.indexOf(l);-1!==b&&t.viewed.splice(b,1)}}},g.onReady=function(){var o=[];t.viewed.forEach((function(e,n){-1===f.history.indexOf(e)&&o.push(n)}));for(var a=o.length-1;a>=0;a--)t.viewed.splice(o[a],1);var s=function(t){i.remove(e,f,f.content[t],t),delete f.content[t],p(e,n,t)};e.store.proxy.on("change",["mailboxes",n],(function(e,n,t){var r;"lastKnownHash"===t[2]&&(f.history.some((function(e,t){if(r=t+1,s(e),e===n)return!0})),f.history=f.history.slice(r));"viewed"===t[2]&&s(n)})),f.ready=!0,r(f.content)},f.cpNf=s.start(g)}else console.error("missing asymmetric encryption keys")}else console.error("chainpad-crypto is outdated and doesn't support mailboxes.")};return u.init=function(r,o,s){var c={},u=r.store,v=u.proxy.mailboxes=u.proxy.mailboxes||{},E={Store:r.Store,store:u,pinPads:r.pinPads,updateMetadata:r.updateMetadata,updateDrive:r.updateDrive,mailboxes:v,emit:s,clients:[],boxes:{},req:{},loggedIn:u.loggedIn&&u.proxy.edPublic};return function(n,r){!r.notifications&&n.loggedIn&&(r.notifications={channel:t.createChannelId(),lastKnownHash:"",viewed:[]},n.pinPads([r.notifications.channel],(function(e){e.error&&console.error(e)}))),r.support&&delete r.support,r.broadcast||(r.broadcast={channel:d,lastKnownHash:e.lastBroadcastHash,decrypted:!0,viewed:[]})}(E,v),E.loggedIn&&function(e){var t=e.store.network;t.on("message",(function(r,o){if(o===t.historyKeeper){var a=JSON.parse(r);if(/HISTORY_RANGE/.test(a[0])){var i=a[1],s=e.req[i];if(s){var c=a[0],u=a[2],f=s.box;if("HISTORY_RANGE"===c){if(!Array.isArray(u))return;var l;if("broadcast"===s.box.type)l=n.tryParse(u[4]);else try{var d=f.encryptor.decrypt(u[4]);(l=JSON.parse(d.content)).author=d.author}catch(e){console.log(e)}var h=u[4].slice(0,64);e.emit("HISTORY",{txid:i,time:u[5],message:l,hash:h},[s.cId])}else"HISTORY_RANGE_END"===c&&(e.emit("HISTORY",{txid:i,complete:!0},[s.cId]),delete e.req[i])}}}}))}(E),E.boxes.reminders={content:{}},Object.keys(v).forEach((function(e){if(-1!==f.indexOf(e)){var n=v[e];-1===l.indexOf(e)?g(E,e,n,(function(){})):g(E,e,n,o((function(){})))}})),E.loggedIn&&Object.keys(u.proxy.teams||{}).forEach((function(e){var t=u.proxy.teams[e];if(t){var r=t.keys.mailbox||{};if(r.channel){var o={owners:[n.find(t,["keys","drive","edPublic"])]};g(E,"team-"+e,r,(function(){}),o)}}})),c.post=function(e,n,t){var r=E.boxes[e];r&&r.sendMessage({type:n,content:t,sender:u.proxy.curvePublic})},c.hideMessage=function(e,n){p(E,e,n.hash,E.clients)},c.showMessage=function(e,n,t,r){"reminders"===e&&n&&(E.boxes.reminders.content[n.hash]=n.msg,E.clients.length||(E.boxes.reminders.content[n.hash].requiresNotif=!0),p(E,e,n.hash,E.clients)),h(E,e,n,t,(function(e){a.system(void 0,e.msg),r&&r()}))},c.open=function(e,n,t,r,o){(-1!==f.indexOf(e)||r)&&g(E,e,n,t,o)},c.close=function(e,n){!function(e,n,t){t=t||function(){};var r=e.boxes[n];r?r.cpNf&&"function"==typeof r.cpNf.stop?(r.cpNf.stop(),Object.keys(r.content).forEach((function(t){i.remove(e,r,r.content[t],t),p(e,n,t,e.clients)})),delete e.boxes[n]):t("EINVAL"):t()}(E,e,n)},c.dismiss=function(e,n){m(E,e,"",n)},c.sendTo=function(e,n,t,r){E.loggedIn?y(E,e,n,t,r):r({error:"NOT_LOGGED_IN"})},c.removeClient=function(e){!function(e,n){var t=e.clients.indexOf(n);e.clients.splice(t,1)}(E,e)},c.execCommand=function(e,n,t){var r=n.cmd,o=n.data;"SUBSCRIBE"!==r?"DISMISS"!==r?"SENDTO"!==r?"LOAD_HISTORY"!==r||function(e,n,t,r){var o=e.boxes[t.type];if(o){var a=["GET_HISTORY_RANGE",o.channel,{from:t.lastKnownHash,count:t.count,txid:t.txid}];"broadcast"===t.type&&(a=["GET_HISTORY_RANGE",o.channel,{to:t.lastKnownHash,txid:t.txid}]),e.req[t.txid]={cId:n,box:o};var i=e.store.network;i.sendto(i.historyKeeper,JSON.stringify(a)).then((function(){}),(function(e){console.error(e)}))}else r({error:"ENOENT"})}(E,e,o,t):y(E,o.type,o.msg,o.user,t):m(E,o,e,t):function(e,n,t,r){Object.keys(e.boxes).forEach((function(n){Object.keys(e.boxes[n].content).forEach((function(r){var o={msg:e.boxes[n].content[r],hash:r};h(e,n,o,t,(function(e){e.error||o.msg&&o.msg.requiresNotif&&(a.system(void 0,e.msg),delete o.msg.requiresNotif)}))}))})),-1===e.clients.indexOf(t)&&e.clients.push(t),r()}(E,0,e,t)},c},u};e.exports&&(e.exports=n(void 0,W(),Z(),Me(),En(),(Nn||(Nn=1,function(e){(()=>{const n=(e={})=>{let n=globalThis;var t={};e.requireConf=e.requireConf||{},t.setCustomize=n=>{e=n.ApiConfig};var r=n.location&&n.location.pathname.slice(1,-1),o=-1!==["code","slide","pad","kanban","whiteboard","diagram","sheet","poll","teams","form","doc","presentation"].indexOf(r)?"-"+r:"",a="/customize/favicon/main-favicon"+o+".png?"+e.requireConf.urlArgs,i="/customize/favicon/alt-favicon"+o+".png?"+e.requireConf.urlArgs,s="/customize/favicon/main-favicon"+o+".ico?"+e.requireConf.urlArgs,c="/customize/favicon/alt-favicon"+o+".ico?"+e.requireConf.urlArgs,u=n.document,f=t.isSupported=function(){return"function"==typeof n.Notification&&n.isSecureContext},l=t.hasPermission=function(){return"granted"===Notification.permission},d=t.getPermission=function(e){e=e||function(){},Notification&&"function"==typeof Notification.requestPermission?Notification.requestPermission((function(n){e("granted"===n)})):e(!1)},h=t.create=function(e,t,r){u&&!r?r=u.getElementById("favicon").getAttribute("data-main-favicon")||i:r||(r=i);var o=new Notification(t,{icon:r,body:e});return o.onclick=function(){if(u)try{parent.focus(),n.focus(),this.close()}catch(e){}},o};return t.system=function(e,n,t){if(f())return l()?h(e,n,t):void("denied"!==Notification.permission&&d((function(r){r&&h(e,n,t)})))},u&&!u.getElementById("favicon")&&function(){if(u){console.debug("creating favicon");var e={id:"favicon",type:"image/png",rel:"icon","data-main-favicon":a,"data-alt-favicon":i,href:a};if(!u.getElementById("favicon")){var n=u.createElement("link");Object.keys(e).forEach((function(t){n.setAttribute(t,e[t])})),u.head.appendChild(n)}if(!u.getElementById("favicon-ico")){var t=u.createElement("link");e.href=e.href.replace(/\.png/g,".ico"),e.id="favicon-ico",e.type="image/x-icon",Object.keys(e).forEach((function(n){t.setAttribute(n,e[n])})),u.head.appendChild(t)}}else console.error("document is not available in this context")}(),t.tab=function(e,r){if(u){var o="_pendingTabNotification",f=u.getElementById("favicon"),l=u.getElementById("favicon-ico"),d=a,h=i,p=s,v=c;f&&(d=f.getAttribute("data-main-favicon")||a,h=f.getAttribute("data-alt-favicon")||i,f.setAttribute("href",d)),l&&(p=l.getAttribute("data-main-favicon")||s,v=l.getAttribute("data-alt-favicon")||c,l.setAttribute("href",p));var y=function(e){return!!t[o]&&(n.clearInterval(t[o]),f&&f.setAttribute("href",e?h:d),l&&l.setAttribute("href",e?v:p),!0)};y();var m=function(){f&&f.setAttribute("href",f.getAttribute("href")===d?h:d),l&&l.setAttribute("href",l.getAttribute("href")===p?v:p),--r};return t[o]=n.setInterval((function(){if(r>0)return m();y(!0)}),e),m(),{cancel:y}}console.error("document is not available in this context")},t};e.exports&&(e.exports=n(void 0))})()}(Cn)),Cn.exports),Fn(),y(),C()))})()}(In)),In.exports}function Hn(){return kn||(kn=1,function(e){(()=>{const n=(e,n,t,r,o,a,i={},s,c,u)=>{let f=function(f,l,d,h){var p=f.version||0;c((function(){})).nThen((function(){var n,t,r,o,a;p<2&&(n="cryptpad.userlist-drawer",t="cryptpad.hide_poll_text",r="cryptpad.indentUnit",o="cryptpad.indentWithTabs",a=f.settings=f.settings||{},void 0!==f[r]&&(a.codemirror=a.codemirror||{},a.codemirror.indentUnit=f[r],delete f[r]),void 0!==f[o]&&(a.codemirror=a.codemirror||{},a.codemirror.indentWithTabs=f[o],delete f[o]),void 0!==f[n]&&(a.toolbar=a.toolbar||{},a.toolbar["userlist-drawer"]=f[n],delete f[n]),void 0!==f[t]&&(a.poll=a.poll||{},a.poll["hide-text"]=f[t],delete f[t]),e.send("Migrate-2",!0),f.version=p=2)})).nThen((function(){p<3&&(!function(){if(localStorage.CRYPTPAD_LANG){var e=localStorage.CRYPTPAD_LANG;f.settings.language=e}}(),e.send("Migrate-3",!0),f.version=p=3)})).nThen((function(){var n;p<4&&(n=f.settings=f.settings||{},void 0!==f.allowUserFeedback&&(n.general=n.general||{},n.general.allowUserFeedback=f.allowUserFeedback,delete f.allowUserFeedback),e.send("Migrate-4",!0),f.version=p=4)})).nThen((function(){p<5&&(!function(){var e=f.drive&&f.drive.filesData;if(e)for(var n in e)"number"!=typeof e[n].ctime&&(e[n].ctime=+new Date(e[n].ctime)),"number"!=typeof e[n].atime&&(e[n].atime=+new Date(e[n].atime))}(),e.send("Migrate-5",!0),f.version=p=5)})).nThen((function(t){var r,o,a,i,s;p<6&&(a=f.drive.filesData||{},i=c((function(){})),s=Object.keys(a).length,Object.keys(a).forEach((function(e,t){i=i.nThen((function(i){setTimeout(i((function(){if(r=a[e],o=n.parsePadUrl(r.href),r.href&&!r.channel){var i=n.getSecrets(o.type,o.hash,r.password);r.channel=i.channel,d(6,Math.round(100*t/s)),console.log("Adding missing channel in filesData ",r.channel)}})))}))})),i.nThen(t((function(){e.send("Migrate-6",!0),f.version=p=6}))))})).nThen((function(t){var r,o,a,i,s;p<7&&(a=f.drive.filesData,i=c((function(){})),s=Object.keys(a).length,Object.keys(a).forEach((function(e,t){i=i.nThen((function(i){setTimeout(i((function(){if((r=a[e]).href)if(-1!==r.href.indexOf("#"))if("pad"===(o=n.parsePadUrl(r.href)).hashData.type){if("view"===o.hashData.mode)r.roHref=r.href,delete r.href,console.log("Move href to roHref in filesData ",r.roHref);else{var i=n.getSecrets(o.type,o.hash,r.password),c=n.getViewHashFromKeys(i);c&&(r.roHref="/"+o.type+"/#"+c,console.log("Adding missing roHref in filesData ",r.href))}d(6,Math.round(100*t/s))}else d(7,Math.round(100*t/s));else d(7,Math.round(100*t/s));else d(7,Math.round(100*t/s))})))}))})),i.nThen(t((function(){e.send("Migrate-7",!0),f.version=p=7}))))})).nThen((function(){p<8&&(f.FS_hashes=t.deduplicateString(f.FS_hashes||[]),e.send("Migrate-8",!0),f.version=p=8)})).nThen((function(){p<9&&(!function(){var e=h.network,n={},t={store:h},o=r.createData(f),i=function(e){var t=n[e];if(t){try{t.wc.leave()}catch(e){}delete n[e]}};e.on("message",(function(r,s){try{!function(r,s){if(s===e.historyKeeper){var c=JSON.parse(r);if(!c.validateKey&&!c.owners||!c.channel){if(c.channel&&n[c.channel]){if(c.error&&"EINVAL"===c.error){var u=["GET_HISTORY",c.channel,{}];return void e.sendto(e.historyKeeper,JSON.stringify(u)).then((function(){}),(function(){}))}if(c.state&&1===c.state){o.channel=c.channel;var f=["UPDATE",o.curvePublic,+new Date,o],l=n[c.channel].encrypt(JSON.stringify(f));return n[c.channel].wc.bcast(l).then((function(){}),(function(e){console.error("Can't migrate this friend",n[c.channel].friend,e)})),void i(c.channel)}}else if(c.channel)return;var d=c[3];if(d&&n[d]){var h=n[d],p=h.decrypt(c[4]),v=JSON.parse(p);if("UPDATE"===v[0]){if(v[1]===o.curvePublic)return;var y=v[3];if(!y.notifications)return;h.friend.notifications=y.notifications,o.channel=d,a.sendTo(t,"UPDATE_DATA",o,{channel:y.notifications,curvePublic:y.curvePublic},(function(e){e&&e.error?console.error(e):console.log("friend migrated",h.friend)})),i(d)}}}}}(r,s)}catch(e){console.error(e)}}));var s=f.friends||{};Object.keys(s).forEach((function(t){if(44===t.length){var r=s[t];r.notifications||e.join(r.channel).then((function(t){var o=u.Curve.deriveKeys(r.curvePublic,f.curvePrivate),a=u.Curve.createEncryptor(o);n[r.channel]={wc:t,friend:r,decrypt:a.decrypt,encrypt:a.encrypt};var i={lastKnownHash:r.lastKnownHash},s=["GET_HISTORY",r.channel,i];e.sendto(e.historyKeeper,JSON.stringify(s)).then((function(){}),(function(e){console.error("Can't migrate this friend",r,e)}))}),(function(e){console.error("Can't migrate this friend",r,e)}))}}))}(),e.send("Migrate-9",!0),f.version=p=9)})).nThen((function(t){p<10&&function(){var s=h.proxy.todo;if(s){var u,l=t((function(){e.send("Migrate-10",!0),f.version=p=10})),d={network:h.network,initialState:"{}",metadata:{owners:h.proxy.edPublic?[h.proxy.edPublic]:[]}};c((function(e){o.get(s,e((function(n,t){if(n||!t)return e.abort(),void l();try{u=JSON.parse(t)}catch(e){}})),d)})).nThen((function(e){if(!u||"object"!=typeof u)return e.abort(),void l();var t={content:{data:{1:{id:"1",color:"color6",item:[],title:i.kanban_todo},2:{id:"2",color:"color3",item:[],title:i.kanban_working},3:{id:"3",color:"color5",item:[],title:i.kanban_done}},items:{},list:[1,2,3]},metadata:{title:i.type.todo,defaultTitle:i.type.todo,type:"kanban"}},c=4,p=!1;if((u.order||[]).forEach((function(e){var n=u.data[e];if(n&&n.task){p=!0;var r=n.state?"3":"1";t.content.data[r].item.push(c),t.content.items[c]={id:c,title:n.task},c++}})),!p)return e.abort(),void l();var v=n.createRandomHash("kanban"),y=n.getSecrets("kanban",v),m=n.getSecrets("todo",s);o.put(v,JSON.stringify(t),e((function(t){if(t)return e.abort(),void l();h.rpc&&(h.rpc.pin([y.channel],(function(){})),h.rpc.unpin([m.channel],(function(){})));var o=n.hashToHref(v,"kanban");h.manager.addPad(["root"],{title:i.type.todo,owners:d.metadata.owners,channel:y.channel,href:o,roHref:n.hashToHref(n.getViewHashFromKeys(y),"kanban"),atime:+new Date,ctime:+new Date},e((function(e){if(e)console.error(e);else{delete h.proxy.todo;var n=r.createData(f),t={store:h};a.sendTo(t,"MOVE_TODO",{user:n,href:o},{channel:n.notifications,curvePublic:n.curvePublic},(function(e){e&&e.error&&console.error(e)}))}})))})),d)})).nThen((function(){l()}))}}()})).nThen((function(n){if(!(p>=11)){var o=function(){e.send("Migrate-11",!0),f.version=p=11};if(void 0===t.find(f,["settings","security","unsafeLinks"])){var i={store:h},s=r.createData(f);s.curvePublic?a.sendTo(i,"SAFE_LINKS_DEFAULT",{user:s},{channel:s.notifications,curvePublic:s.curvePublic},n((function(e){e&&e.error?console.error(e):o()}))):o()}else o()}})).nThen((function(){s.whenRealtimeSyncs(h.realtime,t.mkAsync(t.bake(l)))}))};return f.setCustomize=e=>{i=e.Messages},f};e.exports&&(e.exports=n(ge(),Z(),W(),En(),xn(),Ln(),void 0,Me(),Ve(),C()))})()}(mn)),mn.exports}var jn,Kn={exports:{}};function Un(){return jn||(jn=1,function(e){var n,t,r;e.exports&&(e.exports=(n=xn(),t=Le(),Z(),r=Me(),{anonDriveIntoUser:function(e,o,a){o&&e.loggedIn||"function"!=typeof a?n.get(o,(function(n,i){var s;if(n)console.error("Cannot migrate recent pads",n);else if(i){try{s=JSON.parse(i)}catch(e){return"function"==typeof a&&a(),void console.error("Cannot parsed recent pads",e)}if(s){var c=e.proxy,u=t.init(s.drive,{readOnly:!1,loggedIn:!0,outer:!0}),f=function(){u.fixFiles(!0);var n=e.manager;u.getFiles([u.FILES_DATA]).forEach((function(e){var t=u.getFileData(e),r=t.channel,o=n.findChannel(r);if(0===o.length)t&&n.addPad(null,t,(function(e){e&&console.error("Cannot import file:",t,e)}));else{if(!t.href)return;o.forEach((function(e){e.data&&!e.data.href&&e.userObject.setHref(r,null,t.href)}))}})),c.FS_hashes&&Array.isArray(c.FS_hashes)||(c.FS_hashes=[]),-1===c.FS_hashes.indexOf(o)&&c.FS_hashes.push(o),"function"==typeof a&&r.whenRealtimeSyncs(e.realtime,a)};u&&"function"==typeof u.migrate?u.migrate(f):(console.log("oldFo.migrate is not a function"),f())}else"function"==typeof a&&a()}else"function"==typeof a&&a()})):a()}}))}(Kn)),Kn.exports}var Bn=o(ye);const Vn=te.mkEvent(!0),Yn=te.mkEvent(!0),Gn=te.mkEvent(),Jn=te.mkEvent(),Wn={init:e=>{var n;const{broadcast:t,store:r,account:o}=e,a=r.drive=r.drive||{};let i=null===(n=r.proxy)||void 0===n?void 0:n.drive;if(console.error(i,r.proxy),(null==i?void 0:i.hash)||ne.createRandomHash("drive"),!i.hash)return a.proxy=i,o.onAccountCacheReady((()=>{Vn.fire()})),o.onAccountReady((()=>{Yn.fire()})),{channel:"",onDriveCacheReady:Vn.reg,onDriveReady:Yn.reg,onDisconnect:Gn.reg,onReconnect:Jn.reg};throw new Error("NOT IMPLEMENTED")}};var qn,zn=o(Object.freeze({__proto__:null,Drive:Wn})),Qn={exports:{}};function Xn(){return qn||(qn=1,function(e){(()=>{const n=(e,n,t={},r={},o)=>{var a={setCustomize:e=>{t=e.Messages,r=e.AppConfig}},i=r.degradedLimit||8,s=function(e,n){n.degraded||n.clients.forEach((function(t){var r=e.clients[t];if(r){var o={id:r.id,cursor:r.cursor};n.sendMsg(JSON.stringify(o))}}))},c=function(e,n,t){var r=n.members;t.degraded=r.length-1>=i,e.emit("DEGRADED",{degraded:t.degraded},t.clients)},u=function(e,n,t,r){var a=n.channel,i=n.secret;i.keys.cryptKey&&(i.keys.cryptKey=function(e){for(var n=Object.keys(e).length,t=new Uint8Array(n),r=0;r{const n=(e={},n,t,r,o,a,i,s,c,u,f)=>{var l={setCustomize:n=>{e=n.ApiConfig}},d=s.Nacl,h=function(e,n,t,r){let o=Object.keys(e.clients).filter((t=>Boolean(e.clients[t].admin)===n));o.length&&e.emit(t,{channel:r},[o])},p=function(t,r,o,a){var i=n.mkAsync(a);if(r&&!t.adminRdyEvt)return void i("EFORBIDDEN");let s=e.httpUnsafeOrigin;n.fetchApi(s,"config",!0,(e=>{t.moderatorKeys=e.moderatorKeys,t.adminKeys=e.adminKeys;var a=e.supportMailboxKey;if(a){if(!r||n.find(t.store.proxy,["mailboxes","supportteam","keys","curvePublic"])===a)return r?t.adminRdyEvt.reg((()=>{i(null,{supportKey:a,myCurve:o.adminCurvePrivate||n.find(t.store.proxy,["mailboxes","supportteam","keys","curvePrivate"]),theirPublic:o.curvePublic,notifKey:o.curvePublic})})):void i(null,{supportKey:a,myCurve:t.store.proxy.curvePrivate,theirPublic:o.curvePublic||a,notifKey:a});i("EFORBIDDEN")}else i("E_NOT_INIT")}))},v=function(e,t,r,o){var a,c,u=n.once(n.mkAsync(o));i((n=>{p(e,r,t,n(((e,t)=>{if(e)return n.abort(),void u({error:e});a=t.theirPublic,c=t.myCurve})))})).nThen((()=>{var r,o=s.Curve.deriveKeys(a,c),i=s.Curve.createEncryptor(o),l={network:e.store.network,channel:t.channel,noChainPad:!0,crypto:i,owners:[]},d=[];u=n.both((function(){r&&"function"==typeof r.stop&&r.stop()}),u),l.onMessage=function(e,n,t,r,o,a,i){var s=i&&i.time;try{e=JSON.parse(e)}catch(e){return void console.error(e)}e.time=s,a&&(e.author=a),d.push(e)},l.onError=u,l.onChannelError=u,l.onReady=function(){u(null,d)},r=f.start(l)}))},y=function(e,r,o,a){var c=n.find(e,["store","mailbox"]),u=n.find(e,["store","anon_rpc"]);if(c)if(u){var f,l,d,h=r.channel,v=r.title,y=r.ticket,m=+new Date;i((n=>{p(e,o,r,n(((e,t)=>{if(e)return n.abort(),void a({error:e});f=t.supportKey,l=t.theirPublic,d=t.myCurve})))})).nThen((e=>{var n=s.Curve.deriveKeys(l,d),t=s.Curve.createEncryptor(n),r=JSON.stringify(y),o=t.encrypt(r);u.send("WRITE_PRIVATE_MESSAGE",[h,o],e(((n,t)=>{if(n)return e.abort(),void a({error:n});m=t&&t[0]})))})).nThen((n=>{if(o){var t=e.adminDoc.proxy.tickets.active;if(t[h])return n.abort(),void a({error:"EEXISTS"});t[h]={title:y.title,restored:y.legacy,premium:!1,time:m,author:r.name,supportKey:f,lastAdmin:!0,authorKey:r.curvePublic,notifications:r.notifications}}})).nThen((n=>{o||(e.supportData[h]={time:+new Date,title:v,curvePublic:f},e.Store.onSync(null,n()))})).nThen((()=>{var i=o?r.notifications:t.getChannelIdFromKey(f);c.sendTo("NEW_TICKET",{title:v,channel:h,time:m,isAdmin:o,supportKey:f,premium:o?"":n.find(e,["store","account","plan"]),user:n.find(r.ticket,["sender","curvePublic"])?void 0:{supportTeam:!0}},{channel:i,curvePublic:l},(n=>{console.error(n),n&&n.error&&delete e.supportData[h],a(n)})),c.sendTo("NOTIF_TICKET",{title:v,channel:h,time:m,isAdmin:o,isNewTicket:!0,user:n.find(r.ticket,["sender","curvePublic"])?void 0:{supportTeam:!0}},{channel:i,curvePublic:l},(()=>{}))}))}else a({error:"anonymous rpc session not ready"});else a({error:"E_NOT_READY"})},m=function(e,r,o,a){var c,u,f,l,d=n.find(e,["store","mailbox"]),h=n.find(e,["store","anon_rpc"]);d?h?r?.ticket?i((n=>{p(e,o,r,n(((e,t)=>{if(e)return n.abort(),void a(e);c=t.theirPublic,u=t.myCurve,f=t.notifKey})))})).nThen((e=>{var n=s.Curve.deriveKeys(c,u),t=s.Curve.createEncryptor(n),o=JSON.stringify(r.ticket),i=t.encrypt(o);h.send("WRITE_PRIVATE_MESSAGE",[r.channel,i],e(((n,t)=>{if(n)return e.abort(),void a(n);l=t&&t[0],a(void 0,l)})))})).nThen((()=>{var e=o?r.notifChannel:t.getChannelIdFromKey(f);e&&d.sendTo("NOTIF_TICKET",{isAdmin:o,title:r.ticket.title,isClose:r.ticket.close,channel:r.channel,time:l,user:n.find(r.ticket,["sender","curvePublic"])?void 0:{supportTeam:!0}},{channel:e,curvePublic:f},(()=>{}))})):a("E_NO_DATA"):a("anonymous rpc session not ready"):a("E_NOT_READY")},g=function(e,r,o){var a=t.getSecrets("support",r),i={data:{},channel:a.channel,crypto:s.createEncryptor(a.keys),userName:"support",ChainPad:u,classic:!0,network:e.store.network,metadata:{validateKey:a.keys.validateKey||void 0}},f=e.adminDoc=c.create(i);f.proxy.on("ready",(function(){var r=f.proxy;if(r.tickets=r.tickets||{},r.tickets.active=r.tickets.active||{},r.tickets.closed=r.tickets.closed||{},r.tickets.pending=r.tickets.pending||{},e.adminRdyEvt.fire(),o(),!e.supportRpc)return;let a=function(e){if(!e.adminDoc||!e.supportRpc)return;let t=e.adminDoc.metadata&&e.adminDoc.metadata.channel,r=e.adminDoc.proxy.tickets,o=[t,...Object.keys(r.active),...Object.keys(r.pending),...Object.keys(r.closed)];return n.deduplicateString(o).sort()}(e),i=t.hashChannelList(a);e.supportRpc.getServerHash((function(n,t){n?console.warn(n):t!==i&&e.supportRpc.reset(a,(function(e){e&&console.warn(e)}))}))})),f.proxy.on("change",["recorded"],(function(){h(e,!0,"RECORDED_CHANGE","")})),f.proxy.on("remove",["recorded"],(function(){h(e,!0,"RECORDED_CHANGE","")}))},E=function(e,r,a){let s=a(),c=e.store.proxy,u=n.find(c,["mailboxes","supportteam","keys","curvePublic"]),f=n.find(c,["mailboxes","supportteam","keys","curvePrivate"]);r||(e.adminRdyEvt=n.mkEvent(!0)),i((n=>{p(e,!1,{},n(((t,r)=>{if(setTimeout(s),t)n.abort();else if(r.theirPublic!==u){try{delete c.mailboxes.supportteam,e.store.mailbox.close("supportteam")}catch(e){}return delete e.adminRdyEvt,void n.abort()}})))})).nThen((t=>{!function(e,t){let r,a,i=n.mkAsync(t),s=e.store.proxy,c=n.find(s,["mailboxes","supportteam","keys","curvePrivate"]);if(c){try{let e=d.sign.keyPair.fromSeed(d.util.decodeBase64(c));r=d.util.encodeBase64(e.secretKey),a=d.util.encodeBase64(e.publicKey)}catch(e){return void i(e)}o.create(e.store.network,{edPublic:a,edPrivate:r},((n,t)=>{n?i(n):(console.log("Support RPC ready, public key is ",a),e.supportRpc=t,i())}))}else i("EFORBIDDEN")}(e,t((e=>{e&&console.error("Support RPC not ready",e)})))})).nThen((n=>{let r=f.slice(0,24),o=t.getEditHashFromKeys({version:2,type:"support",keys:{editKeyStr:r}});g(e,o,n())})).nThen((()=>{console.log("Support admin loaded")}))};var b=function(e,t,r,o){let a=e.store.proxy,i=n.find(a,["mailboxes","supportadmin"]);i?e.store.mailbox.open("supportadmin",i,(function(t){e.store.mailbox.close("supportadmin",(function(){}));let r=n.clone(t||{}),a=[];Object.keys(r).forEach((n=>{let t=r[n];if("CLOSE"===t.type)return void(a.includes(t.content.id)||a.push(t.content.id));let o=t.author,i=t.content&&t.content.title;((e,n,t)=>{let r=e.adminDoc.proxy;return["active","pending","closed"].some((e=>{let o=r.tickets[e];return Object.keys(o).some((e=>{let r=o[e];return r.authorKey===n&&r.title===t&&r.restored}))}))})(e,o,i)&&(a.includes(t.content.id)||a.push(t.content.id))})),Object.keys(r).forEach((e=>{let n=r[e];n.content&&a.includes(n.content.id)&&delete r[e]})),o(r)}),!0,{dump:!0}):o({error:"ENOENT"})};let O=(e,n,t,r)=>{let o;try{let e=d.sign.keyPair.fromSeed(d.util.decodeBase64(t));o=d.util.encodeBase64(e.publicKey)}catch(e){return void r(e)}e.Store.adminRpc(null,{cmd:"ADMIN_DECREE",data:["SET_SUPPORT_KEYS",[n,o]]},r)},A=(e,n,t,r)=>{e.Store.adminRpc(null,{cmd:"GET_MODERATORS",data:{}},r)};return l.init=function(o,s,c){var u={};if(o.store&&o.store.modules&&o.store.modules.support)return o.store.modules.support;var f=o.store,l=f.proxy.support=f.proxy.support||{},g={moderatorKeys:e.moderatorKeys,adminKeys:e.adminKeys,supportData:l,store:o.store,Store:o.Store,emit:c,clients:{}};return n.find(f,["proxy","mailboxes","supportteam"])&&E(g,!1,s),u.ctx=g,u.removeClient=function(e){delete g.clients[e]},u.leavePad=function(){},u.addAdminTicket=function(e,n){!function(e,n,t){e.adminRdyEvt?e.adminRdyEvt.reg((()=>{let o;i((r=>{p(e,!0,n,r(((e,n)=>{if(e)return r.abort(),void t(!0);o=n.supportKey})))})).nThen((()=>{var a=Math.floor(2e3*Math.random());setTimeout((()=>{var a=e.adminDoc.proxy;a.tickets.active[n.channel]||a.tickets.closed[n.channel]||a.tickets.pending[n.channel]?t(!0):(a.tickets.active[n.channel]={title:n.title,premium:n.premium,time:n.time,author:n.user&&n.user.displayName,supportKey:n.supportKey||o,authorKey:n.user&&n.user.curvePublic},r.whenRealtimeSyncs(e.adminDoc.realtime,(function(){t(!0)})),h(e,!0,"NEW_TICKET",n.channel),e.supportRpc&&e.supportRpc.pin([n.channel],(()=>{})))}),a)}))})):t(!0)}(g,e,n)},u.updateAdminTicket=function(e){!function(e,n){e.adminRdyEvt&&e.adminRdyEvt.reg((()=>{var t=Math.floor(2e3*Math.random());setTimeout((()=>{var t=e.adminDoc.proxy;let r=t.tickets.active[n.channel]||t.tickets.pending[n.channel];r&&(n.time<=r.time||(n.isClose&&(t.tickets.closed[n.channel]=r,delete t.tickets.active[n.channel],delete t.tickets.pending[n.channel]),r.time=n.time,r.lastAdmin=!1,h(e,!0,"UPDATE_TICKET",n.channel)))}),t)}))}(g,e)},u.updateAdminKey=function(e,r){((e,r,o)=>{let a=r.supportKey,s=t.getBoxPublicFromSecret(a),c=e.store.proxy;const u=n.find(c,["mailboxes","supportteam","keys","curvePrivate"]),f=n.find(c,["mailboxes","supportteam","keys","curvePublic"]);p(e,!1,{},((t,r)=>{if(t)return void o(!0);if(s!==r.theirPublic)return void o(!0);if(u===a||f===s)return void o(!0);let c=n.find(e,["store","mailbox"]);try{e.adminDoc&&e.adminDoc.stop(),c&&c.close("supportteam"),e.supportRpc&&e.supportRpc.destroy(),e.adminRdyEvt=n.mkEvent(!0)}catch(e){console.error(e)}e.Store.addAdminMailbox(null,{version:2,priv:a},(n=>{n&&n.error?o(!0):i((n=>{E(e,!0,n),e.adminRdyEvt.reg((()=>{h(e,!0,"UPDATE_RIGHTS"),o(!1)}))}))}))}))})(g,e,r)},u.checkAdminTicket=function(e,n){!function(e,n,t){e.adminRdyEvt?e.adminRdyEvt.reg((()=>{let r=e.adminDoc.proxy,o=r.tickets.active[n.channel]||r.tickets.pending[n.channel];t(o)})):t(!0)}(g,e,n)},u.addUserTicket=function(e,n){!function(e,n,t){if(!e.supportData)return void t(!0);let r=n.channel;e.supportData[r]={time:n.time,title:n.title,curvePublic:n.supportKey},e.Store.onSync(null,(function(){t(!0)}))}(g,e,n)},u.updateUserTicket=function(e){!function(e,n){if(h(e,!1,"UPDATE_TICKET",n.channel),n.isClose){let t=e.supportData[n.channel];if(!t)return;t.closed=!0}}(g,e)},u.execCommand=function(e,o,s){var c=o.cmd,u=o.data;"MAKE_TICKET"!==c?"GET_MY_TICKETS"!==c?"REPLY_TICKET"!==c?"CLOSE_TICKET"!==c?"DELETE_TICKET"!==c?"MAKE_TICKET_ADMIN"!==c?"LIST_TICKETS_ADMIN"!==c?"LOAD_TICKET_ADMIN"!==c?"REPLY_TICKET_ADMIN"!==c?"CLOSE_TICKET_ADMIN"!==c?"MOVE_TICKET_ADMIN"!==c?"GET_RECORDED"!==c?"SET_RECORDED"!==c?"USE_RECORDED"!==c?"SEARCH_ADMIN"!==c?"FILTER_TAGS_ADMIN"!==c?"SET_TAGS_ADMIN"!==c?"GET_LEGACY"!==c?"DUMP_LEGACY"!==c?"CLEAR_LEGACY"!==c?"RESTORE_LEGACY"!==c?"GET_PRIVATE_KEY"!==c?"DISABLE_SUPPORT"!==c?"ROTATE_KEYS"!==c?"ADD_MODERATOR"!==c?s({error:"NOT_SUPPORTED"}):function(e,t,r,o){let a=e.store.proxy;var i=n.find(e,["store","mailbox"]);let s=n.find(a,["mailboxes","supportteam","keys","curvePublic"]),c=n.find(a,["mailboxes","supportteam","keys","curvePrivate"]),u=n.find(a,["mailboxes","supportteam","lastKnownHash"]),f=a.edPublic;p(e,!1,{},((n,r)=>{n?o({error:n}):r.theirPublic===s&&e.moderatorKeys.includes(f)?i.sendTo("ADD_MODERATOR",{supportKey:c,lastKnownHash:u},{channel:t.mailbox,curvePublic:t.curvePublic},(()=>{o()})):o({error:"EFORBIDDEN"})}))}(g,u,0,s):function(e,r,o,s){let c,u=n.once(n.mkAsync(s)),f=e.store.proxy,l=f.edPublic;const h=d.box.keyPair(),v=d.util.encodeBase64(h.publicKey),y=d.util.encodeBase64(h.secretKey),m=n.find(f,["mailboxes","supportteam","keys","curvePrivate"]),g=n.find(f,["mailboxes","supportteam","keys","curvePublic"]);if(!y||!v)return void u({error:"INVALID_KEY"});let b;i((n=>{p(e,!1,{},n(((e,t)=>{if("E_NOT_INIT"!==e)return e?(u({error:e}),void n.abort()):void(c=t.theirPublic)})))})).nThen((n=>{if(!e.adminKeys.includes(l))return n.abort(),void u({error:"EFORBIDDEN"})})).nThen((n=>{if(c)return e.moderatorKeys.includes(l)?g!==c?(n.abort(),void u({error:"EFORBIDDEN"})):void 0:(n.abort(),void u({error:"EINVAL"}))})).nThen((n=>{c&&e.adminRdyEvt.reg((()=>{let r=e.adminDoc.proxy;b=e.adminDoc.metadata&&e.adminDoc.metadata.channel;let o=y.slice(0,24),i=t.getEditHashFromKeys({version:2,type:"support",keys:{editKeyStr:o}}),s={network:e.store.network,initialState:"{}"};(r.oldKeys=r.oldKeys||{})[g]={curvePrivate:m,rotatedOn:+new Date,rotatedBy:l},a.put(i,JSON.stringify(r),n((e=>{if(e)return n.abort(),void u({error:e})})),s)}))})).nThen((n=>{O(e,v,y,n((e=>{if(e&&e.error)return n.abort(),void u(e)})))})).nThen((()=>{if(!c)return;e.adminDoc&&e.adminDoc.stop();let t=n.find(e,["store","mailbox"]);t&&t.close("supportteam"),e.supportRpc&&e.supportRpc.destroy(),e.adminRdyEvt=n.mkEvent(!0)})).nThen((n=>{e.Store.addAdminMailbox(null,{version:2,priv:y},n((t=>{if(t&&t.error)return n.abort(),c?O(e,g,m,(()=>{u(t)})):void u(t)})))})).nThen((t=>{if(!c)return;let r=n.find(e,["store","mailbox"]);A(e,0,0,t((e=>{if(e&&e.error)return void u({success:!0,noNotify:!0});let n=e&&e[0];Object.keys(n||{}).forEach((e=>{let t=n[e];r.sendTo("MODERATOR_NEW_KEY",{supportKey:y},{channel:t.mailbox,curvePublic:t.curvePublic},(()=>{}))}))})))})).nThen((n=>{E(e,!0,n)})).nThen((n=>{b&&e.Store.adminRpc(null,{cmd:"ARCHIVE_DOCUMENT",data:{id:b,reason:"Deprecated support pad"}},n())})).nThen((()=>{u({success:!0})}))}(g,0,0,s):function(e,t,r,o){let a,s=n.once(n.mkAsync(o)),c=e.store.proxy.edPublic;i((n=>{p(e,!1,{},n((e=>{if(e)return s({error:e}),void n.abort()})))})).nThen((n=>{if(!e.adminKeys.includes(c))return n.abort(),void s({error:"EFORBIDDEN"})})).nThen((n=>{e.Store.adminRpc(null,{cmd:"ARCHIVE_SUPPORT",data:{}},n((e=>{if(e&&e.error)return n.abort(),void s(e)})))})).nThen((n=>{e.Store.adminRpc(null,{cmd:"ADMIN_DECREE",data:["SET_SUPPORT_KEYS",["",""]]},n((function(e){if(e&&e.error)return n.abort(),void s(e)})))})).nThen((n=>{A(e,0,0,n((e=>{if(!e||e.error)return n.abort(),void s();a=e[0]||{}})))})).nThen((()=>{let n=i;Object.keys(a).forEach((t=>{n=n((n=>{e.Store.adminRpc(null,{cmd:"REMOVE_MODERATOR",data:t},n((e=>{e&&e.error&&console.error("Error removing moderator data",t,e.error)})))})).nThen})),n((()=>{s()}))}))}(g,0,0,s):function(e,t,r,o){let a=e.store.proxy,i=n.find(a,["mailboxes","supportteam","keys","curvePublic"]),s=n.find(a,["mailboxes","supportteam","keys","curvePrivate"]);p(e,!1,{},((e,n)=>{e?o({error:e}):(i&&n.theirPublic!==i&&(s=void 0),o({curvePrivate:s,curvePublic:n.theirPublic}))}))}(g,0,0,s):function(e,r,o,a){let i=e.store.proxy,s=n.find(i,["mailboxes","supportadmin"]);if(!s)return void a({error:"ENOENT"});if(!e.adminRdyEvt)return void a({error:"EFORBIDDEN"});let c=r.messages,u=r.hashes,f=c[0],l=c[c.length-1];f?e.adminRdyEvt.reg((()=>{let r={name:n.find(f,["sender","name"]),notifications:n.find(f,["sender","notifications"]),curvePublic:n.find(f,["sender","curvePublic"]),channel:t.createChannelId(),title:f.title,time:l.time,ticket:{legacy:!0,title:f.title,sender:f.sender,messages:c}};y(e,r,!0,(n=>{n&&n.error?a(n):(u.forEach((e=>{s.viewed.push(e)})),e.Store.onSync(null,(function(){a({done:!0})})))}))})):a({error:"EINVAL"})}(g,u,0,s):function(e,n,t,r){let o=e.store.proxy;e.store.mailbox.close("supportadmin",(function(){delete o.mailboxes.supportadmin,e.Store.onSync(null,(function(){r({done:!0})}))}))}(g,0,0,s):function(e,t,r,o){let a=e.store.proxy,i=n.find(a,["mailboxes","supportadmin"]);if(!i)return void o({error:"ENOENT"});let s=n.clone(i);s.lastKnownHash=void 0,s.viewed=[],e.store.mailbox.open("supportadmin",s,(function(n){e.store.mailbox.close("supportadmin",(function(){})),o(n)}),!0,{dump:!0})}(g,0,0,s):b(g,0,0,s):((e,n,t,o)=>{e.adminRdyEvt?e.adminRdyEvt.reg((()=>{let t=e.adminDoc.proxy.tickets,a=n.channel;(t.active[a]||t.pending[a]||t.closed[a]).tags=n.tags||[],r.whenRealtimeSyncs(e.adminDoc.realtime,(function(){let e=[];["active","pending","closed"].forEach((n=>{let r=t[n];Object.keys(r).forEach((n=>{(r[n].tags||[]).forEach((n=>{e.includes(n)||e.push(n)}))}))})),o({done:!0,allTags:e})}))})):o({error:"EFORBIDDEN"})})(g,u,0,s):((e,n,t,r)=>{if(!e.adminRdyEvt)return void r({error:"EFORBIDDEN"});let o=n.tags||[];e.adminRdyEvt.reg((()=>{let n=e.adminDoc.proxy.tickets;if(!o.length)return void r({all:!0});let t=[];["active","pending","closed"].forEach((e=>{let r=n[e];Object.keys(r).forEach((e=>{(r[e].tags||[]).some((e=>o.includes(e)))||t.push(e)}))})),r({tickets:t})}))})(g,u,0,s):((e,t,r,o)=>{if(!e.adminRdyEvt)return void o({error:"EFORBIDDEN"});let a=t.tags||[],i=(t.text||"").toLowerCase();e.adminRdyEvt.reg((()=>{let t=e.adminDoc.proxy.tickets,r={},s=(e,t,o)=>{let a=n.clone(t);a.category=o,r[e]=a};["active","pending","closed"].some((e=>{let o=t[e];return Object.keys(o).some((t=>{let c=o[t];if(a.length&&!(c.tags||[]).some((e=>a.includes(e))))return;let u=n.hexToBase64(t).slice(0,10);if(i===u)return r={},s(t,c,e),!0;(!i||c.title.toLowerCase().includes(i))&&s(t,c,e)}))})),o({tickets:r})}))})(g,u,0,s):function(e,n,t,r){if(!e.adminRdyEvt)return void r({error:"EFORBIDDEN"});let o=n.id;e.adminRdyEvt.reg((()=>{let n=e.adminDoc.proxy,t=(n.recorded=n.recorded||{})[o];t&&(t.count=(t.count||0)+1),r()}))}(g,u,0,s):function(e,n,t,o){if(!e.adminRdyEvt)return void o({error:"EFORBIDDEN"});let a=n.id,i=n.content,s=Boolean(n.remove);e.adminRdyEvt.reg((()=>{let n=e.adminDoc.proxy,t=n.recorded=n.recorded||{};s?delete t[a]:t[a]={content:i,count:0},r.whenRealtimeSyncs(e.adminDoc.realtime,(function(){o({done:!0})}))}))}(g,u,0,s):function(e,t,r,o){e.adminRdyEvt?e.adminRdyEvt.reg((()=>{let t=e.adminDoc.proxy,r=t.recorded=t.recorded||{};o({messages:n.clone(r)})})):o({error:"EFORBIDDEN"})}(g,0,0,s):function(e,n,t,o){if(!e.adminRdyEvt)return void o({error:"EFORBIDDEN"});let a=n.channel,i=n.from,s=n.to;e.adminRdyEvt.reg((()=>{let n=e.adminDoc.proxy,t=n.tickets[i],c=n.tickets[s];if(!i||!s)return void o({error:"EINVAL"});let u=t[a];u&&!c[a]?(c[a]=u,delete t[a],r.whenRealtimeSyncs(e.adminDoc.realtime,(function(){o({moved:!0})}))):o({error:"CANT_MOVE"})}))}(g,u,0,s):function(e,n,t,o){if(!e.adminRdyEvt)return void o({error:"EFORBIDDEN"});let a=n.supportKey;e.adminRdyEvt.reg((()=>{let t=e.adminDoc.proxy;t.oldKeys&&t.oldKeys[a]&&(n.adminCurvePrivate=t.oldKeys[a].curvePrivate),m(e,n,!0,(t=>{if(t)o({error:t});else{var a=e.adminDoc.proxy,i=a.tickets.active[n.channel]||a.tickets.pending[n.channel];i.time=+new Date,i.lastAdmin=!0,a.tickets.closed[n.channel]=i,delete a.tickets.active[n.channel],delete a.tickets.pending[n.channel],r.whenRealtimeSyncs(e.adminDoc.realtime,(function(){o({closed:!0})}))}}))}))}(g,u,0,s):function(e,n,t,r){if(!e.adminRdyEvt)return void r({error:"EFORBIDDEN"});let o=n.supportKey;e.adminRdyEvt.reg((()=>{let t=e.adminDoc.proxy;t.oldKeys&&t.oldKeys[o]&&(n.adminCurvePrivate=t.oldKeys[o].curvePrivate),m(e,n,!0,((t,o)=>{if(t)r({error:t});else{var a=e.adminDoc.proxy,i=a.tickets.active[n.channel]||a.tickets.pending[n.channel];i.time=o,i.lastAdmin=!0,r({sent:!0})}}))}))}(g,u,0,s):function(e,t,r,o){let a=t.supportKey;e.adminRdyEvt.reg((()=>{let r=e.adminDoc.proxy;r.oldKeys&&r.oldKeys[a]&&(t.adminCurvePrivate=r.oldKeys[a].curvePrivate),v(e,t,!0,(function(r,a){if(r)return void o({error:r});var i=e.adminDoc.proxy;if(!Array.isArray(a)||!a.length)return void o(a);a.sort(((e,n)=>e.time-n.time));let s=a[a.length-1],c=a.some((e=>{let r=n.find(e,["sender","curvePublic"]);if(t.curvePublic===r)return n.find(e,["sender","quota","plan"])}));var u=i.tickets.active[t.channel];u&&(s.legacy&&(s=Array.isArray(s.messages)&&s.messages[s.messages.length-1]),u.time=s.time,u.premium=c,s.sender&&(u.lastAdmin=!s.sender.blockLocation),s.close&&(i.tickets.closed[t.channel]=u,delete i.tickets.active[t.channel],h(e,!0,"UPDATE_TICKET",t.channel))),o(a)}))}))}(g,u,0,s):function(e,t,r,o){e.adminRdyEvt?(e.clients[r]||(e.clients[r]={admin:!0}),e.adminRdyEvt.reg((()=>{var r=e.adminDoc.proxy;return"pending"===t.type?o(n.clone(r.tickets.pending)):"closed"===t.type?o(n.clone(r.tickets.closed)):void o(n.clone(r.tickets.active))}))):o({error:"EFORBIDDEN"})}(g,u,e,s):function(e,n,t,r){e.adminRdyEvt?e.adminRdyEvt.reg((()=>{y(e,n,!0,r)})):r({error:"EFORBIDDEN"})}(g,u,0,s):function(e,n,t,r){let o=e.supportData,a=n.channel;o[a]&&o[a].closed?(delete o[a],r({deleted:!0})):r({error:"ENOTCLOSED"})}(g,u,0,s):function(e,n,t,r){m(e,n,!1,(e=>{r(e?{error:e}:{closed:!0})}))}(g,u,0,s):function(e,n,t,r){m(e,n,!1,(e=>{r(e?{error:e}:{sent:!0})}))}(g,u,0,s):function(e,t,r,o){var a=[],s=i;e.clients[r]||(e.clients[r]={admin:!1}),Object.keys(e.supportData).forEach((function(t){s=s((r=>{var o=n.clone(e.supportData[t]);v(e,{channel:t,curvePublic:o.curvePublic},!1,r(((n,r)=>{if(n){if("EDELETED"===n.type)return void delete e.supportData[t];o.error=n}else o.messages=r,r.length&&r[r.length-1].close&&(e.supportData[t].closed=!0,o.closed=!0);o.id=t,a.push(o)})))})).nThen})),s((()=>{a.sort(((e,n)=>e.closed&&n.closed?e.time-n.time:e.closed?1:n.closed?-1:e.time-n.time)),o({tickets:a})}))}(g,0,e,s):function(e,n,t,r){y(e,n,!1,r)}(g,u,0,s)},u},l};e.exports&&(e.exports=n(void 0,W(),Z(),Me(),Sn(),xn(),Ve(),C(),g(),w(),y()))})()}($n)),$n.exports}var nt,tt={exports:{}};function rt(){return nt||(nt=1,function(e){(()=>{const n=e=>{var n={},t=function(n,t,r,o){var a=t.channel,i=t.secret;i.keys.cryptKey&&(i.keys.cryptKey=function(e){for(var n=Object.keys(e).length,t=new Uint8Array(n),r=0;r{const n=()=>{var e={},n=function(e,n,t){var r=e.clients[n];if(r){var o=e.channels[r.channel];o?(t(),o.history.forEach((function(t){e.emit("MESSAGE",{msg:t,validateKey:o.validateKey},[n])})),e.emit("HISTORY_SYNCED",{},[n])):t({error:"ENOCHAN"})}else t({error:"ENOENT"})};return e.init=function(e,t){var r={},o={store:e,emit:t,channels:{},clients:{}};return r.removeClient=function(e){!function(e,n){var t,r=function(e){return e!==n};for(var o in e.channels)(t=e.channels[o]).clients=t.clients.filter(r),0===t.clients.length&&(t.wc&&t.wc.leave(),delete e.channels[o]);if(e.clients[n]){var a=e.clients[n].channel,i=e.channels[a];i&&e.emit("LEAVE",{id:n},[i.clients[0]]),delete e.clients[n]}}(o,e)},r.leavePad=function(e){!function(e,n){Object.keys(e.channels).some((function(t){var r=e.channels[t];if(r.padChan===n)return r.wc&&r.wc.leave(),delete e.channels[t],!0}))}(o,e)},r.execCommand=function(e,t,r){var a=t.cmd,i=t.data;"SEND_MESSAGE"!==a?"UPDATE_HASH"!==a?"OPEN_CHANNEL"!==a?"GET_HISTORY"!==a?"REENCRYPT"!==a||function(e,n,t,r){var o=n.channel,a=e.store.network,i=function(e){var t=a.historyKeeper,o={metadata:n.metadata},i=["GET_HISTORY",e.id,o];a.sendto(t,JSON.stringify(i)),n.msgs.forEach((function(n){e.bcast(n)})),e.leave(),r()};e.store.anon_rpc.send("IS_NEW_CHANNEL",o,(function(e,n){var t;e?r({error:e}):(n&&n.length&&"object"==typeof n[0]?t=n[0].isNew:r({error:"INVALID_RESPONSE"}),t?a.join(o).then(i,(function(e){r({error:e})})):r({error:"EEXISTS"}))}))}(o,i,0,r):n(o,e,r):function(e,t,r,o){var a=t.channel,i=t.padChan,s=e.store.network,c=!0,u=e.clients[r];if(u)o();else{u=e.clients[r]={channel:a};var f=e.channels[a];if(f)return u.id||(u.id=f.wc.myID+"-"+r),n(e,r,(function(){e.emit("READY",f.clients,[r])})),f.clients.push(r),void o();var l=Math.floor(1e6*Math.random()),d=function(n){e.channels[a]=e.channels[a]||{history:[],validateKey:t.validateKey},(f=e.channels[a]).padChan=i,u.id||(u.id=n.myID+"-"+r),f.clients&&f.clients.forEach((function(t){e.clients[t]&&(e.clients[t].id=n.myID+"-"+t)})),n.on("join",(function(){})),n.on("leave",(function(){})),n.on("message",(function(n){f.history.push(n),e.emit("MESSAGE",{msg:n,validateKey:f.validateKey},f.clients)})),f.wc=n,f.sendMsg=function(e,t){t=t||function(){};var r=e.slice(0,64);n.bcast(e).then((function(){f.history.push(e),f.lastKnownHash=r,t()}),(function(e){t({error:e})}))},c&&(f.clients=[r],f.lastCpHash=t.lastCpHash,c=!1,o());var d=s.historyKeeper,h={txid:l,lastKnownHash:f.lastKnownHash||f.lastCpHash,metadata:{validateKey:t.validateKey,owners:t.owners,expire:t.expire}},p=["GET_HISTORY",n.id,h];d&&s.sendto(d,JSON.stringify(p)).then((function(){}),(function(e){console.error(e)}))};s.on("message",(function(n,t){if(e.channels[a]&&t===s.historyKeeper){var r;try{r=JSON.parse(n)}catch(e){}if(r&&!(r.txid&&r.txid!==l||r.channel&&r.channel!==a))if(r.validateKey&&r.channel)f.validateKey||(f.validateKey=r.validateKey);else if(r.state&&1===r.state&&r.channel)e.emit("READY",f.clients,f.clients);else if(!(r.error&&r.channel||Array.isArray(r)&&r[0]&&r[0]!==l||(n=r[4],r[3]!==a))){var o=n.slice(0,64);o!==f.lastKnownHash&&o!==f.lastCpHash&&(f.lastKnownHash=o,e.emit("MESSAGE",{msg:n},f.clients),f.history.push(n))}}})),s.join(a).then(d,(function(e){o({error:e})})),s.on("reconnect",(function(){e.channels[a]&&s.join(a).then(d,(function(e){console.error(e)}))}))}}(o,i,e,r):function(e,n,t,r){var o=e.clients[t];if(o){var a=e.channels[o.channel];if(a){var i=n,s=-1;a.history.some((function(e,n){if(e.slice(0,64)===i)return s=n+1,!0})),-1!==s&&(a.history=a.history.slice(s)),r()}else r({error:"INVALID_CHANNEL"})}else r({error:"NOT_IN_CHANNEL"})}(o,i,e,r):function(e,n,t,r){var o=e.clients[t];if(o){var a=e.channels[o.channel];if(a){var i=function(o){o&&o.error?r(o):(e.emit("MESSAGE",{msg:n.msg},a.clients.filter((function(e){return e!==t}))),r())};n.isCp?a.sendMsg(n.isCp,i):a.sendMsg(n.msg,i)}else r({error:"INVALID_CHANNEL"})}else r({error:"NOT_IN_CHANNEL"})}(o,i,e,r)},r},e};e.exports&&(e.exports=n())})()}(at)),at.exports}var st,ct={exports:{}};function ut(){return st||(st=1,function(e){(()=>{const n=(e,n,t,r,o,a,i)=>{var s={};return s.init=function(s,c,u){var f={},l=s.store;if(l.loggedIn&&l.proxy.edPublic){var d={store:l,pinPads:s.pinPads,updateMetadata:s.updateMetadata,emit:u,onReadyHandlers:[],clients:[]};return d.profile=l.proxy.profile=l.proxy.profile||{},function(e,t){var r=e.profile;if(r.edit&&r.view)setTimeout(t);else{var o=n.createRandomHash("profile"),a=n.getSecrets("profile",o);e.pinPads([a.channel],(function(e){e.error?t(e.error):(r.edit=n.getEditHashFromKeys(a),r.view=n.getViewHashFromKeys(a),setTimeout(t))}))}}(d,c((function(r){r||function(r){var s=r.profile,c=n.getSecrets("profile",s.edit),u=a.createEncryptor(c.keys),f={data:{},network:r.store.network,channel:c.channel,crypto:u,owners:[r.store.proxy.edPublic],ChainPad:i,validateKey:c.keys.validateKey||void 0,userName:"profile",classic:!0},l=o.create(f);l.proxy.on("create",(function(){})).on("ready",(function(){l.proxy.name=r.store.proxy[t.displayNameKey]||"",r.listmap=l,l.proxy.curvePublic||(l.proxy.curvePublic=r.store.proxy.curvePublic),l.proxy.notifications||(l.proxy.notifications=e.find(r.store.proxy,["mailboxes","notifications","channel"])),l.proxy.edPublic||(l.proxy.edPublic=r.store.proxy.edPublic),r.onReadyHandlers.length&&(r.onReadyHandlers.forEach((function(e){try{e(l.proxy)}catch(e){console.error(e)}})),r.onReadyHandlers=[])})).on("change",[],(function(){r.emit("UPDATE",l.proxy,r.clients)}))}(d)}))),f.setName=function(e){!function(e,n){e.listmap.proxy.name=n,r.whenRealtimeSyncs(e.listmap.realtime,(function(){e.listmap&&e.emit("UPDATE",e.listmap.proxy,e.clients)}))}(d,e)},f.removeClient=function(e){!function(e,n){var t=e.clients.indexOf(n);-1!==t&&e.clients.splice(t,1)}(d,e)},f.update=function(){d.listmap&&d.emit("UPDATE",d.listmap.proxy,d.clients)},f.execCommand=function(e,n,t){console.log(n);var o=n.cmd,a=n.data;"SUBSCRIBE"!==o?"SET"!==o||function(e,n,t,o){var a=n.key,i=n.value;a&&(e.listmap.proxy[a]=i,r.whenRealtimeSyncs(e.listmap.realtime,(function(){e.emit("UPDATE",e.listmap.proxy,e.clients.filter((function(e){return e!==t}))),o(e.listmap.proxy)})))}(d,a,e,t):function(e,n,t,r){-1===e.clients.indexOf(t)&&e.clients.push(t),e.listmap?r(e.listmap.proxy):e.onReadyHandlers.push((function(e){r(e)}))}(d,0,e,t)},f}},s};e.exports&&(e.exports=n(W(),Z(),K(),Me(),g(),C(),w()))})()}(ct)),ct.exports}var ft,lt={exports:{}},dt={exports:{}};function ht(){return ft||(ft=1,function(e){e.exports&&(e.exports=function(e,n,t,r,o,a){var i={},s=function(e){return Boolean(e&&"object"==typeof e&&!Array.isArray(e))},c=function(e){return e.slice(0,64)},u=function(n,t){var r=e.find(t,[n,"role"]);return-1!==["OWNER","ADMIN"].indexOf(r)},f=function(n,t,r){var o=e.find(r,[n,"role"]);return!!o&&!!function(e){return-1!==["OWNER","ADMIN","MEMBER","VIEWER"].indexOf(e)}(t)&&("OWNER"===o||"ADMIN"===o&&-1!==["ADMIN","MEMBER","VIEWER"].indexOf(t))},l=function(e){return"string"==typeof e&&44===e.length},d=i.commands={};d.ADD=function(e,n,t){if(!s(e))throw new Error("INVALID ARGS");if(!t.internal.initialized)throw new Error("UNITIALIZED");if(void 0===t.state.members)throw new Error("CANNOT_ADD_TO_UNITIALIZED_ROSTER");var r=t.state.members;Object.keys(e).forEach((function(t){if(!l(t))throw console.log(t,t.length),new Error("INVALID_CURVE_KEY");if(!s(e[t]))throw new Error("INVALID_CONTENT");if(r[t])throw new Error("ALREADY_PRESENT");var o=e[t];if("string"!=typeof o.role&&(o.role="MEMBER"),!f(n,o.role,r))throw new Error("INSUFFICIENT_PERMISSIONS");if("string"!=typeof o.displayName)throw new Error("DISPLAYNAME_REQUIRED");if("string"!=typeof o.notifications)throw new Error("NOTIFICATIONS_REQUIRED")}));var o=!1;return Object.keys(e).forEach((function(n){o=!0,r[n]=e[n]})),o},d.RM=function(n,t,r){if(!Array.isArray(n))throw new Error("INVALID_ARGS");if(void 0===r.state.members)throw new Error("CANNOT_RM_FROM_UNITIALIZED_ROSTER");var o=r.state.members;n.forEach((function(n){if(!l(n))throw new Error("INVALID_CURVE_KEY");if(n!==t){var r=o[n].role;if(!function(n,t,r){var o=e.find(r,[n,"role"]);return!!o&&("OWNER"===o||"ADMIN"===o&&-1!==["ADMIN","MEMBER","VIEWER"].indexOf(t))}(t,r,o))throw new Error("INSUFFICIENT_PERMISSIONS")}}));var a=!1;return n.forEach((function(e){o[e]&&(a=!0,delete o[e])})),a},d.DESCRIBE=function(n,t,o){if(!n||"object"!=typeof n||Array.isArray(n))throw new Error("INVALID_ARGUMENTS");if(void 0===o.state.members)throw new Error("NOT_READY");var a=o.state.members;Object.keys(n).forEach((function(r){if(!l(r))throw new Error("INVALID_ID");if(!a[r])throw new Error("NOT_PRESENT");if(!function(n,t,r){if(!r[t])return!1;if(n===t&&r[t])return!0;var o=e.find(r,[n,"role"]),a=e.find(r,[t,"role"]);return!!o&&("OWNER"===o||"ADMIN"===o&&"OWNER"!==a)}(t,r,a))throw new Error("INSUFFICIENT_PERMISSIONS");var o=n[r];if(!s(o))throw new Error("INVALID_ARGUMENTS");var i=e.clone(a[r]);if("string"==typeof o.role&&!function(n,t,r,o){return!(n!==t||!o[t])&&("MEMBER"===e.find(o,[n,"role"])?"VIEWER"===r:void 0)}(t,r,o.role,a)&&!f(t,o.role,a))throw new Error("INSUFFICIENT_PERMISSIONS");if("string"!=typeof i.displayName&&"string"!=typeof o.displayName)throw new Error("DISPLAYNAME_REQUIRED");if(-1===["undefined","string"].indexOf(typeof o.displayName))throw new Error("INVALID_DISPLAYNAME");if("string"!=typeof i.notifications&&"string"!=typeof o.notifications)throw new Error("NOTIFICATIONS_REQUIRED");if(-1===["undefined","string"].indexOf(typeof o.notifications))throw new Error("INVALID_NOTIFICATIONS")}));var i=!1;return Object.keys(n).forEach((function(t){var o=e.clone(a[t]),s=n[t];Object.keys(s).forEach((function(e){void 0===o[e]||null!==s[e]?o[e]=s[e]:delete o[e]})),r(o)!==r(a[t])&&(i=!0,a[t]=o)})),i},d.CHECKPOINT=function(e,n,t){if(!s(e))throw new Error("INVALID_CHECKPOINT_STATE");if(!t.internal.initialized){t.state=e;var o=t.state.metadata=t.state.metadata||{};return o.topic=o.topic||"",o.name=o.name||"",o.avatar=o.avatar||"",t.internal.initialized=!0,!0}if(r(e)!==r(t.state))throw new Error("CHECKPOINT_DOES_NOT_MATCH_PREVIOUS_STATE");if(!u(n,t.state.members))throw new Error("INSUFFICIENT_PERMISSIONS");return t.state=e,!0};var h=["avatar","name","topic"];d.METADATA=function(n,t,r){if(!s(n))throw new Error("INVALID_ARGS");if(!function(n,t){var r=e.find(t,[n,"role"]);return Boolean(r&&-1!==["OWNER","ADMIN"].indexOf(r))}(t,r.state.members))throw new Error("INSUFFICIENT_PERMISSIONS");Object.keys(n).forEach((function(e){if(null===n[e]){if(-1===h.indexOf(e))return;throw new Error("CANNOT_REMOVE_MANDATORY_METADATA")}if("string"!=typeof n[e])throw new Error("INVALID_ARGUMENTS")}));var o=!1;return Object.keys(n).forEach((function(e){void 0!==r.state.metadata[e]&&null===n[e]&&(o=!0,delete r.state.metadata[e]),n[e]!==r.state.metadata[e]&&(o=!0,r.state.metadata[e]=n[e])})),o},d.INVITE=function(e,n,t){if(!s(e))throw new Error("INVALID_ARGS");if(!t.internal.initialized)throw new Error("UNINITIALIED");if(void 0===t.state.members)throw new Error("CANNOT+INVITE_TO_UNINITIALIED_ROSTER");var r=t.state.members;Object.keys(e).forEach((function(t){if(!l(t))throw console.log(t,t.length),new Error("INVALID_CURVE_KEY");if(!s(e[t]))throw new Error("INVALID_CONTENT");if(r[t])throw new Error("ARLEADY_PRESENT");var o=e[t];if("string"!=typeof o.role&&(o.role="VIEWER"),void 0===o.pending&&(o.pending=!0),!f(n,o.role,r))throw new Error("INSUFFICIENT_PERMISSIONS");if("string"!=typeof o.displayName||!o.displayName)throw new Error("DISPLAYNAME_REQUIRED")}));var o=!1;return Object.keys(e).forEach((function(n){o=!0,r[n]=e[n]})),o},d.ACCEPT=function(n,t,r){if(!r.internal.initialized)throw new Error("UNINITIALIED");if(void 0===r.state.members)throw new Error("CANNOT_ADD_TO_UNINITIALIED_ROSTER");var o=r.state.members;if(!s(o[t]))throw new Error("INSUFFICIENT_PERMISSIONS");if(!o[t].pending)throw new Error("ALREADY_PRESENT");if("string"!=typeof n)throw new Error("INVALID_ARGS");if(!l(n))throw new Error("INVALID_CURVE_KEY");var a=n;if(void 0!==o[a])throw new Error("MEMBER_ALREADY_PRESENT");var i=e.clone(o[t]);delete i.remaining,delete i.totalUses,delete i.inviteChannel,delete i.previewChannel,o[a]=i;var c=o[t].remaining||1;return-1===c||(c>1?o[t].remaining=c-1:delete o[t]),!0};var p=function(e,n,t){if(!Array.isArray(e)||"string"!=typeof n)throw new Error("INVALID ARGUMENTS");var r=e[0];if("function"!=typeof d[r])throw new Error("INVALID_COMMAND");return d[r](e[1],n,t)},v=function(n,t,r){return p(n,t,e.clone(r))};return i.create=function(n,i){if("function"!=typeof i)throw new Error("EXPECTED_CALLBACK");var f=e.once(e.mkAsync(i));if(n.network)if(n.channel&&"string"==typeof n.channel&&32===n.channel.length)if(n.keys&&"object"==typeof n.keys)if(n.store){var d=e.response((function(e,n){console.error("ROSTER_RESPONSE__"+e,n)})),h=n.store,y=n.keys,m=y.myCurvePublic,g=n.channel,E=n.lastKnownHash||-1;n.newTeam&&(E=void 0);var b={state:{members:{},metadata:{}},internal:{initialized:!1,sinceLastCheckpoint:0,lastCheckpointHash:E}},O={},A={change:e.mkEvent(),checkpoint:e.mkEvent()};O.on=function(e,n){if("object"!=typeof A[e])throw new Error("unsupported event");return A[e].reg(n),O},O.off=function(e,n){if("object"!=typeof A[e])throw new Error("unsupported event");return A[e].unreg(n),O},O.once=function(e,n){if("object"!=typeof A[e])throw new Error("unsupported event");var t=function(){n.apply(null,Array.prototype.slice.call(arguments)),A[e].unreg(t)};return A[e].reg(t),O},O.getState=function(){return e.clone(b.state)},O.getLastCheckpointHash=function(){return b.internal.lastCheckpointHash||-1};var w=function(){b.internal.pendingCheckpointId&&(d.clear(b.internal.pendingCheckpointId),delete b.internal.pendingCheckpointId),clearTimeout(b.internal.checkpointTimeout),delete b.internal.checkpointTimeout};O.stop=function(){b.internal.cpNetflux&&"function"==typeof b.internal.cpNetflux.stop?(b.internal.cpNetflux.stop(),w()):console.log("FAILED TO LEAVE")};var D,_,T=!1,S=function(){if(n.onCacheReady){var e=b.state;if(Object.keys(e.members||{}).length)n.onCacheReady(O);else{try{b.internal.cpNetflux.resetCache()}catch(e){console.error(e)}n.onCacheReady({error:"CORRUPTED"})}}},x=function(){T=!0,f(void 0,O)},N=function(e){e&&"EUNKNOWN"===e.type||(T?console.error("CHANNEL_ERROR",e):f(e))},I=function(e){e.state||(T=!1)},C=function(){console.log("ROSTER CONNECTED")},R=function(){return Boolean(T&&m)},P=function(n,t,r,o,a,i){b.internal.sinceLastCheckpoint++;var s=e.tryParse(n);if(s){var f,l;try{f=p(s,i,b)}catch(e){l=e.message}var h=c(a);if(d.expected(h)){if(l)return void d.handle(h,[l]);try{f?d.handle(h,[void 0,O.getState()]):(d.handle(h,["NO_CHANGE"]),console.log(n))}catch(e){console.log("CAUGHT",e)}}if("CHECKPOINT"===s[0]&&f?(R()&&A.checkpoint.fire(a),b.internal.sinceLastCheckpoint=0,b.internal.lastCheckpointHash=a):f&&R()&&A.change.fire(),w(),R()&&function(e,n){if(!u(e,n.state.members))return!1;var t=n.internal.sinceLastCheckpoint;return!(!t||"number"!=typeof t||t<25)}(m,b)){var v=1e3*Math.floor(20*Math.random())+5e3;b.internal.checkpointTimeout=setTimeout((function(){b.internal.pendingCheckpointId=O.checkpoint((function(e){e&&console.error(e)}))}),v)}}else console.error("could not parse")},k=function(n,t){var r=e.tryParse(n);return"CHECKPOINT"===r[0]&&v(r,t,b)},M=function(e,n){if(R()){var t=h.anon_rpc;if(t){var o=!1;try{o=v(e,y.myCurvePublic,b)}catch(e){return void n(e.message)}if(o){var a=_.encrypt(r(e)),i=c(a);return d.expect(i,(function(e,t){e?n(e):n(void 0,t,i)}),3e4),t.send("WRITE_PRIVATE_MESSAGE",[g,a],(function(e){if(e)return d.handle(i,[e.message||e])})),i}n("NO_CHANGE")}else n("ANON_RPC_NOT_READY")}else n("NOT_READY")};O.init=function(n,t){var r=e.once(e.mkAsync(t));if(b.internal.initialized)r("ALREADY_INITIALIZED");else if(s(n)){var o=e.clone(n);o.role="OWNER";var a={};a[m]=o,M(["CHECKPOINT",{members:a}],r)}else r("INVALID_ARGUMENTS")},O.checkpoint=function(n){var t=e.once(e.mkAsync(n));M(["CHECKPOINT",e.clone(b.state)],t)},O.add=function(n,t){var r=e.once(e.mkAsync(t));if(!b.internal.initialized)return r("UNINITIALIZED");if(s(n)){var o=e.clone(n);Object.keys(o).forEach((function(e){if(!l(e)||s(b.state.members[e]))return delete o[e]})),M(["ADD",o],r)}else r("INVALID_ARGUMENTS")},O.remove=function(n,t){var r=e.once(e.mkAsync(t)),o=b.state;if(!o)return r("UNINITIALIZED");if(Array.isArray(n)){var a=e.clone(n),i=[],s=Object.keys(o.members);a.forEach((function(e){-1!==s.indexOf(e)&&i.push(e)})),M(["RM",i],r)}else r("INVALID_ARGUMENTS")},O.describe=function(n,t){var r=e.once(e.mkAsync(t)),o=b.state;if(!o)return r("UNINITIALIZED");if(s(n)){var a=e.clone(n);Object.keys(a).some((function(e){var n=a[e];if(s(n)||delete a[e],!s(o.members[e]))return!0;Object.keys(n).forEach((function(t){n[t]===o.members[e][t]&&delete n[t]}))}))?r("INVALID_ARGUMENTS"):M(["DESCRIBE",a],r)}else r("INVALID_ARGUMENTS")},O.metadata=function(n,t){var r=e.once(e.mkAsync(t)),o=b.state.metadata;if(s(n)){var a=e.clone(n);Object.keys(a).forEach((function(e){a[e]===o[e]&&delete a[e]})),M(["METADATA",a],r)}else r("INVALID_ARGUMENTS")},O.invite=function(n,t){var r=e.once(e.mkAsync(t));if(!b.state)return r("UNINITIALIZED");if(!b.internal.initialized)return r("UNINITIALIZED");if(s(n)){var o=e.clone(n);Object.keys(o).forEach((function(e){if(!l(e)||s(b.state.members[e]))return delete o[e]})),M(["INVITE",o],r)}else r("INVALID_ARGUMENTS")},O.accept=function(n,t){var r=e.once(e.mkAsync(t));"string"==typeof n&&l(n)?M(["ACCEPT",n],r):r("INVALID_ARGUMENTS")},o((function(e){h.anon_rpc&&h.anon_rpc.send("GET_METADATA",g,(function(n,t){if(n)return e.abort(),void console.error(n);D=b.internal.metadata=t&&t[0]||void 0}))})).nThen((function(e){if(!n.keys.teamEdPublic&&D&&D.validateKey&&(n.keys.teamEdPublic=D.validateKey),!n.keys.teamEdPublic)return e.abort(),void f("NO_VALIDATE_KEY");try{_=a.Team.createEncryptor(n.keys)}catch(n){return e.abort(),void f(n)}})).nThen((function(){"string"==typeof E&&console.log("Synchronizing from checkpoint"),b.internal.cpNetflux=t.start({lastKnownHash:E,network:n.network,channel:n.channel,crypto:_,validateKey:n.keys.teamEdPublic,owners:n.owners,Cache:n.Cache,isCacheCheckpoint:k,onCacheReady:S,onChannelError:N,onReady:x,onConnect:C,onConnectionChange:I,onMessage:P,noChainPad:!0})}))}else f("EXPECTED_STORE");else f("EXPECTED_CRYPTO_KEYS");else f("EXPECTED_CHANNEL");else f("EXPECTED_NETWORK")},i}(W(),Z(),y(),vn(),Ve(),C()))}(dt)),dt.exports}var pt,vt,yt={exports:{}};function mt(){return vt||(vt=1,function(e){(()=>{const n=(e,n,t,r,o,a,i,s,c,u,f,l,d,h,p,v,y,m,g,E)=>{var b={};E=E||"undefined"!=typeof window&&window.nacl;var O=e.mkEvent(!0),A=function(){},w=function(e,t,r,o){t&&(o||(r.on("change",["drive",a.SHARED_FOLDERS],(function(o,s,c){if(c.length>3&&"password"===c[3]){var u=c[2],f=r.drive[a.SHARED_FOLDERS][u],l=t.manager.user.userObject.getHref?t.manager.user.userObject.getHref(f):f.href,d=n.parsePadUrl(l),h=n.getSecrets(d.type,d.hash,o);return setTimeout((function(){i.updatePassword(e.Store,{oldChannel:h.channel,password:s,href:l},e.store.network,(function(){console.log("Shared folder password changed")}))})),!1}})),r.on("disconnect",(function(){t.offline=!0,t.sendEvent("NETWORK_DISCONNECT",t.id)})),r.on("reconnect",(function(){t.offline=!1,t.sendEvent("NETWORK_RECONNECT",t.id)}))),r.on("change",[],(function(n,r,i){if(o){if(i[0]===a.FILES_DATA&&"object"==typeof r&&r.channel&&!r.owners){var s=[r.channel];r.rtChannel&&s.push(r.rtChannel),r.lastVersion&&s.push(r.lastVersion),t.pin(s,(function(e){e&&e.error&&console.error(e.error)}))}if(i[0]===a.FILES_DATA&&"object"==typeof n&&n.channel&&!r){var c=[n.channel];t.manager.findChannel(n.channel).some((function(e){return e.fId!==o}))||(n.rtChannel&&c.push(n.rtChannel),n.lastVersion&&c.push(n.lastVersion),t.unpin(c,(function(e){e&&e.error&&console.error(e)})))}}n&&!r&&Array.isArray(i)&&(i[0]===a.FILES_DATA||"drive"===i[0]&&i[1]===a.FILES_DATA)&&setTimeout((function(){e.Store.checkDeletedPad(n&&n.channel)})),t.sendEvent("DRIVE_CHANGE",{id:o,old:n,new:r,path:i})})),r.on("remove",[],(function(e,n){t.sendEvent("DRIVE_REMOVE",{id:o,old:e,path:n})})))},D=function(e,n){var t=e.teams[n];if(t){try{t.listmap.stop()}catch(e){}try{t.roster.stop()}catch(e){}t.proxy={},t.stopped=!0,delete e.teams[n],delete e.cache[n],delete e.store.proxy.teams[n],e.emit("LEAVE_TEAM",n,t.clients),e.updateMetadata(),e.store.calendar&&e.store.calendar.closeTeam(n),e.store.mailbox&&e.store.mailbox.close("team-"+n,(function(){}))}},_=function(e,n,t,r){n.rpc?r():t.edPrivate&&t.edPublic?h.create(e.store.network,t,(function(e,t){e?r(e):(n.rpc=t,n&&n.onRpcReadyEvt&&n.onRpcReadyEvt.fire(),r())}),d):r("EFORBIDDEN")},T=function(t,r,a,s,c,u,f){var l=e.once(e.mkAsync(f));if(t.cache[r])l();else{var d=a.proxy,h={id:r,proxy:d,listmap:a,clients:[],realtime:a.realtime,handleSharedFolder:function(e,n){!function(e,n,t,r){var o=e.teams[n];o&&(r?(o.sharedFolders[t]=r,w(e,o,r.proxy,t)):delete o.sharedFolders[t])}(t,r,e,n)},sharedFolders:{},roster:s,onRpcReadyEvt:e.mkEvent(!0),offline:!0};t.cache[r]=h,u&&h.clients.push(u),s.on("change",(function(){var n=s.getState(),o=e.find(t,["store","proxy","curvePublic"]);if(n.members&&Object.keys(n.members).length)if(n.members[o]){var a=e.find(t,["store","proxy","teams",r]);a&&(a.metadata=n.metadata),t.updateMetadata(),t.emit("ROSTER_CHANGE",r,h.clients)}else D(t,r);else console.error(JSON.stringify(n))})),s.on("checkpoint",(function(n){e.find(t,["store","proxy","teams",r,"keys","roster"]).lastKnownHash=n})),h.sendEvent=function(e,n,r){t.emit(e,n,h.clients.filter((function(e){return e!==r})))},h.getChatData=function(){var e=c.chat||{},t=e.edit||e.view;if(!t)return{};var o=n.getSecrets("chat",t);return{teamId:r,channel:o.channel,secret:o,validateKey:e.validateKey}},h.pin=function(e,n){c.drive.edPrivate?h.rpc?("function"!=typeof n&&console.error("expected a callback"),h.rpc.pin(e,(function(e,t){n(e?{error:e}:{hash:t})}))):n({error:"TEAM_RPC_NOT_READY"}):n({error:"EFORBIDDEN"})},h.unpin=function(e,n){c.drive.edPrivate?h.rpc?("function"!=typeof n&&console.error("expected a callback"),h.rpc.unpin(e,(function(e,t){n(e?{error:e}:{hash:t})}))):n({error:"TEAM_RPC_NOT_READY"}):n({error:"EFORBIDDEN"})};var p=t.store.proxy.teams[h.id],v=p.hash||p.roHash,y=n.getSecrets("team",v,p.password),m=h.manager=o.create(d.drive,{onSync:function(e){t.Store.onSync(r,e)},edPublic:c.drive.edPublic,pin:h.pin,unpin:h.unpin,loadSharedFolder:function(e,n,r,o){i.load({isNew:o,network:t.store.network||t.store.networkPromise,store:h,isNewChannel:t.Store.isNewChannel,Store:t.Store},e,n,r)},settings:{drive:e.find(t.store,["proxy","settings","drive"])},removeOwnedChannel:function(e,n){var o;"object"==typeof e?(e.teamId=r,o=e):o={channel:e,teamId:r},t.Store.removeOwnedChannel("",o,n)},Store:t.Store,store:t.store},{teamId:h.id,outer:!0,edPublic:c.drive.edPublic,loggedIn:!0,log:function(e){h.sendEvent("DRIVE_LOG",e)},rt:h.realtime,editKey:y.keys.secondaryKey,readOnly:Boolean(!y.keys.secondaryKey)});h.secondaryKey=y&&y.keys.secondaryKey,h.userObject=m.user.userObject,g((function(e){t.teams[r]=h,w(t,h,d);var n=t.store.network||t.store.networkPromise;i.loadSharedFolders(t.Store,n,h,h.proxy.drive,h.userObject,e,(function(e){t.progress+=70/(t.numberOfTeams*e.max),t.updateProgress({progress:t.progress})}),!0)})).nThen((function(){t.store.modules.calendar&&t.store.modules.calendar.openTeam(r),l()}))}},S=function(t,r,o,a,s,c,u){var f,l=a.getState(),d=e.find(t,["store","proxy","teams",r]);d&&(d.metadata=l.metadata),delete t.nocache[r],t.store.proxy.teams[r]&&g((function(e){T(t,r,o,a,s,c,e()),f=t.teams[r]||t.cache[r],s.drive.edPrivate&&_(t,f,s.drive,e((function(){})))})).nThen((function(e){f.userObject.fixFiles(),i.checkMigration(f.secondaryKey,f.proxy?.drive,f.userObject,e()),i.loadSharedFolders(t.Store,t.store.network,f,f.proxy?.drive,f.userObject,e,(function(e){t.progress+=70/(t.numberOfTeams*e.max),t.updateProgress({progress:t.progress})}))})).nThen((function(){if(f.rpc){var o=function(n,t){var r=n.teams[t];if(!r)return null;var o=r.manager.getChannelsList("pin"),a=n.store.proxy.teams[t];o.push(`${a.channel}#drive`);var i=e.find(a,["keys","chat","channel"]),s=e.find(a,["keys","roster","channel"]),c=e.find(a,["keys","mailbox","channel"]);if(i&&o.push(i),s&&o.push(s),c&&o.push(c),r.proxy.calendars){var u=Object.keys(r.proxy.calendars).map((function(e){return r.proxy.calendars[e].channel}));o=o.concat(u)}var f=r.roster.getState();return f.members&&Object.keys(f.members).forEach((function(e){var n=f.members[e];n.inviteChannel&&n.pending&&o.push(n.inviteChannel),n.previewChannel&&n.pending&&o.push(n.previewChannel)})),o.sort(),o}(t,r),a=n.hashChannelList(o);f.rpc.getServerHash((function(e,n){e?console.warn(e):n!==a&&f.rpc.reset(o,(function(e){e&&console.warn(e)}))}))}})).nThen((function(){f.offline=!1,t.onReadyHandlers[r]&&t.onReadyHandlers[r].forEach((function(e){("function"==typeof e.cb&&e.cb(),e.cId)&&(-1===f.clients.indexOf(e.cId)&&f.clients.push(e.cId))})),delete t.onReadyHandlers[r],t.store.modules.calendar&&t.store.modules.calendar.openTeam(r),u()}))},x=function(e,n,t,r,o,a){var i=function(){(e.cache[n]||e.teams[n])&&D(e,n),delete e.store.proxy.teams[n],delete e.onReadyHandlers[n],o.abort(),a({error:"ENOENT"})};t&&e.store.anon_rpc.send("IS_NEW_CHANNEL",t,o((function(e,n){n&&n.length&&"object"==typeof n[0]&&n[0].isNew&&i()}))),r&&e.store.anon_rpc.send("IS_NEW_CHANNEL",r,o((function(e,n){n&&n.length&&"object"==typeof n[0]&&n[0].isNew&&i()})))},N=function(t,r,o,a,i){var f=e.once(e.mkAsync(a)),l=r.hash||r.roHash,h=n.getSecrets("team",l,r.password),y=v.createEncryptor(h.keys);r.roHash||(r.roHash=n.getViewHashFromKeys(h));var E,b,A=r.keys;if(!A.chat.validateKey&&A.chat.edit){var w=n.getSecrets("chat",A.chat.edit);A.chat.validateKey=w.keys.validateKey}var _={curvePublic:t.store.proxy.curvePublic,curvePrivate:t.store.proxy.curvePrivate},N=A.roster||{},I=N.edit?v.Team.deriveMemberKeys(N.edit,_):v.Team.deriveGuestKeys(N.view||"");g((function(e){if(i)return d.getChannelCache(h.channel,e((function(n,t){t&&t.c||(e.abort(),f({error:"NOCACHE"}))}))),void d.getChannelCache(I.channel,e((function(n,t){var r=t&&t.c,o=t&&t.k;o&&!I.teamEdPublic&&(I.teamEdPublic=o),r||(e.abort(),f({error:"NOCACHE"}))})));t.Store.onReadyEvt.reg((()=>{x(t,o,h.channel,I.channel,e,f)}))})).nThen((function(n){var a={lm:!1,roster:!1,check:function(){this.lm&&this.roster&&i&&(t.progress+=30/t.numberOfTeams,t.updateProgress({progress:t.progress}),T(t,o,b,E,A,null,n(f)),this.check=function(){})}},u={data:{},readOnly:!Boolean(h.keys.signKey),network:t.store.network||t.store.networkPromise,channel:h.channel,crypto:y,ChainPad:m,Cache:d,metadata:{validateKey:h.keys.validateKey||void 0},userName:"team",classic:!0,onMetadataUpdate:function(){var e=t.teams[o];e&&t.emit("ROSTER_CHANGE",o,e.clients)}};(b=p.create(u)).proxy.on("cacheready",(function(){a.lm=!0,a.check()})),b.proxy.on("ready",n()),b.proxy.on("error",(function(e){e&&void 0!==e.loaded&&!e.loaded&&f({error:"ECONNECT"}),e&&e.error&&"EDELETED"===e.error&&D(t,o)})),s.create({network:t.store.network||t.store.networkPromise,channel:I.channel,keys:I,store:t.store,lastKnownHash:N.lastKnownHash,onCacheReady:function(e){if(i){if(e&&"CORRUPTED"===e.error)return console.error("Corrupted roster cache, cant load this team offline",r),b&&"function"==typeof b.stop&&b.stop(),n.abort(),void f({error:"CACHE_CORRUPTED_ROSTER"});E=e,a.roster=!0,a.check()}},Cache:d},n((function(r,o){if(r)return n.abort(),console.error(r),void f({error:"ROSTER_ERROR"});E=o,N.lastKnownHash=E.getLastCheckpointHash();var a=E.getState(),i=e.find(t,["store","proxy","curvePublic"]);a.members[i]&&O.reg((function(){if(N.edit){var e={},n=c.createData(t.store.proxy,!1);n.pending=!1,e[t.store.proxy.curvePublic]=n,E.describe(e,(function(e){e&&"NO_CHANGE"!==e&&console.error(e)}))}}))})))})).nThen((function(n){var a=E.getState(),i=e.find(t,["store","proxy","curvePublic"]);if(!a.members||!Object.keys(a.members).length)return b.stop(),E.stop(),b.proxy={},f({error:"EINVAL"}),n.abort(),console.error(JSON.stringify(a)),void u.send("ROSTER_CORRUPTED");if(!a.members[i])return b.stop(),E.stop(),b.proxy={},delete t.store.proxy.teams[o],t.updateMetadata(),f({error:"EFORBIDDEN"}),void n.abort();var s=a.members[i],c=e.find(r,["keys","drive","edPrivate"]);if(r.hash&&c||-1===["ADMIN","MEMBER"].indexOf(s.role))r.hash&&c||"OWNER"!==s.role||u.send("TEAM_RIGHTS_OWNER");else{console.warn("Missing edit rights: demote to viewer");var l={};l[t.store.proxy.curvePublic]={role:"VIEWER"},E.describe(l,(function(e){u.send("TEAM_RIGHTS_FIXED"),delete r.hash,delete r.keys.drive.edPrivate,delete r.keys.chat.edit,e&&"NO_CHANGE"!==e&&console.error(e)}))}})).nThen((function(){i||(t.progress+=30/t.numberOfTeams,t.updateProgress({progress:t.progress})),S(t,o,b,E,A,null,f)}))},I=function(n,t,r,o){var a=t.team;if(!((a.hash||a.roHash)&&a.channel&&a.password&&a.keys&&a.metadata))return void o({error:"EINVAL"});let i=n.store.proxy.teams;if(Object.values(i).some((e=>e.channel===a.channel)))o({error:"EEXISTS"});else{var s=e.createRandomInteger();n.store.proxy.teams[s]=a,n.onReadyHandlers[s]=[],N(n,a,s,(function(e){e&&e.error||console.debug("Team joined:"+s);var t=n.store.proxy.teams[s];n.store.mailbox.open("team-"+s,t.keys.mailbox,(function(){}),!0,{owners:t.keys.drive.edPublic}),n.updateMetadata(),o(e)}))}},C=function(n,t,r){var o=e.find(n,["store","proxy","teams",t]);if(!o)return{};var a=e.clone(o);return r||(delete a.hash,delete a.keys.drive.edPrivate,delete a.keys.chat.edit),delete a.owner,a},R=function(t,r,o){if(!r)return!0;var a=e.find(t,["store","proxy","teams",r]);if(!a)return!0;var s=t.teams[r];if(!s)return!0;var c=n.getSecrets("team",o||a.roHash,a.password);if(i.upgrade(a.channel,c),s.userObject&&s.userObject.setReadOnly(!c.keys.secondaryKey,c.keys.secondaryKey),c.keys.secondaryKey)try{t.store.modules.calendar.upgradeTeam(r)}catch(e){console.error(e)}!c.keys.secondaryKey&&s.rpc&&s.rpc.destroy();var u=e.find(s,["proxy","drive","sharedFolders"]);Object.keys(u||{}).forEach((function(t){var r=s.manager.getSharedFolderData(t),o=n.parsePadUrl(r.href||r.roHref),a=n.getSecrets(o.type,o.hash,r.password);i.upgrade(a.channel,a);var c=e.find(s,["manager","folders",t,"userObject"]);c&&c.setReadOnly(!a.keys.secondaryKey,a.keys.secondaryKey)})),t.updateMetadata(),t.emit("ROSTER_CHANGE_RIGHTS",r,s.clients)},P=function(t,r,o,a,i){if(r){var s=e.find(t,["store","proxy","teams",r]);if(s){var c=t.onReadyHandlers[r],u=t.teams[r];if(s.channel===a.channel&&s.password===a.password)if(o?(s.hash=a.hash,s.keys.drive.edPrivate=a.keys.drive.edPrivate,s.keys.chat.edit=a.keys.chat.edit):(delete s.hash,delete s.keys.drive.edPrivate,delete s.keys.chat.edit),u||!Array.isArray(c))if(u){if(o){_(t,u,s.keys.drive,(function(){u.manager.addPin(u.pin,u.unpin)}));var f=n.getSecrets("team",a.hash,s.password);u.secondaryKey=f&&f.keys.secondaryKey;var l=v.createEncryptor(f.keys);u.listmap.setReadOnly(!1,l)}else delete u.secondaryKey,u.rpc&&u.rpc.destroy&&u.rpc.destroy(),u.manager.removePin(),u.listmap.setReadOnly(!0);R(t,r,a.hash),i(!0)}else i(!1);else c.push({cb:function(){P(t,r,o,a,i)}});else i(!1)}else i(!1)}else i(!1)},k=function(n,t,r,o,a){t?e.find(n,["store","proxy","teams",t])&&n.teams[t]?n.store.mailbox.sendTo("TEAM_EDIT_RIGHTS",{state:o,teamData:C(n,t,o)},{channel:r.notifications,curvePublic:r.curvePublic},a):a({error:"ENOENT"}):a({error:"EINVAL"})},M=function(n,t,r,o){var a=t.teamId;if(a){var i=e.find(n,["store","proxy","teams",a]),s=n.teams[a];if(i&&s)if(s.roster)if(t.curvePublic&&t.data){var c,u=s.roster.getState().members[t.curvePublic];g((function(e){n.Store.getPadMetadata(null,{channel:i.channel},e((function(e){c=e&&e.error?s.listmap.metadata||{}:e})))})).nThen((function(){if(u.pendingOwner=Array.isArray(c.pending_owners)&&-1!==c.pending_owners.indexOf(u.edPublic),"OWNER"!==u.role||"OWNER"===t.data.role){"VIEWER"===u.role&&"VIEWER"!==t.data.role&&k(n,a,u,!0,(function(e){o(e)})),"VIEWER"!==u.role&&"VIEWER"===t.data.role&&k(n,a,u,!1,(function(e){o(e)}));var r={};r[t.curvePublic]=t.data,s.roster.describe(r,(function(e){e?o({error:e}):o()}))}else!function(n,t,r,o){var a=e.once(o);if(t){var i=e.find(n,["store","proxy","teams",t]);if(i){var s=n.teams[t];if(s){var c=r.pendingOwner;g((function(t){var o=c?"RM_PENDING_OWNERS":"RM_OWNERS",s=function(e){var n=e&&e.error;if(n)return console.error(n),t.abort(),void a(n)},u=function(e){n.Store.setPadMetadata(null,{channel:e,command:o,value:[r.edPublic]},t(s))};u(i.channel),u(e.find(i,["keys","roster","channel"])),u(e.find(i,["keys","chat","channel"]))})).nThen((function(e){var n={};n[r.curvePublic]={role:"ADMIN",pendingOwner:!1},s.roster.describe(n,e((function(e){e&&console.error(e)})))})).nThen((function(e){n.store.mailbox.sendTo("RM_OWNER",{teamChannel:i.channel,title:i.metadata.name,pending:c},{channel:r.notifications,curvePublic:r.curvePublic},e())})).nThen((function(){a()}))}else a({error:"ENOENT"})}else a({error:"ENOENT"})}else a({error:"EINVAL"})}(n,a,u,(function(e){e?(console.error(e),o({error:e})):o()}))}))}else o({error:"MISSING_DATA"});else o({error:"NO_ROSTER"});else o({error:"ENOENT"})}else o({error:"EINVAL"})},F=function(e,n){Object.keys(e.onReadyHandlers).forEach((function(t){var r=-1;e.onReadyHandlers[t].some((function(e,t){if(e.cId===n)return r=t,!0})),-1!==r&&e.onReadyHandlers[t].splice(r,1)})),Object.keys(e.teams).forEach((function(t){var r=e.teams[t].clients,o=r.indexOf(n);-1!==o&&r.splice(o,1)}))},L=function(n,t,r,o){var a,i=t.seeds;try{a=f.derivePreviewKeys(i.preview)}catch(e){return void o({error:"INVALID_SEEDS"})}l.get({channel:a.channel,type:"pad",version:2,keys:{cryptKey:a.cryptKey}},(function(n,t){if(n)o({error:n});else if(t){var r=e.tryParse(t);o(r||{error:"parseError"})}else o({error:"DELETED"})}),{network:n.store.network,initialState:"{}"})},H=function(n,t,r,o){var a,i;g((function(r){!function(n,t,r,o){var a,i=t.bytes64;try{a=f.deriveInviteKeys(i)}catch(e){return void o({error:"INVALID_SEEDS"})}l.get({channel:a.channel,type:"pad",version:2,keys:{cryptKey:a.cryptKey}},(function(n,t){if(n)o({error:n});else if(t){var r=e.tryParse(t);o(r||{error:"parseError"})}else o({error:"DELETED"})}),{network:n.store.network,initialState:"{}"})}(n,t,0,r((function(e){if(e&&e.error)return r.abort(),void o(e);a=e})))})).nThen((function(t){var r=e.find(a,["teamData","channel"]),u=n.store.proxy.teams||{};if(Object.keys(u).some((function(e){return u[e].channel===r})))return t.abort(),void o({error:"ALREADY_MEMBER"});var f=e.find(a,["teamData","keys","roster"]),l=a.ephemeral;if(!f||!l)return t.abort(),void o({error:"INVALID_INVITE_CONTENT"});var h=v.Team.deriveMemberKeys(f.edit,l);s.create({network:n.store.network||n.store.networkPromise,channel:f.channel,keys:h,store:n.store,Cache:d},t((function(e,r){if(e)return t.abort(),console.error(e),void o({error:"ROSTER_ERROR"});var a=c.createData(n.store.proxy,!1),s=r.getState();i=s.members[l.curvePublic],r.accept(a.curvePublic,t((function(e){if(r.stop(),e)return t.abort(),console.error(e),void o({error:"ACCEPT_ERROR"})})))})))})).nThen((function(){var e={};i.remaining&&1!==i.remaining||_(n,e,a.ephemeral,(function(n){if(!n){var t=e.rpc;i.inviteChannel&&t.removeOwnedChannel(i.inviteChannel,(function(e){e&&console.error(e)})),i.previewChannel&&t.removeOwnedChannel(i.previewChannel,(function(e){e&&console.error(e)}))}})),I(n,{team:a.teamData},0,o)}))},j=function(n){if(n){if(n.keys&&n.keys.mailbox)return n.keys.mailbox;var t=e.find(n,["keys","roster","edit"]);if(t){var r=E.hash(E.util.decodeUTF8(t)),o=r.slice(0,32),a=e.uint8ArrayToHex(r.slice(32,48)),i=E.box.keyPair.fromSecretKey(o);return{channel:a,viewed:[],keys:{curvePrivate:E.util.encodeBase64(i.secretKey),curvePublic:E.util.encodeBase64(i.publicKey)}}}}};return b.init=function(t,r,o){var a={},i=t.store;if(i.loggedIn&&i.proxy.edPublic&&!i.modules?.team){var h={store:i,Store:t.Store,pinPads:t.pinPads,emit:o,onReadyHandlers:{},teams:{},cache:{},nocache:{},updateMetadata:t.updateMetadata,updateProgress:t.updateLoadingProgress,progress:0};i.proxy.teams||(i.proxy.teams={});var b=i.proxy.teams;h.numberOfTeams=Object.keys(b).length,h.store.proxy.on("change",["teams"],(function(e,n,t){"hash"===t[2]&&R(h,t[1],n)})),h.store.proxy.on("remove",["teams"],(function(e,n){"hash"===n[2]&&R(h,n[1])}));var w=function(e,n){if(!e||!n)return!0;try{var t=E.util.decodeBase64(e),r=E.sign.keyPair.fromSecretKey(t);return E.util.encodeBase64(r.publicKey)===n}catch(e){return!1}};Object.keys(b).forEach((function(n){h.onReadyHandlers[n]=[],e.find(b,[n,"keys","mailbox"])||(b[n].keys.mailbox=j(b[n])),N(h,b[n],n,r((function(e){if(e){delete h.onReadyHandlers[n],delete h.cache[n],"NOCACHE"===e?.error&&(h.nocache[n]=!0);var t="string"==typeof e?e:e.type||e.message;return u.send("TEAM_LOADING_ERROR="+t),void console.error(e)}console.debug("Team "+n+" cache ready")})),d.isEnabled())})),a.onReady=function(t){var r;r={},Object.keys(b).forEach((function(t){try{var o=b[t],a=r[o.channel],i=e.find(o,["keys","drive","edPrivate"]),s=e.find(o,["keys","drive","edPublic"]);if(s?i&&s&&!w(i,s)&&(u.send("TEAM_CORRUPTED_EDPRIVATE"),delete b[t].keys.drive.edPrivate,i=void 0):u.send("TEAM_CORRUPTED_EDPUBLIC"),o.hash&&2===n.parseTypeHash("drive",o.hash).version&&40!==o.hash.length&&u.send("TEAM_CORRUPTED_HASH"),!a)return void(r[o.channel]=t);var c=b[a],f=e.find(c,["keys","drive","edPrivate"]),l=e.find(c,["keys","chat","edit"]),d=e.find(o,["keys","chat","edit"]);!c.hash&&o.hash&&(c.hash=o.hash),!f&&i&&(c.keys.drive.edPrivate=i),!l&&d&&(c.keys.chat.edit=d),h.store.proxy.duplicateTeams=h.store.proxy.duplicateTeams||{},h.store.proxy.duplicateTeams[t]=b[t],delete b[t]}catch(e){console.error(e)}}));var o=function(e){return!b[e]&&(D(h,e),delete h.onReadyHandlers[e],!0)};Object.keys(h.teams).forEach(o),Object.keys(h.onReadyHandlers).forEach((function(n){if(!o(n)){var r=h.store.proxy.teams[n],a=e.find(r,["keys","roster","channel"]),i=e.once(e.mkAsync(t()));g((function(e){x(h,n,r.channel,a,e,i)})),h.onReadyHandlers[n].push({cb:i})}})),Object.keys(b).forEach((function(n){h.onReadyHandlers[n]||h.teams[n]||(h.onReadyHandlers[n]=[],e.find(b,[n,"keys","mailbox"])||(b[n].keys.mailbox=j(b[n])),N(h,b[n],n,t((function(e){if(e){var t="string"==typeof e?e:e.type||e.message;return u.send("TEAM_LOADING_ERROR="+t),void console.error(e)}console.debug("Team "+n+" ready")}))))})),A(),O.fire()},a.getTeam=function(e){return h.teams[e]},a.getTeamsData=function(n){var t={},r=!1;return-1!==["drive","teams","settings"].indexOf(n)&&(r=!0),Object.keys(b).forEach((function(n){if(h.teams[n]){var o=h.teams[n].proxy||{},a=o.drive&&Object.keys(o.drive.filesData||{}).length,i=o.drive&&Object.keys(o.drive.sharedFolders||{}).length;t[n]={owner:b[n].owner,name:b[n].metadata.name,channel:b[n].channel,numberPads:a,numberSf:i,roster:e.find(b[n],["keys","roster","channel"]),edPublic:e.find(b[n],["keys","drive","edPublic"]),avatar:e.find(b[n],["metadata","avatar"]),viewer:!e.find(b[n],["keys","drive","edPrivate"]),notifications:e.find(b[n],["keys","mailbox","channel"]),curvePublic:e.find(b[n],["keys","mailbox","keys","curvePublic"]),validKeys:w(e.find(b[n],["keys","drive","edPrivate"]),e.find(b[n],["keys","drive","edPublic"]))},r&&h.teams[n]&&(t[n].secondaryKey=h.teams[n].secondaryKey),h.teams[n]&&(t[n].hasSecondaryKey=Boolean(h.teams[n].secondaryKey))}})),t},a.getTeams=function(){return Object.keys(h.teams)};a.removeFromTeam=function(e,n,t){if(b[e]&&(!t||function(e,n){var t=h.teams[e];if(t){var r=t.roster&&t.roster.getState();if(r.members)return(r.members[n]||{}).pending}}(e,n)))if(h.onReadyHandlers[e])h.onReadyHandlers[e].push({cb:function(){h.teams[e].roster.remove([n],(function(e){e&&"NO_CHANGE"!==e&&console.error(e)}))}});else{var r=h.teams[e];r?r.roster.remove([n],(function(e){e&&"NO_CHANGE"!==e&&console.error(e)})):console.error("TEAM MODULE ERROR")}},a.changeMyRights=function(e,n,t,r){P(h,e,n,t,r)},a.updateMyData=function(e){Object.keys(h.teams).forEach((function(n){var t=h.teams[n];if(t.roster){var r={};r[e.curvePublic]=e,t.roster.describe(r,(function(e){e&&console.error(e)}))}}))},a.removeClient=function(e){F(h,e)};return a.execCommand=function(t,r,o){var a=r.cmd,i=r.data;if("SUBSCRIBE"!==a)if("LIST_TEAMS"!==a)if("OPEN_TEAM_CHAT"!==a)if("GET_TEAM_ROSTER"!==a)if("GET_TEAM_METADATA"!==a)if("SET_TEAM_METADATA"!==a){if("OFFER_OWNERSHIP"===a)return h.store.offline?void o({error:"OFFLINE"}):void function(n,t,r,o){var a=e.once(o),i=t.teamId;if(i){var s=e.find(n,["store","proxy","teams",i]);if(s){var c=n.teams[i];if(c)if(c.roster)if(t.curvePublic){var u=c.roster.getState().members[t.curvePublic];g((function(t){var r=function(e){var n=e&&e.error;if(n)return console.error(n),t.abort(),void a({error:n})},o=function(e){n.Store.setPadMetadata(null,{channel:e,command:"ADD_PENDING_OWNERS",value:[u.edPublic]},t(r))};o(s.channel),o(e.find(s,["keys","roster","channel"])),o(e.find(s,["keys","chat","channel"]))})).nThen((function(e){var n={};n[u.curvePublic]={role:"OWNER"},c.roster.describe(n,e((function(e){e&&console.error(e)})))})).nThen((function(t){n.store.mailbox.sendTo("ADD_OWNER",{teamChannel:s.channel,chatChannel:e.find(s,["keys","chat","channel"]),rosterChannel:e.find(s,["keys","roster","channel"]),title:s.metadata.name},{channel:u.notifications,curvePublic:u.curvePublic},t())})).nThen((function(){a()}))}else a({error:"MISSING_DATA"});else a({error:"NO_ROSTER"});else a({error:"ENOENT"})}else a({error:"ENOENT"})}else a({error:"EINVAL"})}(h,i,0,o);if("ANSWER_OWNERSHIP"===a)return h.store.offline?void o({error:"OFFLINE"}):void function(n,t,r,o){var a,i=n.store.proxy.teams;if(Object.keys(i).forEach((function(e){if(i[e].channel===t.teamChannel)return a=e,!0})),a){var s=e.find(n,["store","proxy","teams",a]);if(s){var c=n.teams[a];if(c)if(c.roster){var u={};t.answer?s.owner=!0:(u[n.store.proxy.curvePublic]={role:"ADMIN"},c.roster.describe(u,(function(e){e?o({error:e}):o()})))}else o({error:"NO_ROSTER"});else o({error:"ENOENT"})}else o({error:"ENOENT"})}else o({error:"EINVAL"})}(h,i,0,o);if("DESCRIBE_USER"!==a){if("INVITE_TO_TEAM"===a)return h.store.offline?void o({error:"OFFLINE"}):void function(e,n,t,r){var o=n.teamId;if(o){var a=e.teams[o];if(a)if(a.roster){var i=n.user;if(i&&i.curvePublic&&i.notifications){delete i.channel,delete i.lastKnownHash,i.pending=!0;var s={};s[i.curvePublic]=i,s[i.curvePublic].role="VIEWER",a.roster.add(s,(function(n){n&&"NO_CHANGE"!==n?r({error:n}):e.store.mailbox.sendTo("INVITE_TO_TEAM",{team:C(e,o)},{channel:i.notifications,curvePublic:i.curvePublic},(function(e){r(e)}))}))}else r({error:"MISSING_DATA"})}else r({error:"NO_ROSTER"});else r({error:"ENOENT"})}else r({error:"EINVAL"})}(h,i,0,o);if("LEAVE_TEAM"!==a){if("JOIN_TEAM"===a)return h.store.offline?void o({error:"OFFLINE"}):void I(h,i,0,o);if("REMOVE_USER"!==a){if("DELETE_TEAM"===a)return h.store.offline?void o({error:"OFFLINE"}):void function(n,t,r,o){var a=t.teamId;if(a){var i=n.teams[a],s=e.find(n,["store","proxy","teams",a]);if(i&&s){var c=i.roster.getState(),f=e.find(n,["store","proxy","curvePublic"]),l=c.members[f];if(!l||"OWNER"!==l.role)return o({error:"EFORBIDDEN"});var d=e.find(n,["store","proxy","edPublic"]),h=e.find(s,["keys","drive","edPublic"]);g((function(e){n.Store.anonRpcMsg(null,{msg:"GET_METADATA",data:s.channel},e((function(n){if(n&&n.error)return e.abort(),o({error:n.error});var t=n[0];t&&Array.isArray(t.owners)&&-1!==t.owners.indexOf(d)||(e.abort(),o({error:"EFORBIDDEN"}))})))})).nThen((function(t){i.proxy.delete=!0;var r=i.manager.getChannelsList("owned"),o=e.Saferphore.create(10);r.forEach((function(e){var r=t();o.take((function(t){var o=!1;g((function(r){32===e.length&&n.Store.anonRpcMsg(null,{msg:"GET_METADATA",data:e},r((function(e){if(e&&e.error)return t(),void r.abort();var n=e[0];if(!n||!Array.isArray(n.owners)||-1===n.owners.indexOf(h))return t(),void r.abort();o=n.owners.some((function(e){return e!==h}))})))})).nThen((function(t){o?n.Store.setPadMetadata(null,{channel:e,command:"RM_OWNERS",value:[h]},t()):i.rpc.removeOwnedChannel(e,t((function(e){e&&console.error(e)})))})).nThen((function(){t(),r()}))}))}))})).nThen((function(t){i.rpc.removePins(t((function(e){e&&console.error(e)})));var r=e.find(s,["keys","mailbox","channel"]);i.rpc.removeOwnedChannel(r,t((function(e){e&&console.error(e)})));var o=e.find(s,["keys","roster","channel"]);n.store.rpc.removeOwnedChannel(o,t((function(e){e&&console.error(e)})));var a=e.find(s,["keys","chat","channel"]);n.store.rpc.removeOwnedChannel(a,t((function(e){e&&console.error(e)}))),n.store.rpc.removeOwnedChannel(s.channel,t((function(e){e&&console.error(e)})))})).nThen((function(){u.send("TEAM_DELETION"),D(n,a),o()}))}else o({error:"ENOENT"})}else o({error:"EINVAL"})}(h,i,0,o);if("CREATE_TEAM"===a)return h.store.offline?void o({error:"OFFLINE"}):void function(t,r,o,a){var i,f=e.once(a),l=n.createChannelId(),h=n.createRandomHash("team",l),b=n.getSecrets("team",h,l),O=n.getViewHashFromKeys(b),A=E.sign.keyPair(),w=E.box.keyPair(),_=v.Team.createSeed(),T=v.Team.deriveMemberKeys(_,{curvePublic:t.store.proxy.curvePublic,curvePrivate:t.store.proxy.curvePrivate}),x=n.getSecrets("chat"),N=n.getHashes(x),I={network:t.store.network,channel:b.channel,data:{},validateKey:b.keys.validateKey,crypto:v.createEncryptor(b.keys),logLevel:1,classic:!0,ChainPad:m,Cache:d,owners:[t.store.proxy.edPublic]};g((function(e){s.create({network:t.store.network||t.store.networkPromise,channel:T.channel,owners:[t.store.proxy.edPublic],keys:T,store:t.store,lastKnownHash:void 0,newTeam:!0,Cache:d},e((function(n,r){if(n)return e.abort(),console.error(n),void f({error:"ROSTER_ERROR"});i=r;var o=c.createData(t.store.proxy);delete o.channel,i.init(o,e((function(n){if(n)return e.abort(),void f({error:"ROSTER_INIT_ERROR"})})))})));var n,r=v.createEncryptor(x.keys),o={network:t.store.network,channel:x.channel,noChainPad:!0,crypto:r,metadata:{validateKey:x.keys.validateKey,owners:[t.store.proxy.edPublic]}},a=e();o.onReady=function(){n&&n.stop(),a()},o.onError=function(){e.abort(),f({error:"CHAT_INIT_ERROR"})},n=y.start(o)})).nThen((function(e){i.metadata({name:r.name},e((function(n){if(n)return e.abort(),void f({error:"ROSTER_INIT_ERROR"})})))})).nThen((function(){var a=e.createRandomInteger();I.onMetadataUpdate=function(){var e=t.teams[a];e&&t.emit("ROSTER_CHANGE",a,e.clients)};var s=p.create(I),c=s.proxy;c.version=2,c.on("ready",(function(){var e={mailbox:{channel:n.createChannelId(),viewed:[],keys:{curvePrivate:E.util.encodeBase64(w.secretKey),curvePublic:E.util.encodeBase64(w.publicKey)}},drive:{edPrivate:E.util.encodeBase64(A.secretKey),edPublic:E.util.encodeBase64(A.publicKey)},chat:{edit:N.editHash,view:N.viewHash,validateKey:x.keys.validateKey,channel:x.channel},roster:{channel:T.channel,edit:_,view:T.viewKeyStr}},d=t.store.proxy.teams[a]={owner:!0,channel:b.channel,hash:h,roHash:O,password:l,keys:e,metadata:{name:r.name}};c.drive={},S(t,a,s,i,e,o,(function(){u.send("TEAM_CREATION"),t.store.mailbox.open("team-"+a,d.keys.mailbox,(function(){}),!0,{owners:d.keys.drive.edPublic}),t.updateMetadata(),f()}))})).on("error",(function(e){e&&void 0!==e.loaded&&!e.loaded&&f({error:"ECONNECT"}),e&&e.error&&"EDELETED"===e.error&&D(t,a)}))}))}(h,i,t,o);if("GET_EDITABLE_FOLDERS"!==a)if("CREATE_INVITE_LINK"!==a){if("GET_PREVIEW_CONTENT"!==a)return"ACCEPT_LINK_INVITATION"===a?h.store.offline?void o({error:"OFFLINE"}):void H(h,i,0,o):void 0;L(h,i,0,o)}else!function(n,t,r,o){var a=e.mkAsync(e.once(o)),i=t.teamId,s=n.teams[t.teamId],u=t.seeds,d=t.bytes64;if(i&&s){var h,p=s.roster;try{h=p.getState().metadata.name}catch(e){return void a({error:"TEAM_NAME_ERR"})}var v=t.message,y=t.name,m=t.hash,E=e.find(n,["store","proxy","teams",i]);try{var b=f.encryptHash(m,E.hash)}catch(e){console.error(e)}var O=f.derivePreviewKeys(u.preview),A=f.deriveInviteKeys(d),w=f.generateKeys(),D=t.role||"VIEWER",_=t.uses||1;g((function(e){!function(){var t=f.generateSignPair(),r={initialState:"{}",network:n.store.network,metadata:{owners:[n.store.proxy.edPublic,w.edPublic]}};r.metadata.validateKey=t.validateKey;var o={teamName:h,message:v,author:c.createData(n.store.proxy,!1),displayName:y},i={channel:O.channel,type:"pad",version:2,keys:{cryptKey:O.cryptKey,validateKey:t.validateKey,signKey:t.signKey}};l.put(i,JSON.stringify(o),e((function(n){if(n)return console.error("CRYPTPUT_ERR",n),e.abort(),void a({error:"SET_PREVIEW_CONTENT"})})),r)}(),function(){var t=f.generateSignPair(),r={initialState:"{}",network:n.store.network,metadata:{owners:[n.store.proxy.edPublic,w.edPublic]}};r.metadata.validateKey=t.validateKey;var o={teamData:C(n,i,"MEMBER"===D),ephemeral:{edPublic:w.edPublic,edPrivate:w.edPrivate,curvePublic:w.curvePublic,curvePrivate:w.curvePrivate}},s={channel:A.channel,type:"pad",version:2,keys:{cryptKey:A.cryptKey,validateKey:t.validateKey,signKey:t.signKey}};l.put(s,JSON.stringify(o),e((function(n){if(n)return console.error("CRYPTPUT_ERR",n),e.abort(),void a({error:"SET_PREVIEW_CONTENT"})})),r)}()})).nThen((function(e){s.pin([A.channel,O.channel],(function(e){e&&e.error&&console.error(e.error)})),f.createRosterEntry(s.roster,{curvePublic:w.curvePublic,content:{curvePublic:w.curvePublic,displayName:t.name,pending:!0,remaining:_,totalUses:_,role:D,hash:b,inviteChannel:A.channel,previewChannel:O.channel}},e((function(n){n&&(e.abort(),a(n))})))})).nThen((function(){a()}))}else a({error:"EINVAL"})}(h,i,0,o);else!function(n,t,r,o){var a=t.teamId;if(a){var i=n.teams[a];if(i){var s=i.manager.folders||{};o(Object.keys(s).filter((function(e){return!s[e].proxy.version})).map((function(n){var t=e.find(i,["user","userObject"]);return{name:e.find(s,[n,"proxy","metadata","title"]),path:t?t.findFile(n)[0]:[]}})))}else o({error:"ENOENT"})}else o({error:"EINVAL"})}(h,i,0,o)}else!function(e,n,t,r){var o=n.teamId;if(o){var a=e.teams[o];if(a)if(a.roster)if(n.curvePublic){var i=a.roster.getState().members[n.curvePublic];a.roster.remove([n.curvePublic],(function(t){if(!t)return i&&i.notifications?void e.store.mailbox.sendTo("KICKED_FROM_TEAM",{pending:n.pending,teamChannel:C(e,o).channel,teamName:C(e,o).metadata.name},{channel:i.notifications,curvePublic:i.curvePublic},(function(e){r(e)})):r();r({error:t})}))}else r({error:"MISSING_DATA"});else r({error:"NO_ROSTER"});else r({error:"ENOENT"})}else r({error:"EINVAL"})}(h,i,0,o)}else!function(e,n,t,r){var o=n.teamId;if(o){var a=e.teams[o];if(a)if(a.roster){var i=e.store.proxy.curvePublic;a.roster.remove([i],(function(n){n?r({error:n}):(D(e,o),r())}))}else r({error:"NO_ROSTER"});else r({error:"ENOENT"})}else r({error:"EINVAL"})}(h,i,0,o)}else M(h,i,0,o)}else!function(e,n,t,r){var o=n.teamId;if(o){var a=e.teams[o];a?a.offline?r({error:"OFFLINE"}):a.roster?(n.metadata&&delete n.metadata.offline,a.roster.metadata(n.metadata,(function(t){if(t)r({error:t});else{var a=e.store.proxy.teams[o];a&&(a.metadata=n.metadata),r()}}))):r({error:"NO_ROSTER"}):r({error:"ENOENT"})}else r({error:"EINVAL"})}(h,i,0,o);else!function(e,n,t,r){var o=n.teamId;if(o){var a=e.teams[o];if(a)if(a.roster){var i=(a.roster.getState()||{}).metadata||{};i.offline=a.offline,r(i)}else r({error:"NO_ROSTER"});else r({error:"ENOENT"})}else r({error:"EINVAL"})}(h,i,0,o);else!function(n,t,r,o){var a=t.teamId;if(a){var i=e.find(n,["store","proxy","teams",a]);if(i){var s=n.teams[a];if(s)if(s.roster){var c,u=(s.roster.getState()||{}).members||{};g((function(e){n.Store.getPadMetadata(null,{channel:i.channel},e((function(e){c=e&&e.error?s.listmap.metadata||{}:e})))})).nThen((function(){if(n.pending_owners=c.pending_owners,Array.isArray(c.pending_owners)&&c.pending_owners.forEach((function(t){var r;if(Object.keys(u).some((function(e){if(u[e].edPublic===t)return r=u[e],!0})),!r&&i.owner){var o=function(e){n.Store.setPadMetadata(null,{channel:e,command:"RM_PENDING_OWNERS",value:[t]},(function(){}))};return o(i.channel),o(e.find(i,["keys","roster","channel"])),void o(e.find(i,["keys","chat","channel"]))}r.pendingOwner=!0})),n.store.messenger){var t=s.getChatData();(n.store.messenger.getOnlineList(t.channel)||[]).forEach((function(e){u[e]&&(u[e].online=!0)}))}Object.keys(u).forEach((function(e){var n=u[e];if(n.inviteChannel&&n.hash)if(i.hash)try{n.hash=f.decryptHash(n.hash,i.hash)}catch(e){console.error(e)}else delete n.hash})),o(u)}))}else o({error:"NO_ROSTER"});else o({error:"ENOENT"})}else o({error:"ENOENT"})}else o({error:"EINVAL"})}(h,i,0,o);else!function(e,n,t,r){var o=e.teams[n.teamId];if(o){var a=function(){e.emit("ROSTER_CHANGE",n.teamId,o.clients)};e.store.messenger?e.store.messenger.openTeamChat(o.getChatData(),a,t,r):A=function(){e.store.messenger.openTeamChat(o.getChatData(),a,t,r)}}else r({error:"ENOENT"})}(h,i,t,o);else!function(n){var t=e.clone(b);Object.keys(t).forEach((function(e){h.teams[e]?t[e].offline=h.teams[e].offline:(t[e].error=!0,h.nocache[e]&&(t[e].offline=!0))})),n(t)}(o);else!function(e,n,t,r){F(e,t);try{e.store.messenger.removeClient(t)}catch(e){}if(A=function(){},n)if(!e.onReadyHandlers[n]||e.teams[n])if(e.teams[n]){var o=e.teams[n].clients;-1===o.indexOf(t)&&o.push(t),r()}else r({error:"EINVAL"});else-1===e.onReadyHandlers[n].indexOf(t)&&e.onReadyHandlers[n].push({cId:t,cb:r});else r()}(h,i,t,o)},a}},b.anonGetPreviewContent=function(e,n,t){L(e,n,0,t)},b};e.exports&&(e.exports=n(W(),Z(),K(),Me(),Ge(),Le(),Ye(),ht(),En(),ge(),(pt||(pt=1,function(e){e.exports&&(e.exports=function(e,n,t,r){var o={},a=t.util.encodeBase64,i=t.util.decodeBase64;o.generateKeys=function(){var e=t.sign.keyPair(),n=t.box.keyPair();return{edPublic:a(e.publicKey),edPrivate:a(e.secretKey),curvePublic:a(n.publicKey),curvePrivate:a(n.secretKey)}},o.generateSignPair=function(){var e=t.sign.keyPair();return{validateKey:a(e.publicKey),signKey:a(e.secretKey)}};var s=function(r){var o=n.dispenser(i(r));return{channel:e.uint8ArrayToHex(o(16)),cryptKey:o(t.secretbox.keyLength)}};o.deriveInviteKeys=s,o.derivePreviewKeys=s,o.createRosterEntry=function(e,n,t){var r={};r[n.curvePublic]=n.content,e.invite(r,t)};var c=t.util.decodeUTF8;return o.encryptHash=function(e,n){var o=c(n),a=t.hash(o).subarray(0,32);return r.encrypt(e,a)},o.decryptHash=function(e,n){var o=c(n),a=t.hash(o).subarray(0,32);return r.decrypt(e,a)},o}(W(),_e(),I(),C()))}(yt)),yt.exports),xn(),ie(),Sn(),g(),C(),y(),w(),Ve(),I()))})()}(lt)),lt.exports}var gt,Et={exports:{}};function bt(){return gt||(gt=1,function(e){(()=>{const n=(e,n,t,r,o,a,i={},s,c)=>{var u=e.Curve,f={setCustomize:e=>{i=e.Messages}},l="MSG",d="UNFRIEND",h="MAP_ID",p="MAP_ID_ACK",v=function(e){return JSON.parse(JSON.stringify(e))},y=function(e){for(var n=Object.keys(e).length,t=new Uint8Array(n),r=0;r{const n=p.store.network||e;n.on("message",(function(e,n){N(p,e,n)})),n.on("disconnect",(function(){p.emit("DISCONNECT",null,C(p))})),n.on("reconnect",(function(){p.emit("RECONNECT",null,C(p))}))}));return h.networkPromise?.then(b),p.store.network&&b(),f.onFriendUpdate=function(e){var n=g(h.proxy,e);if(n&&n.channel){var t=p.channels[n.channel];t&&p.emit("UPDATE_DATA",{info:v(n),channel:n.channel},t.clients)}},f.onFriendAdded=function(e){if(p.friendsClients.length){var n=g(p.store.proxy,e.curvePublic);if("object"==typeof n)if(n.channel){var t=n.channel;p.channels[t]||P(p,null,n,(function(){u("FRIEND",{curvePublic:n.curvePublic},p.friendsClients)}))}}},f.onFriendRemoved=function(e,n){I(p,e,n)},f.getOnlineList=function(e){return function(e,n){var t=e.channels[n];if(t){var r=[],o=m(e.store.proxy,!1);return r.push(o.curvePublic),t.wc.members.forEach((function(n){if(n!==e.store.network.historyKeeper){var o=t.mapId[n]||{};o.curvePublic&&-1===r.indexOf(o.curvePublic)&&r.push(o.curvePublic)}})),r}}(p,e)},f.storeValidateKey=function(e,n){p.validateKeys[e]=n},f.leavePad=function(e){delete p.validateKeys[e],Object.keys(p.channels).some((function(n){var t=p.channels[n];if(t.padChan===e){t.wc&&t.wc.leave();var r=p.store.network;return t.onReconnect&&r.off("reconnect",t.onReconnect),t.stopped=!0,delete p.channels[n],!0}}))},f.openTeamChat=function(n,r,o,a){!function(n,r,o,a,i){var s=o,c=s.channel,u=s.secret;if(c&&u){var f=t.once(t.mkAsync((function(){n.emit("TEAMCHAT_READY",c,[r]),i({readOnly:"object"==typeof u.keys&&!u.keys.validateKey,channel:c})}))),l=n.channels[c];if(l)l.onReady.reg((function(){-1===l.clients.indexOf(r)&&l.clients.push(r),f()}));else{u.keys.cryptKey&&(u.keys.cryptKey=y(u.keys.cryptKey));var d=e.createEncryptor(u.keys),h=u.keys&&u.keys.validateKey||s.validateKey,p={teamId:o.teamId,readOnly:"object"==typeof u.keys&&!u.keys.validateKey,encryptor:d,channel:c,isTeamChat:!0,decrypt:function(e){return d.decrypt(e,h)},clients:[r],onUserlistUpdate:a,onReady:f};R(n,p)}}else i({error:"EINVAL"})}(p,o,n,r,a)},f.removeClient=function(e){!function(e,n){var t=e.friendsClients.indexOf(n);-1!==t&&e.friendsClients.splice(t,1),Object.keys(e.channels).forEach((function(t){var r=e.channels[t],o=r.clients,a=o.indexOf(n);if(-1!==a&&o.splice(a,1),0===o.length){r.wc&&r.wc.leave();var i=e.store.network;return r.onReconnect&&i.off("reconnect",r.onReconnect),r.stopped=!0,delete e.channels[t],!0}}))}(p,e)},f.execCommand=function(n,r,s){var u=r.cmd,f=r.data;"INIT_FRIENDS"!==u?"GET_ROOMS"!==u?"GET_MUTED_USERS"!==u?"GET_USERLIST"!==u?"OPEN_PAD_CHAT"!==u?"GET_MY_INFO"!==u?"REMOVE_FRIEND"!==u?"CANCEL_FRIEND"!==u?"MUTE_USER"!==u?"UNMUTE_USER"!==u?"GET_STATUS"!==u?"GET_MORE_HISTORY"!==u?"SEND_MESSAGE"!==u?"SET_CHANNEL_HEAD"!==u?"CLEAR_OWNED_CHANNEL"!==u||function(e,n,t){var r=e.channels[n];r?e.store.rpc?e.store.rpc.clearOwnedChannel(n,(function(o){t({error:o}),o||(r.messages=[],e.emit("CLEAR_CHANNEL",n,r.clients))})):t({error:"RPC_NOT_READY"}):t({error:"NO_CHANNEL"})}(p,f,s):_(p,f.id,f.sig,s):function(e,n,t,r){var o=e.channels[n];if(o)if(o.readOnly)r({error:"FORBIDDEN"});else if(e.store.network.webChannels.some((function(e){if(e.id===o.wc.id)return!0}))){var s=e.store.proxy||{},c=[l,s.curvePublic,+new Date,t];if(!o.isFriendChat){var u=s[a.displayNameKey]||i.anonymous+"#"+(s.uid||e.store.noDriveUid).slice(0,5);c.push(u)}var f=JSON.stringify(c),d=o.encrypt(f);o.wc.bcast(d).then((function(){x(e,o,d),r()}),(function(e){r({error:e})}))}else r({error:"NO_SUCH_CHANNEL"});else r({error:"NO_CHANNEL"})}(p,f.id,f.content,s):function(e,n,r,o,a){if("function"==typeof a)if("string"==typeof r){var i=e.channels[n];if(void 0!==i){var s=t.uid();A(e,s,n,a);var c=["GET_HISTORY_RANGE",i.id,{from:r,count:o,txid:s}],u=e.store.network;u.sendto(u.historyKeeper,JSON.stringify(c)).then((function(){}),(function(e){console.error(e)}))}else console.error("chan is undefined. we're going to have a problem here")}else a([])}(p,f.id,f.sig,f.count,s):function(e,n,t){var r=e.channels[n];if(r){r.onUserlistUpdate&&r.onUserlistUpdate();var o=e.store.proxy||{};t(r.wc.members.some((function(n){if(n!==e.store.network.historyKeeper){var t=r.mapId[n]||void 0;return!!t&&t.curvePublic!==o.curvePublic}})))}else t("NO_SUCH_CHANNEL")}(p,f,s):function(e,n,r){var o=t.once(t.mkAsync(r)),a=e.store.proxy,i=a.mutedUsers=a.mutedUsers||{};delete i[n],e.emit("UPDATE_MUTED",null,C(e)),o(Object.keys(i).length)}(p,f,s):function(e,n,r){var o=t.once(t.mkAsync(r)),a=e.store.proxy,i=a.mutedUsers=a.mutedUsers||{};i[n.curvePublic]||(i[n.curvePublic]=n,e.emit("UPDATE_MUTED",null,C(e))),o()}(p,f,s):function(e,n,r){var o=t.once(r);"function"==typeof o?e.Store.cancelFriendRequest(n,o):console.error("NO_CALLBACK")}(p,f,s):function(e,n,r){var a=t.once(r);if("function"==typeof a){var i=e.store.proxy,s=g(i,n);if(!s)return console.error("friend is not valid"),void a({error:"INVALID_FRIEND"});var c=e.channels[s.channel];if(e.store.mailbox&&s.curvePublic&&s.notifications)o.removeFriend(e.store,n,(function(n){n&&n.error?a({error:n.error}):(e.updateMetadata(),a(n))}));else if(c)try{var u=[d,i.curvePublic,+new Date],f=JSON.stringify(u),l=c.encrypt(f);c.wc.bcast(l).then((function(){I(e,n,s.channel),S(e,n,(function(){a()}))}),(function(t){t?a({error:t}):(I(e,n,s.channel),S(e,n,(function(){a()})))}))}catch(e){a({error:e})}else a({error:"NO_SUCH_CHANNEL"})}else console.error("NO_CALLBACK")}(p,f,s):function(e,n){var t=e.store.proxy||{};n({curvePublic:t.curvePublic,displayName:t[a.displayNameKey]})}(p,s):function(n,r,o,a){var i=o.channel,s=t.once(t.mkAsync((function(){n.emit("PADCHAT_READY",i,[r]),a()}))),c=n.channels[i];if(c)c.onReady.reg((function(){-1===c.clients.indexOf(r)&&c.clients.push(r),s()}));else{var u=o.secret;u.keys.cryptKey&&(u.keys.cryptKey=y(u.keys.cryptKey));var f=e.createEncryptor(u.keys),l=u.keys&&u.keys.validateKey||n.validateKeys[u.channel],d={padChan:o.secret&&o.secret.channel,readOnly:"object"==typeof u.keys&&!u.keys.validateKey,encryptor:f,channel:o.channel,isPadChat:!0,decrypt:function(e){return f.decrypt(e,l)},clients:[r],onReady:s};R(n,d)}}(p,n,f,s):function(e,n,t){var r=e.channels[n.id];if(r)if(r.isFriendChat){var o=O(e,n.id);if(!o)return void t({error:"NO_SUCH_FRIEND"});t([o])}else t([]);else t({error:"NO_SUCH_CHANNEL"})}(p,f,s):function(e,n){var t=e.store.proxy;if(!n)return t.mutedUsers||{};n(t.mutedUsers||{})}(p,s):function(e,n,t){var r=e.store.proxy;if(n&&n.curvePublic){var o=n.curvePublic,a=g(r,o);if(!a)return void t({error:"NO_SUCH_FRIEND"});var i=e.channels[a.channel];return i?void t([{id:i.id,isFriendChat:!0,name:a.displayName,lastKnownHash:a.lastKnownHash,curvePublic:a.curvePublic,messages:i.messages}]):void t({error:"NO_SUCH_CHANNEL"})}if(n&&n.padChat){var s=e.channels[n.padChat];return s?void t([{id:s.id,isPadChat:!0,messages:s.messages}]):void t({error:"NO_SUCH_CHANNEL"})}if(n&&n.teamChat){var c=e.channels[n.teamChat];return c?void t([{id:c.id,isTeamChat:!0,messages:c.messages}]):void t({error:"NO_SUCH_CHANNEL"})}var u=Object.keys(e.channels).map((function(n){var t,r,o,a=e.channels[n];if(a.isFriendChat){var i=O(e,n);if(!i)return null;t=i.displayName,r=i.lastKnownHash,o=i.curvePublic}else{if(a.isPadChat)return;if(a.isTeamChat)return}return{id:a.id,isFriendChat:a.isFriendChat,name:t,lastKnownHash:r,curvePublic:o,messages:a.messages}})).filter((function(e){return e}));t(u)}(p,f,s):function(e,n,t){var r=E(e.store.proxy);c((function(t){Object.keys(r).forEach((function(o){if("me"!==o){var a=v(r[o]);"object"==typeof a&&a.channel&&P(e,n,a,t())}else delete r.me.channel}))})).nThen((function(){-1===e.friendsClients.indexOf(n)&&e.friendsClients.push(n),t()}))}(p,n,s)},f},f};e.exports&&(e.exports=n(C(),Z(),W(),Me(),En(),K(),void 0,en(),Ve()))})()}(Et)),Et.exports}var Ot,At={exports:{}};function wt(){return Ot||(Ot=1,function(e){(()=>{const n=(e,n,t,r)=>{var o={},a={};var i=function(n,t,o,a,i){var s,c=e.once(e.mkAsync(i)),u=function(n,t){if(!t)return e.find(n.store,["proxy","edPublic"]);var r=e.find(n,["store","proxy","teams",t]);return e.find(r,["keys","drive","edPublic"])}(n,a),f=n.Store,l=0,d=0,h=0;r((function(e){f.getFileSize(null,{channel:t},e((function(n){return n&&n.error?(e.abort(),void c(n)):void 0===n.size?(e.abort(),void c({error:"ENOENT"})):void(l=n.size)}))),f.getHistory(null,{channel:t,lastKnownHash:o},e((function(n){if(n&&n.error)return e.abort(),void c(n);if(!Array.isArray(n))return e.abort(),void c({error:"EINVAL"});if(n.length){s=n[0].hash;var t=n.map((function(e){return e.msg}));d=t.join("\n").length}})),!0),f.getPadMetadata(null,{channel:t},e((function(n){if((!n||!n.error)&&n&&"object"==typeof n)return h=JSON.stringify(n).length,n&&Array.isArray(n.owners)&&-1!==n.owners.indexOf(u)?void 0:(e.abort(),void c({error:"INSUFFICIENT_PERMISSIONS"}))})))})).nThen((function(){c({size:l-h-d,hash:s})}))};return a.GET_HISTORY_SIZE=function(o,a,s,c){if(o.store.loggedIn&&o.store.rpc){var u=a.channels;if(Array.isArray(u)){var f=[];a.account?u=function(r){var o=[],a=e.find(r.store,["proxy","edPublic"]);-1!==(e.find(r.store,["driveMetadata","owners"])||[]).indexOf(a)&&o.push(r.store.driveChannel);var i=r.store.proxy.profile;if(i){var s=i.edit?n.hrefToHexChannelId("/profile/#"+i.edit,null):null;s&&o.push(s)}r.store.proxy.todo&&o.push(n.hrefToHexChannelId("/todo/#"+r.store.proxy.todo,null));var c=r.store.proxy.mailboxes;if(c){var u=Object.keys(c).map((function(e){return{lastKnownHash:c[e].lastKnownHash,channel:c[e].channel}}));Array.prototype.push.apply(o,u)}var f=r.store.proxy[t.SHARED_FOLDERS];if(f){var l=Object.keys(f).map((function(e){var n=f[e];if(n&&n.owners&&Array.isArray(n.owners)&&-1!==n.owners.indexOf(a))return n.channel})).filter(Boolean);Array.prototype.push.apply(o,l)}return o}(o):a.team&&(u=function(n,t){let r=e.find(n.store,["proxy","teams",t]);if(!r)return[];let o=[r.channel],a=r.keys.roster;return o.push({channel:a.channel,lastKnownHash:a.lastKnownHash}),o}(o,a.team));var l=0,d=[];r((function(e){u.forEach((function(n){var t,r=n;"object"==typeof n&&n.channel&&(r=n.channel,t=n.lastKnownHash),i(o,r,t,a.teamId,e((function(e){e&&e.error?f.push(e.error):(l+=e.size,e.hash&&d.push({channel:r,hash:e.hash}))})))}))})).nThen((function(){c({warning:f.length?f:void 0,channels:d,size:l})}))}else c({error:"EINVAL"})}else c({error:"INSUFFICIENT_PERMISSIONS"})},a.TRIM_HISTORY=function(e,n,t,o){if(e.store.loggedIn&&e.store.rpc){var a=n.channels;if(Array.isArray(a)){var i=function(e,n){if(!n)return e.store.rpc;var t=e.store.modules.team;if(t){var r=t.getTeam(n);if(r)return r.rpc}}(e,n.teamId);if(i){var s=[];r((function(e){a.forEach((function(n){i.trimHistory(n,e((function(e){e&&s.push(e)})))}))})).nThen((function(){1===a.length&&s.length?o({error:s[0]}):o({warning:s.length?s:void 0})}))}else o({error:"ENORPC"})}else o({error:"EINVAL"})}else o({error:"INSUFFICIENT_PERMISSIONS"})},o.init=function(e,n,t){var r={};if(e.store){var o={store:e.store,Store:e.Store,pinPads:e.pinPads,updateMetadata:e.updateMetadata,emit:t};return r.execCommand=function(e,n,t){var r=n.cmd,i=n.data;try{a[r](o,i,e,t)}catch(e){console.error(e)}},r}},o};e.exports&&(e.exports=n(W(),Z(),Le(),Ve()))})()}(At)),At.exports}var Dt,_t={exports:{}},Tt={exports:{}};function St(){return Dt||(Dt=1,function(e){(()=>{const n=e=>{var n={};const t=globalThis;var r=function(){},o=n.getWeekNo=function(e,n){"number"!=typeof n&&(n=1);var t=new Date(e.getFullYear(),0,1),r=t.getDay()-n;r=r>=0?r:r+7;var o,a=Math.floor((e.getTime()-t.getTime())/864e5)+1;if(r<4){if((o=Math.floor((a+r-1)/7)+1)>52){var i=new Date(e.getFullYear()+1,0,1).getDay()-n;o=(i=i>=0?i:i+7)<4?1:53}}else o=Math.floor((a+r-1)/7);return o},a=function(e){var n=new Date(e.getFullYear(),0,0),t=e-n+60*(n.getTimezoneOffset()-e.getTimezoneOffset())*1e3;return Math.floor(t/864e5)},i=n.DAYORDER=["SU","MO","TU","WE","TH","FR","SA"],s=function(e){var n=Number(e.slice(0,-2)),t=i.indexOf(e.slice(-2));return n?[n,t]:t},c=function(e,n){var t=e.getDay();t>=(n="number"==typeof n?n:1)?e.setDate(e.getDate()-(t-n)):e.setDate(e.getDate()-(7+t-n))},u=function(e){return e.getFullYear()+"-"+(e.getMonth()+1)+"-"+e.getDate()},f={daily:function(e,n){e.setDate(e.getDate()+n)},weekly:function(e,n){e.setDate(e.getDate()+7*n)},monthly:function(e,n){e.setMonth(e.getMonth()+n)},yearly:function(e,n){e.setFullYear(e.getFullYear()+n)}},l={month:function(e,n,t){var r=new Date(n.start),o=(t-(e.getMonth()+1)+12)%12,a=e.getMonth()+o;if(e.setMonth(a),e.setDate(r.getDate()),e.getMonth()===a)return!0},weekno:function(e,n,t,r){var a=r&&r.wkst;"number"!=typeof a&&(a=1);var i=new Date(n.start),s=new Date(e.getFullYear(),11,31),u=o(s,a),f=1===u;1===u&&(u=52);var l=o(e,a);if(!t||t>u)return!1;t<0&&(t=u+t+1);var d=t-l,h=new Date(+e);h.setDate(h.getDate()+7*d),c(h,a);var p="aaaaaaa".split("").map((function(n,t){var r=new Date(+h);if(r.setDate(r.getDate()+t),r.getFullYear()===e.getFullYear())return r.toLocaleDateString()!==i.toLocaleDateString()&&r})).filter(Boolean);return 1===t&&f&&(c(s,a),"aaaaaaa".split("").some((function(n,t){var r=new Date(+s);if(r.setDate(r.getDate()+t),r.toLocaleDateString()!==i.toLocaleDateString())return r.getFullYear()>e.getFullYear()||void p.push(r)}))),p.length?p:void 0}};l.yearday=function(e,n,t){var r=e.getFullYear();if(function(e,n){if(!("number"!=typeof n||Math.abs(n)<1||Math.abs(n)>366))return n<0&&(n=a(new Date(e.getFullYear(),11,31))+n+1),e.setMonth(0),e.setDate(n),!0}(e,t)&&e.getFullYear()===r)return!0},l.monthday=function(e,n,t,r){if("number"!=typeof t||Math.abs(t)<1||Math.abs(t)>31)return!1;var o=function(e,n){var t=e.getMonth();n<0&&(n=new Date(e.getFullYear(),e.getMonth()+1,0).getDate()+n+1);return e.setDate(n),e.getMonth()===t};if("monthly"===r.freq)return o(e,t);var a="aaaaaaaaaaaa".split("").map((function(n,r){var a=new Date(e.getFullYear(),r,1);return o(a,t)?a:void 0})).filter(Boolean);return a.length?a:void 0},l.day=function(e,n,t,r){var o,a=s(t);Array.isArray(a)&&(o=a[0],a=a[1]);var i=[];if(![0,1,2,3,4,5,6].includes(a))return!1;var c,u=function(e){if(o){var n=[];"aaaaaaaaaaaa".split("").some((function(t,r){if(void 0===e||r===e){var a,s=i.filter((function(e){return e.getMonth()===r}));return a=o<0?s.length+o:o-1,n.push(s[a]),void 0!==e&&r===e}})),i=n.filter(Boolean)}};if("yearly"===r.freq){c=new Date(+e);for(var f=e.getFullYear();c.getDay()!==a;)c.setDate(c.getDate()+1);for(;c.getFullYear()===f;)i.push(new Date(+c)),c.setDate(c.getDate()+7);return u(),i}if("monthly"===r.freq){c=new Date(+e);for(var l=e.getMonth();c.getDay()!==a;)c.setDate(c.getDate()+1);for(;c.getMonth()===l;)i.push(new Date(+c)),c.setDate(c.getDate()+7);return u(l),i}if("weekly"===r.freq)for(;e.getDay()!==a;)e.setDate(e.getDate()+1);return!0};var d={month:function(e,n){return e.filter((function(e){return n.includes(e.getMonth()+1)}))},weekno:function(e,n,t){return e.filter((function(e){var r=t&&t.wkst;"number"!=typeof r&&(r=1);var a=new Date(e.getFullYear(),11,31),i=o(a,r);1===i&&(i=52);var s=o(e,r);return n.some((function(e){return e>0?e===s:s===i+e+1}))}))},yearday:function(e,n){return e.filter((function(e){var t=a(e),r=a(new Date(e.getFullYear(),11,31));return n.some((function(e){return e>0?e===t:t===r+e+1}))}))},monthday:function(n,t){return n.filter((function(n){var r=e.clone(t);return(r=r.map((function(e){e<0&&(e=new Date(n.getFullYear(),n.getMonth()+1,0).getDate()+e+1);return e}))).includes(n.getDate())}))},day:function(e,n,t){return e.filter((function(e){var r=e.toLocaleDateString(),o="yearly";return("monthly"===t.freq||"yearly"===t.freq&&t.by&&t.by.month)&&(o="monthly"),n.some((function(n){var t,a=s(n);if(Array.isArray(a)&&(t=a[0],a=a[1]),!t)return e.getDay()===a;var i=new Date(e.getFullYear(),e.getMonth(),1);return"yearly"===o&&i.setMonth(0),l.day(i,{},n,{freq:o}).some((function(e){return e.toLocaleDateString()===r}))}))}))},setpos:function(n,t){var r=n.slice(),o=e.deduplicateString(t.slice().map((function(e){return e>0?e-1:0!==e?r.length+e:void 0})));return n.filter((function(e){var n=r.indexOf(e);return o.includes(n)}))}},h=["month","weekno","yearday","monthday","day"],p=["month","monthday","day"];n.getMonthId=function(e){return e.getFullYear()+"-"+e.getMonth()};var v=t.CP_calendar_cache={},y={};n.resetCache=function(){v=t.CP_calendar_cache={},y={}};var m=function(n){if(!n.recUpdate)return[];var t={},r=n.recUpdate.from;return Object.keys(r||{}).forEach((function(e){var n=r[e];n.recurrenceRule&&(t[e]=n.recurrenceRule)})),Object.keys(t).sort((function(e,n){return Number(e)-Number(n)})).map((function(n){var r=e.clone(t[n]);if(f[r.freq]&&!(r.interval&&r.interval<1))return r._start=Number(n),r})).filter(Boolean)};n.getRecurring=function(n,o){t.CP_DEV_MODE&&(r=console.warn);var i=[];return n.forEach((function(n){var t=n.split("-"),s=new Date(t[0],t[1]),g=new Date(+s);g.setMonth(g.getMonth()+1),g.setMilliseconds(-1),r("Compute month",s.toLocaleDateString()),(o||[]).forEach((function(n){var t=new Date(n.start),o=new Date(n.end),E=n,b=n.recurrenceRule;if(b){var O=m(n),A=O.shift();if(!(t>=g)){for(var w=b.until,D=O.slice(),_=A;_&&_._start&&_._startn)){var t;if(n.getFullYear()===e.getFullYear())t=a(n)-a(e);else{var r=new Date(e.getFullYear(),11,31);for(t=a(r)-a(e)+a(n);r.getFullYear()+1=S)){r("Start iteration",a.toLocaleDateString());var m=function(n,t,o){var a=e.clone(t),i=new Date(a.start),s=a.id.split("|")[0],u=o.toLocaleDateString();v[s]=v[s]||{};var y=n.interval||1,m=n.freq,g=[],E=function(e,t){g=d[e](g,t,n)},b=function(e){return function(t){var r=new Date(+o);"yearly"===n.freq?(r.setMonth(0),r.setDate(1)):"monthly"===n.freq?r.setDate(1):"weekly"===n.freq?c(r,n.wkst):n.freq;var s=l[e](r,a,t,n);if(s)if(Array.isArray(s))s=s.filter((function(e){return e.toLocaleDateString()!==i.toLocaleDateString()})),Array.prototype.push.apply(g,s);else{if(r.toLocaleDateString()===i.toLocaleDateString())return;g.push(r)}}},O=e.once((function(){f[m](o,y)})),A=function(){"monthly"===m?o.setDate(15):"yearly"===m&&1===i.getMonth()&&29===i.getDate()&&o.setDate(28),O();var e=new Date(+o);if("monthly"===m||"yearly"===m){if(e.setDate(i.getDate()),e.getDate()!==i.getDate())return;if("yearly"===m&&e.getMonth()!==i.getMonth())return}g.push(e)};if(Array.isArray(v[s][u]))return r("Get cache",s,u),"monthly"===m?o.setDate(15):"yearly"===m&&1===i.getMonth()&&29===i.getDate()&&o.setDate(28),O(),v[s][u];if(n.by&&"yearly"===m){var w=h.slice(),D=!1;(n.by.weekno||n.by.yearday||n.by.monthday||n.by.day)&&(w.shift(),D=!0);var _=!0;w.forEach((function(e){var t=n.by[e];t&&(_?(t.forEach(b(e)),_=!1):"day"===e?n.by.yearday||n.by.monthday||n.by.weekno?E("day",n.by.day):n.by.day.forEach(b("day")):E(e,t))})),n.by.month&&D&&E("month",n.by.month)}n.by&&"monthly"===m&&(n.by.monthday||n.by.day?n.by.monthday?n.by.monthday.forEach(b("monthday")):n.by.day&&n.by.day.forEach(b("day")):A(),n.by.month&&E("month",n.by.month),n.by.day&&n.by.monthday&&E("day",n.by.day)),n.by&&"weekly"===m&&(n.by.day?n.by.day.forEach(b("day")):A(),n.by.month&&E("month",n.by.month)),n.by&&"daily"===m&&(A(),p.forEach((function(e){var t=n.by[e];t&&E(e,t)}))),g.sort((function(e,n){return e-n})),n.by&&n.by.setpos&&E("setpos",n.by.setpos),n.by&&Object.keys(n.by).length?O():A();var T=[];return g=g.filter((function(e){var n=new Date(+e).toLocaleDateString();return!T.includes(n)&&(T.push(n),!0)})),r("Set cache",s,u),v[s][u]=g,g}(b,n,a);if(r("Iteration results",JSON.stringify(m.map((function(e){return new Date(e).toLocaleDateString()})))),!m.length)return a.getFullYear()=S)return r(h.toLocaleDateString(),"count"),w=!0,!0;if(h>=g)return r(h.toLocaleDateString(),"endMonth"),w=!0,!0;if(b.until&&h>b.until)return r(h.toLocaleDateString(),"until"),w=!0,!0;if(!(h=g||h=s){if(y[c.id]&&y[c.id].includes(c.start))return;y[c.id]=y[c.id]||[],y[c.id].push(c.start)}if(E.timeZone&&!c.isAllDay){var m=function(e,n,t){var r=function(e,n){let t=e.toLocaleString("en-CA",{timeZone:n,hour12:!1}).replace(", ","T");return t+="."+e.getMilliseconds().toString().padStart(3,"0"),-(new Date(t+"Z")-e)},o=Intl.DateTimeFormat().resolvedOptions().timeZone,a=r(n,e)-r(t,e);return r(n,o)-r(t,o)-a}(E.timeZone,t,h);c.start+=m,c.end+=m}return i.push(c),D?(v(),!0):void 0}r(h.toLocaleDateString(),"start")})),w||N(a)}};N(t),r("Added this month (all events)",i.map((function(e){return new Date(e.start).toLocaleDateString()})))}}}}}))})),i},n.getAllOccurrences=function(e){if(!e.recurrenceRule)return[e.start];var t=e.recurrenceRule;if(!t.until&&!t.count)return!1;var r=[e.start],o=new Date(e.start);o.setDate(15);for(var a=[],i=0;(a=n.getRecurring([n.getMonthId(o)],[e]))&&(t.count?r.length=1e4;)t.setDate(t.getDate()-a),o++;return{d:o*=a,h:(t=new Date(n)).getHours()-r.getHours(),m:t.getMinutes()-r.getMinutes()}};return n.applyUpdates=function(e){return e.forEach((function(e){if(e.raw={start:e.start,end:e.end},e.recUpdate){var n,t=e.recUpdate.from||{},r=e.recUpdate.one||{},o=e.start,a=m(e).filter((function(e){return e._start>o})).shift(),i=function(n,t){var r=n[t],o=new Date(e.raw[t]);o.setDate(o.getDate()+r.d),o.setHours(o.getHours()+r.h),o.setMinutes(o.getMinutes()+r.m),e[t]=+o};(n=t,Object.keys(n).sort((function(e,n){return Number(e)-Number(n)}))).forEach((function(n){o",noCalendar:!1,now:new Date,onChange:[],onClose:[],onDayCreate:[],onDestroy:[],onKeyDown:[],onMonthChange:[],onOpen:[],onParseConfig:[],onReady:[],onValueUpdate:[],onYearChange:[],onPreCalendarPosition:[],plugins:[],position:"auto",positionElement:void 0,prevArrow:"",shorthandCurrentMonth:!1,showMonths:1,static:!1,time_24hr:!1,weekNumbers:!1,wrap:!1},o={weekdays:{shorthand:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],longhand:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},months:{shorthand:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],longhand:["January","February","March","April","May","June","July","August","September","October","November","December"]},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],firstDayOfWeek:0,ordinal:function(e){var n=e%100;if(n>3&&n<21)return"th";switch(n%10){case 1:return"st";case 2:return"nd";case 3:return"rd";default:return"th"}},rangeSeparator:" to ",weekAbbreviation:"Wk",scrollTitle:"Scroll to increment",toggleTitle:"Click to toggle",amPM:["AM","PM"],yearAriaLabel:"Year",monthAriaLabel:"Month",hourAriaLabel:"Hour",minuteAriaLabel:"Minute",time_24hr:!1},a=function(e,n){return void 0===n&&(n=2),("000"+e).slice(-1*n)},i=function(e){return!0===e?1:0};function s(e,n){var t;return function(){var r=this;clearTimeout(t),t=setTimeout((function(){return e.apply(r,arguments)}),n)}}var c=function(e){return e instanceof Array?e:[e]};function u(e,n,t){if(!0===t)return e.classList.add(n);e.classList.remove(n)}function f(e,n,t){var r=window.document.createElement(e);return n=n||"",t=t||"",r.className=n,void 0!==t&&(r.textContent=t),r}function l(e){for(;e.firstChild;)e.removeChild(e.firstChild)}function d(e,n){return n(e)?e:e.parentNode?d(e.parentNode,n):void 0}function h(e,n){var t=f("div","numInputWrapper"),r=f("input","numInput "+e),o=f("span","arrowUp"),a=f("span","arrowDown");if(-1===navigator.userAgent.indexOf("MSIE 9.0")?r.type="number":(r.type="text",r.pattern="\\d*"),void 0!==n)for(var i in n)r.setAttribute(i,n[i]);return t.appendChild(r),t.appendChild(o),t.appendChild(a),t}function p(e){try{return"function"==typeof e.composedPath?e.composedPath()[0]:e.target}catch(n){return e.target}}var v=function(){},y=function(e,n,t){return t.months[n?"shorthand":"longhand"][e]},m={D:v,F:function(e,n,t){e.setMonth(t.months.longhand.indexOf(n))},G:function(e,n){e.setHours(parseFloat(n))},H:function(e,n){e.setHours(parseFloat(n))},J:function(e,n){e.setDate(parseFloat(n))},K:function(e,n,t){e.setHours(e.getHours()%12+12*i(new RegExp(t.amPM[1],"i").test(n)))},M:function(e,n,t){e.setMonth(t.months.shorthand.indexOf(n))},S:function(e,n){e.setSeconds(parseFloat(n))},U:function(e,n){return new Date(1e3*parseFloat(n))},W:function(e,n,t){var r=parseInt(n),o=new Date(e.getFullYear(),0,2+7*(r-1),0,0,0,0);return o.setDate(o.getDate()-o.getDay()+t.firstDayOfWeek),o},Y:function(e,n){e.setFullYear(parseFloat(n))},Z:function(e,n){return new Date(n)},d:function(e,n){e.setDate(parseFloat(n))},h:function(e,n){e.setHours(parseFloat(n))},i:function(e,n){e.setMinutes(parseFloat(n))},j:function(e,n){e.setDate(parseFloat(n))},l:v,m:function(e,n){e.setMonth(parseFloat(n)-1)},n:function(e,n){e.setMonth(parseFloat(n)-1)},s:function(e,n){e.setSeconds(parseFloat(n))},u:function(e,n){return new Date(parseFloat(n))},w:v,y:function(e,n){e.setFullYear(2e3+parseFloat(n))}},g={D:"(\\w+)",F:"(\\w+)",G:"(\\d\\d|\\d)",H:"(\\d\\d|\\d)",J:"(\\d\\d|\\d)\\w+",K:"",M:"(\\w+)",S:"(\\d\\d|\\d)",U:"(.+)",W:"(\\d\\d|\\d)",Y:"(\\d{4})",Z:"(.+)",d:"(\\d\\d|\\d)",h:"(\\d\\d|\\d)",i:"(\\d\\d|\\d)",j:"(\\d\\d|\\d)",l:"(\\w+)",m:"(\\d\\d|\\d)",n:"(\\d\\d|\\d)",s:"(\\d\\d|\\d)",u:"(.+)",w:"(\\d\\d|\\d)",y:"(\\d{2})"},E={Z:function(e){return e.toISOString()},D:function(e,n,t){return n.weekdays.shorthand[E.w(e,n,t)]},F:function(e,n,t){return y(E.n(e,n,t)-1,!1,n)},G:function(e,n,t){return a(E.h(e,n,t))},H:function(e){return a(e.getHours())},J:function(e,n){return void 0!==n.ordinal?e.getDate()+n.ordinal(e.getDate()):e.getDate()},K:function(e,n){return n.amPM[i(e.getHours()>11)]},M:function(e,n){return y(e.getMonth(),!0,n)},S:function(e){return a(e.getSeconds())},U:function(e){return e.getTime()/1e3},W:function(e,n,t){return t.getWeek(e)},Y:function(e){return a(e.getFullYear(),4)},d:function(e){return a(e.getDate())},h:function(e){return e.getHours()%12?e.getHours()%12:12},i:function(e){return a(e.getMinutes())},j:function(e){return e.getDate()},l:function(e,n){return n.weekdays.longhand[e.getDay()]},m:function(e){return a(e.getMonth()+1)},n:function(e){return e.getMonth()+1},s:function(e){return e.getSeconds()},u:function(e){return e.getTime()},w:function(e){return e.getDay()},y:function(e){return String(e.getFullYear()).substring(2)}},b=function(e){var n=e.config,t=void 0===n?r:n,a=e.l10n,i=void 0===a?o:a,s=e.isMobile,c=void 0!==s&&s;return function(e,n,r){var o=r||i;return void 0===t.formatDate||c?n.split("").map((function(n,r,a){return E[n]&&"\\"!==a[r-1]?E[n](e,o,t):"\\"!==n?n:""})).join(""):t.formatDate(e,n,o)}},O=function(e){var n=e.config,t=void 0===n?r:n,a=e.l10n,i=void 0===a?o:a;return function(e,n,o,a){if(0===e||e){var s,c=a||i,u=e;if(e instanceof Date)s=new Date(e.getTime());else if("string"!=typeof e&&void 0!==e.toFixed)s=new Date(e);else if("string"==typeof e){var f=n||(t||r).dateFormat,l=String(e).trim();if("today"===l)s=new Date,o=!0;else if(/Z$/.test(l)||/GMT$/.test(l))s=new Date(e);else if(t&&t.parseDate)s=t.parseDate(e,f);else{s=t&&t.noCalendar?new Date((new Date).setHours(0,0,0,0)):new Date((new Date).getFullYear(),0,1,0,0,0,0);for(var d=void 0,h=[],p=0,v=0,y="";p=0?new Date:new Date(E.config.minDate.getTime()),t=D(E.config);n.setHours(t.hours,t.minutes,t.seconds,n.getMilliseconds()),E.selectedDates=[n],E.latestSelectedDateObj=n}void 0!==e&&"blur"!==e.type&&function(e){e.preventDefault();var n="keydown"===e.type,t=p(e),r=t;void 0!==E.amPM&&t===E.amPM&&(E.amPM.textContent=E.l10n.amPM[i(E.amPM.textContent===E.l10n.amPM[0])]);var o=parseFloat(r.getAttribute("min")),s=parseFloat(r.getAttribute("max")),c=parseFloat(r.getAttribute("step")),u=parseInt(r.value,10),f=u+c*(e.delta||(n?38===e.which?1:-1:0));if(void 0!==r.value&&2===r.value.length){var l=r===E.hourElement,d=r===E.minuteElement;fs&&(f=r===E.hourElement?f-s-i(!E.amPM):o,d&&L(void 0,1,E.hourElement)),E.amPM&&l&&(1===c?f+u===23:Math.abs(f-u)>c)&&(E.amPM.textContent=E.l10n.amPM[i(E.amPM.textContent===E.l10n.amPM[0])]),r.value=a(f)}}(e);var r=E._input.value;N(),be(),E._input.value!==r&&E._debouncedChange()}function N(){if(void 0!==E.hourElement&&void 0!==E.minuteElement){var e,n,t=(parseInt(E.hourElement.value.slice(-2),10)||0)%24,r=(parseInt(E.minuteElement.value,10)||0)%60,o=void 0!==E.secondElement?(parseInt(E.secondElement.value,10)||0)%60:0;void 0!==E.amPM&&(e=t,n=E.amPM.textContent,t=e%12+12*i(n===E.l10n.amPM[1]));var a=void 0!==E.config.minTime||E.config.minDate&&E.minDateHasTime&&E.latestSelectedDateObj&&0===A(E.latestSelectedDateObj,E.config.minDate,!0);if(void 0!==E.config.maxTime||E.config.maxDate&&E.maxDateHasTime&&E.latestSelectedDateObj&&0===A(E.latestSelectedDateObj,E.config.maxDate,!0)){var s=void 0!==E.config.maxTime?E.config.maxTime:E.config.maxDate;(t=Math.min(t,s.getHours()))===s.getHours()&&(r=Math.min(r,s.getMinutes())),r===s.getMinutes()&&(o=Math.min(o,s.getSeconds()))}if(a){var c=void 0!==E.config.minTime?E.config.minTime:E.config.minDate;(t=Math.max(t,c.getHours()))===c.getHours()&&r=12)]),void 0!==E.secondElement&&(E.secondElement.value=a(t)))}function R(e){var n=p(e),t=parseInt(n.value)+(e.delta||0);(t/1e3>1||"Enter"===e.key&&!/[^\d]/.test(t.toString()))&&Z(t)}function P(e,n,t,r){return n instanceof Array?n.forEach((function(n){return P(e,n,t,r)})):e instanceof Array?e.forEach((function(e){return P(e,n,t,r)})):(e.addEventListener(n,t,r),void E._handlers.push({remove:function(){return e.removeEventListener(n,t)}}))}function k(){ve("onChange")}function M(e,n){var t=void 0!==e?E.parseDate(e):E.latestSelectedDateObj||(E.config.minDate&&E.config.minDate>E.now?E.config.minDate:E.config.maxDate&&E.config.maxDate=0&&A(e,E.selectedDates[1])<=0}(n)&&!me(n)&&a.classList.add("inRange"),E.weekNumbers&&1===E.config.showMonths&&"prevMonthDay"!==e&&t%7==1&&E.weekNumbers.insertAdjacentHTML("beforeend",""+E.config.getWeek(n)+""),ve("onDayCreate",a),a}function j(e){e.focus(),"range"===E.config.mode&&re(e)}function K(e){for(var n=e>0?0:E.config.showMonths-1,t=e>0?E.config.showMonths:-1,r=n;r!=t;r+=e)for(var o=E.daysContainer.children[r],a=e>0?0:o.children.length-1,i=e>0?o.children.length:-1,s=a;s!=i;s+=e){var c=o.children[s];if(-1===c.className.indexOf("hidden")&&$(c.dateObj))return c}}function U(e,n){var t=ee(document.activeElement||document.body),r=void 0!==e?e:t?document.activeElement:void 0!==E.selectedDateElem&&ee(E.selectedDateElem)?E.selectedDateElem:void 0!==E.todayDateElem&&ee(E.todayDateElem)?E.todayDateElem:K(n>0?1:-1);void 0===r?E._input.focus():t?function(e,n){for(var t=-1===e.className.indexOf("Month")?e.dateObj.getMonth():E.currentMonth,r=n>0?E.config.showMonths:-1,o=n>0?1:-1,a=t-E.currentMonth;a!=r;a+=o)for(var i=E.daysContainer.children[a],s=t-E.currentMonth===a?e.$i+n:n<0?i.children.length-1:0,c=i.children.length,u=s;u>=0&&u0?c:-1);u+=o){var f=i.children[u];if(-1===f.className.indexOf("hidden")&&$(f.dateObj)&&Math.abs(e.$i-u)>=Math.abs(n))return j(f)}E.changeMonth(o),U(K(o),0)}(r,n):j(r)}function B(e,n){for(var t=(new Date(e,n,1).getDay()-E.l10n.firstDayOfWeek+7)%7,r=E.utils.getDaysInMonth((n-1+12)%12,e),o=E.utils.getDaysInMonth(n,e),a=window.document.createDocumentFragment(),i=E.config.showMonths>1,s=i?"prevMonthDay hidden":"prevMonthDay",c=i?"nextMonthDay hidden":"nextMonthDay",u=r+1-t,l=0;u<=r;u++,l++)a.appendChild(H(s,new Date(e,n-1,u),u,l));for(u=1;u<=o;u++,l++)a.appendChild(H("",new Date(e,n,u),u,l));for(var d=o+1;d<=42-t&&(1===E.config.showMonths||l%7!=0);d++,l++)a.appendChild(H(c,new Date(e,n+1,d%o),d,l));var h=f("div","dayContainer");return h.appendChild(a),h}function V(){if(void 0!==E.daysContainer){l(E.daysContainer),E.weekNumbers&&l(E.weekNumbers);for(var e=document.createDocumentFragment(),n=0;n1||"dropdown"!==E.config.monthSelectorType)){var e=function(e){return!(void 0!==E.config.minDate&&E.currentYear===E.config.minDate.getFullYear()&&eE.config.maxDate.getMonth())};E.monthsDropdownContainer.tabIndex=-1,E.monthsDropdownContainer.innerHTML="";for(var n=0;n<12;n++)if(e(n)){var t=f("option","flatpickr-monthDropdown-month");t.value=new Date(E.currentYear,n).getMonth().toString(),t.textContent=y(n,E.config.shorthandCurrentMonth,E.l10n),t.tabIndex=-1,E.currentMonth===n&&(t.selected=!0),E.monthsDropdownContainer.appendChild(t)}}}function G(){var e,n=f("div","flatpickr-month"),t=window.document.createDocumentFragment();E.config.showMonths>1||"static"===E.config.monthSelectorType?e=f("span","cur-month"):(E.monthsDropdownContainer=f("select","flatpickr-monthDropdown-months"),E.monthsDropdownContainer.setAttribute("aria-label",E.l10n.monthAriaLabel),P(E.monthsDropdownContainer,"change",(function(e){var n=p(e),t=parseInt(n.value,10);E.changeMonth(t-E.currentMonth),ve("onMonthChange")})),Y(),e=E.monthsDropdownContainer);var r=h("cur-year",{tabindex:"-1"}),o=r.getElementsByTagName("input")[0];o.setAttribute("aria-label",E.l10n.yearAriaLabel),E.config.minDate&&o.setAttribute("min",E.config.minDate.getFullYear().toString()),E.config.maxDate&&(o.setAttribute("max",E.config.maxDate.getFullYear().toString()),o.disabled=!!E.config.minDate&&E.config.minDate.getFullYear()===E.config.maxDate.getFullYear());var a=f("div","flatpickr-current-month");return a.appendChild(e),a.appendChild(r),t.appendChild(a),n.appendChild(t),{container:n,yearElement:o,monthElement:e}}function J(){l(E.monthNav),E.monthNav.appendChild(E.prevMonthNav),E.config.showMonths&&(E.yearElements=[],E.monthElements=[]);for(var e=E.config.showMonths;e--;){var n=G();E.yearElements.push(n.yearElement),E.monthElements.push(n.monthElement),E.monthNav.appendChild(n.container)}E.monthNav.appendChild(E.nextMonthNav)}function W(){E.weekdayContainer?l(E.weekdayContainer):E.weekdayContainer=f("div","flatpickr-weekdays");for(var e=E.config.showMonths;e--;){var n=f("div","flatpickr-weekdaycontainer");E.weekdayContainer.appendChild(n)}return q(),E.weekdayContainer}function q(){if(E.weekdayContainer){var e=E.l10n.firstDayOfWeek,t=n(E.l10n.weekdays.shorthand);e>0&&e\n "+t.join("")+"\n \n "}}function z(e,n){void 0===n&&(n=!0);var t=n?e:e-E.currentMonth;t<0&&!0===E._hidePrevMonthArrow||t>0&&!0===E._hideNextMonthArrow||(E.currentMonth+=t,(E.currentMonth<0||E.currentMonth>11)&&(E.currentYear+=E.currentMonth>11?1:-1,E.currentMonth=(E.currentMonth+12)%12,ve("onYearChange"),Y()),V(),ve("onMonthChange"),ge())}function Q(e){return!(!E.config.appendTo||!E.config.appendTo.contains(e))||E.calendarContainer.contains(e)}function X(e){if(E.isOpen&&!E.config.inline){var n=p(e),t=Q(n),r=n===E.input||n===E.altInput||E.element.contains(n)||e.path&&e.path.indexOf&&(~e.path.indexOf(E.input)||~e.path.indexOf(E.altInput)),o="blur"===e.type?r&&e.relatedTarget&&!Q(e.relatedTarget):!r&&!t&&!Q(e.relatedTarget),a=!E.config.ignoredFocusElements.some((function(e){return e.contains(n)}));o&&a&&(void 0!==E.timeContainer&&void 0!==E.minuteElement&&void 0!==E.hourElement&&""!==E.input.value&&void 0!==E.input.value&&x(),E.close(),E.config&&"range"===E.config.mode&&1===E.selectedDates.length&&(E.clear(!1),E.redraw()))}}function Z(e){if(!(!e||E.config.minDate&&eE.config.maxDate.getFullYear())){var n=e,t=E.currentYear!==n;E.currentYear=n||E.currentYear,E.config.maxDate&&E.currentYear===E.config.maxDate.getFullYear()?E.currentMonth=Math.min(E.config.maxDate.getMonth(),E.currentMonth):E.config.minDate&&E.currentYear===E.config.minDate.getFullYear()&&(E.currentMonth=Math.max(E.config.minDate.getMonth(),E.currentMonth)),t&&(E.redraw(),ve("onYearChange"),Y())}}function $(e,n){var t;void 0===n&&(n=!0);var r=E.parseDate(e,void 0,n);if(E.config.minDate&&r&&A(r,E.config.minDate,void 0!==n?n:!E.minDateHasTime)<0||E.config.maxDate&&r&&A(r,E.config.maxDate,void 0!==n?n:!E.maxDateHasTime)>0)return!1;if(!E.config.enable&&0===E.config.disable.length)return!0;if(void 0===r)return!1;for(var o=!!E.config.enable,a=null!==(t=E.config.enable)&&void 0!==t?t:E.config.disable,i=0,s=void 0;i=s.from.getTime()&&r.getTime()<=s.to.getTime())return o}return!o}function ee(e){return void 0!==E.daysContainer&&-1===e.className.indexOf("hidden")&&-1===e.className.indexOf("flatpickr-disabled")&&E.daysContainer.contains(e)}function ne(e){e.target!==E._input||!(E.selectedDates.length>0||E._input.value.length>0)||e.relatedTarget&&Q(e.relatedTarget)||E.setDate(E._input.value,!0,e.target===E.altInput?E.config.altFormat:E.config.dateFormat)}function te(e){var n=p(e),t=E.config.wrap?v.contains(n):n===E._input,r=E.config.allowInput,o=E.isOpen&&(!r||!t),a=E.config.inline&&t&&!r;if(13===e.keyCode&&t){if(r)return E.setDate(E._input.value,!0,n===E.altInput?E.config.altFormat:E.config.dateFormat),n.blur();E.open()}else if(Q(n)||o||a){var i=!!E.timeContainer&&E.timeContainer.contains(n);switch(e.keyCode){case 13:i?(e.preventDefault(),x(),fe()):le(e);break;case 27:e.preventDefault(),fe();break;case 8:case 46:t&&!E.config.allowInput&&(e.preventDefault(),E.clear());break;case 37:case 39:if(i||t)E.hourElement&&E.hourElement.focus();else if(e.preventDefault(),void 0!==E.daysContainer&&(!1===r||document.activeElement&&ee(document.activeElement))){var s=39===e.keyCode?1:-1;e.ctrlKey?(e.stopPropagation(),z(s),U(K(1),0)):U(void 0,s)}break;case 38:case 40:e.preventDefault();var c=40===e.keyCode?1:-1;E.daysContainer&&void 0!==n.$i||n===E.input||n===E.altInput?e.ctrlKey?(e.stopPropagation(),Z(E.currentYear-c),U(K(1),0)):i||U(void 0,7*c):n===E.currentYearElement?Z(E.currentYear-c):E.config.enableTime&&(!i&&E.hourElement&&E.hourElement.focus(),x(e),E._debouncedChange());break;case 9:if(i){var u=[E.hourElement,E.minuteElement,E.secondElement,E.amPM].concat(E.pluginElements).filter((function(e){return e})),f=u.indexOf(n);if(-1!==f){var l=u[f+(e.shiftKey?-1:1)];e.preventDefault(),(l||E._input).focus()}}else!E.config.noCalendar&&E.daysContainer&&E.daysContainer.contains(n)&&e.shiftKey&&(e.preventDefault(),E._input.focus())}}if(void 0!==E.amPM&&n===E.amPM)switch(e.key){case E.l10n.amPM[0].charAt(0):case E.l10n.amPM[0].charAt(0).toLowerCase():E.amPM.textContent=E.l10n.amPM[0],N(),be();break;case E.l10n.amPM[1].charAt(0):case E.l10n.amPM[1].charAt(0).toLowerCase():E.amPM.textContent=E.l10n.amPM[1],N(),be()}(t||Q(n))&&ve("onKeyDown",e)}function re(e){if(1===E.selectedDates.length&&(!e||e.classList.contains("flatpickr-day")&&!e.classList.contains("flatpickr-disabled"))){for(var n=e?e.dateObj.getTime():E.days.firstElementChild.dateObj.getTime(),t=E.parseDate(E.selectedDates[0],void 0,!0).getTime(),r=Math.min(n,E.selectedDates[0].getTime()),o=Math.max(n,E.selectedDates[0].getTime()),a=!1,i=0,s=0,c=r;cr&&ci)?i=c:c>t&&(!s||c0&&h0&&h>s;return p?(d.classList.add("notAllowed"),["inRange","startRange","endRange"].forEach((function(e){d.classList.remove(e)})),"continue"):a&&!p?"continue":(["startRange","inRange","endRange","notAllowed"].forEach((function(e){d.classList.remove(e)})),void(void 0!==e&&(e.classList.add(n<=E.selectedDates[0].getTime()?"startRange":"endRange"),tn&&h===t&&d.classList.add("endRange"),h>=i&&(0===s||h<=s)&&(u=t,l=n,(c=h)>Math.min(u,l)&&c0||t.getMinutes()>0||t.getSeconds()>0),E.selectedDates&&(E.selectedDates=E.selectedDates.filter((function(e){return $(e)})),E.selectedDates.length||"min"!==e||I(t),be()),E.daysContainer&&(ue(),void 0!==t?E.currentYearElement[e]=t.getFullYear().toString():E.currentYearElement.removeAttribute(e),E.currentYearElement.disabled=!!r&&void 0!==t&&r.getFullYear()===t.getFullYear())}}function ie(){return E.config.wrap?v.querySelector("[data-input]"):v}function se(){"object"!=typeof E.config.locale&&void 0===S.l10ns[E.config.locale]&&E.config.errorHandler(new Error("flatpickr: invalid locale "+E.config.locale)),E.l10n=e(e({},S.l10ns.default),"object"==typeof E.config.locale?E.config.locale:"default"!==E.config.locale?S.l10ns[E.config.locale]:void 0),g.K="("+E.l10n.amPM[0]+"|"+E.l10n.amPM[1]+"|"+E.l10n.amPM[0].toLowerCase()+"|"+E.l10n.amPM[1].toLowerCase()+")",void 0===e(e({},m),JSON.parse(JSON.stringify(v.dataset||{}))).time_24hr&&void 0===S.defaultConfig.time_24hr&&(E.config.time_24hr=E.l10n.time_24hr),E.formatDate=b(E),E.parseDate=O({config:E.config,l10n:E.l10n})}function ce(e){if("function"!=typeof E.config.position){if(void 0!==E.calendarContainer){ve("onPreCalendarPosition");var n=e||E._positionElement,t=Array.prototype.reduce.call(E.calendarContainer.children,(function(e,n){return e+n.offsetHeight}),0),r=E.calendarContainer.offsetWidth,o=E.config.position.split(" "),a=o[0],i=o.length>1?o[1]:null,s=n.getBoundingClientRect(),c=window.innerHeight-s.bottom,f="above"===a||"below"!==a&&ct,l=window.pageYOffset+s.top+(f?-t-2:n.offsetHeight+2);if(u(E.calendarContainer,"arrowTop",!f),u(E.calendarContainer,"arrowBottom",f),!E.config.inline){var d=window.pageXOffset+s.left,h=!1,p=!1;"center"===i?(d-=(r-s.width)/2,h=!0):"right"===i&&(d-=r-s.width,p=!0),u(E.calendarContainer,"arrowLeft",!h&&!p),u(E.calendarContainer,"arrowCenter",h),u(E.calendarContainer,"arrowRight",p);var v=window.document.body.offsetWidth-(window.pageXOffset+s.right),y=d+r>window.document.body.offsetWidth,m=v+r>window.document.body.offsetWidth;if(u(E.calendarContainer,"rightMost",y),!E.config.static)if(E.calendarContainer.style.top=l+"px",y)if(m){var g=function(){for(var e=null,n=0;nE.currentMonth+E.config.showMonths-1)&&"range"!==E.config.mode;if(E.selectedDateElem=t,"single"===E.config.mode)E.selectedDates=[r];else if("multiple"===E.config.mode){var a=me(r);a?E.selectedDates.splice(parseInt(a),1):E.selectedDates.push(r)}else"range"===E.config.mode&&(2===E.selectedDates.length&&E.clear(!1,!1),E.latestSelectedDateObj=r,E.selectedDates.push(r),0!==A(r,E.selectedDates[0],!0)&&E.selectedDates.sort((function(e,n){return e.getTime()-n.getTime()})));if(N(),o){var i=E.currentYear!==r.getFullYear();E.currentYear=r.getFullYear(),E.currentMonth=r.getMonth(),i&&(ve("onYearChange"),Y()),ve("onMonthChange")}if(ge(),V(),be(),o||"range"===E.config.mode||1!==E.config.showMonths?void 0!==E.selectedDateElem&&void 0===E.hourElement&&E.selectedDateElem&&E.selectedDateElem.focus():j(t),void 0!==E.hourElement&&void 0!==E.hourElement&&E.hourElement.focus(),E.config.closeOnSelect){var s="single"===E.config.mode&&!E.config.enableTime,c="range"===E.config.mode&&2===E.selectedDates.length&&!E.config.enableTime;(s||c)&&fe()}k()}}E.parseDate=O({config:E.config,l10n:E.l10n}),E._handlers=[],E.pluginElements=[],E.loadedPlugins=[],E._bind=P,E._setHoursFromDate=I,E._positionCalendar=ce,E.changeMonth=z,E.changeYear=Z,E.clear=function(e,n){if(void 0===e&&(e=!0),void 0===n&&(n=!0),E.input.value="",void 0!==E.altInput&&(E.altInput.value=""),void 0!==E.mobileInput&&(E.mobileInput.value=""),E.selectedDates=[],E.latestSelectedDateObj=void 0,!0===n&&(E.currentYear=E._initialDate.getFullYear(),E.currentMonth=E._initialDate.getMonth()),!0===E.config.enableTime){var t=D(E.config);C(t.hours,t.minutes,t.seconds)}E.redraw(),e&&ve("onChange")},E.close=function(){E.isOpen=!1,E.isMobile||(void 0!==E.calendarContainer&&E.calendarContainer.classList.remove("open"),void 0!==E._input&&E._input.classList.remove("active")),ve("onClose")},E._createElement=f,E.destroy=function(){void 0!==E.config&&ve("onDestroy");for(var e=E._handlers.length;e--;)E._handlers[e].remove();if(E._handlers=[],E.mobileInput)E.mobileInput.parentNode&&E.mobileInput.parentNode.removeChild(E.mobileInput),E.mobileInput=void 0;else if(E.calendarContainer&&E.calendarContainer.parentNode)if(E.config.static&&E.calendarContainer.parentNode){var n=E.calendarContainer.parentNode;if(n.lastChild&&n.removeChild(n.lastChild),n.parentNode){for(;n.firstChild;)n.parentNode.insertBefore(n.firstChild,n);n.parentNode.removeChild(n)}}else E.calendarContainer.parentNode.removeChild(E.calendarContainer);E.altInput&&(E.input.type="text",E.altInput.parentNode&&E.altInput.parentNode.removeChild(E.altInput),delete E.altInput),E.input&&(E.input.type=E.input._type,E.input.classList.remove("flatpickr-input"),E.input.removeAttribute("readonly")),["_showTimeInput","latestSelectedDateObj","_hideNextMonthArrow","_hidePrevMonthArrow","__hideNextMonthArrow","__hidePrevMonthArrow","isMobile","isOpen","selectedDateElem","minDateHasTime","maxDateHasTime","days","daysContainer","_input","_positionElement","innerContainer","rContainer","monthNav","todayDateElem","calendarContainer","weekdayContainer","prevMonthNav","nextMonthNav","monthsDropdownContainer","currentMonthElement","currentYearElement","navigationCurrentMonth","selectedDateElem","config"].forEach((function(e){try{delete E[e]}catch(e){}}))},E.isEnabled=$,E.jumpToDate=M,E.open=function(e,n){if(void 0===n&&(n=E._positionElement),!0===E.isMobile){if(e){e.preventDefault();var t=p(e);t&&t.blur()}return void 0!==E.mobileInput&&(E.mobileInput.focus(),E.mobileInput.click()),void ve("onOpen")}if(!E._input.disabled&&!E.config.inline){var r=E.isOpen;E.isOpen=!0,r||(E.calendarContainer.classList.add("open"),E._input.classList.add("active"),ve("onOpen"),ce(n)),!0===E.config.enableTime&&!0===E.config.noCalendar&&(!1!==E.config.allowInput||void 0!==e&&E.timeContainer.contains(e.relatedTarget)||setTimeout((function(){return E.hourElement.select()}),50))}},E.redraw=ue,E.set=function(e,n){if(null!==e&&"object"==typeof e)for(var r in Object.assign(E.config,e),e)void 0!==de[r]&&de[r].forEach((function(e){return e()}));else E.config[e]=n,void 0!==de[e]?de[e].forEach((function(e){return e()})):t.indexOf(e)>-1&&(E.config[e]=c(n));E.redraw(),be(!0)},E.setDate=function(e,n,t){if(void 0===n&&(n=!1),void 0===t&&(t=E.config.dateFormat),0!==e&&!e||e instanceof Array&&0===e.length)return E.clear(n);he(e,t),E.latestSelectedDateObj=E.selectedDates[E.selectedDates.length-1],E.redraw(),M(void 0,n),I(),0===E.selectedDates.length&&E.clear(!1),be(n),n&&ve("onChange")},E.toggle=function(e){if(!0===E.isOpen)return E.close();E.open(e)};var de={locale:[se,q],showMonths:[J,T,W],minDate:[M],maxDate:[M],clickOpens:[function(){!0===E.config.clickOpens?(P(E._input,"focus",E.open),P(E._input,"click",E.open)):(E._input.removeEventListener("focus",E.open),E._input.removeEventListener("click",E.open))}]};function he(e,n){var t=[];if(e instanceof Array)t=e.map((function(e){return E.parseDate(e,n)}));else if(e instanceof Date||"number"==typeof e)t=[E.parseDate(e,n)];else if("string"==typeof e)switch(E.config.mode){case"single":case"time":t=[E.parseDate(e,n)];break;case"multiple":t=e.split(E.config.conjunction).map((function(e){return E.parseDate(e,n)}));break;case"range":t=e.split(E.l10n.rangeSeparator).map((function(e){return E.parseDate(e,n)}))}else E.config.errorHandler(new Error("Invalid date supplied: "+JSON.stringify(e)));E.selectedDates=E.config.allowInvalidPreload?t:t.filter((function(e){return e instanceof Date&&$(e,!1)})),"range"===E.config.mode&&E.selectedDates.sort((function(e,n){return e.getTime()-n.getTime()}))}function pe(e){return e.slice().map((function(e){return"string"==typeof e||"number"==typeof e||e instanceof Date?E.parseDate(e,void 0,!0):e&&"object"==typeof e&&e.from&&e.to?{from:E.parseDate(e.from,void 0),to:E.parseDate(e.to,void 0)}:e})).filter((function(e){return e}))}function ve(e,n){if(void 0!==E.config){var t=E.config[e];if(void 0!==t&&t.length>0)for(var r=0;t[r]&&r1||"static"===E.config.monthSelectorType?E.monthElements[n].textContent=y(t.getMonth(),E.config.shorthandCurrentMonth,E.l10n)+" ":E.monthsDropdownContainer.value=t.getMonth().toString(),e.value=t.getFullYear().toString()})),E._hidePrevMonthArrow=void 0!==E.config.minDate&&(E.currentYear===E.config.minDate.getFullYear()?E.currentMonth<=E.config.minDate.getMonth():E.currentYearE.config.maxDate.getMonth():E.currentYear>E.config.maxDate.getFullYear()))}function Ee(e){return E.selectedDates.map((function(n){return E.formatDate(n,e)})).filter((function(e,n,t){return"range"!==E.config.mode||E.config.enableTime||t.indexOf(e)===n})).join("range"!==E.config.mode?E.config.conjunction:E.l10n.rangeSeparator)}function be(e){void 0===e&&(e=!0),void 0!==E.mobileInput&&E.mobileFormatStr&&(E.mobileInput.value=void 0!==E.latestSelectedDateObj?E.formatDate(E.latestSelectedDateObj,E.mobileFormatStr):""),E.input.value=Ee(E.config.dateFormat),void 0!==E.altInput&&(E.altInput.value=Ee(E.config.altFormat)),!1!==e&&ve("onValueUpdate")}function Oe(e){var n=p(e),t=E.prevMonthNav.contains(n),r=E.nextMonthNav.contains(n);t||r?z(t?-1:1):E.yearElements.indexOf(n)>=0?n.select():n.classList.contains("arrowUp")?E.changeYear(E.currentYear+1):n.classList.contains("arrowDown")&&E.changeYear(E.currentYear-1)}return function(){E.element=E.input=v,E.isOpen=!1,function(){var n=["wrap","weekNumbers","allowInput","allowInvalidPreload","clickOpens","time_24hr","enableTime","noCalendar","altInput","shorthandCurrentMonth","inline","static","enableSeconds","disableMobile"],o=e(e({},JSON.parse(JSON.stringify(v.dataset||{}))),m),a={};E.config.parseDate=o.parseDate,E.config.formatDate=o.formatDate,Object.defineProperty(E.config,"enable",{get:function(){return E.config._enable},set:function(e){E.config._enable=pe(e)}}),Object.defineProperty(E.config,"disable",{get:function(){return E.config._disable},set:function(e){E.config._disable=pe(e)}});var i="time"===o.mode;if(!o.dateFormat&&(o.enableTime||i)){var s=S.defaultConfig.dateFormat||r.dateFormat;a.dateFormat=o.noCalendar||i?"H:i"+(o.enableSeconds?":S":""):s+" H:i"+(o.enableSeconds?":S":"")}if(o.altInput&&(o.enableTime||i)&&!o.altFormat){var u=S.defaultConfig.altFormat||r.altFormat;a.altFormat=o.noCalendar||i?"h:i"+(o.enableSeconds?":S K":" K"):u+" h:i"+(o.enableSeconds?":S":"")+" K"}Object.defineProperty(E.config,"minDate",{get:function(){return E.config._minDate},set:ae("min")}),Object.defineProperty(E.config,"maxDate",{get:function(){return E.config._maxDate},set:ae("max")});var f=function(e){return function(n){E.config["min"===e?"_minTime":"_maxTime"]=E.parseDate(n,"H:i:S")}};Object.defineProperty(E.config,"minTime",{get:function(){return E.config._minTime},set:f("min")}),Object.defineProperty(E.config,"maxTime",{get:function(){return E.config._maxTime},set:f("max")}),"time"===o.mode&&(E.config.noCalendar=!0,E.config.enableTime=!0),Object.assign(E.config,a,o);for(var l=0;l-1?E.config[h]=c(d[h]).map(_).concat(E.config[h]):void 0===o[h]&&(E.config[h]=d[h])}o.altInputClass||(E.config.altInputClass=ie().className+" "+E.config.altInputClass),ve("onParseConfig")}(),se(),E.input=ie(),E.input?(E.input._type=E.input.type,E.input.type="text",E.input.classList.add("flatpickr-input"),E._input=E.input,E.config.altInput&&(E.altInput=f(E.input.nodeName,E.config.altInputClass),E._input=E.altInput,E.altInput.placeholder=E.input.placeholder,E.altInput.disabled=E.input.disabled,E.altInput.required=E.input.required,E.altInput.tabIndex=E.input.tabIndex,E.altInput.type="text",E.input.setAttribute("type","hidden"),!E.config.static&&E.input.parentNode&&E.input.parentNode.insertBefore(E.altInput,E.input.nextSibling)),E.config.allowInput||E._input.setAttribute("readonly","readonly"),E._positionElement=E.config.positionElement||E._input):E.config.errorHandler(new Error("Invalid input element specified")),function(){E.selectedDates=[],E.now=E.parseDate(E.config.now)||new Date;var e=E.config.defaultDate||("INPUT"!==E.input.nodeName&&"TEXTAREA"!==E.input.nodeName||!E.input.placeholder||E.input.value!==E.input.placeholder?E.input.value:null);e&&he(e,E.config.dateFormat),E._initialDate=E.selectedDates.length>0?E.selectedDates[0]:E.config.minDate&&E.config.minDate.getTime()>E.now.getTime()?E.config.minDate:E.config.maxDate&&E.config.maxDate.getTime()0&&(E.latestSelectedDateObj=E.selectedDates[0]),void 0!==E.config.minTime&&(E.config.minTime=E.parseDate(E.config.minTime,"H:i")),void 0!==E.config.maxTime&&(E.config.maxTime=E.parseDate(E.config.maxTime,"H:i")),E.minDateHasTime=!!E.config.minDate&&(E.config.minDate.getHours()>0||E.config.minDate.getMinutes()>0||E.config.minDate.getSeconds()>0),E.maxDateHasTime=!!E.config.maxDate&&(E.config.maxDate.getHours()>0||E.config.maxDate.getMinutes()>0||E.config.maxDate.getSeconds()>0)}(),E.utils={getDaysInMonth:function(e,n){return void 0===e&&(e=E.currentMonth),void 0===n&&(n=E.currentYear),1===e&&(n%4==0&&n%100!=0||n%400==0)?29:E.l10n.daysInMonth[e]}},E.isMobile||function(){var e=window.document.createDocumentFragment();if(E.calendarContainer=f("div","flatpickr-calendar"),E.calendarContainer.tabIndex=-1,!E.config.noCalendar){if(e.appendChild((E.monthNav=f("div","flatpickr-months"),E.yearElements=[],E.monthElements=[],E.prevMonthNav=f("span","flatpickr-prev-month"),E.prevMonthNav.innerHTML=E.config.prevArrow,E.nextMonthNav=f("span","flatpickr-next-month"),E.nextMonthNav.innerHTML=E.config.nextArrow,J(),Object.defineProperty(E,"_hidePrevMonthArrow",{get:function(){return E.__hidePrevMonthArrow},set:function(e){E.__hidePrevMonthArrow!==e&&(u(E.prevMonthNav,"flatpickr-disabled",e),E.__hidePrevMonthArrow=e)}}),Object.defineProperty(E,"_hideNextMonthArrow",{get:function(){return E.__hideNextMonthArrow},set:function(e){E.__hideNextMonthArrow!==e&&(u(E.nextMonthNav,"flatpickr-disabled",e),E.__hideNextMonthArrow=e)}}),E.currentYearElement=E.yearElements[0],ge(),E.monthNav)),E.innerContainer=f("div","flatpickr-innerContainer"),E.config.weekNumbers){var n=function(){E.calendarContainer.classList.add("hasWeeks");var e=f("div","flatpickr-weekwrapper");e.appendChild(f("span","flatpickr-weekday",E.l10n.weekAbbreviation));var n=f("div","flatpickr-weeks");return e.appendChild(n),{weekWrapper:e,weekNumbers:n}}(),t=n.weekWrapper,r=n.weekNumbers;E.innerContainer.appendChild(t),E.weekNumbers=r,E.weekWrapper=t}E.rContainer=f("div","flatpickr-rContainer"),E.rContainer.appendChild(W()),E.daysContainer||(E.daysContainer=f("div","flatpickr-days"),E.daysContainer.tabIndex=-1),V(),E.rContainer.appendChild(E.daysContainer),E.innerContainer.appendChild(E.rContainer),e.appendChild(E.innerContainer)}E.config.enableTime&&e.appendChild(function(){E.calendarContainer.classList.add("hasTime"),E.config.noCalendar&&E.calendarContainer.classList.add("noCalendar");var e=D(E.config);E.timeContainer=f("div","flatpickr-time"),E.timeContainer.tabIndex=-1;var n=f("span","flatpickr-time-separator",":"),t=h("flatpickr-hour",{"aria-label":E.l10n.hourAriaLabel});E.hourElement=t.getElementsByTagName("input")[0];var r=h("flatpickr-minute",{"aria-label":E.l10n.minuteAriaLabel});if(E.minuteElement=r.getElementsByTagName("input")[0],E.hourElement.tabIndex=E.minuteElement.tabIndex=-1,E.hourElement.value=a(E.latestSelectedDateObj?E.latestSelectedDateObj.getHours():E.config.time_24hr?e.hours:function(e){switch(e%24){case 0:case 12:return 12;default:return e%12}}(e.hours)),E.minuteElement.value=a(E.latestSelectedDateObj?E.latestSelectedDateObj.getMinutes():e.minutes),E.hourElement.setAttribute("step",E.config.hourIncrement.toString()),E.minuteElement.setAttribute("step",E.config.minuteIncrement.toString()),E.hourElement.setAttribute("min",E.config.time_24hr?"0":"1"),E.hourElement.setAttribute("max",E.config.time_24hr?"23":"12"),E.hourElement.setAttribute("maxlength","2"),E.minuteElement.setAttribute("min","0"),E.minuteElement.setAttribute("max","59"),E.minuteElement.setAttribute("maxlength","2"),E.timeContainer.appendChild(t),E.timeContainer.appendChild(n),E.timeContainer.appendChild(r),E.config.time_24hr&&E.timeContainer.classList.add("time24hr"),E.config.enableSeconds){E.timeContainer.classList.add("hasSeconds");var o=h("flatpickr-second");E.secondElement=o.getElementsByTagName("input")[0],E.secondElement.value=a(E.latestSelectedDateObj?E.latestSelectedDateObj.getSeconds():e.seconds),E.secondElement.setAttribute("step",E.minuteElement.getAttribute("step")),E.secondElement.setAttribute("min","0"),E.secondElement.setAttribute("max","59"),E.secondElement.setAttribute("maxlength","2"),E.timeContainer.appendChild(f("span","flatpickr-time-separator",":")),E.timeContainer.appendChild(o)}return E.config.time_24hr||(E.amPM=f("span","flatpickr-am-pm",E.l10n.amPM[i((E.latestSelectedDateObj?E.hourElement.value:E.config.defaultHour)>11)]),E.amPM.title=E.l10n.toggleTitle,E.amPM.tabIndex=-1,E.timeContainer.appendChild(E.amPM)),E.timeContainer}()),u(E.calendarContainer,"rangeMode","range"===E.config.mode),u(E.calendarContainer,"animate",!0===E.config.animate),u(E.calendarContainer,"multiMonth",E.config.showMonths>1),E.calendarContainer.appendChild(e);var o=void 0!==E.config.appendTo&&void 0!==E.config.appendTo.nodeType;if((E.config.inline||E.config.static)&&(E.calendarContainer.classList.add(E.config.inline?"inline":"static"),E.config.inline&&(!o&&E.element.parentNode?E.element.parentNode.insertBefore(E.calendarContainer,E._input.nextSibling):void 0!==E.config.appendTo&&E.config.appendTo.appendChild(E.calendarContainer)),E.config.static)){var s=f("div","flatpickr-wrapper");E.element.parentNode&&E.element.parentNode.insertBefore(s,E.element),s.appendChild(E.element),E.altInput&&s.appendChild(E.altInput),s.appendChild(E.calendarContainer)}E.config.static||E.config.inline||(void 0!==E.config.appendTo?E.config.appendTo:window.document.body).appendChild(E.calendarContainer)}(),function(){if(E.config.wrap&&["open","close","toggle","clear"].forEach((function(e){Array.prototype.forEach.call(E.element.querySelectorAll("[data-"+e+"]"),(function(n){return P(n,"click",E[e])}))})),E.isMobile)!function(){var e=E.config.enableTime?E.config.noCalendar?"time":"datetime-local":"date";E.mobileInput=f("input",E.input.className+" flatpickr-mobile"),E.mobileInput.tabIndex=1,E.mobileInput.type=e,E.mobileInput.disabled=E.input.disabled,E.mobileInput.required=E.input.required,E.mobileInput.placeholder=E.input.placeholder,E.mobileFormatStr="datetime-local"===e?"Y-m-d\\TH:i:S":"date"===e?"Y-m-d":"H:i:S",E.selectedDates.length>0&&(E.mobileInput.defaultValue=E.mobileInput.value=E.formatDate(E.selectedDates[0],E.mobileFormatStr)),E.config.minDate&&(E.mobileInput.min=E.formatDate(E.config.minDate,"Y-m-d")),E.config.maxDate&&(E.mobileInput.max=E.formatDate(E.config.maxDate,"Y-m-d")),E.input.getAttribute("step")&&(E.mobileInput.step=String(E.input.getAttribute("step"))),E.input.type="hidden",void 0!==E.altInput&&(E.altInput.type="hidden");try{E.input.parentNode&&E.input.parentNode.insertBefore(E.mobileInput,E.input.nextSibling)}catch(e){}P(E.mobileInput,"change",(function(e){E.setDate(p(e).value,!1,E.mobileFormatStr),ve("onChange"),ve("onClose")}))}();else{var e=s(oe,50);if(E._debouncedChange=s(k,300),E.daysContainer&&!/iPhone|iPad|iPod/i.test(navigator.userAgent)&&P(E.daysContainer,"mouseover",(function(e){"range"===E.config.mode&&re(p(e))})),P(window.document.body,"keydown",te),E.config.inline||E.config.static||P(window,"resize",e),void 0!==window.ontouchstart?P(window.document,"touchstart",X):P(window.document,"mousedown",X),P(window.document,"focus",X,{capture:!0}),!0===E.config.clickOpens&&(P(E._input,"focus",E.open),P(E._input,"click",E.open)),void 0!==E.daysContainer&&(P(E.monthNav,"click",Oe),P(E.monthNav,["keyup","increment"],R),P(E.daysContainer,"click",le)),void 0!==E.timeContainer&&void 0!==E.minuteElement&&void 0!==E.hourElement){var n=function(e){return p(e).select()};P(E.timeContainer,["increment"],x),P(E.timeContainer,"blur",x,{capture:!0}),P(E.timeContainer,"click",F),P([E.hourElement,E.minuteElement],["focus","click"],n),void 0!==E.secondElement&&P(E.secondElement,"focus",(function(){return E.secondElement&&E.secondElement.select()})),void 0!==E.amPM&&P(E.amPM,"click",(function(e){x(e),k()}))}E.config.allowInput&&P(E._input,"blur",ne)}}(),(E.selectedDates.length||E.config.noCalendar)&&(E.config.enableTime&&I(E.config.noCalendar?E.latestSelectedDateObj:void 0),be(!1)),T();var n=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);!E.isMobile&&n&&ce(),ve("onReady")}(),E}function T(e,n){for(var t=Array.prototype.slice.call(e).filter((function(e){return e instanceof HTMLElement})),r=[],o=0;o{const n=(e,n,t,r,o,a,i,s,c,u,f)=>{var l={setCustomize:()=>{}},d=function(e,n){if(!n||1===n)return e.store;var t=e.store.modules&&e.store.modules.team;return t?t.getTeam(n):void 0},h=function(n,t){n.emit("UPDATE",{teams:t.stores,roTeams:t.roStores,id:t.channel,loading:!t.ready&&!t.cacheready,readOnly:t.readOnly||!t.ready&&t.cacheready||t.offline,offline:t.offline,deleted:!t.stores.length,restricted:t.restricted,owned:n.Store.isOwned(t.owners),content:e.clone(t.proxy),hashes:t.hashes},n.clients)},p=function(e,n){var t=e.calendars[n];t&&t.reminders&&Object.keys(t.reminders).forEach((function(e){Array.isArray(t.reminders[e])&&t.reminders[e].forEach((function(e){clearTimeout(e)}))}))},v=function(e,n){var t=e.calendars[n];t&&(t.stores.length||(t.lm.stop(),p(e,n),delete e.calendars[n]))},y=function(e,n,t){n.stores.forEach((function(r){var o=d(e,r);if(o&&o.proxy&&o.rpc&&o.proxy.calendars){var a=o.proxy.calendars[n.channel];a&&(a.color!==t.color&&(a.color=t.color),a.title!==t.title&&(a.title=t.title))}}))},m=function(n,t,r,o){var a=+new Date,i=e.clone(r),s=i.id;if(Array.isArray(t[s])&&t[s].forEach((function(e){clearTimeout(e)})),t[s]=[],!r.deleted){var u=e.find(n,["store","proxy","hideReminders",s])||[],f=n.store.data.lastVisit;if(i.isAllDay&&(i.startDay&&(i.start=+c.parseDate(i.startDay)),i.endDay)){var l=c.parseDate(i.endDay);l.setHours(23),l.setMinutes(59),l.setSeconds(59),i.end=+l}var d=a-6048e5,h=o&&i.start>f&&i.end<=a&&i.end>d;if(i.end<=a&&!h)return delete t[s],void function(n,t){var r=e.find(n,["store","proxy","hideReminders"])||{};Object.keys(r).filter((function(e){return e===t})).forEach((function(e){delete r[e]}))}(n,s);var p=!1,v=function(t){p=!0,n.Store.onReadyEvt.reg((function(){!function(t){if(!e.find(n,["store","proxy","settings","general","calendar","hideNotif"])){var r=i.start<=a?i.start:+new Date;n.store.mailbox.showMessage("reminders",{msg:{ctime:r,type:"REMINDER",missed:Boolean(h),content:i},hash:"REMINDER|"+s+"-"+t},null,(function(){}))}}(t)}))},y=i.reminders||[];y.sort((function(e,n){return e-n})),y.some((function(e){var n=a+6e4*e;if(!u.some((function(n){return e>=n})))return i.start-n>=2147483647||(i.start<=n?(v(e),!0):void t[s].push(setTimeout((function(){v(e)}),i.start-n)))})),p||n.Store.onReadyEvt.reg((function(){n.store.mailbox.hideMessage("reminders",{hash:"REMINDER|"+s},null,(function(){}))}))}},g=function(n,t,r,o){var i=function(e){var n=new Date,t=new Date(n.getFullYear(),n.getMonth()-1,15),r=new Date(n.getFullYear(),n.getMonth()+1,15),o=a.getMonthId(t),i=a.getMonthId(n),s=a.getMonthId(r),c=a.getRecurring([o,i,s],[e]),u=[e];return Array.prototype.push.apply(u,c),a.applyUpdates(u)}(e.clone(r));i.forEach((function(e){m(n,t,e,o)}))},E=function(e,n,t){var r=e.calendars[n];t&&r&&r.reminders&&(1===r.stores.length&&0===r.stores[0]||g(e,r.reminders,t))},b=function(n,t,r){var o=n.calendars[t];if(o&&o.reminders&&!Object.keys(o.reminders).length&&(1!==o.stores.length||0!==o.stores[0])){var a=e.find(o,["proxy","content"]);a&&Object.keys(a).forEach((function(e){g(n,o.reminders,a[e],r)}))}},O=function(t,r,a){var c=e.once(e.mkAsync(a||function(){})),l=r.storeId,v=r.data,m=v.channel;if(m){var g=t.calendars[m],O=function(){h(t,g)};if(g){if(g.readOnly&&v.href){var A=n.parsePadUrl(v.href),w=n.getSecrets("calendar",A.hash,v.password),D=u.createEncryptor(w.keys);g.hashes.editHash=n.getEditHashFromKeys(w),g.lm.setReadOnly(!1,D),g.readOnly=!1}else if(0===l)return 1===g.stores.length&&0===g.stores[0]&&g.tempId.length&&r.cId&&g.tempId.push(r.cId),void c();return-1!==g.roStores.indexOf(l)&&v.href&&(g.roStores.splice(g.roStores.indexOf(l),1),-1!==g.stores.indexOf(0)&&g.stores.splice(g.stores.indexOf(0),1),O()),g.stores&&-1!==g.stores.indexOf(l)?void c():(-1!==g.stores.indexOf(0)&&(g.stores.splice(g.stores.indexOf(0),1),g.tempId=[]),g.stores.push(l),v.href||g.roStores.push(l),O(),void c())}g=t.calendars[m]={ready:!1,channel:m,readOnly:!v.href,tempId:[],stores:[l],roStores:v.href?[]:[l],reminders:{},hashes:{}},0===l&&g.tempId.push(r.cId);var _=n.parsePadUrl(v.href||v.roHref),T=n.getSecrets("calendar",_.hash,v.password),S=u.createEncryptor(T.keys);g.hashes.viewHash=n.getViewHashFromKeys(T),v.href&&(g.hashes.editHash=n.getEditHashFromKeys(T)),g.proxy={metadata:{color:v.color,title:v.title}},O();var x=function(){g.stores.forEach((function(e){var n=d(t,e);n&&n.rpc&&n.proxy.calendars&&(delete n.proxy.calendars[m],(n.unpin||t.unpinPads)([m],(function(e){e&&e.error&&console.error(e.error)})))})),g.lm&&g.lm.stop(),g.stores=[],h(t,g),p(t,m),delete t.calendars[m]};i((function(e){t.store.network&&!r.isNew&&t.Store.isNewChannel(null,m,e((function(n){if(!n||!n.error)return n&&"boolean"==typeof n.isNew&&n.isNew?(x(),c({error:"EDELETED"}),void e.abort()):void 0})))})).nThen((function(){var e;if(1!==l&&l){var n=t.store.modules.team&&t.store.modules.team.getTeamsData(),a=n&&n[l];e=a?a.edPublic:void 0}else e=t.store.proxy.edPublic;var i={data:{},network:t.store.network||t.store.networkPromise,channel:T.channel,crypto:S,owners:[e],ChainPad:f,validateKey:T.keys.validateKey||void 0,userName:"calendar",Cache:o,classic:!0,onRejected:t.Store&&t.Store.onRejected},u=s.create(i);g.lm=u;var d=g.proxy=u.proxy,h=!1,p=function(){h||(h=!0,setTimeout((function(){h=!1,O()})))};u.proxy.on("cacheready",(function(){d.metadata&&(g.cacheready=!0,p(),c&&c(null,u.proxy),b(t,m,r.lastVisitNotif))})).on("ready",(function(e){var n=e.metadata;if(g.owners=n.owners||[],g.ready=!0,!d.metadata){if(!r.isNew)return void x();d.metadata={color:v.color,title:v.title}}p(),c&&c(null,u.proxy),b(t,m,r.lastVisitNotif)})).on("change",[],(function(){g.ready&&p()})).on("change",["content"],(function(e,n,r){2!==r.length||!n||e?2!==r.length||n||!e?(r.length>=3&&["start","reminders","isAllDay"].includes(r[2])||r.length>=6&&["start","reminders","isAllDay"].includes(r[5]))&&setTimeout((function(){E(t,m,d.content[r[1]])})):E(t,m,{id:r[1],start:0}):E(t,m,n)})).on("remove",["content"],(function(e,n){p(),(n.length>=3&&"reminders"===n[2]||n.length>=6&&"reminders"===n[5])&&setTimeout((function(){E(t,m,d.content[n[1]])}))})).on("change",["metadata"],(function(){var e=d.metadata;e&&e.title&&e.color&&y(t,g,e)})).on("disconnect",(function(){g.offline=!0,p()})).on("reconnect",(function(){g.offline=!1,p()})).on("error",(function(e){e&&e.error&&("EDELETED"!==e.error?("ERESTRICTED"===e.error&&(g.restricted=!0,p()),c(e)):x())}))}))}},A=function(e,n){if(n.href&&-1===n.href.indexOf("#"))if(e.secondaryKey)try{n.href=e.userObject.cryptor.decrypt(n.href)}catch(e){console.error(e),delete n.href}else delete n.href},w=function(n,t){var r=t.proxy.calendars,o=t.id||1;t.proxy.on("change",["calendars"],(function(r,a,i){i.length<2||(r&&!a&&function(){var e=i[1],t=n.calendars[e];if(t){var r=t.stores.indexOf(o);if(-1!==r){t.stores.splice(r,1);var a=t.roStores.indexOf(o);-1!==a&&t.roStores.splice(a,1),v(n,e),h(n,t)}}}(),!r&&a&&function(){var r=i[1],a=t.proxy.calendars[r];if(a){var s=e.clone(a);A(t,s),O(n,{storeId:o,data:s})}}())})),Object.keys(r||{}).forEach((function(a){var i=e.clone(r[a]);A(t,i),O(n,{storeId:o,lastVisitNotif:!0,data:i})}))},D=function(e,t,o,a){var i=d(e,t.teamId);if(i)if(i.rpc){var s,c,u,f=i.proxy.calendars=i.proxy.calendars||{},l=(s=n.createRandomHash("calendar"),c=n.getSecrets("calendar",s),u=n.getViewHashFromKeys(c),{href:n.hashToHref(s,"calendar"),roHref:n.hashToHref(u,"calendar"),channel:c.channel});l.color=t.color,l.title=t.title,O(e,{storeId:i.id||1,data:l,isNew:!0},(function(n){if(n)return console.error(n),void a({error:n.error});var t=e.calendars[l.channel];r.whenRealtimeSyncs(t.lm.realtime,(function(){f[l.channel]=l,(i.pin||e.pinPads)([l.channel],(function(e){e&&e.error&&console.error(e.error)})),e.Store.onSync(i.id,a)}))}))}else a({error:"EFORBIDDEN"});else a({error:"NO_STORE"})};return l.init=function(t,o,a){var s={},c=t.store,u={loggedIn:c.loggedIn&&c.proxy.edPublic,store:c,Store:t.Store,pinPads:t.pinPads,unpinPads:t.unpinPads,updateMetadata:t.updateMetadata,emit:a,onReady:e.mkEvent(!0),calendars:{},clients:[]};return function(e,n){var t=e.store.proxy;t.calendars=t.calendars||{},setTimeout(n)}(u,o((function(e){e||function(e){w(e,e.store);var n=e.store.modules.team&&e.store.modules.team.getTeamsData();n&&Object.keys(n).forEach((function(n){var t=d(e,n);w(e,t)}))}(u)}))),u.store.proxy.on("change",["hideReminders"],(function(e,n,t){var r=t[1].split("|")[0];Object.keys(u.calendars).some((function(e){var n=u.calendars[e];if(n&&n.proxy&&n.proxy.content)return n.proxy.content[r]?(setTimeout((function(){E(u,e,n.proxy.content[r])})),!0):void 0}))})),s.closeTeam=function(e){Object.keys(u.calendars).forEach((function(n){var t=u.calendars[n],r=t.stores.indexOf(e);if(-1!==r){t.stores.splice(r,1);var o=t.roStores.indexOf(e);-1!==o&&t.roStores.splice(o,1),v(u,n),h(u,t)}}))},s.openTeam=function(e){var n=d(u,e);n&&w(u,n)},s.upgradeTeam=function(n){if(n){var t=d(u,n);t&&Object.keys(u.calendars).forEach((function(r){var o=u.calendars[r];if(-1!==o.stores.indexOf(n)){var a=t.proxy.calendars[r],i=e.clone(a);A(t,i),O(u,{storeId:n,data:i}),h(u,o)}}))}},s.removeClient=function(e){!function(e,n){var t=e.clients.indexOf(n);-1!==t&&e.clients.splice(t,1),Object.keys(e.calendars).forEach((function(t){var r=e.calendars[t];if(1===r.stores.length&&0===r.stores[0]&&r.tempId.length){var o=r.tempId.indexOf(n);-1!==o&&r.tempId.splice(o,1),r.tempId.length||(r.stores=[],v(e,t))}}))}(u,e)},s.execCommand=function(t,o,a){var s=o.cmd,c=o.data;if("SUBSCRIBE"!==s){if("OPEN"!==s)return"IMPORT"===s?u.store.offline?void a({error:"OFFLINE"}):u.loggedIn?void function(t,r,o,a){var i=r.id,s=t.calendars[i];if(s)if(Array.isArray(s.stores)&&-1!==s.stores.indexOf(r.teamId)){var c=t.store,u=c.proxy.calendars=c.proxy.calendars||{},f=s.hashes.editHash,l=s.hashes.viewHash;u[i]={href:f&&n.hashToHref(f,"calendar"),roHref:l&&n.hashToHref(l,"calendar"),channel:i,color:e.find(s,["proxy","metadata","color"])||e.getRandomColor(),title:e.find(s,["proxy","metadata","title"])||"..."},t.Store.onSync(null,a),O(t,{storeId:1,data:{href:u[i].href,toHref:u[i].roHref,channel:i}})}else a({error:"EINVAL"});else a({error:"ENOENT"})}(u,c,0,a):void a({error:"NOT_LOGGED_IN"}):"IMPORT_ICS"===s?u.store.offline?void a({error:"OFFLINE"}):void function(e,n,t,o){var a=n.id,i=e.calendars[a];if(i&&i.proxy){var s=n.json;i.proxy.content=i.proxy.content||{},Object.keys(s).forEach((function(n){i.proxy.content[n]=s[n],E(e,a,s[n])})),r.whenRealtimeSyncs(i.lm.realtime,(function(){h(e,i),o()}))}else o({error:"ENOENT"})}(u,c,0,a):"ADD"===s?u.store.offline?void a({error:"OFFLINE"}):u.loggedIn?void function(t,r,o,a){var i=d(t,r.teamId);if(i)if(i.rpc){var s=i.proxy.calendars=i.proxy.calendars||{},c=n.parsePadUrl(r.href),u=n.getSecrets(c.type,c.hash,r.password);if(u.channel===r.channel){var f=n.getEditHashFromKeys(u),l=n.getViewHashFromKeys(u),h=f&&n.hashToHref(f,"calendar"),p={href:h,roHref:l&&n.hashToHref(l,"calendar"),color:r.color,title:r.title,channel:r.channel};!s[r.channel]||!s[r.channel].href&&p.href?(p.color=r.color,p.title=r.title,O(t,{storeId:i.id||1,data:e.clone(p)},(function(e){if(e)return console.error(e),void a({error:e.error});if(h&&i.id&&i.secondaryKey)try{p.href=i.userObject.cryptor.encrypt(h)}catch(e){console.error(e)}s[p.channel]=p,(i.pin||t.pinPads)([p.channel],(function(e){e&&e.error&&console.error(e.error)})),t.Store.onSync(i.id,a)}))):a()}else a({error:"EINVAL"})}else a({error:"EFORBIDDEN"});else a({error:"NO_STORE"})}(u,c,0,a):void a({error:"NOT_LOGGED_IN"}):"CREATE"===s?u.loggedIn?c.initialCalendar?void u.Store.onReadyEvt.reg((function(){D(u,c,0,a)})):u.store.offline?void a({error:"OFFLINE"}):void D(u,c,0,a):void a({error:"NOT_LOGGED_IN"}):"UPDATE"===s?u.store.offline?void a({error:"OFFLINE"}):void function(n,t,o,a){var i=t.id,s=n.calendars[i];if(s){var c=e.find(s,["proxy","metadata"]);c?(c.title=t.title,c.color=t.color,r.whenRealtimeSyncs(s.lm.realtime,a),h(n,s),y(n,s,t)):a({error:"EINVAL"})}else a({error:"ENOENT"})}(u,c,0,a):"DELETE"===s?u.store.offline?void a({error:"OFFLINE"}):u.loggedIn?void function(e,n,t,r){var o=d(e,n.teamId);if(o)if(o.rpc){if(o.proxy.calendars){var a=n.id;if(o.proxy.calendars[a]){delete o.proxy.calendars[a],(o.unpin||e.unpinPads)([a],(function(e){e&&e.error&&console.error(e.error)}));var i=e.calendars[a],s=i.stores.indexOf(o.id||1);i.stores.splice(s,1),v(e,a),e.Store.onSync(o.id,(function(){h(e,i),r()}))}else r()}}else r({error:"EFORBIDDEN"});else r({error:"NO_STORE"})}(u,c,0,a):void a({error:"NOT_LOGGED_IN"}):"CREATE_EVENT"===s?u.store.offline?void a({error:"OFFLINE"}):void function(e,n,t,o){var a=n.calendarId,i=e.calendars[a];if(i){var s=new Date(n.start),c=new Date(n.end);n.isAllDay?(n.startDay=s.getFullYear()+"-"+(s.getMonth()+1)+"-"+s.getDate(),n.endDay=c.getFullYear()+"-"+(c.getMonth()+1)+"-"+c.getDate()):(delete n.startDay,delete n.endDay),i.proxy.content=i.proxy.content||{},i.proxy.content[n.id]=n,r.whenRealtimeSyncs(i.lm.realtime,(function(){E(e,a,n),h(e,i),o()}))}else o({error:"ENOENT"})}(u,c,0,a):"UPDATE_EVENT"===s?u.store.offline?void a({error:"OFFLINE"}):void function(n,t,o,a){if(t&&t.ev){var s=t.ev.calendarId,c=n.calendars[s];if(c&&c.proxy&&c.proxy.content){var u=c.proxy.content[t.ev.id];if(u){t.rawData=t.rawData||{};var f,l=t.changes||{},d=t.type||{};if(l.calendarId){if(!(f=n.calendars[l.calendarId])||!f.proxy)return void a({error:"ENOENT"});f.proxy.content=f.proxy.content||{}}var p={one:{},from:{}};["one","from","all"].includes(d.which)&&(u.recUpdate=u.recUpdate||p,u.recUpdate.one||(u.recUpdate.one={}),u.recUpdate.from||(u.recUpdate.from={}));var v=u.recUpdate,y=["calendarId"],m=Object.keys(l).filter((function(e){return!y.includes(e)})),g=function(e){[v.from,v.one].forEach((function(n){Object.keys(n).forEach((function(t){Number(t){const n=(e={},n,t,r,o,a,i,s,c,u,f,l,d,h,p,v,y,m,g,E,b,O,A,w,D,_,T,S,x,N,I={},C,R,P,k,M,F)=>{const L=y.Account,H=m.Drive,j=globalThis;globalThis.nacl=globalThis.nacl||C.Nacl;const K=i.Saferphore;var U=i.mkEvent(!0),B=i.mkEvent(!0),V=i.mkEvent(!0),Y=i.mkEvent(!0);var G={drive:{hideDuplicate:!0},pad:{width:!0,spellcheck:!0},security:{unsafeLinks:!1},general:{allowUserFeedback:!0}};return{setCustomize:n=>{e=n.ApiConfig,I=n.AppConfig},create:function(y){var m=j.Cryptpad_Store={};let R=y.query||function(){},k=y.broadcast||function(){};var J=j.CryptPad_AsyncStore={modules:{}};m.onReadyEvt=U;var W=[],q=function(e,n,t){W.forEach((function(r){r!==t&&R(r,e,n)}))},z=function(e){if(!e)return J;try{var n=J.modules.team.getTeam(e);return n||void console.error("Team not found",e)}catch(n){return console.error(n),void console.error("Team not found",e)}},Q=m.onSync=function(e,n){var t=z(e);t?F((function(e){if(t.realtime&&u.whenRealtimeSyncs(t.realtime,e()),!t.id&&t.drive?.realtime&&u.whenRealtimeSyncs(t.drive.realtime,e()),t.sharedFolders&&"object"==typeof t.sharedFolders)for(var n in t.sharedFolders)t.sharedFolders[n].realtime&&u.whenRealtimeSyncs(t.sharedFolders[n].realtime,e())})).nThen((function(){n()})):n({error:"ENOTFOUND"})};m.get=function(e,n,t){var r=z(n.teamId);r?r.proxy?t(i.find(r.proxy,n.key)):t({error:"ENODRIVE"}):t({error:"ENOTFOUND"})},m.set=function(e,n,t){var r=z(n.teamId);if(r)if(r.proxy){var o=n.key.slice(),a=o.pop(),s=i.find(r.proxy,o);s&&"object"==typeof s?(void 0===n.value?delete s[a]:s[a]=n.value,n.teamId||(k([e],"UPDATE_METADATA"),Array.isArray(o)&&"profile"===o[0]&&J.messenger&&f.updateMyData(J)),Q(n.teamId,t)):t({error:"INVALID_PATH"})}else t({error:"ENODRIVE"});else t({error:"ENOTFOUND"})};const X=e=>{let n;if(e){const t=z(e);n=t?.drive?.proxy}else n=J.drive?.proxy;return n};m.drive={get:(e,n,t)=>{let r=X(n.teamId);t(r||{error:"ENOTFOUND"})},set:(e,n,t)=>{let r=X(n.teamId);var o,a;r?(o=r,a=n.value,Object.keys(o).forEach((e=>{delete o[e]})),Object.keys(a).forEach((e=>{o[e]=i.clone(a[e])})),Q(n.teamId,t)):t({error:"ENOTFOUND"})}},m.getSharedFolder=function(e,n,r){var o,a=z(n.teamId),s=n.id;if(a&&a.manager){if(a.manager.folders[s])return(o=i.clone(a.manager.folders[s].proxy)).offline=Boolean(a.manager.folders[s].offline),void r(o);var c=i.find(a.proxy,["drive",t.SHARED_FOLDERS])||{};c[s]?m.loadSharedFolder(n.teamId,s,c[s],(function(){r(a.manager.folders[s].proxy)})):r({})}else r({error:"ENOTFOUND"})},m.restoreSharedFolder=function(e,n,t){if(n.sfId&&n.drive){var r=z(n.teamId);r.sharedFolders[n.sfId]&&(Object.keys(n.drive).forEach((function(e){r.sharedFolders[n.sfId].proxy[e]=n.drive[e]})),Object.keys(r.sharedFolders[n.sfId].proxy).forEach((function(e){n.drive[e]||delete r.sharedFolders[n.sfId].proxy[e]}))),Q(n.teamId,t)}else t({error:"EINVAL"})},m.hasSigningKeys=function(){if(J.proxy)return"string"==typeof J.proxy.edPrivate&&"string"==typeof J.proxy.edPublic},m.hasCurveKeys=function(){if(J.proxy)return"string"==typeof J.proxy.curvePrivate&&"string"==typeof J.proxy.curvePublic},m.isOwned=function(e){var n=J.proxy.edPublic;if(!n)return!1;if(!Array.isArray(e)||!e.length)return!1;if(-1!==e.indexOf(n))return!0;var t=J.proxy.teams;return!!t&&Object.keys(t).some((function(n){var r=i.find(t[n],["keys","drive","edPublic"]);return r&&-1!==e.indexOf(r)}))};var Z=function(e){var n=e?J.manager.getChannelsList("expirable"):function(){var e=`${J.driveChannel}#drive`;if(!e)return null;var n=J.manager.getChannelsList("pin"),t=J.proxy.profile;if(t){var r=t.edit?a.hrefToHexChannelId("/profile/#"+t.edit,null):null;r&&n.push(r);var o=t.avatar?a.hrefToHexChannelId(t.avatar,null):null;o&&n.push(o)}if(J.proxy.todo&&n.push(a.hrefToHexChannelId("/todo/#"+J.proxy.todo,null)),J.proxy.friends){var i=f.getFriendChannelsList(J.proxy);n=n.concat(i)}if(J.proxy.mailboxes){var s=Object.keys(J.proxy.mailboxes).map((function(e){if("broadcast"!==e||J.isAdmin)return J.proxy.mailboxes[e].channel})).filter(Boolean);n=n.concat(s)}if(J.proxy.calendars){var c=Object.keys(J.proxy.calendars).map((function(e){return J.proxy.calendars[e].channel}));n=n.concat(c)}return n.push(e),J.data&&J.data.blockId&&n.push(`${J.data.blockId}#block`),n.sort(),n}();return i.deduplicateString(n).sort()};m.pinPads=function(e,n,t){if(n){var r=z(n&&n.teamId);if(r.rpc){"function"!=typeof t&&(console.error("expected a callback"),t=function(){});var o=n.pads||n;r.rpc.pin(o,(function(e){t(e?{error:e}:{})}))}else t({error:"RPC_NOT_READY"})}else t({error:"EINVAL"})},m.unpinPads=function(e,n,t){if(n){var r=z(n&&n.teamId);if(r.rpc){var o=n.pads||n;r.rpc.unpin(o,(function(e){t(e?{error:e}:{})}))}else t({error:"RPC_NOT_READY"})}else t({error:"EINVAL"})};var $=J.account={};m.getPinnedUsage=function(e,n,t){var r=z(n&&n.teamId);r&&r.rpc?r.rpc.getFileListSize((function(e,n){r.id||"number"!=typeof n||($.usage=n),t({bytes:n})})):t({error:"RPC_NOT_READY"})},m.updatePinLimit=function(e,n,t){J.rpc?J.rpc.updatePinLimits((function(e,n,r,o){e?t({error:e}):($.limit=n,$.plan=r,$.note=o,t($))})):t({error:"RPC_NOT_READY"})},m.getPinLimit=function(e,n,t){var r=z(n&&n.teamId);r.rpc?r.rpc.getLimit((function(e,n,o,a){if(e)t({error:e});else{var i=r.id?{}:$;i.limit=n,i.plan=o,i.note=a,t(i)}})):t({error:"RPC_NOT_READY"})},m.clearOwnedChannel=function(e,n,t){var r=z(n&&n.teamId);r.rpc?r.rpc.clearOwnedChannel(n.channel,(function(e){t({error:e})})):t({error:"RPC_NOT_READY"})};var ee={};m.removeOwnedChannel=function(e,n,t){var r,o,a=n,i=!1;if(n&&"object"==typeof n&&(a=n.channel,i=n.force,r=n.teamId,o=n.reason),a!==J.driveChannel||i){var s=z(r);s?s.rpc?(m.channels[a]&&(ee[a]=!0),s.rpc.removeOwnedChannel(a,(function(e){e&&delete ee[a],t({error:e})}),o)):t({error:"RPC_NOT_READY"}):t({error:"ENOTFOUND"})}else t({error:"User drive removal blocked!"})};m.uploadComplete=function(e,n,t){var r=z(n.teamId);r?r.rpc?n.owned?r.rpc.ownedUploadComplete(n.id,(function(e,n){t(e?{error:e}:n)})):r.rpc.uploadComplete(n.id,(function(e,n){t(e?{error:e}:n)})):t({error:"RPC_NOT_READY"}):t({error:"ENOTFOUND"})},m.uploadStatus=function(e,n,t){var r=z(n.teamId);r?r.rpc?r.rpc.uploadStatus(n.size,(function(e,n){t(e?{error:e}:n)})):t({error:"RPC_NOT_READY"}):t({error:"ENOTFOUND"})},m.uploadCancel=function(e,n,t){var r=z(n.teamId);r?r.rpc?r.rpc.uploadCancel(n.size,(function(e,n){t(e?{error:e}:n)})):t({error:"RPC_NOT_READY"}):t({error:"ENOTFOUND"})},m.uploadChunk=function(e,n,t){var r=z(n.teamId);r?r.rpc?r.rpc.send.unauthenticated("UPLOAD",n.chunk,(function(e,n){t({error:e,msg:n})})):t({error:"RPC_NOT_READY"}):t({error:"ENOTFOUND"})};m.anonRpcMsg=function(e,n,t){J.anon_rpc?J.anon_rpc.send(n.msg,n.data,(function(e,n){t(e?{error:e}:n)})):t({error:"ANON_RPC_NOT_READY"})},m.getFileSize=function(e,n,t){var r=i.once(i.mkAsync(t));if(J.anon_rpc){var o=n.channel||a.hrefToHexChannelId(n.href,n.password);J.anon_rpc.send("GET_FILE_SIZE",o,(function(e,n){if(!e)return n&&n.length&&"number"==typeof n[0]?(0===n[0]&&p.clearChannel(o),void r({size:n[0]})):void r({error:"INVALID_RESPONSE"});r({error:e})}))}else r({error:"ANON_RPC_NOT_READY"})},m.isNewChannel=function(e,n,t){if(J.anon_rpc){var r=n.channel||a.hrefToHexChannelId(n.href,n.password);J.anon_rpc.send("IS_NEW_CHANNEL",r,(function(e,n){if(!e)return n&&n.length&&"object"==typeof n[0]?(n[0].isNew&&p.clearChannel(r),void t(n[0])):void t({error:"INVALID_RESPONSE"});t({error:e})}))}else t({error:"ANON_RPC_NOT_READY"})},m.getMultipleFileSize=function(e,n,t){J.anon_rpc?Array.isArray(n.files)?J.anon_rpc.send("GET_MULTIPLE_FILE_SIZE",n.files,(function(e,n){e?t({error:e}):n&&n.length&&"object"==typeof n[0]?t({size:n[0]}):t({error:"UNEXPECTED_RESPONSE"})})):t({error:"INVALID_FILE_LIST"}):t({error:"ANON_RPC_NOT_READY"})},m.getDeletedPads=function(e,n,t){if(J.anon_rpc){var r=n&&n.list||Z(!0);Array.isArray(r)?J.anon_rpc.send("GET_DELETED_PADS",r,(function(e,n){e?t({error:e}):n&&n.length&&Array.isArray(n[0])?t(n[0]):t({error:"UNEXPECTED_RESPONSE"})})):t({error:"INVALID_FILE_LIST"})}else t({error:"ANON_RPC_NOT_READY"})};var ne=function(e,n,t){J.anon_rpc?t():d.createAnonymous(J.network,(function(e,n){e?t({error:e}):(J.anon_rpc=n,t())}))},te=m.getAllStores=function(){if(!J.proxy||!J.manager)return[];var e=[J],n=J.modules.team;if(n){var t=n.getTeams().map((function(e){return n.getTeam(e)}));Array.prototype.push.apply(e,t)}return e};m.getUserColor=function(){var e=i.find(J,["proxy","settings","general","cursor","color"]);return e||(e=i.getRandomColor(!0),m.setAttribute(null,{attr:["general","cursor","color"],value:e},(function(){}))),e},m.getMetadata=function(e,n,t){var r=J.proxy||{},o=i.find(r,["settings","general","disableThumbnails"]),c=J.modules.team&&J.modules.team.getTeamsData(n)||{};r.uid||(J.noDriveUid=J.noDriveUid||a.createChannelId());var u={user:{name:r[s.displayNameKey]||J.noDriveName||"",uid:r.uid||J.noDriveUid,avatar:i.find(r,["profile","avatar"]),profile:i.find(r,["profile","view"]),color:m.getUserColor(),notifications:i.find(r,["mailboxes","notifications","channel"]),curvePublic:r.curvePublic},priv:{clientId:e,edPublic:r.edPublic,friends:r.friends||{},settings:r.settings||G,thumbnails:!1===o,isDriveOwned:Boolean(i.find(J,["driveMetadata","owners"])),driveChannel:J.driveChannel,pendingFriends:r.friends_pending||{},supportPrivateKey:i.find(r,["mailboxes","supportadmin","keys","curvePrivate"]),accountName:r.login_name||"",offline:J.proxy&&J.offline,teams:c,plan:J.ready?$.plan||"":void 0,mutedChannels:r.mutedChannels}};return t(JSON.parse(JSON.stringify(u))),u},m.onMaintenanceUpdate=function(){let n=e.httpUnsafeOrigin;i.fetchApi(n,"broadcast",!0,(e=>{e&&k([],"UNIVERSAL_EVENT",{type:"broadcast",data:{ev:"MAINTENANCE",data:e.maintenance}})}))},m.onSurveyUpdate=function(){let n=e.httpUnsafeOrigin;i.fetchApi(n,"broadcast",!0,(e=>{k([],"UNIVERSAL_EVENT",{type:"broadcast",data:{ev:"SURVEY",data:e.surveyURL}})}))};m.addPad=function(e,n,r){if(n.href||n.roHref){var o;if(!n.roHref){var i=a.parsePadUrl(n.href);"pad"===i.hashData.type&&(o=a.getSecrets(i.type,i.hash,n.password),n.roHref="/"+i.type+"/#"+a.getViewHashFromKeys(o))}var s,c,u,f,l=(s=n.href,c=n.roHref,u=n.title,f=+new Date,{href:s,roHref:c,atime:f,ctime:f,title:u||t.getDefaultName(a.parsePadUrl(s))});n.owners&&(l.owners=n.owners),n.expire&&(l.expire=n.expire),n.password&&(l.password=n.password),(n.channel||o)&&(l.channel=n.channel||o.channel),n.readme&&(l.readme=1),-1===n.teamId&&(n.teamId=void 0);var d=z(n.teamId);d&&d.manager?d.manager.addPad(n.path,l,(function(o){o?r({error:o}):(te().forEach((function(n){(n.id?n.sendEvent:q)("DRIVE_CHANGE",{path:["drive",t.FILES_DATA]},e)})),Q(n.teamId,r))})):r({error:"ENOTFOUND"})}else r({error:"NO_HREF"})};var re=function(e,n){var t=i.find(J,["proxy","edPublic"]),r=function(e){var n=[];return e?(J.proxy.todo&&n.push(a.hrefToHexChannelId("/todo/#"+J.proxy.todo,null)),J.proxy.profile&&J.proxy.profile.edit&&n.push(a.hrefToHexChannelId("/profile/#"+J.proxy.profile.edit,null)),J.proxy.mailboxes&&Object.keys(J.proxy.mailboxes||{}).forEach((function(e){if("supportadmin"!==e){var t=J.proxy.mailboxes[e];n.push(t.channel)}}))):n=J.manager.getChannelsList("owned"),n.filter((function(e){if("string"==typeof e)return-1!==[32,48].indexOf(e.length)}))}(e),o=K.create(10),s=function(n){e||J.manager.findChannel(n).forEach((function(e){var n=J.manager.findFile(e.id);J.manager.delete({paths:n})}))};r.forEach((function(e){var r=n();o.take((function(n){var o=!1;F((function(a){32===e.length&&m.anonRpcMsg(null,{msg:"GET_METADATA",data:e},a((function(i){if(i&&i.error)return n(),r(),void a.abort();var c=i[0];return Object.keys(c||{}).length?c&&Array.isArray(c.owners)&&-1!==c.owners.indexOf(t)?void(o=c.owners.some((function(e){return e!==t}))):(n(),r(),void a.abort()):(s(e),n(),r(),void a.abort())})))})).nThen((function(n){o?m.setPadMetadata(null,{channel:e,command:"RM_OWNERS",value:[t]},n()):J.rpc.removeOwnedChannel(e,n((function(n){n?console.error(n):s(e)})))})).nThen((function(){n(),r()}))}))}))};m.removeOwnedPads=function(e,n,t){J.proxy.edPublic?F((function(e){re(!1,e)})).nThen(t):t({error:"NOT_LOGGED_IN"})},m.deleteAccount=function(e,t,r){var o=J.proxy.edPublic,a=t&&t.keys,i=t&&t.auth;m.anonRpcMsg(e,{msg:"GET_METADATA",data:J.driveChannel},(function(t){var c=t[0];if(c&&c.owners&&1===c.owners.length&&-1!==c.owners.indexOf(o))F((function(e){x.checkRights({auth:i,blockKeys:a},e((function(n){if(n)return e.abort(),console.error(n),void r({error:"INVALID_CODE"})})))})).nThen((function(n){globalThis.accountDeletion=e,J.proxy[s.tokenKey]="DELETED",Q(null,n())})).nThen((function(e){J.rpc.removePins(e((function(e){e&&console.error(e)})))})).nThen((function(n){J.ownDeletion=!0,m.removeOwnedChannel(e,{channel:J.driveChannel,force:!0},n())})).nThen((function(e){a&&x.removeLoginBlock({reason:"ARCHIVE_OWNED",auth:i,edPublic:o,blockKeys:a},e((function(e){e&&console.error(e)})))})).nThen((function(e){re(!0,e)})).nThen((function(){k([e],"DRIVE_DELETED","ARCHIVE_OWNED"),R(e,"DELETE_ACCOUNT","DELETED",(function(){})),J.network.disconnect(),r({state:!0})}));else{var u={intent:"Please delete my account."};u.drive=J.driveChannel,u.edPublic=o;var f=C.Nacl.util.decodeBase64(J.proxy.edPrivate),l=C.Nacl.sign.detached(C.Nacl.util.decodeUTF8(n(u)),f);C.Nacl.sign.detached.verify(C.Nacl.util.decodeUTF8(n(u)),l,C.Nacl.util.decodeBase64(o))||console.error("signed message failed verification");var d=C.Nacl.util.encodeBase64(l);r({proof:d,toSign:JSON.parse(n(u))})}}))},m.migrateAnonDrive=function(e,n,t){var r=n.anonHash;h.anonDriveIntoUser(J,r,t)},m.setDisplayName=function(e,n,t){if(!J.proxy)return J.noDriveName=n,k([e],"UPDATE_METADATA"),void t();J.modules.profile&&J.modules.profile.setName(n),J.proxy[s.displayNameKey]=n,k([e],"UPDATE_METADATA"),f.updateMyData(J),Q(null,t)},m.resetDrive=function(e,n,t){F((function(e){re(e)})).nThen((function(){J.proxy.drive=J.userObject.getStructure(),q("DRIVE_CHANGE",{path:["drive","filesData"]},e),Q(null,t)}))},m.setPadAttribute=function(e,n,r){F((function(r){te().forEach((function(o){o.manager.setPadAttribute(n,r((function(){(o.id?o.sendEvent:q)("DRIVE_CHANGE",{path:["drive",t.FILES_DATA]},e),Q(o.id,r())})))}))})).nThen(r)},m.getPadAttribute=function(e,n,t){var r={};F((function(e){te().forEach((function(t){t.manager.getPadAttribute(n,e((function(e,n){e||(n&&"object"==typeof n?(!r.value||r.atime{if(J.loggedIn&&J.proxy.edPublic){var n,r=J.modules.team,o=r&&r.getTeams()||[];-1!==e.indexOf(J.proxy.edPublic)?n=J:o.some((function(t){var o=i.find(J,["proxy","teams",t,"keys","drive","edPublic"]),a=i.find(J,["proxy","teams",t,"keys","drive","edPrivate"]);if(-1===e.indexOf(o))return!1;if(!a)return!1;var s=r.getTeam(t);return n=s,!0}));var a=function(){if(n){var e=n.rpc;e?e.send("COOKIE","",(function(e){t(e)})):t("ERESTRICTED")}else t("ERESTRICTED")};n&&n.onRpcReadyEvt?n.onRpcReadyEvt.reg((function(){a()})):a()}else t("ERESTRICTED")}))):t("ERESTRICTED")},m.joinPad=function(e,n){if(n.versionHash)!function(e,n){var t,r=a.createChannelId();F((function(r){m.getPadMetadata(null,{channel:n.channel},r((function(n){if(n&&n.rejected)return R(e,"PAD_ERROR",{type:"ERESTRICTED"}),void r.abort();t=n.validateKey})))})).nThen((function(){m.getHistoryRange(e,{cpCount:1,channel:n.channel,lastKnownHash:n.versionHash},(function(o){if(o&&o.error)R(e,"PAD_ERROR",o.error);else{var a=o.messages||[];a.length&&a[a.length-1].serverHash!==n.versionHash?R(e,"PAD_ERROR",{type:"HASH_NOT_FOUND"}):(R(e,"PAD_CONNECT",{myID:r,id:n.channel,members:[r]}),(o.messages||[]).forEach((function(n){R(e,"PAD_MESSAGE",{msg:n.msg,time:n.time,user:r.slice(0,16)})})),t&&J.messenger&&J.messenger.storeValidateKey(n.channel,t),R(e,"PAD_READY"))}}))}))}(e,n);else if(a.isValidChannel(n.channel)){var r=void 0===ie[n.channel],o=ie[n.channel]=ie[n.channel]||{queue:[],data:{},clients:[],bcast:function(e,n,t){o.clients.forEach((function(r){r!==t&&R(r,e,n)}))},history:[],pushHistory:function(e,n){if(n){var t;for(o.history.push("cp|"+e),t=o.history.length-101;t>0&&!/^cp\|/.test(o.history[t]);t--);o.history=o.history.slice(Math.max(t,0))}else o.history.push(e)}};if(-1===o.clients.indexOf(e)&&o.clients.push(e),!r&&o.wc)return R(e,"PAD_CONNECT",{myID:o.wc.myID,id:o.wc.id,members:o.wc.members}),o.wc.members.forEach((function(n){R(e,"PAD_JOIN",n)})),o.history.forEach((function(n){R(e,"PAD_MESSAGE",{msg:P.removeCp(n),user:o.wc.myID,validateKey:o.data.validateKey})})),void R(e,"PAD_READY");var i=function(e){e&&"EDELETED"===e.type&&ee[n.channel]&&(delete ee[o],e.ownDeletion=!0),o.bcast("PAD_ERROR",e),e&&"EDELETED"===e.type&&p&&p.clearChannel&&p.clearChannel(n.channel),-1!==["EDELETED","EEXPIRED","ERESTRICTED"].indexOf(e.type)&&m.leavePad(null,n,(function(){}))},s={Cache:J.neverCache?void 0:p,priority:1,onCacheStart:function(){R(e,"PAD_CACHE")},onCacheReady:function(){console.error("PAD CACHE READY"),R(e,"PAD_CACHE_READY")},onReady:function(t){console.error("PAD READY");var r=t.metadata||{};o.data=r,r&&r.validateKey&&J.messenger&&J.messenger.storeValidateKey(n.channel,r.validateKey),R(e,"PAD_READY",t.noCache)},onMessage:function(e,n,t,r,a){o.lastHash=a,o.pushHistory(e,r),o.bcast("PAD_MESSAGE",{user:n,msg:e,validateKey:t})},onJoin:function(e){o.bcast("PAD_JOIN",e)},onLeave:function(e){o.bcast("PAD_LEAVE",e)},onError:i,onChannelError:i,onRejected:m.onRejected,onConnectionChange:function(e){e.state||o.bcast("PAD_DISCONNECT")},onMetadataUpdate:function(e){o.data=e||{},te().forEach((function(r){r.manager.findChannel(n.channel,!0).forEach((function(n){n.data.owners=e.owners,n.data.atime=+new Date,e.expire&&(n.data.expire=+e.expire)})),(r.sendEvent||q)("DRIVE_CHANGE",{path:["drive",t.FILES_DATA]})})),o.bcast("PAD_METADATA",e)},crypto:{encrypt:function(e){return e},decrypt:function(e){return e}},noChainPad:!0,channel:n.channel,metadata:n.metadata,network:J.network||J.networkPromise,websocketURL:N.getWebsocketURL(),onInit:function(){V.fire()},onConnect:function(n,t){o.sendMessage=function(e,r,a){t(e,(function(t){t?a({error:t}):(o.lastHash=e.slice(0,64),o.pushHistory(P.removeCp(e),/^cp\|/.test(e)),o.bcast("PAD_MESSAGE",{user:n.myID,msg:P.removeCp(e),validateKey:o.data.validateKey},r),a())}))},o.wc=n,o.queue.forEach((function(n){o.sendMessage(n.message,e)})),o.queue=[],o.bcast("PAD_CONNECT",{myID:n.myID,id:n.id,members:n.members})}};o.cpNf=P.start(s)}else R(e,"PAD_ERROR","INVALID_CHAN")},m.leavePad=function(e,n,t){var r=ie[n.channel];r&&r.cpNf?(m.dropChannel(n.channel),t()):t({error:"EINVAL"})},m.sendPadMsg=function(e,n,t){var r=n.msg,o=ie[n.channel];if(o)return o.wc?void o.sendMessage(r,e,t):(o.queue.push(r),void t())},m.corruptedCache=function(e,n){var t=ie[n];t&&t.cpNf&&(p.clearChannel(n),t.cpNf.resetCache&&t.cpNf.resetCache())},m.changePadPasswordPin=function(e,n,t){var r=n.oldChannel,o=n.channel;F((function(e){te().forEach((function(n){n.manager.findChannel(o).length&&(n.rpc.unpin([r],e()),n.rpc.pin([o],e()))}))})).nThen(t)},m.contactPadOwner=function(e,n,t){var r=n.owners;if(!Array.isArray(r)||!r.length)return t({state:!1});n.send?F((function(e){r.forEach((function(t){!function(e,t,r,o){if(J.mailbox&&!n.anon)return J.mailbox.sendTo(e,t,r,o);A.sendToAnon(J.anon_rpc,e,t,r,o)}(n.query,{channel:n.channel,data:n.msgData},{channel:t.notifications,curvePublic:t.curvePublic},e())}))})).nThen((function(){t({state:!0})})):t({state:!0})},m.givePadAccess=function(e,n,t){var r,o,a=J.proxy.edPublic,i=n.channel,s=J.manager.findChannel(i);n.user&&n.user.notifications&&n.user.curvePublic?s.some((function(e){if(e.data&&Array.isArray(e.data.owners)&&-1!==e.data.owners.indexOf(a)&&e.data.href)return r=e.data.href,o=e.data.title,!0}))?(J.mailbox.sendTo("GIVE_PAD_ACCESS",{channel:i,href:r,title:o},{channel:n.user.notifications,curvePublic:n.user.curvePublic}),t()):t({error:"ENOTFOUND"}):t({error:"EINVAL"})},m.getLastHash=function(e,n,t){var r=ie[n.channel];r?r.lastHash?t({hash:r.lastHash}):t({error:"EINVAL"}):t({error:"ENOCHAN"})};m.burnPad=function(e,n){var t=n.channel,r=C.b64AddSlashes(n.ownerKey||"");if(t&&r)try{var o=a.decodeBase64(r),i=C.Nacl.sign.keyPair.fromSecretKey(o);l.create(J.network,{edPublic:a.encodeBase64(i.publicKey),edPrivate:a.encodeBase64(i.secretKey)},(function(e,r){e?console.error(e):m.getPadMetadata(null,{channel:t},(function(e){r.removeOwnedChannel(t,(function(t){t?console.error(t):function(e,n){var t=e.channel,r=e.href,o=a.parsePadUrl(r),i=a.getSecrets(o.type,o.hash,e.password);if((!n||!n.error)&&n.mailbox){var s,c=C.createEncryptor(i.keys),u=[];try{"string"==typeof n.mailbox?u.push(c.decrypt(n.mailbox,!0,!0)):Object.keys(n.mailbox).forEach((function(e){u.push(c.decrypt(n.mailbox[e],!0,!0))}))}catch(e){console.error(e)}try{s=J.proxy.curvePublic}catch(e){return void console.error(e)}u.forEach((function(e){var n=JSON.parse(e);n.curvePublic!==s&&J.mailbox.sendTo("OWNED_PAD_REMOVED",{channel:t},{channel:n.notifications,curvePublic:n.curvePublic},(function(){}))}))}}(n,e)}))}))}))}catch(e){console.error(e)}else console.error("Can't delete BAR pad")},m.getPadMetadata=function(e,r,o){var s=i.once(i.mkAsync(o));if(!J.offline&&J.anon_rpc)if(r.channel){if(32===r.channel.length)return a.isValidChannel(r.channel)?void J.anon_rpc.send("GET_METADATA",r.channel,(function(e,o){if(e)s({error:e});else{var a=o&&o[0]||{};s(a),a.rejected||te().forEach((function(e){var o=e.manager.findChannel(r.channel,!0),i=!1;(o.forEach((function(e){n(e.data.owners)!==n(a.owners)&&(i=!0),e.data.owners=a.owners,e.data.atime=+new Date,a.expire&&(e.data.expire=+a.expire)})),i)&&(e.sendEvent||q)("DRIVE_CHANGE",{path:["drive",t.FILES_DATA]})}))}})):(c.send("METADATA_INVALID_CHAN"),void s({error:"EINVAL"}));s({error:"EINVAL"})}else s({error:"ENOTFOUND"});else s({error:"OFFLINE"})},m.setPadMetadata=function(e,n,t){if(n.channel)if(n.command){var r=z(n.teamId);if(r){var o=n.channels;delete n.channels,r.rpc.setMetadata(n,(function(e,n){e?t({error:e}):Array.isArray(n)&&n.length?t(n[0]):t({})})),Array.isArray(o)&&o.forEach((function(t){var r=i.clone(n);r.channel=t,m.setPadMetadata(e,r,(function(){}))}))}else t({error:"ENOTFOUND"})}else t({error:"EINVAL"});else t({error:"ENOTFOUND"})},m.deleteMailboxMessage=function(e,n,t){J.anon_rpc?J.anon_rpc.send("DELETE_MAILBOX_MESSAGE",n,(function(e){t({error:e})})):t({error:"RPC_NOT_READY"})},m.getFullHistory=function(e,n,t){var r=J.network,o=r.historyKeeper,a=[],i=!1,s=function(e){if(!i){var o=function(e){try{return JSON.parse(e)}catch(e){return null}}(e);if(o)return"FULL_HISTORY_END"===o[0]?(t(a),r.off("message",s),void(i=!0)):void("FULL_HISTORY"===o[0]&&(o[1]&&o[1].validateKey||o[1][3]===n.channel&&(e=o[1][4])&&(e=e.replace(/cp\|(([A-Za-z0-9+\/=]+)\|)?/,""),n.debug?a.push({serverHash:e.slice(0,64),msg:e,author:o[1][1],time:o[1][5]}):a.push(e))))}};r.on("message",s),r.sendto(o,JSON.stringify(["GET_FULL_HISTORY",n.channel,n.validateKey]))},m.getHistory=function(e,n,t,r){var o=i.once(i.mkAsync(t)),a=J.network,s=a.historyKeeper,c=Math.floor(1e6*Math.random()),u=[],f=!1,l=function(e,t){if(!f&&t===s){var i=function(e){try{return JSON.parse(e)}catch(e){return null}}(e);if(i&&!(i.txid&&i.txid!==c||i.validateKey&&i.channel))if(i.error&&i.channel)i.channel===n.channel&&(a.off("message",l),f=!0,o({error:i.error}));else{if(1===i.state&&i.channel){if(i.channel!==n.channel)return;return o(u),a.off("message",l),void(f=!0)}Array.isArray(i)&&i[0]&&i[0]!==c||i[3]===n.channel&&(i[4]&&r?u.push({msg:e,hash:i[4].slice(0,64)}):(e=i[4])&&(e=e.replace(/cp\|(([A-Za-z0-9+\/=]+)\|)?/,""),u.push(e)))}}};a.on("message",l);var d={txid:c,lastKnownHash:n.lastKnownHash},h=["GET_HISTORY",n.channel,d];a.sendto(s,JSON.stringify(h))},m.getHistoryRange=function(e,n,t){var r,o=J.network,a=o.historyKeeper,s=[],c=!0,u=!1,f=!1,l=i.uid();o.on("message",(function(e){if(!f){var o=function(e){try{return JSON.parse(e)}catch(e){return null}}(e);if(o[1]===l){if("HISTORY_RANGE_ERROR"!==o[0])return"HISTORY_RANGE_END"===o[0]?(t({messages:s,isFull:u,lastKnownHash:r}),void(f=!0)):void("HISTORY_RANGE"===o[0]&&(o[2]&&o[1].validateKey||o[2][3]===n.channel&&(e=o[2][4])&&(c&&(/^cp\|/.test(e)||n.toHash||(u=!0),r=e.slice(0,64),c=!1),e=e.replace(/cp\|(([A-Za-z0-9+\/=]+)\|)?/,""),s.push({serverHash:e.slice(0,64),msg:e,author:o[2][1],time:o[2][5]}))));t({error:o[2]})}else console.log("bad txid")}})),o.sendto(a,JSON.stringify(["GET_HISTORY_RANGE",n.channel,{from:n.lastKnownHash,to:n.toHash,cpCount:n.cpCount||2,txid:l}]))};var se=function(e,n){e&&(e.deprecated||e.restricted||(n||e.on("change",["drive",t.SHARED_FOLDERS],(function(n,r,o){if(o.length>3&&"password"===o[3]){var i=o[2],s=e.drive[t.SHARED_FOLDERS][i],c=J.manager.user.userObject.getHref?J.manager.user.userObject.getHref(s):s.href,u=a.parsePadUrl(c),f=a.getSecrets(u.type,u.hash,n);return v.updatePassword(m,{oldChannel:f.channel,password:r,href:c},J.network,(function(){console.log("Shared folder password changed")})),!1}})),e.on("change",[],(function(e,r,o){if(n){if(o[0]===t.FILES_DATA&&"object"==typeof r&&r.channel&&!r.owners){var a=[r.channel];r.rtChannel&&a.push(r.rtChannel),r.lastVersion&&a.push(r.lastVersion),m.pinPads(null,a,(function(e){console.error(e)}))}if(o[0]===t.FILES_DATA&&"object"==typeof e&&e.channel&&!r){var i=[e.channel];J.manager.findChannel(e.channel).some((function(e){return e.fId!==n}))||(e.rtChannel&&i.push(e.rtChannel),e.lastVersion&&i.push(e.lastVersion),m.unpinPads(null,i,(function(e){console.error(e)})))}}e&&!r&&Array.isArray(o)&&(o[0]===t.FILES_DATA||"drive"===o[0]&&o[1]===t.FILES_DATA)&&setTimeout((function(){m.checkDeletedPad(e&&e.channel)})),q("DRIVE_CHANGE",{id:n,old:e,new:r,path:o})})),e.on("remove",[],(function(e,t){q("DRIVE_REMOVE",{id:n,old:e,path:t})}))))};m.loadSharedFolder=function(e,n,t,r,o){var i=z(e);if(i){var s=a.parsePadUrl(t.href||t.roHref);s||s.hashData?v.load({isNew:o,network:J.network||J.networkPromise,store:i,Store:m,isNewChannel:m.isNewChannel},n,t,r):r({error:"EINVAL"})}else r({error:"ENOTFOUND"})};var ce=function(e,n,t,r){m.loadSharedFolder(null,e,n,t,r)};m.loadSharedFolderAnon=function(e,n,t){m.loadSharedFolder(null,n.id,n.data,(function(e){t({error:e?void 0:"EDELETED"})}))},m.addSharedFolder=function(e,n,r){U.reg((function(){var o=z(n.teamId);o.manager.addSharedFolder(n,(function(a){a&&"object"==typeof a&&a.error?r(a):((n.teamId?o.sendEvent:q)("DRIVE_CHANGE",{path:["drive",t.FILES_DATA]},e),r(a))}))}))},m.updateSharedFolderPassword=function(e,n,t){v.updatePassword(m,n,J.network,t)},m.userObjectCommand=function(e,n,r){if(n&&n.cmd){var o=z(n.teamId);if(o.offline)return(o.id?o.sendEvent:q)("NETWORK_DISCONNECT"),void r({error:"OFFLINE"});o.manager.command(n,(function(o){te().forEach((function(n){(n.id?n.sendEvent:q)("DRIVE_CHANGE",{path:["drive",t.FILES_DATA]},e)})),Q(n.teamId,(function(){r(o)}))}))}};var ue=m.dropChannel=function(e){console.error("Drop channel",e);try{J.messenger.leavePad(e)}catch(e){console.error(e)}try{J.modules.cursor.leavePad(e)}catch(e){console.error(e)}try{J.modules.integration.leavePad(e)}catch(e){console.error(e)}try{J.onlyoffice.leavePad(e)}catch(e){console.error(e)}try{if(function(e){if(J){if(J.driveChannel===e)return!0;if(v.isSharedFolderChannel(e))return!0;if(i.find(J,["proxy","teams"])){var n=i.find(J,["proxy","teams"])||{};return Object.keys(n).some((function(t){return n[t].channel===e}))}return i.find(J,["proxy","profile","href"])?a.hrefToHexChannelId(i.find(J,["proxy","profile","href"]))===e:void 0}}(e))return void delete m.channels[e]}catch(e){console.error(e)}try{p.leaveChannel(e)}catch(e){console.error(e)}m.channels[e]&&(m.channels[e].cpNf&&m.channels[e].cpNf.stop(),delete m.channels[e])};m._removeClient=function(e){var n=W.indexOf(e);-1!==n&&W.splice(n,1);try{J.onlyoffice?.removeClient(e)}catch(e){console.error(e)}try{J.mailbox?.removeClient(e)}catch(e){console.error(e)}Object.keys(J.modules).forEach((function(n){if(J.modules[n]&&J.modules[n].removeClient)try{J.modules[n].removeClient(e)}catch(e){console.error(e)}})),Object.keys(m.channels).forEach((function(n){var t=m.channels[n].clients.indexOf(e);-1!==t&&m.channels[n].clients.splice(t,1),0===m.channels[n].clients.length&&ue(n)}))};m.refreshDriveUI=function(){te().forEach((function(e){(e.id?e.sendEvent:q)("DRIVE_CHANGE",{path:["drive",t.FILES_DATA]})}))};var fe=function(e,n){const t=i.mkAsync(n);var o=J.proxy,a=J.drive;if(J.manager)t();else{var s=J.manager=r.create(a.proxy,{onSync:function(e){Q(null,e)},edPublic:o.edPublic,pin:function(e,n){J.loggedIn?m.pinPads(null,e,n):n()},unpin:function(e,n){J.loggedIn?m.unpinPads(null,e,n):n()},loadSharedFolder:ce,settings:o.settings,removeOwnedChannel:function(e,n){m.removeOwnedChannel("",e,n)},store:J,Store:m},{outer:!0,edPublic:J.proxy.edPublic,loggedIn:J.loggedIn,log:function(e){q("DRIVE_LOG",e)},rt:a.realtime}),c=J.userObject=s.user.userObject;F((function(e){J.sharedFolders={},J.handleSharedFolder=function(e,n){n?(J.sharedFolders[e]=n,J.driveEvents&&se(n.proxy,e)):delete J.sharedFolders[e]},c.migrate(e())})).nThen((function(n){console.error("START LOADING SF");var t=J.network||J.networkPromise;v.loadSharedFolders(m,t,J,a.proxy,c,n,(n=>{var t={type:"sf",progress:100*n.progress/n.max};R(e,"LOADING_DRIVE",t)}),!0)})).nThen((function(n){console.error("SF CACHE READY"),ae(D,"team",n,e)})).nThen((function(e){console.error("TEAM CACHE READY"),ae(S,"calendar",e)})).nThen((function(){t()}))}};const le=(e=function(){})=>{ae(g,"cursor",e),ae(b,"integration",e),ae(_,"messenger",e),ae(T,"history",e),J.onlyoffice||(J.onlyoffice=O.init(J,(function(e,n,t){t.forEach((function(t){R(t,"OO_EVENT",{ev:e,data:n})}))}))),J&&(J.messenger=J.modules.messenger)};var de=function(e,n,t){J.ready=!0;var r=J.proxy,u=J.manager,f=J.userObject;F((function(n){r.settings||(r.settings=G),r.forms||(r.forms={}),r.friends_pending||(r.friends_pending={}),r.form_seed||(r.form_seed=a.createChannelId()),u||(fe(e,n()),u=J.manager,f=J.userObject),ne(0,0,n()),function(e,n,t){if(!J.loggedIn)return t();J.rpc?t($):l.create(J.network,J.proxy,(function(e,n){e?t({error:e}):(J.rpc=n,J.onRpcReadyEvt.fire(),m.getPinLimit(null,null,(function(e){e.error&&console.error(e.error),$.limit=e.limit,$.plan=e.plan,$.note=e.note,t(e)})))}),p)}(0,0,n()),R(e,"LOADING_DRIVE",{type:"migrate",progress:0})})).nThen((function(n){void 0===r.version&&(r.version=11),o(r,n(),(function(n,t){R(e,"LOADING_DRIVE",{type:"migrate",progress:t})}),J)})).nThen((function(n){R(e,"LOADING_DRIVE",{type:"sf",progress:0}),f.fixFiles(),v.loadSharedFolders(m,J.network,J,J.drive.proxy,f,n,(n=>{var t={type:"sf",progress:100*n.progress/n.max};R(e,"LOADING_DRIVE",t)})),le(n),ae(w,"profile",n),ae(S,"calendar",n),J.modules.team&&J.modules.team.onReady(n),ae(E,"support",n)})).nThen((function(){console.error("SF & TEAM READY");var e,o=function(){k([],"REQUEST_LOGIN")};J.loggedIn&&(function(e){if(J.rpc){var n=Z(!1),t=a.hashChannelList(n);J.rpc.getServerHash((function(n,r){n?e(n):e(null,r===t)}))}else e({error:"RPC_NOT_READY"})}((function(e,n){n||function(e){if(J.rpc){var n=Z(!1);J.rpc.reset(n,(function(n){e(n||null)}))}else e({error:"RPC_NOT_READY"})}((function(e){if(e)return console.error(e);console.log("RESET DONE")}))})),"number"!=typeof r.loginToken&&(r[s.tokenKey]=J.data.localToken||Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)),n[s.tokenKey]=r[s.tokenKey],J.data.localToken&&J.data.localToken!==r[s.tokenKey])?o():(n.feedback=i.find(r,["settings","general","allowUserFeedback"]),c.init(n.feedback),J.returned=n,"function"==typeof t&&t(n),J.offline=!1,q("NETWORK_RECONNECT"),k([],"UPDATE_METADATA"),k([],"STORE_READY",n),"string"==typeof r.uid&&32===r.uid.length||(console.log("generating a persistent identifier"),r.uid=a.createChannelId()),!J.loggedIn||m.hasSigningKeys()&&m.hasCurveKeys()?(r.on("change",[s.displayNameKey],(function(e,n){"string"==typeof n&&k([],"UPDATE_METADATA")})),r.on("change",["profile"],(function(){k([],"UPDATE_METADATA")})),r.on("change",["friends"],(function(e,n,t){if(k([],"UPDATE_METADATA"),J.messenger&&void 0===e){var o=t.slice(-1)[0],a=r.friends&&r.friends[o];J.messenger.onFriendAdded(a)}})),r.on("remove",["friends"],(function(e,n){if(k([],"UPDATE_METADATA"),J.messenger){var t=n[1];t&&"channel"===n[2]&&J.messenger.onFriendRemoved(t,e)}})),r.on("change",["friends_pending"],(function(){k([],"UPDATE_METADATA")})),r.on("remove",["friends_pending"],(function(){k([],"UPDATE_METADATA")})),r.on("change",["settings"],(function(){k([],"UPDATE_METADATA")})),r.on("change",[s.tokenKey],(function(){J.isDeleted||"DELETED"===r[s.tokenKey]||k([],"UPDATE_TOKEN",{token:r[s.tokenKey]})})),J.mailbox=A.init({Store:m,store:J,updateMetadata:function(){k([],"UPDATE_METADATA")},updateDrive:function(){q("DRIVE_CHANGE",{path:["drive","filesData"]})},pinPads:function(e,n){m.pinPads(null,e,n)}},e,(function(e,n,t,r){var o=i.once(r||function(){});t.forEach((function(t){R(t,"MAILBOX_EVENT",{ev:e,data:n},o)}))})),U.fire()):o())}))};const he=(e,n,t,r)=>{if(J.accountModule)return J.accountModule;const o=L.init({userHash:n.userHash,anonHash:n.anonHash,cache:n.cache,form_seed:n.form_seed,store:J,broadcast:k,postMessage:R});J.accountModule=o;const{channel:a,onAccountReady:s,onAccountCacheReady:c,onDisconnect:u,onReconnect:f}=o;J.driveChannel=a,c((e=>{J.returned||=e,t(e)})),s((e=>{J.returned||=e,r(e)})),u((()=>{q("NETWORK_DISCONNECT")})),f((()=>{q("NETWORK_RECONNECT")}));return setInterval((function(){var e=[];Object.keys(m.channels).forEach((function(n){var t=m.channels[n].clients;Array.prototype.push.apply(e,t)})),(e=i.deduplicateString(e)).forEach((function(e){var n=0,t=function(){if(n>=2)return m._removeClient(e),R(e,"TIMEOUT"),void console.error("TIMEOUT",e);n++;var r=setTimeout(t,3e4);R(e,"PING",null,(function(e){e&&console.error(e),clearTimeout(r)}))};t()}))}),12e4),o},pe=(e,n,t,r)=>{const o=i.once((e=>{const n=H.init({account:e,store:J,broadcast:k,postMessage:R}),{onDriveReady:o,onDriveCacheReady:a,onDisconnect:i,onReconnect:s}=n;a((()=>{t(J.returned)})),o((()=>{r(J.returned)})),i((()=>{})),s((()=>{}))})),a=()=>{},s=he(0,n,a,a);s.onAccountCacheReady((()=>{o(s)})),s.onAccountReady((()=>{o(s)}))};m.disableCache=function(e,n,t){n?p.disable():p.enable(),t()};var ve=!1;m.hasDrive=function(e,n,t){t({state:Boolean(J.proxy)})};const ye=e=>{if(J?.network?.historyKeeper)return setTimeout(e);const n=n=>{J.network||=n;n.join("0000000000000000000000000000000000").then((function(t){let r;t.members.forEach((e=>{16===e.length&&(r=e)})),n.historyKeeper=r,t.leave(),e()}),(function(n){console.error(n),e({error:"GET_HK"})}))};if(J.network)return n(J.network);J.networkPromise?.then(n)};var me=function(e,n,t){var r=function(){le();let e=()=>{ne(0,0,(function(){c.send("NO_DRIVE",!0),n({})}))};if(t)return((e,n)=>{if(J.rpc)n(J.rpc);else{var t=C.Nacl.sign.keyPair(),r={edPublic:C.Nacl.util.encodeBase64(t.publicKey),edPrivate:C.Nacl.util.encodeBase64(t.secretKey)};l.create(J.network,r,(function(e,t){e?n({error:e}):(J.rpc=t,n(t))}))}})(0,e);e()};if(J.network)r();else{var o=N.getWebsocketURL();M.connect(o).then((function(e){J.network?(e.disconnect(),e=J.network):J.network=e,ye((e=>{e?n(e):r()}))}),(function(e){console.error(e),n({error:"OFFLINE"})}))}};const ge=(e,n,t)=>{fe(e,(function(){t(n),B.fire()}))},Ee=(e,n,t)=>{J.manager?B.reg((function(){ye((r=>{J.network||=r,de(e,n,(()=>{t(n)}))}))})):de(e,n,(()=>{t(n)}))};return m.init=function(e,n,t){var r=i.once((function(r){n.driveEvents&&function(e){B.reg((()=>{-1===W.indexOf(e)&&W.push(e),J.driveEvents||(J.driveEvents=!0,se(J.proxy),Object.keys(J.manager.folders).forEach((function(e){var n=J.manager.folders[e].proxy;se(n,e)})))}))}(e),t(r)}));if(ve&&!J.returned&&n.cache)B.reg((function(){r({state:"ALREADY_INIT",returned:J.cacheReturned})}));else{if(ve)return J.networkTimeout&&R(e,"LOADING_DRIVE",{type:"offline"}),void U.reg((function(){r({state:"ALREADY_INIT",returned:J.returned})}));n.disableCache&&p.disable(),n.noDrive&&!n.requires&&(n.requires="pad"),((e,n,t)=>{if(n.neverDrive||n.noDrive&&!n.userHash&&!n.anonHash)return n.neverDrive&&(J.neverCache=!0),void me(0,(e=>{e?.error&&c.send("NO_DRIVE_ERROR",!0),t(e)}),!!n.neverDrive);const r=n.requires;ve=!0,J.data=n;let o=e=>{1===Object.keys(J.proxy).length&&c.send("FIRST_APP_USE",!0),e&&e.error&&(ve=!1)};if("pad"===r)return void me(0,(function(r){if(r&&r.error)return;t(r);let a=i.once((()=>{pe(0,n,(n=>{ge(e,n,o)}),(n=>{Ee(e,n,o)}))}));V.reg(a),Y.reg(a)}));if("file"===r)return void me(0,(function(r){r&&r.error||(t(r),pe(0,n,(n=>{ge(e,n,o)}),(n=>{Ee(e,n,o)})))}));if("team"===r){const r=i.once((r=>{F((n=>{ae(D,"team",n,e)})).nThen((()=>{t(r),pe(0,n,(n=>{ge(e,n,o)}),(n=>{Ee(e,n,o)}))}))}));return void he(0,n,r,r)}if("drive"===r)return void pe(0,n,(n=>{t(n),ge(e,n,o)}),(n=>{t(n),Ee(e,n,o)}));let a=e=>{o(e);const n=s.prefersDriveRedirectKey,r=i.find(J,["proxy","settings","general",n]);e[n]=r,t(e)};pe(0,n,(n=>{ge(e,n,a)}),(n=>{Ee(e,n,a)}))})(e,n,i.once((e=>{"GET_HK"!==e.error?r(e):r({error:"ERROR"})})))}},U.reg((function(){var e=+new Date-7776e6;p.getKeys((function(n,t){if(n)console.error(n);else{var r=function(){if(t.length){var n=t.pop();p.getTime(n,(function(t,o){t?r():!o||o{const n=(e,n={})=>({create:function(t,r,o){var a,i=[],s=e.mkEvent(!0);t.reg((function(e){if(!a){var n=e.data;if("_READY"===n)return r("_READY"),a=!0,s.fire(),void i.forEach((function(e){t.fire(e)}));i.push(n)}}));var c={},u={},f={},l=[],d={},h={};h.query=function(e,n,t,o){var a,i=Math.random().toString(16).replace("0.","")+Math.random().toString(16).replace("0.",""),c=(o=o||{}).timeout||3e4;c>0&&(a=setTimeout((function(){delete u[i],t("TIMEOUT")}),c)),f[i]=function(e){clearTimeout(a),delete f[i],e&&(delete u[i],t("UNHANDLED"))},u[i]=function(e,n){delete u[i],t(void 0,e.content,n)},s.reg((function(){var t={txid:i,content:n,q:e,raw:o.raw};r(o.raw?t:JSON.stringify(t))}))};var p=h.event=function(e,n,t){t=t||{},s.reg((function(){var o={content:n,q:e,raw:t.raw};r(t.raw?o:JSON.stringify(o))}))};h.on=function(e,n,t){var o=function(e,t,o){n(e.content,(function(n){var t={txid:e.txid,content:n};r(o?t:JSON.stringify(t))}),t)};return(c[e]=c[e]||[]).push(o),t||p("EV_REGISTER_HANDLER",e),{stop:function(){var n=c[e].indexOf(o);-1!==n&&c[e].splice(n,1)}}},h.whenReg=function(e,n,t){var r=t;l.indexOf(e)>-1?n():r=!0,r&&(d[e]=d[e]||[]).push(n)},h.onReg=function(e,n){h.whenReg(e,n,!0)},h.on("EV_REGISTER_HANDLER",(function(e){d[e]&&(d[e].forEach((function(e){e()})),delete d[e]),l.push(e)}));var v=!1;h.onReady=function(e){v?e():"function"==typeof e&&h.on("EV_RPC_READY",(function(){v=!0,e()}))},h.ready=function(){h.whenReg("EV_RPC_READY",(function(){h.event("EV_RPC_READY")}))};var y=[""];n.httpUnsafeOrigin?(y.push(n.httpUnsafeOrigin),y.push(n.httpSafeOrigin)):globalThis.location&&y.push(globalThis.location.origin),t.reg((function(e){if(a&&e.data&&"_READY"!==e.data&&y.includes(e.origin)){var n;try{n="object"==typeof e.data?e.data:JSON.parse(e.data)}catch(e){return void console.warn(e)}void 0!==n.ack?f[n.txid]&&f[n.txid](!n.ack):"string"==typeof n.q?c[n.q]?(n.txid&&r(JSON.stringify({txid:n.txid,ack:!0})),c[n.q].forEach((function(t){t(n||JSON.parse(e.data),e,n&&n.raw),n=void 0}))):n.txid&&r(JSON.stringify({txid:n.txid,ack:!1})):void 0===n.q&&u[n.txid]&&u[n.txid](n,e)}})),r("_READY"),o(h)}});e.exports&&(e.exports=n(W()))})()}(Gt)),Gt.exports}function Wt(){return Bt||(Bt=1,function(e){e.exports&&(e.exports=((e,n,t)=>{const r={};let o,a,i={},s=()=>{};return r.init=n=>{a||(a=e.create({query:(e,n,t,r)=>{r=r||function(){},i[e].chan.query(n,t,(function(e,n){r(e?{error:e}:n)}))},broadcast:(e,n,t,r)=>{r=r||function(){},Object.keys(i).forEach((o=>{-1===e.indexOf(+o)&&i[o].chan.query(n,t,((e,n)=>{r(e?{error:e}:n)}))}))}}),s=n)},r.initClient=(e,r)=>{if(!a)return console.error("Not initialized"),void r("NOT_INIT");const{postMsg:c}=e,u=t.mkEvent(),f=Number(Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)),l=()=>{a._removeClient(f)};n.create(u,c,(function(e){let n=i[f]={chan:e};console.debug("SharedW Channel created"),Object.keys(a.queries).forEach((function(t){"CONNECT"!==t&&"JOIN_PAD"!==t&&"SEND_PAD_MSG"!==t&&"STOPWORKER"!==t&&e.on(t,(function(e,r){try{a.queries[t](f,e,r)}catch(n){console.error("Error in webworker when executing query "+t),console.error(n),console.log(e)}"DISCONNECT"===t&&(l(),globalThis.accountDeletion&&globalThis.accountDeletion===n.id&&(a=void 0,o=void 0))}))})),e.on("STOPWORKER",(function(e,n){s(),a.queries.DISCONNECT(f,e,n)})),e.on("CONNECT",(function(e,n){console.debug("Connecting to store..."),a.queries.CONNECT(f,e,(function(e){if(e&&"ALREADY_INIT"===e.state)return console.debug("Store already exists!"),o=o||e.returned,void n(e);o=e,n(e)}))})),e.on("JOIN_PAD",(function(e,t){n.channelId=e.channel;try{a.queries.JOIN_PAD(f,e,t)}catch(n){console.error("Error in webworker when executing query JOIN_PAD"),console.error(n),console.log(e)}})),e.on("SEND_PAD_MSG",(function(e,t){var r={msg:e,channel:n.channelId};try{a.queries.SEND_PAD_MSG(f,r,t)}catch(e){console.error("Error in webworker when executing query SEND_PAD_MSG"),console.error(e),console.log(r)}})),r(u,l)}),!0)},r})(Kt(),Jt(),W()))}(Ht)),Ht.exports}var qt,zt,Qt=function(){if(Yt)return Vt;Yt=1;const e=Wt();return Vt={start:n=>{let t=!1,r=()=>{globalThis.close()};globalThis.window=globalThis,addEventListener("connect",(o=>{console.error("TEST"),console.debug("New SharedWorker client");const a=o.ports[0],i=e=>{a.postMessage(e)};console.error(a);let s,c=!1,u=()=>{};a.onmessage=function(o){if("INIT"===o.data?.type){if((o=>{t||(n(o),e.init(r),t=!0)})(o.data.cfg),c)return;c=!0,e.initClient({postMsg:i},(function(e,n){s=e,u=n,i("SW_READY")}))}else"CLOSE"===o.data?(console.debug("leave"),u()):s&&s.fire(o)}}))}}}();var Xt,Zt,$t=function(){if(zt)return qt;zt=1;const e=Wt();return qt={start:n=>{let t,r=!1;const o=()=>{globalThis.close()},a=e=>{postMessage(e)};globalThis.window=globalThis,onmessage=function(i){if("INIT"===i.data?.type){let s=i.data.cfg;if(r)return;return n(s),e.init(o),r=!0,void e.initClient({postMsg:a},(function(e){t=e,a("WW_READY")}))}t&&t.fire(i)}}}}();var er=function(){if(Zt)return Xt;Zt=1;const e=Wt(),n=W();return Xt={start:t=>{let r,o=!1,a=!1;const i=n.mkEvent(),s=()=>{a=!0},c=e=>{a||i.fire(e)};return{init:n=>{o||(t(n),e.init(s),o=!0,e.initClient({postMsg:c},(function(e){r=e,c("STORE_READY")})))},onMessage:e=>{i.reg((n=>{setTimeout((()=>{e(n)}))}))},query:e=>{r&&!a&&r.fire({data:e,origin:""})}}}}}(),nr=Hn(),tr=n({__proto__:null,default:r(nr)},[nr]),rr=Ln(),or=n({__proto__:null,default:r(rr)},[rr]),ar=Xn(),ir=n({__proto__:null,default:r(ar)},[ar]),sr=et(),cr=n({__proto__:null,default:r(sr)},[sr]),ur=Pt(),fr=n({__proto__:null,default:r(ur)},[ur]);let lr=e=>{[Ae,Xe,V,ze,H,tr,dn,on,Ie,ir,cr,fr,Lt,pe,or].forEach((n=>{"function"==typeof n.setCustomize&&n.setCustomize(e)}))},dr="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,hr="undefined"!=typeof SharedWorkerGlobalScope&&self instanceof SharedWorkerGlobalScope;e.store={},hr?(console.error("SHAREDWORKER"),Qt.start(lr)):dr?(console.error("WEBWORKER"),$t.start(lr)):"undefined"!=typeof module&&(module.exports,1)?(console.error("NODEJS"),e.store=er.start(lr)):(console.error("BROWSER"),e.store=er.start(lr)),e.start=lr})); +!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self)["cryptpad-worker-min"]={})}(this,(function(e){"use strict";function n(e,n){return n.forEach((function(n){n&&"string"!=typeof n&&!Array.isArray(n)&&Object.keys(n).forEach((function(t){if("default"!==t&&!(t in e)){var r=Object.getOwnPropertyDescriptor(n,t);Object.defineProperty(e,t,r.get?r:{enumerable:!0,get:function(){return n[t]}})}}))})),Object.freeze(e)}var t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function r(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function o(e){if(e.__esModule)return e;var n=e.default;if("function"==typeof n){var t=function e(){return this instanceof e?Reflect.construct(n,arguments,this.constructor):n.apply(this,arguments)};t.prototype=n.prototype}else t={};return Object.defineProperty(t,"__esModule",{value:!0}),Object.keys(e).forEach((function(n){var r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:function(){return e[n]}})})),t}var a,i,s,c,u,f,l,d={exports:{}},h={exports:{}},p={exports:{}};function v(){return a||(a=1,function(e){var n;n=function(){var e=function(){},n=function(){return(new Date).getTime()},t=function(e,n,t){e.timeouts.push(setTimeout(n,t))},r=function(n,r){n.ws&&(n.ws.onmessage=e,n.ws.onopen=e,n.ws.close(),r?n.ws.onclose({reason:"offline"}):t(n,(function(){n.ws&&n.ws.onclose({reason:"forced closed because websocket failed to close"})}),1e4))},o=function(e,n){return!!e.ws&&(e.ws.send(JSON.stringify(n)),!0)},a=function(e,n){return function(e,t){var r=n[e];if(!r)throw new Error("no such event "+e);r.push(t)}},i=function(e,n,t,r){var o=r[n];if(!o)throw new Error("no such event "+n);var a=o.indexOf(t);-1!==a&&o.splice(a,1)},s=function(e,t,r){if(e.channels[t])return new Promise((function(n){n(e.channels[t])}));var s=e.queues.p2;1===r?s=e.queues.p1:3===r&&(s=e.queues.p3);var c={queue:s,onMessage:[],onJoin:[],onLeave:[],members:[],jSeq:e.seq++},u={message:c.onMessage,join:c.onJoin,leave:c.onLeave},f={_:c,time:n(),id:t,members:c.members,bcast:function(t){return function(e,t,r){var a=e.channels[t],i=e.seq++,s=[i,"MSG",t,r];if(!a)return new Promise((function(e,n){n({type:"NO_SUCH_CHANNEL",message:JSON.stringify(s)})}));var c=o(e,s);return new Promise((function(t,r){c?e.requests[i]={reject:r,resolve:t,time:n()}:r({type:"DISCONNECTED",message:JSON.stringify(s)})}))}(e,f.id,t)},leave:function(t){return function(e,t,r){if(e.channels[t]){if(delete e.channels[t],e.ws&&1===e.ws.readyState){var a=e.seq++;o(e,[a,"LEAVE",t,r]);var i=function(){};e.requests[a]={reject:i,resolve:i,time:n()}}}else console.debug("no such channel",t)}(e,f.id,t)},on:a(0,u),off:function(e,n){i(0,e,n,u)}};e.requests[c.jSeq]=f;var l=[c.jSeq,"JOIN",t],d=o(e,l);return new Promise((function(e,n){d?(f._.resolve=e,f._.reject=n):n({type:"DISCONNECTED",message:JSON.stringify(l)})}))},c=function(t){var r={message:t.onMessage,disconnect:t.onDisconnect,reconnect:t.onReconnect},c={webChannels:t.channels,getLag:function(){return function(e){return e.ws?e.pingOutstanding?Math.max(n()-e.timeOfLastPingSent,e.lastObservedLag):e.lastObservedLag:null}(t)},sendto:function(e,r){return function(e,t,r){var a=e.seq++,i=[a,"MSG",t,r],s=o(e,i);return new Promise((function(t,r){s?e.requests[a]={reject:r,resolve:t,time:n()}:r({type:"DISCONNECTED",message:JSON.stringify(i)})}))}(t,e,r)},join:function(e,n){return s(t,e,n)},disconnect:function(){return function(n){if(n.ws){var t=n.ws.onclose;n.ws.onclose=e,n.ws.close(),t({reason:"network.disconnect() called"})}n.timeouts.forEach(clearTimeout),n.timeouts=[]}(t)},on:a(0,r),off:function(e,n){i(0,e,n,r)}};return c.__defineGetter__("webChannels",(function(){return Object.keys(t.channels).map((function(e){return t.channels[e]}))})),c},u=function(e,t){var a=void 0;try{a=JSON.parse(t.data)}catch(e){return void console.log(e.stack)}if(e.timeOfLastMsgReceived=n(),0===a[0]){if("IDENT"===a[2])return e.uid=a[3],e.ws._onident(),void(e.pingInterval=setInterval((function(){if(!(n()-e.timeOfLastPingReceived<15e3||(n()-e.timeOfLastMsgReceived>6e4&&r(e),e.pingOutstanding))){var t=e.seq++,a=n();e.timeOfLastPingSent=a,e.pingOutstanding++,e.requests[t]={time:a,ping:a},o(e,[t,"PING"])}}),5e3));if(e.uid){if("PING"===a[2])return a[2]="PONG",void o(e,a);if("MSG"===a[2]){var i=void 0,s=e.queues.p2;if(a[3]===e.uid)i=e.onMessage,"number"==typeof a[5]&&(1===a[5]&&(s=e.queues.p1),3===a[5]&&(s=e.queues.p3));else{var c=e.channels[a[3]];if(!c)return void console.log("message to non-existent chan "+JSON.stringify(a));i=c._.onMessage,c._.queue&&(s=c._.queue)}s.push({msg:a,h:i}),function(e){if(!e.queues.busy){var n=function(){var t=e.queues.p1.shift()||e.queues.p2.shift()||e.queues.p3.shift();if(t){e.queues.busy=!0;var r=t.h,o=t.msg;r.forEach((function(e){setTimeout((function(){try{e(o[4],o[1])}catch(e){console.error(e)}}))})),setTimeout((function(){n()}))}else e.queues.busy=!1};n()}}(e)}if("LEAVE"===a[2]){var u=e.channels[a[3]];if(!u)return void(a[1]!==e.uid&&console.log("leaving non-existent chan "+JSON.stringify(a)));var f=u._.members.indexOf(a[1]);-1!==f&&u._.members.splice(f,1),u._.onLeave.forEach((function(e){try{e(a[1],a[4])}catch(e){console.log(e.stack)}}))}if("JOIN"===a[2]){var l=e.channels[a[3]];if(!l)return void console.log("ERROR: join to non-existent chan "+JSON.stringify(a));if(-1!==l._.members.indexOf(a[1]))return;var d=-1!==l._.members.indexOf(e.uid);l._.members.push(a[1]),d||a[1]!==e.uid||(l.myID=e.uid,l._.resolve(l)),d&&l._.onJoin.forEach((function(e){try{e(a[1])}catch(e){console.log(e.stack)}}))}}}else{var h=e.requests[a[0]];if(!h)return void console.log("error: "+JSON.stringify(a));if(delete e.requests[a[0]],"ACK"===a[1]){if(h.ping)return e.lastObservedLag=n()-Number(h.ping),e.timeOfLastPingReceived=n(),void e.pingOutstanding--;h.resolve()}else if("JACK"===a[1]){if(h._){if(!a[2])throw new Error("wrong type of ACK for channel join");return h.id=a[2],void(e.channels[h.id]=h)}h.resolve()}else if("ERROR"===a[1])if("function"==typeof h.reject)h.reject({type:a[2],message:a[3]});else if(h._&&"function"==typeof h._.reject){if("EJOINED"===a[2]&&!e.channels[a[3]])return h.id=a[3],void(e.channels[h.id]=h);h._.reject({type:a[2],message:a[3]})}else console.error(a);else h.reject({type:"UNKNOWN",message:JSON.stringify(a)})}};return{connect:function(o,a){a=a||function(e){return new window.WebSocket(e)};var i={ws:null,seq:1,uid:null,network:null,channels:{},onMessage:[],onDisconnect:[],onReconnect:[],timeouts:[],requests:{},pingInterval:null,queues:{p1:[],p2:[],p3:[]},timeOfLastPingSent:-1,timeOfLastPingReceived:-1,timeOfLastMsgReceived:-1,lastObservedLag:0,pingOutstanding:0};i.network=c(i);var s=e,f=e;"undefined"!=typeof window&&window.addEventListener("offline",(function(){-1===["localhost","127.0.0.1",""].indexOf(window.location.hostname)&&r(i,!0)}));var l=function(){var c=i.ws=a(o);i.timeOfLastPingSent=i.timeOfLastPingReceived=n(),i.timeOfLastMsgReceived=n(),c.onmessage=function(e){return u(i,e)},c.onclose=function(n){c.onclose=e,clearInterval(i.pingInterval),i.timeouts.forEach(clearTimeout),i.ws=null,i.uid&&(i.uid=null,i.onDisconnect.forEach((function(e){try{e(n.reason)}catch(e){console.log(e.stack)}}))),t(i,l,i.uid?0:7e3)},c.onopen=function(){t(i,(function(){i.uid||(f({type:"TIMEOUT",message:"waited 30000ms"}),s=f=e,r(i))}),3e4)},i.ws._onident=function(){i.timeOfLastPingReceived=n(),i.timeOfLastMsgReceived=n(),i.lastObservedLag=n()-i.timeOfLastPingSent,s!==e?(s(i.network),s=f=e):(i.channels={},i.requests={},i.pingOutstanding=0,i.onReconnect.forEach((function(e){try{e(i.uid)}catch(e){console.log(e.stack)}})))}};return new Promise((function(e,n){s=e,f=n,l()}))}}},e.exports?e.exports=n():window.netflux_websocket=n()}(p)),p.exports}function y(){return i||(i=1,function(e){var n,t,r,o;e.exports&&(e.exports=(n=v(),r=function(e){return e.replace(/^\d+:/,"")},o=(t={}).removeCp=function(e){return e.replace(/^cp\|([A-Za-z0-9+\/=]{0,20}\|)?/,"")},t.start=function(e){var t,a=(e=e||{}).network,i=e.websocketURL,s=e.userName,c=e.channel,u=e.crypto,f=e.readOnly||!1,l=!e.noChainPad&&(e.ChainPad||window.ChainPad),d=void 0===e.useHistory||!!e.useHistory,h=!1,p=e.lastKnownHash,v={},y=[],m=e.priority||2,g=e.Cache,E=!1,b=Math.floor(1e6*Math.random()),O=e.metadata||{},A=O.validateKey=e.validateKey||O.validateKey;O.owners=e.owners||O.owners,O.expire=e.expire||O.expire;var w,D,_=!0,T={setReadOnly:function(e,n){f=e,n&&(u=n)}},S=function(){},x=[],N={send:function(){}},I=function(){w&&"function"==typeof w.abort&&w.abort();var n=l.create({userName:s,initialState:e.initialState,transformFunction:e.transformFunction,patchTransformer:e.patchTransformer,validateContent:e.validateContent,avgSyncMilliseconds:e.avgSyncMilliseconds,logLevel:void 0!==e.logLevel?e.logLevel:1});return g&&Array.isArray(t)&&t.length&&(t.forEach((function(e){var t=e.patch;if(!/^\[/.test(t)){try{t=u.decrypt(t,A,!0)}catch(e){console.error(t,A,c),console.error(e)}t=r(t)}n.message(t)})),""===n.getUserDoc())?(n.abort(),t=[],g.clearChannel(c),I()):(n.onMessage((function(e,n,t){N.send(e,n,t)})),n.onPatch((function(t){e.onRemote&&e.onRemote({realtime:n,patch:t})})),n)},C={change:[],onChange:function(e){C.change.forEach((function(n){n(e)}))},users:[]},R=function(n){e.onJoin&&e.onJoin(n),32===n.length&&(-1===C.users.indexOf(n)&&C.users.push(n),C.onChange())},P=function(){},k=function(n){e.onLeave&&e.onLeave(n);var t=C.users.indexOf(n);-1!==t&&C.users.splice(t,1),C.onChange()},M=function(n,t){if(_){try{var r=w&&w.getUserDoc();if(E&&w&&(""===r||r===e.initialState))return void T.resetCache()}catch(e){console.error(e)}w&&w.start(),e.setMyID&&e.setMyID({myID:n.myID}),_=!1,e.onReady&&e.onReady({realtime:w,network:t,userList:C,myId:n.myID,leave:n.leave,metadata:O}),y.length&&(y.forEach((function(e){"function"==typeof e&&e()})),y=[])}},F=function(n,r){if(e.onChannelError&&e.onChannelError({channel:r.id,type:n.error,loaded:!_,error:n.error,message:n.message}),"EUNKNOWN"===n.error)return p=void 0,r&&r.leave(),g?(t=[],void g.clearChannel(c,(function(){l&&(T.realtime=w=I()),S(a,P)}))):void S(a,P);if("function"==typeof T.stop)try{T.stop()}catch(e){}},L=!0,H=function(e){g&&(t.length&&t[t.length-1].hash===e.hash||(!t.length&&L&&(e.isCheckpoint=!0,L=!1),(t.length||e.isCheckpoint)&&(t.push(e),g.storeCache(c,A,t,(function(e){if(e){g.clearChannel(c,(function(){console.warn("Cache cleared",c)}));var n=t;return t=[],void console.error(e,c,n,A)}})))))},j=function(n,t,a,i,s){var f=i.historyKeeper,l=n===f;if(!a||0!==t&&"0"!==t){if(!s||n===f){if(s){var d=JSON.parse(t);if(d.txid&&d.txid!==b)return;if(d.validateKey&&d.channel)return d.channel!==a.id||A||(A=d.validateKey),void(d.channel===a.id&&(O=d,e.onMetadataUpdate&&!_&&e.onMetadataUpdate(O)));if(d.state&&1===d.state&&d.channel)return void(d.channel===a.id&&(Object.keys(v).forEach((function(e){"function"==typeof v[e]&&v[e]("FAILED")})),v={},M(a,i)))}if(l){var h=JSON.parse(t);if(Array.isArray(h)&&h[0]&&h[0]!==b)return;if(h.channel===a.id&&h.error)return void F(h,a);if(t=h[4],h[3]!==a.id)return}if(p=t.slice(0,64),"function"==typeof v[p])return v[p](null,p),void delete v[p];var m,g=/^cp\|/.test(t);t=o(t);try{t=u.decrypt(t,A,l)}catch(e){console.error(t,A,c),console.error(e)}var E="string"==typeof t;!E&&t.content&&(m=t.author,t=t.content),_||e.onLocal&&e.onLocal(!0);var D=E?r(t):t,T=function(){try{if(w&&E&&w.message(D),e.onMessage){var t={time:h?h[5]:+new Date};e.onMessage(D,n,A,g,p,m,t)}var r=g;e.isCacheCheckpoint&&(r=e.isCacheCheckpoint(D,m)),H({patch:D,hash:p,isCheckpoint:r,author:m,time:h?h[5]:+new Date})}catch(e){console.error(e)}};_&&n!==f?y.push(T):T()}}else M(a,i)},K=function(n,r,a){N.wc=n,c=n.id,n.members.forEach(R);var i,s=function(e,t){j(t,e,n,r)};n.on("message",s),n.on("join",R),n.on("leave",k),N.stop=function(){n.off("message",s),n.off("join",R),n.off("leave",k),n.leave(),w&&w.abort()},a&&(N.send=function(n,t,a){var i=function(e,n){if(!f)try{var t=u.encrypt(e,n);if(0===e.indexOf("[4")){var r="";if(window.nacl){var o=window.nacl.hash(window.nacl.util.decodeUTF8(e));r=window.nacl.util.encodeBase64(o.slice(0,8))+"|"}else console.log("Checkpoint sent without an ID. Nacl is missing.");t="cp|"+r+t}return t}catch(n){throw console.log(e),n}}(n,a);if(i){var s=i.slice(0,64),l=/^cp\|/.test(i);e.isCacheCheckpoint&&(l=e.isCacheCheckpoint(n,a)),v[s]=function(e,r){!e&&r&&H({patch:o(n),hash:s,isCheckpoint:l,author:a,time:+new Date}),t(e,r)},N.wc.bcast(i).then((function(){p=s,delete v[s],H({patch:o(n),hash:s,isCheckpoint:l,author:a,time:+new Date}),t(null,s)}),(function(e){if(console.error(e),!e||"enoent"!==e.type&&"ENOENT"!==e.type)delete v[s],t(e&&e.type||e);else{if(N.wc.leave(),h)return delete v[s],void t("STOPPED");_=!0,r.join(c,m).then((function(e){K(e,r,!1),N.send(n,t,a)}))}}))}},l&&!w&&(T.realtime=w=I()),e.onInit&&e.onInit({myID:n.myID,realtime:w,getLag:r.getLag,userList:C,network:r,channel:c})),e.onConnect&&e.onConnect(n,N.send),d?(n.members.forEach((function(e){16===e.length&&(i=e)})),D!==i&&(r.historyKeeper=i,D=i,x.forEach((function(e){e(i)}))),function(){var e={txid:b,priority:m,lastKnownHash:p,metadata:O};g&&Array.isArray(t)&&t.length&&(e.lastKnownHash=t[t.length-1].hash),y=[];var o=["GET_HISTORY",n.id,e];i&&r.sendto(i,JSON.stringify(o))}(),T.resetCache=function(){_=!0,t=[],g&&g.clearChannel(c),b=Math.floor(1e6*Math.random()),F({error:"EUNKNOWN",message:"Corrupted cache"},n)}):M(n,r)},U=!1;"undefined"!=typeof window&&window.addEventListener("beforeunload",(function(){U=!0}));var B=function(e,n){var t;return e.some((function(e){if(e.id===n)return t=e,!0})),t},V=function(n){e.onError&&e.onError({type:n.type||n,message:n.message,error:n.type,loaded:!_})};S=function(r,o){var a;"string"==typeof r&&(a=n.connect(r));var i=function(){"string"==typeof r?a.then(o,V):"function"==typeof r.then?r.then(o,V):o(r)};if(g)return g.getChannelCache(c,(function(n,r){A=r?r.k:void 0,(t=r?r.c:[]).length?(E=!0,e.onCacheStart&&e.onCacheStart(),l&&(T.realtime=w=I()),t.length?(e.onMessage&&t.forEach((function(n){var t={time:n.time};e.onMessage(n.patch,"cache",A,n.isCheckpoint,n.hash,n.author,t)})),e.onCacheReady&&e.onCacheReady({id:c,realtime:w,networkPromise:a}),i()):i()):i()})),void(T.resetCache=function(){g&&g.clearChannel(c),t=[]});i()};var Y=!0;return P=function(n,t){h||n.join(c||null,m).then((function(e){if(h)try{e.leave()}catch(e){}else K(e,n,t)}),(function(r){r&&"ERESTRICTED"===r.type&&Array.isArray(r.message)&&e.onRejected?e.onRejected(r.message,(function(e){e?V(r):P(n,t)})):V(r)}))},T.stop=function(){h=!0},S(a||i,(function(n){if(a=n,Y){if(Y=!1,h)return;var t=function(n){U||"network.disconnect() called"!==n&&(e.onConnectionChange?e.onConnectionChange({state:!1}):e.onAbort&&e.onAbort({reason:n}))},r=function(n){if(e.onConnectionChange){e.onConnectionChange({state:!0,myId:n});var t=function(){_=!0,C.users=[],S(a,P)};if(e.beforeReconnecting)return void e.beforeReconnecting((function(n,r){c=n,e.initialState=r,t()}));t()}},o=function(e,n){var t=B(a.webChannels,c);t&&j(n,e,t,a,!0)};a.on("disconnect",t),a.on("reconnect",r),a.on("message",o),T.network=a,T.stop=function(){N&&N.stop&&N.stop();var e=B(a.webChannels,c);if(e)try{e.leave("")}catch(e){}a.off("disconnect",t),a.off("reconnect",r),a.off("message",o),h=!0},a.onHistoryKeeperChange=function(e){x.push(e)}}P(a,!0)})),T},t))}(h)),h.exports}function m(){return f?u:(f=1,u=function(){if(c)return s;c=1;const e=n=>{if(Array.isArray(n))return n.map(e);if(n instanceof Object){let t=[],r=[];return Object.keys(n).forEach((e=>{/^(0|[1-9][0-9]*)$/.test(e)?t.push(+e):r.push(e)})),t.sort((function(e,n){return e-n})).concat(r.sort()).reduce(((t,r)=>(t[r]=e(n[r]),t)),{})}return n},n=JSON.stringify.bind(JSON);return s=(t,r,o)=>{let a=n(t,r,0);if(!a||"{"!==a[0]&&"["!==a[0])return a;let i=JSON.parse(a);return n(e(i),null,o)}}())}function g(){return l||(l=1,function(e){e.exports&&(e.exports=function(e,n){const t=globalThis;var r,o={},a=void 0===t.Proxy,i=o.DeepProxy=function(){var e={},r=e.isArray=Array.isArray||function(e){return"[object Array]"===Object.toString(e)},o=e.type=function(e){return null===e?"null":r(e)?"array":typeof e},i=e.isProxyable=function(e,n){return(void 0!==n||!a)&&-1!==["object","array"].indexOf(o(e))},s=e.set=function(n){return function(t,r,o){if("on"===r)throw new Error("'on' is a reserved attribute name for realtime lists and maps");return i(o)?t[r]=e.create(o,n):t[r]=o,n(),t[r]||!0}},c=e.pathMatches=function(e,n){return!n.some((function(n,t){return n!==e[t]}))},u=function(e,n){return n.pattern.length-e.pattern.length},f=function(e){return function(n,t,r){switch(n){case"change":t="array"===o(t)?t:[t],e.change.push({cb:function(e,n,o,a){if(c(o,t))return r(e,n,o,a)},pattern:t}),e.change.sort(u);break;case"remove":t="array"===o(t)?t:[t],e.remove.push({cb:function(e,n,o){if(c(n,t))return r(e,n,o)},pattern:t}),e.remove.sort(u);break;case"ready":e.ready.push({cb:function(e){t(e)}});break;case"cacheready":e.cacheready.push({cb:function(e){t(e)}});break;case"disconnect":e.disconnect.push({cb:function(e){t(e)}});break;case"reconnect":e.reconnect.push({cb:function(e){t(e)}});break;case"create":e.create.push({cb:function(e){t(e)}});break;case"error":e.error.push({cb:function(e){t(e)}})}return this}},l=e.get=function(){var e={cacheready:[],disconnect:[],reconnect:[],change:[],ready:[],remove:[],create:[],error:[]};return function(n,t){return"on"===t?f(e):"_isProxy"===t||("_events"===t?e:n[t])}},d=e.delete=function(e){return function(n,t){return void 0===n[t]||(delete n[t],e()),!0}},h=e.handlers=function(e,n){return n?{set:s(e),get:l(e),deleteProperty:d(e)}:{set:s(e),get:function(e,n){return"_isProxy"===n||e[n]},deleteProperty:d(e)}},p=e.remoteChangeFlag=!1,v=e.stringifyFakeProxy=function(e){var t=JSON.parse(n(e));return delete t._events,delete t._isProxy,n(t)};e.checkLocalChange=function(n,r){if(a&&!e.interval){var o=v(n);e.interval=t.setInterval((function(){var e=v(n);e!==o&&(o=e,p?p=!1:r())}),300)}};var y=e.create=function(e,n,r){var s="function"===o(n)?h(n,r):n;switch(o(e)){case"object":Object.keys(e).forEach((function(t){i(e[t])&&!e[t]._isProxy&&(e[t]=y(e[t],n))}));break;case"array":e.forEach((function(t,r){i(t)&&!t._isProxy&&(e[r]=y(e[r],n))}));break;default:throw new Error("attempted to make a proxy of an unproxyable object")}if(!a)return e._isProxy?e:new t.Proxy(e,s);var c=JSON.parse(JSON.stringify(e));if(r){var u={cacheready:[],disconnect:[],reconnect:[],change:[],ready:[],remove:[],create:[],error:[]};c.on=f(u),c._events=u}return c},m=function(e,n,t,r,o){var a=e.slice(0);a.push(n),t._events.change.some((function(e){return!1===e.cb(r,o,a,t)}))},g=e.find=function(e,n){for(var t=n.length,r=0;rs)for(var c,u=s;u<=s;u++)c=e[u],E(r,u,a,c,!0);e.length=s}};return e.update=function(e,n,t){var r=o(e),a=o(n);if(r!==a)throw new Error("Proxy updates can't result in type changes");switch(a){case"array":O.call(e,e,n,(function(e){return y(e,t)}),[],e);break;case"object":b.call(e,e,n,(function(e){return y(e,t)}),[],e);break;default:throw new Error("unsupported realtime datatype:"+a)}},e}();return o.create=function(o){if(!i.isProxyable(o.data,!0))throw new Error("unsupported datatype: "+i.type(o.data));if("function"!=typeof(r=o.ChainPad||t.ChainPad).SmartJSONTransformer)throw new Error("Please update ChainPad");o.classic&&!o.crypto&&(console.error("[chainpad-listmap] no crypto module provided. messages will not be encrypted"),o.crypto={encrypt:function(e){return e},decrypt:function(e){return e}});var s=o.readOnly,c={initialState:n(o.data),patchTransformer:r.SmartJSONTransformer,validateContent:o.validateContent||function(e){try{return JSON.parse(e),!0}catch(n){return console.log(e),console.error("Failed to parse, rejecting patch"),!1}},readOnly:o.readOnly,userName:o.userName||"listmap",Cache:o.Cache,logLevel:void 0===o.logLevel?0:o.logLevel};o.classic&&(c.channel=o.channel,c.crypto=o.crypto,c.network=o.network,c.websocketURL=o.websocketURL,c.metadata=o.metadata||{validateKey:o.validateKey,owners:o.owners,expire:o.expire},c.onRejected=o.onRejected);var u,f,l,d={metadata:{}},h=!0,p=!1,v=a?i.stringifyFakeProxy:n,y=function(){var e=v(f);try{u.contentUpdate(e)}catch(e){f._events.error.forEach((function(n){n.cb({type:"CHAINPAD",error:e.message})}))}o.onLocal&&o.onLocal()},m=c.onLocal=function(e){h||s||(clearTimeout(l),e?y():l=setTimeout(y))},g=function(){i.remoteChangeFlag||m()};f=i.create(o.data,g,!0),c.onInit=function(e){f._events.create.forEach((function(n){n.cb(e)}))},c.onCacheReady=function(e){u&&u===e.realtime||(u=d.realtime=e.realtime);var n=u.getUserDoc(),t=JSON.parse(n);i.update(f,t,g),i.checkLocalChange(f,m),p||f._events.cacheready.forEach((function(n){n.cb(e)}))};var E=0;c.onReady=function(e){if(E=-1,p)return h=!1,c.onRemote(),void f._events.reconnect.forEach((function(n){n.cb(e)}));u&&u===e.realtime||(u=d.realtime=e.realtime),d.metadata=e.metadata;var n=u.getUserDoc(),t=JSON.parse(n);i.update(f,t,g),i.checkLocalChange(f,m),h=!1,p=!0,f._events.ready.forEach((function(n){n.cb(e)}))},c.onRemote=function(){if(!h){var e=u.getUserDoc(),n=JSON.parse(e);i.remoteChangeFlag=!0,i.update(f,n,g),i.remoteChangeFlag=!1}},c.onMessage=function(){-1!==E&&o.updateProgress&&o.updateProgress({progress:E++})},c.onAbort=function(e){f._events.disconnect.forEach((function(n){n.cb(e)}))},c.onConnectionChange=function(e){e.state?h=!0:f._events.disconnect.forEach((function(n){n.cb(e)}))},c.onMetadataUpdate=function(e){d.metadata=e,"function"==typeof o.onMetadataUpdate&&o.onMetadataUpdate(e)},c.onError=function(e){f._events.error.forEach((function(n){n.cb(e)}))},c.onChannelError=function(e){f._events.error.forEach((function(n){n.cb(e)}))},o.common&&"function"==typeof o.common.startRealtime?u=d.cpCnInner=o.common.startRealtime(c):d=e.start(c),d.proxy=f,d.realtime=u;var b=d.setReadOnly;return d.setReadOnly=function(e,n){s=e,b&&b(e,n)},d},o}(y(),m()))}(d)),d.exports}var E=g();function b(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var O,A={exports:{}};function w(){return O||(O=1,function(e){var n,r,o,a;a=function(){var e=b,n=function(t,r,o){r||(r=0);var a=n.resolve(t,r),i=n.m[r][a];if(!i&&e){if(i=e(a))return i}else if(i&&i.c&&(r=i.c,a=i.m,!(i=n.m[r][i.m])))throw new Error('failed to require "'+a+'" from '+r);if(!i)throw new Error('failed to require "'+t+'" from '+o);return i.exports||(i.exports={},i.call(i.exports,i,i.exports,n.relative(a,r))),i.exports};return n.resolve=function(e,t){var r=e,o=e+".js",a=e+"/index.js";return n.m[t][o]&&o?o:n.m[t][a]&&a?a:r},n.relative=function(e,t){return function(r){if("."!=r.charAt(0))return n(r,t,e);var o=e.split("/"),a=r.split("/");o.pop();for(var i=0;i=0;t--)o.check(e.operations[t],n),t>0&&r.assert(!o.shouldMerge(e.operations[t],e.operations[t-1])),"number"==typeof n&&(n+=o.lengthChange(e.operations[t]));return e.isCheckpoint&&(r.assert(1===e.operations.length),r.assert(0===e.operations[0].offset),"number"==typeof n&&r.assert(!n||e.operations[0].toRemove===n)),e};i.toObj=function(e){r.PARANOIA&&c(e);var n,t=new Array(e.operations.length+1);for(n=0;n0);var t,i=s(a.check(e[e.length-1]),n);for(t=0;t=0;t--)f(e,n.operations[t]);return e},i.apply=function(e,n){r.PARANOIA&&(c(e),r.assert("string"==typeof n),r.assert(a.hex_sha256(n)===e.parentHash));for(var t=n,i=e.operations.length-1;i>=0;i--)t=o.apply(e.operations[i],t);return t},i.lengthChange=function(e){r.PARANOIA&&c(e);for(var n=0,t=0;t=0;u--)i[u]=o.invert(e.operations[u],t),t=o.apply(e.operations[u],t);var f=new Array(e.operations.length);!function(){for(var e=i.length-1;e>=0;e--){f[e]=i[e].offset;for(var n=e-1;n>=0;n--)f[e]+=i[n].toRemove-i[n].toInsert.length}}();var l=s(a.hex_sha256(t),e.isCheckpoint);l.operations.splice(0,l.operations.length);for(var d=0;d=0;d--){var h=t(e.operations[d],u,o.simplify);h&&(u=o.apply(h,u),f[l++]=h)}return Array.prototype.push.apply(i.operations,f.reverse()),i.operations[0]||i.operations.shift(),r.PARANOIA&&c(i),i},i.equals=function(e,n){if(e.operations.length!==n.operations.length)return!1;for(var t=0;t0;){var u=o.random(i);i+=o.lengthChange(u),f(t,u)}return c(t),t},Object.freeze(e.exports)},"SHA256.js":function(e,n,t){!function(){function n(e,n){var t=(65535&e)+(65535&n);return(e>>16)+(n>>16)+(t>>16)<<16|65535&t}function t(e,n){return e>>>n|e<<32-n}function r(e,n){return e>>>n}function o(e,n,t){return e&n^~e&t}function a(e,n,t){return e&n^e&t^n&t}function i(e){return t(e,2)^t(e,13)^t(e,22)}function s(e){return t(e,6)^t(e,11)^t(e,25)}function c(e){return t(e,7)^t(e,18)^r(e,3)}e.exports.hex_sha256=function(e){return function(e){for(var n="0123456789abcdef",t="",r=0;r<4*e.length;r++)t+=n.charAt(e[r>>2]>>8*(3-r%4)+4&15)+n.charAt(e[r>>2]>>8*(3-r%4)&15);return t}(function(e,u){var f,l,d,h,p,v,y,m,g,E,b,O=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],A=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],w=function(e){for(var n=[];e>0;e--)n.push(void 0);return n}(64);e[u>>5]|=128<<24-u%32,e[15+(u+64>>9<<4)]=u;for(var D=0;D>5]|=(255&e.charCodeAt(t/8))<<24-t%32;return n}(e),8*e.length))}}()},"Common.js":function(e,n,r){e.exports.global=function(){if("undefined"!=typeof self)return self;if(void 0!==t)return t;if("undefined"!=typeof window)return window;throw new Error("no self, nor global, nor window")}();var o=function(n){return"undefined"!=typeof localStorage&&localStorage[n]?localStorage[n]:e.exports.global[n]},a=e.exports.PARANOIA=o("ChainPad_PARANOIA");e.exports.VALIDATE_ENTIRE_CHAIN_EACH_MSG=o("ChainPad_VALIDATE_ENTIRE_CHAIN_EACH_MSG"),e.exports.TESTING=o("ChainPad_TESTING"),e.exports.assert=function(e){if(!e)throw new Error("Failed assertion")},e.exports.isUint=function(e){return"number"==typeof e&&Math.floor(e)===e&&e>=0},e.exports.randomASCII=function(e){for(var n=[],t=0;tn?1:-1},Object.freeze(e.exports)},"sha256.js":function(e,n,t){var r=t("./sha256/exports.js"),o=t("./SHA256.js"),a=t("./Common");e.exports.check=function(e){if("string"!=typeof e)throw new Error;if(!/[a-f0-9]{64}/.test(e))throw new Error;return e},e.exports.hex_sha256=function(e){e+="";var n=r.hex(function(e){for(var n=new Uint8Array(e.length),t=0;t1&&console.log("["+e.userName+"] "+n)},d=function(e,n){e.logLevel>0&&console.error("["+e.userName+"] "+n)},h=function(e,n,t){if(!e.aborted){t||(t=Math.floor(2*Math.random()*e.config.avgSyncMilliseconds));var r=setTimeout((function(){e.schedules.splice(e.schedules.indexOf(r),1),n()}),t);return e.schedules.push(r),r}},p=function(e,n){var t=e.schedules.indexOf(n);t>-1&&e.schedules.splice(t,1),clearTimeout(n)},v=function(e,n,t,o){var a=i.toStr(n);if(function(e,n,t){e.messageHandlers.length||t("no onMessage() handler registered");try{e.messageHandlers.forEach((function(e){e(n,(function(){t.apply(null,arguments),t=function(){}}))}))}catch(e){t(e.stack)}}(e,a,(function(t){if(t)l(e,"Posting to server failed ["+t+"]"),e.pending=null,e.syncSchedule=h(e,(function(){g(e)}));else{var o=e.pending;if(e.pending=null,!o)throw new Error;r.assert(o.hash===n.hashOf),R(e,a,!0)?(e.timeOfLastSuccess=+new Date,e.lag=+new Date-o.timeSent):l(e,"Our message ["+n.hashOf+"] failed validation"),o.callback()}})),e.pending)throw new Error("there is already a pending message");-1===e.timeOfLastSuccess&&(e.timeOfLastSuccess=+new Date),e.pending={hash:n.hashOf,timeSent:+new Date,callback:function(){e.syncSchedule=h(e,(function(){g(e)}),0),t()}},r.PARANOIA&&A(e)},y=function(e){var n=e.onSettle;e.onSettle=[],n.forEach((function(n){try{n()}catch(n){d(e,"Error in onSettle handler ["+n.stack+"]")}}))},m=function(e){if(!e.mut.inverseOf)throw new Error;return e.mut.inverseOf},g=function(e,n){if(r.PARANOIA&&A(e),e.syncSchedule&&!e.pending){if(p(e,e.syncSchedule),e.syncSchedule=null,e.uncommitted=a.simplify(e.uncommitted,e.authDoc,e.config.operationSimplify),0===e.uncommitted.operations.length)return y(e),e.timeOfLastSuccess=+new Date,void(e.syncSchedule=h(e,(function(){g(e)})));var t=_(e,e.best)+1;if(t%e.config.checkpointInterval!=0){var o;o=e.setContentPatch?e.setContentPatch:i.create(i.PATCH,e.uncommitted,e.best.hashOf),v(e,o,(function(){e.setContentPatch&&(l(e,"initial Ack received ["+o.hashOf+"]"),e.setContentPatch=null)}))}else{var s=e.best;if(l(e,"Sending checkpoint (interval ["+e.config.checkpointInterval+"]) patch no ["+t+"]"),l(e,_(e,e.best)),!s||!s.content||!m(s.content))throw new Error;var c=a.createCheckpoint(e.authDoc,e.authDoc,m(s.content).parentHash),u=i.create(i.CHECKPOINT,c,s.hashOf);v(e,u,(function(){l(e,"Checkpoint sent and accepted")}))}}},E=function(e,n){r.assert(n.lastMsgHash),r.assert(n.hashOf),e.messages[n.hashOf]=n,(e.messagesByParent[n.lastMsgHash]=e.messagesByParent[n.lastMsgHash]||[]).push(n)},b=function(e,n){r.assert(n.lastMsgHash),r.assert(n.hashOf),delete e.messages[n.hashOf];var t=e.messagesByParent[n.lastMsgHash];r.assert(t.indexOf(n)>-1),t.splice(t.indexOf(n),1),0===t.length&&delete e.messagesByParent[n.lastMsgHash];var o=e.messagesByParent[n.hashOf];if(o)for(var a=0;a_(e,t)&&(t=o)})),t},x=function(e,n){n.operations.length&&(e.patchHandlers.forEach((function(e){e(n)})),e.changeHandlers.forEach((function(e){n.operations.forEach((function(n){e(n.offset,n.toRemove,n.toInsert)}))})))},N=function(e,n){try{return e.config.validateContent(n())}catch(n){d(e,"Error in content validator ["+n.stack+"]")}return!1},I=function(e,n,t){for(var r=O(e,n);r;r=O(e,r))if(!1===t(r))return},C=function(e,n){e.mut.inverseOf||((e.mut.inverseOf=a.invert(e,n)).mut.inverseOf=e)},R=function(e,n,t){r.PARANOIA&&A(e);var c=i.fromString(n);if(l(e,JSON.stringify([c.hashOf,c.content.operations])),e.messages[c.hashOf]){if(e.setContentPatch&&e.setContentPatch.hashOf===c.hashOf)e.setContentPatch=null;else{if(c.content.isCheckpoint)return l(e,"["+(t?"our":"their")+"] Checkpoint ["+c.hashOf+"] is already known"),!0;l(e,"Patch ["+c.hashOf+"] is already known")}r.PARANOIA&&A(e)}else if(!c.content.isCheckpoint||N(e,(function(){return c.content.operations[0].toInsert}))){if(E(e,c),!D(e,e.rootMessage,c)){if(c.content.isCheckpoint&&e.best.mut.isInitialMessage){l(e,"applying checkpoint ["+c.hashOf+"]");var u=a.apply(e.uncommitted,e.authDoc);r.assert(!r.PARANOIA||e.userInterfaceContent===u);var f=a.invert(e.uncommitted,e.authDoc);return a.addOperation(f,o.create(0,e.authDoc.length,c.content.operations[0].toInsert)),f=a.simplify(f,u,e.config.operationSimplify),c.mut.parentCount=0,e.rootMessage=e.best=c,e.authDoc=c.content.operations[0].toInsert,e.uncommitted=a.create(s.hex_sha256(e.authDoc)),x(e,f),r.PARANOIA&&(e.userInterfaceContent=e.authDoc),!0}return l(e,"Patch ["+c.hashOf+"] not connected to root (parent: ["+c.lastMsgHash+"])"),void(r.PARANOIA&&A(e))}(c=S(e,c)).mut.isFromMe=t;var d=c.content,h=[],p=e.best;if(!D(e,e.best,c)){var v=_(e,e.best),g=_(e,c);if(!(v0))return l(e,"Patch ["+c.hashOf+"] chain is ["+g+"] best chain is ["+v+"]"),r.PARANOIA&&A(e),!0;for(;p&&!D(e,p,c);)h.push(p),p=O(e,p);r.assert(p),l(e,"Patch ["+c.hashOf+"] better than best chain, switching")}var R=[],P=c;do{R.unshift(P),P=O(e,P),r.assert(P)}while(P!==p);var k=e.authDoc;h.forEach((function(e){k=a.apply(m(e.content),k)})),R.forEach((function(e,n){n!==R.length-1&&(C(e.content,k),k=a.apply(e.content,k))}));var M=e.best;if(R.length>1?(M=R[R.length-2],r.assert(M)):h.length&&(M=O(e,h[h.length-1]),r.assert(M)),r.assert(m(M.content).parentHash),r.assert(!r.PARANOIA||m(M.content).parentHash===s.hex_sha256(k)),m(M.content).parentHash===d.parentHash){if(d.isCheckpoint&&e.config.noPrune);else if(d.isCheckpoint){var F;if(I(e,c,(function(e){if(e.content.isCheckpoint){if(F)return F=e,!1;F=e}})),F&&F!==e.rootMessage){var L=_(e,F);if(e.config.strictCheckpointValidation&&L%e.config.checkpointInterval!=0){if(l(e,"checkpoint ["+c.hashOf+"] at invalid point ["+L+"]"),r.PARANOIA&&A(e),r.TESTING)throw new Error;return void b(e,c)}l(e,"checkpoint ["+c.hashOf+"]"),I(e,F,(function(n){l(e,"pruning ["+n.hashOf+"]"),b(e,n)})),e.rootMessage=F}}else{var H=a.simplify(d,k,e.config.operationSimplify);if(!a.equals(H,d)){if(l(e,"patch ["+c.hashOf+"] can be simplified"),r.PARANOIA&&A(e),r.TESTING)throw new Error;return void b(e,c)}if(!N(e,(function(){return a.apply(d,k)})))return void l(e,"Patch ["+c.hashOf+"] failed content validation")}C(d,k),e.uncommitted=a.simplify(e.uncommitted,e.authDoc,e.config.operationSimplify);var j=a.apply(e.uncommitted,e.authDoc);r.PARANOIA&&r.assert(j===e.userInterfaceContent);var K=a.invert(e.uncommitted,e.authDoc);if(h.forEach((function(n){l(e,"reverting ["+n.hashOf+"]"),n.mut.isFromMe&&l(e,"reverting patch 'from me' ["+JSON.stringify(n.content.operations)+"]"),K=a.merge(K,m(n.content)),function(e,n,t){T(e,n,m(t))}(e,n.mut.isFromMe,n.content)})),R.forEach((function(n){l(e,"applying ["+n.hashOf+"]"),K=a.merge(K,n.content),T(e,n.mut.isFromMe,n.content)})),K=a.merge(K,e.uncommitted),K=a.simplify(K,j,e.config.operationSimplify),e.best=c,r.PARANOIA){var U=a.apply(K,j);r.assert(e.userInterfaceContent.length===w(e)),r.assert(U===e.userInterfaceContent)}return x(e,K),e.uncommitted.operations.length||y(e),r.PARANOIA&&A(e),!0}if(l(e,"patch ["+c.hashOf+"] parentHash is not valid"),r.PARANOIA&&A(e),r.TESTING)throw new Error;b(e,c)}else l(e,"Checkpoint ["+c.hashOf+"] failed content validation")},P=function(e,n){return Object.freeze({type:"Block",hashOf:n.hashOf,lastMsgHash:n.lastMsgHash,isCheckpoint:!!n.content.isCheckpoint,isFromMe:n.mut&&n.mut.isFromMe,author:n.mut&&n.mut.author,serverHash:n.mut&&n.mut.serverHash,time:n.mut&&n.mut.time,getParent:function(){var t=O(e,n);if(t)return P(e,t)},getContent:function(){return function(e,n){for(var t=[n];t[0]!==e.rootMessage;){var o=O(e,t[0]);if(!o)return{error:"not connected to root",doc:void 0};t.unshift(o)}var i="";e.rootMessage.content.operations.length&&(r.assert(1===e.rootMessage.content.operations.length),i=e.rootMessage.content.operations[0].toInsert);for(var s=1;s=0;t--)n=s(e[t],n);return n};var c=o.invert=function(e,n){return r.PARANOIA&&(a(e),r.assert("string"==typeof n),r.assert(e.offset+e.toRemove<=n.length)),i(e.offset,e.toInsert.length,(" "+n.substring(e.offset,e.offset+e.toRemove)).slice(1))},u=/[\uD800-\uDBFF]|[\uDC00-\uDFFF]/,f=o.hasSurrogate=function(e){return u.test(e)};o.simplify=function(e,n){r.PARANOIA&&(a(e),r.assert("string"==typeof n),r.assert(e.offset+e.toRemove<=n.length));for(var t=c(e,n),o=Math.min(e.toInsert.length,t.toInsert.length),s=0;s=0&&h[s]===d[s];s--);d=d.substring(0,s+1),l=s+1}return 0===l&&0===d.length?null:i(u,l,d)},o.equals=function(e,n){return e.toRemove===n.toRemove&&e.toInsert===n.toInsert&&e.offset===n.offset},o.lengthChange=function(e){return r.PARANOIA&&a(e),e.toInsert.length-e.toRemove},o.merge=function(e,n){r.PARANOIA&&(a(n),a(e));var t=e.offset,o=e.toRemove,s=e.toInsert,c=n.offset,u=n.toRemove,f=n.toInsert,l=c-t;if(u>0){var d=s;s=s.substring(0,l)+s.substring(l+u),(u-=d.length-s.length)<0&&(u=0),o+=u,u=0}if(l<0)t+=l,s=f+s;else if(s.length===l)s+=f;else{if(!(s.length>l))throw new Error("should never happen\n"+JSON.stringify([e,n],null," "));s=s.substring(0,l)+f+s.substring(l)}return""===s&&0===o?null:i(t,o,s)},o.shouldMerge=function(e,n){return r.PARANOIA&&(a(e),a(n)),n.offset0;)a+=c=r._heap_write(t,o+a,e,i,s),i+=c,s-=c,o+=c=n.process(o,a),(a-=c)||(o=0);return this.pos=o,this.len=a,this},e.exports.hash_finish=function(){if(null!==this.result)throw new IllegalStateError("state must be reset before processing new data");return this.asm.finish(this.pos,this.len,0),this.result=new Uint8Array(this.HASH_SIZE),this.result.set(this.heap.subarray(0,this.HASH_SIZE)),this.pos=0,this.len=0,this}},"sha256/utils.js":function(e,n,t){var r=e.exports.string_to_bytes=function(e,n){n=!!n;for(var t=e.length,r=new Uint8Array(n?4*t:t),o=0,a=0;o=t)throw new Error("Malformed string, low surrogate expected at position "+o);i=(55296^i)<<10|65536|56320^e.charCodeAt(o)}else if(!n&&i>>>8)throw new Error("Wide characters are not allowed.");!n||i<=127?r[a++]=i:i<=2047?(r[a++]=192|i>>6,r[a++]=128|63&i):i<=65535?(r[a++]=224|i>>12,r[a++]=128|i>>6&63,r[a++]=128|63&i):(r[a++]=240|i>>18,r[a++]=128|i>>12&63,r[a++]=128|i>>6&63,r[a++]=128|63&i)}return r.subarray(0,a)};e.exports.hex_to_bytes=function(e){var n=e.length;1&n&&(e="0"+e,n++);for(var t=new Uint8Array(n>>1),r=0;r>1]=parseInt(e.substr(r,2),16);return t},e.exports.base64_to_bytes=function(e){return r(atob(e))};var o=e.exports.bytes_to_string=function(e,n){n=!!n;for(var t=e.length,r=new Array(t),o=0,a=0;o=192&&i<224&&o+1=224&&i<240&&o+2=240&&i<248&&o+3>10,r[a++]=56320|1023&s)}}for(var c="",u=16384,f=0;f>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e+=1},e.exports.is_number=function(e){return"number"==typeof e},e.exports.is_string=function(e){return"string"==typeof e},e.exports.is_buffer=function(e){return e instanceof ArrayBuffer},e.exports.is_bytes=function(e){return e instanceof Uint8Array},e.exports.is_typed_array=function(e){return e instanceof Int8Array||e instanceof Uint8Array||e instanceof Int16Array||e instanceof Uint16Array||e instanceof Int32Array||e instanceof Uint32Array||e instanceof Float32Array||e instanceof Float64Array},e.exports._heap_init=function(e,n){var t=n.heap,r=t?t.byteLength:n.heapSize||65536;if(4095&r||r<=0)throw new Error("heap size must be a positive integer and a multiple of 4096");return t=t||new e(new ArrayBuffer(r))},e.exports._heap_write=function(e,n,t,r,o){var a=e.length-n,i=a>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x428a2f98|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=n+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x71374491|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=t+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xb5c0fbcf|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=l+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xe9b5dba5|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=d+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x3956c25b|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=h+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x59f111f1|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=p+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x923f82a4|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=v+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xab1c5ed5|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=y+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xd807aa98|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=m+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x12835b01|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=g+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x243185be|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=E+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x550c7dc3|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=b+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x72be5d74|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=O+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x80deb1fe|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=A+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x9bdc06a7|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;R=w+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xc19bf174|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;e=R=(n>>>7^n>>>18^n>>>3^n<<25^n<<14)+(A>>>17^A>>>19^A>>>10^A<<15^A<<13)+e+m|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xe49b69c1|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;n=R=(t>>>7^t>>>18^t>>>3^t<<25^t<<14)+(w>>>17^w>>>19^w>>>10^w<<15^w<<13)+n+g|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xefbe4786|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;t=R=(l>>>7^l>>>18^l>>>3^l<<25^l<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+t+E|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x0fc19dc6|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;l=R=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(n>>>17^n>>>19^n>>>10^n<<15^n<<13)+l+b|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x240ca1cc|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;d=R=(h>>>7^h>>>18^h>>>3^h<<25^h<<14)+(t>>>17^t>>>19^t>>>10^t<<15^t<<13)+d+O|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x2de92c6f|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;h=R=(p>>>7^p>>>18^p>>>3^p<<25^p<<14)+(l>>>17^l>>>19^l>>>10^l<<15^l<<13)+h+A|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x4a7484aa|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;p=R=(v>>>7^v>>>18^v>>>3^v<<25^v<<14)+(d>>>17^d>>>19^d>>>10^d<<15^d<<13)+p+w|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x5cb0a9dc|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;v=R=(y>>>7^y>>>18^y>>>3^y<<25^y<<14)+(h>>>17^h>>>19^h>>>10^h<<15^h<<13)+v+e|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x76f988da|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;y=R=(m>>>7^m>>>18^m>>>3^m<<25^m<<14)+(p>>>17^p>>>19^p>>>10^p<<15^p<<13)+y+n|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x983e5152|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;m=R=(g>>>7^g>>>18^g>>>3^g<<25^g<<14)+(v>>>17^v>>>19^v>>>10^v<<15^v<<13)+m+t|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xa831c66d|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;g=R=(E>>>7^E>>>18^E>>>3^E<<25^E<<14)+(y>>>17^y>>>19^y>>>10^y<<15^y<<13)+g+l|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xb00327c8|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;E=R=(b>>>7^b>>>18^b>>>3^b<<25^b<<14)+(m>>>17^m>>>19^m>>>10^m<<15^m<<13)+E+d|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xbf597fc7|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;b=R=(O>>>7^O>>>18^O>>>3^O<<25^O<<14)+(g>>>17^g>>>19^g>>>10^g<<15^g<<13)+b+h|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xc6e00bf3|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;O=R=(A>>>7^A>>>18^A>>>3^A<<25^A<<14)+(E>>>17^E>>>19^E>>>10^E<<15^E<<13)+O+p|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xd5a79147|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;A=R=(w>>>7^w>>>18^w>>>3^w<<25^w<<14)+(b>>>17^b>>>19^b>>>10^b<<15^b<<13)+A+v|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x06ca6351|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;w=R=(e>>>7^e>>>18^e>>>3^e<<25^e<<14)+(O>>>17^O>>>19^O>>>10^O<<15^O<<13)+w+y|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x14292967|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;e=R=(n>>>7^n>>>18^n>>>3^n<<25^n<<14)+(A>>>17^A>>>19^A>>>10^A<<15^A<<13)+e+m|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x27b70a85|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;n=R=(t>>>7^t>>>18^t>>>3^t<<25^t<<14)+(w>>>17^w>>>19^w>>>10^w<<15^w<<13)+n+g|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x2e1b2138|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;t=R=(l>>>7^l>>>18^l>>>3^l<<25^l<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+t+E|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x4d2c6dfc|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;l=R=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(n>>>17^n>>>19^n>>>10^n<<15^n<<13)+l+b|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x53380d13|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;d=R=(h>>>7^h>>>18^h>>>3^h<<25^h<<14)+(t>>>17^t>>>19^t>>>10^t<<15^t<<13)+d+O|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x650a7354|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;h=R=(p>>>7^p>>>18^p>>>3^p<<25^p<<14)+(l>>>17^l>>>19^l>>>10^l<<15^l<<13)+h+A|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x766a0abb|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;p=R=(v>>>7^v>>>18^v>>>3^v<<25^v<<14)+(d>>>17^d>>>19^d>>>10^d<<15^d<<13)+p+w|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x81c2c92e|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;v=R=(y>>>7^y>>>18^y>>>3^y<<25^y<<14)+(h>>>17^h>>>19^h>>>10^h<<15^h<<13)+v+e|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x92722c85|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;y=R=(m>>>7^m>>>18^m>>>3^m<<25^m<<14)+(p>>>17^p>>>19^p>>>10^p<<15^p<<13)+y+n|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xa2bfe8a1|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;m=R=(g>>>7^g>>>18^g>>>3^g<<25^g<<14)+(v>>>17^v>>>19^v>>>10^v<<15^v<<13)+m+t|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xa81a664b|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;g=R=(E>>>7^E>>>18^E>>>3^E<<25^E<<14)+(y>>>17^y>>>19^y>>>10^y<<15^y<<13)+g+l|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xc24b8b70|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;E=R=(b>>>7^b>>>18^b>>>3^b<<25^b<<14)+(m>>>17^m>>>19^m>>>10^m<<15^m<<13)+E+d|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xc76c51a3|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;b=R=(O>>>7^O>>>18^O>>>3^O<<25^O<<14)+(g>>>17^g>>>19^g>>>10^g<<15^g<<13)+b+h|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xd192e819|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;O=R=(A>>>7^A>>>18^A>>>3^A<<25^A<<14)+(E>>>17^E>>>19^E>>>10^E<<15^E<<13)+O+p|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xd6990624|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;A=R=(w>>>7^w>>>18^w>>>3^w<<25^w<<14)+(b>>>17^b>>>19^b>>>10^b<<15^b<<13)+A+v|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xf40e3585|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;w=R=(e>>>7^e>>>18^e>>>3^e<<25^e<<14)+(O>>>17^O>>>19^O>>>10^O<<15^O<<13)+w+y|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x106aa070|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;e=R=(n>>>7^n>>>18^n>>>3^n<<25^n<<14)+(A>>>17^A>>>19^A>>>10^A<<15^A<<13)+e+m|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x19a4c116|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;n=R=(t>>>7^t>>>18^t>>>3^t<<25^t<<14)+(w>>>17^w>>>19^w>>>10^w<<15^w<<13)+n+g|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x1e376c08|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;t=R=(l>>>7^l>>>18^l>>>3^l<<25^l<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+t+E|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x2748774c|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;l=R=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(n>>>17^n>>>19^n>>>10^n<<15^n<<13)+l+b|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x34b0bcb5|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;d=R=(h>>>7^h>>>18^h>>>3^h<<25^h<<14)+(t>>>17^t>>>19^t>>>10^t<<15^t<<13)+d+O|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x391c0cb3|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;h=R=(p>>>7^p>>>18^p>>>3^p<<25^p<<14)+(l>>>17^l>>>19^l>>>10^l<<15^l<<13)+h+A|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x4ed8aa4a|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;p=R=(v>>>7^v>>>18^v>>>3^v<<25^v<<14)+(d>>>17^d>>>19^d>>>10^d<<15^d<<13)+p+w|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x5b9cca4f|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;v=R=(y>>>7^y>>>18^y>>>3^y<<25^y<<14)+(h>>>17^h>>>19^h>>>10^h<<15^h<<13)+v+e|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x682e6ff3|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;y=R=(m>>>7^m>>>18^m>>>3^m<<25^m<<14)+(p>>>17^p>>>19^p>>>10^p<<15^p<<13)+y+n|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x748f82ee|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;m=R=(g>>>7^g>>>18^g>>>3^g<<25^g<<14)+(v>>>17^v>>>19^v>>>10^v<<15^v<<13)+m+t|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x78a5636f|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;g=R=(E>>>7^E>>>18^E>>>3^E<<25^E<<14)+(y>>>17^y>>>19^y>>>10^y<<15^y<<13)+g+l|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x84c87814|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;E=R=(b>>>7^b>>>18^b>>>3^b<<25^b<<14)+(m>>>17^m>>>19^m>>>10^m<<15^m<<13)+E+d|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x8cc70208|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;b=R=(O>>>7^O>>>18^O>>>3^O<<25^O<<14)+(g>>>17^g>>>19^g>>>10^g<<15^g<<13)+b+h|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0x90befffa|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;O=R=(A>>>7^A>>>18^A>>>3^A<<25^A<<14)+(E>>>17^E>>>19^E>>>10^E<<15^E<<13)+O+p|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xa4506ceb|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;A=R=(w>>>7^w>>>18^w>>>3^w<<25^w<<14)+(b>>>17^b>>>19^b>>>10^b<<15^b<<13)+A+v|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xbef9a3f7|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;w=R=(e>>>7^e>>>18^e>>>3^e<<25^e<<14)+(O>>>17^O>>>19^O>>>10^O<<15^O<<13)+w+y|0;R=R+C+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(I^x&(N^I))+0xc67178f2|0;C=I;I=N;N=x;x=S+R|0;S=T;T=_;_=D;D=R+(_&T^S&(_^T))+(_>>>2^_>>>13^_>>>22^_<<30^_<<19^_<<10)|0;r=r+D|0;o=o+_|0;a=a+T|0;i=i+S|0;s=s+x|0;c=c+N|0;u=u+I|0;f=f+C|0}function C(e){e=e|0;I(N[e|0]<<24|N[e|1]<<16|N[e|2]<<8|N[e|3],N[e|4]<<24|N[e|5]<<16|N[e|6]<<8|N[e|7],N[e|8]<<24|N[e|9]<<16|N[e|10]<<8|N[e|11],N[e|12]<<24|N[e|13]<<16|N[e|14]<<8|N[e|15],N[e|16]<<24|N[e|17]<<16|N[e|18]<<8|N[e|19],N[e|20]<<24|N[e|21]<<16|N[e|22]<<8|N[e|23],N[e|24]<<24|N[e|25]<<16|N[e|26]<<8|N[e|27],N[e|28]<<24|N[e|29]<<16|N[e|30]<<8|N[e|31],N[e|32]<<24|N[e|33]<<16|N[e|34]<<8|N[e|35],N[e|36]<<24|N[e|37]<<16|N[e|38]<<8|N[e|39],N[e|40]<<24|N[e|41]<<16|N[e|42]<<8|N[e|43],N[e|44]<<24|N[e|45]<<16|N[e|46]<<8|N[e|47],N[e|48]<<24|N[e|49]<<16|N[e|50]<<8|N[e|51],N[e|52]<<24|N[e|53]<<16|N[e|54]<<8|N[e|55],N[e|56]<<24|N[e|57]<<16|N[e|58]<<8|N[e|59],N[e|60]<<24|N[e|61]<<16|N[e|62]<<8|N[e|63])}function R(e){e=e|0;N[e|0]=r>>>24;N[e|1]=r>>>16&255;N[e|2]=r>>>8&255;N[e|3]=r&255;N[e|4]=o>>>24;N[e|5]=o>>>16&255;N[e|6]=o>>>8&255;N[e|7]=o&255;N[e|8]=a>>>24;N[e|9]=a>>>16&255;N[e|10]=a>>>8&255;N[e|11]=a&255;N[e|12]=i>>>24;N[e|13]=i>>>16&255;N[e|14]=i>>>8&255;N[e|15]=i&255;N[e|16]=s>>>24;N[e|17]=s>>>16&255;N[e|18]=s>>>8&255;N[e|19]=s&255;N[e|20]=c>>>24;N[e|21]=c>>>16&255;N[e|22]=c>>>8&255;N[e|23]=c&255;N[e|24]=u>>>24;N[e|25]=u>>>16&255;N[e|26]=u>>>8&255;N[e|27]=u&255;N[e|28]=f>>>24;N[e|29]=f>>>16&255;N[e|30]=f>>>8&255;N[e|31]=f&255}function P(){r=0x6a09e667;o=0xbb67ae85;a=0x3c6ef372;i=0xa54ff53a;s=0x510e527f;c=0x9b05688c;u=0x1f83d9ab;f=0x5be0cd19;l=d=0}function k(e,n,t,h,p,v,y,m,g,E){e=e|0;n=n|0;t=t|0;h=h|0;p=p|0;v=v|0;y=y|0;m=m|0;g=g|0;E=E|0;r=e;o=n;a=t;i=h;s=p;c=v;u=y;f=m;l=g;d=E}function M(e,n){e=e|0;n=n|0;var t=0;if(e&63)return-1;while((n|0)>=64){C(e);e=e+64|0;n=n-64|0;t=t+64|0}l=l+t|0;if(l>>>0>>0)d=d+1|0;return t|0}function F(e,n,t){e=e|0;n=n|0;t=t|0;var r=0,o=0;if(e&63)return-1;if(~t)if(t&31)return-1;if((n|0)>=64){r=M(e,n)|0;if((r|0)==-1)return-1;e=e+r|0;n=n-r|0}r=r+n|0;l=l+n|0;if(l>>>0>>0)d=d+1|0;N[e|n]=0x80;if((n|0)>=56){for(o=n+1|0;(o|0)<64;o=o+1|0)N[e|o]=0x00;C(e);n=0;N[e|0]=0}for(o=n+1|0;(o|0)<59;o=o+1|0)N[e|o]=0;N[e|56]=d>>>21&255;N[e|57]=d>>>13&255;N[e|58]=d>>>5&255;N[e|59]=d<<3&255|l>>>29;N[e|60]=l>>>21&255;N[e|61]=l>>>13&255;N[e|62]=l>>>5&255;N[e|63]=l<<3&255;C(e);if(~t)R(t);return r|0}function L(){r=h;o=p;a=v;i=y;s=m;c=g;u=E;f=b;l=64;d=0}function H(){r=O;o=A;a=w;i=D;s=_;c=T;u=S;f=x;l=64;d=0}function j(e,n,t,N,C,R,k,M,F,L,H,j,K,U,B,V){e=e|0;n=n|0;t=t|0;N=N|0;C=C|0;R=R|0;k=k|0;M=M|0;F=F|0;L=L|0;H=H|0;j=j|0;K=K|0;U=U|0;B=B|0;V=V|0;P();I(e^0x5c5c5c5c,n^0x5c5c5c5c,t^0x5c5c5c5c,N^0x5c5c5c5c,C^0x5c5c5c5c,R^0x5c5c5c5c,k^0x5c5c5c5c,M^0x5c5c5c5c,F^0x5c5c5c5c,L^0x5c5c5c5c,H^0x5c5c5c5c,j^0x5c5c5c5c,K^0x5c5c5c5c,U^0x5c5c5c5c,B^0x5c5c5c5c,V^0x5c5c5c5c);O=r;A=o;w=a;D=i;_=s;T=c;S=u;x=f;P();I(e^0x36363636,n^0x36363636,t^0x36363636,N^0x36363636,C^0x36363636,R^0x36363636,k^0x36363636,M^0x36363636,F^0x36363636,L^0x36363636,H^0x36363636,j^0x36363636,K^0x36363636,U^0x36363636,B^0x36363636,V^0x36363636);h=r;p=o;v=a;y=i;m=s;g=c;E=u;b=f;l=64;d=0}function K(e,n,t){e=e|0;n=n|0;t=t|0;var l=0,d=0,h=0,p=0,v=0,y=0,m=0,g=0,E=0;if(e&63)return-1;if(~t)if(t&31)return-1;E=F(e,n,-1)|0;l=r,d=o,h=a,p=i,v=s,y=c,m=u,g=f;H();I(l,d,h,p,v,y,m,g,0x80000000,0,0,0,0,0,0,768);if(~t)R(t);return E|0}function U(e,n,t,l,d){e=e|0;n=n|0;t=t|0;l=l|0;d=d|0;var h=0,p=0,v=0,y=0,m=0,g=0,E=0,b=0,O=0,A=0,w=0,D=0,_=0,T=0,S=0,x=0;if(e&63)return-1;if(~d)if(d&31)return-1;N[e+n|0]=t>>>24;N[e+n+1|0]=t>>>16&255;N[e+n+2|0]=t>>>8&255;N[e+n+3|0]=t&255;K(e,n+4|0,-1)|0;h=O=r,p=A=o,v=w=a,y=D=i,m=_=s,g=T=c,E=S=u,b=x=f;l=l-1|0;while((l|0)>0){L();I(O,A,w,D,_,T,S,x,0x80000000,0,0,0,0,0,0,768);O=r,A=o,w=a,D=i,_=s,T=c,S=u,x=f;H();I(O,A,w,D,_,T,S,x,0x80000000,0,0,0,0,0,0,768);O=r,A=o,w=a,D=i,_=s,T=c,S=u,x=f;h=h^r;p=p^o;v=v^a;y=y^i;m=m^s;g=g^c;E=E^u;b=b^f;l=l-1|0}r=h;o=p;a=v;i=y;s=m;c=g;u=E;f=b;if(~d)R(d);return 0}return{reset:P,init:k,process:M,finish:F,hmac_reset:L,hmac_init:j,hmac_finish:K,pbkdf2_generate_block:U}}},"transform/TextTransformer.js":function(e,n,t){var r=t("../Operation"),o=t("../Common"),a=function(e,n){o.PARANOIA&&(r.check(e),r.check(n));var t=function(e,n){if(e.offset>n.offset){if(e.offset>n.offset+n.toRemove)return r.create(e.offset-n.toRemove+n.toInsert.length,e.toRemove,e.toInsert);var t=e.toRemove-(n.offset+n.toRemove-e.offset);return t<0&&(t=0),0===t&&0===e.toInsert.length?null:r.create(n.offset+n.toInsert.length,t,e.toInsert)}if(e.offset+e.toRemove=0;i--)s=r.apply(n[i],s);var c=[];for(i=e.length-1;i>=0;i--){for(var u=e[i],f=n.length-1;f>=0;f--){try{u=a(u,n[f])}catch(e){return console.error("The pluggable transform function threw an error, failing operational transformation"),console.error(e.stack),[]}if(!u)break}u&&(o.PARANOIA&&r.check(u,s.length),c.unshift(u))}return c}},"transform/NaiveJSONTransformer.js":function(e,n,t){var r=t("./TextTransformer"),o=t("../Operation"),a=t("../Common");e.exports=function(e,n,t){var i,s,c,u=a.global.REALTIME_DEBUG=a.global.REALTIME_DEBUG||{};try{i=r(e,n,t),s=o.applyMulti(n,t),c=o.applyMulti(i,s);try{return JSON.parse(c),i}catch(r){console.error(r),u.ot_parseError={type:"resultParseError",resultOps:i,toTransform:e,transformBy:n,text1:t,text2:s,text3:c,error:r},console.log("Debugging info available at `window.REALTIME_DEBUG.ot_parseError`")}}catch(r){console.error(r),u.ot_applyError={type:"resultParseError",resultOps:i,toTransform:e,transformBy:n,text1:t,text2:s,text3:c,error:r},console.log("Debugging info available at `window.REALTIME_DEBUG.ot_applyError`")}return[]}},"transform/SmartJSONTransformer.js":function(e,n,t){var r,o,a,i=t("json.sortify"),s=t("../Diff"),c=t("../Operation"),u=t("./TextTransformer"),f=function(e){return null===e?"null":(n=e,"[object Array]"===Object.prototype.toString.call(n)?"array":typeof e);var n},l=function(e,n){for(var t=n.length,r=0;r1)return!0}))&&("splice"!==n.type||!e.some((function(e){if("splice"===e.type&&y(e.path,n.path)&&e.path.length-n.path.length<0){if(!e.removals)return;for(var t=e.offset,r=e.offset+e.removals;te.offset+n.removals)return void(n.offset+=e.value.length-e.removals);if(n.offseti)){var d=n.slice(0,l);if((y=n.slice(l))===u){var p=Math.min(s,l);if((g=c.slice(0,p))===(b=d.slice(0,p)))return h(g,c.slice(p),d.slice(p),u)}}if(null===f||f===s){var v=s,y=(d=n.slice(0,v),n.slice(v));if(d===c){var m=Math.min(a-v,i-v);if((E=u.slice(u.length-m))===(O=y.slice(y.length-m)))return h(c,u.slice(0,u.length-m),y.slice(0,y.length-m),E)}}}if(r.length>0&&o&&0===o.length){var g=e.slice(0,r.index),E=e.slice(r.index+r.length);if(!(i<(p=g.length)+(m=E.length))){var b=n.slice(0,p),O=n.slice(i-m);if(g===b&&E===O)return h(g,e.slice(p,a-m),n.slice(p,i-m),E)}}return null}(e,n,t);if(f)return f}var l=i(e,n),d=e.substring(0,l);l=s(e=e.substring(l),n=n.substring(l));var p=e.substring(e.length-l),v=function(e,n){var t;if(!e)return[[1,n]];if(!n)return[[r,e]];var c=e.length>n.length?e:n,u=e.length>n.length?n:e,f=c.indexOf(u);if(-1!==f)return t=[[1,c.substring(0,f)],[0,u],[1,c.substring(f+u.length)]],e.length>n.length&&(t[0][0]=t[2][0]=r),t;if(1===u.length)return[[r,e],[1,n]];var l=function(e,n){var t=e.length>n.length?e:n,r=e.length>n.length?n:e;if(t.length<4||2*r.length=e.length?[r,o,a,c,l]:null}var a,c,u,f,l,d=o(t,r,Math.ceil(t.length/4)),h=o(t,r,Math.ceil(t.length/2));if(!d&&!h)return null;a=h?d&&d[4].length>h[4].length?d:h:d,e.length>n.length?(c=a[0],u=a[1],f=a[2],l=a[3]):(f=a[0],l=a[1],c=a[2],u=a[3]);var p=a[4];return[c,u,f,l,p]}(e,n);if(l){var d=l[0],h=l[1],p=l[2],v=l[3],y=l[4],m=o(d,p),g=o(h,v);return m.concat([[0,y]],g)}return function(e,n){for(var t=e.length,o=n.length,i=Math.ceil((t+o)/2),s=i,c=2*i,u=new Array(c),f=new Array(c),l=0;lt)v+=2;else if(O>o)p+=2;else if(h&&(D=s+d-E)>=0&&D=(w=t-f[D]))return a(e,n,T,O)}for(var A=-g+y;A<=g-m;A+=2){for(var w,D=s+A,_=(w=A===-g||A!==g&&f[D-1]t)m+=2;else if(_>o)y+=2;else if(!h){var T;if((b=s+d-A)>=0&&b=(w=t-w))return a(e,n,T,O)}}}return[[r,e],[1,n]]}(e,n)}(e=e.substring(0,e.length-l),n=n.substring(0,n.length-l));return d&&v.unshift([0,d]),p&&v.push([0,p]),c(v,u),v}function a(e,n,t,r){var a=e.substring(0,t),i=n.substring(0,r),s=e.substring(t),c=n.substring(r),u=o(a,i),f=o(s,c);return u.concat(f)}function i(e,n){if(!e||!n||e.charAt(0)!==n.charAt(0))return 0;for(var t=0,r=Math.min(e.length,n.length),o=r,a=0;t=0&&d(e[p][1])){var v=e[p][1].slice(-1);if(e[p][1]=e[p][1].slice(0,-1),f=v+f,h=v+h,!e[p][1]){e.splice(p,1),o--;var y=p-1;e[y]&&1===e[y][0]&&(u++,h=e[y][1]+h,y--),e[y]&&e[y][0]===r&&(a++,f=e[y][1]+f,y--),p=y}}l(e[o][1])&&(v=e[o][1].charAt(0),e[o][1]=e[o][1].slice(1),f+=v,h+=v)}if(o0||h.length>0){f.length>0&&h.length>0&&(0!==(t=i(h,f))&&(p>=0?e[p][1]+=h.substring(0,t):(e.splice(0,0,[0,h.substring(0,t)]),o++),h=h.substring(t),f=f.substring(t)),0!==(t=s(h,f))&&(e[o][1]=h.substring(h.length-t)+e[o][1],h=h.substring(0,h.length-t),f=f.substring(0,f.length-t)));var m=u+a;0===f.length&&0===h.length?(e.splice(o-m,m),o-=m):0===f.length?(e.splice(o-m,m,[1,h]),o=o-m+1):0===h.length?(e.splice(o-m,m,[r,f]),o=o-m+1):(e.splice(o-m,m,[r,f],[1,h]),o=o-m+2)}0!==o&&0===e[o-1][0]?(e[o-1][1]+=e[o][1],e.splice(o,1)):o++,u=0,a=0,f="",h=""}""===e[e.length-1][1]&&e.pop();var g=!1;for(o=1;o=55296&&e<=56319}function f(e){return e>=56320&&e<=57343}function l(e){return f(e.charCodeAt(0))}function d(e){return u(e.charCodeAt(e.length-1))}function h(e,n,t,o){return d(e)||l(o)?null:function(e){for(var n=[],t=0;t0&&n.push(e[t]);return n}([[0,e],[r,n],[1,t],[0,o]])}function p(e,n,t){return o(e,n,t,!0)}p.INSERT=1,p.DELETE=r,p.EQUAL=0,e.exports=p}},n=a("ChainPad.js"),r="ChainPad",e.exports=n,"undefined"!=typeof window?o=window:void 0!==t?o=t:"undefined"!=typeof self&&(o=self),o[r]=n}(A)),A.exports}var D,_,T=w(),S=n({__proto__:null,default:r(T)},[T]),x={exports:{}},N={exports:{}};function I(){return D||(D=1,function(e){!function(e){var n=function(e){var n,t=new Float64Array(16);if(e)for(n=0;n>24&255,e[n+1]=t>>16&255,e[n+2]=t>>8&255,e[n+3]=255&t,e[n+4]=r>>24&255,e[n+5]=r>>16&255,e[n+6]=r>>8&255,e[n+7]=255&r}function p(e,n,t,r,o){var a,i=0;for(a=0;a>>8)-1}function v(e,n,t,r){return p(e,n,t,r,16)}function y(e,n,t,r){return p(e,n,t,r,32)}function m(e,n,t,r){!function(e,n,t,r){for(var o,a=255&r[0]|(255&r[1])<<8|(255&r[2])<<16|(255&r[3])<<24,i=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,s=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,c=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,u=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,f=255&r[4]|(255&r[5])<<8|(255&r[6])<<16|(255&r[7])<<24,l=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,d=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,h=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,p=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,v=255&r[8]|(255&r[9])<<8|(255&r[10])<<16|(255&r[11])<<24,y=255&t[16]|(255&t[17])<<8|(255&t[18])<<16|(255&t[19])<<24,m=255&t[20]|(255&t[21])<<8|(255&t[22])<<16|(255&t[23])<<24,g=255&t[24]|(255&t[25])<<8|(255&t[26])<<16|(255&t[27])<<24,E=255&t[28]|(255&t[29])<<8|(255&t[30])<<16|(255&t[31])<<24,b=255&r[12]|(255&r[13])<<8|(255&r[14])<<16|(255&r[15])<<24,O=a,A=i,w=s,D=c,_=u,T=f,S=l,x=d,N=h,I=p,C=v,R=y,P=m,k=g,M=E,F=b,L=0;L<20;L+=2)O^=(o=(P^=(o=(N^=(o=(_^=(o=O+P|0)<<7|o>>>25)+O|0)<<9|o>>>23)+_|0)<<13|o>>>19)+N|0)<<18|o>>>14,T^=(o=(A^=(o=(k^=(o=(I^=(o=T+A|0)<<7|o>>>25)+T|0)<<9|o>>>23)+I|0)<<13|o>>>19)+k|0)<<18|o>>>14,C^=(o=(S^=(o=(w^=(o=(M^=(o=C+S|0)<<7|o>>>25)+C|0)<<9|o>>>23)+M|0)<<13|o>>>19)+w|0)<<18|o>>>14,F^=(o=(R^=(o=(x^=(o=(D^=(o=F+R|0)<<7|o>>>25)+F|0)<<9|o>>>23)+D|0)<<13|o>>>19)+x|0)<<18|o>>>14,O^=(o=(D^=(o=(w^=(o=(A^=(o=O+D|0)<<7|o>>>25)+O|0)<<9|o>>>23)+A|0)<<13|o>>>19)+w|0)<<18|o>>>14,T^=(o=(_^=(o=(x^=(o=(S^=(o=T+_|0)<<7|o>>>25)+T|0)<<9|o>>>23)+S|0)<<13|o>>>19)+x|0)<<18|o>>>14,C^=(o=(I^=(o=(N^=(o=(R^=(o=C+I|0)<<7|o>>>25)+C|0)<<9|o>>>23)+R|0)<<13|o>>>19)+N|0)<<18|o>>>14,F^=(o=(M^=(o=(k^=(o=(P^=(o=F+M|0)<<7|o>>>25)+F|0)<<9|o>>>23)+P|0)<<13|o>>>19)+k|0)<<18|o>>>14;O=O+a|0,A=A+i|0,w=w+s|0,D=D+c|0,_=_+u|0,T=T+f|0,S=S+l|0,x=x+d|0,N=N+h|0,I=I+p|0,C=C+v|0,R=R+y|0,P=P+m|0,k=k+g|0,M=M+E|0,F=F+b|0,e[0]=O>>>0&255,e[1]=O>>>8&255,e[2]=O>>>16&255,e[3]=O>>>24&255,e[4]=A>>>0&255,e[5]=A>>>8&255,e[6]=A>>>16&255,e[7]=A>>>24&255,e[8]=w>>>0&255,e[9]=w>>>8&255,e[10]=w>>>16&255,e[11]=w>>>24&255,e[12]=D>>>0&255,e[13]=D>>>8&255,e[14]=D>>>16&255,e[15]=D>>>24&255,e[16]=_>>>0&255,e[17]=_>>>8&255,e[18]=_>>>16&255,e[19]=_>>>24&255,e[20]=T>>>0&255,e[21]=T>>>8&255,e[22]=T>>>16&255,e[23]=T>>>24&255,e[24]=S>>>0&255,e[25]=S>>>8&255,e[26]=S>>>16&255,e[27]=S>>>24&255,e[28]=x>>>0&255,e[29]=x>>>8&255,e[30]=x>>>16&255,e[31]=x>>>24&255,e[32]=N>>>0&255,e[33]=N>>>8&255,e[34]=N>>>16&255,e[35]=N>>>24&255,e[36]=I>>>0&255,e[37]=I>>>8&255,e[38]=I>>>16&255,e[39]=I>>>24&255,e[40]=C>>>0&255,e[41]=C>>>8&255,e[42]=C>>>16&255,e[43]=C>>>24&255,e[44]=R>>>0&255,e[45]=R>>>8&255,e[46]=R>>>16&255,e[47]=R>>>24&255,e[48]=P>>>0&255,e[49]=P>>>8&255,e[50]=P>>>16&255,e[51]=P>>>24&255,e[52]=k>>>0&255,e[53]=k>>>8&255,e[54]=k>>>16&255,e[55]=k>>>24&255,e[56]=M>>>0&255,e[57]=M>>>8&255,e[58]=M>>>16&255,e[59]=M>>>24&255,e[60]=F>>>0&255,e[61]=F>>>8&255,e[62]=F>>>16&255,e[63]=F>>>24&255}(e,n,t,r)}function g(e,n,t,r){!function(e,n,t,r){for(var o,a=255&r[0]|(255&r[1])<<8|(255&r[2])<<16|(255&r[3])<<24,i=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,s=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,c=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,u=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,f=255&r[4]|(255&r[5])<<8|(255&r[6])<<16|(255&r[7])<<24,l=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,d=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,h=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,p=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,v=255&r[8]|(255&r[9])<<8|(255&r[10])<<16|(255&r[11])<<24,y=255&t[16]|(255&t[17])<<8|(255&t[18])<<16|(255&t[19])<<24,m=255&t[20]|(255&t[21])<<8|(255&t[22])<<16|(255&t[23])<<24,g=255&t[24]|(255&t[25])<<8|(255&t[26])<<16|(255&t[27])<<24,E=255&t[28]|(255&t[29])<<8|(255&t[30])<<16|(255&t[31])<<24,b=255&r[12]|(255&r[13])<<8|(255&r[14])<<16|(255&r[15])<<24,O=0;O<20;O+=2)a^=(o=(m^=(o=(h^=(o=(u^=(o=a+m|0)<<7|o>>>25)+a|0)<<9|o>>>23)+u|0)<<13|o>>>19)+h|0)<<18|o>>>14,f^=(o=(i^=(o=(g^=(o=(p^=(o=f+i|0)<<7|o>>>25)+f|0)<<9|o>>>23)+p|0)<<13|o>>>19)+g|0)<<18|o>>>14,v^=(o=(l^=(o=(s^=(o=(E^=(o=v+l|0)<<7|o>>>25)+v|0)<<9|o>>>23)+E|0)<<13|o>>>19)+s|0)<<18|o>>>14,b^=(o=(y^=(o=(d^=(o=(c^=(o=b+y|0)<<7|o>>>25)+b|0)<<9|o>>>23)+c|0)<<13|o>>>19)+d|0)<<18|o>>>14,a^=(o=(c^=(o=(s^=(o=(i^=(o=a+c|0)<<7|o>>>25)+a|0)<<9|o>>>23)+i|0)<<13|o>>>19)+s|0)<<18|o>>>14,f^=(o=(u^=(o=(d^=(o=(l^=(o=f+u|0)<<7|o>>>25)+f|0)<<9|o>>>23)+l|0)<<13|o>>>19)+d|0)<<18|o>>>14,v^=(o=(p^=(o=(h^=(o=(y^=(o=v+p|0)<<7|o>>>25)+v|0)<<9|o>>>23)+y|0)<<13|o>>>19)+h|0)<<18|o>>>14,b^=(o=(E^=(o=(g^=(o=(m^=(o=b+E|0)<<7|o>>>25)+b|0)<<9|o>>>23)+m|0)<<13|o>>>19)+g|0)<<18|o>>>14;e[0]=a>>>0&255,e[1]=a>>>8&255,e[2]=a>>>16&255,e[3]=a>>>24&255,e[4]=f>>>0&255,e[5]=f>>>8&255,e[6]=f>>>16&255,e[7]=f>>>24&255,e[8]=v>>>0&255,e[9]=v>>>8&255,e[10]=v>>>16&255,e[11]=v>>>24&255,e[12]=b>>>0&255,e[13]=b>>>8&255,e[14]=b>>>16&255,e[15]=b>>>24&255,e[16]=l>>>0&255,e[17]=l>>>8&255,e[18]=l>>>16&255,e[19]=l>>>24&255,e[20]=d>>>0&255,e[21]=d>>>8&255,e[22]=d>>>16&255,e[23]=d>>>24&255,e[24]=h>>>0&255,e[25]=h>>>8&255,e[26]=h>>>16&255,e[27]=h>>>24&255,e[28]=p>>>0&255,e[29]=p>>>8&255,e[30]=p>>>16&255,e[31]=p>>>24&255}(e,n,t,r)}var E=new Uint8Array([101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107]);function O(e,n,t,r,o,a,i){var s,c,u=new Uint8Array(16),f=new Uint8Array(64);for(c=0;c<16;c++)u[c]=0;for(c=0;c<8;c++)u[c]=a[c];for(;o>=64;){for(m(f,u,i,E),c=0;c<64;c++)e[n+c]=t[r+c]^f[c];for(s=1,c=8;c<16;c++)s=s+(255&u[c])|0,u[c]=255&s,s>>>=8;o-=64,n+=64,r+=64}if(o>0)for(m(f,u,i,E),c=0;c=64;){for(m(c,s,o,E),i=0;i<64;i++)e[n+i]=c[i];for(a=1,i=8;i<16;i++)a=a+(255&s[i])|0,s[i]=255&a,a>>>=8;t-=64,n+=64}if(t>0)for(m(c,s,o,E),i=0;i>>13|t<<3),r=255&e[4]|(255&e[5])<<8,this.r[2]=7939&(t>>>10|r<<6),o=255&e[6]|(255&e[7])<<8,this.r[3]=8191&(r>>>7|o<<9),a=255&e[8]|(255&e[9])<<8,this.r[4]=255&(o>>>4|a<<12),this.r[5]=a>>>1&8190,i=255&e[10]|(255&e[11])<<8,this.r[6]=8191&(a>>>14|i<<2),s=255&e[12]|(255&e[13])<<8,this.r[7]=8065&(i>>>11|s<<5),c=255&e[14]|(255&e[15])<<8,this.r[8]=8191&(s>>>8|c<<8),this.r[9]=c>>>5&127,this.pad[0]=255&e[16]|(255&e[17])<<8,this.pad[1]=255&e[18]|(255&e[19])<<8,this.pad[2]=255&e[20]|(255&e[21])<<8,this.pad[3]=255&e[22]|(255&e[23])<<8,this.pad[4]=255&e[24]|(255&e[25])<<8,this.pad[5]=255&e[26]|(255&e[27])<<8,this.pad[6]=255&e[28]|(255&e[29])<<8,this.pad[7]=255&e[30]|(255&e[31])<<8};function T(e,n,t,r,o,a){var i=new _(a);return i.update(t,r,o),i.finish(e,n),0}function S(e,n,t,r,o,a){var i=new Uint8Array(16);return T(i,0,t,r,o,a),v(e,n,i,0)}function x(e,n,t,r,o){var a;if(t<32)return-1;for(D(e,0,n,0,t,r,o),T(e,16,e,32,t-32,e),a=0;a<16;a++)e[a]=0;return 0}function N(e,n,t,r,o){var a,i=new Uint8Array(32);if(t<32)return-1;if(w(i,0,32,r,o),0!==S(n,16,n,32,t-32,i))return-1;for(D(e,0,n,0,t,r,o),a=0;a<32;a++)e[a]=0;return 0}function I(e,n){var t;for(t=0;t<16;t++)e[t]=0|n[t]}function C(e){var n,t,r=1;for(n=0;n<16;n++)t=e[n]+r+65535,r=Math.floor(t/65536),e[n]=t-65536*r;e[0]+=r-1+37*(r-1)}function R(e,n,t){for(var r,o=~(t-1),a=0;a<16;a++)r=o&(e[a]^n[a]),e[a]^=r,n[a]^=r}function P(e,t){var r,o,a,i=n(),s=n();for(r=0;r<16;r++)s[r]=t[r];for(C(s),C(s),C(s),o=0;o<2;o++){for(i[0]=s[0]-65517,r=1;r<15;r++)i[r]=s[r]-65535-(i[r-1]>>16&1),i[r-1]&=65535;i[15]=s[15]-32767-(i[14]>>16&1),a=i[15]>>16&1,i[14]&=65535,R(s,i,1-a)}for(r=0;r<16;r++)e[2*r]=255&s[r],e[2*r+1]=s[r]>>8}function k(e,n){var t=new Uint8Array(32),r=new Uint8Array(32);return P(t,e),P(r,n),y(t,0,r,0)}function M(e){var n=new Uint8Array(32);return P(n,e),1&n[0]}function F(e,n){var t;for(t=0;t<16;t++)e[t]=n[2*t]+(n[2*t+1]<<8);e[15]&=32767}function L(e,n,t){for(var r=0;r<16;r++)e[r]=n[r]+t[r]}function H(e,n,t){for(var r=0;r<16;r++)e[r]=n[r]-t[r]}function j(e,n,t){var r,o,a=0,i=0,s=0,c=0,u=0,f=0,l=0,d=0,h=0,p=0,v=0,y=0,m=0,g=0,E=0,b=0,O=0,A=0,w=0,D=0,_=0,T=0,S=0,x=0,N=0,I=0,C=0,R=0,P=0,k=0,M=0,F=t[0],L=t[1],H=t[2],j=t[3],K=t[4],U=t[5],B=t[6],V=t[7],Y=t[8],G=t[9],J=t[10],q=t[11],W=t[12],z=t[13],Q=t[14],X=t[15];a+=(r=n[0])*F,i+=r*L,s+=r*H,c+=r*j,u+=r*K,f+=r*U,l+=r*B,d+=r*V,h+=r*Y,p+=r*G,v+=r*J,y+=r*q,m+=r*W,g+=r*z,E+=r*Q,b+=r*X,i+=(r=n[1])*F,s+=r*L,c+=r*H,u+=r*j,f+=r*K,l+=r*U,d+=r*B,h+=r*V,p+=r*Y,v+=r*G,y+=r*J,m+=r*q,g+=r*W,E+=r*z,b+=r*Q,O+=r*X,s+=(r=n[2])*F,c+=r*L,u+=r*H,f+=r*j,l+=r*K,d+=r*U,h+=r*B,p+=r*V,v+=r*Y,y+=r*G,m+=r*J,g+=r*q,E+=r*W,b+=r*z,O+=r*Q,A+=r*X,c+=(r=n[3])*F,u+=r*L,f+=r*H,l+=r*j,d+=r*K,h+=r*U,p+=r*B,v+=r*V,y+=r*Y,m+=r*G,g+=r*J,E+=r*q,b+=r*W,O+=r*z,A+=r*Q,w+=r*X,u+=(r=n[4])*F,f+=r*L,l+=r*H,d+=r*j,h+=r*K,p+=r*U,v+=r*B,y+=r*V,m+=r*Y,g+=r*G,E+=r*J,b+=r*q,O+=r*W,A+=r*z,w+=r*Q,D+=r*X,f+=(r=n[5])*F,l+=r*L,d+=r*H,h+=r*j,p+=r*K,v+=r*U,y+=r*B,m+=r*V,g+=r*Y,E+=r*G,b+=r*J,O+=r*q,A+=r*W,w+=r*z,D+=r*Q,_+=r*X,l+=(r=n[6])*F,d+=r*L,h+=r*H,p+=r*j,v+=r*K,y+=r*U,m+=r*B,g+=r*V,E+=r*Y,b+=r*G,O+=r*J,A+=r*q,w+=r*W,D+=r*z,_+=r*Q,T+=r*X,d+=(r=n[7])*F,h+=r*L,p+=r*H,v+=r*j,y+=r*K,m+=r*U,g+=r*B,E+=r*V,b+=r*Y,O+=r*G,A+=r*J,w+=r*q,D+=r*W,_+=r*z,T+=r*Q,S+=r*X,h+=(r=n[8])*F,p+=r*L,v+=r*H,y+=r*j,m+=r*K,g+=r*U,E+=r*B,b+=r*V,O+=r*Y,A+=r*G,w+=r*J,D+=r*q,_+=r*W,T+=r*z,S+=r*Q,x+=r*X,p+=(r=n[9])*F,v+=r*L,y+=r*H,m+=r*j,g+=r*K,E+=r*U,b+=r*B,O+=r*V,A+=r*Y,w+=r*G,D+=r*J,_+=r*q,T+=r*W,S+=r*z,x+=r*Q,N+=r*X,v+=(r=n[10])*F,y+=r*L,m+=r*H,g+=r*j,E+=r*K,b+=r*U,O+=r*B,A+=r*V,w+=r*Y,D+=r*G,_+=r*J,T+=r*q,S+=r*W,x+=r*z,N+=r*Q,I+=r*X,y+=(r=n[11])*F,m+=r*L,g+=r*H,E+=r*j,b+=r*K,O+=r*U,A+=r*B,w+=r*V,D+=r*Y,_+=r*G,T+=r*J,S+=r*q,x+=r*W,N+=r*z,I+=r*Q,C+=r*X,m+=(r=n[12])*F,g+=r*L,E+=r*H,b+=r*j,O+=r*K,A+=r*U,w+=r*B,D+=r*V,_+=r*Y,T+=r*G,S+=r*J,x+=r*q,N+=r*W,I+=r*z,C+=r*Q,R+=r*X,g+=(r=n[13])*F,E+=r*L,b+=r*H,O+=r*j,A+=r*K,w+=r*U,D+=r*B,_+=r*V,T+=r*Y,S+=r*G,x+=r*J,N+=r*q,I+=r*W,C+=r*z,R+=r*Q,P+=r*X,E+=(r=n[14])*F,b+=r*L,O+=r*H,A+=r*j,w+=r*K,D+=r*U,_+=r*B,T+=r*V,S+=r*Y,x+=r*G,N+=r*J,I+=r*q,C+=r*W,R+=r*z,P+=r*Q,k+=r*X,b+=(r=n[15])*F,i+=38*(A+=r*H),s+=38*(w+=r*j),c+=38*(D+=r*K),u+=38*(_+=r*U),f+=38*(T+=r*B),l+=38*(S+=r*V),d+=38*(x+=r*Y),h+=38*(N+=r*G),p+=38*(I+=r*J),v+=38*(C+=r*q),y+=38*(R+=r*W),m+=38*(P+=r*z),g+=38*(k+=r*Q),E+=38*(M+=r*X),a=(r=(a+=38*(O+=r*L))+(o=1)+65535)-65536*(o=Math.floor(r/65536)),i=(r=i+o+65535)-65536*(o=Math.floor(r/65536)),s=(r=s+o+65535)-65536*(o=Math.floor(r/65536)),c=(r=c+o+65535)-65536*(o=Math.floor(r/65536)),u=(r=u+o+65535)-65536*(o=Math.floor(r/65536)),f=(r=f+o+65535)-65536*(o=Math.floor(r/65536)),l=(r=l+o+65535)-65536*(o=Math.floor(r/65536)),d=(r=d+o+65535)-65536*(o=Math.floor(r/65536)),h=(r=h+o+65535)-65536*(o=Math.floor(r/65536)),p=(r=p+o+65535)-65536*(o=Math.floor(r/65536)),v=(r=v+o+65535)-65536*(o=Math.floor(r/65536)),y=(r=y+o+65535)-65536*(o=Math.floor(r/65536)),m=(r=m+o+65535)-65536*(o=Math.floor(r/65536)),g=(r=g+o+65535)-65536*(o=Math.floor(r/65536)),E=(r=E+o+65535)-65536*(o=Math.floor(r/65536)),b=(r=b+o+65535)-65536*(o=Math.floor(r/65536)),a=(r=(a+=o-1+37*(o-1))+(o=1)+65535)-65536*(o=Math.floor(r/65536)),i=(r=i+o+65535)-65536*(o=Math.floor(r/65536)),s=(r=s+o+65535)-65536*(o=Math.floor(r/65536)),c=(r=c+o+65535)-65536*(o=Math.floor(r/65536)),u=(r=u+o+65535)-65536*(o=Math.floor(r/65536)),f=(r=f+o+65535)-65536*(o=Math.floor(r/65536)),l=(r=l+o+65535)-65536*(o=Math.floor(r/65536)),d=(r=d+o+65535)-65536*(o=Math.floor(r/65536)),h=(r=h+o+65535)-65536*(o=Math.floor(r/65536)),p=(r=p+o+65535)-65536*(o=Math.floor(r/65536)),v=(r=v+o+65535)-65536*(o=Math.floor(r/65536)),y=(r=y+o+65535)-65536*(o=Math.floor(r/65536)),m=(r=m+o+65535)-65536*(o=Math.floor(r/65536)),g=(r=g+o+65535)-65536*(o=Math.floor(r/65536)),E=(r=E+o+65535)-65536*(o=Math.floor(r/65536)),b=(r=b+o+65535)-65536*(o=Math.floor(r/65536)),a+=o-1+37*(o-1),e[0]=a,e[1]=i,e[2]=s,e[3]=c,e[4]=u,e[5]=f,e[6]=l,e[7]=d,e[8]=h,e[9]=p,e[10]=v,e[11]=y,e[12]=m,e[13]=g,e[14]=E,e[15]=b}function K(e,n){j(e,n,n)}function U(e,t){var r,o=n();for(r=0;r<16;r++)o[r]=t[r];for(r=253;r>=0;r--)K(o,o),2!==r&&4!==r&&j(o,o,t);for(r=0;r<16;r++)e[r]=o[r]}function B(e,t,r){var o,a,i=new Uint8Array(32),c=new Float64Array(80),u=n(),f=n(),l=n(),d=n(),h=n(),p=n();for(a=0;a<31;a++)i[a]=t[a];for(i[31]=127&t[31]|64,i[0]&=248,F(c,r),a=0;a<16;a++)f[a]=c[a],d[a]=u[a]=l[a]=0;for(u[0]=d[0]=1,a=254;a>=0;--a)R(u,f,o=i[a>>>3]>>>(7&a)&1),R(l,d,o),L(h,u,l),H(u,u,l),L(l,f,d),H(f,f,d),K(d,h),K(p,u),j(u,l,u),j(l,f,h),L(h,u,l),H(u,u,l),K(f,u),H(l,d,p),j(u,l,s),L(u,u,d),j(l,l,u),j(u,d,p),j(d,f,c),K(f,h),R(u,f,o),R(l,d,o);for(a=0;a<16;a++)c[a+16]=u[a],c[a+32]=l[a],c[a+48]=f[a],c[a+64]=d[a];var v=c.subarray(32),y=c.subarray(16);return U(v,v),j(y,y,v),P(e,y),0}function V(e,n){return B(e,n,o)}function Y(e,n){return t(n,32),V(e,n)}function G(e,n,t){var o=new Uint8Array(32);return B(o,t,n),g(e,r,o,E)}_.prototype.blocks=function(e,n,t){for(var r,o,a,i,s,c,u,f,l,d,h,p,v,y,m,g,E,b,O,A=this.fin?0:2048,w=this.h[0],D=this.h[1],_=this.h[2],T=this.h[3],S=this.h[4],x=this.h[5],N=this.h[6],I=this.h[7],C=this.h[8],R=this.h[9],P=this.r[0],k=this.r[1],M=this.r[2],F=this.r[3],L=this.r[4],H=this.r[5],j=this.r[6],K=this.r[7],U=this.r[8],B=this.r[9];t>=16;)d=l=0,d+=(w+=8191&(r=255&e[n+0]|(255&e[n+1])<<8))*P,d+=(D+=8191&(r>>>13|(o=255&e[n+2]|(255&e[n+3])<<8)<<3))*(5*B),d+=(_+=8191&(o>>>10|(a=255&e[n+4]|(255&e[n+5])<<8)<<6))*(5*U),d+=(T+=8191&(a>>>7|(i=255&e[n+6]|(255&e[n+7])<<8)<<9))*(5*K),l=(d+=(S+=8191&(i>>>4|(s=255&e[n+8]|(255&e[n+9])<<8)<<12))*(5*j))>>>13,d&=8191,d+=(x+=s>>>1&8191)*(5*H),d+=(N+=8191&(s>>>14|(c=255&e[n+10]|(255&e[n+11])<<8)<<2))*(5*L),d+=(I+=8191&(c>>>11|(u=255&e[n+12]|(255&e[n+13])<<8)<<5))*(5*F),d+=(C+=8191&(u>>>8|(f=255&e[n+14]|(255&e[n+15])<<8)<<8))*(5*M),h=l+=(d+=(R+=f>>>5|A)*(5*k))>>>13,h+=w*k,h+=D*P,h+=_*(5*B),h+=T*(5*U),l=(h+=S*(5*K))>>>13,h&=8191,h+=x*(5*j),h+=N*(5*H),h+=I*(5*L),h+=C*(5*F),l+=(h+=R*(5*M))>>>13,h&=8191,p=l,p+=w*M,p+=D*k,p+=_*P,p+=T*(5*B),l=(p+=S*(5*U))>>>13,p&=8191,p+=x*(5*K),p+=N*(5*j),p+=I*(5*H),p+=C*(5*L),v=l+=(p+=R*(5*F))>>>13,v+=w*F,v+=D*M,v+=_*k,v+=T*P,l=(v+=S*(5*B))>>>13,v&=8191,v+=x*(5*U),v+=N*(5*K),v+=I*(5*j),v+=C*(5*H),y=l+=(v+=R*(5*L))>>>13,y+=w*L,y+=D*F,y+=_*M,y+=T*k,l=(y+=S*P)>>>13,y&=8191,y+=x*(5*B),y+=N*(5*U),y+=I*(5*K),y+=C*(5*j),m=l+=(y+=R*(5*H))>>>13,m+=w*H,m+=D*L,m+=_*F,m+=T*M,l=(m+=S*k)>>>13,m&=8191,m+=x*P,m+=N*(5*B),m+=I*(5*U),m+=C*(5*K),g=l+=(m+=R*(5*j))>>>13,g+=w*j,g+=D*H,g+=_*L,g+=T*F,l=(g+=S*M)>>>13,g&=8191,g+=x*k,g+=N*P,g+=I*(5*B),g+=C*(5*U),E=l+=(g+=R*(5*K))>>>13,E+=w*K,E+=D*j,E+=_*H,E+=T*L,l=(E+=S*F)>>>13,E&=8191,E+=x*M,E+=N*k,E+=I*P,E+=C*(5*B),b=l+=(E+=R*(5*U))>>>13,b+=w*U,b+=D*K,b+=_*j,b+=T*H,l=(b+=S*L)>>>13,b&=8191,b+=x*F,b+=N*M,b+=I*k,b+=C*P,O=l+=(b+=R*(5*B))>>>13,O+=w*B,O+=D*U,O+=_*K,O+=T*j,l=(O+=S*H)>>>13,O&=8191,O+=x*L,O+=N*F,O+=I*M,O+=C*k,w=d=8191&(l=(l=((l+=(O+=R*P)>>>13)<<2)+l|0)+(d&=8191)|0),D=h+=l>>>=13,_=p&=8191,T=v&=8191,S=y&=8191,x=m&=8191,N=g&=8191,I=E&=8191,C=b&=8191,R=O&=8191,n+=16,t-=16;this.h[0]=w,this.h[1]=D,this.h[2]=_,this.h[3]=T,this.h[4]=S,this.h[5]=x,this.h[6]=N,this.h[7]=I,this.h[8]=C,this.h[9]=R},_.prototype.finish=function(e,n){var t,r,o,a,i=new Uint16Array(10);if(this.leftover){for(a=this.leftover,this.buffer[a++]=1;a<16;a++)this.buffer[a]=0;this.fin=1,this.blocks(this.buffer,0,16)}for(t=this.h[1]>>>13,this.h[1]&=8191,a=2;a<10;a++)this.h[a]+=t,t=this.h[a]>>>13,this.h[a]&=8191;for(this.h[0]+=5*t,t=this.h[0]>>>13,this.h[0]&=8191,this.h[1]+=t,t=this.h[1]>>>13,this.h[1]&=8191,this.h[2]+=t,i[0]=this.h[0]+5,t=i[0]>>>13,i[0]&=8191,a=1;a<10;a++)i[a]=this.h[a]+t,t=i[a]>>>13,i[a]&=8191;for(i[9]-=8192,r=(i[9]>>>15)-1,a=0;a<10;a++)i[a]&=r;for(r=~r,a=0;a<10;a++)this.h[a]=this.h[a]&r|i[a];for(this.h[0]=65535&(this.h[0]|this.h[1]<<13),this.h[1]=65535&(this.h[1]>>>3|this.h[2]<<10),this.h[2]=65535&(this.h[2]>>>6|this.h[3]<<7),this.h[3]=65535&(this.h[3]>>>9|this.h[4]<<4),this.h[4]=65535&(this.h[4]>>>12|this.h[5]<<1|this.h[6]<<14),this.h[5]=65535&(this.h[6]>>>2|this.h[7]<<11),this.h[6]=65535&(this.h[7]>>>5|this.h[8]<<8),this.h[7]=65535&(this.h[8]>>>8|this.h[9]<<5),o=this.h[0]+this.pad[0],this.h[0]=65535&o,a=1;a<8;a++)o=(this.h[a]+this.pad[a]|0)+(o>>>16)|0,this.h[a]=65535&o;e[n+0]=this.h[0]>>>0&255,e[n+1]=this.h[0]>>>8&255,e[n+2]=this.h[1]>>>0&255,e[n+3]=this.h[1]>>>8&255,e[n+4]=this.h[2]>>>0&255,e[n+5]=this.h[2]>>>8&255,e[n+6]=this.h[3]>>>0&255,e[n+7]=this.h[3]>>>8&255,e[n+8]=this.h[4]>>>0&255,e[n+9]=this.h[4]>>>8&255,e[n+10]=this.h[5]>>>0&255,e[n+11]=this.h[5]>>>8&255,e[n+12]=this.h[6]>>>0&255,e[n+13]=this.h[6]>>>8&255,e[n+14]=this.h[7]>>>0&255,e[n+15]=this.h[7]>>>8&255},_.prototype.update=function(e,n,t){var r,o;if(this.leftover){for((o=16-this.leftover)>t&&(o=t),r=0;r=16&&(o=t-t%16,this.blocks(e,n,o),n+=o,t-=o),t){for(r=0;r=128;){for(A=0;A<16;A++)w=8*A+z,I[A]=t[w+0]<<24|t[w+1]<<16|t[w+2]<<8|t[w+3],C[A]=t[w+4]<<24|t[w+5]<<16|t[w+6]<<8|t[w+7];for(A=0;A<80;A++)if(o=R,a=P,i=k,s=M,c=F,u=L,f=H,j,d=K,h=U,p=B,v=V,y=Y,m=G,g=J,q,T=65535&(_=q),S=_>>>16,x=65535&(D=j),N=D>>>16,T+=65535&(_=(Y>>>14|F<<18)^(Y>>>18|F<<14)^(F>>>9|Y<<23)),S+=_>>>16,x+=65535&(D=(F>>>14|Y<<18)^(F>>>18|Y<<14)^(Y>>>9|F<<23)),N+=D>>>16,T+=65535&(_=Y&G^~Y&J),S+=_>>>16,x+=65535&(D=F&L^~F&H),N+=D>>>16,T+=65535&(_=W[2*A+1]),S+=_>>>16,x+=65535&(D=W[2*A]),N+=D>>>16,D=I[A%16],S+=(_=C[A%16])>>>16,x+=65535&D,N+=D>>>16,x+=(S+=(T+=65535&_)>>>16)>>>16,T=65535&(_=O=65535&T|S<<16),S=_>>>16,x=65535&(D=b=65535&x|(N+=x>>>16)<<16),N=D>>>16,T+=65535&(_=(K>>>28|R<<4)^(R>>>2|K<<30)^(R>>>7|K<<25)),S+=_>>>16,x+=65535&(D=(R>>>28|K<<4)^(K>>>2|R<<30)^(K>>>7|R<<25)),N+=D>>>16,S+=(_=K&U^K&B^U&B)>>>16,x+=65535&(D=R&P^R&k^P&k),N+=D>>>16,l=65535&(x+=(S+=(T+=65535&_)>>>16)>>>16)|(N+=x>>>16)<<16,E=65535&T|S<<16,T=65535&(_=v),S=_>>>16,x=65535&(D=s),N=D>>>16,S+=(_=O)>>>16,x+=65535&(D=b),N+=D>>>16,P=o,k=a,M=i,F=s=65535&(x+=(S+=(T+=65535&_)>>>16)>>>16)|(N+=x>>>16)<<16,L=c,H=u,j=f,R=l,U=d,B=h,V=p,Y=v=65535&T|S<<16,G=y,J=m,q=g,K=E,A%16==15)for(w=0;w<16;w++)D=I[w],T=65535&(_=C[w]),S=_>>>16,x=65535&D,N=D>>>16,D=I[(w+9)%16],T+=65535&(_=C[(w+9)%16]),S+=_>>>16,x+=65535&D,N+=D>>>16,b=I[(w+1)%16],T+=65535&(_=((O=C[(w+1)%16])>>>1|b<<31)^(O>>>8|b<<24)^(O>>>7|b<<25)),S+=_>>>16,x+=65535&(D=(b>>>1|O<<31)^(b>>>8|O<<24)^b>>>7),N+=D>>>16,b=I[(w+14)%16],S+=(_=((O=C[(w+14)%16])>>>19|b<<13)^(b>>>29|O<<3)^(O>>>6|b<<26))>>>16,x+=65535&(D=(b>>>19|O<<13)^(O>>>29|b<<3)^b>>>6),N+=D>>>16,N+=(x+=(S+=(T+=65535&_)>>>16)>>>16)>>>16,I[w]=65535&x|N<<16,C[w]=65535&T|S<<16;T=65535&(_=K),S=_>>>16,x=65535&(D=R),N=D>>>16,D=e[0],S+=(_=n[0])>>>16,x+=65535&D,N+=D>>>16,N+=(x+=(S+=(T+=65535&_)>>>16)>>>16)>>>16,e[0]=R=65535&x|N<<16,n[0]=K=65535&T|S<<16,T=65535&(_=U),S=_>>>16,x=65535&(D=P),N=D>>>16,D=e[1],S+=(_=n[1])>>>16,x+=65535&D,N+=D>>>16,N+=(x+=(S+=(T+=65535&_)>>>16)>>>16)>>>16,e[1]=P=65535&x|N<<16,n[1]=U=65535&T|S<<16,T=65535&(_=B),S=_>>>16,x=65535&(D=k),N=D>>>16,D=e[2],S+=(_=n[2])>>>16,x+=65535&D,N+=D>>>16,N+=(x+=(S+=(T+=65535&_)>>>16)>>>16)>>>16,e[2]=k=65535&x|N<<16,n[2]=B=65535&T|S<<16,T=65535&(_=V),S=_>>>16,x=65535&(D=M),N=D>>>16,D=e[3],S+=(_=n[3])>>>16,x+=65535&D,N+=D>>>16,N+=(x+=(S+=(T+=65535&_)>>>16)>>>16)>>>16,e[3]=M=65535&x|N<<16,n[3]=V=65535&T|S<<16,T=65535&(_=Y),S=_>>>16,x=65535&(D=F),N=D>>>16,D=e[4],S+=(_=n[4])>>>16,x+=65535&D,N+=D>>>16,N+=(x+=(S+=(T+=65535&_)>>>16)>>>16)>>>16,e[4]=F=65535&x|N<<16,n[4]=Y=65535&T|S<<16,T=65535&(_=G),S=_>>>16,x=65535&(D=L),N=D>>>16,D=e[5],S+=(_=n[5])>>>16,x+=65535&D,N+=D>>>16,N+=(x+=(S+=(T+=65535&_)>>>16)>>>16)>>>16,e[5]=L=65535&x|N<<16,n[5]=G=65535&T|S<<16,T=65535&(_=J),S=_>>>16,x=65535&(D=H),N=D>>>16,D=e[6],S+=(_=n[6])>>>16,x+=65535&D,N+=D>>>16,N+=(x+=(S+=(T+=65535&_)>>>16)>>>16)>>>16,e[6]=H=65535&x|N<<16,n[6]=J=65535&T|S<<16,T=65535&(_=q),S=_>>>16,x=65535&(D=j),N=D>>>16,D=e[7],S+=(_=n[7])>>>16,x+=65535&D,N+=D>>>16,N+=(x+=(S+=(T+=65535&_)>>>16)>>>16)>>>16,e[7]=j=65535&x|N<<16,n[7]=q=65535&T|S<<16,z+=128,r-=128}return r}function Q(e,n,t){var r,o=new Int32Array(8),a=new Int32Array(8),i=new Uint8Array(256),s=t;for(o[0]=1779033703,o[1]=3144134277,o[2]=1013904242,o[3]=2773480762,o[4]=1359893119,o[5]=2600822924,o[6]=528734635,o[7]=1541459225,a[0]=4089235720,a[1]=2227873595,a[2]=4271175723,a[3]=1595750129,a[4]=2917565137,a[5]=725511199,a[6]=4215389547,a[7]=327033209,z(o,a,n,t),t%=128,r=0;r=0;--o)Z(e,n,r=t[o/8|0]>>(7&o)&1),X(n,e),X(e,e),Z(e,n,r)}function ne(e,t){var r=[n(),n(),n(),n()];I(r[0],f),I(r[1],l),I(r[2],i),j(r[3],f,l),ee(e,r,t)}function te(e,r,o){var a,i=new Uint8Array(64),s=[n(),n(),n(),n()];for(o||t(r,32),Q(i,r,32),i[0]&=248,i[31]&=127,i[31]|=64,ne(s,i),$(e,s),a=0;a<32;a++)r[a+32]=e[a];return 0}var re=new Float64Array([237,211,245,92,26,99,18,88,214,156,247,162,222,249,222,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16]);function oe(e,n){var t,r,o,a;for(r=63;r>=32;--r){for(t=0,o=r-32,a=r-12;o>8,n[o]-=256*t;n[o]+=t,n[r]=0}for(t=0,o=0;o<32;o++)n[o]+=t-(n[31]>>4)*re[o],t=n[o]>>8,n[o]&=255;for(o=0;o<32;o++)n[o]-=t*re[o];for(r=0;r<32;r++)n[r+1]+=n[r]>>8,e[r]=255&n[r]}function ae(e){var n,t=new Float64Array(64);for(n=0;n<64;n++)t[n]=e[n];for(n=0;n<64;n++)e[n]=0;oe(e,t)}function ie(e,t,r,o){var a,i,s=new Uint8Array(64),c=new Uint8Array(64),u=new Uint8Array(64),f=new Float64Array(64),l=[n(),n(),n(),n()];Q(s,o,32),s[0]&=248,s[31]&=127,s[31]|=64;var d=r+64;for(a=0;a=0;r--)K(o,o),1!==r&&j(o,o,t);for(r=0;r<16;r++)e[r]=o[r]}(r,r),j(r,r,s),j(r,r,u),j(r,r,u),j(e[0],r,u),K(o,e[0]),j(o,o,u),k(o,s)&&j(e[0],e[0],d),K(o,e[0]),j(o,o,u),k(o,s)?-1:(M(e[0])===t[31]>>7&&H(e[0],a,e[0]),j(e[3],e[0],e[1]),0)}function ce(e,t,r,o){var a,i=new Uint8Array(32),s=new Uint8Array(64),c=[n(),n(),n(),n()],u=[n(),n(),n(),n()];if(r<64)return-1;if(se(u,o))return-1;for(a=0;a=0},e.sign.keyPair=function(){var e=new Uint8Array(le),n=new Uint8Array(de);return te(e,n),{publicKey:e,secretKey:n}},e.sign.keyPair.fromSecretKey=function(e){if(pe(e),e.length!==de)throw new Error("bad secret key size");for(var n=new Uint8Array(le),t=0;t{var n={setCustomize:n=>{e=n.ApiConfig},getWebsocketURL:function(n){var t=e.websocketPath||"/cryptpad_websocket";if(/^ws{1,2}:\/\//.test(t))return t;var r=new URL(n||self?.location?.href);return n&&(r.href=n),r.protocol.replace(/http/,"ws")+"//"+r.host+t}};return n})())}(k)),k.exports}var F,L=M(),H=n({__proto__:null,default:r(L)},[L]),j={exports:{}};function K(){return F||(F=1,function(e){e.exports&&(e.exports=function(e={}){return{setCustomize:n=>{e=n.AppConfig},userHashKey:"User_hash",userNameKey:"User_name",blockHashKey:"Block_hash",fileHashKey:"FS_hash",sessionJWT:"Session_JWT",ssoSeed:"SSO_seed",displayNameKey:"cryptpad.username",oldStorageKey:"CryptPad_RECENTPADS",storageKey:"filesData",tokenKey:"loginToken",prefersDriveRedirectKey:"prefersDriveRedirect",isPremiumKey:"isPremiumUser",displayPadCreationScreen:"displayPadCreationScreen",deprecatedKey:"deprecated",MAX_TEAMS_SLOTS:e.maxTeamsSlots||5,MAX_TEAMS_OWNED:e.maxOwnedTeams||5,MAX_PREMIUM_TEAMS_SLOTS:Math.max(e.maxTeamsSlots||0,e.maxPremiumTeamsSlots||0)||5,MAX_PREMIUM_TEAMS_OWNED:Math.max(e.maxOwnedTeams||0,e.maxPremiumTeamsOwned||0)||5,criticalApps:["profile","settings","debug","admin","support","notifications","calendar","moderation","oldadmin"],earlyAccessApps:[]}}(void 0))}(j)),j.exports}var U,B=K(),V=n({__proto__:null,default:r(B)},[B]),Y={exports:{}},G={exports:{}},J=G.exports;function q(){return U||(U=1,function(e){!function(n){var t={};n.atob=n.atob||function(e){return Buffer.from(e,"base64").toString("binary")},n.btoa=n.btoa||function(e){return Buffer.from(e,"binary").toString("base64")},t.slice=function(e,n,t){return Array.prototype.slice.call(e,n,t)},t.u8ToBase64=(e,n)=>{const t=new FileReader;t.onload=()=>{let e=t.result,r=e.slice(e.indexOf(",")+1);n(r)},t.readAsDataURL(new Blob([e]))},t.shuffleArray=function(e){for(var n=e.length-1;n>0;n--){var t=Math.floor(Math.random()*(n+1)),r=e[n];e[n]=e[t],e[t]=r}},t.bake=function(e,n){return void 0===n&&(n=[]),Array.isArray(n)||(n=[n]),function(){return e.apply(null,n)}},t.both=function(e,n){if("function"!=typeof e)throw new Error("INVALID_USAGE");return"function"!=typeof n&&(n=function(e){return e}),function(){return e.apply(null,arguments),n.apply(null,arguments)}},t.clone=function(e){return null==e?e:JSON.parse(JSON.stringify(e))},t.serializeError=function(e){if(!(e instanceof Error))return e;var n={};return Object.getOwnPropertyNames(e).forEach((function(t){n[t]=e[t]})),n},t.tryParse=function(e){try{return JSON.parse(e)}catch(e){return}},t.mkAsync=function(e,n){if("function"!=typeof e)throw new Error("EXPECTED_FUNCTION");return function(){var t=Array.prototype.slice.call(arguments);setTimeout((function(){e.apply(null,t)}),n)}},t.mkEvent=function(e){var n=[],t=!1;let r;return{reg:function(r){e&&t?setTimeout(r):n.push(r)},unreg:function(e){-1!==n.indexOf(e)?n.splice(n.indexOf(e),1):console.log("event handler was already unregistered")},fire:function(){if(!e||!t){var o=Array.prototype.slice.call(arguments);t||r.apply(null,o),t=!0,n.forEach((function(e){e.apply(null,o)}))}},promise:new Promise((e=>{r=e}))}},t.mkTimeout=function(e,n){n=n||0;var r=t.once(e),o=setTimeout((function(){r("TIMEOUT")}),n);return t.both(r,(function(){clearTimeout(o)}))},t.onClickEnter=function(e,n,t){e.on("click keydown",(function(e){var r="click"===e.type,o="keydown"===e.type&&13===e.which,a="keydown"===e.type&&32===e.which&&t&&t.space;(r||o||a)&&("keydown"===e.type&&e.preventDefault(),n(e))}))},t.response=function(e){var n={},t={};"function"!=typeof e&&(e=function(e){throw new Error(e)});var r=function(e){clearTimeout(t[e]),delete t[e],delete n[e]};return{clear:r,expected:function(e){return Boolean(n[e])},expectation:function(e){return n[e]},expect:function(o,a,i){"string"!=typeof o&&e("EXPECTED_STRING"),"function"!=typeof a&&e("EXPECTED_CALLBACK"),n[o]=a,"number"==typeof i&&i&&(t[o]=setTimeout((function(){"function"==typeof n[o]&&n[o]("TIMEOUT"),r(o)}),i))},handle:function(t,o){var a=n[t];if("function"==typeof a){try{a.apply(null,Array.isArray(o)?o:[o])}catch(n){e("HANDLER_ERROR",{error:n,id:t,args:o})}r(t)}else e("MISSING_CALLBACK",{id:t,args:o})},_pending:n}},t.inc=function(e,n,t){e[n]=(e[n]||0)+("number"==typeof t?t:1)},t.values=function(e){return Object.keys(e).map((function(n){return e[n]}))},t.find=function(e,n){for(var t=n.length,r=0;r&"']/g,(function(e){return{"<":"<",">":">","&":"&",'"':""","'":"'"}[e]})):""},t.hexToBase64=function(e){var t=e.replace(/\r|\n/g,"").replace(/([\da-fA-F]{2}) ?/g,"0x$1 ").replace(/ +$/,"").split(" "),r=String.fromCharCode.apply(null,t);return n.btoa(r).replace(/\//g,"-").replace(/=+$/,"")},t.base64ToHex=function(e){var t=[];return n.atob(e.replace(/-/g,"/")).split("").forEach((function(e){var n=e.charCodeAt(0).toString(16);1===n.length&&(n="0"+n),t.push(n)})),t.join("")},t.uint8ArrayToHex=function(e){for(var n="",t=0;t=o?"GB":e>=r?"MB":"KB"};t.getBlock=function(e,n,r){var o=t.once(t.mkAsync(r)),a={};"string"==typeof n.bearer&&n.bearer&&(a.authorization=`Bearer ${n.bearer}`),fetch(e,{method:"GET",credentials:"include",headers:a}).then((e=>{e.ok?o(void 0,e):401!==e.status&&404!==e.status?o(e.status,e):e.json().then((n=>{o(e.status,n)})).catch((()=>{o(e.status)}))})).catch((e=>{o(e)}))},t.fetchApi=function(e,n,t,r){const o=new URL(e);o.pathname=`api/${n}`;let a=o.href+(t?"?"+ +new Date:"");if("undefined"!=typeof self&&self.crypto)fetch(a).then((e=>{if(!e.ok)throw new Error(`Fetch error: ${e.status}`);return e.text()})).then((e=>{r(JSON.parse(e.slice(27,-5)))})).catch((e=>{console.error(e.message),r({})}));else if(void 0!==b){("http:"===o.protocol?require("node:http"):require("node:https")).get(o.href,(e=>{let n="";e.on("data",(e=>{n+=e})),e.on("end",(()=>{try{r(JSON.parse(n.slice(27,-5)))}catch(e){console.error(e),r({})}}))}))}},t.fetch=function(e,n,r,o){var a,i=t.once(t.mkAsync(n)),s=function(e){var n=e.replace(/(\/)*$/,""),t=n.lastIndexOf("/"),r=n.slice(t+1);return/^[a-f0-9]{48}$/.test(r)||(r=void 0),r}(e),c=function(){(a=new XMLHttpRequest).open("GET",e,!0),r&&a.addEventListener("progress",(function(e){if(e.lengthComputable){var n=e.loaded/e.total;r(n)}}),!1),a.responseType="arraybuffer",a.onerror=function(e){i(e)},a.onload=function(){if(/^4/.test(""+this.status))return i("XHR_ERROR");var e=a.response;if(e){var n=new Uint8Array(e);return s?void function(e,n,t){o&&"function"==typeof o.setBlobCache?o.setBlobCache(e,n,t):t("EINVAL")}(s,n,(function(){i(null,n)})):void i(void 0,n)}i("ENOENT")},a.send(null)};if(s)return function(e,n){o&&"function"==typeof o.getBlobCache?o.getBlobCache(e,n):n("EINVAL")}(s,(function(e,n){!e&&n?i(void 0,n):c()})),{cancel:function(){a&&a.abort&&a.abort()}};c()},t.dataURIToBlob=function(e){for(var n=atob(e.split(",")[1]),t=e.split(",")[0].split(":")[1].split(";")[0],r=new ArrayBuffer(n.length),o=new Uint8Array(r),a=0;aparseInt(e,10).toString(16).padStart(2,"0"))).join("")}`},t.isSmallScreen=function(){return n.innerHeight<800||n.innerWidth<800},t.stripTags=function(e){var n=document.createElement("div");return n.innerHTML=e,n.innerText},t.parseFilename=function(e){if(!e||!e.trim())return{};var n=/^(\.?.+?)(\.[^.]+)?$/.exec(e)||[];return{name:n[1],ext:n[2]}},t.isPlainTextFile=function(e,n){if(e&&0===e.indexOf("text/"))return!0;var r=t.parseFilename(n);return!(e||!n||r.ext)||("application/x-javascript"===e||"application/xml"===e)},t.isSpreadsheet=function(e,n){return e&&("application/vnd.oasis.opendocument.spreadsheet"===e||"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"===e)||n&&(n.endsWith(".xlsx")||n.endsWith(".ods"))},t.isOfficeDoc=function(e,n){return e&&("application/vnd.oasis.opendocument.text"===e||"application/vnd.openxmlformats-officedocument.wordprocessingml.document"===e)||n&&(n.endsWith(".docx")||n.endsWith(".odt"))},t.isPresentation=function(e,n){return e&&("application/vnd.oasis.opendocument.presentation"===e||"application/vnd.openxmlformats-officedocument.presentationml.presentation"===e)||n&&(n.endsWith(".pptx")||n.endsWith(".odp"))},t.isValidURL=function(e){return!!new RegExp("^(https?:\\/\\/)((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?").test(e)};var a=/([\uD800-\uDBFF][\uDC00-\uDFFF])/;t.getFirstCharacter=function(e){if(!e||!e.trim())return"?";var n=function(e){for(var n=e.split(a),t=[],r=0;r{let n=/ver=([0-9.]+)(-[0-9]*)?/.exec(e);return Array.isArray(n)&&n[1]||void 0},t.Saferphore={create:e=>{var n,t=[];return n=function(){if(e<0)throw new Error("(resourceCount < 0) should never happen");var r;0!==e&&0!==t.length&&(e--,t.shift()((r=0,function(t){if(r++)throw new Error("returnAfter() called multiple times");var o=0;return function(){if(o++)throw new Error("returnAfter wrapped callback called multiple times");t&&t.apply(null,arguments),e++,n()}})))},{take:function(e){t.push(e),n()}}}},e.exports?e.exports=t:n.CryptPad_Util=t}("undefined"!=typeof self?self:J)}(G)),G.exports}var W,z,Q={exports:{}};function X(){return W||(W=1,function(e){e.exports&&(e.exports=function(){var e={},n=function(e){return e.replace(/-/g,"/")};return e.parseUser=function(e){var t,r,o,a=function(e){if(/^\[.*?@.*\]$/.test(e)){var t,r=e.slice(1,-1);if(r=r.replace(/\/([a-zA-Z0-9+-]{43}=)$/,(function(e,r){return t=n(r),""})),t){var o=r.lastIndexOf("@");if(!(o<1))return{domain:r.slice(o+1),user:r.slice(0,o),pubkey:t}}}}(e);if(function(e){if(e&&e.domain&&e.user&&e.pubkey)return!0}(a))return a;if(e.replace(/^https*:\/\/([^\/]+)\/user\/#\/1\/([^\/]+)\/([a-zA-Z0-9+-]{43}=)$/,(function(e,a,i,s){return t=a,r=i,o=n(s),""})),!t)throw new Error("Could not parse user id ["+e+"]");return{domain:t,user:r,pubkey:o}},e.serialize=function(e,n,t){return"["+n+"@"+e.replace(/https*:\/\//,"")+"/"+t.replace(/\//g,"-")+"]"},e.canonicalize=function(t){if("string"==typeof t){if(44===t.length)return n(t);try{return e.parseUser(t).pubkey}catch(e){return}}},e}())}(Q)),Q.exports}function Z(){return z||(z=1,function(e){!function(n){e.exports&&(e.exports=function(e,t,r,o){var a=n.CryptPad_Hash={},i=e.uint8ArrayToHex,s=e.hexToBase64,c=e.base64ToHex;a.encodeBase64=o.util.encodeBase64,a.decodeBase64=o.util.decodeBase64,a.hashChannelList=function(e){return o.util.encodeBase64(o.hash(o.util.decodeUTF8(JSON.stringify(e))))},a.generateSignPair=function(){var e=o.sign.keyPair(),n=function(e){return t.b64RemoveSlashes(e).replace(/=+$/g,"")};return{validateKey:a.encodeBase64(e.publicKey),signKey:a.encodeBase64(e.secretKey),safeValidateKey:n(a.encodeBase64(e.publicKey)),safeSignKey:n(a.encodeBase64(e.secretKey))}},a.getSignPublicFromPrivate=function(e){var n=t.b64AddSlashes(e),r=o.util.decodeBase64(n),a=o.sign.keyPair.fromSecretKey(r);return o.util.encodeBase64(a.publicKey)},a.getCurvePublicFromPrivate=function(e){var n=t.b64AddSlashes(e),r=o.util.decodeBase64(n),a=o.box.keyPair.fromSecretKey(r);return o.util.encodeBase64(a.publicKey)};var u=a.getEditHashFromKeys=function(e){var n=e.version,r=e.keys;if(0===n)return e.channel+e.key;if(1===n){if(!r.editKeyStr)return;return"/1/edit/"+s(e.channel)+"/"+t.b64RemoveSlashes(r.editKeyStr)+"/"}if(2===n){if(!r.editKeyStr)return;var o=e.password?"p/":"";return"/2/"+e.type+"/edit/"+t.b64RemoveSlashes(r.editKeyStr)+"/"+o}},f=a.getViewHashFromKeys=function(e){var n=e.version,r=e.keys;if(0!==n){if(1===n){if(!r.viewKeyStr)return;return"/1/view/"+s(e.channel)+"/"+t.b64RemoveSlashes(r.viewKeyStr)+"/"}if(2===n){if(!r.viewKeyStr)return;var o=e.password?"p/":"";return"/2/"+e.type+"/view/"+t.b64RemoveSlashes(r.viewKeyStr)+"/"+o}}};a.getHiddenHashFromKeys=function(e,n,t){t=t||{};var r=n.keys&&n.keys.editKeyStr||n.key,o=!t.view&&r?"edit/":"view/",i=n.password?"p/":"";n.keys&&n.keys.fileKeyStr&&(o="");var s="/3/"+e+"/"+o+n.channel+"/"+i,c=a.parseTypeHash(e,s);return c&&c.getHash?c.getHash(t||{}):s};var l=a.getFileHashFromKeys=function(e){var n=e.version,r=e.keys;if(0!==n){if(1===n)return"/1/"+s(e.channel)+"/"+t.b64RemoveSlashes(r.fileKeyStr)+"/";if(2===n){if(!r.fileKeyStr)return;var o=e.password?"p/":"";return"/2/"+e.type+"/"+t.b64RemoveSlashes(r.fileKeyStr)+"/"+o}}};a.getPublicSigningKeyString=r.serialize,a.ephemeralChannelLength=34,a.createChannelId=function(e){var n=i(t.Nacl.randomBytes(e?17:16));if(-1===[32,34].indexOf(n.length)||/[^a-f0-9]/.test(n))throw new Error("channel ids must consist of 32 hex characters");return n},a.getChannelIdFromKey=function(e){if(e)return i(a.decodeBase64(e).subarray(0,16))},a.getBoxPublicFromSecret=function(e){if(e){var n=a.decodeBase64(e),t=o.box.keyPair.fromSecretKey(n);return a.encodeBase64(t.publicKey)}},a.checkBoxKeyPair=function(e,n){if(!n||!e)return!1;var t=a.decodeBase64(e),r=o.box.keyPair.fromSecretKey(t);return n===a.encodeBase64(r.publicKey)},a.createRandomHash=function(e,n){var r;return"file"===e?(r=t.createFileCryptor2(void 0,n),l({password:Boolean(n),version:2,type:e,keys:r})):(r=t.createEditCryptor2(void 0,void 0,n),u({password:Boolean(n),version:2,type:e,keys:r}))};var d=a.parseTypeHash=function(e,n){if(n){var r,o=[],a={},i=(r=n,r.replace(/\/+/g,"/")).split("/"),s=function(){a.password=-1!==o.indexOf("p"),a.present=-1!==o.indexOf("present"),a.embed=-1!==o.indexOf("embed"),a.versionHash=function(e){var n;return e.some((function(e){if(/^hash=/.test(e))return n=e.slice(5),!0})),n?t.b64AddSlashes(n):""}(o),a.auditorKey=function(e){var n;return e.some((function(e){if(/^auditor=/.test(e))return n=e.slice(8),!0})),n?t.b64AddSlashes(n):""}(o),a.newPadOpts=function(e){var n;return e.some((function(e){if(/^newpad=/.test(e))return n=e.slice(7),!0})),n||""}(o),a.loginOpts=function(e){var n;return e.some((function(e){if(/^login=/.test(e))return n=e.slice(6),!0})),n||""}(o),a.ownerKey=function(e){var n;return e.some((function(e){if(86===e.length)return n=e,!0})),n}(o)};return i[1]&&"4"===i[1]?(a.getHash=function(n){if(!n||!Object.keys(n).length)return"";var t="/4/"+e+"/";return n.newPadOpts&&(t+="newpad="+n.newPadOpts+"/"),n.loginOpts&&(t+="login="+n.loginOpts+"/"),t},a.getOptions=function(){var e={};return a.newPadOpts&&(e.newPadOpts=a.newPadOpts),a.loginOpts&&(e.loginOpts=a.loginOpts),e},a.version=4,a.app=i[2],o=i.slice(3),s(),a):-1===["media","file","user","invite"].indexOf(e)?(a.type="pad",a.getHash=function(){return n},a.getOptions=function(){return{embed:a.embed,present:a.present,ownerKey:a.ownerKey,versionHash:a.versionHash,auditorKey:a.auditorKey,newPadOpts:a.newPadOpts,loginOpts:a.loginOpts,password:a.password}},"/"!==n.slice(0,1)&&n.length>=56?(a.channel=n.slice(0,32),a.key=n.slice(32,56),a.version=0,a):(a.getHash=function(e){var n=i.slice(0,5).join("/")+"/",r=void 0!==e.ownerKey?e.ownerKey:a.ownerKey;r&&(n+=r+"/"),(a.password||e.password)&&(n+="p/"),e.embed&&(n+="embed/"),e.present&&(n+="present/");var o=void 0!==e.versionHash?e.versionHash:a.versionHash;o&&(n+="hash="+t.b64RemoveSlashes(o)+"/");var s=void 0!==e.auditorKey?e.auditorKey:a.auditorKey;return s&&(n+="auditor="+t.b64RemoveSlashes(s)+"/"),e.newPadOpts&&(n+="newpad="+e.newPadOpts+"/"),e.loginOpts&&(n+="login="+e.loginOpts+"/"),n},i[1]&&"1"===i[1]?(a.version=1,a.mode=i[2],a.channel=i[3],a.key=t.b64AddSlashes(i[4]),o=i.slice(5),s(),a):i[1]&&"2"===i[1]?(a.version=2,a.app=i[2],a.mode=i[3],a.key=i[4],o=i.slice(5),s(),a):i[1]&&"3"===i[1]?(a.version=3,a.app=i[2],a.mode=i[3],a.channel=i[4],o=i.slice(5),s(),a):a)):(a.getHash=function(){return i.join("/")},-1!==["media","file"].indexOf(e)?(a.type="file",a.getOptions=function(){return{embed:a.embed,present:a.present,ownerKey:a.ownerKey,newPadOpts:a.newPadOpts,loginOpts:a.loginOpts,password:a.password}},a.getHash=function(e){var n=i.slice(0,4).join("/")+"/",t=void 0!==e.ownerKey?e.ownerKey:a.ownerKey;return t&&(n+=t+"/"),(a.password||e.password)&&(n+="p/"),e.embed&&(n+="embed/"),e.present&&(n+="present/"),e.newPadOpts&&(n+="newpad="+e.newPadOpts+"/"),e.loginOpts&&(n+="login="+e.loginOpts+"/"),n},i[1]&&"1"===i[1]?(a.version=1,a.channel=i[2].replace(/-/g,"/"),a.key=i[3].replace(/-/g,"/"),o=i.slice(4),s(),a):i[1]&&"2"===i[1]?(a.version=2,a.app=i[2],a.key=i[3],o=i.slice(4),s(),a):i[1]&&"3"===i[1]?(a.version=3,a.app=i[2],a.channel=i[3],o=i.slice(4),s(),a):a):-1!==["user"].indexOf(e)?(a.type="user",i[1]&&"1"===i[1]?(a.version=1,a.user=i[2],a.pubkey=i[3].replace(/-/g,"/"),a):a):-1!==["invite"].indexOf(e)?(a.type="invite",i[1]&&"2"===i[1]?(a.version=2,a.app=i[2],a.mode=i[3],a.key=i[4],o=i.slice(5),a.password=-1!==o.indexOf("p"),a):a):void 0)}},h=a.parsePadUrl=function(e){var n,t={};return e?("/"!==e.slice(-1)&&"#"!==e.slice(-1)&&(e+="/"),e=e.replace(/\/\?[^#]+#/,"/#"),t.getUrl=function(e){e=e||{};var n="/";return t.type?(n+=t.type+"/",!t.hashData&&e&&Object.keys(e).length?n+"#"+function(e){if(!e||!Object.keys(e).length)return"";var n="/4/"+t.type+"/";return e.newPadOpts&&(n+="newpad="+e.newPadOpts+"/"),e.loginOpts&&(n+="login="+e.loginOpts+"/"),n}(e):t.hashData?n+="#"+t.hashData.getHash(e):n):n},t.getOptions=function(){return t.hashData&&t.hashData.getOptions?t.hashData.getOptions():{}},/^https*:\/\//.test(e)?(e.replace(/^https*:\/\/([^\/]*)\/(.*?)\//i,(function(e,n,r){return t.domain=n,t.type=r,""})),-1===(n=e.indexOf("/#"))||(t.hash=e.slice(n+2),t.hashData=d(t.type,t.hash)),t):/^\/($|[^\/])/.test(e)?(n=e.indexOf("/#"),t.type=e.slice(1,n),-1===n||(t.hash=e.slice(n+2),t.hashData=d(t.type,t.hash)),t):t):t};return a.hashToHref=function(e,n){return"/"+n+"/#"+e},a.hrefToHash=function(e){return a.parsePadUrl(e).hash},a.getRelativeHref=function(e){if(e&&-1!==e.indexOf("#")){var n=h(e);return"/"+n.type+"/#"+n.hash}},a.getSecrets=function(e,n,r){var a,i,s={},u=function(){s.keys=t.createEditCryptor2(void 0,void 0,r),s.channel=c(s.keys.chanId),s.version=2,s.type=e};if(!n)return u(),s;if(n){if(!e)throw new Error("getSecrets with a hash requires a type parameter");a=d(e,n),i=n}if(0===i.length)return u(),s;if(0===a.version)s.channel=a.channel,s.key=a.key,s.version=0;else if(1===a.version){if(s.version=1,"pad"===a.type){if(s.channel=c(a.channel),"edit"===a.mode){if(s.keys=t.createEditCryptor(a.key),s.key=s.keys.editKeyStr,32!==s.channel.length||24!==s.key.length)throw new Error("The channel key and/or the encryption key is invalid")}else if("view"===a.mode&&(s.keys=t.createViewCryptor(a.key),32!==s.channel.length))throw new Error("The channel key is invalid")}else if("file"===a.type)s.channel=c(a.channel),s.keys={fileKeyStr:a.key,cryptKey:o.util.decodeBase64(a.key)};else if("user"===a.type)throw new Error("User hashes can't be opened (yet)")}else if(2===a.version)if(s.version=2,s.type=e,s.password=r,"pad"===a.type){if("edit"===a.mode){if(s.keys=t.createEditCryptor2(a.key,void 0,r),s.channel=c(s.keys.chanId),s.key=s.keys.editKeyStr,32!==s.channel.length||24!==s.key.length)throw new Error("The channel key and/or the encryption key is invalid")}else if("view"===a.mode&&(s.keys=t.createViewCryptor2(a.key,r),s.channel=c(s.keys.chanId),32!==s.channel.length))throw new Error("The channel key is invalid")}else if("file"===a.type){if(s.keys=t.createFileCryptor2(a.key,r),s.channel=c(s.keys.chanId),s.key=s.keys.fileKeyStr,48!==s.channel.length||24!==s.key.length)throw new Error("The channel key and/or the encryption key is invalid")}else if("user"===a.type)throw new Error("User hashes can't be opened (yet)");return s},a.getHashes=function(e){var n={};return(e=JSON.parse(JSON.stringify(e))).keys||e.key?(e.keys||(e.keys={}),(e.keys.editKeyStr||0===e.version&&e.key)&&(n.editHash=u(e)),e.keys.viewKeyStr&&(n.viewHash=f(e)),e.keys.fileKeyStr&&(n.fileHash=l(e)),n):n},a.getFormData=function(e,n,t){var r=(e=e||a.getSecrets("form",n,t))&&e.keys,i=r&&r.secondaryKey;if(i){var s=o.box.keyPair.fromSecretKey(o.util.decodeUTF8(i).slice(0,32)),c={};c.form_public=o.util.encodeBase64(s.publicKey);var u=c.form_private=o.util.encodeBase64(s.secretKey),f=a.getViewHashFromKeys({version:1,channel:e.channel,keys:{viewKeyStr:o.util.encodeBase64(r.cryptKey)}}),l=a.parseTypeHash("pad",f);return c.form_auditorHash=l.getHash({auditorKey:u}),c}},a.hrefToHexChannelId=function(e,n){var t=a.parsePadUrl(e);if(t&&t.hash)return a.getSecrets(t.type,t.hash,n).channel},a.getBlobPathFromHex=function(e){return"/blob/"+e.slice(0,2)+"/"+e},a.serializeHash=function(e){return e&&"/"!==e.slice(-1)&&(e+="/"),e},a.createInviteUrl=function(e,t){return t=t||a.createChannelId(),n.location.origin+"/invite/#/1/"+t+"/"+e.replace(/\//g,"-")+"/"},a.isValidChannel=function(e){return/^[a-zA-Z0-9]{32,48}$/.test(e)},a.isValidHref=function(e){if(e){var n=a.parsePadUrl(e);if(n&&n.type){if(n.hash){if(!n.hashData)return;if(void 0===n.hashData.version)return;if("pad"===n.hashData.type||"file"===n.hashData.type){if(!n.hashData.key&&!n.hashData.channel)return;if(n.hashData.key&&!/^[a-zA-Z0-9+-/=]+$/.test(n.hashData.key))return}}return n}}},a.decodeDataOptions=function(n){var t=decodeURIComponent(n),r=o.util.encodeUTF8(o.util.decodeBase64(t));return e.tryParse(r)||{}},a.encodeDataOptions=function(e){var n=JSON.stringify(e),t=o.util.encodeBase64(o.util.decodeUTF8(n));return encodeURIComponent(t)},a.getNewPadURL=function(e,n){var t=a.parsePadUrl(e),r=t.getOptions();return r.newPadOpts=a.encodeDataOptions(n),t.getUrl(r)},a.getLoginURL=function(e,n){var t=a.parsePadUrl(e),r=t.getOptions();return r.loginOpts=a.encodeDataOptions(n),t.getUrl(r)},a}(q(),C(),X(),I()))}("undefined"!=typeof window?window:{})}(Y)),Y.exports}var $,ee,ne=Z(),te=q(),re={exports:{}},oe={exports:{}};function ae(){return $||($=1,function(e){e.exports=function e(n,t,r){function o(i,s){if(!t[i]){if(!n[i]){if(!s&&b)return b(i);if(a)return a(i,!0);var c=new Error("Cannot find module '"+i+"'");throw c.code="MODULE_NOT_FOUND",c}var u=t[i]={exports:{}};n[i][0].call(u.exports,(function(e){var t=n[i][1][e];return o(t||e)}),u,u.exports,e,n,t,r)}return t[i].exports}for(var a=b,i=0;i=43)}})).catch((function(){return!1}))}function A(e){return"boolean"==typeof v?u.resolve(v):O(e).then((function(e){return v=e}))}function w(e){var n=y[e.name],t={};t.promise=new u((function(e,n){t.resolve=e,t.reject=n})),n.deferredOperations.push(t),n.dbReady?n.dbReady=n.dbReady.then((function(){return t.promise})):n.dbReady=t.promise}function D(e){var n=y[e.name].deferredOperations.pop();if(n)return n.resolve(),n.promise}function _(e,n){var t=y[e.name].deferredOperations.pop();if(t)return t.reject(n),t.promise}function T(e,n){return new u((function(t,r){if(y[e.name]=y[e.name]||F(),e.db){if(!n)return t(e.db);w(e),e.db.close()}var o=[e.name];n&&o.push(e.version);var a=i.open.apply(i,o);n&&(a.onupgradeneeded=function(n){var t=a.result;try{t.createObjectStore(e.storeName),n.oldVersion<=1&&t.createObjectStore(p)}catch(t){if("ConstraintError"!==t.name)throw t;console.warn('The database "'+e.name+'" has been upgraded from version '+n.oldVersion+" to version "+n.newVersion+', but the storage "'+e.storeName+'" already exists.')}}),a.onerror=function(e){e.preventDefault(),r(a.error)},a.onsuccess=function(){var n=a.result;n.onversionchange=function(e){e.target.close()},t(n),D(e)}}))}function S(e){return T(e,!1)}function x(e){return T(e,!0)}function N(e,n){if(!e.db)return!0;var t=!e.db.objectStoreNames.contains(e.storeName),r=e.versione.db.version;if(r&&(e.version!==n&&console.warn('The database "'+e.name+"\" can't be downgraded from version "+e.db.version+" to version "+e.version+"."),e.version=e.db.version),o||t){if(t){var a=e.db.version+1;a>e.version&&(e.version=a)}return!0}return!1}function I(e){return new u((function(n,t){var r=new FileReader;r.onerror=t,r.onloadend=function(t){var r=btoa(t.target.result||"");n({__local_forage_encoded_blob:!0,data:r,type:e.type})},r.readAsBinaryString(e)}))}function C(e){return c([b(atob(e.data))],{type:e.type})}function R(e){return e&&e.__local_forage_encoded_blob}function P(e){var n=this,t=n._initReady().then((function(){var e=y[n._dbInfo.name];if(e&&e.dbReady)return e.dbReady}));return l(t,e,e),t}function k(e){w(e);for(var n=y[e.name],t=n.forages,r=0;r0&&(!e.db||"InvalidStateError"===o.name||"NotFoundError"===o.name))return u.resolve().then((function(){if(!e.db||"NotFoundError"===o.name&&!e.db.objectStoreNames.contains(e.storeName)&&e.version<=e.db.version)return e.db&&(e.version=e.db.version+1),x(e)})).then((function(){return k(e).then((function(){M(e,n,t,r-1)}))})).catch(t);t(o)}}function F(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function L(e){var n=this,t={db:null};if(e)for(var r in e)t[r]=e[r];var o=y[t.name];o||(o=F(),y[t.name]=o),o.forages.push(n),n._initReady||(n._initReady=n.ready,n.ready=P);var a=[];function i(){return u.resolve()}for(var s=0;s>4,f[c++]=(15&r)<<4|o>>2,f[c++]=(3&o)<<6|63&a;return u}function pe(e){var n,t=new Uint8Array(e),r="";for(n=0;n>2],r+=z[(3&t[n])<<4|t[n+1]>>4],r+=z[(15&t[n+1])<<2|t[n+2]>>6],r+=z[63&t[n+2]];return t.length%3==2?r=r.substring(0,r.length-1)+"=":t.length%3==1&&(r=r.substring(0,r.length-2)+"=="),r}function ve(e,n){var t="";if(e&&(t=de.call(e)),e&&("[object ArrayBuffer]"===t||e.buffer&&"[object ArrayBuffer]"===de.call(e.buffer))){var r,o=Z;e instanceof ArrayBuffer?(r=e,o+=ee):(r=e.buffer,"[object Int8Array]"===t?o+=te:"[object Uint8Array]"===t?o+=re:"[object Uint8ClampedArray]"===t?o+=oe:"[object Int16Array]"===t?o+=ae:"[object Uint16Array]"===t?o+=se:"[object Int32Array]"===t?o+=ie:"[object Uint32Array]"===t?o+=ce:"[object Float32Array]"===t?o+=ue:"[object Float64Array]"===t?o+=fe:n(new Error("Failed to get type for BinaryArray"))),n(o+pe(r))}else if("[object Blob]"===t){var a=new FileReader;a.onload=function(){var t=Q+e.type+"~"+pe(this.result);n(Z+ne+t)},a.readAsArrayBuffer(e)}else try{n(JSON.stringify(e))}catch(t){console.error("Couldn't convert value into a JSON string: ",e),n(null,t)}}function ye(e){if(e.substring(0,$)!==Z)return JSON.parse(e);var n,t=e.substring(le),r=e.substring($,le);if(r===ne&&X.test(t)){var o=t.match(X);n=o[1],t=t.substring(o[0].length)}var a=he(t);switch(r){case ee:return a;case ne:return c([a],{type:n});case te:return new Int8Array(a);case re:return new Uint8Array(a);case oe:return new Uint8ClampedArray(a);case ae:return new Int16Array(a);case se:return new Uint16Array(a);case ie:return new Int32Array(a);case ce:return new Uint32Array(a);case ue:return new Float32Array(a);case fe:return new Float64Array(a);default:throw new Error("Unkown type: "+r)}}var me={serialize:ve,deserialize:ye,stringToBuffer:he,bufferToString:pe};function ge(e,n,t,r){e.executeSql("CREATE TABLE IF NOT EXISTS "+n.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],t,r)}function Ee(e){var n=this,t={db:null};if(e)for(var r in e)t[r]="string"!=typeof e[r]?e[r].toString():e[r];var o=new u((function(e,r){try{t.db=openDatabase(t.name,String(t.version),t.description,t.size)}catch(e){return r(e)}t.db.transaction((function(o){ge(o,t,(function(){n._dbInfo=t,e()}),(function(e,n){r(n)}))}),r)}));return t.serializer=me,o}function be(e,n,t,r,o,a){e.executeSql(t,r,o,(function(e,i){i.code===i.SYNTAX_ERR?e.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[n.storeName],(function(e,s){s.rows.length?a(e,i):ge(e,n,(function(){e.executeSql(t,r,o,a)}),a)}),a):a(e,i)}),a)}function Oe(e,n){var t=this;e=d(e);var r=new u((function(n,r){t.ready().then((function(){var o=t._dbInfo;o.db.transaction((function(t){be(t,o,"SELECT * FROM "+o.storeName+" WHERE key = ? LIMIT 1",[e],(function(e,t){var r=t.rows.length?t.rows.item(0).value:null;r&&(r=o.serializer.deserialize(r)),n(r)}),(function(e,n){r(n)}))}))})).catch(r)}));return f(r,n),r}function Ae(e,n){var t=this,r=new u((function(n,r){t.ready().then((function(){var o=t._dbInfo;o.db.transaction((function(t){be(t,o,"SELECT * FROM "+o.storeName,[],(function(t,r){for(var a=r.rows,i=a.length,s=0;s0)return void a(we.apply(o,[e,s,t,r-1]));i(n)}}))}))})).catch(i)}));return f(a,t),a}function De(e,n,t){return we.apply(this,[e,n,t,1])}function _e(e,n){var t=this;e=d(e);var r=new u((function(n,r){t.ready().then((function(){var o=t._dbInfo;o.db.transaction((function(t){be(t,o,"DELETE FROM "+o.storeName+" WHERE key = ?",[e],(function(){n()}),(function(e,n){r(n)}))}))})).catch(r)}));return f(r,n),r}function Te(e){var n=this,t=new u((function(e,t){n.ready().then((function(){var r=n._dbInfo;r.db.transaction((function(n){be(n,r,"DELETE FROM "+r.storeName,[],(function(){e()}),(function(e,n){t(n)}))}))})).catch(t)}));return f(t,e),t}function Se(e){var n=this,t=new u((function(e,t){n.ready().then((function(){var r=n._dbInfo;r.db.transaction((function(n){be(n,r,"SELECT COUNT(key) as c FROM "+r.storeName,[],(function(n,t){var r=t.rows.item(0).c;e(r)}),(function(e,n){t(n)}))}))})).catch(t)}));return f(t,e),t}function xe(e,n){var t=this,r=new u((function(n,r){t.ready().then((function(){var o=t._dbInfo;o.db.transaction((function(t){be(t,o,"SELECT key FROM "+o.storeName+" WHERE id = ? LIMIT 1",[e+1],(function(e,t){var r=t.rows.length?t.rows.item(0).key:null;n(r)}),(function(e,n){r(n)}))}))})).catch(r)}));return f(r,n),r}function Ne(e){var n=this,t=new u((function(e,t){n.ready().then((function(){var r=n._dbInfo;r.db.transaction((function(n){be(n,r,"SELECT key FROM "+r.storeName,[],(function(n,t){for(var r=[],o=0;o '__WebKitDatabaseInfoTable__'",[],(function(t,r){for(var o=[],a=0;a0}function Le(e){var n=this,t={};if(e)for(var r in e)t[r]=e[r];return t.keyPrefix=ke(e,n._defaultConfig),Fe()?(n._dbInfo=t,t.serializer=me,u.resolve()):u.reject()}function He(e){var n=this,t=n.ready().then((function(){for(var e=n._dbInfo.keyPrefix,t=localStorage.length-1;t>=0;t--){var r=localStorage.key(t);0===r.indexOf(e)&&localStorage.removeItem(r)}}));return f(t,e),t}function je(e,n){var t=this;e=d(e);var r=t.ready().then((function(){var n=t._dbInfo,r=localStorage.getItem(n.keyPrefix+e);return r&&(r=n.serializer.deserialize(r)),r}));return f(r,n),r}function Ke(e,n){var t=this,r=t.ready().then((function(){for(var n=t._dbInfo,r=n.keyPrefix,o=r.length,a=localStorage.length,i=1,s=0;s=0;n--){var t=localStorage.key(n);0===t.indexOf(e)&&localStorage.removeItem(t)}})):u.reject("Invalid arguments"),f(r,n),r}var qe={_driver:"localStorageWrapper",_initStorage:Le,_support:Pe(),iterate:Ke,getItem:je,setItem:Ge,removeItem:Ye,clear:He,length:Ve,key:Ue,keys:Be,dropInstance:Je},We=function(e,n){return e===n||"number"==typeof e&&"number"==typeof n&&isNaN(e)&&isNaN(n)},ze=function(e,n){for(var t=e.length,r=0;r{const n=(e,n)=>{let t=globalThis,r=globalThis;var o=t.CryptPad_Cache={},a=e.mkEvent(!0),i=!1,s=!1,c=!1;try{var u=t.indexedDB.open("test_db",1);u.onsuccess=function(){i=(c=!0)&&!s,a.fire()},u.onerror=function(){a.fire()}}catch(e){a.fire()}o.enable=function(){s=!1,i=c&&!s},o.disable=function(){s=!0,i=c&&!s},o.isEnabled=()=>i;var f=n.createInstance({driver:n.INDEXEDDB,name:"cp_cache"});o.getBlobCache=function(n,t){t=e.once(e.mkAsync(t||function(){})),a.reg((function(){i?f.getItem(n,(function(r,o){!r&&o&&o.c?(t(null,o.c),o.t=+new Date,f.setItem(n,o,(function(e){e&&console.error(e)}))):t(e.serializeError(r||"EINVAL"))})):t("NOCACHE")}))},o.setBlobCache=function(n,t,r){r=e.once(e.mkAsync(r||function(){})),a.reg((function(){i?t?f.setItem(n,{c:t,t:+new Date},(function(n){r(e.serializeError(n))})):r("EINVAL"):r("NOCACHE")}))},o.getChannelCache=function(n,t){t=e.once(e.mkAsync(t||function(){})),a.reg((function(){i?f.getItem(n,(function(r,o){!r&&o&&Array.isArray(o.c)?(t(null,o),o.t=+new Date,f.setItem(n,o,(function(e){e&&console.error(e)}))):t(e.serializeError(r||"EINVAL"))})):t("NOCACHE")}))};var l={};return o.storeCache=function(n,t,r,o){o=e.once(e.mkAsync(o||function(){})),a.reg((function(){l[n]=l[n]||e.throttle((function(t,r,o){var a,s;i?Array.isArray(r)&&t?(a=r,Array.isArray(a)&&(a.length>100&&a.splice(0,a.length-100),a.some((function(e,n){if(e.isCheckpoint)return s=n,!0})),a.splice(0,s)),f.setItem(n,{k:t,c:r,t:+new Date},(function(n){n&&o(e.serializeError(n))}))):o("EINVAL"):o("NOCACHE")}),50),l[n](t,r,o)}))},o.leaveChannel=function(e){delete l[e]},o.clearChannel=function(n,t){t=e.once(e.mkAsync(t||function(){})),a.reg((function(){i?f.removeItem(n,(function(){t()})):t("NOCACHE")}))},o.clear=function(n){n=e.once(e.mkAsync(n||function(){})),a.reg((function(){i?f.clear(n):n("NOCACHE")}))},o.getKeys=function(n){n=e.once(e.mkAsync(n||function(){})),a.reg((function(){i?f.keys().then((function(e){n(null,e)})).catch((function(e){n(e)})):n("NOCACHE")}))},o.getTime=function(n,t){t=e.once(e.mkAsync(t||function(){})),a.reg((function(){i?f.getItem(n,(function(n,r){!n&&r&&r.c?t(null,r.t):t(e.serializeError(n||"EINVAL"))})):t("NOCACHE")}))},r.CryptPad_clearIndexedDB=o.clear,o};e.exports&&(e.exports=n(q(),ae()))})()}(re)),re.exports}var se=ie(),ce=n({__proto__:null,default:r(se)},[se]);const ue=te.mkEvent(!0),fe=te.mkEvent(!0),le=te.mkEvent(),de=te.mkEvent();let he={};const pe={setCustomize:e=>{he=e.ApiConfig},init:e=>{var n,t;const{broadcast:r,userHash:o,anonHash:a}=e,i=o||a||ne.createRandomHash("drive"),s=e.store,c=ne.getSecrets("drive",i),u={data:{},websocketURL:L.getWebsocketURL(),network:null===(n=e.store)||void 0===n?void 0:n.network,channel:c.channel,readOnly:!1,validateKey:(null===(t=c.keys)||void 0===t?void 0:t.validateKey)||void 0,crypto:P.createEncryptor(c.keys),Cache:ce,userName:"fs",logLevel:1,ChainPad:S,updateProgress:function(e){e.type="drive",r([],"LOADING_DRIVE",e)},classic:!0},f=globalThis.CP_account_rt=E.create(u);s.driveSecret=c,s.proxy=f.proxy,s.onRpcReadyEvt=te.mkEvent(!0),s.loggedIn=void 0!==e.userHash;const l={loggedIn:s.loggedIn};return f.proxy.on("create",(function(e){s.realtime=e.realtime,s.network=e.network,s.loggedIn||(l.anonHash=ne.getEditHashFromKeys(c))})).on("cacheready",(function(n){if(s.realtime=n.realtime,s.offline=!0,s.networkPromise=n.networkPromise,s.cacheReturned=l,s.networkPromise&&s.networkPromise.then){const e=setTimeout((function(){s.networkTimeout=!0,r([],"LOADING_DRIVE",{type:"offline"})}),5e3);s.networkPromise.then((function(n){s.network||(s.network=n),clearTimeout(e)}),(function(n){console.error(n),clearTimeout(e)}))}e.cache&&(l.edPublic=f.proxy.edPublic,ue.fire(l))})).on("ready",(function(n){delete s.networkTimeout,s.ready||(s.driveMetadata=n.metadata,f.proxy.drive||(f.proxy.drive={}),!f.proxy[B.displayNameKey]&&s.noDriveName&&(f.proxy[B.displayNameKey]=s.noDriveName),!f.proxy.uid&&s.noDriveUid&&(f.proxy.uid=s.noDriveUid),!f.proxy.form_seed&&e.form_seed&&(f.proxy.form_seed=e.form_seed),f.proxy.edPublic&&Array.isArray(he.adminKeys)&&-1!==he.adminKeys.indexOf(f.proxy.edPublic)&&(s.isAdmin=!0),l.edPublic=f.proxy.edPublic,fe.fire(l))})).on("error",(function(e){"EDELETED"===e.error&&(s.ownDeletion||(s.isDeleted=!0,r([],"DRIVE_DELETED",e.message)))})).on("disconnect",(function(){s.offline=!0,le.fire(),r([],"UPDATE_METADATA")})).on("reconnect",(function(){s.offline=!1,de.fire(),r([],"UPDATE_METADATA")})),{channel:c.channel,onAccountCacheReady:ue.reg,onAccountReady:fe.reg,onDisconnect:le.reg,onReconnect:de.reg}}};var ve,ye=Object.freeze({__proto__:null,Account:pe}),me={exports:{}};function ge(){return ve||(ve=1,function(e){(()=>{const n=(e={},n={})=>{var t={setCustomize:t=>{n=t.Messages,e=t.AppConfig},init:function(e){t.state=e}};return t.send=function(n,r,o){("function"!=typeof o&&(o=function(){}),e.disableFeedback)?o():n&&(!0===r||t.state)?function(e,n){var t=new XMLHttpRequest;t.open("HEAD",e),t.onreadystatechange=function(){this.readyState===this.DONE&&n&&n()},t.send()}("/common/feedback.html?"+n+"="+Math.random().toString(16).replace(/0./,""),o):o()},t.reportAppUsage=function(){var e=window.location.pathname.split("/").filter((function(e){return e})).join(".");/^#\/1\/view\//.test(window.location.hash)?t.send(e+"_VIEW"):t.send(e)},t.reportScreenDimensions=function(){var e=window.innerHeight,n=window.innerWidth;t.send("DIMENSIONS:"+e+"x"+n)},t.reportLanguage=function(){n&&t.send("LANG_"+n._languageUsed)},t};e.exports&&(e.exports=n(void 0,void 0))})()}(me)),me.exports}var Ee,be,Oe=ge(),Ae=n({__proto__:null,default:r(Oe)},[Oe]),we={exports:{}},De={exports:{}};function _e(){return be||(be=1,function(e){e.exports&&(e.exports=function(e={},n){var t={setCustomize:n=>{e=n.AppConfig}};t.MINIMUM_PASSWORD_LENGTH="number"==typeof e.minimumPasswordLength?e.minimumPasswordLength:8,t.MINIMUM_NAME_LENGTH=1,t.MAXIMUM_NAME_LENGTH=64,t.isEmail=function(e){return/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(String(e).toLowerCase())},t.isLongEnoughPassword=function(e){return e.length>=t.MINIMUM_PASSWORD_LENGTH};var r=t.isString=function(e){return"string"==typeof e};return t.isValidUsername=function(e){return!!(r(e)&&e.length>=t.MINIMUM_NAME_LENGTH)},t.isValidPassword=function(e){return!(!e||!r(e))},t.passwordsMatch=function(e,n){return r(e)&&r(n)&&e===n},t.customSalt=function(){return"string"==typeof e.loginSalt?e.loginSalt:""},t.deriveFromPassphrase=function(e,r,o,a){n(r,e+t.customSalt(),8,1024,o||128,200,a,void 0)},t.dispenser=function(e){var n={used:0};return function(t){if(n.used+t>e.length)throw new Error("exceeded available entropy");if("number"!=typeof t)throw new Error("expected a number");if(t<=0)throw new Error("expected to consume a positive number of bytes");var r;return r=e.slice?e.slice(n.used,n.used+t):e.subarray(n.used,n.used+t),n.used+=t,r}},t}(void 0,(Ee||(Ee=1,function(e){e.exports=function(e,n,t,r,o,a,i,s){function c(e){var n=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],t=1779033703,r=3144134277,o=1013904242,a=2773480762,i=1359893119,s=2600822924,c=528734635,u=1541459225,f=new Array(64);function l(e){for(var l=0,d=e.length;d>=64;){var h,p,v,y,m,g=t,E=r,b=o,O=a,A=i,w=s,D=c,_=u;for(p=0;p<16;p++)v=l+4*p,f[p]=(255&e[v])<<24|(255&e[v+1])<<16|(255&e[v+2])<<8|255&e[v+3];for(p=16;p<64;p++)y=((h=f[p-2])>>>17|h<<15)^(h>>>19|h<<13)^h>>>10,m=((h=f[p-15])>>>7|h<<25)^(h>>>18|h<<14)^h>>>3,f[p]=(y+f[p-7]|0)+(m+f[p-16]|0)|0;for(p=0;p<64;p++)y=(((A>>>6|A<<26)^(A>>>11|A<<21)^(A>>>25|A<<7))+(A&w^~A&D)|0)+(_+(n[p]+f[p]|0)|0)|0,m=((g>>>2|g<<30)^(g>>>13|g<<19)^(g>>>22|g<<10))+(g&E^g&b^E&b)|0,_=D,D=w,w=A,A=O+y|0,O=b,b=E,E=g,g=y+m|0;t=t+g|0,r=r+E|0,o=o+b|0,a=a+O|0,i=i+A|0,s=s+w|0,c=c+D|0,u=u+_|0,l+=64,d-=64}}l(e);var d,h=e.length%64,p=e.length/536870912|0,v=e.length<<3,y=h<56?56:120,m=e.slice(e.length-h,e.length);for(m.push(128),d=h+1;d>>24&255),m.push(p>>>16&255),m.push(p>>>8&255),m.push(p>>>0&255),m.push(v>>>24&255),m.push(v>>>16&255),m.push(v>>>8&255),m.push(v>>>0&255),l(m),[t>>>24&255,t>>>16&255,t>>>8&255,t>>>0&255,r>>>24&255,r>>>16&255,r>>>8&255,r>>>0&255,o>>>24&255,o>>>16&255,o>>>8&255,o>>>0&255,a>>>24&255,a>>>16&255,a>>>8&255,a>>>0&255,i>>>24&255,i>>>16&255,i>>>8&255,i>>>0&255,s>>>24&255,s>>>16&255,s>>>8&255,s>>>0&255,c>>>24&255,c>>>16&255,c>>>8&255,c>>>0&255,u>>>24&255,u>>>16&255,u>>>8&255,u>>>0&255]}function u(e,n,t){e=e.length<=64?e:c(e);var r,o=64+n.length+4,a=new Array(o),i=new Array(64),s=[];for(r=0;r<64;r++)a[r]=54;for(r=0;r=o-4;e--){if(a[e]++,a[e]<=255)return;a[e]=0}}for(;t>=32;)u(),s=s.concat(c(i.concat(c(a)))),t-=32;return t>0&&(u(),s=s.concat(c(i.concat(c(a))).slice(0,t))),s}function f(e,n,t,r){var o,a,i=e[0]^n[t++],s=e[1]^n[t++],c=e[2]^n[t++],u=e[3]^n[t++],f=e[4]^n[t++],l=e[5]^n[t++],d=e[6]^n[t++],h=e[7]^n[t++],p=e[8]^n[t++],v=e[9]^n[t++],y=e[10]^n[t++],m=e[11]^n[t++],g=e[12]^n[t++],E=e[13]^n[t++],b=e[14]^n[t++],O=e[15]^n[t++],A=i,w=s,D=c,_=u,T=f,S=l,x=d,N=h,I=p,C=v,R=y,P=m,k=g,M=E,F=b,L=O;for(a=0;a<8;a+=2)A^=(o=(k^=(o=(I^=(o=(T^=(o=A+k)<<7|o>>>25)+A)<<9|o>>>23)+T)<<13|o>>>19)+I)<<18|o>>>14,S^=(o=(w^=(o=(M^=(o=(C^=(o=S+w)<<7|o>>>25)+S)<<9|o>>>23)+C)<<13|o>>>19)+M)<<18|o>>>14,R^=(o=(x^=(o=(D^=(o=(F^=(o=R+x)<<7|o>>>25)+R)<<9|o>>>23)+F)<<13|o>>>19)+D)<<18|o>>>14,L^=(o=(P^=(o=(N^=(o=(_^=(o=L+P)<<7|o>>>25)+L)<<9|o>>>23)+_)<<13|o>>>19)+N)<<18|o>>>14,A^=(o=(_^=(o=(D^=(o=(w^=(o=A+_)<<7|o>>>25)+A)<<9|o>>>23)+w)<<13|o>>>19)+D)<<18|o>>>14,S^=(o=(T^=(o=(N^=(o=(x^=(o=S+T)<<7|o>>>25)+S)<<9|o>>>23)+x)<<13|o>>>19)+N)<<18|o>>>14,R^=(o=(C^=(o=(I^=(o=(P^=(o=R+C)<<7|o>>>25)+R)<<9|o>>>23)+P)<<13|o>>>19)+I)<<18|o>>>14,L^=(o=(F^=(o=(M^=(o=(k^=(o=L+F)<<7|o>>>25)+L)<<9|o>>>23)+k)<<13|o>>>19)+M)<<18|o>>>14;n[r++]=e[0]=A+i|0,n[r++]=e[1]=w+s|0,n[r++]=e[2]=D+c|0,n[r++]=e[3]=_+u|0,n[r++]=e[4]=T+f|0,n[r++]=e[5]=S+l|0,n[r++]=e[6]=x+d|0,n[r++]=e[7]=N+h|0,n[r++]=e[8]=I+p|0,n[r++]=e[9]=C+v|0,n[r++]=e[10]=R+y|0,n[r++]=e[11]=P+m|0,n[r++]=e[12]=k+g|0,n[r++]=e[13]=M+E|0,n[r++]=e[14]=F+b|0,n[r++]=e[15]=L+O|0}function l(e,n,t,r,o){for(;o--;)e[n++]=t[r++]}function d(e,n,t,r,o){for(;o--;)e[n++]^=t[r++]}function h(e,n,t,r,o){l(e,0,n,t+16*(2*o-1),16);for(var a=0;a<2*o;a+=2)f(e,n,t+16*a,r+8*a),f(e,n,t+16*a+16,r+8*a+16*o)}function p(e,n,t){return e[n+16*(2*t-1)]}function v(e){for(var n=[],t=0;t127&&r<2048?(n.push(r>>6|192),n.push(63&r|128)):(n.push(r>>12|224),n.push(r>>6&63|128),n.push(63&r|128))}return n}if(t<1||t>31)throw new Error("scrypt: logN not be between 1 and 31");var y,m,g,E,b=1<>>0;if(1*r>=1<<30||r>16777216||r>8388608||b>16777216/r)throw new Error("scrypt: parameters are too large");"string"==typeof e&&(e=v(e)),"string"==typeof n&&(n=v(n)),"undefined"!=typeof Int32Array?(y=new Int32Array(64*r),m=new Int32Array(32*b*r),E=new Int32Array(16)):(y=[],m=[],E=new Array(16)),g=u(e,n,128*r);var O=32*r;function A(){for(var e=0;e<32*r;e++){var n=4*e;y[0+e]=(255&g[n+3])<<24|(255&g[n+2])<<16|(255&g[n+1])<<8|255&g[n+0]}}function w(e,n){for(var t=e;t>>0&255,g[4*e+1]=n>>>8&255,g[4*e+2]=n>>>16&255,g[4*e+3]=n>>>24&255}}var T="undefined"!=typeof setImmediate?setImmediate:setTimeout;function S(e,n,t,r,o){!function a(){T((function(){r(e,e+t>>18&63]),o.push(t[n>>>12&63]),o.push(t[n>>>6&63]),o.push(t[n>>>0&63]);return r%3>0&&(o[o.length-1]="=",r%3==1&&(o[o.length-2]="=")),o.join("")}(t):"hex"===n?function(e){for(var n="0123456789abcdef".split(""),t=e.length,r=[],o=0;o>>4&15]),r.push(n[e[o]>>>0&15]);return r.join("")}(t):t}"function"==typeof a&&(s=i,i=a,a=1e3),a<=0?(A(),w(0,b),D(0,b),_(),i(x(s))):(A(),S(0,b,2*a,w,(function(){S(0,b,2*a,D,(function(){_(),i(x(s))}))})))}}(De)),De.exports)))}(we)),we.exports}var Te,Se,xe,Ne=_e(),Ie=n({__proto__:null,default:r(Ne)},[Ne]),Ce={exports:{}},Re={exports:{}},Pe={exports:{}},ke={exports:{}};function Me(){return Te||(Te=1,function(e){e.exports&&(e.exports={whenRealtimeSyncs:function(e,n){"function"==typeof e.getAuthDoc?setTimeout((function(){e.getAuthDoc()!==e.getUserDoc()?e.onSettle(n):n()}),0):console.error("improper use of this function")}})}(ke)),ke.exports}function Fe(){return Se||(Se=1,function(e){(()=>{const n=(e,n,t)=>{let r=globalThis;var o={setCustomize:()=>{}},a=function(e){try{return JSON.parse(JSON.stringify(e))}catch(e){return}};return o.init=function(o,i,s){var c=o.loggedIn,u=o.sharedFolder,f=o.readOnly,l=o.Messages||{},d=i.ROOT,h=i.FILES_DATA,p=i.STATIC_DATA,v=i.OLD_FILES_DATA,y=i.UNSORTED,m=i.TRASH,g=i.TEMPLATE,E=i.SHARED_FOLDERS,b=i.SHARED_FOLDERS_TEMP,O=i.debug;i._setReadOnly=function(e){(f=e)||i.fixFiles()},i.setHref=function(e,n,t){(n||e)&&(f||(n?[n]:i.findChannels([e])).forEach((function(e){var n=i.getFileData(e,!0);i.getHref(n)!==t&&(n.href=i.cryptor.encrypt(t))})))},i.setPadAttribute=function(e,n,t,r){if(r=r||function(){},f)r("EFORBIDDEN");else{var o=i.getIdFromHref(e);if(o)if(n&&n.trim()){var s=i.getFileData(o,!0);"href"===n?i.setHref(null,o,t):s[n]=a(t),r(null)}else r("E_INVAL_ATTR");else r("E_INVAL_HREF")}},i.getPadAttribute=function(e,n,t){t=t||function(){};var r=i.getIdFromHref(e);if(r){var o=i.getFileData(r);t(null,a(o[n]))}else t(null,void 0)},i.pushData=function(n,t){if("function"!=typeof t&&(t=function(){}),f)t("EFORBIDDEN");else{var r=e.createRandomInteger(),o=a(n);o.href&&-1!==o.href.indexOf("#")&&(o.href=i.cryptor.encrypt(o.href)),s[h][r]=o,t(null,r)}},i.pushLink=function(n,t){if("function"!=typeof t&&(t=function(){}),f)t("EFORBIDDEN");else{var r=e.createRandomInteger(),o=a(n);s[p][r]=o,t(null,r)}},i.pushSharedFolder=function(n,t){if("function"!=typeof t&&(t=function(){}),f)t("EFORBIDDEN");else{var r,u=a(n);if(Object.keys(s[E]).some((function(e){if(s[E][e].channel===u.channel)return u.href&&!s[E][e].href&&(s[E][e].href=u.href),r=e,!0})))t("EEXISTS",r);else if(c&&!o.testMode){var l=e.createRandomInteger();u.href&&-1!==u.href.indexOf("#")&&(u.href=i.cryptor.encrypt(u.href)),s[E][l]=u,t(null,l)}else t("EAUTH")}},i.deprecateSharedFolder=function(e,n){if(!f){var t=s[E][e];if(t){if(!(!t.href||-1===i.cryptor.decrypt(t.href).indexOf("#")))(s[b][e]=JSON.parse(JSON.stringify(t))).legacy="PASSWORD_CHANGE"!==n;var r=i.findFile(Number(e));i.delete(r,null,!0),delete s[E][e]}}};var A=function(e){f||delete s[h][e]};i.checkDeletedFiles=function(e){if(c||o.testMode)if(f)e("EFORBIDDEN");else{var t=i.getFiles([d,"hrefArray",m]),r=[];i.getFiles([h,E,p]).forEach((function(e){if(-1===t.indexOf(e)){var a=i.isSharedFolder(e)?s[E][e]:i.getFileData(e),c=a.channel;a.lastVersion&&r.push(n.hrefToHexChannelId(a.lastVersion)),a.rtChannel&&r.push(a.rtChannel),c&&r.push(c),i.isSharedFolder(e)?(delete s[E][e],o.removeProxy&&o.removeProxy(e)):s[p][e]?delete s[p][e]:A(e)}})),r.length?e(null,r):e()}else e()};i.deleteMultiplePermanently=function(e,n,t){if(f)t("EFORBIDDEN");else{var r=e.filter((function(e){return i.isPathIn(e,[h])}));if(!c&&!o.testMode)return r.forEach((function(e){var n=e[1];n&&A(n)})),void t();var a=e.filter((function(e){return i.isPathIn(e,["hrefArray"])})),u=e.filter((function(e){return i.isPathIn(e,[d])})),l=e.filter((function(e){return i.isPathIn(e,[m])})),p=[];a.forEach((function(e){var n=i.find(e);p.push({root:e[0],id:n})})),function(e){f||e.forEach((function(e){var n=s[e.root].indexOf(e.id);s[e.root].splice(n,1)}))}(p),u.forEach((function(e){var n=e.slice(),t=n.pop();delete i.find(n)[t]}));var v,y=[];l.forEach((function(e){var n=e.slice(),t=n.pop(),r=i.find(n);4!==e.length?delete r[t]:y.push({name:e[1],el:r})})),v=y,f||v.forEach((function(e){var n=s[m][e.name].indexOf(e.el);s[m][e.name].splice(n,1)})),n?t():i.checkDeletedFiles(t)}},i.copyFromOtherDrive=function(e,t,r,o){if(!f){var a=[];if(Object.keys(r).forEach((function(e){e=Number(e);var n=r[e];if(n.static)return delete n.static,void(s[p][e]=n);n.href&&(n.href=i.cryptor.encrypt(n.href));var t=!1;for(var o in s[h])if(s[h][o].channel===n.channel){s[h][o].href||(s[h][o].href=n.href),t=!0;break}t?a.push(e):s[h][e]=n})),i.isFile(t)&&-1!==a.indexOf(t))i.log(l.sharedFolders_duplicate);else{if(i.isFolder(t)){var c=function(e){for(var n in e)i.isFile(e[n])?-1!==a.indexOf(e[n])&&(i.log(l.sharedFolders_duplicate),delete e[n]):i.isFolder(e[n])&&c(e[n])};c(t)}var u=i.find(e),d=i.isFile(t)?n.createChannelId():o,v=i.getAvailableName(u,d);Array.isArray(u)?u.push(t):u[v]=t}}};i.copyElement=function(e,t){if(!f&&!i.comparePath(e,t)){var r=i.find(e),o=i.find(t);if(i.isPathIn(t,[m])){if(!e||e.length<2||e[0]===m)return void O("Can't move an element from the trash to the trash: ",e);var a=e[e.length-1],c=i.isPathIn(e,["hrefArray"])?i.getTitle(r):a,u=e.slice();return u.pop(),function(e,n,t){if(!f){var r=s[m];void 0===r[e]&&(r[e]=[]);var o={element:n,path:t};r[e].push(o)}}(c,r,u),!0}if(i.isPathIn(t,["hrefArray"])){if(i.isFolder(r))return void i.log(l.fo_moveUnsortedError);if(e[0]===t[0])return;var d=t[0];return-1===s[d].indexOf(r)&&s[d].push(r),!0}var h=i.isFile(r)?i.getAvailableName(o,n.createChannelId()):i.isInTrashRoot(e)?e[1]:e.pop();if(void 0===o[h])return o[h]=r,!0;i.log(l.fo_unavailableName)}},i.forget=function(e){if(!f){var n=i.getIdFromHref(e);if(n){if(!c&&!o.testMode)return A(n),!0;var t=i.findFile(n);return i.move(t,[m]),!0}}},i.restoreHref=function(e){if(!f){var n=i.getIdFromHref(e);if(n&&i.isFile(n)){var t=i.findFile(n),r=!0;t.forEach((function(e){e[0]!==m?r=!1:i.delete(e,null,!0)})),r&&i.add(n)}}},i.add=function(e,t){if(!f&&(c||o.testMode)){e=Number(e);var r=s[h][e]||s[p][e]||s[E][e];if(r&&"object"==typeof r){var a,u=t;if(t&&!Array.isArray(t)&&(u=decodeURIComponent(t).split(",")),t&&i.isPathIn(u,["hrefArray"]))(a=i.find(u)).push(e);else if(-1!==i.getFiles([d,m,"hrefArray"]).indexOf(e)||u||(u=[d]),t&&i.isPathIn(u,[d])){if(a=i.find(u)){var l=i.getAvailableName(a,n.createChannelId());return void(a[l]=e)}a=i.find([d]),u.slice(1).forEach((function(e){a=a[e]=a[e]||{}})),a[n.createChannelId()]=e}}}},i.setFolderData=function(e,t,r,o){if(!f){var a=i.find(e);if(i.isFolder(a)&&!i.isSharedFolder(a)){if(!i.hasFolderData(a))a["000"+n.createChannelId().slice(0,-3)]={metadata:!0};i.getFolderData(a)[t]=r,o()}}};var w=function(e){i.rt?(i.rt.sync(),t.whenRealtimeSyncs(i.rt,e)):r.setTimeout(e,1e3)};return i.migrateReadOnly=function(e){if(!f&&o.editKey)if(s.version>=2)e();else{s.migrateRo=1;w((function(){var n=JSON.parse(JSON.stringify(s));i.reencrypt(o.editKey,o.editKey,n),setTimeout((function(){s.version>=2?e():(Object.keys(n).forEach((function(e){s[e]=n[e]})),s.version=2,delete s.migrateRo,w(e))}),1e3)}))}else e({error:"EFORBIDDEN"})},i.migrate=function(t){if(f)t();else{!function(){if(s[y]&&s[v]){O("UNSORTED still exists in the object, removing it...");var e=s[y];0!==e.length?(e.forEach((function(e){"string"==typeof e&&(0===s[v].filter((function(n){return n.href===e})).length&&s[v].push({href:e}))})),delete s[y]):delete s[y]}}(),function(t){if(s[v])try{O("Migrating file system..."),s.migrate=1;w((function(){var r=s[v].slice();s[h]||(s[h]={});var o=s[h];r.forEach((function(t){if(t&&t.href){var r=t.href,a=e.createRandomInteger(),s=i.findFile(r),c=t,u=n.createChannelId();o[a]=c||{href:r},s.forEach((function(e){var n=e.slice(),t=n.pop(),r=i.find(n);if(i.isInTrashRoot(e))return r.element=a,void(o[a].filename=e[1]);i.isPathIn(e,["hrefArray"])?r[t]=a:(r[u]=a,o[a].filename=t,delete r[t])}))}})),delete s[v],delete s.migrate,t()}))}catch(e){console.error(e),t()}else t()}(t)}},i.fixFiles=function(t){if(!f){t&&(O=function(){});var r=+new Date;O("Cleaning file system...");var a=JSON.stringify(s),l=function(t){"object"!=typeof s[d]&&(O("ROOT was not an object"),s[d]={});var r=t||s[d];if(!r)return console.error("Invalid element in root");var o,a=0,c=s[p],u=s[h];for(var f in r)if(null!==(o=r[f]))if(i.isFolderData(o))0!==a&&(O("Multiple metadata files in folder"),delete r[f]),a++;else if(i.isFile(o,!0)||i.isFolder(o))if(i.isFolder(o))l(o);else{if("string"==typeof o){var v=e.createRandomInteger(),y=n.createChannelId();u[v]={href:i.cryptor.encrypt(o),filename:f},r[y]=v,delete r[f]}if("number"==typeof o)u[o]||c[o]||(O("An element in ROOT doesn't have associated data",o,f),delete r[f])}else O("An element in ROOT was not a folder nor a file. ",o),delete r[f];else console.error("element[%s] is null",f),delete r[f]};e.isObject(s[p])||(O("STATIC_DATA was not an object"),s[p]={}),l(),function(){if(!u){"object"!=typeof s[m]&&(O("TRASH was not an object"),s[m]={});var n,t=s[m],r=function(t,r,o){if("object"==typeof t){if(!i.isSharedFolder(t.element))if(i.isFile(t.element,!0)||i.isFolder(t.element))if(Array.isArray(t.path)){if("string"==typeof t.element){var a=e.createRandomInteger();s[h][a]={href:i.cryptor.encrypt(t.element),filename:o},t.element=a}if(i.isFolder(t.element)&&l(t.element),"number"==typeof t.element)s[h][t.element]||s[p][t.element]||(O("An element in TRASH doesn't have associated data",t.element,o),n.push(r))}else n.push(r);else n.push(r)}else n.push(r)};for(var o in t)if(Array.isArray(t[o]))if(0===t[o].length)O("Empty array in TRASH root. ",t[o]),delete t[o];else{n=[];for(var a=0;a=0;c--)t[o].splice(n[c],1)}else O("An element in TRASH root is not an array. ",t[o]),delete t[o]}}(),function(){if(!u){Array.isArray(s[g])||(O("TEMPLATE was not an array"),s[g]=[]);var n=e.deduplicateString(s[g]);n.length!==s[g].length&&(s[g]=n);var t=s[g],r=i.getFiles([d]),o=[];t.forEach((function(n,a){if(i.isFile(n,!0)&&-1===r.indexOf(n)){if("string"==typeof n){var c=e.createRandomInteger();return s[h][c]={href:i.cryptor.encrypt(n)},void(t[a]=c)}if("number"==typeof n)s[h][n]||(O("An element in TEMPLATE doesn't have associated data",n),o.push(n))}else o.push(n)})),o.forEach((function(e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}))}}(),function(){"object"!=typeof s[h]&&(O("FILES_DATA was not an object"),s[h]={});var e=s[h],t=i.getFiles([d,m,"hrefArray"]),r=i.find([d]),a=[];for(var u in e)if(String(u)===String(Number(u))){var l=e[u=Number(u)];if(l&&"object"==typeof l)if(l.href||l.roHref){var v;try{v=l.href&&(-1!==l.href.indexOf("#")?l.href:i.cryptor.decrypt(l.href))}catch(e){}if(!v||-1!==v.indexOf("#")){var y,g=n.parsePadUrl(v||l.roHref);if(g.hash)if(g.type){if(v&&"pad"===g.hashData.type&&g.hashData.version)if("view"===g.hashData.mode)l.roHref=v,delete l.href;else if(l.roHref){var E=n.parsePadUrl(l.roHref);E.hash&&E.type||(y=n.getSecrets(g.type,g.hash,l.password),l.roHref="/"+g.type+"/#"+n.getViewHashFromKeys(y))}else y=n.getSecrets(g.type,g.hash,l.password),l.roHref="/"+g.type+"/#"+n.getViewHashFromKeys(y);if(0===g.hashData.version&&delete l.roHref,v&&"/"!==v.slice(0,1)&&(l.href=i.cryptor.encrypt(n.getRelativeHref(v))),l.ctime||(l.ctime=l.atime),l.title||(l.title=i.getDefaultName(g)),!l.channel)try{y||(y=n.getSecrets(g.type,g.hash,l.password)),l.channel=y.channel,console.log(l),O("Adding missing channel in filesData ",l.channel)}catch(e){console.error(e)}if(n.isValidChannel(l.channel)||console.error("Remove invalid channel",l.channel,l),!c&&!o.testMode||-1!==t.indexOf(u));else O("An element in filesData was not in ROOT, TEMPLATE or TRASH.",u,l),r[n.createChannelId()]=u}else O("Removing an element in filesData with a invalid type.",l),a.push(u);else O("Removing an element in filesData with a invalid href.",l),a.push(u)}}else O("Removing an element in filesData with a missing href.",l),a.push(u);else O("An element in filesData was not an object.",l),a.push(u)}else O("Invalid file ID in filesData.",u),a.push(u);a.forEach((function(e){A(e)}));var b=s[p],w=[];for(var D in b){var _=b[D=Number(D)];_&&"object"==typeof _&&_.href?!c&&!o.testMode||-1!==t.indexOf(D)||w.push(D):w.push(D)}w.forEach((function(e){f||delete s[p][e]}))}(),Object.keys(s).forEach((function(e){"/"===e.slice(0,1)&&delete s[e]})),function(){if(!u){"object"!=typeof s[E]&&(O("SHARED_FOLDER was not an object"),s[E]={});var e,t,r=s[E],o=i.getFiles([d,m]),a=i.find([d]);for(var c in r){var f;t=r[c],c=Number(c);try{f=t.href&&(-1!==t.href.indexOf("#")?t.href:i.cryptor.decrypt(t.href))}catch(e){}if((e=n.parsePadUrl(f||t.roHref))&&e.hash&&"undefined"!==e.hash){if(-1===o.indexOf(c))console.log("missing"+c),a[n.createChannelId()]=c}else delete r[c]}}}(),function(){if(!u){"object"!=typeof s[b]&&(O("SHARED_FOLDER_TEMP was not an object"),s[b]={});var e=s[b],n=s[E];for(var t in e)n[t]&&delete e[t]}}();var v=+new Date-r+"ms";JSON.stringify(s)===a?O("File system was clean.",v):O("Your file system was corrupted. It has been cleaned so that the pads you visit can be stored safely.",v)}},i},o};e.exports&&(e.exports=n(q(),Z(),Me()))})()}(Pe)),Pe.exports}function Le(){return xe||(xe=1,function(e){(()=>{const n=(e,n,t,r,o,a={})=>{let i=globalThis;var s={setCustomize:e=>{a=e.Messages,r.setCustomize(e)}},c=s.ROOT="root",u=s.UNSORTED="unsorted",f=s.TRASH="trash",l=s.TEMPLATE="template",d=s.SHARED_FOLDERS="sharedFolders",h=s.SHARED_FOLDERS_TEMP="sharedFoldersTemp",p=s.FILES_DATA=t.storageKey,v=s.OLD_FILES_DATA=t.oldStorageKey,y=s.STATIC_DATA="static";s.getDefaultName=function(e){var n=e.type;return a.type[n]+" - "+function(){if(i.Intl&&i.Intl.DateTimeFormat)return new i.Intl.DateTimeFormat(void 0,{weekday:"short",year:"numeric",month:"long",day:"numeric"}).format(new Date);return(new Date).toString().split(" ").slice(0,4).join(" ")}()};var m=s.createCryptor=function(e){var n={};if(!e)return n.encrypt=function(e){return e},n.decrypt=function(e){return e},n;try{var t=o.createEncryptor(e);n.encrypt=function(e){try{return"/file/#"===e.slice(0,7)?e:t.encrypt(e)}catch(e){return}},n.decrypt=function(e){try{return t.decrypt(e)}catch(e){return}}}catch(e){console.error(e)}return n};return s.getHref=function(e,n){if(e.href&&-1!==e.href.indexOf("#"))return e.href;if(e.href&&n){var t=n.decrypt(e.href);if(t&&-1!==t.indexOf("#"))return t}return e.roHref},s.reencrypt=function(e,n,t){if(t){var r=m(e),o=m(n);Object.keys(t[p]).forEach((function(e){var n=t[p][e]||{};if(n.href&&n.roHref&&!n.fileType){var a=n.href&&-1===n.href.indexOf("#")?r.decrypt(n.href):n.href;if(!a)return;n.href=o.encrypt(a)}})),Object.keys(t[d]||{}).forEach((function(e){var n=t[d][e]||{};if(n.href){var a=n.href&&-1===n.href.indexOf("#")?r.decrypt(n.href):n.href;if(!a)return;n.href=o.encrypt(a)}})),Object.keys(t[h]||{}).forEach((function(e){var n=t[h][e]||{};if(n.href){var a=n.href&&-1===n.href.indexOf("#")?r.decrypt(n.href):n.href;if(!a)return;n.href=o.encrypt(a)}}))}else console.error("Nothing to reencrypt")},s.init=function(t,o){var i={};i.cryptor=m(o.editKey),i.setReadOnly=function(e,n){o.editKey=n,i.cryptor=m(n),i.cryptor.k=Math.random(),i.readOnly=e,i._setReadOnly&&i._setReadOnly(e)},i.readOnly=o.readOnly,i.reencrypt=s.reencrypt,i.getDefaultName=s.getDefaultName;var g=o.sframeChan,E=a.fm_newFolder||"New folder",b=a.fm_newFile||"New file";i.ROOT=c,i.STATIC_DATA=y,i.UNSORTED=u,i.TRASH=f,i.TEMPLATE=l,i.SHARED_FOLDERS=d,i.SHARED_FOLDERS_TEMP=h,i.FILES_DATA=p,i.OLD_FILES_DATA=v;var O=i.sharedFolder=o.sharedFolder;i.id=o.id;var A=function(){console.debug.apply(console,arguments)},w=i.log=o.log||A,D=o.logError||A,_=i.debug=o.debug||A;i.fixFiles=function(){};var T=i.error=function(){g?g.query("Q_DRIVE_USEROBJECT",{cmd:"fixFiles",data:{}},(function(){})):("function"==typeof i.fixFiles&&i.fixFiles(),console.error.apply(console,arguments),i.fixFiles())};o.outer&&r.init(o,i,t),i.getStructure=function(){var e={};return e[c]={},e[f]={},e[p]={},e[l]=[],e[d]={},e};var S=i.getHref=function(e){return s.getHref(e,i.cryptor)},x=function(e){return null===e?"null":Array.isArray(e)?"array":typeof e};i.isValidDrive=function(e){var n=i.getStructure();return"object"==typeof e&&Object.keys(n).every((function(t){return e[t]&&x(n[t])===x(e[t])}))};var N=function(){return[l]},I=function(e,n){return e===n},C=i.isSharedFolder=function(e){return!O&&Boolean(t[d]&&t[d][e])},R=i.isFile=function(e,n){return!C(e)&&("number"==typeof e||(void 0!==t[v]||n)&&"string"==typeof e)},P=i.isFolderData=function(e){return"object"==typeof e&&!0===e.metadata};i.isReadOnlyFile=function(e){if(!R(e))return!1;var n=i.getFileData(e);return n.roHref?Boolean(n.roHref&&!n.href):void 0},i.isStaticFile=function(e){return Boolean(t[y]&&t[y][e])};var k=i.isFolder=function(e){return!P(e)&&("object"==typeof e&&!e.channel||C(e))};i.isFolderEmpty=function(e){return!!k(e)&&(0===Object.keys(e).length||!(1!==Object.keys(e).length||!P(e[Object.keys(e)[0]])))},i.hasSubfolder=function(e,n){if(!k(e))return!1;var t=0,r=function(e){t+=k(e.element)?1:0};for(var o in e)n?Array.isArray(e[o])&&e[o].forEach(r):t+=k(e[o])?1:0;return t},i.hasFile=function(e,n){if(!k(e))return!1;var t=0,r=function(e){t+=R(e.element)?1:0};for(var o in e)n?Array.isArray(e[o])&&e[o].forEach(r):t+=R(e[o])?1:0;return t},i.hasFolderData=function(e){for(var n in e)if(P(e[n]))return!0};var M=i.hasSubSharedFolder=function(e){for(var n in e){if(C(e[n]))return!0;if(k(e[n])&&M(e[n]))return!0}return!1},F=i.getFileData=function(n,r){if(n){var a,s;try{a=(t[y]||{})[n]}catch(e){console.error(e)}if(a){var c=r?a:e.clone(a);return r||(c.static=!0),c}try{s=t[p][n]||{}}catch(e){console.error(e),s={}}if(!r&&(s=JSON.parse(JSON.stringify(s))).href&&-1===s.href.indexOf("#"))if(o.editKey)try{s.href=i.cryptor.decrypt(s.href)}catch(e){delete s.href}else delete s.href;return s}};i.getFolderData=function(e){for(var n in e)if(P(e[n]))return e[n];return{}};var L=i.getTitle=function(e,n){if(C(e))return"??";var t=F(e);if(t){if(t.static)return t.name;if(e&&(t.href||t.roHref))return"title"===n?t.title:"name"===n?t.filename:t.filename||t.title||b;T("getTitle called with a non-existing file id: ",e,t)}else T("unable to retrieve data about the requested file: ",e,t)},H=i.comparePath=function(e,n){if(!(e&&n&&Array.isArray(e)&&Array.isArray(n)))return!1;if(e.length!==n.length)return!1;for(var t=!0,r=e.length-1;t&&r>=0;)t=e[r]===n[r],r--;return t},j=i.isSubpath=function(e,n){var t=n.slice(),r=e.slice(0,t.length);return H(t,r)},K=i.isPathIn=function(e,n){if(n){var t=n.indexOf("hrefArray");return-1!==t&&(n.splice(t,1),n=n.concat(N())),n.some((function(n){return Array.isArray(e)&&e[0]===n}))}},U=i.isInTrashRoot=function(e){return e[0]===f&&4===e.length},B=function(e,n){if(n){if(0===n.length)return e;var t=n.slice(),r=t.shift();if(void 0!==e[r])return B(e[r],t);_("Unable to find the key '"+r+"' in the root object provided:",e)}else T("Invalid path:\n",n,"\nin root\n",e)},V=i.find=function(e){return B(t,e)},Y=i.getFilesRecursively=function(e,n){for(var t in n=n||[],e)R(e[t])||C(e[t])?-1===n.indexOf(e[t])&&n.push(e[t]):P(e[t])||Y(e[t],n);return n},G={array:function(e){return t[e]||(t[e]=[]),t[e].slice()}};N().forEach((function(e){G[e]=function(){return G.array(e)}})),G.hrefArray=function(){var n=[];return O?n:(N().forEach((function(e){n=n.concat(G[e]())})),e.deduplicateString(n))},G[c]=function(){var e=[];return Y(t[c],e),e},G[f]=function(){var e=t[f],n=[],r=function(e){R(e.element)||C(e.element)?-1===n.indexOf(e.element)&&n.push(e.element):Y(e.element,n)};for(var o in e){if(!Array.isArray(e[o]))return void T("Trash contains a non-array element");e[o].forEach(r)}return n},G[v]=function(){var e=[];return t[v]?(t[v].forEach((function(n){n.href&&-1===e.indexOf(n.href)&&e.push(n.href)})),e):e},G[y]=function(){return t[y]?Object.keys(t[y]).map(Number).filter(Boolean):[]},G[p]=function(){return t[p]?Object.keys(t[p]).map(Number).filter(Boolean):[]},G[d]=function(){return t[d]?Object.keys(t[d]).map(Number).filter(Boolean):[]};var J=i.getFiles=function(n){var t=[];return n&&n.length||(n=[c,"hrefArray",f,v,p,d]),n.forEach((function(e){"function"==typeof G[e]&&(t=t.concat(G[e]()))})),e.deduplicateString(t)},q=i.getIdFromHref=function(e){var r,o=function(e){if(e)return n.parsePadUrl(e).getUrl().replace(/\/p\/?/,"/")},a=o(e);return J([p]).some((function(e){if(o(S(t[p][e]))===a||o(t[p][e].roHref)===a)return r=e,!0})),r};i.getSFIdFromHref=function(e){var r,o=function(e){if(e)return n.parsePadUrl(e).getUrl().replace(/\/p\/?/,"/")},a=o(e);return J([d]).some((function(e){if(o(S(t[d][e]))===a||o(t[d][e].roHref)===a)return r=e,!0})),r};var W=function(e,n){if(!K(e,[c,f]))return[];n=Array.isArray(n)?n:[n];var t={},r=V(e),o=function(e){Object.keys(e).forEach((n=>{t[n]||=[],Array.prototype.push.apply(t[n],e[n])}))};if(R(r)||C(r))return n.some((n=>{I(n,r)&&(t[n]||=[],t[n].push(e))})),t;if(k(r))for(var a in r){let t=e.slice();t.push(a),o(W(t,n))}return t},z=function(e,n){if(O)return{};if(!t[e])return{};var r=t[e].slice(),o={},a=-1;return n.forEach((n=>{for(;-1!==(a=r.indexOf(n,a+1));)o[n]||=[],o[n].push([e,a])})),o},Q=function(e,n){if(O)return[];var t=V(e),r={},o=function(e){Object.keys(e).forEach((n=>{r[n]||=[],Array.prototype.push.apply(r[n],e[n])}))};if(1===e.length&&"object"==typeof t&&Object.keys(t).forEach((function(r){var a=t[r];if(Array.isArray(a)){var i=e.slice();i.push(r),o(Q(i,n))}})),2===e.length){if(!Array.isArray(t))return[];t.forEach((function(t,a){var i=e.slice();i.push(a),i.push("element"),R(t.element)?n.some((e=>{I(e,t.element)&&(r[e]||=[],r[e].push(i))})):o(Q(i,n))}))}return e.length>=4&&o(W(e,n)),r},X=i.findFiles=function(e){var n=W([c],e),t=z(l,e),r=Q([f],e);let o={};return e.forEach((e=>{o[e]=[]})),[n,t,r].forEach((e=>{Object.keys(e).forEach((n=>{o[n]||=[],Array.prototype.push.apply(o[n],e[n])}))})),o},Z=i.findFile=function(e){return X([e])[e]||[]};i.findChannels=function(e,n){var r=t[p],o=t[d],a=[p];return n&&a.push(d),J(a).filter((function(n){var t=r[n]||o[n]||{};return-1!==e.indexOf(t.channel)}))},i.search=function(r){if("string"!=typeof r)return[];r=r.trim();var o,a=[],s=t[p],u=t[d],f=r.toLowerCase();/^#/.test(f)&&(o=[f.slice(1).trim()]);J([p,d]).forEach((function(e){var n=s[e]||u[e];if(n)if(Array.isArray(n.tags)&&(t=n.tags,o&&t.length&&(t=t.map((function(e){return e.toLowerCase()})),o.some((function(e){return t.some((function(n){return n===e}))})))))a.push(e);else{var t,r=n.title||n.lastTitle;(r&&-1!==r.toLowerCase().indexOf(f)||n.filename&&-1!==n.filename.toLowerCase().indexOf(f))&&a.push(e)}}));var l=n.getRelativeHref(r);if(l){var h=q(l);h&&a.push(h)}a=e.deduplicateString(a);var v=[];a.forEach((function(e){v.push({id:e,paths:Z(e),data:i.getFileData(e)})}));var y=[],m=function(e,n){for(var t in e)k(e[t])&&!C(e[t])&&(-1!==t.toLowerCase().indexOf(f)&&y.push({id:null,paths:[n.concat(t)],data:{title:t}}),m(e[t],n.concat(t)))};return m(t[c],[c]),y=y.sort((function(e,n){return e.data.title.toLowerCase()>n.data.title.toLowerCase()})),v=y.concat(v)},i.getRecentPads=function(){var e=t[p];return Object.keys(e).filter((function(n){return e[n]})).sort((function(n,t){return e[t].atime-e[n].atime})).map((function(e){return Number(e)}))},i.getOwnedPads=function(e){var n=t[p];return Object.keys(n).filter((function(t){return n[t].owners&&-1!==n[t].owners.indexOf(e)})).map((function(e){return Number(e)}))};var $=i.getAvailableName=function(e,n){if(void 0===e[n])return n;for(var t=n,r=1;void 0!==e[t];)t=n+"_"+r,r++;return t},ee=i.move=function(e,n,t){if(g)g.query("Q_DRIVE_USEROBJECT",{cmd:"move",data:{paths:e,newPath:n}},t);else{var r=[];e.forEach((function(e){var t=e.slice();t.pop(),H(t,n)||(j(n,e)?w(a.fo_moveFolderToChildError):i.copyElement(e.slice(),n)&&r.push(e))})),i.delete(r,t)}};return i.restore=function(e,n){if(g)g.query("Q_DRIVE_USEROBJECT",{cmd:"restore",data:{path:e}},n);else if(U(e)){var t=e.slice();t.pop();var r=V(t).path;ee([e],r,n)}},i.addFolder=function(e,n,t){if(g)g.query("Q_DRIVE_USEROBJECT",{cmd:"addFolder",data:{path:e,name:n}},t);else{var r=V(e),o=$(r,n||E);r[o]={};var a=e.slice();a.push(o),t({newPath:a})}},i.delete=function(e,n,t){g?g.query("Q_DRIVE_USEROBJECT",{cmd:"delete",data:{paths:e,nocheck:t}},n):(n=n||function(){},i.deleteMultiplePermanently(e,t,n))},i.emptyTrash=function(e){e=e||function(){},g?g.query("Q_DRIVE_USEROBJECT",{cmd:"emptyTrash"},e):(t[f]={},i.checkDeletedFiles(e))},i.ownedInTrash=function(e){return J([f]).map((function(n){var r=C(n)?t[d][n]:i.getFileData(n);if(r)return e(r.owners)?r.channel:void 0})).filter(Boolean)},i.rename=function(e,n,r){if(r=r||function(){},g)g.query("Q_DRIVE_USEROBJECT",{cmd:"rename",data:{path:e,newName:n}},r);else if(e.length<=1)D("Renaming `root` is forbidden");else{var o,i=V(e);if(k(i)&&!C(i)){var s=e.slice(),c=s.pop();if(!n||!n.trim()||c===n)return;var u=V(s);return void 0!==u[n]?void w(a.fo_existingNameError):(u[n]=i,delete u[c],void("function"==typeof r&&r()))}if(o=C(i)?t[d][i]:t[p][i]||t[y][i])return t[y][i]?n&&n.trim()?(o.name=n,void r()):void r():n&&""!==n.trim()?void(L(i,"name")!==n&&(o.filename=n,"function"==typeof r&&r())):(delete o.filename,void("function"==typeof r&&r()))}},i.getTagsList=function(){var e,n={},r=function(e){n[e]=n[e]?++n[e]:1};for(var o in t[p])(e=t[p][o]).tags&&Array.isArray(e.tags)&&e.tags.forEach(r);return n},i},s};e.exports&&(e.exports=n(q(),Z(),K(),Fe(),C(),void 0))})()}(Re)),Re.exports}var He,je,Ke,Ue={exports:{}},Be={exports:{}};function Ve(){return He||(He=1,function(e){e.exports=function(e){var n,t=[],r=[],o=0,a=function(e){return o++,function(){for(e&&e.apply(null,arguments),o=(o||1)-1;!o&&t.length&&!n;)t.shift()(a)}};a.abort=function(){r.forEach(clearTimeout),n=1};var i={nThen:function(e){return n||(o?t.push(e):e(a)),i},orTimeout:function(e,s){if(n)return i;if(!s)throw Error("Must specify milliseconds to orTimeout()");var c,u=setTimeout((function(){for(;t.shift()!==c;);for(e(a),o=(o||1)-1;!o&&t.length;)t.shift()(a)}),s);return t.push(c=function(){var e=r.indexOf(u);if(e>-1)return r.splice(e,1),void clearTimeout(u);throw new Error("timeout not listed in array")}),r.push(u),i}};return i.nThen(e)}}(Be)),Be.exports}function Ye(){return je||(je=1,function(e){e.exports&&(e.exports=((e,n,t,r,o,a,i,s)=>{var c={},u={};return c.checkMigration=function(e,t,r,o){var a=n.once(n.mkAsync(o));if(t)if(e)if(t.version>=2)a();else if(t.migrateRo){var i,s=!1,c=setInterval((function(){if(t.version>=2)return s=!0,clearTimeout(i),clearInterval(c),void a()}),100);i=setTimeout((function(){clearInterval(c),r.migrateReadOnly((function(){s=!0,a()}))}),2e4),t.on("change",["version"],(function(){s||t.version>=2&&(s=!0,clearTimeout(i),clearInterval(c),a())}))}else r.migrateReadOnly(a);else a();else a()},c.migrate=function(e){var t=u[e];if(t){var r=t.teams;if(Array.isArray(r)&&r.length){var o=r[0];if(o.secondaryKey){var a=n.find(o,["store","manager","folders",o.id]);a&&a.proxy&&!a.proxy.version&&a.userObject.migrateReadOnly((function(){r.forEach((function(e){n.find(e,["store","manager","folders",e.id,"userObject"]).setReadOnly(!1,e.secondarykey)}))}))}}}},c.load=function(t,f,l,d){var h=n.once(n.mkAsync(d)),p=t.network,v=t.store,y=t.isNew,m=t.isNewChannel,g=v.id,E=v.handleSharedFolder,b=v.manager.user.userObject.getHref(l),O=e.parsePadUrl(b),A=e.getSecrets("drive",O.hash,l.password);if(!A.keys)return v.manager.deprecateProxy(f),void h(null);var w=A.keys.secondaryKey;o((function(e){t.cache&&r.getChannelCache(A.channel,e((function(n){if("EINVAL"===n)return e.abort(),v.manager.restrictedProxy(f,A.channel),void h(null)})))})).nThen((function(e){m(null,{channel:A.channel},e((function(n){if(n.isNew&&!y)return v.manager.deprecateProxy(f,A.channel,n.reason),e.abort(),void h(null)})))})).nThen((function(){var e=u[A.channel];if(e&&e.readOnly&&w&&c.upgrade(A.channel,A),e&&e.ready&&e.rt)return setTimeout((function(){v.manager.addProxy(f,e.rt,(function(){c.leave(A.channel,g)}),w),h(e.rt)})),e.teams.push({cb:h,store:v,id:f}),void(E&&E(f,e.rt));if(e&&!e.ready&&e.rt)return e.teams.push({cb:h,store:v,secondaryKey:w,id:f}),void(E&&E(f,e.rt));e=u[A.channel]={teams:[{cb:h,store:v,secondaryKey:w,id:f}],readOnly:!Boolean(w)};var n=l.owners,o={data:{},channel:A.channel,readOnly:!Boolean(w),crypto:a.createEncryptor(A.keys),userName:"sharedFolder",logLevel:1,ChainPad:s,classic:!0,network:p,Cache:r,metadata:{validateKey:A.keys.validateKey||void 0,owners:n},onRejected:t.Store&&t.Store.onRejected},d=e.rt=i.create(o);d.proxy.on("cacheready",(function(){e.teams&&(e.teams.forEach((function(n){d.cache=!0,n.store.manager.addProxy(n.id,d,(function(){c.leave(A.channel,n.store.id)}),n.secondaryKey,t.updatePassword),t.updatePassword=!1,n.cb(e.rt)})),e.ready=!0)})),d.proxy.on("ready",(function(){y&&!Object.keys(d.proxy).length&&(d.proxy.version=2),e.teams&&(e.teams.forEach((function(n){d.cache=!1,n.store.manager.addProxy(n.id,d,(function(){c.leave(A.channel,n.store.id)}),n.secondaryKey,t.updatePassword),n.cb(e.rt)})),e.ready=!0)})),d.proxy.on("error",(function(n){if(n&&n.error){if("EDELETED"===n.error){try{e.teams.forEach((function(e){e.store.manager.deprecateProxy(e.id,A.channel,n.message),e.store.handleSharedFolder&&e.store.handleSharedFolder(e.id,null),e.cb()}))}catch(e){}return delete u[A.channel],void h()}if("ERESTRICTED"===n.error)return e.teams.forEach((function(e){e.store.manager.restrictedProxy(e.id,A.channel),e.cb()})),delete u[A.channel],void h()}})),E&&E(f,d)}))},c.upgrade=function(e,n){var t=u[e];if(t&&t.readOnly&&t.rt.setReadOnly&&n.keys&&n.keys.editKeyStr){var r=a.createEncryptor(n.keys);t.readOnly=!1,t.rt.setReadOnly(!1,r)}},c.leave=function(e,n){var t=u[e];if(t){var r,o=t.teams;Array.isArray(o)&&(o.some((function(e,t){if(e.store.id===n)return e.store.handleSharedFolder&&e.store.handleSharedFolder(e.id,null),r=t,!0})),void 0!==r&&(o.splice(r,1),o.length||t.rt&&t.rt.stop&&t.rt.stop()))}},c.updatePassword=function(r,a,i,s){var f=a.oldChannel,l=a.href,d=a.password,h=e.parsePadUrl(l),p=e.getSecrets(h.type,h.hash,d),v=u[f];if(v){if(v.rt&&v.rt.stop)try{v.rt.stop()}catch(e){}var y=o;v.teams.forEach((function(e){y=y((function(o){var a=e.store,s=e.id,u=n.find(a.proxy,["drive",t.SHARED_FOLDERS])||{};if(s&&u[s]){var l=JSON.parse(JSON.stringify(u[s]));l.password=d,c.load({network:i,store:a,updatePassword:!0,Store:r,isNewChannel:r.isNewChannel},s,l,o()),a.rpc&&(a.rpc.unpin([f],o()),a.rpc.pin([p.channel],o()))}})).nThen})),y((function(){s()}))}else s({error:"ENOTFOUND"})},c.loadSharedFolders=function(e,n,r,a,i,s,u,f){var l=a[t.SHARED_FOLDERS]||{},d=Object.keys(l).length,h=1,p=s();u=u||function(){},o((function(t){Object.keys(l).forEach((function(o){var a=l[o];c.load({network:n,store:r,Store:e,cache:f,isNewChannel:e.isNewChannel},o,a,t((function(){u({progress:h,max:d}),h++})))}))})).nThen((function(){setTimeout(p)}))},c.isSharedFolderChannel=function(e){return Object.keys(u).includes(e)},c})(Z(),q(),Le(),ie(),Ve(),C(),g(),w()))}(Ue)),Ue.exports}function Ge(){return Ke||(Ke=1,function(e){(()=>{const n=(e,n,t,r,o={},a,i)=>{var s=function(n,t,r,o,a,i){if(!n.folders[t]||i||n.folders[t].restricted){var s=function(e){var n={};for(var t in e.cfg)n[t]=e.cfg[t];return n}(n);s.sharedFolder=!0,s.id=t,s.editKey=a,s.rt=r.realtime,s.readOnly=Boolean(!a);var c=e.init(r.proxy,s);c.fixFiles&&c.fixFiles();var u=r.proxy;if(u.metadata&&u.metadata.title){var f=n.user.proxy[e.SHARED_FOLDERS][t];f&&(f.lastTitle=u.metadata.title)}return n.folders[t]={proxy:r.proxy,userObject:c,leave:o,restricted:u.restricted,offline:Boolean(r.cache)},u.on&&(u.on("disconnect",(function(){n.folders[t].offline=!0})),u.on("reconnect",(function(){n.folders[t].offline=!1}))),c}n.folders[t].offline&&!r.cache&&n.Store&&(n.folders[t].offline=!1,n.folders[t].userObject.fixFiles&&n.folders[t].userObject.fixFiles(),n.Store.refreshDriveUI())},c=function(e,n){var t=e.folders[n];t&&(t.leave(),delete e.folders[n])},u=function(t,r,o,a){if(!t.folders[r]||!t.folders[r].deleting){if(t.user.userObject.readOnly){return c(t,r),s(t,r,{proxy:{deprecated:!0}},(function(){})),void t.Store.refreshDriveUI()}if(o&&t.unpinPads([o],(function(){})),a&&"PASSWORD_CHANGE"!==a){let o=n.find(t,["user","proxy",e.SHARED_FOLDERS]),a=o[r]&&o[r].lastTitle;return a&&((e,n,t)=>{var r=e.store.mailbox;if(r){var o,a=e.cfg.teamId;o=a?e.store.modules.team.getTeamsData()[a]:e.Store.getMetadata(null,null,(()=>{})).user,r.sendTo("SF_DELETED",{sfId:n,team:a,title:t},{curvePublic:o.curvePublic,channel:o.notifications},(e=>{console.error(e)}))}})(t,r,a),delete o[r],void(t.Store&&t.Store.refreshDriveUI&&t.Store.refreshDriveUI())}t.user.userObject.deprecateSharedFolder(r,a),c(t,r),t.Store&&t.Store.refreshDriveUI&&t.Store.refreshDriveUI()}},f=function(e,n){c(e,n),s(e,n,{proxy:{restricted:!0,root:{},filesData:{}}},(function(){})),e.Store.refreshDriveUI()},l=function(e,n){return Array.isArray(n)&&-1!==n.indexOf(e.edPublic)},d=function(e){var n=[e.user.userObject],t=Object.keys(e.folders).map((function(n){return e.folders[n].userObject}));return Array.prototype.push.apply(n,t),n},h=function(e,n){var t=d(e),r=e.user.userObject;return t.some((function(e){if(Object.keys(e.getFileData(n)).length)return r=e,!0})),r},p=function(e,n){var t=Number(n.id);if(t)return e.user.userObject.findFile(t)[0]},v=function(n,t,r){var o=[];return n.user.userObject.findChannels([t],!0).forEach((function(t){var a=n.user.proxy[e.SHARED_FOLDERS][t];a&&!r&&(a=JSON.parse(JSON.stringify(a))),a||(a=n.user.userObject.getFileData(t,r)),o.push({id:t,data:a,userObject:n.user.userObject})})),Object.keys(n.folders).forEach((function(e){n.folders[e].userObject.findChannels([t]).forEach((function(t){o.push({id:t,fId:e,data:n.folders[e].userObject.getFileData(t,r),userObject:n.folders[e].userObject})}))})),o},y=function(e,n){var t=[],r=e.user.userObject.getIdFromHref(n);return r&&t.push({data:e.user.userObject.getFileData(r),userObject:e.user.userObject}),Object.keys(e.folders).forEach((function(r){var o=e.folders[r].userObject.getIdFromHref(n);o&&t.push({fId:r,data:e.folders[r].userObject.getFileData(o),userObject:e.folders[r].userObject})})),t},m=function(e,n){var t=[],r=d(e);let o={};return r.forEach((function(e){var a=Number(e.id);let i;if(a){i=e.findFile(n);let t=(o[a]||[])[0];if(!t)return;i.forEach((function(e){Array.prototype.unshift.apply(e,t)}))}else{let t=[n],a=r.map((e=>+e.id)).filter(Boolean);Array.prototype.push.apply(t,a),o=e.findFiles(t),i=o[n]}Array.prototype.push.apply(t,i)})),t},g=function(e,n){var t={},r=d(e);let o={};return r.forEach((function(e){var a=Number(e.id);if(!e.id){let e=r.map((e=>+e.id)).filter(Boolean);Array.prototype.push.apply(n,e)}var i=e.findFiles(n);if(e.id||(o=i),a){let e=(o[a]||[])[0];if(!e)return;Object.keys(i).forEach((n=>{i[n].forEach((n=>{Array.prototype.unshift.apply(n,e)}))}))}Object.keys(i).forEach((e=>{t[e]||=[],Array.prototype.push.apply(t[e],i[e])}))})),t},E=function(e,t,r){if(r)return e.user.userObject.findChannels(t);var o=[];return d(e).forEach((function(e){var n=e.findChannels(t);Array.prototype.push.apply(o,n)})),o=n.deduplicateString(o)},b=function(e,n,t){var r=d(e),o={};return r.some((function(e){if((o=e.getFileData(n,t))&&Object.keys(o).length)return!0})),o},O=function(t,r){var o;if(t.isHistoryMode&&!t.folders[r])o=!0;else if(!t.folders[r])return{};var a=o?{}:t.folders[r].proxy;Object.keys(a.metadata||{}).length>1&&(a.metadata={title:a.metadata.title});var i=n.clone(a.metadata||{});for(var s in t.user.proxy[e.SHARED_FOLDERS][r]||{})if(void 0!==t.user.proxy[e.SHARED_FOLDERS][r][s]){var c=n.clone(t.user.proxy[e.SHARED_FOLDERS][r][s]);if("href"===s&&-1===c.indexOf("#"))try{c=t.user.userObject.cryptor.decrypt(c)}catch(e){}"href"===s&&-1===c.indexOf("#")&&(c=void 0),i[s]=c}return i},A=function(e,n){var t,r={id:null,userObject:e.user.userObject,path:n};if(!Array.isArray(n)||n.length<=1)return r;for(var o=e.user.userObject,a=2;a{o=n.Messages,e.setCustomize(n)},create:function(n,t,r){var o={pinPads:t.pin,unpinPads:t.unpin,onSync:t.onSync,Store:t.Store,store:t.store,removeOwnedChannel:t.removeOwnedChannel,loadSharedFolder:t.loadSharedFolder,cfg:r,edPublic:t.edPublic,settings:t.settings,user:{proxy:n},folders:{}};r.removeProxy=function(e){c(o,e)},o.user.userObject=e.init(n,r);var a=function(e){return function(){return[].unshift.call(arguments,o),e.apply(null,arguments)}};return{addProxy:a(s),removeProxy:a(c),deprecateProxy:a(u),restrictedProxy:a(f),addSharedFolder:a(N),addPin:function(e,n){o.pinPads=e,o.unpinPads=n},removePin:function(){delete o.pinPads,delete o.unpinPads},command:a(P),getPadAttribute:a(M),setPadAttribute:a(k),getTagsList:a(F),getSecureFilesList:a(L),getSharedFolderData:a(O),getChannelsList:a(j),addPad:a(K),delete:a(I),deleteOwned:a(C),findChannel:a(v),findHref:a(y),findFile:a(m),getEditHash:a(S),user:o.user,folders:o.folders}},createInner:function(n,t,r,o){var a={cfg:o,sframeChan:t,edPublic:r,user:{proxy:n,userObject:e.init(n,o)},folders:{}},i=function(e){return function(){return[].unshift.call(arguments,a),e.apply(null,arguments)}};return{addProxy:i(s),removeProxy:i(c),setHistoryMode:i(le),rename:i(U),move:i(B),emptyTrash:i(V),addFolder:i(Y),addSharedFolder:i(G),addLink:i(J),restoreSharedFolder:i(q),convertFolderToSharedFolder:i(W),delete:i(z),deleteOwned:i(Q),restore:i(X),setFolderData:i(Z),updateStaticAccess:i($),getFileData:i(ne),find:i(re),getTitle:i(oe),isReadOnlyFile:i(ie),isStaticFile:i(ae),getFiles:i(se),search:i(ce),getRecentPads:i(ue),getOwnedPads:i(fe),getTagsList:i(F),findFile:i(m),findFiles:i(g),findChannels:i(ee),getSharedFolderData:i(O),getFolderData:i(de),isInSharedFolder:i(he),getUserObjectPath:i(te),isDuplicateOwned:i(Se),ownedInTrash:i(Te),isValidDrive:i(pe),isFile:i(ve),isFolder:i(ye),isSharedFolder:i(me),isFolderEmpty:i(ge),isPathIn:i(Ee),isSubpath:i(be),isInTrashRoot:i(Oe),comparePath:i(Ae),hasSubfolder:i(we),hasSubSharedFolder:i(De),hasFile:i(_e),user:a.user,folders:a.folders}}}};e.exports&&(e.exports=n(Le(),q(),Z(),Ye(),void 0,ge(),Ve()))})()}(Ce)),Ce.exports}var Je,qe,We=Ge(),ze=n({__proto__:null,default:r(We)},[We]),Qe=Le(),Xe=n({__proto__:null,default:r(Qe)},[Qe]),Ze={exports:{}},$e={exports:{}};function en(){return qe||(qe=1,function(e){e.exports&&(e.exports=((e={},n={},t)=>{let r=[];const o=["sheet","doc","presentation"],a=a=>{e=a.AppConfig;const i=(n=a.ApiConfig).onlyOffice&&n.onlyOffice.availableVersions.includes(t.currentVersion);r=e.availablePadTypes.filter((e=>i||!o.includes(e)))};Object.keys(e).length&&a({AppConfig:e,ApiConfig:n});const i={setCustomize:a};return i.__defineGetter__("availableTypes",(function(){return n.appsToDisable?r.filter((e=>!n.appsToDisable.includes(e))):r})),i.__defineGetter__("appsToSelect",(function(){return r.filter((e=>!["drive","teams","file","contacts","convert"].includes(e)))})),i.isAvailable=e=>Array.isArray(i.availableTypes)&&i.availableTypes.includes(e),i})(void 0,void 0,(Je||(Je=1,function(e){e.exports&&(e.exports={currentVersion:"v7"})}($e)),$e.exports)))}(Ze)),Ze.exports}var nn,tn,rn=en(),on=n({__proto__:null,default:r(rn)},[rn]),an={exports:{}},sn={exports:{}};function cn(){return nn||(nn=1,function(e){(()=>{const n=(e,n,t={},r)=>{const o=function(){if(Object.keys(t).length){var e,n=new URL(t.httpUnsafeOrigin);try{return(e=new URL(t.websocketPath,t.httpUnsafeOrigin)).protocol=n.protocol,e.origin}catch(e){return console.error(e),t.httpUnsafeOrigin}}};var a=o();var i=e=>JSON.parse(JSON.stringify(e)),s=function(e,t,r){var o=n.once(n.mkAsync(r));fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then((e=>{e.ok?e.text().then((e=>{o(void 0,n.tryParse(e))})):e.json().then().then((n=>{o(e.status,n)}))})).catch((e=>{o(e)}))},c=function(n,t,o){var c=i(t);c.publicKey=r.util.encodeBase64(n.publicKey),c.nonce=r.util.encodeBase64(r.randomBytes(24));var u,f,l=new URL("/api/auth/",a);e((function(e){s(l,c,e(((n,t)=>n?(e.abort(),console.error(n),t&&console.error(t),void o(n)):t.date&&t.txid?(u=t.txid,void(f=t.date)):(e.abort(),void o("REQUEST_REJECTED")))))})).nThen((function(e){var t=i(c);t.txid=u,t.date=f;var a=r.util.decodeUTF8(JSON.stringify(t)),d=r.sign.detached(a,n.secretKey),h=r.util.encodeBase64(d);s(l,{sig:h,txid:u},e(((n,t)=>{if(n)return e.abort(),console.error(n),t&&console.error(t),void o("RESPONSE_REJECTED",t);o(void 0,t)})))}))};return c.setCustomize=e=>{t=e.ApiConfig,a=o()},c};e.exports&&(e.exports=n(Ve(),q(),void 0,I()))})()}(sn)),sn.exports}function un(){return tn||(tn=1,function(e){e.exports&&(e.exports=((e,n={},t,r)=>{var o={setCustomize:e=>{n=e.ApiConfig,t.setCustomize(e)}};o.join=e.uint8ArrayJoin,o.seed=function(){return r.hash(r.util.decodeUTF8("pewpewpew"))},o.genkeys=function(e){if(!(e instanceof Uint8Array))throw new Error("INVALID_SEED_FORMAT");if(!e||"number"!=typeof e.length||e.length<64)throw new Error("INVALID_SEED_LENGTH");var n=e.subarray(0,r.sign.seedLength),t=e.subarray(r.sign.seedLength,r.sign.seedLength+r.secretbox.keyLength);return{sign:r.sign.keyPair.fromSeed(n),symmetric:t}},o.keysToRPCFormat=function(e){try{var n=e.sign;return{edPrivate:r.util.encodeBase64(n.secretKey),edPublic:r.util.encodeBase64(n.publicKey)}}catch(e){return void console.error(e)}},o.encrypt=function(e,n,t){var a=r.util.decodeUTF8(n),i=r.randomBytes(r.secretbox.nonceLength);return o.join([[0],i,r.secretbox(a,i,t.symmetric)])},o.decrypt=function(e,n){var t=e.subarray(1,1+r.secretbox.nonceLength),o=e.subarray(1+r.secretbox.nonceLength),a=r.secretbox.open(o,t,n.symmetric);try{return JSON.parse(r.util.encodeUTF8(a))}catch(e){return void console.error(e)}},o.sign=function(e,n){return r.sign.detached(r.hash(e),n.sign.secretKey)},o.serialize=function(e,n){var t=o.encrypt(0,e,n),a=o.sign(t,n);return{publicKey:r.util.encodeBase64(n.sign.publicKey),signature:r.util.encodeBase64(a),ciphertext:r.util.encodeBase64(t)}},o.proveAncestor=function(n){var t=e.find(n,["sign","publicKey"]),o=e.find(n,["sign","secretKey"]);try{var a=r.sign.detached(t,o);return JSON.stringify([t,a].map(r.util.encodeBase64))}catch(e){return void console.error(e)}};var a=function(e){return r.util.encodeBase64(e).replace(/\//g,"-")};o.getBlockUrl=function(e){var t=a(e.sign.publicKey);return(n.fileHost||n.httpUnsafeOrigin||window.location.origin)+"/block/"+t.slice(0,2)+"/"+t},o.getBlockHash=function(e){return o.getBlockUrl(e)+"#"+a(e.symmetric)};var i=function(e){try{return r.util.decodeBase64(e.replace(/\-/g,"/"))}catch(e){return void console.error(e)}};return o.parseBlockHash=function(e){if("string"==typeof e){var n=e.split("#");if(2===n.length)try{return{href:n[0],keys:{symmetric:i(n[1])}}}catch(e){return void console.error(e)}}},o.checkRights=function(n,r){const o=e.mkAsync(r),{blockKeys:a,auth:i}=n;var s="MFA_CHECK";i&&i.type&&(s=`${i.type.toUpperCase()}_`+s),t(a.sign,{command:s,auth:i&&i.data},o)},o.writeLoginBlock=function(e,n){const{content:r,blockKeys:a,oldBlockKeys:i,auth:s,pw:c,session:u,token:f,userData:l}=e;var d="WRITE_BLOCK";s&&s.type&&(d=`${s.type.toUpperCase()}_`+d);var h=o.serialize(JSON.stringify(r),a);h.auth=s&&s.data,h.hasPassword=c,h.registrationProof=i&&o.proveAncestor(i),f&&(h.inviteToken=f),l&&(h.userData=l),t(a.sign,{command:d,content:h,session:u},n)},o.removeLoginBlock=function(e,n){const{reason:r,blockKeys:o,auth:a,edPublic:i}=e;var s="REMOVE_BLOCK";a&&a.type&&(s=`${a.type.toUpperCase()}_`+s),t(o.sign,{command:s,auth:a&&a.data,edPublic:i,reason:r},n)},o.updateSSOBlock=function(e,n){const{blockKeys:r,oldBlockKeys:a}=e;var i=a&&o.proveAncestor(a);t(r.sign,{command:"SSO_UPDATE_BLOCK",ancestorProof:i},n)},o})(q(),void 0,cn(),I()))}(an)),an.exports}var fn,ln=un(),dn=n({__proto__:null,default:r(ln)},[ln]),hn={exports:{}},pn={exports:{}};function vn(){return fn||(fn=1,function(e){var n;n=function(){var e=function(n){if(Array.isArray(n))return n.map(e);if(n instanceof Object){var t=[],r=[];return Object.keys(n).forEach((function(e){/^(0|[1-9][0-9]*)$/.test(e)?t.push(+e):r.push(e)})),t.sort((function(e,n){return e-n})).concat(r.sort()).reduce((function(t,r){return t[r]=e(n[r]),t}),{})}return n},n=JSON.stringify.bind(JSON);return function(t,r,o){var a=n(t,r,0);if(!a||"{"!==a[0]&&"["!==a[0])return a;var i=JSON.parse(a);return n(e(i),null,o)}},e.exports?e.exports=n():JSON.sortify=n()}(pn)),pn.exports}var yn,mn={exports:{}},gn={exports:{}};function En(){return yn||(yn=1,function(e){var n,t,r,o,a,i,s,c;e.exports&&(e.exports=(C(),n=Z(),t=q(),K(),r=Me(),a=(o={}).createData=function(e,r){var o={channel:r||n.createChannelId(),displayName:e["cryptpad.username"],profile:e.profile&&e.profile.view,edPublic:e.edPublic,curvePublic:e.curvePublic,notifications:t.find(e,["mailboxes","notifications","channel"]),avatar:e.profile&&e.profile.avatar,uid:e.uid};return!1===r&&delete o.channel,o},i=o.getFriend=function(e,n){if(n){if(n===e.curvePublic){var t=a(e);return delete t.channel,t}return e.friends?e.friends[n]:void 0}},s=o.getFriendList=function(e){return e.friends||(e.friends={}),e.friends},c=function(e,n){Object.keys(e).forEach((function(t){"me"!==t&&n(e[t],t,e)}))},o.getFriendChannelsList=function(e){var n=[];return c(e.friends,(function(e){n.push(e.channel)})),n},o.declineFriendRequest=function(e,n,t){e.mailbox.sendTo("DECLINE_FRIEND_REQUEST",{},{channel:n.notifications,curvePublic:n.curvePublic},(function(e){t(e)}))},o.acceptFriendRequest=function(e,n,t){var r=i(e.proxy,n.curvePublic)||{},o=a(e.proxy,r.channel||n.channel);e.mailbox.sendTo("ACCEPT_FRIEND_REQUEST",{user:o},{channel:n.notifications,curvePublic:n.curvePublic},(function(e){t(e)}))},o.addToFriendList=function(e,n,t){var o=e.proxy,a=s(o),i=n.curvePublic;i!==o.curvePublic?(a[i]=n,r.whenRealtimeSyncs(e.realtime,(function(){t(),e.pinPads([n.channel],(function(e){e.error&&console.error(e.error)}))}))):t("E_MYKEY")},o.updateMyData=function(e,n){var r=a(e.proxy,!1);e.proxy.friends&&(e.proxy.friends.me=t.clone(r),delete e.proxy.friends.me.channel),e.modules.team&&e.modules.team.updateMyData(r);var o=function(n){n&&n.notifications&&(delete n.user,r.channel=n.channel,e.mailbox.sendTo("UPDATE_DATA",r,{channel:n.notifications,curvePublic:n.curvePublic},(function(e){e&&e.error&&console.error(e)})))};n?o(i(e.proxy,n)):c(e.proxy.friends||{},o)},o.removeFriend=function(e,n,t){var o=e.proxy,a=o.friends[n];a?a.notifications?e.mailbox.sendTo("UNFRIEND",{curvePublic:o.curvePublic},{channel:a.notifications,curvePublic:a.curvePublic},(function(i){i&&i.error?t(i):(e.messenger.onFriendRemoved(n,a.channel),delete o.friends[n],r.whenRealtimeSyncs(e.realtime,(function(){t(i)})))})):t({error:"EINVAL"}):t({error:"ENOENT"})},o))}(gn)),gn.exports}var bn,On,An,wn={exports:{}},Dn={exports:{}},_n={exports:{}};function Tn(){return bn||(bn=1,function(e){var n,t,r,o,a,i,s,c,u,f,l,d;e.exports&&(e.exports=(n=q(),t=I(),r=n.uid,o=n.tryParse,a=function(e,n){var r=t.util.decodeUTF8(JSON.stringify(e));return t.util.encodeBase64(t.sign.detached(r,n))},i=function(e,n,t){if("function"!=typeof t)throw new Error("expected callback");var o=e.network,a=o.historyKeeper;if("string"==typeof a){var i=r(),s=e.pending[i]=function(e,n){t(e,n)};return s.data=n,s.called=0,o.sendto(a,JSON.stringify([i,n]))}t("NO_HISTORY_KEEPER")},s=[],c=[],u=function(e){var n={network:e,connected:!0,anon:void 0,authenticated:[]};return s.push(e),c.push(n),e.on("message",(function(t,r){r===e.historyKeeper&&function(e,n){"string"!=typeof n&&console.error("received non-string message [%s]",n);var t=o(n);if(t){if(Array.isArray(t)&&!/(FULL_HISTORY|HISTORY_RANGE)/.test(t[0])){var r=t[0];"string"==typeof r&&(function(e,n){return!!e.anon&&"function"==typeof e.anon.pending[n]}(e,r)?function(e,n,t){var r=e.pending[n];"ERROR"===t[0]?r(t[1]):r(void 0,t.slice(1)),delete e.pending[n]}(e.anon,r,t.slice(1)):e.authenticated.some((function(e){var n=e.pending[r];return"function"==typeof n&&("ERROR"!==t[1]?(/\|/.test(t[1])&&e.cookie!==t[1]&&(e.cookie=t[1]),n(void 0,t.slice(2)),delete e.pending[r],!0):"NO_COOKIE"===t[2]?(e.send("COOKIE","",(function(t){if(t)return console.error(t),void n(t);e.resend(r)&&delete e.pending[r]})),!0):(n(t[2]),delete e.pending[r],!0))}))||console.error("UNHANDLED RPC MESSAGE",n))}}else console.error(new Error("could not parse message: %s",n))}(n,t)})),e.on("disconnect",(function(){n.connected=!1,n.anon&&(n.anon.connected=!1),n.authenticated.forEach((function(e){e.connected=!1}))})),e.on("reconnect",(function(){n.anon&&(n.anon.connected=!0),n.authenticated.forEach((function(e){e.connected=!0}))})),n},f=function(e){var n;return s.some((function(t,r){return e===t&&(n=r,!0)})),c[n]?c[n]:u(e)},l=function(e,t){if(!e)throw new Error("expected network context");var o,s=t.publicKeyString;return e.authenticated.some((function(e,n){return e.publicKey===s&&(o=n,!0)})),e.authenticated[o]?e.authenticated[o]:function(e,t){var o={network:e.network,publicKey:t.publicKeyString,timeouts:{},pending:{},cookie:null,connected:!0},s=o.send=function(e,r,s){var c=n.mkAsync(s);if(o.connected||"COOKIE"===e){var u=[e,r];o.cookie&&o.cookie.join?u.unshift(o.cookie.join("|")):u.unshift(o.cookie);var f=a(u,t.signKey);return u.unshift(t.publicKeyString),u.unshift(f),i(o,u,c)}c("DISCONNECTED")};return o.resend=function(e){var n=o.pending[e];if(n.called)return console.error("[%s] called too many times",e),!0;n.called++,n.data[2]=o.cookie,n.data[0]=a(n.data.slice(2),t.signKey);var i=r();o.pending[i]=n,delete o.pending[e];try{return o.network.sendto(o.network.historyKeeper,JSON.stringify([i,n.data]))}catch(e){console.log("failed to resend"),console.error(e)}},s.unauthenticated=function(e,r,a){var s=n.mkAsync(a);if(o.connected){var c=[null,t.publicKeyString,null,e,r];return o.cookie&&o.cookie.join?c[2]=o.cookie.join("|"):c[2]=o.cookie,i(o,c,s)}s("DISCONNECTED")},o.destroy=function(){Object.keys(o.timeouts).forEach((function(e){clearTimeout(e)}));var n=e.authenticated.indexOf(o);-1!==n&&e.authenticated.splice(n,1)},e.authenticated.push(o),o}(e,t)},d=function(e){return e.anon||function(e){var t={network:e.network,timeouts:{},pending:{},connected:!0};return e.anon=t,t.send=function(e,r,o){var a=n.mkAsync(o);if(t.connected)return i(t,[e,r],a);a("DISCONNECTED")},t.resend=function(e){var n=t.pending[e];if(n.called)return console.error("[%s] called too many times",e),!0;n.called++;try{return t.network.sendto(t.network.historyKeeper,JSON.stringify([e,n.data]))}catch(e){console.log("failed to resend"),console.error(e)}},t.destroy=function(){Object.keys(t.timeouts).forEach((function(e){clearTimeout(e)})),e.anon=void 0},t}(e)},{create:function(e,r,o,a){if("function"!=typeof a)throw new Error("expected callback");var i,s=n.mkAsync(a);try{if(64!==(i=t.util.decodeBase64(r)).length)throw new Error("private key did not match expected length of 64")}catch(e){return void s(e)}try{if(32!==t.util.decodeBase64(o).length)return void s("expected public key to be 32 uint")}catch(e){return void s(e)}if(e){var c=f(e),u=l(c,{publicKeyString:o,signKey:i});u.send("COOKIE","",(function(e){e?s(e):s(void 0,{send:u.send,destroy:u.destroy})}))}else s("NO_NETWORK")},createAnonymous:function(e,t){var r=n.mkAsync(t);if("function"!=typeof r)throw new Error("expected callback");if(e){var o=d(f(e));r(void 0,{send:o.send,destroy:o.destroy})}else r("NO_NETWORK")}}))}(_n)),_n.exports}function Sn(){return On||(On=1,function(e){var n,t;e.exports&&(e.exports=(n=q(),t=Tn(),{create:function(e,r,o,a){if("function"!=typeof o)throw new Error("Expected callback");var i=n.once(n.mkAsync(o));if(e)if(r){var s=r.edPrivate,c=r.edPublic;s&&c?t.create(e,s,c,(function(e,t){if(e)i(e);else{var r={};r.destroy=t.destroy,r.publicKey=c,r.send=t.send,r.pin=function(e,r){var o=n.once(n.mkAsync(r));Array.isArray(e)?t.send("PIN",e,o):o("[TypeError] pin expects an array")},r.unpin=function(e,r){var o=n.once(n.mkAsync(r));Array.isArray(e)?t.send("UNPIN",e,o):o("[TypeError] pin expects an array")},r.adminRpc=function(e,n){if(e.cmd){var r=[e.cmd,e.data];t.send("ADMIN",r,n)}else setTimeout((function(){n("[TypeError] admin rpc expects a command")}))},r.getServerHash=function(e){t.send("GET_HASH",c,(function(n,t){t&&t[0]?e(n,Array.isArray(t)&&t[0]||void 0):e("NO_HASH_RETURNED")}))},r.reset=function(e,r){var o=n.once(n.mkAsync(r));Array.isArray(e)?t.send("RESET",e,o):o("[TypeError] pin expects an array")},r.getFileListSize=function(e){t.send("GET_TOTAL_SIZE",void 0,(function(n,t){n?e(n):t&&t.length&&"number"==typeof t[0]?e(void 0,t[0]):e("INVALID_RESPONSE")}))},r.updatePinLimits=function(e){t.send("UPDATE_LIMITS",void 0,(function(n,t){n?e(n):t&&t.length&&"number"==typeof t[0]?e(void 0,t[0],t[1],t[2]):e("INVALID_RESPONSE")}))},r.getLimit=function(e){t.send("GET_LIMIT",void 0,(function(n,t){n?e(n):t&&t.length&&"number"==typeof t[0]?e(void 0,t[0],t[1],t[2]):e("INVALID_RESPONSE")}))},r.trimHistory=function(e,r){var o=n.once(n.mkAsync(r));"object"==typeof e&&e.channel&&e.hash?t.send("TRIM_HISTORY",e,(function(e){if(e)return o(e);o()})):o("INVALID_ARGUMENTS")},r.clearOwnedChannel=function(e,n){"string"==typeof e&&32===e.length?t.send("CLEAR_OWNED_CHANNEL",e,(function(e){if(e)return n(e);n()})):n("INVALID_ARGUMENTS")},r.removeOwnedChannel=function(e,n,r){if("string"!=typeof e||-1===[32,48].indexOf(e.length))return console.error("invalid channel to remove",e),void n("INVALID_ARGUMENTS");t.send("REMOVE_OWNED_CHANNEL",{channel:e,reason:r},(function(t,r){t?n(t):r&&r.length&&"OK"===r[0]?(n(),a&&a.clearChannel&&a.clearChannel(e)):n("INVALID_RESPONSE")}))},r.removePins=function(e){t.send("REMOVE_PINS",void 0,(function(n,t){n?e(n):t&&t.length&&"OK"===t[0]?e():e("INVALID_RESPONSE")}))},r.uploadComplete=function(e,n){t.send("UPLOAD_COMPLETE",e,(function(e,t){if(e)n(e);else{var r=t[0];"string"==typeof r?n(void 0,r):n("INVALID_ID")}}))},r.ownedUploadComplete=function(e,n){t.send("OWNED_UPLOAD_COMPLETE",e,(function(e,t){if(e)n(e);else{var r=t[0];"string"==typeof r?n(void 0,r):n("INVALID_ID")}}))},r.uploadStatus=function(e,n){"number"==typeof e?t.send("UPLOAD_STATUS",e,(function(e,t){if(e)n(e);else{var r=t[0];"boolean"==typeof r?n(void 0,r):n("INVALID_RESPONSE")}})):setTimeout((function(){n("INVALID_SIZE")}))},r.uploadCancel=function(e,n){t.send("UPLOAD_CANCEL",e,(function(e){e?n(e):n()}))},r.setMetadata=function(e,n){t.send("SET_METADATA",{channel:e.channel,command:e.command,value:e.value},n)},i(e,r)}})):i("INVALID_KEYS")}else i("INVALID_PROXY");else i("INVALID_NETWORK")}}))}(Dn)),Dn.exports}function xn(){return An||(An=1,function(e){(()=>{const n=(e,n,t,r,o,a,i,s,c,u)=>{var f=function(e,n,t){if(!e.done){if(e.cb(n&&n.error,t,n),e.done=!0,!e.hasNetwork){var o=r.find(e,["network","disconnect"]);"function"==typeof o&&o()}if(e.realtime&&e.realtime.stop)try{e.realtime.stop()}catch(e){console.error(e)}var a=r.find(e,["session","realtime","abort"]);"function"==typeof a&&(e.session.realtime.sync(),a())}},l=function(e,r){u((function(n){var o,a;e.hasNetwork||(o=n((function(e,n){e||(r.network=n)})),a=i.getWebsocketURL(),t.connect(a).then((function(e){o(null,e)}),(function(e){o(e)})))})).nThen((function(){e.realtime=n.start(r)}))},d=function(e,n,t,r){Array.isArray(t)&&t.length&&16===t[0].length&&Array.isArray(n.accessKeys)?(e.network.historyKeeper=t[0],u((function(t){n.accessKeys.forEach((function(n){c.create(e.network,n,t((function(e){console.log("done",n),e&&console.error(e)})))}))})).nThen((function(){r()}))):r(!0)},h=function(n,t){var r;return"string"==typeof n?r=o.getSecrets("pad",n,t.password):"object"==typeof n&&(r=n),r.keys||(r.keys=r.key),{websocketURL:i.getWebsocketURL(t.origin),channel:r.channel,validateKey:r.keys.validateKey||void 0,crypto:e.createEncryptor(r.keys),logLevel:0,initialState:t.initialState,Cache:s}},p=function(e){return"object"==typeof e},v=function(e,n){p(e)&&p(n)&&Object.keys(n).forEach((function(t){e[t]=n[t]}))};return{get:function(e,n,t,r){if("function"!=typeof n)throw new Error("Cryptget expects a callback");r=r||function(){};var o=h(e,t=t||{}),a={cb:n,accessKeys:t.accessKeys,hasNetwork:Boolean(t.network)};o.onRejected=function(e,n){d(o,a,e,n)},o.onReady=function(e){var n=a.session=e.realtime;a.network=e.network,r(1),f(a,void 0,n.getUserDoc())},o.onError=function(e){console.warn(e),f(a,e)},o.onChannelError=function(e){console.error(e),f(a,e)},o.onCacheReady=t.onCacheReady;var i=0;o.onMessage=function(){i++,r(Math.min(.99,i/100))},v(o,t),l(a,o)},put:function(e,n,t,r){if("function"!=typeof t)throw new Error("Cryptput expects a callback");var o=h(e,r=r||{}),i={cb:t,accessKeys:r.accessKeys,hasNetwork:Boolean(r.network)};o.onRejected=function(e,n){d(o,i,e,n)},o.onReady=function(e){var r=i.session=e.realtime;i.network=e.network,r.contentUpdate(n);var o=setTimeout((function(){t(new Error("Timeout"))}),15e3);a.whenRealtimeSyncs(r,(function(){clearTimeout(o);var e=r.getAuthDoc();r.abort(),f(i,void 0,e)}))},o.onChannelError=function(e){f(i,e)},v(o,r),l(i,o)}}};e.exports&&(e.exports=n(C(),y(),v(),q(),Z(),Me(),M(),ie(),Sn(),Ve(),w()))})()}(wn)),wn.exports}var Nn,In={exports:{}},Cn={exports:{}};var Rn,Pn,kn,Mn={exports:{}};function Fn(){return Rn||(Rn=1,function(e){e.exports&&(e.exports=((e,n,t,r,o)=>{var a=function(e){var n=e.store.realtime.getLag().lag||0;return 20*(Math.max(0,n)+300)*(.5+Math.random())},i={},s={},c=function(e,n){var r=e.store.proxy.mutedUsers||{},o=t.find(n,["msg","author"]);return!!o&&Boolean(r[o])},u={};i.FRIEND_REQUEST=function(n,t,r,o){var a=r.msg.content.user||r.msg.content;if(c(n,r))o(!0);else if(u[r.msg.author])o(!0);else{if(u[r.msg.author]={type:t.type,hash:r.hash},e.getFriend(n.store.proxy,r.msg.author)||n.store.proxy.friends_pending[r.msg.author])return delete n.store.proxy.friends_pending[r.msg.author],void e.acceptFriendRequest(n.store,a,(function(t){t&&t.error?o():e.addToFriendList({proxy:n.store.proxy,realtime:n.store.realtime,pinPads:n.pinPads},a,(function(e){if(e)return console.error(e),void o(!0);n.store.messenger&&n.store.messenger.onFriendAdded(a),n.updateMetadata(),o(!0)}))}));o()}},s.FRIEND_REQUEST=function(e,n,t){var r=t.content.user||t.content;u[r.curvePublic]&&delete u[r.curvePublic]};var f={},l={};i.DECLINE_FRIEND_REQUEST=function(e,n,t,r){var o=t.msg.content.user||t.msg.content;o.curvePublic||(o.curvePublic=t.msg.author),setTimeout((function(){r(!0),e.store.proxy.friends_pending[t.msg.author]&&(delete e.store.proxy.friends_pending[t.msg.author],e.updateMetadata(),f[t.msg.author]||n.sendMessage({type:"FRIEND_REQUEST_DECLINED",content:{user:o}},(function(e){f[t.msg.author]={type:n.type,hash:e}})))}),a(e))},i.FRIEND_REQUEST_DECLINED=function(e,n,t,r){e.updateMetadata();var o=t.msg.content.user.curvePublic||t.msg.content.user,a=l[o];delete l[o],f[o]?r(!0,a):(f[o]={type:n.type,hash:t.hash},r(!1,a))},s.FRIEND_REQUEST_DECLINED=function(e,n,t){var r=t.content.user.curvePublic||t.content.user;f[r]&&delete f[r]},i.ACCEPT_FRIEND_REQUEST=function(n,t,r,o){var i=r.msg.content.user||r.msg.content;setTimeout((function(){o(!0),n.store.proxy.friends_pending[r.msg.author]&&(delete n.store.proxy.friends_pending[r.msg.author],e.addToFriendList({proxy:n.store.proxy,realtime:n.store.realtime,pinPads:n.pinPads},i,(function(e){e?console.error(e):(n.store.messenger&&n.store.messenger.onFriendAdded(i),n.updateMetadata(),n.store.modules.profile&&n.store.modules.profile.update(),l[r.msg.author]||t.sendMessage({type:"FRIEND_REQUEST_ACCEPTED",content:{user:i}},(function(e){l[r.msg.author]={type:t.type,hash:e}})))})))}),a(n))},i.FRIEND_REQUEST_ACCEPTED=function(e,n,t,r){e.updateMetadata();var o=t.msg.content.user.curvePublic||t.msg.content.user,a=f[o];delete f[o],l[o]?r(!0,a):(l[o]={type:n.type,hash:t.hash},r(!1,a))},s.FRIEND_REQUEST_ACCEPTED=function(e,n,t){var r=t.content.user.curvePublic||t.content.user;l[r]&&delete l[r]},i.CANCEL_FRIEND_REQUEST=function(e,n,t,r){var o=u[t.msg.author];o?r(!0,o):r(!0)},i.UNFRIEND=function(n,t,r,o){var a=r.msg.author,i=e.getFriend(n.store.proxy,a);i?(delete n.store.proxy.friends[a],delete n.store.proxy.friends_pending[a],n.store.messenger&&n.store.messenger.onFriendRemoved(a,i.channel),n.updateMetadata(),o(!0)):o(!0)},i.UPDATE_DATA=function(e,n,t,r){var o=t.msg,a=o.author,i=e.store.proxy.friends&&e.store.proxy.friends[a];i&&"object"==typeof o.content?(Object.keys(o.content).forEach((function(e){i[e]=o.content[e]})),e.store.messenger&&e.store.messenger.onFriendUpdate(a),e.updateMetadata(),r(!0)):r(!0)};var d=function(e,n){let t=e.store.data.blockHash,a=o.parseBlockHash(t).keys.symmetric;return r.encrypt(n,a)},h={};i.SHARE_PAD=function(e,t,r,o){var a=r.msg,i=r.hash,s=a.content;if(c(e,r))o(!0);else{var u,f=s.isStatic?s.href:n.hrefToHexChannelId(s.href,s.password),l=n.parsePadUrl(s.href),p=l.hashData&&l.hashData.mode||"n/a",v=h[f];if(v){if("edit"===v.mode&&"view"===p)return void o(!0);u=v.data}s.password&&(s.password=d(e,s.password)),h[f]={mode:p,data:{type:t.type,hash:i}},o(!1,u)}},s.SHARE_PAD=function(e,t,r,o){var a=r.content,i=n.hrefToHexChannelId(a.href,a.password),s=h[i];s&&s.data&&s.data.hash===o&&delete h[i]};var p=!1;i.SUPPORT_MESSAGE=function(e,n,t,r){p?r(!0):(p=!0,r())},s.SUPPORT_MESSAGE=function(){p=!1},i.REQUEST_PAD_ACCESS=function(e,n,t,r){var o=t.msg.content;if(c(e,t))r(!0);else{var a=o.channel,i=e.store.manager.findChannel(a);if(i.length){var s,u,f=e.store.proxy.edPublic;i.some((function(e){if(e.data&&Array.isArray(e.data.owners)&&-1!==e.data.owners.indexOf(f)&&e.data.href)return u=e.data.href,s=e.data.filename||e.data.title,!0}))?(o.title=s,o.href=u,r(!1)):r(!0)}else r(!0)}},i.GIVE_PAD_ACCESS=function(e,n,t,r){var o,a=t.msg.content,i=a.channel;e.store.manager.findChannel(i,!0).forEach((function(e){e.data&&!e.data.href&&(o||(o=e.data.filename||e.data.title),e.userObject.setHref(i,null,a.href))})),a.title=o||a.title,r(!1)},i.ADD_TO_ACCESS_LIST=function(e,n,t,r){var o=t.msg.content.channel;e.Store.getAllStores().forEach((function(n){var t=n.manager.findChannel(o);if(t.length){var r=t[0].data,a=t[0].id,i=n.id;e.Store.loadSharedFolder(i,a,r,(function(){}),!1)}})),r(!0)};var v={};i.ADD_OWNER=function(e,n,t,r){var o=t.msg.content;if(c(e,t))r(!0);else{if(!(o.teamChannel||o.href&&o.title&&o.channel))return console.log("Remove invalid notification"),void r(!0);var a=o.channel||o.teamChannel;o.password&&(o.pw=o.password,o.password=d(e,o.password)),v[a]?r(!0):(v[a]={type:n.type,hash:t.hash},r(!1))}},s.ADD_OWNER=function(e,n,t){var r=t.content.channel||t.content.teamChannel;v[r]&&delete v[r]},i.RM_OWNER=function(e,n,t,r){var o=t.msg.content;if(!o.channel&&!o.teamChannel)return console.log("Remove invalid notification"),void r(!0);var a=o.channel||o.teamChannel;if(o.teamChannel){var i=e.store.proxy.teams||{};Object.keys(i).some((function(e){if(i[e].channel===a)return i[e].owner=!1,!0}))}v[a]&&o.pending?r(!1,v[a]):r(!1)};var y={};i.INVITE_TO_TEAM=function(e,n,r,o){var a=r.msg.content;if(c(e,r))o(!0);else{if(!a.team)return console.log("Remove invalid notification"),void o(!0);var i=y[a.team.channel];if(i)return console.log("removing old invitation"),o(!1,i),void(y[a.team.channel]={type:n.type,hash:r.hash});var s=t.find(e,["store","proxy","teams"])||{};Object.keys(s).some((function(e){return s[e].channel===a.team.channel}))?o(!0):(y[a.team.channel]={type:n.type,hash:r.hash},o(!1))}},s.INVITE_TO_TEAM=function(e,n,r){var o=t.find(r,["content","team","channel"]);delete y[o]},i.KICKED_FROM_TEAM=function(e,n,t,r){var o=t.msg.content;if(!o.teamChannel)return console.log("Remove invalid notification"),void r(!0);y[o.teamChannel]&&o.pending?r(!0,y[o.teamChannel]):r(!1)},i.INVITE_TO_TEAM_ANSWER=function(e,n,r,o){var a=r.msg,i=a.content;if(!i.teamChannel)return console.log("Remove invalid notification"),void o(!0);var s,c,u=t.find(e,["store","proxy","teams"])||{};if(Object.keys(u).some((function(e){var n=u[e];if(n.channel===i.teamChannel)return s=e,c=n,!0})),s){if(i.team=c,!i.answer)try{e.store.modules.team.removeFromTeam(s,a.author,!0)}catch(e){console.error(e)}var f=i.user||i;n.sendMessage({type:"INVITE_TO_TEAM_ANSWERED",content:{user:f,team:c,answer:i.answer}},(function(){})),o(!0)}else o(!0)},i.TEAM_EDIT_RIGHTS=function(e,n,r,o){var a=r.msg.content;if(!a.teamData)return console.log("Remove invalid notification"),void o(!0);var i,s=t.find(e,["store","proxy","teams"])||{};if(Object.keys(s).some((function(e){if(s[e].channel===a.teamData.channel)return i=e,!0})),i)try{e.store.modules.team.changeMyRights(i,a.state,a.teamData,(function(e){e||console.error("Can't update team rights"),o(!0)}))}catch(e){console.error(e)}else o(!0)},i.OWNED_PAD_REMOVED=function(e,n,t,r){var o=t.msg.content;if(!o.channel)return console.log("Remove invalid notification"),void r(!0);var a=o.channel;e.store.manager.findChannel(a).forEach((function(n){var t=e.store.manager.findFile(n.id);e.store.manager.delete({paths:t},(function(){e.updateDrive()}))})),r(!0)},i.MOVE_TODO=function(e,n,t,r){var o=e.store.proxy.curvePublic;t.msg.author===o?r():r(!0)},i.SAFE_LINKS_DEFAULT=function(e,n,t,r){var o=e.store.proxy.curvePublic;t.msg.author===o?r():r(!0)};var m={};i.FORM_RESPONSE=function(e,n,t,r){var o,a,i=t.msg,s=t.hash,c=i.content,u=c.channel;if(u)if(function(e,n){return(e.store.proxy.mutedChannels||[]).includes(n)}(e,u))r(!0);else if(e.Store.getAllStores().some((function(e){return e.manager.findChannel(u).some((function(e){if(e.data&&(!a||e.data.href))return a=e.data.href||e.data.roHref,o=e.data.filename||e.data.title,!!e.data.href||void 0}))})),a){c.href=a,c.title=o;var f=m[u],l=f?f.data:void 0;m[u]={data:{type:n.type,hash:s}},r(!1,l)}else r(!0);else r(!0)},s.FORM_RESPONSE=function(e,n,t,r){var o=t.content.channel,a=m[o];a&&a.data&&a.data.hash===r&&delete m[o]};var g={};i.COMMENT_REPLY=function(e,n,r,o){var a=r.msg,i=r.hash,s=a.content;if(t.find(e.store.proxy,["settings","pad","disableNotif"]))o(!0);else{var c,u,f=s.channel;if(f)if(e.Store.getAllStores().some((function(e){return e.manager.findChannel(f).some((function(e){if(e.data&&(!u||e.data.href))return u=e.data.href||e.data.roHref,c=e.data.filename||e.data.title,!!e.data.href||void 0}))})),u){s.href=u,s.title=c;var l=g[f],d=l?l.data:void 0;g[f]={data:{type:n.type,hash:i}},o(!1,d)}else o(!0);else o(!0)}},s.COMMENT_REPLY=function(e,n,t,r){var o=t.content.channel,a=g[o];a&&a.data&&a.data.hash===r&&delete g[o]};var E,b,O={};i.MENTION=function(e,n,t,r){var o=t.msg,a=t.hash,i=o.content;if(c(e,t))r(!0);else{var s=i.channel;if(s){var u,f;e.Store.getAllStores().some((function(e){return e.manager.findChannel(s).some((function(e){if(e.data&&(!f||e.data.href))return f=e.data.href||e.data.roHref,u=e.data.filename||e.data.title,!!e.data.href||void 0}))})),i.href=f,i.title=u;var l=O[s],d=l?l.data:void 0;O[s]={data:{type:n.type,hash:a}},r(!1,d)}else r(!0)}},s.MENTION=function(e,n,t,r){var o=t.content.channel,a=O[o];a&&a.data&&a.data.hash===r&&delete O[o]},i.BROADCAST_MAINTENANCE=function(e,n,t,r){var o=t.msg.uid;e.Store.onMaintenanceUpdate(o),r(!0)},i.BROADCAST_SURVEY=function(e,n,t,r){var o=t.msg,a=o.content,i=o.uid,s=E;E={type:n.type,hash:t.hash},e.Store.onSurveyUpdate(i),r(!a.url,s)},i.BROADCAST_CUSTOM=function(e,n,t,r){var o=t.msg.uid,a=b;b={uid:o,type:n.type,hash:t.hash},r(!1,a)},i.BROADCAST_DELETE=function(e,n,t,r){var o=t.msg.content.uid;if(b&&b.uid===o)return r(!0,b),void(b=void 0);r(!0)};var A,w,D={};return i.SF_DELETED=function(e,n,t,r){var o=t.msg.content,a=o.team,i=o.sfId;if(D[i])r(!0);else if(D[i]=1,a){var s=e.store.proxy.teams[a];o.teamName=s.metadata&&s.metadata.name,r(!1)}else r(!1)},s.SF_DELETED=function(e,n,t){var r=t.content.sfId;delete D[r]},i.NEW_TICKET=function(e,n,r,o){var a=r.msg.content;a.time||(a.time=r.time);var i=t.find(e,["store","modules","support"]);a.isAdmin&&i.addUserTicket(a,o),i.addAdminTicket(a,o)},i.NOTIF_TICKET=function(e,n,r,o){var a=r.msg.content;a.time||(a.time=r.time);var i=t.find(e,["store","modules","support"]);if(a.isAdmin)return t.find(e,["store","proxy","support",a.channel])?(i.updateUserTicket(a),A?void o(!1,A):(A={channel:a.channel,type:n.type,hash:r.hash},void o(!1))):void o(!0);i.checkAdminTicket(a,(s=>{s?(i.updateAdminTicket(a),t.find(e.store.proxy,["settings","general","disableSupportNotif"])?o(!0):w?o(!1,w):(w={channel:a.channel,type:n.type,hash:r.hash},o(!1))):o(!0)}))},s.NOTIF_TICKET=function(e,n,t){var r=t.content.channel;A&&A.channel===r&&(A=void 0),w&&w.channel===r&&(w=void 0)},i.ADD_MODERATOR=function(e,n,r,o){var a=r.msg.content;t.find(e,["store","modules","support"]).updateAdminKey(a,o)},i.MODERATOR_NEW_KEY=function(e,n,r,o){var a=r.msg.content;t.find(e,["store","modules","support"]).updateAdminKey(a,(function(){o(!0)}))},{add:function(e,n,r,o){if(r.msg){var a=t.find(e,["store","proxy","curvePublic"]),s=t.find(r,["msg","content","user","curvePublic"])||t.find(r,["msg","content","curvePublic"]);if(s&&r.msg.author!==s&&r.msg.author!==a)return console.error("blocked"),void o(null,null,!0);var c=r.msg.type;if(i[c])try{i[c](e,n,r,o)}catch(e){console.error(e),o()}else o()}else o(null,null,!0)},remove:function(e,n,t,r){if(t){var o=t.type;if(s[o])try{s[o](e,n,t,r)}catch(e){console.error(e)}}}}})(En(),Z(),q(),C(),un()))}(Mn)),Mn.exports}function Ln(){return Pn||(Pn=1,function(e){(()=>{const n=(e={},n,t,r,o,a,i,s,c)=>{var u={setCustomize:n=>{e=n.Broadcast}},f=["notifications","supportteam","broadcast"],l=[],d="000000000000000000000000000000000",h=function(e,n,t,r,o){e.emit("MESSAGE",{type:n,content:t},r?[r]:e.clients,o)},p=function(e,n,t,r){e.emit("VIEWED",{type:n,hash:t},r||e.clients)},v=function(e){var n=e.store&&e.store.proxy;if(n.curvePrivate&&n.curvePublic)return{curvePrivate:n.curvePrivate,curvePublic:n.curvePublic}},y=u.sendTo=function(e,t,r,a,i){a=a||{};var s=i||function(e){e&&e.error&&console.error(e.error)};if(c.Mailbox){var u=n.find(e,["store","anon_rpc"]);if(u){var f={encrypt:function(e){return e}},l=d,h={uid:n.uid(),type:t,content:r};if(!/^BROADCAST/.test(t)){var p=v(e);if(!p)return void s({error:"missing asymmetric encryption keys"});if(!a||!a.channel||!a.curvePublic)return void s({error:"no notification channel"});if(l=a.channel,f=c.Mailbox.createEncryptor(p),"object"==typeof r&&!r.user){var y=o.createData(e.store.proxy,!1);r.user=y}h={type:t,content:r}}var m=JSON.stringify(h),g=f.encrypt(m,a.curvePublic);if(a.viewed){var E=n.find(e,["store","proxy","teams",a.viewed]);if(E){var b=g.slice(0,64),O=n.find(E,["keys","mailbox","viewed"]);Array.isArray(O)&&O.push(b)}}u.send("WRITE_PRIVATE_MESSAGE",[l,g],(function(e){s(e?{error:e}:{hash:g.slice(0,64)})}))}else s({error:"anonymous rpc session not ready"})}else s({error:"chainpad-crypto is outdated and doesn't support mailboxes."})};u.sendToAnon=function(e,n,t,r,o){var a=c.Nacl,i=a.randomBytes(32),s=a.box.keyPair.fromSecretKey(new Uint8Array(i)),u=a.util.encodeBase64(s.secretKey),f=a.util.encodeBase64(s.publicKey);y({store:{anon_rpc:e,proxy:{curvePrivate:u,curvePublic:f}}},n,t,r,o)};var m=function(e,t,o,a){var s=t.type,c=t.hash;if(/^REMINDER\|/.test(c)){a(),delete e.boxes.reminders.content[c],p(e,s,c,e.clients.filter((function(e){return e!==o})));var u=c.slice(9).split("-")[0],f=n.find(e,["store","proxy","hideReminders",u]);if(!f){var l=e.store.proxy.hideReminders=e.store.proxy.hideReminders||{};f=l[u]=l[u]||[]}var d=c.split("-")[1];d&&!f.includes(d)&&f.push(Number(d))}else{var h=e.boxes[s];if(h){var v,y,m=h.data||{},g=h.history.indexOf(c);-1!==g&&(0===g?(m.lastKnownHash=c,h.history.shift()):-1===m.viewed.indexOf(c)&&m.viewed.push(c));var E=[];h.history.some((function(e,n){if(-1===m.viewed.indexOf(e))return!0;v=n+1,E.push(e),y=e})),m.viewed=m.viewed.filter((function(e){return-1===E.indexOf(e)})),v&&(h.history=h.history.slice(v),m.lastKnownHash=y),Object.keys(h.content).forEach((function(n){-1!==h.history.indexOf(n)&&-1===m.viewed.indexOf(n)||(i.remove(e,h,h.content[n],n),delete h.content[n])})),r.whenRealtimeSyncs(e.store.realtime,(function(){a(),p(e,s,c,e.clients.filter((function(e){return e!==o})))}))}else a({error:"NOT_LOADED"})}},g=function(e,n,t,r,u){u=u||{};var f=e.boxes[n]={channel:t.channel,type:n,queue:[],history:[],content:{},sendMessage:function(n){if("object"==typeof n&&!n.user){var t=o.createData(e.store.proxy,!1);n.user=t}try{n=JSON.stringify(n)}catch(e){console.error(e)}f.queue.push(n)},data:t};if(c.Mailbox){var l=t.keys||v(e);if(l||t.decrypted){var d=t.decrypted?{encrypt:function(e){return e},decrypt:function(e){return e}}:c.Mailbox.createEncryptor(l);f.encryptor=d;var y,g={network:e.store.network,channel:t.channel,noChainPad:!0,crypto:d,owners:"broadcast"===n?[]:u.owners||[e.store.proxy.edPublic],lastKnownHash:t.lastKnownHash};g.onConnectionChange=function(){},g.onConnect=function(t,r){f.sendMessage=function(t,o){var a;o=o||function(){};try{a=JSON.stringify(t)}catch(e){console.error(e)}r(a,(function(r,a){r?console.error(r):(f.history.push(a),t.ctime=+new Date,f.content[a]=t,h(e,n,{msg:t,hash:a}),o(a))}),l.curvePublic)},f.queue.forEach((function(e){f.sendMessage(e)})),f.queue=[]},f.onMessage=g.onMessage=function(r,o,s,c,l,d,p){if(l!==t.lastKnownHash&&l!==y){var v=p&&p.time;y=l;try{r=JSON.parse(r)}catch(e){console.error(e)}if(d&&(r.author=d),f.history.push(l),function(e,n){return-1===(n.viewed||[]).indexOf(e)&&e!==n.lastKnownHash}(l,t)){var g={msg:r,hash:l,time:v},E=f.ready;i.add(e,f,g,(function(t,o,i){o&&m(e,o,"",(function(){console.log("Notification handled automatically")})),i||t?m(e,{type:n,hash:l},"",(function(){console.log("Notification handled automatically")})):(r.ctime=v||0,f.content[l]=r,u.dump||h(e,n,g,null,(function(e){e&&e.msg&&E&&a.system(void 0,e.msg)})))}))}else if(0===Object.keys(f.content).length){t.lastKnownHash=l,f.history=[];var b=t.viewed.indexOf(l);-1!==b&&t.viewed.splice(b,1)}}},g.onReady=function(){var o=[];t.viewed.forEach((function(e,n){-1===f.history.indexOf(e)&&o.push(n)}));for(var a=o.length-1;a>=0;a--)t.viewed.splice(o[a],1);var s=function(t){i.remove(e,f,f.content[t],t),delete f.content[t],p(e,n,t)};e.store.proxy.on("change",["mailboxes",n],(function(e,n,t){var r;"lastKnownHash"===t[2]&&(f.history.some((function(e,t){if(r=t+1,s(e),e===n)return!0})),f.history=f.history.slice(r));"viewed"===t[2]&&s(n)})),f.ready=!0,r(f.content)},f.cpNf=s.start(g)}else console.error("missing asymmetric encryption keys")}else console.error("chainpad-crypto is outdated and doesn't support mailboxes.")};return u.init=function(r,o,s){var c={},u=r.store,v=u.proxy.mailboxes=u.proxy.mailboxes||{},E={Store:r.Store,store:u,pinPads:r.pinPads,updateMetadata:r.updateMetadata,updateDrive:r.updateDrive,mailboxes:v,emit:s,clients:[],boxes:{},req:{},loggedIn:u.loggedIn&&u.proxy.edPublic};return function(n,r){!r.notifications&&n.loggedIn&&(r.notifications={channel:t.createChannelId(),lastKnownHash:"",viewed:[]},n.pinPads([r.notifications.channel],(function(e){e.error&&console.error(e)}))),r.support&&delete r.support,r.broadcast||(r.broadcast={channel:d,lastKnownHash:e.lastBroadcastHash,decrypted:!0,viewed:[]})}(E,v),E.loggedIn&&function(e){var t=e.store.network;t.on("message",(function(r,o){if(o===t.historyKeeper){var a=JSON.parse(r);if(/HISTORY_RANGE/.test(a[0])){var i=a[1],s=e.req[i];if(s){var c=a[0],u=a[2],f=s.box;if("HISTORY_RANGE"===c){if(!Array.isArray(u))return;var l;if("broadcast"===s.box.type)l=n.tryParse(u[4]);else try{var d=f.encryptor.decrypt(u[4]);(l=JSON.parse(d.content)).author=d.author}catch(e){console.log(e)}var h=u[4].slice(0,64);e.emit("HISTORY",{txid:i,time:u[5],message:l,hash:h},[s.cId])}else"HISTORY_RANGE_END"===c&&(e.emit("HISTORY",{txid:i,complete:!0},[s.cId]),delete e.req[i])}}}}))}(E),E.boxes.reminders={content:{}},Object.keys(v).forEach((function(e){if(-1!==f.indexOf(e)){var n=v[e];-1===l.indexOf(e)?g(E,e,n,(function(){})):g(E,e,n,o((function(){})))}})),E.loggedIn&&Object.keys(u.proxy.teams||{}).forEach((function(e){var t=u.proxy.teams[e];if(t){var r=t.keys.mailbox||{};if(r.channel){var o={owners:[n.find(t,["keys","drive","edPublic"])]};g(E,"team-"+e,r,(function(){}),o)}}})),c.post=function(e,n,t){var r=E.boxes[e];r&&r.sendMessage({type:n,content:t,sender:u.proxy.curvePublic})},c.hideMessage=function(e,n){p(E,e,n.hash,E.clients)},c.showMessage=function(e,n,t,r){"reminders"===e&&n&&(E.boxes.reminders.content[n.hash]=n.msg,E.clients.length||(E.boxes.reminders.content[n.hash].requiresNotif=!0),p(E,e,n.hash,E.clients)),h(E,e,n,t,(function(e){a.system(void 0,e.msg),r&&r()}))},c.open=function(e,n,t,r,o){(-1!==f.indexOf(e)||r)&&g(E,e,n,t,o)},c.close=function(e,n){!function(e,n,t){t=t||function(){};var r=e.boxes[n];r?r.cpNf&&"function"==typeof r.cpNf.stop?(r.cpNf.stop(),Object.keys(r.content).forEach((function(t){i.remove(e,r,r.content[t],t),p(e,n,t,e.clients)})),delete e.boxes[n]):t("EINVAL"):t()}(E,e,n)},c.dismiss=function(e,n){m(E,e,"",n)},c.sendTo=function(e,n,t,r){E.loggedIn?y(E,e,n,t,r):r({error:"NOT_LOGGED_IN"})},c.removeClient=function(e){!function(e,n){var t=e.clients.indexOf(n);e.clients.splice(t,1)}(E,e)},c.execCommand=function(e,n,t){var r=n.cmd,o=n.data;"SUBSCRIBE"!==r?"DISMISS"!==r?"SENDTO"!==r?"LOAD_HISTORY"!==r||function(e,n,t,r){var o=e.boxes[t.type];if(o){var a=["GET_HISTORY_RANGE",o.channel,{from:t.lastKnownHash,count:t.count,txid:t.txid}];"broadcast"===t.type&&(a=["GET_HISTORY_RANGE",o.channel,{to:t.lastKnownHash,txid:t.txid}]),e.req[t.txid]={cId:n,box:o};var i=e.store.network;i.sendto(i.historyKeeper,JSON.stringify(a)).then((function(){}),(function(e){console.error(e)}))}else r({error:"ENOENT"})}(E,e,o,t):y(E,o.type,o.msg,o.user,t):m(E,o,e,t):function(e,n,t,r){Object.keys(e.boxes).forEach((function(n){Object.keys(e.boxes[n].content).forEach((function(r){var o={msg:e.boxes[n].content[r],hash:r};h(e,n,o,t,(function(e){e.error||o.msg&&o.msg.requiresNotif&&(a.system(void 0,e.msg),delete o.msg.requiresNotif)}))}))})),-1===e.clients.indexOf(t)&&e.clients.push(t),r()}(E,0,e,t)},c},u};e.exports&&(e.exports=n(void 0,q(),Z(),Me(),En(),(Nn||(Nn=1,function(e){(()=>{const n=(e={})=>{let n=globalThis;var t={};e.requireConf=e.requireConf||{},t.setCustomize=n=>{e=n.ApiConfig};var r=n.location&&n.location.pathname.slice(1,-1),o=-1!==["code","slide","pad","kanban","whiteboard","diagram","sheet","poll","teams","form","doc","presentation"].indexOf(r)?"-"+r:"",a="/customize/favicon/main-favicon"+o+".png?"+e.requireConf.urlArgs,i="/customize/favicon/alt-favicon"+o+".png?"+e.requireConf.urlArgs,s="/customize/favicon/main-favicon"+o+".ico?"+e.requireConf.urlArgs,c="/customize/favicon/alt-favicon"+o+".ico?"+e.requireConf.urlArgs,u=n.document,f=t.isSupported=function(){return"function"==typeof n.Notification&&n.isSecureContext},l=t.hasPermission=function(){return"granted"===Notification.permission},d=t.getPermission=function(e){e=e||function(){},Notification&&"function"==typeof Notification.requestPermission?Notification.requestPermission((function(n){e("granted"===n)})):e(!1)},h=t.create=function(e,t,r){u&&!r?r=u.getElementById("favicon").getAttribute("data-main-favicon")||i:r||(r=i);var o=new Notification(t,{icon:r,body:e});return o.onclick=function(){if(u)try{parent.focus(),n.focus(),this.close()}catch(e){}},o};return t.system=function(e,n,t){if(f())return l()?h(e,n,t):void("denied"!==Notification.permission&&d((function(r){r&&h(e,n,t)})))},u&&!u.getElementById("favicon")&&function(){if(u){console.debug("creating favicon");var e={id:"favicon",type:"image/png",rel:"icon","data-main-favicon":a,"data-alt-favicon":i,href:a};if(!u.getElementById("favicon")){var n=u.createElement("link");Object.keys(e).forEach((function(t){n.setAttribute(t,e[t])})),u.head.appendChild(n)}if(!u.getElementById("favicon-ico")){var t=u.createElement("link");e.href=e.href.replace(/\.png/g,".ico"),e.id="favicon-ico",e.type="image/x-icon",Object.keys(e).forEach((function(n){t.setAttribute(n,e[n])})),u.head.appendChild(t)}}else console.error("document is not available in this context")}(),t.tab=function(e,r){if(u){var o="_pendingTabNotification",f=u.getElementById("favicon"),l=u.getElementById("favicon-ico"),d=a,h=i,p=s,v=c;f&&(d=f.getAttribute("data-main-favicon")||a,h=f.getAttribute("data-alt-favicon")||i,f.setAttribute("href",d)),l&&(p=l.getAttribute("data-main-favicon")||s,v=l.getAttribute("data-alt-favicon")||c,l.setAttribute("href",p));var y=function(e){return!!t[o]&&(n.clearInterval(t[o]),f&&f.setAttribute("href",e?h:d),l&&l.setAttribute("href",e?v:p),!0)};y();var m=function(){f&&f.setAttribute("href",f.getAttribute("href")===d?h:d),l&&l.setAttribute("href",l.getAttribute("href")===p?v:p),--r};return t[o]=n.setInterval((function(){if(r>0)return m();y(!0)}),e),m(),{cancel:y}}console.error("document is not available in this context")},t};e.exports&&(e.exports=n(void 0))})()}(Cn)),Cn.exports),Fn(),y(),C()))})()}(In)),In.exports}function Hn(){return kn||(kn=1,function(e){(()=>{const n=(e,n,t,r,o,a,i={},s,c,u)=>{let f=function(f,l,d,h){var p=f.version||0;c((function(){})).nThen((function(){var n,t,r,o,a;p<2&&(n="cryptpad.userlist-drawer",t="cryptpad.hide_poll_text",r="cryptpad.indentUnit",o="cryptpad.indentWithTabs",a=f.settings=f.settings||{},void 0!==f[r]&&(a.codemirror=a.codemirror||{},a.codemirror.indentUnit=f[r],delete f[r]),void 0!==f[o]&&(a.codemirror=a.codemirror||{},a.codemirror.indentWithTabs=f[o],delete f[o]),void 0!==f[n]&&(a.toolbar=a.toolbar||{},a.toolbar["userlist-drawer"]=f[n],delete f[n]),void 0!==f[t]&&(a.poll=a.poll||{},a.poll["hide-text"]=f[t],delete f[t]),e.send("Migrate-2",!0),f.version=p=2)})).nThen((function(){p<3&&(!function(){if(localStorage.CRYPTPAD_LANG){var e=localStorage.CRYPTPAD_LANG;f.settings.language=e}}(),e.send("Migrate-3",!0),f.version=p=3)})).nThen((function(){var n;p<4&&(n=f.settings=f.settings||{},void 0!==f.allowUserFeedback&&(n.general=n.general||{},n.general.allowUserFeedback=f.allowUserFeedback,delete f.allowUserFeedback),e.send("Migrate-4",!0),f.version=p=4)})).nThen((function(){p<5&&(!function(){var e=f.drive&&f.drive.filesData;if(e)for(var n in e)"number"!=typeof e[n].ctime&&(e[n].ctime=+new Date(e[n].ctime)),"number"!=typeof e[n].atime&&(e[n].atime=+new Date(e[n].atime))}(),e.send("Migrate-5",!0),f.version=p=5)})).nThen((function(t){var r,o,a,i,s;p<6&&(a=f.drive.filesData||{},i=c((function(){})),s=Object.keys(a).length,Object.keys(a).forEach((function(e,t){i=i.nThen((function(i){setTimeout(i((function(){if(r=a[e],o=n.parsePadUrl(r.href),r.href&&!r.channel){var i=n.getSecrets(o.type,o.hash,r.password);r.channel=i.channel,d(6,Math.round(100*t/s)),console.log("Adding missing channel in filesData ",r.channel)}})))}))})),i.nThen(t((function(){e.send("Migrate-6",!0),f.version=p=6}))))})).nThen((function(t){var r,o,a,i,s;p<7&&(a=f.drive.filesData,i=c((function(){})),s=Object.keys(a).length,Object.keys(a).forEach((function(e,t){i=i.nThen((function(i){setTimeout(i((function(){if((r=a[e]).href)if(-1!==r.href.indexOf("#"))if("pad"===(o=n.parsePadUrl(r.href)).hashData.type){if("view"===o.hashData.mode)r.roHref=r.href,delete r.href,console.log("Move href to roHref in filesData ",r.roHref);else{var i=n.getSecrets(o.type,o.hash,r.password),c=n.getViewHashFromKeys(i);c&&(r.roHref="/"+o.type+"/#"+c,console.log("Adding missing roHref in filesData ",r.href))}d(6,Math.round(100*t/s))}else d(7,Math.round(100*t/s));else d(7,Math.round(100*t/s));else d(7,Math.round(100*t/s))})))}))})),i.nThen(t((function(){e.send("Migrate-7",!0),f.version=p=7}))))})).nThen((function(){p<8&&(f.FS_hashes=t.deduplicateString(f.FS_hashes||[]),e.send("Migrate-8",!0),f.version=p=8)})).nThen((function(){p<9&&(!function(){var e=h.network,n={},t={store:h},o=r.createData(f),i=function(e){var t=n[e];if(t){try{t.wc.leave()}catch(e){}delete n[e]}};e.on("message",(function(r,s){try{!function(r,s){if(s===e.historyKeeper){var c=JSON.parse(r);if(!c.validateKey&&!c.owners||!c.channel){if(c.channel&&n[c.channel]){if(c.error&&"EINVAL"===c.error){var u=["GET_HISTORY",c.channel,{}];return void e.sendto(e.historyKeeper,JSON.stringify(u)).then((function(){}),(function(){}))}if(c.state&&1===c.state){o.channel=c.channel;var f=["UPDATE",o.curvePublic,+new Date,o],l=n[c.channel].encrypt(JSON.stringify(f));return n[c.channel].wc.bcast(l).then((function(){}),(function(e){console.error("Can't migrate this friend",n[c.channel].friend,e)})),void i(c.channel)}}else if(c.channel)return;var d=c[3];if(d&&n[d]){var h=n[d],p=h.decrypt(c[4]),v=JSON.parse(p);if("UPDATE"===v[0]){if(v[1]===o.curvePublic)return;var y=v[3];if(!y.notifications)return;h.friend.notifications=y.notifications,o.channel=d,a.sendTo(t,"UPDATE_DATA",o,{channel:y.notifications,curvePublic:y.curvePublic},(function(e){e&&e.error?console.error(e):console.log("friend migrated",h.friend)})),i(d)}}}}}(r,s)}catch(e){console.error(e)}}));var s=f.friends||{};Object.keys(s).forEach((function(t){if(44===t.length){var r=s[t];r.notifications||e.join(r.channel).then((function(t){var o=u.Curve.deriveKeys(r.curvePublic,f.curvePrivate),a=u.Curve.createEncryptor(o);n[r.channel]={wc:t,friend:r,decrypt:a.decrypt,encrypt:a.encrypt};var i={lastKnownHash:r.lastKnownHash},s=["GET_HISTORY",r.channel,i];e.sendto(e.historyKeeper,JSON.stringify(s)).then((function(){}),(function(e){console.error("Can't migrate this friend",r,e)}))}),(function(e){console.error("Can't migrate this friend",r,e)}))}}))}(),e.send("Migrate-9",!0),f.version=p=9)})).nThen((function(t){p<10&&function(){var s=h.proxy.todo;if(s){var u,l=t((function(){e.send("Migrate-10",!0),f.version=p=10})),d={network:h.network,initialState:"{}",metadata:{owners:h.proxy.edPublic?[h.proxy.edPublic]:[]}};c((function(e){o.get(s,e((function(n,t){if(n||!t)return e.abort(),void l();try{u=JSON.parse(t)}catch(e){}})),d)})).nThen((function(e){if(!u||"object"!=typeof u)return e.abort(),void l();var t={content:{data:{1:{id:"1",color:"color6",item:[],title:i.kanban_todo},2:{id:"2",color:"color3",item:[],title:i.kanban_working},3:{id:"3",color:"color5",item:[],title:i.kanban_done}},items:{},list:[1,2,3]},metadata:{title:i.type.todo,defaultTitle:i.type.todo,type:"kanban"}},c=4,p=!1;if((u.order||[]).forEach((function(e){var n=u.data[e];if(n&&n.task){p=!0;var r=n.state?"3":"1";t.content.data[r].item.push(c),t.content.items[c]={id:c,title:n.task},c++}})),!p)return e.abort(),void l();var v=n.createRandomHash("kanban"),y=n.getSecrets("kanban",v),m=n.getSecrets("todo",s);o.put(v,JSON.stringify(t),e((function(t){if(t)return e.abort(),void l();h.rpc&&(h.rpc.pin([y.channel],(function(){})),h.rpc.unpin([m.channel],(function(){})));var o=n.hashToHref(v,"kanban");h.manager.addPad(["root"],{title:i.type.todo,owners:d.metadata.owners,channel:y.channel,href:o,roHref:n.hashToHref(n.getViewHashFromKeys(y),"kanban"),atime:+new Date,ctime:+new Date},e((function(e){if(e)console.error(e);else{delete h.proxy.todo;var n=r.createData(f),t={store:h};a.sendTo(t,"MOVE_TODO",{user:n,href:o},{channel:n.notifications,curvePublic:n.curvePublic},(function(e){e&&e.error&&console.error(e)}))}})))})),d)})).nThen((function(){l()}))}}()})).nThen((function(n){if(!(p>=11)){var o=function(){e.send("Migrate-11",!0),f.version=p=11};if(void 0===t.find(f,["settings","security","unsafeLinks"])){var i={store:h},s=r.createData(f);s.curvePublic?a.sendTo(i,"SAFE_LINKS_DEFAULT",{user:s},{channel:s.notifications,curvePublic:s.curvePublic},n((function(e){e&&e.error?console.error(e):o()}))):o()}else o()}})).nThen((function(){s.whenRealtimeSyncs(h.realtime,t.mkAsync(t.bake(l)))}))};return f.setCustomize=e=>{i=e.Messages},f};e.exports&&(e.exports=n(ge(),Z(),q(),En(),xn(),Ln(),void 0,Me(),Ve(),C()))})()}(mn)),mn.exports}var jn,Kn={exports:{}};function Un(){return jn||(jn=1,function(e){var n,t,r;e.exports&&(e.exports=(n=xn(),t=Le(),Z(),r=Me(),{anonDriveIntoUser:function(e,o,a){o&&e.loggedIn||"function"!=typeof a?n.get(o,(function(n,i){var s;if(n)console.error("Cannot migrate recent pads",n);else if(i){try{s=JSON.parse(i)}catch(e){return"function"==typeof a&&a(),void console.error("Cannot parsed recent pads",e)}if(s){var c=e.proxy,u=t.init(s.drive,{readOnly:!1,loggedIn:!0,outer:!0}),f=function(){u.fixFiles(!0);var n=e.manager;u.getFiles([u.FILES_DATA]).forEach((function(e){var t=u.getFileData(e),r=t.channel,o=n.findChannel(r);if(0===o.length)t&&n.addPad(null,t,(function(e){e&&console.error("Cannot import file:",t,e)}));else{if(!t.href)return;o.forEach((function(e){e.data&&!e.data.href&&e.userObject.setHref(r,null,t.href)}))}})),c.FS_hashes&&Array.isArray(c.FS_hashes)||(c.FS_hashes=[]),-1===c.FS_hashes.indexOf(o)&&c.FS_hashes.push(o),"function"==typeof a&&r.whenRealtimeSyncs(e.realtime,a)};u&&"function"==typeof u.migrate?u.migrate(f):(console.log("oldFo.migrate is not a function"),f())}else"function"==typeof a&&a()}else"function"==typeof a&&a()})):a()}}))}(Kn)),Kn.exports}var Bn=o(ye);const Vn=te.mkEvent(!0),Yn=te.mkEvent(!0),Gn=te.mkEvent(),Jn=te.mkEvent(),qn={init:e=>{var n;const{broadcast:t,store:r,account:o}=e,a=r.drive=r.drive||{};let i=null===(n=r.proxy)||void 0===n?void 0:n.drive;if((null==i?void 0:i.hash)||ne.createRandomHash("drive"),!i.hash)return a.proxy=i,o.onAccountCacheReady((()=>{Vn.fire()})),o.onAccountReady((()=>{Yn.fire()})),{channel:"",onDriveCacheReady:Vn.reg,onDriveReady:Yn.reg,onDisconnect:Gn.reg,onReconnect:Jn.reg};throw new Error("NOT IMPLEMENTED")}};var Wn,zn=o(Object.freeze({__proto__:null,Drive:qn})),Qn={exports:{}};function Xn(){return Wn||(Wn=1,function(e){(()=>{const n=(e,n,t={},r={},o)=>{var a={setCustomize:e=>{t=e.Messages,r=e.AppConfig}},i=r.degradedLimit||8,s=function(e,n){n.degraded||n.clients.forEach((function(t){var r=e.clients[t];if(r){var o={id:r.id,cursor:r.cursor};n.sendMsg(JSON.stringify(o))}}))},c=function(e,n,t){var r=n.members;t.degraded=r.length-1>=i,e.emit("DEGRADED",{degraded:t.degraded},t.clients)},u=function(e,n,t,r){var a=n.channel,i=n.secret;i.keys.cryptKey&&(i.keys.cryptKey=function(e){for(var n=Object.keys(e).length,t=new Uint8Array(n),r=0;r{const n=(e={},n,t,r,o,a,i,s,c,u,f)=>{var l={setCustomize:n=>{e=n.ApiConfig}},d=s.Nacl,h=function(e,n,t,r){let o=Object.keys(e.clients).filter((t=>Boolean(e.clients[t].admin)===n));o.length&&e.emit(t,{channel:r},[o])},p=function(t,r,o,a){var i=n.mkAsync(a);if(r&&!t.adminRdyEvt)return void i("EFORBIDDEN");let s=e.httpUnsafeOrigin;n.fetchApi(s,"config",!0,(e=>{t.moderatorKeys=e.moderatorKeys,t.adminKeys=e.adminKeys;var a=e.supportMailboxKey;if(a){if(!r||n.find(t.store.proxy,["mailboxes","supportteam","keys","curvePublic"])===a)return r?t.adminRdyEvt.reg((()=>{i(null,{supportKey:a,myCurve:o.adminCurvePrivate||n.find(t.store.proxy,["mailboxes","supportteam","keys","curvePrivate"]),theirPublic:o.curvePublic,notifKey:o.curvePublic})})):void i(null,{supportKey:a,myCurve:t.store.proxy.curvePrivate,theirPublic:o.curvePublic||a,notifKey:a});i("EFORBIDDEN")}else i("E_NOT_INIT")}))},v=function(e,t,r,o){var a,c,u=n.once(n.mkAsync(o));i((n=>{p(e,r,t,n(((e,t)=>{if(e)return n.abort(),void u({error:e});a=t.theirPublic,c=t.myCurve})))})).nThen((()=>{var r,o=s.Curve.deriveKeys(a,c),i=s.Curve.createEncryptor(o),l={network:e.store.network,channel:t.channel,noChainPad:!0,crypto:i,owners:[]},d=[];u=n.both((function(){r&&"function"==typeof r.stop&&r.stop()}),u),l.onMessage=function(e,n,t,r,o,a,i){var s=i&&i.time;try{e=JSON.parse(e)}catch(e){return void console.error(e)}e.time=s,a&&(e.author=a),d.push(e)},l.onError=u,l.onChannelError=u,l.onReady=function(){u(null,d)},r=f.start(l)}))},y=function(e,r,o,a){var c=n.find(e,["store","mailbox"]),u=n.find(e,["store","anon_rpc"]);if(c)if(u){var f,l,d,h=r.channel,v=r.title,y=r.ticket,m=+new Date;i((n=>{p(e,o,r,n(((e,t)=>{if(e)return n.abort(),void a({error:e});f=t.supportKey,l=t.theirPublic,d=t.myCurve})))})).nThen((e=>{var n=s.Curve.deriveKeys(l,d),t=s.Curve.createEncryptor(n),r=JSON.stringify(y),o=t.encrypt(r);u.send("WRITE_PRIVATE_MESSAGE",[h,o],e(((n,t)=>{if(n)return e.abort(),void a({error:n});m=t&&t[0]})))})).nThen((n=>{if(o){var t=e.adminDoc.proxy.tickets.active;if(t[h])return n.abort(),void a({error:"EEXISTS"});t[h]={title:y.title,restored:y.legacy,premium:!1,time:m,author:r.name,supportKey:f,lastAdmin:!0,authorKey:r.curvePublic,notifications:r.notifications}}})).nThen((n=>{o||(e.supportData[h]={time:+new Date,title:v,curvePublic:f},e.Store.onSync(null,n()))})).nThen((()=>{var i=o?r.notifications:t.getChannelIdFromKey(f);c.sendTo("NEW_TICKET",{title:v,channel:h,time:m,isAdmin:o,supportKey:f,premium:o?"":n.find(e,["store","account","plan"]),user:n.find(r.ticket,["sender","curvePublic"])?void 0:{supportTeam:!0}},{channel:i,curvePublic:l},(n=>{console.error(n),n&&n.error&&delete e.supportData[h],a(n)})),c.sendTo("NOTIF_TICKET",{title:v,channel:h,time:m,isAdmin:o,isNewTicket:!0,user:n.find(r.ticket,["sender","curvePublic"])?void 0:{supportTeam:!0}},{channel:i,curvePublic:l},(()=>{}))}))}else a({error:"anonymous rpc session not ready"});else a({error:"E_NOT_READY"})},m=function(e,r,o,a){var c,u,f,l,d=n.find(e,["store","mailbox"]),h=n.find(e,["store","anon_rpc"]);d?h?r?.ticket?i((n=>{p(e,o,r,n(((e,t)=>{if(e)return n.abort(),void a(e);c=t.theirPublic,u=t.myCurve,f=t.notifKey})))})).nThen((e=>{var n=s.Curve.deriveKeys(c,u),t=s.Curve.createEncryptor(n),o=JSON.stringify(r.ticket),i=t.encrypt(o);h.send("WRITE_PRIVATE_MESSAGE",[r.channel,i],e(((n,t)=>{if(n)return e.abort(),void a(n);l=t&&t[0],a(void 0,l)})))})).nThen((()=>{var e=o?r.notifChannel:t.getChannelIdFromKey(f);e&&d.sendTo("NOTIF_TICKET",{isAdmin:o,title:r.ticket.title,isClose:r.ticket.close,channel:r.channel,time:l,user:n.find(r.ticket,["sender","curvePublic"])?void 0:{supportTeam:!0}},{channel:e,curvePublic:f},(()=>{}))})):a("E_NO_DATA"):a("anonymous rpc session not ready"):a("E_NOT_READY")},g=function(e,r,o){var a=t.getSecrets("support",r),i={data:{},channel:a.channel,crypto:s.createEncryptor(a.keys),userName:"support",ChainPad:u,classic:!0,network:e.store.network,metadata:{validateKey:a.keys.validateKey||void 0}},f=e.adminDoc=c.create(i);f.proxy.on("ready",(function(){var r=f.proxy;if(r.tickets=r.tickets||{},r.tickets.active=r.tickets.active||{},r.tickets.closed=r.tickets.closed||{},r.tickets.pending=r.tickets.pending||{},e.adminRdyEvt.fire(),o(),!e.supportRpc)return;let a=function(e){if(!e.adminDoc||!e.supportRpc)return;let t=e.adminDoc.metadata&&e.adminDoc.metadata.channel,r=e.adminDoc.proxy.tickets,o=[t,...Object.keys(r.active),...Object.keys(r.pending),...Object.keys(r.closed)];return n.deduplicateString(o).sort()}(e),i=t.hashChannelList(a);e.supportRpc.getServerHash((function(n,t){n?console.warn(n):t!==i&&e.supportRpc.reset(a,(function(e){e&&console.warn(e)}))}))})),f.proxy.on("change",["recorded"],(function(){h(e,!0,"RECORDED_CHANGE","")})),f.proxy.on("remove",["recorded"],(function(){h(e,!0,"RECORDED_CHANGE","")}))},E=function(e,r,a){let s=a(),c=e.store.proxy,u=n.find(c,["mailboxes","supportteam","keys","curvePublic"]),f=n.find(c,["mailboxes","supportteam","keys","curvePrivate"]);r||(e.adminRdyEvt=n.mkEvent(!0)),i((n=>{p(e,!1,{},n(((t,r)=>{if(setTimeout(s),t)n.abort();else if(r.theirPublic!==u){try{delete c.mailboxes.supportteam,e.store.mailbox.close("supportteam")}catch(e){}return delete e.adminRdyEvt,void n.abort()}})))})).nThen((t=>{!function(e,t){let r,a,i=n.mkAsync(t),s=e.store.proxy,c=n.find(s,["mailboxes","supportteam","keys","curvePrivate"]);if(c){try{let e=d.sign.keyPair.fromSeed(d.util.decodeBase64(c));r=d.util.encodeBase64(e.secretKey),a=d.util.encodeBase64(e.publicKey)}catch(e){return void i(e)}o.create(e.store.network,{edPublic:a,edPrivate:r},((n,t)=>{n?i(n):(console.log("Support RPC ready, public key is ",a),e.supportRpc=t,i())}))}else i("EFORBIDDEN")}(e,t((e=>{e&&console.error("Support RPC not ready",e)})))})).nThen((n=>{let r=f.slice(0,24),o=t.getEditHashFromKeys({version:2,type:"support",keys:{editKeyStr:r}});g(e,o,n())})).nThen((()=>{console.log("Support admin loaded")}))};var b=function(e,t,r,o){let a=e.store.proxy,i=n.find(a,["mailboxes","supportadmin"]);i?e.store.mailbox.open("supportadmin",i,(function(t){e.store.mailbox.close("supportadmin",(function(){}));let r=n.clone(t||{}),a=[];Object.keys(r).forEach((n=>{let t=r[n];if("CLOSE"===t.type)return void(a.includes(t.content.id)||a.push(t.content.id));let o=t.author,i=t.content&&t.content.title;((e,n,t)=>{let r=e.adminDoc.proxy;return["active","pending","closed"].some((e=>{let o=r.tickets[e];return Object.keys(o).some((e=>{let r=o[e];return r.authorKey===n&&r.title===t&&r.restored}))}))})(e,o,i)&&(a.includes(t.content.id)||a.push(t.content.id))})),Object.keys(r).forEach((e=>{let n=r[e];n.content&&a.includes(n.content.id)&&delete r[e]})),o(r)}),!0,{dump:!0}):o({error:"ENOENT"})};let O=(e,n,t,r)=>{let o;try{let e=d.sign.keyPair.fromSeed(d.util.decodeBase64(t));o=d.util.encodeBase64(e.publicKey)}catch(e){return void r(e)}e.Store.adminRpc(null,{cmd:"ADMIN_DECREE",data:["SET_SUPPORT_KEYS",[n,o]]},r)},A=(e,n,t,r)=>{e.Store.adminRpc(null,{cmd:"GET_MODERATORS",data:{}},r)};return l.init=function(o,s,c){var u={};if(o.store&&o.store.modules&&o.store.modules.support)return o.store.modules.support;var f=o.store,l=f.proxy.support=f.proxy.support||{},g={moderatorKeys:e.moderatorKeys,adminKeys:e.adminKeys,supportData:l,store:o.store,Store:o.Store,emit:c,clients:{}};return n.find(f,["proxy","mailboxes","supportteam"])&&E(g,!1,s),u.ctx=g,u.removeClient=function(e){delete g.clients[e]},u.leavePad=function(){},u.addAdminTicket=function(e,n){!function(e,n,t){e.adminRdyEvt?e.adminRdyEvt.reg((()=>{let o;i((r=>{p(e,!0,n,r(((e,n)=>{if(e)return r.abort(),void t(!0);o=n.supportKey})))})).nThen((()=>{var a=Math.floor(2e3*Math.random());setTimeout((()=>{var a=e.adminDoc.proxy;a.tickets.active[n.channel]||a.tickets.closed[n.channel]||a.tickets.pending[n.channel]?t(!0):(a.tickets.active[n.channel]={title:n.title,premium:n.premium,time:n.time,author:n.user&&n.user.displayName,supportKey:n.supportKey||o,authorKey:n.user&&n.user.curvePublic},r.whenRealtimeSyncs(e.adminDoc.realtime,(function(){t(!0)})),h(e,!0,"NEW_TICKET",n.channel),e.supportRpc&&e.supportRpc.pin([n.channel],(()=>{})))}),a)}))})):t(!0)}(g,e,n)},u.updateAdminTicket=function(e){!function(e,n){e.adminRdyEvt&&e.adminRdyEvt.reg((()=>{var t=Math.floor(2e3*Math.random());setTimeout((()=>{var t=e.adminDoc.proxy;let r=t.tickets.active[n.channel]||t.tickets.pending[n.channel];r&&(n.time<=r.time||(n.isClose&&(t.tickets.closed[n.channel]=r,delete t.tickets.active[n.channel],delete t.tickets.pending[n.channel]),r.time=n.time,r.lastAdmin=!1,h(e,!0,"UPDATE_TICKET",n.channel)))}),t)}))}(g,e)},u.updateAdminKey=function(e,r){((e,r,o)=>{let a=r.supportKey,s=t.getBoxPublicFromSecret(a),c=e.store.proxy;const u=n.find(c,["mailboxes","supportteam","keys","curvePrivate"]),f=n.find(c,["mailboxes","supportteam","keys","curvePublic"]);p(e,!1,{},((t,r)=>{if(t)return void o(!0);if(s!==r.theirPublic)return void o(!0);if(u===a||f===s)return void o(!0);let c=n.find(e,["store","mailbox"]);try{e.adminDoc&&e.adminDoc.stop(),c&&c.close("supportteam"),e.supportRpc&&e.supportRpc.destroy(),e.adminRdyEvt=n.mkEvent(!0)}catch(e){console.error(e)}e.Store.addAdminMailbox(null,{version:2,priv:a},(n=>{n&&n.error?o(!0):i((n=>{E(e,!0,n),e.adminRdyEvt.reg((()=>{h(e,!0,"UPDATE_RIGHTS"),o(!1)}))}))}))}))})(g,e,r)},u.checkAdminTicket=function(e,n){!function(e,n,t){e.adminRdyEvt?e.adminRdyEvt.reg((()=>{let r=e.adminDoc.proxy,o=r.tickets.active[n.channel]||r.tickets.pending[n.channel];t(o)})):t(!0)}(g,e,n)},u.addUserTicket=function(e,n){!function(e,n,t){if(!e.supportData)return void t(!0);let r=n.channel;e.supportData[r]={time:n.time,title:n.title,curvePublic:n.supportKey},e.Store.onSync(null,(function(){t(!0)}))}(g,e,n)},u.updateUserTicket=function(e){!function(e,n){if(h(e,!1,"UPDATE_TICKET",n.channel),n.isClose){let t=e.supportData[n.channel];if(!t)return;t.closed=!0}}(g,e)},u.execCommand=function(e,o,s){var c=o.cmd,u=o.data;"MAKE_TICKET"!==c?"GET_MY_TICKETS"!==c?"REPLY_TICKET"!==c?"CLOSE_TICKET"!==c?"DELETE_TICKET"!==c?"MAKE_TICKET_ADMIN"!==c?"LIST_TICKETS_ADMIN"!==c?"LOAD_TICKET_ADMIN"!==c?"REPLY_TICKET_ADMIN"!==c?"CLOSE_TICKET_ADMIN"!==c?"MOVE_TICKET_ADMIN"!==c?"GET_RECORDED"!==c?"SET_RECORDED"!==c?"USE_RECORDED"!==c?"SEARCH_ADMIN"!==c?"FILTER_TAGS_ADMIN"!==c?"SET_TAGS_ADMIN"!==c?"GET_LEGACY"!==c?"DUMP_LEGACY"!==c?"CLEAR_LEGACY"!==c?"RESTORE_LEGACY"!==c?"GET_PRIVATE_KEY"!==c?"DISABLE_SUPPORT"!==c?"ROTATE_KEYS"!==c?"ADD_MODERATOR"!==c?s({error:"NOT_SUPPORTED"}):function(e,t,r,o){let a=e.store.proxy;var i=n.find(e,["store","mailbox"]);let s=n.find(a,["mailboxes","supportteam","keys","curvePublic"]),c=n.find(a,["mailboxes","supportteam","keys","curvePrivate"]),u=n.find(a,["mailboxes","supportteam","lastKnownHash"]),f=a.edPublic;p(e,!1,{},((n,r)=>{n?o({error:n}):r.theirPublic===s&&e.moderatorKeys.includes(f)?i.sendTo("ADD_MODERATOR",{supportKey:c,lastKnownHash:u},{channel:t.mailbox,curvePublic:t.curvePublic},(()=>{o()})):o({error:"EFORBIDDEN"})}))}(g,u,0,s):function(e,r,o,s){let c,u=n.once(n.mkAsync(s)),f=e.store.proxy,l=f.edPublic;const h=d.box.keyPair(),v=d.util.encodeBase64(h.publicKey),y=d.util.encodeBase64(h.secretKey),m=n.find(f,["mailboxes","supportteam","keys","curvePrivate"]),g=n.find(f,["mailboxes","supportteam","keys","curvePublic"]);if(!y||!v)return void u({error:"INVALID_KEY"});let b;i((n=>{p(e,!1,{},n(((e,t)=>{if("E_NOT_INIT"!==e)return e?(u({error:e}),void n.abort()):void(c=t.theirPublic)})))})).nThen((n=>{if(!e.adminKeys.includes(l))return n.abort(),void u({error:"EFORBIDDEN"})})).nThen((n=>{if(c)return e.moderatorKeys.includes(l)?g!==c?(n.abort(),void u({error:"EFORBIDDEN"})):void 0:(n.abort(),void u({error:"EINVAL"}))})).nThen((n=>{c&&e.adminRdyEvt.reg((()=>{let r=e.adminDoc.proxy;b=e.adminDoc.metadata&&e.adminDoc.metadata.channel;let o=y.slice(0,24),i=t.getEditHashFromKeys({version:2,type:"support",keys:{editKeyStr:o}}),s={network:e.store.network,initialState:"{}"};(r.oldKeys=r.oldKeys||{})[g]={curvePrivate:m,rotatedOn:+new Date,rotatedBy:l},a.put(i,JSON.stringify(r),n((e=>{if(e)return n.abort(),void u({error:e})})),s)}))})).nThen((n=>{O(e,v,y,n((e=>{if(e&&e.error)return n.abort(),void u(e)})))})).nThen((()=>{if(!c)return;e.adminDoc&&e.adminDoc.stop();let t=n.find(e,["store","mailbox"]);t&&t.close("supportteam"),e.supportRpc&&e.supportRpc.destroy(),e.adminRdyEvt=n.mkEvent(!0)})).nThen((n=>{e.Store.addAdminMailbox(null,{version:2,priv:y},n((t=>{if(t&&t.error)return n.abort(),c?O(e,g,m,(()=>{u(t)})):void u(t)})))})).nThen((t=>{if(!c)return;let r=n.find(e,["store","mailbox"]);A(e,0,0,t((e=>{if(e&&e.error)return void u({success:!0,noNotify:!0});let n=e&&e[0];Object.keys(n||{}).forEach((e=>{let t=n[e];r.sendTo("MODERATOR_NEW_KEY",{supportKey:y},{channel:t.mailbox,curvePublic:t.curvePublic},(()=>{}))}))})))})).nThen((n=>{E(e,!0,n)})).nThen((n=>{b&&e.Store.adminRpc(null,{cmd:"ARCHIVE_DOCUMENT",data:{id:b,reason:"Deprecated support pad"}},n())})).nThen((()=>{u({success:!0})}))}(g,0,0,s):function(e,t,r,o){let a,s=n.once(n.mkAsync(o)),c=e.store.proxy.edPublic;i((n=>{p(e,!1,{},n((e=>{if(e)return s({error:e}),void n.abort()})))})).nThen((n=>{if(!e.adminKeys.includes(c))return n.abort(),void s({error:"EFORBIDDEN"})})).nThen((n=>{e.Store.adminRpc(null,{cmd:"ARCHIVE_SUPPORT",data:{}},n((e=>{if(e&&e.error)return n.abort(),void s(e)})))})).nThen((n=>{e.Store.adminRpc(null,{cmd:"ADMIN_DECREE",data:["SET_SUPPORT_KEYS",["",""]]},n((function(e){if(e&&e.error)return n.abort(),void s(e)})))})).nThen((n=>{A(e,0,0,n((e=>{if(!e||e.error)return n.abort(),void s();a=e[0]||{}})))})).nThen((()=>{let n=i;Object.keys(a).forEach((t=>{n=n((n=>{e.Store.adminRpc(null,{cmd:"REMOVE_MODERATOR",data:t},n((e=>{e&&e.error&&console.error("Error removing moderator data",t,e.error)})))})).nThen})),n((()=>{s()}))}))}(g,0,0,s):function(e,t,r,o){let a=e.store.proxy,i=n.find(a,["mailboxes","supportteam","keys","curvePublic"]),s=n.find(a,["mailboxes","supportteam","keys","curvePrivate"]);p(e,!1,{},((e,n)=>{e?o({error:e}):(i&&n.theirPublic!==i&&(s=void 0),o({curvePrivate:s,curvePublic:n.theirPublic}))}))}(g,0,0,s):function(e,r,o,a){let i=e.store.proxy,s=n.find(i,["mailboxes","supportadmin"]);if(!s)return void a({error:"ENOENT"});if(!e.adminRdyEvt)return void a({error:"EFORBIDDEN"});let c=r.messages,u=r.hashes,f=c[0],l=c[c.length-1];f?e.adminRdyEvt.reg((()=>{let r={name:n.find(f,["sender","name"]),notifications:n.find(f,["sender","notifications"]),curvePublic:n.find(f,["sender","curvePublic"]),channel:t.createChannelId(),title:f.title,time:l.time,ticket:{legacy:!0,title:f.title,sender:f.sender,messages:c}};y(e,r,!0,(n=>{n&&n.error?a(n):(u.forEach((e=>{s.viewed.push(e)})),e.Store.onSync(null,(function(){a({done:!0})})))}))})):a({error:"EINVAL"})}(g,u,0,s):function(e,n,t,r){let o=e.store.proxy;e.store.mailbox.close("supportadmin",(function(){delete o.mailboxes.supportadmin,e.Store.onSync(null,(function(){r({done:!0})}))}))}(g,0,0,s):function(e,t,r,o){let a=e.store.proxy,i=n.find(a,["mailboxes","supportadmin"]);if(!i)return void o({error:"ENOENT"});let s=n.clone(i);s.lastKnownHash=void 0,s.viewed=[],e.store.mailbox.open("supportadmin",s,(function(n){e.store.mailbox.close("supportadmin",(function(){})),o(n)}),!0,{dump:!0})}(g,0,0,s):b(g,0,0,s):((e,n,t,o)=>{e.adminRdyEvt?e.adminRdyEvt.reg((()=>{let t=e.adminDoc.proxy.tickets,a=n.channel;(t.active[a]||t.pending[a]||t.closed[a]).tags=n.tags||[],r.whenRealtimeSyncs(e.adminDoc.realtime,(function(){let e=[];["active","pending","closed"].forEach((n=>{let r=t[n];Object.keys(r).forEach((n=>{(r[n].tags||[]).forEach((n=>{e.includes(n)||e.push(n)}))}))})),o({done:!0,allTags:e})}))})):o({error:"EFORBIDDEN"})})(g,u,0,s):((e,n,t,r)=>{if(!e.adminRdyEvt)return void r({error:"EFORBIDDEN"});let o=n.tags||[];e.adminRdyEvt.reg((()=>{let n=e.adminDoc.proxy.tickets;if(!o.length)return void r({all:!0});let t=[];["active","pending","closed"].forEach((e=>{let r=n[e];Object.keys(r).forEach((e=>{(r[e].tags||[]).some((e=>o.includes(e)))||t.push(e)}))})),r({tickets:t})}))})(g,u,0,s):((e,t,r,o)=>{if(!e.adminRdyEvt)return void o({error:"EFORBIDDEN"});let a=t.tags||[],i=(t.text||"").toLowerCase();e.adminRdyEvt.reg((()=>{let t=e.adminDoc.proxy.tickets,r={},s=(e,t,o)=>{let a=n.clone(t);a.category=o,r[e]=a};["active","pending","closed"].some((e=>{let o=t[e];return Object.keys(o).some((t=>{let c=o[t];if(a.length&&!(c.tags||[]).some((e=>a.includes(e))))return;let u=n.hexToBase64(t).slice(0,10);if(i===u)return r={},s(t,c,e),!0;(!i||c.title.toLowerCase().includes(i))&&s(t,c,e)}))})),o({tickets:r})}))})(g,u,0,s):function(e,n,t,r){if(!e.adminRdyEvt)return void r({error:"EFORBIDDEN"});let o=n.id;e.adminRdyEvt.reg((()=>{let n=e.adminDoc.proxy,t=(n.recorded=n.recorded||{})[o];t&&(t.count=(t.count||0)+1),r()}))}(g,u,0,s):function(e,n,t,o){if(!e.adminRdyEvt)return void o({error:"EFORBIDDEN"});let a=n.id,i=n.content,s=Boolean(n.remove);e.adminRdyEvt.reg((()=>{let n=e.adminDoc.proxy,t=n.recorded=n.recorded||{};s?delete t[a]:t[a]={content:i,count:0},r.whenRealtimeSyncs(e.adminDoc.realtime,(function(){o({done:!0})}))}))}(g,u,0,s):function(e,t,r,o){e.adminRdyEvt?e.adminRdyEvt.reg((()=>{let t=e.adminDoc.proxy,r=t.recorded=t.recorded||{};o({messages:n.clone(r)})})):o({error:"EFORBIDDEN"})}(g,0,0,s):function(e,n,t,o){if(!e.adminRdyEvt)return void o({error:"EFORBIDDEN"});let a=n.channel,i=n.from,s=n.to;e.adminRdyEvt.reg((()=>{let n=e.adminDoc.proxy,t=n.tickets[i],c=n.tickets[s];if(!i||!s)return void o({error:"EINVAL"});let u=t[a];u&&!c[a]?(c[a]=u,delete t[a],r.whenRealtimeSyncs(e.adminDoc.realtime,(function(){o({moved:!0})}))):o({error:"CANT_MOVE"})}))}(g,u,0,s):function(e,n,t,o){if(!e.adminRdyEvt)return void o({error:"EFORBIDDEN"});let a=n.supportKey;e.adminRdyEvt.reg((()=>{let t=e.adminDoc.proxy;t.oldKeys&&t.oldKeys[a]&&(n.adminCurvePrivate=t.oldKeys[a].curvePrivate),m(e,n,!0,(t=>{if(t)o({error:t});else{var a=e.adminDoc.proxy,i=a.tickets.active[n.channel]||a.tickets.pending[n.channel];i.time=+new Date,i.lastAdmin=!0,a.tickets.closed[n.channel]=i,delete a.tickets.active[n.channel],delete a.tickets.pending[n.channel],r.whenRealtimeSyncs(e.adminDoc.realtime,(function(){o({closed:!0})}))}}))}))}(g,u,0,s):function(e,n,t,r){if(!e.adminRdyEvt)return void r({error:"EFORBIDDEN"});let o=n.supportKey;e.adminRdyEvt.reg((()=>{let t=e.adminDoc.proxy;t.oldKeys&&t.oldKeys[o]&&(n.adminCurvePrivate=t.oldKeys[o].curvePrivate),m(e,n,!0,((t,o)=>{if(t)r({error:t});else{var a=e.adminDoc.proxy,i=a.tickets.active[n.channel]||a.tickets.pending[n.channel];i.time=o,i.lastAdmin=!0,r({sent:!0})}}))}))}(g,u,0,s):function(e,t,r,o){let a=t.supportKey;e.adminRdyEvt.reg((()=>{let r=e.adminDoc.proxy;r.oldKeys&&r.oldKeys[a]&&(t.adminCurvePrivate=r.oldKeys[a].curvePrivate),v(e,t,!0,(function(r,a){if(r)return void o({error:r});var i=e.adminDoc.proxy;if(!Array.isArray(a)||!a.length)return void o(a);a.sort(((e,n)=>e.time-n.time));let s=a[a.length-1],c=a.some((e=>{let r=n.find(e,["sender","curvePublic"]);if(t.curvePublic===r)return n.find(e,["sender","quota","plan"])}));var u=i.tickets.active[t.channel];u&&(s.legacy&&(s=Array.isArray(s.messages)&&s.messages[s.messages.length-1]),u.time=s.time,u.premium=c,s.sender&&(u.lastAdmin=!s.sender.blockLocation),s.close&&(i.tickets.closed[t.channel]=u,delete i.tickets.active[t.channel],h(e,!0,"UPDATE_TICKET",t.channel))),o(a)}))}))}(g,u,0,s):function(e,t,r,o){e.adminRdyEvt?(e.clients[r]||(e.clients[r]={admin:!0}),e.adminRdyEvt.reg((()=>{var r=e.adminDoc.proxy;return"pending"===t.type?o(n.clone(r.tickets.pending)):"closed"===t.type?o(n.clone(r.tickets.closed)):void o(n.clone(r.tickets.active))}))):o({error:"EFORBIDDEN"})}(g,u,e,s):function(e,n,t,r){e.adminRdyEvt?e.adminRdyEvt.reg((()=>{y(e,n,!0,r)})):r({error:"EFORBIDDEN"})}(g,u,0,s):function(e,n,t,r){let o=e.supportData,a=n.channel;o[a]&&o[a].closed?(delete o[a],r({deleted:!0})):r({error:"ENOTCLOSED"})}(g,u,0,s):function(e,n,t,r){m(e,n,!1,(e=>{r(e?{error:e}:{closed:!0})}))}(g,u,0,s):function(e,n,t,r){m(e,n,!1,(e=>{r(e?{error:e}:{sent:!0})}))}(g,u,0,s):function(e,t,r,o){var a=[],s=i;e.clients[r]||(e.clients[r]={admin:!1}),Object.keys(e.supportData).forEach((function(t){s=s((r=>{var o=n.clone(e.supportData[t]);v(e,{channel:t,curvePublic:o.curvePublic},!1,r(((n,r)=>{if(n){if("EDELETED"===n.type)return void delete e.supportData[t];o.error=n}else o.messages=r,r.length&&r[r.length-1].close&&(e.supportData[t].closed=!0,o.closed=!0);o.id=t,a.push(o)})))})).nThen})),s((()=>{a.sort(((e,n)=>e.closed&&n.closed?e.time-n.time:e.closed?1:n.closed?-1:e.time-n.time)),o({tickets:a})}))}(g,0,e,s):function(e,n,t,r){y(e,n,!1,r)}(g,u,0,s)},u},l};e.exports&&(e.exports=n(void 0,q(),Z(),Me(),Sn(),xn(),Ve(),C(),g(),w(),y()))})()}($n)),$n.exports}var nt,tt={exports:{}};function rt(){return nt||(nt=1,function(e){(()=>{const n=e=>{var n={},t=function(n,t,r,o){var a=t.channel,i=t.secret;i.keys.cryptKey&&(i.keys.cryptKey=function(e){for(var n=Object.keys(e).length,t=new Uint8Array(n),r=0;r{const n=()=>{var e={},n=function(e,n,t){var r=e.clients[n];if(r){var o=e.channels[r.channel];o?(t(),o.history.forEach((function(t){e.emit("MESSAGE",{msg:t,validateKey:o.validateKey},[n])})),e.emit("HISTORY_SYNCED",{},[n])):t({error:"ENOCHAN"})}else t({error:"ENOENT"})};return e.init=function(e,t){var r={},o={store:e,emit:t,channels:{},clients:{}};return r.removeClient=function(e){!function(e,n){var t,r=function(e){return e!==n};for(var o in e.channels)(t=e.channels[o]).clients=t.clients.filter(r),0===t.clients.length&&(t.wc&&t.wc.leave(),delete e.channels[o]);if(e.clients[n]){var a=e.clients[n].channel,i=e.channels[a];i&&e.emit("LEAVE",{id:n},[i.clients[0]]),delete e.clients[n]}}(o,e)},r.leavePad=function(e){!function(e,n){Object.keys(e.channels).some((function(t){var r=e.channels[t];if(r.padChan===n)return r.wc&&r.wc.leave(),delete e.channels[t],!0}))}(o,e)},r.execCommand=function(e,t,r){var a=t.cmd,i=t.data;"SEND_MESSAGE"!==a?"UPDATE_HASH"!==a?"OPEN_CHANNEL"!==a?"GET_HISTORY"!==a?"REENCRYPT"!==a||function(e,n,t,r){var o=n.channel,a=e.store.network,i=function(e){var t=a.historyKeeper,o={metadata:n.metadata},i=["GET_HISTORY",e.id,o];a.sendto(t,JSON.stringify(i)),n.msgs.forEach((function(n){e.bcast(n)})),e.leave(),r()};e.store.anon_rpc.send("IS_NEW_CHANNEL",o,(function(e,n){var t;e?r({error:e}):(n&&n.length&&"object"==typeof n[0]?t=n[0].isNew:r({error:"INVALID_RESPONSE"}),t?a.join(o).then(i,(function(e){r({error:e})})):r({error:"EEXISTS"}))}))}(o,i,0,r):n(o,e,r):function(e,t,r,o){var a=t.channel,i=t.padChan,s=e.store.network,c=!0,u=e.clients[r];if(u)o();else{u=e.clients[r]={channel:a};var f=e.channels[a];if(f)return u.id||(u.id=f.wc.myID+"-"+r),n(e,r,(function(){e.emit("READY",f.clients,[r])})),f.clients.push(r),void o();var l=Math.floor(1e6*Math.random()),d=function(n){e.channels[a]=e.channels[a]||{history:[],validateKey:t.validateKey},(f=e.channels[a]).padChan=i,u.id||(u.id=n.myID+"-"+r),f.clients&&f.clients.forEach((function(t){e.clients[t]&&(e.clients[t].id=n.myID+"-"+t)})),n.on("join",(function(){})),n.on("leave",(function(){})),n.on("message",(function(n){f.history.push(n),e.emit("MESSAGE",{msg:n,validateKey:f.validateKey},f.clients)})),f.wc=n,f.sendMsg=function(e,t){t=t||function(){};var r=e.slice(0,64);n.bcast(e).then((function(){f.history.push(e),f.lastKnownHash=r,t()}),(function(e){t({error:e})}))},c&&(f.clients=[r],f.lastCpHash=t.lastCpHash,c=!1,o());var d=s.historyKeeper,h={txid:l,lastKnownHash:f.lastKnownHash||f.lastCpHash,metadata:{validateKey:t.validateKey,owners:t.owners,expire:t.expire}},p=["GET_HISTORY",n.id,h];d&&s.sendto(d,JSON.stringify(p)).then((function(){}),(function(e){console.error(e)}))};s.on("message",(function(n,t){if(e.channels[a]&&t===s.historyKeeper){var r;try{r=JSON.parse(n)}catch(e){}if(r&&!(r.txid&&r.txid!==l||r.channel&&r.channel!==a))if(r.validateKey&&r.channel)f.validateKey||(f.validateKey=r.validateKey);else if(r.state&&1===r.state&&r.channel)e.emit("READY",f.clients,f.clients);else if(!(r.error&&r.channel||Array.isArray(r)&&r[0]&&r[0]!==l||(n=r[4],r[3]!==a))){var o=n.slice(0,64);o!==f.lastKnownHash&&o!==f.lastCpHash&&(f.lastKnownHash=o,e.emit("MESSAGE",{msg:n},f.clients),f.history.push(n))}}})),s.join(a).then(d,(function(e){o({error:e})})),s.on("reconnect",(function(){e.channels[a]&&s.join(a).then(d,(function(e){console.error(e)}))}))}}(o,i,e,r):function(e,n,t,r){var o=e.clients[t];if(o){var a=e.channels[o.channel];if(a){var i=n,s=-1;a.history.some((function(e,n){if(e.slice(0,64)===i)return s=n+1,!0})),-1!==s&&(a.history=a.history.slice(s)),r()}else r({error:"INVALID_CHANNEL"})}else r({error:"NOT_IN_CHANNEL"})}(o,i,e,r):function(e,n,t,r){var o=e.clients[t];if(o){var a=e.channels[o.channel];if(a){var i=function(o){o&&o.error?r(o):(e.emit("MESSAGE",{msg:n.msg},a.clients.filter((function(e){return e!==t}))),r())};n.isCp?a.sendMsg(n.isCp,i):a.sendMsg(n.msg,i)}else r({error:"INVALID_CHANNEL"})}else r({error:"NOT_IN_CHANNEL"})}(o,i,e,r)},r},e};e.exports&&(e.exports=n())})()}(at)),at.exports}var st,ct={exports:{}};function ut(){return st||(st=1,function(e){(()=>{const n=(e,n,t,r,o,a,i)=>{var s={};return s.init=function(s,c,u){var f={},l=s.store;if(l.loggedIn&&l.proxy.edPublic){var d={store:l,pinPads:s.pinPads,updateMetadata:s.updateMetadata,emit:u,onReadyHandlers:[],clients:[]};return d.profile=l.proxy.profile=l.proxy.profile||{},function(e,t){var r=e.profile;if(r.edit&&r.view)setTimeout(t);else{var o=n.createRandomHash("profile"),a=n.getSecrets("profile",o);e.pinPads([a.channel],(function(e){e.error?t(e.error):(r.edit=n.getEditHashFromKeys(a),r.view=n.getViewHashFromKeys(a),setTimeout(t))}))}}(d,c((function(r){r||function(r){var s=r.profile,c=n.getSecrets("profile",s.edit),u=a.createEncryptor(c.keys),f={data:{},network:r.store.network,channel:c.channel,crypto:u,owners:[r.store.proxy.edPublic],ChainPad:i,validateKey:c.keys.validateKey||void 0,userName:"profile",classic:!0},l=o.create(f);l.proxy.on("create",(function(){})).on("ready",(function(){l.proxy.name=r.store.proxy[t.displayNameKey]||"",r.listmap=l,l.proxy.curvePublic||(l.proxy.curvePublic=r.store.proxy.curvePublic),l.proxy.notifications||(l.proxy.notifications=e.find(r.store.proxy,["mailboxes","notifications","channel"])),l.proxy.edPublic||(l.proxy.edPublic=r.store.proxy.edPublic),r.onReadyHandlers.length&&(r.onReadyHandlers.forEach((function(e){try{e(l.proxy)}catch(e){console.error(e)}})),r.onReadyHandlers=[])})).on("change",[],(function(){r.emit("UPDATE",l.proxy,r.clients)}))}(d)}))),f.setName=function(e){!function(e,n){e.listmap.proxy.name=n,r.whenRealtimeSyncs(e.listmap.realtime,(function(){e.listmap&&e.emit("UPDATE",e.listmap.proxy,e.clients)}))}(d,e)},f.removeClient=function(e){!function(e,n){var t=e.clients.indexOf(n);-1!==t&&e.clients.splice(t,1)}(d,e)},f.update=function(){d.listmap&&d.emit("UPDATE",d.listmap.proxy,d.clients)},f.execCommand=function(e,n,t){console.log(n);var o=n.cmd,a=n.data;"SUBSCRIBE"!==o?"SET"!==o||function(e,n,t,o){var a=n.key,i=n.value;a&&(e.listmap.proxy[a]=i,r.whenRealtimeSyncs(e.listmap.realtime,(function(){e.emit("UPDATE",e.listmap.proxy,e.clients.filter((function(e){return e!==t}))),o(e.listmap.proxy)})))}(d,a,e,t):function(e,n,t,r){-1===e.clients.indexOf(t)&&e.clients.push(t),e.listmap?r(e.listmap.proxy):e.onReadyHandlers.push((function(e){r(e)}))}(d,0,e,t)},f}},s};e.exports&&(e.exports=n(q(),Z(),K(),Me(),g(),C(),w()))})()}(ct)),ct.exports}var ft,lt={exports:{}},dt={exports:{}};function ht(){return ft||(ft=1,function(e){e.exports&&(e.exports=function(e,n,t,r,o,a){var i={},s=function(e){return Boolean(e&&"object"==typeof e&&!Array.isArray(e))},c=function(e){return e.slice(0,64)},u=function(n,t){var r=e.find(t,[n,"role"]);return-1!==["OWNER","ADMIN"].indexOf(r)},f=function(n,t,r){var o=e.find(r,[n,"role"]);return!!o&&!!function(e){return-1!==["OWNER","ADMIN","MEMBER","VIEWER"].indexOf(e)}(t)&&("OWNER"===o||"ADMIN"===o&&-1!==["ADMIN","MEMBER","VIEWER"].indexOf(t))},l=function(e){return"string"==typeof e&&44===e.length},d=i.commands={};d.ADD=function(e,n,t){if(!s(e))throw new Error("INVALID ARGS");if(!t.internal.initialized)throw new Error("UNITIALIZED");if(void 0===t.state.members)throw new Error("CANNOT_ADD_TO_UNITIALIZED_ROSTER");var r=t.state.members;Object.keys(e).forEach((function(t){if(!l(t))throw console.log(t,t.length),new Error("INVALID_CURVE_KEY");if(!s(e[t]))throw new Error("INVALID_CONTENT");if(r[t])throw new Error("ALREADY_PRESENT");var o=e[t];if("string"!=typeof o.role&&(o.role="MEMBER"),!f(n,o.role,r))throw new Error("INSUFFICIENT_PERMISSIONS");if("string"!=typeof o.displayName)throw new Error("DISPLAYNAME_REQUIRED");if("string"!=typeof o.notifications)throw new Error("NOTIFICATIONS_REQUIRED")}));var o=!1;return Object.keys(e).forEach((function(n){o=!0,r[n]=e[n]})),o},d.RM=function(n,t,r){if(!Array.isArray(n))throw new Error("INVALID_ARGS");if(void 0===r.state.members)throw new Error("CANNOT_RM_FROM_UNITIALIZED_ROSTER");var o=r.state.members;n.forEach((function(n){if(!l(n))throw new Error("INVALID_CURVE_KEY");if(n!==t){var r=o[n].role;if(!function(n,t,r){var o=e.find(r,[n,"role"]);return!!o&&("OWNER"===o||"ADMIN"===o&&-1!==["ADMIN","MEMBER","VIEWER"].indexOf(t))}(t,r,o))throw new Error("INSUFFICIENT_PERMISSIONS")}}));var a=!1;return n.forEach((function(e){o[e]&&(a=!0,delete o[e])})),a},d.DESCRIBE=function(n,t,o){if(!n||"object"!=typeof n||Array.isArray(n))throw new Error("INVALID_ARGUMENTS");if(void 0===o.state.members)throw new Error("NOT_READY");var a=o.state.members;Object.keys(n).forEach((function(r){if(!l(r))throw new Error("INVALID_ID");if(!a[r])throw new Error("NOT_PRESENT");if(!function(n,t,r){if(!r[t])return!1;if(n===t&&r[t])return!0;var o=e.find(r,[n,"role"]),a=e.find(r,[t,"role"]);return!!o&&("OWNER"===o||"ADMIN"===o&&"OWNER"!==a)}(t,r,a))throw new Error("INSUFFICIENT_PERMISSIONS");var o=n[r];if(!s(o))throw new Error("INVALID_ARGUMENTS");var i=e.clone(a[r]);if("string"==typeof o.role&&!function(n,t,r,o){return!(n!==t||!o[t])&&("MEMBER"===e.find(o,[n,"role"])?"VIEWER"===r:void 0)}(t,r,o.role,a)&&!f(t,o.role,a))throw new Error("INSUFFICIENT_PERMISSIONS");if("string"!=typeof i.displayName&&"string"!=typeof o.displayName)throw new Error("DISPLAYNAME_REQUIRED");if(-1===["undefined","string"].indexOf(typeof o.displayName))throw new Error("INVALID_DISPLAYNAME");if("string"!=typeof i.notifications&&"string"!=typeof o.notifications)throw new Error("NOTIFICATIONS_REQUIRED");if(-1===["undefined","string"].indexOf(typeof o.notifications))throw new Error("INVALID_NOTIFICATIONS")}));var i=!1;return Object.keys(n).forEach((function(t){var o=e.clone(a[t]),s=n[t];Object.keys(s).forEach((function(e){void 0===o[e]||null!==s[e]?o[e]=s[e]:delete o[e]})),r(o)!==r(a[t])&&(i=!0,a[t]=o)})),i},d.CHECKPOINT=function(e,n,t){if(!s(e))throw new Error("INVALID_CHECKPOINT_STATE");if(!t.internal.initialized){t.state=e;var o=t.state.metadata=t.state.metadata||{};return o.topic=o.topic||"",o.name=o.name||"",o.avatar=o.avatar||"",t.internal.initialized=!0,!0}if(r(e)!==r(t.state))throw new Error("CHECKPOINT_DOES_NOT_MATCH_PREVIOUS_STATE");if(!u(n,t.state.members))throw new Error("INSUFFICIENT_PERMISSIONS");return t.state=e,!0};var h=["avatar","name","topic"];d.METADATA=function(n,t,r){if(!s(n))throw new Error("INVALID_ARGS");if(!function(n,t){var r=e.find(t,[n,"role"]);return Boolean(r&&-1!==["OWNER","ADMIN"].indexOf(r))}(t,r.state.members))throw new Error("INSUFFICIENT_PERMISSIONS");Object.keys(n).forEach((function(e){if(null===n[e]){if(-1===h.indexOf(e))return;throw new Error("CANNOT_REMOVE_MANDATORY_METADATA")}if("string"!=typeof n[e])throw new Error("INVALID_ARGUMENTS")}));var o=!1;return Object.keys(n).forEach((function(e){void 0!==r.state.metadata[e]&&null===n[e]&&(o=!0,delete r.state.metadata[e]),n[e]!==r.state.metadata[e]&&(o=!0,r.state.metadata[e]=n[e])})),o},d.INVITE=function(e,n,t){if(!s(e))throw new Error("INVALID_ARGS");if(!t.internal.initialized)throw new Error("UNINITIALIED");if(void 0===t.state.members)throw new Error("CANNOT+INVITE_TO_UNINITIALIED_ROSTER");var r=t.state.members;Object.keys(e).forEach((function(t){if(!l(t))throw console.log(t,t.length),new Error("INVALID_CURVE_KEY");if(!s(e[t]))throw new Error("INVALID_CONTENT");if(r[t])throw new Error("ARLEADY_PRESENT");var o=e[t];if("string"!=typeof o.role&&(o.role="VIEWER"),void 0===o.pending&&(o.pending=!0),!f(n,o.role,r))throw new Error("INSUFFICIENT_PERMISSIONS");if("string"!=typeof o.displayName||!o.displayName)throw new Error("DISPLAYNAME_REQUIRED")}));var o=!1;return Object.keys(e).forEach((function(n){o=!0,r[n]=e[n]})),o},d.ACCEPT=function(n,t,r){if(!r.internal.initialized)throw new Error("UNINITIALIED");if(void 0===r.state.members)throw new Error("CANNOT_ADD_TO_UNINITIALIED_ROSTER");var o=r.state.members;if(!s(o[t]))throw new Error("INSUFFICIENT_PERMISSIONS");if(!o[t].pending)throw new Error("ALREADY_PRESENT");if("string"!=typeof n)throw new Error("INVALID_ARGS");if(!l(n))throw new Error("INVALID_CURVE_KEY");var a=n;if(void 0!==o[a])throw new Error("MEMBER_ALREADY_PRESENT");var i=e.clone(o[t]);delete i.remaining,delete i.totalUses,delete i.inviteChannel,delete i.previewChannel,o[a]=i;var c=o[t].remaining||1;return-1===c||(c>1?o[t].remaining=c-1:delete o[t]),!0};var p=function(e,n,t){if(!Array.isArray(e)||"string"!=typeof n)throw new Error("INVALID ARGUMENTS");var r=e[0];if("function"!=typeof d[r])throw new Error("INVALID_COMMAND");return d[r](e[1],n,t)},v=function(n,t,r){return p(n,t,e.clone(r))};return i.create=function(n,i){if("function"!=typeof i)throw new Error("EXPECTED_CALLBACK");var f=e.once(e.mkAsync(i));if(n.network)if(n.channel&&"string"==typeof n.channel&&32===n.channel.length)if(n.keys&&"object"==typeof n.keys)if(n.store){var d=e.response((function(e,n){console.error("ROSTER_RESPONSE__"+e,n)})),h=n.store,y=n.keys,m=y.myCurvePublic,g=n.channel,E=n.lastKnownHash||-1;n.newTeam&&(E=void 0);var b={state:{members:{},metadata:{}},internal:{initialized:!1,sinceLastCheckpoint:0,lastCheckpointHash:E}},O={},A={change:e.mkEvent(),checkpoint:e.mkEvent()};O.on=function(e,n){if("object"!=typeof A[e])throw new Error("unsupported event");return A[e].reg(n),O},O.off=function(e,n){if("object"!=typeof A[e])throw new Error("unsupported event");return A[e].unreg(n),O},O.once=function(e,n){if("object"!=typeof A[e])throw new Error("unsupported event");var t=function(){n.apply(null,Array.prototype.slice.call(arguments)),A[e].unreg(t)};return A[e].reg(t),O},O.getState=function(){return e.clone(b.state)},O.getLastCheckpointHash=function(){return b.internal.lastCheckpointHash||-1};var w=function(){b.internal.pendingCheckpointId&&(d.clear(b.internal.pendingCheckpointId),delete b.internal.pendingCheckpointId),clearTimeout(b.internal.checkpointTimeout),delete b.internal.checkpointTimeout};O.stop=function(){b.internal.cpNetflux&&"function"==typeof b.internal.cpNetflux.stop?(b.internal.cpNetflux.stop(),w()):console.log("FAILED TO LEAVE")};var D,_,T=!1,S=function(){if(n.onCacheReady){var e=b.state;if(Object.keys(e.members||{}).length)n.onCacheReady(O);else{try{b.internal.cpNetflux.resetCache()}catch(e){console.error(e)}n.onCacheReady({error:"CORRUPTED"})}}},x=function(){T=!0,f(void 0,O)},N=function(e){e&&"EUNKNOWN"===e.type||(T?console.error("CHANNEL_ERROR",e):f(e))},I=function(e){e.state||(T=!1)},C=function(){console.log("ROSTER CONNECTED")},R=function(){return Boolean(T&&m)},P=function(n,t,r,o,a,i){b.internal.sinceLastCheckpoint++;var s=e.tryParse(n);if(s){var f,l;try{f=p(s,i,b)}catch(e){l=e.message}var h=c(a);if(d.expected(h)){if(l)return void d.handle(h,[l]);try{f?d.handle(h,[void 0,O.getState()]):(d.handle(h,["NO_CHANGE"]),console.log(n))}catch(e){console.log("CAUGHT",e)}}if("CHECKPOINT"===s[0]&&f?(R()&&A.checkpoint.fire(a),b.internal.sinceLastCheckpoint=0,b.internal.lastCheckpointHash=a):f&&R()&&A.change.fire(),w(),R()&&function(e,n){if(!u(e,n.state.members))return!1;var t=n.internal.sinceLastCheckpoint;return!(!t||"number"!=typeof t||t<25)}(m,b)){var v=1e3*Math.floor(20*Math.random())+5e3;b.internal.checkpointTimeout=setTimeout((function(){b.internal.pendingCheckpointId=O.checkpoint((function(e){e&&console.error(e)}))}),v)}}else console.error("could not parse")},k=function(n,t){var r=e.tryParse(n);return"CHECKPOINT"===r[0]&&v(r,t,b)},M=function(e,n){if(R()){var t=h.anon_rpc;if(t){var o=!1;try{o=v(e,y.myCurvePublic,b)}catch(e){return void n(e.message)}if(o){var a=_.encrypt(r(e)),i=c(a);return d.expect(i,(function(e,t){e?n(e):n(void 0,t,i)}),3e4),t.send("WRITE_PRIVATE_MESSAGE",[g,a],(function(e){if(e)return d.handle(i,[e.message||e])})),i}n("NO_CHANGE")}else n("ANON_RPC_NOT_READY")}else n("NOT_READY")};O.init=function(n,t){var r=e.once(e.mkAsync(t));if(b.internal.initialized)r("ALREADY_INITIALIZED");else if(s(n)){var o=e.clone(n);o.role="OWNER";var a={};a[m]=o,M(["CHECKPOINT",{members:a}],r)}else r("INVALID_ARGUMENTS")},O.checkpoint=function(n){var t=e.once(e.mkAsync(n));M(["CHECKPOINT",e.clone(b.state)],t)},O.add=function(n,t){var r=e.once(e.mkAsync(t));if(!b.internal.initialized)return r("UNINITIALIZED");if(s(n)){var o=e.clone(n);Object.keys(o).forEach((function(e){if(!l(e)||s(b.state.members[e]))return delete o[e]})),M(["ADD",o],r)}else r("INVALID_ARGUMENTS")},O.remove=function(n,t){var r=e.once(e.mkAsync(t)),o=b.state;if(!o)return r("UNINITIALIZED");if(Array.isArray(n)){var a=e.clone(n),i=[],s=Object.keys(o.members);a.forEach((function(e){-1!==s.indexOf(e)&&i.push(e)})),M(["RM",i],r)}else r("INVALID_ARGUMENTS")},O.describe=function(n,t){var r=e.once(e.mkAsync(t)),o=b.state;if(!o)return r("UNINITIALIZED");if(s(n)){var a=e.clone(n);Object.keys(a).some((function(e){var n=a[e];if(s(n)||delete a[e],!s(o.members[e]))return!0;Object.keys(n).forEach((function(t){n[t]===o.members[e][t]&&delete n[t]}))}))?r("INVALID_ARGUMENTS"):M(["DESCRIBE",a],r)}else r("INVALID_ARGUMENTS")},O.metadata=function(n,t){var r=e.once(e.mkAsync(t)),o=b.state.metadata;if(s(n)){var a=e.clone(n);Object.keys(a).forEach((function(e){a[e]===o[e]&&delete a[e]})),M(["METADATA",a],r)}else r("INVALID_ARGUMENTS")},O.invite=function(n,t){var r=e.once(e.mkAsync(t));if(!b.state)return r("UNINITIALIZED");if(!b.internal.initialized)return r("UNINITIALIZED");if(s(n)){var o=e.clone(n);Object.keys(o).forEach((function(e){if(!l(e)||s(b.state.members[e]))return delete o[e]})),M(["INVITE",o],r)}else r("INVALID_ARGUMENTS")},O.accept=function(n,t){var r=e.once(e.mkAsync(t));"string"==typeof n&&l(n)?M(["ACCEPT",n],r):r("INVALID_ARGUMENTS")},o((function(e){h.anon_rpc&&h.anon_rpc.send("GET_METADATA",g,(function(n,t){if(n)return e.abort(),void console.error(n);D=b.internal.metadata=t&&t[0]||void 0}))})).nThen((function(e){if(!n.keys.teamEdPublic&&D&&D.validateKey&&(n.keys.teamEdPublic=D.validateKey),!n.keys.teamEdPublic)return e.abort(),void f("NO_VALIDATE_KEY");try{_=a.Team.createEncryptor(n.keys)}catch(n){return e.abort(),void f(n)}})).nThen((function(){"string"==typeof E&&console.log("Synchronizing from checkpoint"),b.internal.cpNetflux=t.start({lastKnownHash:E,network:n.network,channel:n.channel,crypto:_,validateKey:n.keys.teamEdPublic,owners:n.owners,Cache:n.Cache,isCacheCheckpoint:k,onCacheReady:S,onChannelError:N,onReady:x,onConnect:C,onConnectionChange:I,onMessage:P,noChainPad:!0})}))}else f("EXPECTED_STORE");else f("EXPECTED_CRYPTO_KEYS");else f("EXPECTED_CHANNEL");else f("EXPECTED_NETWORK")},i}(q(),Z(),y(),vn(),Ve(),C()))}(dt)),dt.exports}var pt,vt,yt={exports:{}};function mt(){return vt||(vt=1,function(e){(()=>{const n=(e,n,t,r,o,a,i,s,c,u,f,l,d,h,p,v,y,m,g,E)=>{var b={};E=E||"undefined"!=typeof window&&window.nacl;var O=e.mkEvent(!0),A=function(){},w=function(e,t,r,o){t&&(o||(r.on("change",["drive",a.SHARED_FOLDERS],(function(o,s,c){if(c.length>3&&"password"===c[3]){var u=c[2],f=r.drive[a.SHARED_FOLDERS][u],l=t.manager.user.userObject.getHref?t.manager.user.userObject.getHref(f):f.href,d=n.parsePadUrl(l),h=n.getSecrets(d.type,d.hash,o);return setTimeout((function(){i.updatePassword(e.Store,{oldChannel:h.channel,password:s,href:l},e.store.network,(function(){console.log("Shared folder password changed")}))})),!1}})),r.on("disconnect",(function(){t.offline=!0,t.sendEvent("NETWORK_DISCONNECT",t.id)})),r.on("reconnect",(function(){t.offline=!1,t.sendEvent("NETWORK_RECONNECT",t.id)}))),r.on("change",[],(function(n,r,i){if(o){if(i[0]===a.FILES_DATA&&"object"==typeof r&&r.channel&&!r.owners){var s=[r.channel];r.rtChannel&&s.push(r.rtChannel),r.lastVersion&&s.push(r.lastVersion),t.pin(s,(function(e){e&&e.error&&console.error(e.error)}))}if(i[0]===a.FILES_DATA&&"object"==typeof n&&n.channel&&!r){var c=[n.channel];t.manager.findChannel(n.channel).some((function(e){return e.fId!==o}))||(n.rtChannel&&c.push(n.rtChannel),n.lastVersion&&c.push(n.lastVersion),t.unpin(c,(function(e){e&&e.error&&console.error(e)})))}}n&&!r&&Array.isArray(i)&&(i[0]===a.FILES_DATA||"drive"===i[0]&&i[1]===a.FILES_DATA)&&setTimeout((function(){e.Store.checkDeletedPad(n&&n.channel)})),t.sendEvent("DRIVE_CHANGE",{id:o,old:n,new:r,path:i})})),r.on("remove",[],(function(e,n){t.sendEvent("DRIVE_REMOVE",{id:o,old:e,path:n})})))},D=function(e,n){var t=e.teams[n];if(t){try{t.listmap.stop()}catch(e){}try{t.roster.stop()}catch(e){}t.proxy={},t.stopped=!0,delete e.teams[n],delete e.cache[n],delete e.store.proxy.teams[n],e.emit("LEAVE_TEAM",n,t.clients),e.updateMetadata(),e.store.calendar&&e.store.calendar.closeTeam(n),e.store.mailbox&&e.store.mailbox.close("team-"+n,(function(){}))}},_=function(e,n,t,r){n.rpc?r():t.edPrivate&&t.edPublic?h.create(e.store.network,t,(function(e,t){e?r(e):(n.rpc=t,n&&n.onRpcReadyEvt&&n.onRpcReadyEvt.fire(),r())}),d):r("EFORBIDDEN")},T=function(t,r,a,s,c,u,f){var l=e.once(e.mkAsync(f));if(t.cache[r])l();else{var d=a.proxy,h={id:r,proxy:d,listmap:a,clients:[],realtime:a.realtime,handleSharedFolder:function(e,n){!function(e,n,t,r){var o=e.teams[n];o&&(r?(o.sharedFolders[t]=r,w(e,o,r.proxy,t)):delete o.sharedFolders[t])}(t,r,e,n)},sharedFolders:{},roster:s,onRpcReadyEvt:e.mkEvent(!0),offline:!0};t.cache[r]=h,u&&h.clients.push(u),s.on("change",(function(){var n=s.getState(),o=e.find(t,["store","proxy","curvePublic"]);if(n.members&&Object.keys(n.members).length)if(n.members[o]){var a=e.find(t,["store","proxy","teams",r]);a&&(a.metadata=n.metadata),t.updateMetadata(),t.emit("ROSTER_CHANGE",r,h.clients)}else D(t,r);else console.error(JSON.stringify(n))})),s.on("checkpoint",(function(n){e.find(t,["store","proxy","teams",r,"keys","roster"]).lastKnownHash=n})),h.sendEvent=function(e,n,r){t.emit(e,n,h.clients.filter((function(e){return e!==r})))},h.getChatData=function(){var e=c.chat||{},t=e.edit||e.view;if(!t)return{};var o=n.getSecrets("chat",t);return{teamId:r,channel:o.channel,secret:o,validateKey:e.validateKey}},h.pin=function(e,n){c.drive.edPrivate?h.rpc?("function"!=typeof n&&console.error("expected a callback"),h.rpc.pin(e,(function(e,t){n(e?{error:e}:{hash:t})}))):n({error:"TEAM_RPC_NOT_READY"}):n({error:"EFORBIDDEN"})},h.unpin=function(e,n){c.drive.edPrivate?h.rpc?("function"!=typeof n&&console.error("expected a callback"),h.rpc.unpin(e,(function(e,t){n(e?{error:e}:{hash:t})}))):n({error:"TEAM_RPC_NOT_READY"}):n({error:"EFORBIDDEN"})};var p=t.store.proxy.teams[h.id],v=p.hash||p.roHash,y=n.getSecrets("team",v,p.password),m=h.manager=o.create(d.drive,{onSync:function(e){t.Store.onSync(r,e)},edPublic:c.drive.edPublic,pin:h.pin,unpin:h.unpin,loadSharedFolder:function(e,n,r,o){i.load({isNew:o,network:t.store.network||t.store.networkPromise,store:h,isNewChannel:t.Store.isNewChannel,Store:t.Store},e,n,r)},settings:{drive:e.find(t.store,["proxy","settings","drive"])},removeOwnedChannel:function(e,n){var o;"object"==typeof e?(e.teamId=r,o=e):o={channel:e,teamId:r},t.Store.removeOwnedChannel("",o,n)},Store:t.Store,store:t.store},{teamId:h.id,outer:!0,edPublic:c.drive.edPublic,loggedIn:!0,log:function(e){h.sendEvent("DRIVE_LOG",e)},rt:h.realtime,editKey:y.keys.secondaryKey,readOnly:Boolean(!y.keys.secondaryKey)});h.secondaryKey=y&&y.keys.secondaryKey,h.userObject=m.user.userObject,g((function(e){t.teams[r]=h,w(t,h,d);var n=t.store.network||t.store.networkPromise;i.loadSharedFolders(t.Store,n,h,h.proxy.drive,h.userObject,e,(function(e){t.progress+=70/(t.numberOfTeams*e.max),t.updateProgress({progress:t.progress})}),!0)})).nThen((function(){t.store.modules.calendar&&t.store.modules.calendar.openTeam(r),l()}))}},S=function(t,r,o,a,s,c,u){var f,l=a.getState(),d=e.find(t,["store","proxy","teams",r]);d&&(d.metadata=l.metadata),delete t.nocache[r],t.store.proxy.teams[r]&&g((function(e){T(t,r,o,a,s,c,e()),f=t.teams[r]||t.cache[r],s.drive.edPrivate&&_(t,f,s.drive,e((function(){})))})).nThen((function(e){f.userObject.fixFiles(),i.checkMigration(f.secondaryKey,f.proxy?.drive,f.userObject,e()),i.loadSharedFolders(t.Store,t.store.network,f,f.proxy?.drive,f.userObject,e,(function(e){t.progress+=70/(t.numberOfTeams*e.max),t.updateProgress({progress:t.progress})}))})).nThen((function(){if(f.rpc){var o=function(n,t){var r=n.teams[t];if(!r)return null;var o=r.manager.getChannelsList("pin"),a=n.store.proxy.teams[t];o.push(`${a.channel}#drive`);var i=e.find(a,["keys","chat","channel"]),s=e.find(a,["keys","roster","channel"]),c=e.find(a,["keys","mailbox","channel"]);if(i&&o.push(i),s&&o.push(s),c&&o.push(c),r.proxy.calendars){var u=Object.keys(r.proxy.calendars).map((function(e){return r.proxy.calendars[e].channel}));o=o.concat(u)}var f=r.roster.getState();return f.members&&Object.keys(f.members).forEach((function(e){var n=f.members[e];n.inviteChannel&&n.pending&&o.push(n.inviteChannel),n.previewChannel&&n.pending&&o.push(n.previewChannel)})),o.sort(),o}(t,r),a=n.hashChannelList(o);f.rpc.getServerHash((function(e,n){e?console.warn(e):n!==a&&f.rpc.reset(o,(function(e){e&&console.warn(e)}))}))}})).nThen((function(){f.offline=!1,t.onReadyHandlers[r]&&t.onReadyHandlers[r].forEach((function(e){("function"==typeof e.cb&&e.cb(),e.cId)&&(-1===f.clients.indexOf(e.cId)&&f.clients.push(e.cId))})),delete t.onReadyHandlers[r],t.store.modules.calendar&&t.store.modules.calendar.openTeam(r),u()}))},x=function(e,n,t,r,o,a){var i=function(){(e.cache[n]||e.teams[n])&&D(e,n),delete e.store.proxy.teams[n],delete e.onReadyHandlers[n],o.abort(),a({error:"ENOENT"})};t&&e.store.anon_rpc.send("IS_NEW_CHANNEL",t,o((function(e,n){n&&n.length&&"object"==typeof n[0]&&n[0].isNew&&i()}))),r&&e.store.anon_rpc.send("IS_NEW_CHANNEL",r,o((function(e,n){n&&n.length&&"object"==typeof n[0]&&n[0].isNew&&i()})))},N=function(t,r,o,a,i){var f=e.once(e.mkAsync(a)),l=r.hash||r.roHash,h=n.getSecrets("team",l,r.password),y=v.createEncryptor(h.keys);r.roHash||(r.roHash=n.getViewHashFromKeys(h));var E,b,A=r.keys;if(!A.chat.validateKey&&A.chat.edit){var w=n.getSecrets("chat",A.chat.edit);A.chat.validateKey=w.keys.validateKey}var _={curvePublic:t.store.proxy.curvePublic,curvePrivate:t.store.proxy.curvePrivate},N=A.roster||{},I=N.edit?v.Team.deriveMemberKeys(N.edit,_):v.Team.deriveGuestKeys(N.view||"");g((function(e){if(i)return d.getChannelCache(h.channel,e((function(n,t){t&&t.c||(e.abort(),f({error:"NOCACHE"}))}))),void d.getChannelCache(I.channel,e((function(n,t){var r=t&&t.c,o=t&&t.k;o&&!I.teamEdPublic&&(I.teamEdPublic=o),r||(e.abort(),f({error:"NOCACHE"}))})));t.Store.onReadyEvt.reg((()=>{x(t,o,h.channel,I.channel,e,f)}))})).nThen((function(n){var a={lm:!1,roster:!1,check:function(){this.lm&&this.roster&&i&&(t.progress+=30/t.numberOfTeams,t.updateProgress({progress:t.progress}),T(t,o,b,E,A,null,n(f)),this.check=function(){})}},u={data:{},readOnly:!Boolean(h.keys.signKey),network:t.store.network||t.store.networkPromise,channel:h.channel,crypto:y,ChainPad:m,Cache:d,metadata:{validateKey:h.keys.validateKey||void 0},userName:"team",classic:!0,onMetadataUpdate:function(){var e=t.teams[o];e&&t.emit("ROSTER_CHANGE",o,e.clients)}};(b=p.create(u)).proxy.on("cacheready",(function(){a.lm=!0,a.check()})),b.proxy.on("ready",n()),b.proxy.on("error",(function(e){e&&void 0!==e.loaded&&!e.loaded&&f({error:"ECONNECT"}),e&&e.error&&"EDELETED"===e.error&&D(t,o)})),s.create({network:t.store.network||t.store.networkPromise,channel:I.channel,keys:I,store:t.store,lastKnownHash:N.lastKnownHash,onCacheReady:function(e){if(i){if(e&&"CORRUPTED"===e.error)return console.error("Corrupted roster cache, cant load this team offline",r),b&&"function"==typeof b.stop&&b.stop(),n.abort(),void f({error:"CACHE_CORRUPTED_ROSTER"});E=e,a.roster=!0,a.check()}},Cache:d},n((function(r,o){if(r)return n.abort(),console.error(r),void f({error:"ROSTER_ERROR"});E=o,N.lastKnownHash=E.getLastCheckpointHash();var a=E.getState(),i=e.find(t,["store","proxy","curvePublic"]);a.members[i]&&O.reg((function(){if(N.edit){var e={},n=c.createData(t.store.proxy,!1);n.pending=!1,e[t.store.proxy.curvePublic]=n,E.describe(e,(function(e){e&&"NO_CHANGE"!==e&&console.error(e)}))}}))})))})).nThen((function(n){var a=E.getState(),i=e.find(t,["store","proxy","curvePublic"]);if(!a.members||!Object.keys(a.members).length)return b.stop(),E.stop(),b.proxy={},f({error:"EINVAL"}),n.abort(),console.error(JSON.stringify(a)),void u.send("ROSTER_CORRUPTED");if(!a.members[i])return b.stop(),E.stop(),b.proxy={},delete t.store.proxy.teams[o],t.updateMetadata(),f({error:"EFORBIDDEN"}),void n.abort();var s=a.members[i],c=e.find(r,["keys","drive","edPrivate"]);if(r.hash&&c||-1===["ADMIN","MEMBER"].indexOf(s.role))r.hash&&c||"OWNER"!==s.role||u.send("TEAM_RIGHTS_OWNER");else{console.warn("Missing edit rights: demote to viewer");var l={};l[t.store.proxy.curvePublic]={role:"VIEWER"},E.describe(l,(function(e){u.send("TEAM_RIGHTS_FIXED"),delete r.hash,delete r.keys.drive.edPrivate,delete r.keys.chat.edit,e&&"NO_CHANGE"!==e&&console.error(e)}))}})).nThen((function(){i||(t.progress+=30/t.numberOfTeams,t.updateProgress({progress:t.progress})),S(t,o,b,E,A,null,f)}))},I=function(n,t,r,o){var a=t.team;if(!((a.hash||a.roHash)&&a.channel&&a.password&&a.keys&&a.metadata))return void o({error:"EINVAL"});let i=n.store.proxy.teams;if(Object.values(i).some((e=>e.channel===a.channel)))o({error:"EEXISTS"});else{var s=e.createRandomInteger();n.store.proxy.teams[s]=a,n.onReadyHandlers[s]=[],N(n,a,s,(function(e){e&&e.error||console.debug("Team joined:"+s);var t=n.store.proxy.teams[s];n.store.mailbox.open("team-"+s,t.keys.mailbox,(function(){}),!0,{owners:t.keys.drive.edPublic}),n.updateMetadata(),o(e)}))}},C=function(n,t,r){var o=e.find(n,["store","proxy","teams",t]);if(!o)return{};var a=e.clone(o);return r||(delete a.hash,delete a.keys.drive.edPrivate,delete a.keys.chat.edit),delete a.owner,a},R=function(t,r,o){if(!r)return!0;var a=e.find(t,["store","proxy","teams",r]);if(!a)return!0;var s=t.teams[r];if(!s)return!0;var c=n.getSecrets("team",o||a.roHash,a.password);if(i.upgrade(a.channel,c),s.userObject&&s.userObject.setReadOnly(!c.keys.secondaryKey,c.keys.secondaryKey),c.keys.secondaryKey)try{t.store.modules.calendar.upgradeTeam(r)}catch(e){console.error(e)}!c.keys.secondaryKey&&s.rpc&&s.rpc.destroy();var u=e.find(s,["proxy","drive","sharedFolders"]);Object.keys(u||{}).forEach((function(t){var r=s.manager.getSharedFolderData(t),o=n.parsePadUrl(r.href||r.roHref),a=n.getSecrets(o.type,o.hash,r.password);i.upgrade(a.channel,a);var c=e.find(s,["manager","folders",t,"userObject"]);c&&c.setReadOnly(!a.keys.secondaryKey,a.keys.secondaryKey)})),t.updateMetadata(),t.emit("ROSTER_CHANGE_RIGHTS",r,s.clients)},P=function(t,r,o,a,i){if(r){var s=e.find(t,["store","proxy","teams",r]);if(s){var c=t.onReadyHandlers[r],u=t.teams[r];if(s.channel===a.channel&&s.password===a.password)if(o?(s.hash=a.hash,s.keys.drive.edPrivate=a.keys.drive.edPrivate,s.keys.chat.edit=a.keys.chat.edit):(delete s.hash,delete s.keys.drive.edPrivate,delete s.keys.chat.edit),u||!Array.isArray(c))if(u){if(o){_(t,u,s.keys.drive,(function(){u.manager.addPin(u.pin,u.unpin)}));var f=n.getSecrets("team",a.hash,s.password);u.secondaryKey=f&&f.keys.secondaryKey;var l=v.createEncryptor(f.keys);u.listmap.setReadOnly(!1,l)}else delete u.secondaryKey,u.rpc&&u.rpc.destroy&&u.rpc.destroy(),u.manager.removePin(),u.listmap.setReadOnly(!0);R(t,r,a.hash),i(!0)}else i(!1);else c.push({cb:function(){P(t,r,o,a,i)}});else i(!1)}else i(!1)}else i(!1)},k=function(n,t,r,o,a){t?e.find(n,["store","proxy","teams",t])&&n.teams[t]?n.store.mailbox.sendTo("TEAM_EDIT_RIGHTS",{state:o,teamData:C(n,t,o)},{channel:r.notifications,curvePublic:r.curvePublic},a):a({error:"ENOENT"}):a({error:"EINVAL"})},M=function(n,t,r,o){var a=t.teamId;if(a){var i=e.find(n,["store","proxy","teams",a]),s=n.teams[a];if(i&&s)if(s.roster)if(t.curvePublic&&t.data){var c,u=s.roster.getState().members[t.curvePublic];g((function(e){n.Store.getPadMetadata(null,{channel:i.channel},e((function(e){c=e&&e.error?s.listmap.metadata||{}:e})))})).nThen((function(){if(u.pendingOwner=Array.isArray(c.pending_owners)&&-1!==c.pending_owners.indexOf(u.edPublic),"OWNER"!==u.role||"OWNER"===t.data.role){"VIEWER"===u.role&&"VIEWER"!==t.data.role&&k(n,a,u,!0,(function(e){o(e)})),"VIEWER"!==u.role&&"VIEWER"===t.data.role&&k(n,a,u,!1,(function(e){o(e)}));var r={};r[t.curvePublic]=t.data,s.roster.describe(r,(function(e){e?o({error:e}):o()}))}else!function(n,t,r,o){var a=e.once(o);if(t){var i=e.find(n,["store","proxy","teams",t]);if(i){var s=n.teams[t];if(s){var c=r.pendingOwner;g((function(t){var o=c?"RM_PENDING_OWNERS":"RM_OWNERS",s=function(e){var n=e&&e.error;if(n)return console.error(n),t.abort(),void a(n)},u=function(e){n.Store.setPadMetadata(null,{channel:e,command:o,value:[r.edPublic]},t(s))};u(i.channel),u(e.find(i,["keys","roster","channel"])),u(e.find(i,["keys","chat","channel"]))})).nThen((function(e){var n={};n[r.curvePublic]={role:"ADMIN",pendingOwner:!1},s.roster.describe(n,e((function(e){e&&console.error(e)})))})).nThen((function(e){n.store.mailbox.sendTo("RM_OWNER",{teamChannel:i.channel,title:i.metadata.name,pending:c},{channel:r.notifications,curvePublic:r.curvePublic},e())})).nThen((function(){a()}))}else a({error:"ENOENT"})}else a({error:"ENOENT"})}else a({error:"EINVAL"})}(n,a,u,(function(e){e?(console.error(e),o({error:e})):o()}))}))}else o({error:"MISSING_DATA"});else o({error:"NO_ROSTER"});else o({error:"ENOENT"})}else o({error:"EINVAL"})},F=function(e,n){Object.keys(e.onReadyHandlers).forEach((function(t){var r=-1;e.onReadyHandlers[t].some((function(e,t){if(e.cId===n)return r=t,!0})),-1!==r&&e.onReadyHandlers[t].splice(r,1)})),Object.keys(e.teams).forEach((function(t){var r=e.teams[t].clients,o=r.indexOf(n);-1!==o&&r.splice(o,1)}))},L=function(n,t,r,o){var a,i=t.seeds;try{a=f.derivePreviewKeys(i.preview)}catch(e){return void o({error:"INVALID_SEEDS"})}l.get({channel:a.channel,type:"pad",version:2,keys:{cryptKey:a.cryptKey}},(function(n,t){if(n)o({error:n});else if(t){var r=e.tryParse(t);o(r||{error:"parseError"})}else o({error:"DELETED"})}),{network:n.store.network,initialState:"{}"})},H=function(n,t,r,o){var a,i;g((function(r){!function(n,t,r,o){var a,i=t.bytes64;try{a=f.deriveInviteKeys(i)}catch(e){return void o({error:"INVALID_SEEDS"})}l.get({channel:a.channel,type:"pad",version:2,keys:{cryptKey:a.cryptKey}},(function(n,t){if(n)o({error:n});else if(t){var r=e.tryParse(t);o(r||{error:"parseError"})}else o({error:"DELETED"})}),{network:n.store.network,initialState:"{}"})}(n,t,0,r((function(e){if(e&&e.error)return r.abort(),void o(e);a=e})))})).nThen((function(t){var r=e.find(a,["teamData","channel"]),u=n.store.proxy.teams||{};if(Object.keys(u).some((function(e){return u[e].channel===r})))return t.abort(),void o({error:"ALREADY_MEMBER"});var f=e.find(a,["teamData","keys","roster"]),l=a.ephemeral;if(!f||!l)return t.abort(),void o({error:"INVALID_INVITE_CONTENT"});var h=v.Team.deriveMemberKeys(f.edit,l);s.create({network:n.store.network||n.store.networkPromise,channel:f.channel,keys:h,store:n.store,Cache:d},t((function(e,r){if(e)return t.abort(),console.error(e),void o({error:"ROSTER_ERROR"});var a=c.createData(n.store.proxy,!1),s=r.getState();i=s.members[l.curvePublic],r.accept(a.curvePublic,t((function(e){if(r.stop(),e)return t.abort(),console.error(e),void o({error:"ACCEPT_ERROR"})})))})))})).nThen((function(){var e={};i.remaining&&1!==i.remaining||_(n,e,a.ephemeral,(function(n){if(!n){var t=e.rpc;i.inviteChannel&&t.removeOwnedChannel(i.inviteChannel,(function(e){e&&console.error(e)})),i.previewChannel&&t.removeOwnedChannel(i.previewChannel,(function(e){e&&console.error(e)}))}})),I(n,{team:a.teamData},0,o)}))},j=function(n){if(n){if(n.keys&&n.keys.mailbox)return n.keys.mailbox;var t=e.find(n,["keys","roster","edit"]);if(t){var r=E.hash(E.util.decodeUTF8(t)),o=r.slice(0,32),a=e.uint8ArrayToHex(r.slice(32,48)),i=E.box.keyPair.fromSecretKey(o);return{channel:a,viewed:[],keys:{curvePrivate:E.util.encodeBase64(i.secretKey),curvePublic:E.util.encodeBase64(i.publicKey)}}}}};return b.init=function(t,r,o){var a={},i=t.store;if(i.loggedIn&&i.proxy.edPublic&&!i.modules?.team){var h={store:i,Store:t.Store,pinPads:t.pinPads,emit:o,onReadyHandlers:{},teams:{},cache:{},nocache:{},updateMetadata:t.updateMetadata,updateProgress:t.updateLoadingProgress,progress:0};i.proxy.teams||(i.proxy.teams={});var b=i.proxy.teams;h.numberOfTeams=Object.keys(b).length,h.store.proxy.on("change",["teams"],(function(e,n,t){"hash"===t[2]&&R(h,t[1],n)})),h.store.proxy.on("remove",["teams"],(function(e,n){"hash"===n[2]&&R(h,n[1])}));var w=function(e,n){if(!e||!n)return!0;try{var t=E.util.decodeBase64(e),r=E.sign.keyPair.fromSecretKey(t);return E.util.encodeBase64(r.publicKey)===n}catch(e){return!1}};Object.keys(b).forEach((function(n){h.onReadyHandlers[n]=[],e.find(b,[n,"keys","mailbox"])||(b[n].keys.mailbox=j(b[n])),N(h,b[n],n,r((function(e){if(e){delete h.onReadyHandlers[n],delete h.cache[n],"NOCACHE"===e?.error&&(h.nocache[n]=!0);var t="string"==typeof e?e:e.type||e.message;return u.send("TEAM_LOADING_ERROR="+t),void console.error(e)}console.debug("Team "+n+" cache ready")})),d.isEnabled())})),a.onReady=function(t){var r;r={},Object.keys(b).forEach((function(t){try{var o=b[t],a=r[o.channel],i=e.find(o,["keys","drive","edPrivate"]),s=e.find(o,["keys","drive","edPublic"]);if(s?i&&s&&!w(i,s)&&(u.send("TEAM_CORRUPTED_EDPRIVATE"),delete b[t].keys.drive.edPrivate,i=void 0):u.send("TEAM_CORRUPTED_EDPUBLIC"),o.hash&&2===n.parseTypeHash("drive",o.hash).version&&40!==o.hash.length&&u.send("TEAM_CORRUPTED_HASH"),!a)return void(r[o.channel]=t);var c=b[a],f=e.find(c,["keys","drive","edPrivate"]),l=e.find(c,["keys","chat","edit"]),d=e.find(o,["keys","chat","edit"]);!c.hash&&o.hash&&(c.hash=o.hash),!f&&i&&(c.keys.drive.edPrivate=i),!l&&d&&(c.keys.chat.edit=d),h.store.proxy.duplicateTeams=h.store.proxy.duplicateTeams||{},h.store.proxy.duplicateTeams[t]=b[t],delete b[t]}catch(e){console.error(e)}}));var o=function(e){return!b[e]&&(D(h,e),delete h.onReadyHandlers[e],!0)};Object.keys(h.teams).forEach(o),Object.keys(h.onReadyHandlers).forEach((function(n){if(!o(n)){var r=h.store.proxy.teams[n],a=e.find(r,["keys","roster","channel"]),i=e.once(e.mkAsync(t()));g((function(e){x(h,n,r.channel,a,e,i)})),h.onReadyHandlers[n].push({cb:i})}})),Object.keys(b).forEach((function(n){h.onReadyHandlers[n]||h.teams[n]||(h.onReadyHandlers[n]=[],e.find(b,[n,"keys","mailbox"])||(b[n].keys.mailbox=j(b[n])),N(h,b[n],n,t((function(e){if(e){var t="string"==typeof e?e:e.type||e.message;return u.send("TEAM_LOADING_ERROR="+t),void console.error(e)}console.debug("Team "+n+" ready")}))))})),A(),O.fire()},a.getTeam=function(e){return h.teams[e]},a.getTeamsData=function(n){var t={},r=!1;return-1!==["drive","teams","settings"].indexOf(n)&&(r=!0),Object.keys(b).forEach((function(n){if(h.teams[n]){var o=h.teams[n].proxy||{},a=o.drive&&Object.keys(o.drive.filesData||{}).length,i=o.drive&&Object.keys(o.drive.sharedFolders||{}).length;t[n]={owner:b[n].owner,name:b[n].metadata.name,channel:b[n].channel,numberPads:a,numberSf:i,roster:e.find(b[n],["keys","roster","channel"]),edPublic:e.find(b[n],["keys","drive","edPublic"]),avatar:e.find(b[n],["metadata","avatar"]),viewer:!e.find(b[n],["keys","drive","edPrivate"]),notifications:e.find(b[n],["keys","mailbox","channel"]),curvePublic:e.find(b[n],["keys","mailbox","keys","curvePublic"]),validKeys:w(e.find(b[n],["keys","drive","edPrivate"]),e.find(b[n],["keys","drive","edPublic"]))},r&&h.teams[n]&&(t[n].secondaryKey=h.teams[n].secondaryKey),h.teams[n]&&(t[n].hasSecondaryKey=Boolean(h.teams[n].secondaryKey))}})),t},a.getTeams=function(){return Object.keys(h.teams)};a.removeFromTeam=function(e,n,t){if(b[e]&&(!t||function(e,n){var t=h.teams[e];if(t){var r=t.roster&&t.roster.getState();if(r.members)return(r.members[n]||{}).pending}}(e,n)))if(h.onReadyHandlers[e])h.onReadyHandlers[e].push({cb:function(){h.teams[e].roster.remove([n],(function(e){e&&"NO_CHANGE"!==e&&console.error(e)}))}});else{var r=h.teams[e];r?r.roster.remove([n],(function(e){e&&"NO_CHANGE"!==e&&console.error(e)})):console.error("TEAM MODULE ERROR")}},a.changeMyRights=function(e,n,t,r){P(h,e,n,t,r)},a.updateMyData=function(e){Object.keys(h.teams).forEach((function(n){var t=h.teams[n];if(t.roster){var r={};r[e.curvePublic]=e,t.roster.describe(r,(function(e){e&&console.error(e)}))}}))},a.removeClient=function(e){F(h,e)};return a.execCommand=function(t,r,o){var a=r.cmd,i=r.data;if("SUBSCRIBE"!==a)if("LIST_TEAMS"!==a)if("OPEN_TEAM_CHAT"!==a)if("GET_TEAM_ROSTER"!==a)if("GET_TEAM_METADATA"!==a)if("SET_TEAM_METADATA"!==a){if("OFFER_OWNERSHIP"===a)return h.store.offline?void o({error:"OFFLINE"}):void function(n,t,r,o){var a=e.once(o),i=t.teamId;if(i){var s=e.find(n,["store","proxy","teams",i]);if(s){var c=n.teams[i];if(c)if(c.roster)if(t.curvePublic){var u=c.roster.getState().members[t.curvePublic];g((function(t){var r=function(e){var n=e&&e.error;if(n)return console.error(n),t.abort(),void a({error:n})},o=function(e){n.Store.setPadMetadata(null,{channel:e,command:"ADD_PENDING_OWNERS",value:[u.edPublic]},t(r))};o(s.channel),o(e.find(s,["keys","roster","channel"])),o(e.find(s,["keys","chat","channel"]))})).nThen((function(e){var n={};n[u.curvePublic]={role:"OWNER"},c.roster.describe(n,e((function(e){e&&console.error(e)})))})).nThen((function(t){n.store.mailbox.sendTo("ADD_OWNER",{teamChannel:s.channel,chatChannel:e.find(s,["keys","chat","channel"]),rosterChannel:e.find(s,["keys","roster","channel"]),title:s.metadata.name},{channel:u.notifications,curvePublic:u.curvePublic},t())})).nThen((function(){a()}))}else a({error:"MISSING_DATA"});else a({error:"NO_ROSTER"});else a({error:"ENOENT"})}else a({error:"ENOENT"})}else a({error:"EINVAL"})}(h,i,0,o);if("ANSWER_OWNERSHIP"===a)return h.store.offline?void o({error:"OFFLINE"}):void function(n,t,r,o){var a,i=n.store.proxy.teams;if(Object.keys(i).forEach((function(e){if(i[e].channel===t.teamChannel)return a=e,!0})),a){var s=e.find(n,["store","proxy","teams",a]);if(s){var c=n.teams[a];if(c)if(c.roster){var u={};t.answer?s.owner=!0:(u[n.store.proxy.curvePublic]={role:"ADMIN"},c.roster.describe(u,(function(e){e?o({error:e}):o()})))}else o({error:"NO_ROSTER"});else o({error:"ENOENT"})}else o({error:"ENOENT"})}else o({error:"EINVAL"})}(h,i,0,o);if("DESCRIBE_USER"!==a){if("INVITE_TO_TEAM"===a)return h.store.offline?void o({error:"OFFLINE"}):void function(e,n,t,r){var o=n.teamId;if(o){var a=e.teams[o];if(a)if(a.roster){var i=n.user;if(i&&i.curvePublic&&i.notifications){delete i.channel,delete i.lastKnownHash,i.pending=!0;var s={};s[i.curvePublic]=i,s[i.curvePublic].role="VIEWER",a.roster.add(s,(function(n){n&&"NO_CHANGE"!==n?r({error:n}):e.store.mailbox.sendTo("INVITE_TO_TEAM",{team:C(e,o)},{channel:i.notifications,curvePublic:i.curvePublic},(function(e){r(e)}))}))}else r({error:"MISSING_DATA"})}else r({error:"NO_ROSTER"});else r({error:"ENOENT"})}else r({error:"EINVAL"})}(h,i,0,o);if("LEAVE_TEAM"!==a){if("JOIN_TEAM"===a)return h.store.offline?void o({error:"OFFLINE"}):void I(h,i,0,o);if("REMOVE_USER"!==a){if("DELETE_TEAM"===a)return h.store.offline?void o({error:"OFFLINE"}):void function(n,t,r,o){var a=t.teamId;if(a){var i=n.teams[a],s=e.find(n,["store","proxy","teams",a]);if(i&&s){var c=i.roster.getState(),f=e.find(n,["store","proxy","curvePublic"]),l=c.members[f];if(!l||"OWNER"!==l.role)return o({error:"EFORBIDDEN"});var d=e.find(n,["store","proxy","edPublic"]),h=e.find(s,["keys","drive","edPublic"]);g((function(e){n.Store.anonRpcMsg(null,{msg:"GET_METADATA",data:s.channel},e((function(n){if(n&&n.error)return e.abort(),o({error:n.error});var t=n[0];t&&Array.isArray(t.owners)&&-1!==t.owners.indexOf(d)||(e.abort(),o({error:"EFORBIDDEN"}))})))})).nThen((function(t){i.proxy.delete=!0;var r=i.manager.getChannelsList("owned"),o=e.Saferphore.create(10);r.forEach((function(e){var r=t();o.take((function(t){var o=!1;g((function(r){32===e.length&&n.Store.anonRpcMsg(null,{msg:"GET_METADATA",data:e},r((function(e){if(e&&e.error)return t(),void r.abort();var n=e[0];if(!n||!Array.isArray(n.owners)||-1===n.owners.indexOf(h))return t(),void r.abort();o=n.owners.some((function(e){return e!==h}))})))})).nThen((function(t){o?n.Store.setPadMetadata(null,{channel:e,command:"RM_OWNERS",value:[h]},t()):i.rpc.removeOwnedChannel(e,t((function(e){e&&console.error(e)})))})).nThen((function(){t(),r()}))}))}))})).nThen((function(t){i.rpc.removePins(t((function(e){e&&console.error(e)})));var r=e.find(s,["keys","mailbox","channel"]);i.rpc.removeOwnedChannel(r,t((function(e){e&&console.error(e)})));var o=e.find(s,["keys","roster","channel"]);n.store.rpc.removeOwnedChannel(o,t((function(e){e&&console.error(e)})));var a=e.find(s,["keys","chat","channel"]);n.store.rpc.removeOwnedChannel(a,t((function(e){e&&console.error(e)}))),n.store.rpc.removeOwnedChannel(s.channel,t((function(e){e&&console.error(e)})))})).nThen((function(){u.send("TEAM_DELETION"),D(n,a),o()}))}else o({error:"ENOENT"})}else o({error:"EINVAL"})}(h,i,0,o);if("CREATE_TEAM"===a)return h.store.offline?void o({error:"OFFLINE"}):void function(t,r,o,a){var i,f=e.once(a),l=n.createChannelId(),h=n.createRandomHash("team",l),b=n.getSecrets("team",h,l),O=n.getViewHashFromKeys(b),A=E.sign.keyPair(),w=E.box.keyPair(),_=v.Team.createSeed(),T=v.Team.deriveMemberKeys(_,{curvePublic:t.store.proxy.curvePublic,curvePrivate:t.store.proxy.curvePrivate}),x=n.getSecrets("chat"),N=n.getHashes(x),I={network:t.store.network,channel:b.channel,data:{},validateKey:b.keys.validateKey,crypto:v.createEncryptor(b.keys),logLevel:1,classic:!0,ChainPad:m,Cache:d,owners:[t.store.proxy.edPublic]};g((function(e){s.create({network:t.store.network||t.store.networkPromise,channel:T.channel,owners:[t.store.proxy.edPublic],keys:T,store:t.store,lastKnownHash:void 0,newTeam:!0,Cache:d},e((function(n,r){if(n)return e.abort(),console.error(n),void f({error:"ROSTER_ERROR"});i=r;var o=c.createData(t.store.proxy);delete o.channel,i.init(o,e((function(n){if(n)return e.abort(),void f({error:"ROSTER_INIT_ERROR"})})))})));var n,r=v.createEncryptor(x.keys),o={network:t.store.network,channel:x.channel,noChainPad:!0,crypto:r,metadata:{validateKey:x.keys.validateKey,owners:[t.store.proxy.edPublic]}},a=e();o.onReady=function(){n&&n.stop(),a()},o.onError=function(){e.abort(),f({error:"CHAT_INIT_ERROR"})},n=y.start(o)})).nThen((function(e){i.metadata({name:r.name},e((function(n){if(n)return e.abort(),void f({error:"ROSTER_INIT_ERROR"})})))})).nThen((function(){var a=e.createRandomInteger();I.onMetadataUpdate=function(){var e=t.teams[a];e&&t.emit("ROSTER_CHANGE",a,e.clients)};var s=p.create(I),c=s.proxy;c.version=2,c.on("ready",(function(){var e={mailbox:{channel:n.createChannelId(),viewed:[],keys:{curvePrivate:E.util.encodeBase64(w.secretKey),curvePublic:E.util.encodeBase64(w.publicKey)}},drive:{edPrivate:E.util.encodeBase64(A.secretKey),edPublic:E.util.encodeBase64(A.publicKey)},chat:{edit:N.editHash,view:N.viewHash,validateKey:x.keys.validateKey,channel:x.channel},roster:{channel:T.channel,edit:_,view:T.viewKeyStr}},d=t.store.proxy.teams[a]={owner:!0,channel:b.channel,hash:h,roHash:O,password:l,keys:e,metadata:{name:r.name}};c.drive={},S(t,a,s,i,e,o,(function(){u.send("TEAM_CREATION"),t.store.mailbox.open("team-"+a,d.keys.mailbox,(function(){}),!0,{owners:d.keys.drive.edPublic}),t.updateMetadata(),f()}))})).on("error",(function(e){e&&void 0!==e.loaded&&!e.loaded&&f({error:"ECONNECT"}),e&&e.error&&"EDELETED"===e.error&&D(t,a)}))}))}(h,i,t,o);if("GET_EDITABLE_FOLDERS"!==a)if("CREATE_INVITE_LINK"!==a){if("GET_PREVIEW_CONTENT"!==a)return"ACCEPT_LINK_INVITATION"===a?h.store.offline?void o({error:"OFFLINE"}):void H(h,i,0,o):void 0;L(h,i,0,o)}else!function(n,t,r,o){var a=e.mkAsync(e.once(o)),i=t.teamId,s=n.teams[t.teamId],u=t.seeds,d=t.bytes64;if(i&&s){var h,p=s.roster;try{h=p.getState().metadata.name}catch(e){return void a({error:"TEAM_NAME_ERR"})}var v=t.message,y=t.name,m=t.hash,E=e.find(n,["store","proxy","teams",i]);try{var b=f.encryptHash(m,E.hash)}catch(e){console.error(e)}var O=f.derivePreviewKeys(u.preview),A=f.deriveInviteKeys(d),w=f.generateKeys(),D=t.role||"VIEWER",_=t.uses||1;g((function(e){!function(){var t=f.generateSignPair(),r={initialState:"{}",network:n.store.network,metadata:{owners:[n.store.proxy.edPublic,w.edPublic]}};r.metadata.validateKey=t.validateKey;var o={teamName:h,message:v,author:c.createData(n.store.proxy,!1),displayName:y},i={channel:O.channel,type:"pad",version:2,keys:{cryptKey:O.cryptKey,validateKey:t.validateKey,signKey:t.signKey}};l.put(i,JSON.stringify(o),e((function(n){if(n)return console.error("CRYPTPUT_ERR",n),e.abort(),void a({error:"SET_PREVIEW_CONTENT"})})),r)}(),function(){var t=f.generateSignPair(),r={initialState:"{}",network:n.store.network,metadata:{owners:[n.store.proxy.edPublic,w.edPublic]}};r.metadata.validateKey=t.validateKey;var o={teamData:C(n,i,"MEMBER"===D),ephemeral:{edPublic:w.edPublic,edPrivate:w.edPrivate,curvePublic:w.curvePublic,curvePrivate:w.curvePrivate}},s={channel:A.channel,type:"pad",version:2,keys:{cryptKey:A.cryptKey,validateKey:t.validateKey,signKey:t.signKey}};l.put(s,JSON.stringify(o),e((function(n){if(n)return console.error("CRYPTPUT_ERR",n),e.abort(),void a({error:"SET_PREVIEW_CONTENT"})})),r)}()})).nThen((function(e){s.pin([A.channel,O.channel],(function(e){e&&e.error&&console.error(e.error)})),f.createRosterEntry(s.roster,{curvePublic:w.curvePublic,content:{curvePublic:w.curvePublic,displayName:t.name,pending:!0,remaining:_,totalUses:_,role:D,hash:b,inviteChannel:A.channel,previewChannel:O.channel}},e((function(n){n&&(e.abort(),a(n))})))})).nThen((function(){a()}))}else a({error:"EINVAL"})}(h,i,0,o);else!function(n,t,r,o){var a=t.teamId;if(a){var i=n.teams[a];if(i){var s=i.manager.folders||{};o(Object.keys(s).filter((function(e){return!s[e].proxy.version})).map((function(n){var t=e.find(i,["user","userObject"]);return{name:e.find(s,[n,"proxy","metadata","title"]),path:t?t.findFile(n)[0]:[]}})))}else o({error:"ENOENT"})}else o({error:"EINVAL"})}(h,i,0,o)}else!function(e,n,t,r){var o=n.teamId;if(o){var a=e.teams[o];if(a)if(a.roster)if(n.curvePublic){var i=a.roster.getState().members[n.curvePublic];a.roster.remove([n.curvePublic],(function(t){if(!t)return i&&i.notifications?void e.store.mailbox.sendTo("KICKED_FROM_TEAM",{pending:n.pending,teamChannel:C(e,o).channel,teamName:C(e,o).metadata.name},{channel:i.notifications,curvePublic:i.curvePublic},(function(e){r(e)})):r();r({error:t})}))}else r({error:"MISSING_DATA"});else r({error:"NO_ROSTER"});else r({error:"ENOENT"})}else r({error:"EINVAL"})}(h,i,0,o)}else!function(e,n,t,r){var o=n.teamId;if(o){var a=e.teams[o];if(a)if(a.roster){var i=e.store.proxy.curvePublic;a.roster.remove([i],(function(n){n?r({error:n}):(D(e,o),r())}))}else r({error:"NO_ROSTER"});else r({error:"ENOENT"})}else r({error:"EINVAL"})}(h,i,0,o)}else M(h,i,0,o)}else!function(e,n,t,r){var o=n.teamId;if(o){var a=e.teams[o];a?a.offline?r({error:"OFFLINE"}):a.roster?(n.metadata&&delete n.metadata.offline,a.roster.metadata(n.metadata,(function(t){if(t)r({error:t});else{var a=e.store.proxy.teams[o];a&&(a.metadata=n.metadata),r()}}))):r({error:"NO_ROSTER"}):r({error:"ENOENT"})}else r({error:"EINVAL"})}(h,i,0,o);else!function(e,n,t,r){var o=n.teamId;if(o){var a=e.teams[o];if(a)if(a.roster){var i=(a.roster.getState()||{}).metadata||{};i.offline=a.offline,r(i)}else r({error:"NO_ROSTER"});else r({error:"ENOENT"})}else r({error:"EINVAL"})}(h,i,0,o);else!function(n,t,r,o){var a=t.teamId;if(a){var i=e.find(n,["store","proxy","teams",a]);if(i){var s=n.teams[a];if(s)if(s.roster){var c,u=(s.roster.getState()||{}).members||{};g((function(e){n.Store.getPadMetadata(null,{channel:i.channel},e((function(e){c=e&&e.error?s.listmap.metadata||{}:e})))})).nThen((function(){if(n.pending_owners=c.pending_owners,Array.isArray(c.pending_owners)&&c.pending_owners.forEach((function(t){var r;if(Object.keys(u).some((function(e){if(u[e].edPublic===t)return r=u[e],!0})),!r&&i.owner){var o=function(e){n.Store.setPadMetadata(null,{channel:e,command:"RM_PENDING_OWNERS",value:[t]},(function(){}))};return o(i.channel),o(e.find(i,["keys","roster","channel"])),void o(e.find(i,["keys","chat","channel"]))}r.pendingOwner=!0})),n.store.messenger){var t=s.getChatData();(n.store.messenger.getOnlineList(t.channel)||[]).forEach((function(e){u[e]&&(u[e].online=!0)}))}Object.keys(u).forEach((function(e){var n=u[e];if(n.inviteChannel&&n.hash)if(i.hash)try{n.hash=f.decryptHash(n.hash,i.hash)}catch(e){console.error(e)}else delete n.hash})),o(u)}))}else o({error:"NO_ROSTER"});else o({error:"ENOENT"})}else o({error:"ENOENT"})}else o({error:"EINVAL"})}(h,i,0,o);else!function(e,n,t,r){var o=e.teams[n.teamId];if(o){var a=function(){e.emit("ROSTER_CHANGE",n.teamId,o.clients)};e.store.messenger?e.store.messenger.openTeamChat(o.getChatData(),a,t,r):A=function(){e.store.messenger.openTeamChat(o.getChatData(),a,t,r)}}else r({error:"ENOENT"})}(h,i,t,o);else!function(n){var t=e.clone(b);Object.keys(t).forEach((function(e){h.teams[e]?t[e].offline=h.teams[e].offline:(t[e].error=!0,h.nocache[e]&&(t[e].offline=!0))})),n(t)}(o);else!function(e,n,t,r){F(e,t);try{e.store.messenger.removeClient(t)}catch(e){}if(A=function(){},n)if(!e.onReadyHandlers[n]||e.teams[n])if(e.teams[n]){var o=e.teams[n].clients;-1===o.indexOf(t)&&o.push(t),r()}else r({error:"EINVAL"});else-1===e.onReadyHandlers[n].indexOf(t)&&e.onReadyHandlers[n].push({cId:t,cb:r});else r()}(h,i,t,o)},a}},b.anonGetPreviewContent=function(e,n,t){L(e,n,0,t)},b};e.exports&&(e.exports=n(q(),Z(),K(),Me(),Ge(),Le(),Ye(),ht(),En(),ge(),(pt||(pt=1,function(e){e.exports&&(e.exports=function(e,n,t,r){var o={},a=t.util.encodeBase64,i=t.util.decodeBase64;o.generateKeys=function(){var e=t.sign.keyPair(),n=t.box.keyPair();return{edPublic:a(e.publicKey),edPrivate:a(e.secretKey),curvePublic:a(n.publicKey),curvePrivate:a(n.secretKey)}},o.generateSignPair=function(){var e=t.sign.keyPair();return{validateKey:a(e.publicKey),signKey:a(e.secretKey)}};var s=function(r){var o=n.dispenser(i(r));return{channel:e.uint8ArrayToHex(o(16)),cryptKey:o(t.secretbox.keyLength)}};o.deriveInviteKeys=s,o.derivePreviewKeys=s,o.createRosterEntry=function(e,n,t){var r={};r[n.curvePublic]=n.content,e.invite(r,t)};var c=t.util.decodeUTF8;return o.encryptHash=function(e,n){var o=c(n),a=t.hash(o).subarray(0,32);return r.encrypt(e,a)},o.decryptHash=function(e,n){var o=c(n),a=t.hash(o).subarray(0,32);return r.decrypt(e,a)},o}(q(),_e(),I(),C()))}(yt)),yt.exports),xn(),ie(),Sn(),g(),C(),y(),w(),Ve(),I()))})()}(lt)),lt.exports}var gt,Et={exports:{}};function bt(){return gt||(gt=1,function(e){(()=>{const n=(e,n,t,r,o,a,i={},s,c)=>{var u=e.Curve,f={setCustomize:e=>{i=e.Messages}},l="MSG",d="UNFRIEND",h="MAP_ID",p="MAP_ID_ACK",v=function(e){return JSON.parse(JSON.stringify(e))},y=function(e){for(var n=Object.keys(e).length,t=new Uint8Array(n),r=0;r{const n=p.store.network||e;n.on("message",(function(e,n){N(p,e,n)})),n.on("disconnect",(function(){p.emit("DISCONNECT",null,C(p))})),n.on("reconnect",(function(){p.emit("RECONNECT",null,C(p))}))}));return h.networkPromise?.then(b),p.store.network&&b(),f.onFriendUpdate=function(e){var n=g(h.proxy,e);if(n&&n.channel){var t=p.channels[n.channel];t&&p.emit("UPDATE_DATA",{info:v(n),channel:n.channel},t.clients)}},f.onFriendAdded=function(e){if(p.friendsClients.length){var n=g(p.store.proxy,e.curvePublic);if("object"==typeof n)if(n.channel){var t=n.channel;p.channels[t]||P(p,null,n,(function(){u("FRIEND",{curvePublic:n.curvePublic},p.friendsClients)}))}}},f.onFriendRemoved=function(e,n){I(p,e,n)},f.getOnlineList=function(e){return function(e,n){var t=e.channels[n];if(t){var r=[],o=m(e.store.proxy,!1);return r.push(o.curvePublic),t.wc.members.forEach((function(n){if(n!==e.store.network.historyKeeper){var o=t.mapId[n]||{};o.curvePublic&&-1===r.indexOf(o.curvePublic)&&r.push(o.curvePublic)}})),r}}(p,e)},f.storeValidateKey=function(e,n){p.validateKeys[e]=n},f.leavePad=function(e){delete p.validateKeys[e],Object.keys(p.channels).some((function(n){var t=p.channels[n];if(t.padChan===e){t.wc&&t.wc.leave();var r=p.store.network;return t.onReconnect&&r.off("reconnect",t.onReconnect),t.stopped=!0,delete p.channels[n],!0}}))},f.openTeamChat=function(n,r,o,a){!function(n,r,o,a,i){var s=o,c=s.channel,u=s.secret;if(c&&u){var f=t.once(t.mkAsync((function(){n.emit("TEAMCHAT_READY",c,[r]),i({readOnly:"object"==typeof u.keys&&!u.keys.validateKey,channel:c})}))),l=n.channels[c];if(l)l.onReady.reg((function(){-1===l.clients.indexOf(r)&&l.clients.push(r),f()}));else{u.keys.cryptKey&&(u.keys.cryptKey=y(u.keys.cryptKey));var d=e.createEncryptor(u.keys),h=u.keys&&u.keys.validateKey||s.validateKey,p={teamId:o.teamId,readOnly:"object"==typeof u.keys&&!u.keys.validateKey,encryptor:d,channel:c,isTeamChat:!0,decrypt:function(e){return d.decrypt(e,h)},clients:[r],onUserlistUpdate:a,onReady:f};R(n,p)}}else i({error:"EINVAL"})}(p,o,n,r,a)},f.removeClient=function(e){!function(e,n){var t=e.friendsClients.indexOf(n);-1!==t&&e.friendsClients.splice(t,1),Object.keys(e.channels).forEach((function(t){var r=e.channels[t],o=r.clients,a=o.indexOf(n);if(-1!==a&&o.splice(a,1),0===o.length){r.wc&&r.wc.leave();var i=e.store.network;return r.onReconnect&&i.off("reconnect",r.onReconnect),r.stopped=!0,delete e.channels[t],!0}}))}(p,e)},f.execCommand=function(n,r,s){var u=r.cmd,f=r.data;"INIT_FRIENDS"!==u?"GET_ROOMS"!==u?"GET_MUTED_USERS"!==u?"GET_USERLIST"!==u?"OPEN_PAD_CHAT"!==u?"GET_MY_INFO"!==u?"REMOVE_FRIEND"!==u?"CANCEL_FRIEND"!==u?"MUTE_USER"!==u?"UNMUTE_USER"!==u?"GET_STATUS"!==u?"GET_MORE_HISTORY"!==u?"SEND_MESSAGE"!==u?"SET_CHANNEL_HEAD"!==u?"CLEAR_OWNED_CHANNEL"!==u||function(e,n,t){var r=e.channels[n];r?e.store.rpc?e.store.rpc.clearOwnedChannel(n,(function(o){t({error:o}),o||(r.messages=[],e.emit("CLEAR_CHANNEL",n,r.clients))})):t({error:"RPC_NOT_READY"}):t({error:"NO_CHANNEL"})}(p,f,s):_(p,f.id,f.sig,s):function(e,n,t,r){var o=e.channels[n];if(o)if(o.readOnly)r({error:"FORBIDDEN"});else if(e.store.network.webChannels.some((function(e){if(e.id===o.wc.id)return!0}))){var s=e.store.proxy||{},c=[l,s.curvePublic,+new Date,t];if(!o.isFriendChat){var u=s[a.displayNameKey]||i.anonymous+"#"+(s.uid||e.store.noDriveUid).slice(0,5);c.push(u)}var f=JSON.stringify(c),d=o.encrypt(f);o.wc.bcast(d).then((function(){x(e,o,d),r()}),(function(e){r({error:e})}))}else r({error:"NO_SUCH_CHANNEL"});else r({error:"NO_CHANNEL"})}(p,f.id,f.content,s):function(e,n,r,o,a){if("function"==typeof a)if("string"==typeof r){var i=e.channels[n];if(void 0!==i){var s=t.uid();A(e,s,n,a);var c=["GET_HISTORY_RANGE",i.id,{from:r,count:o,txid:s}],u=e.store.network;u.sendto(u.historyKeeper,JSON.stringify(c)).then((function(){}),(function(e){console.error(e)}))}else console.error("chan is undefined. we're going to have a problem here")}else a([])}(p,f.id,f.sig,f.count,s):function(e,n,t){var r=e.channels[n];if(r){r.onUserlistUpdate&&r.onUserlistUpdate();var o=e.store.proxy||{};t(r.wc.members.some((function(n){if(n!==e.store.network.historyKeeper){var t=r.mapId[n]||void 0;return!!t&&t.curvePublic!==o.curvePublic}})))}else t("NO_SUCH_CHANNEL")}(p,f,s):function(e,n,r){var o=t.once(t.mkAsync(r)),a=e.store.proxy,i=a.mutedUsers=a.mutedUsers||{};delete i[n],e.emit("UPDATE_MUTED",null,C(e)),o(Object.keys(i).length)}(p,f,s):function(e,n,r){var o=t.once(t.mkAsync(r)),a=e.store.proxy,i=a.mutedUsers=a.mutedUsers||{};i[n.curvePublic]||(i[n.curvePublic]=n,e.emit("UPDATE_MUTED",null,C(e))),o()}(p,f,s):function(e,n,r){var o=t.once(r);"function"==typeof o?e.Store.cancelFriendRequest(n,o):console.error("NO_CALLBACK")}(p,f,s):function(e,n,r){var a=t.once(r);if("function"==typeof a){var i=e.store.proxy,s=g(i,n);if(!s)return console.error("friend is not valid"),void a({error:"INVALID_FRIEND"});var c=e.channels[s.channel];if(e.store.mailbox&&s.curvePublic&&s.notifications)o.removeFriend(e.store,n,(function(n){n&&n.error?a({error:n.error}):(e.updateMetadata(),a(n))}));else if(c)try{var u=[d,i.curvePublic,+new Date],f=JSON.stringify(u),l=c.encrypt(f);c.wc.bcast(l).then((function(){I(e,n,s.channel),S(e,n,(function(){a()}))}),(function(t){t?a({error:t}):(I(e,n,s.channel),S(e,n,(function(){a()})))}))}catch(e){a({error:e})}else a({error:"NO_SUCH_CHANNEL"})}else console.error("NO_CALLBACK")}(p,f,s):function(e,n){var t=e.store.proxy||{};n({curvePublic:t.curvePublic,displayName:t[a.displayNameKey]})}(p,s):function(n,r,o,a){var i=o.channel,s=t.once(t.mkAsync((function(){n.emit("PADCHAT_READY",i,[r]),a()}))),c=n.channels[i];if(c)c.onReady.reg((function(){-1===c.clients.indexOf(r)&&c.clients.push(r),s()}));else{var u=o.secret;u.keys.cryptKey&&(u.keys.cryptKey=y(u.keys.cryptKey));var f=e.createEncryptor(u.keys),l=u.keys&&u.keys.validateKey||n.validateKeys[u.channel],d={padChan:o.secret&&o.secret.channel,readOnly:"object"==typeof u.keys&&!u.keys.validateKey,encryptor:f,channel:o.channel,isPadChat:!0,decrypt:function(e){return f.decrypt(e,l)},clients:[r],onReady:s};R(n,d)}}(p,n,f,s):function(e,n,t){var r=e.channels[n.id];if(r)if(r.isFriendChat){var o=O(e,n.id);if(!o)return void t({error:"NO_SUCH_FRIEND"});t([o])}else t([]);else t({error:"NO_SUCH_CHANNEL"})}(p,f,s):function(e,n){var t=e.store.proxy;if(!n)return t.mutedUsers||{};n(t.mutedUsers||{})}(p,s):function(e,n,t){var r=e.store.proxy;if(n&&n.curvePublic){var o=n.curvePublic,a=g(r,o);if(!a)return void t({error:"NO_SUCH_FRIEND"});var i=e.channels[a.channel];return i?void t([{id:i.id,isFriendChat:!0,name:a.displayName,lastKnownHash:a.lastKnownHash,curvePublic:a.curvePublic,messages:i.messages}]):void t({error:"NO_SUCH_CHANNEL"})}if(n&&n.padChat){var s=e.channels[n.padChat];return s?void t([{id:s.id,isPadChat:!0,messages:s.messages}]):void t({error:"NO_SUCH_CHANNEL"})}if(n&&n.teamChat){var c=e.channels[n.teamChat];return c?void t([{id:c.id,isTeamChat:!0,messages:c.messages}]):void t({error:"NO_SUCH_CHANNEL"})}var u=Object.keys(e.channels).map((function(n){var t,r,o,a=e.channels[n];if(a.isFriendChat){var i=O(e,n);if(!i)return null;t=i.displayName,r=i.lastKnownHash,o=i.curvePublic}else{if(a.isPadChat)return;if(a.isTeamChat)return}return{id:a.id,isFriendChat:a.isFriendChat,name:t,lastKnownHash:r,curvePublic:o,messages:a.messages}})).filter((function(e){return e}));t(u)}(p,f,s):function(e,n,t){var r=E(e.store.proxy);c((function(t){Object.keys(r).forEach((function(o){if("me"!==o){var a=v(r[o]);"object"==typeof a&&a.channel&&P(e,n,a,t())}else delete r.me.channel}))})).nThen((function(){-1===e.friendsClients.indexOf(n)&&e.friendsClients.push(n),t()}))}(p,n,s)},f},f};e.exports&&(e.exports=n(C(),Z(),q(),Me(),En(),K(),void 0,en(),Ve()))})()}(Et)),Et.exports}var Ot,At={exports:{}};function wt(){return Ot||(Ot=1,function(e){(()=>{const n=(e,n,t,r)=>{var o={},a={};var i=function(n,t,o,a,i){var s,c=e.once(e.mkAsync(i)),u=function(n,t){if(!t)return e.find(n.store,["proxy","edPublic"]);var r=e.find(n,["store","proxy","teams",t]);return e.find(r,["keys","drive","edPublic"])}(n,a),f=n.Store,l=0,d=0,h=0;r((function(e){f.getFileSize(null,{channel:t},e((function(n){return n&&n.error?(e.abort(),void c(n)):void 0===n.size?(e.abort(),void c({error:"ENOENT"})):void(l=n.size)}))),f.getHistory(null,{channel:t,lastKnownHash:o},e((function(n){if(n&&n.error)return e.abort(),void c(n);if(!Array.isArray(n))return e.abort(),void c({error:"EINVAL"});if(n.length){s=n[0].hash;var t=n.map((function(e){return e.msg}));d=t.join("\n").length}})),!0),f.getPadMetadata(null,{channel:t},e((function(n){if((!n||!n.error)&&n&&"object"==typeof n)return h=JSON.stringify(n).length,n&&Array.isArray(n.owners)&&-1!==n.owners.indexOf(u)?void 0:(e.abort(),void c({error:"INSUFFICIENT_PERMISSIONS"}))})))})).nThen((function(){c({size:l-h-d,hash:s})}))};return a.GET_HISTORY_SIZE=function(o,a,s,c){if(o.store.loggedIn&&o.store.rpc){var u=a.channels;if(Array.isArray(u)){var f=[];a.account?u=function(r){var o=[],a=e.find(r.store,["proxy","edPublic"]);-1!==(e.find(r.store,["driveMetadata","owners"])||[]).indexOf(a)&&o.push(r.store.driveChannel);var i=r.store.proxy.profile;if(i){var s=i.edit?n.hrefToHexChannelId("/profile/#"+i.edit,null):null;s&&o.push(s)}r.store.proxy.todo&&o.push(n.hrefToHexChannelId("/todo/#"+r.store.proxy.todo,null));var c=r.store.proxy.mailboxes;if(c){var u=Object.keys(c).map((function(e){return{lastKnownHash:c[e].lastKnownHash,channel:c[e].channel}}));Array.prototype.push.apply(o,u)}var f=r.store.proxy[t.SHARED_FOLDERS];if(f){var l=Object.keys(f).map((function(e){var n=f[e];if(n&&n.owners&&Array.isArray(n.owners)&&-1!==n.owners.indexOf(a))return n.channel})).filter(Boolean);Array.prototype.push.apply(o,l)}return o}(o):a.team&&(u=function(n,t){let r=e.find(n.store,["proxy","teams",t]);if(!r)return[];let o=[r.channel],a=r.keys.roster;return o.push({channel:a.channel,lastKnownHash:a.lastKnownHash}),o}(o,a.team));var l=0,d=[];r((function(e){u.forEach((function(n){var t,r=n;"object"==typeof n&&n.channel&&(r=n.channel,t=n.lastKnownHash),i(o,r,t,a.teamId,e((function(e){e&&e.error?f.push(e.error):(l+=e.size,e.hash&&d.push({channel:r,hash:e.hash}))})))}))})).nThen((function(){c({warning:f.length?f:void 0,channels:d,size:l})}))}else c({error:"EINVAL"})}else c({error:"INSUFFICIENT_PERMISSIONS"})},a.TRIM_HISTORY=function(e,n,t,o){if(e.store.loggedIn&&e.store.rpc){var a=n.channels;if(Array.isArray(a)){var i=function(e,n){if(!n)return e.store.rpc;var t=e.store.modules.team;if(t){var r=t.getTeam(n);if(r)return r.rpc}}(e,n.teamId);if(i){var s=[];r((function(e){a.forEach((function(n){i.trimHistory(n,e((function(e){e&&s.push(e)})))}))})).nThen((function(){1===a.length&&s.length?o({error:s[0]}):o({warning:s.length?s:void 0})}))}else o({error:"ENORPC"})}else o({error:"EINVAL"})}else o({error:"INSUFFICIENT_PERMISSIONS"})},o.init=function(e,n,t){var r={};if(e.store){var o={store:e.store,Store:e.Store,pinPads:e.pinPads,updateMetadata:e.updateMetadata,emit:t};return r.execCommand=function(e,n,t){var r=n.cmd,i=n.data;try{a[r](o,i,e,t)}catch(e){console.error(e)}},r}},o};e.exports&&(e.exports=n(q(),Z(),Le(),Ve()))})()}(At)),At.exports}var Dt,_t={exports:{}},Tt={exports:{}};function St(){return Dt||(Dt=1,function(e){(()=>{const n=e=>{var n={};const t=globalThis;var r=function(){},o=n.getWeekNo=function(e,n){"number"!=typeof n&&(n=1);var t=new Date(e.getFullYear(),0,1),r=t.getDay()-n;r=r>=0?r:r+7;var o,a=Math.floor((e.getTime()-t.getTime())/864e5)+1;if(r<4){if((o=Math.floor((a+r-1)/7)+1)>52){var i=new Date(e.getFullYear()+1,0,1).getDay()-n;o=(i=i>=0?i:i+7)<4?1:53}}else o=Math.floor((a+r-1)/7);return o},a=function(e){var n=new Date(e.getFullYear(),0,0),t=e-n+60*(n.getTimezoneOffset()-e.getTimezoneOffset())*1e3;return Math.floor(t/864e5)},i=n.DAYORDER=["SU","MO","TU","WE","TH","FR","SA"],s=function(e){var n=Number(e.slice(0,-2)),t=i.indexOf(e.slice(-2));return n?[n,t]:t},c=function(e,n){var t=e.getDay();t>=(n="number"==typeof n?n:1)?e.setDate(e.getDate()-(t-n)):e.setDate(e.getDate()-(7+t-n))},u=function(e){return e.getFullYear()+"-"+(e.getMonth()+1)+"-"+e.getDate()},f={daily:function(e,n){e.setDate(e.getDate()+n)},weekly:function(e,n){e.setDate(e.getDate()+7*n)},monthly:function(e,n){e.setMonth(e.getMonth()+n)},yearly:function(e,n){e.setFullYear(e.getFullYear()+n)}},l={month:function(e,n,t){var r=new Date(n.start),o=(t-(e.getMonth()+1)+12)%12,a=e.getMonth()+o;if(e.setMonth(a),e.setDate(r.getDate()),e.getMonth()===a)return!0},weekno:function(e,n,t,r){var a=r&&r.wkst;"number"!=typeof a&&(a=1);var i=new Date(n.start),s=new Date(e.getFullYear(),11,31),u=o(s,a),f=1===u;1===u&&(u=52);var l=o(e,a);if(!t||t>u)return!1;t<0&&(t=u+t+1);var d=t-l,h=new Date(+e);h.setDate(h.getDate()+7*d),c(h,a);var p="aaaaaaa".split("").map((function(n,t){var r=new Date(+h);if(r.setDate(r.getDate()+t),r.getFullYear()===e.getFullYear())return r.toLocaleDateString()!==i.toLocaleDateString()&&r})).filter(Boolean);return 1===t&&f&&(c(s,a),"aaaaaaa".split("").some((function(n,t){var r=new Date(+s);if(r.setDate(r.getDate()+t),r.toLocaleDateString()!==i.toLocaleDateString())return r.getFullYear()>e.getFullYear()||void p.push(r)}))),p.length?p:void 0}};l.yearday=function(e,n,t){var r=e.getFullYear();if(function(e,n){if(!("number"!=typeof n||Math.abs(n)<1||Math.abs(n)>366))return n<0&&(n=a(new Date(e.getFullYear(),11,31))+n+1),e.setMonth(0),e.setDate(n),!0}(e,t)&&e.getFullYear()===r)return!0},l.monthday=function(e,n,t,r){if("number"!=typeof t||Math.abs(t)<1||Math.abs(t)>31)return!1;var o=function(e,n){var t=e.getMonth();n<0&&(n=new Date(e.getFullYear(),e.getMonth()+1,0).getDate()+n+1);return e.setDate(n),e.getMonth()===t};if("monthly"===r.freq)return o(e,t);var a="aaaaaaaaaaaa".split("").map((function(n,r){var a=new Date(e.getFullYear(),r,1);return o(a,t)?a:void 0})).filter(Boolean);return a.length?a:void 0},l.day=function(e,n,t,r){var o,a=s(t);Array.isArray(a)&&(o=a[0],a=a[1]);var i=[];if(![0,1,2,3,4,5,6].includes(a))return!1;var c,u=function(e){if(o){var n=[];"aaaaaaaaaaaa".split("").some((function(t,r){if(void 0===e||r===e){var a,s=i.filter((function(e){return e.getMonth()===r}));return a=o<0?s.length+o:o-1,n.push(s[a]),void 0!==e&&r===e}})),i=n.filter(Boolean)}};if("yearly"===r.freq){c=new Date(+e);for(var f=e.getFullYear();c.getDay()!==a;)c.setDate(c.getDate()+1);for(;c.getFullYear()===f;)i.push(new Date(+c)),c.setDate(c.getDate()+7);return u(),i}if("monthly"===r.freq){c=new Date(+e);for(var l=e.getMonth();c.getDay()!==a;)c.setDate(c.getDate()+1);for(;c.getMonth()===l;)i.push(new Date(+c)),c.setDate(c.getDate()+7);return u(l),i}if("weekly"===r.freq)for(;e.getDay()!==a;)e.setDate(e.getDate()+1);return!0};var d={month:function(e,n){return e.filter((function(e){return n.includes(e.getMonth()+1)}))},weekno:function(e,n,t){return e.filter((function(e){var r=t&&t.wkst;"number"!=typeof r&&(r=1);var a=new Date(e.getFullYear(),11,31),i=o(a,r);1===i&&(i=52);var s=o(e,r);return n.some((function(e){return e>0?e===s:s===i+e+1}))}))},yearday:function(e,n){return e.filter((function(e){var t=a(e),r=a(new Date(e.getFullYear(),11,31));return n.some((function(e){return e>0?e===t:t===r+e+1}))}))},monthday:function(n,t){return n.filter((function(n){var r=e.clone(t);return(r=r.map((function(e){e<0&&(e=new Date(n.getFullYear(),n.getMonth()+1,0).getDate()+e+1);return e}))).includes(n.getDate())}))},day:function(e,n,t){return e.filter((function(e){var r=e.toLocaleDateString(),o="yearly";return("monthly"===t.freq||"yearly"===t.freq&&t.by&&t.by.month)&&(o="monthly"),n.some((function(n){var t,a=s(n);if(Array.isArray(a)&&(t=a[0],a=a[1]),!t)return e.getDay()===a;var i=new Date(e.getFullYear(),e.getMonth(),1);return"yearly"===o&&i.setMonth(0),l.day(i,{},n,{freq:o}).some((function(e){return e.toLocaleDateString()===r}))}))}))},setpos:function(n,t){var r=n.slice(),o=e.deduplicateString(t.slice().map((function(e){return e>0?e-1:0!==e?r.length+e:void 0})));return n.filter((function(e){var n=r.indexOf(e);return o.includes(n)}))}},h=["month","weekno","yearday","monthday","day"],p=["month","monthday","day"];n.getMonthId=function(e){return e.getFullYear()+"-"+e.getMonth()};var v=t.CP_calendar_cache={},y={};n.resetCache=function(){v=t.CP_calendar_cache={},y={}};var m=function(n){if(!n.recUpdate)return[];var t={},r=n.recUpdate.from;return Object.keys(r||{}).forEach((function(e){var n=r[e];n.recurrenceRule&&(t[e]=n.recurrenceRule)})),Object.keys(t).sort((function(e,n){return Number(e)-Number(n)})).map((function(n){var r=e.clone(t[n]);if(f[r.freq]&&!(r.interval&&r.interval<1))return r._start=Number(n),r})).filter(Boolean)};n.getRecurring=function(n,o){t.CP_DEV_MODE&&(r=console.warn);var i=[];return n.forEach((function(n){var t=n.split("-"),s=new Date(t[0],t[1]),g=new Date(+s);g.setMonth(g.getMonth()+1),g.setMilliseconds(-1),r("Compute month",s.toLocaleDateString()),(o||[]).forEach((function(n){var t=new Date(n.start),o=new Date(n.end),E=n,b=n.recurrenceRule;if(b){var O=m(n),A=O.shift();if(!(t>=g)){for(var w=b.until,D=O.slice(),_=A;_&&_._start&&_._startn)){var t;if(n.getFullYear()===e.getFullYear())t=a(n)-a(e);else{var r=new Date(e.getFullYear(),11,31);for(t=a(r)-a(e)+a(n);r.getFullYear()+1=S)){r("Start iteration",a.toLocaleDateString());var m=function(n,t,o){var a=e.clone(t),i=new Date(a.start),s=a.id.split("|")[0],u=o.toLocaleDateString();v[s]=v[s]||{};var y=n.interval||1,m=n.freq,g=[],E=function(e,t){g=d[e](g,t,n)},b=function(e){return function(t){var r=new Date(+o);"yearly"===n.freq?(r.setMonth(0),r.setDate(1)):"monthly"===n.freq?r.setDate(1):"weekly"===n.freq?c(r,n.wkst):n.freq;var s=l[e](r,a,t,n);if(s)if(Array.isArray(s))s=s.filter((function(e){return e.toLocaleDateString()!==i.toLocaleDateString()})),Array.prototype.push.apply(g,s);else{if(r.toLocaleDateString()===i.toLocaleDateString())return;g.push(r)}}},O=e.once((function(){f[m](o,y)})),A=function(){"monthly"===m?o.setDate(15):"yearly"===m&&1===i.getMonth()&&29===i.getDate()&&o.setDate(28),O();var e=new Date(+o);if("monthly"===m||"yearly"===m){if(e.setDate(i.getDate()),e.getDate()!==i.getDate())return;if("yearly"===m&&e.getMonth()!==i.getMonth())return}g.push(e)};if(Array.isArray(v[s][u]))return r("Get cache",s,u),"monthly"===m?o.setDate(15):"yearly"===m&&1===i.getMonth()&&29===i.getDate()&&o.setDate(28),O(),v[s][u];if(n.by&&"yearly"===m){var w=h.slice(),D=!1;(n.by.weekno||n.by.yearday||n.by.monthday||n.by.day)&&(w.shift(),D=!0);var _=!0;w.forEach((function(e){var t=n.by[e];t&&(_?(t.forEach(b(e)),_=!1):"day"===e?n.by.yearday||n.by.monthday||n.by.weekno?E("day",n.by.day):n.by.day.forEach(b("day")):E(e,t))})),n.by.month&&D&&E("month",n.by.month)}n.by&&"monthly"===m&&(n.by.monthday||n.by.day?n.by.monthday?n.by.monthday.forEach(b("monthday")):n.by.day&&n.by.day.forEach(b("day")):A(),n.by.month&&E("month",n.by.month),n.by.day&&n.by.monthday&&E("day",n.by.day)),n.by&&"weekly"===m&&(n.by.day?n.by.day.forEach(b("day")):A(),n.by.month&&E("month",n.by.month)),n.by&&"daily"===m&&(A(),p.forEach((function(e){var t=n.by[e];t&&E(e,t)}))),g.sort((function(e,n){return e-n})),n.by&&n.by.setpos&&E("setpos",n.by.setpos),n.by&&Object.keys(n.by).length?O():A();var T=[];return g=g.filter((function(e){var n=new Date(+e).toLocaleDateString();return!T.includes(n)&&(T.push(n),!0)})),r("Set cache",s,u),v[s][u]=g,g}(b,n,a);if(r("Iteration results",JSON.stringify(m.map((function(e){return new Date(e).toLocaleDateString()})))),!m.length)return a.getFullYear()=S)return r(h.toLocaleDateString(),"count"),w=!0,!0;if(h>=g)return r(h.toLocaleDateString(),"endMonth"),w=!0,!0;if(b.until&&h>b.until)return r(h.toLocaleDateString(),"until"),w=!0,!0;if(!(h=g||h=s){if(y[c.id]&&y[c.id].includes(c.start))return;y[c.id]=y[c.id]||[],y[c.id].push(c.start)}if(E.timeZone&&!c.isAllDay){var m=function(e,n,t){var r=function(e,n){let t=e.toLocaleString("en-CA",{timeZone:n,hour12:!1}).replace(", ","T");return t+="."+e.getMilliseconds().toString().padStart(3,"0"),-(new Date(t+"Z")-e)},o=Intl.DateTimeFormat().resolvedOptions().timeZone,a=r(n,e)-r(t,e);return r(n,o)-r(t,o)-a}(E.timeZone,t,h);c.start+=m,c.end+=m}return i.push(c),D?(v(),!0):void 0}r(h.toLocaleDateString(),"start")})),w||N(a)}};N(t),r("Added this month (all events)",i.map((function(e){return new Date(e.start).toLocaleDateString()})))}}}}}))})),i},n.getAllOccurrences=function(e){if(!e.recurrenceRule)return[e.start];var t=e.recurrenceRule;if(!t.until&&!t.count)return!1;var r=[e.start],o=new Date(e.start);o.setDate(15);for(var a=[],i=0;(a=n.getRecurring([n.getMonthId(o)],[e]))&&(t.count?r.length=1e4;)t.setDate(t.getDate()-a),o++;return{d:o*=a,h:(t=new Date(n)).getHours()-r.getHours(),m:t.getMinutes()-r.getMinutes()}};return n.applyUpdates=function(e){return e.forEach((function(e){if(e.raw={start:e.start,end:e.end},e.recUpdate){var n,t=e.recUpdate.from||{},r=e.recUpdate.one||{},o=e.start,a=m(e).filter((function(e){return e._start>o})).shift(),i=function(n,t){var r=n[t],o=new Date(e.raw[t]);o.setDate(o.getDate()+r.d),o.setHours(o.getHours()+r.h),o.setMinutes(o.getMinutes()+r.m),e[t]=+o};(n=t,Object.keys(n).sort((function(e,n){return Number(e)-Number(n)}))).forEach((function(n){o",noCalendar:!1,now:new Date,onChange:[],onClose:[],onDayCreate:[],onDestroy:[],onKeyDown:[],onMonthChange:[],onOpen:[],onParseConfig:[],onReady:[],onValueUpdate:[],onYearChange:[],onPreCalendarPosition:[],plugins:[],position:"auto",positionElement:void 0,prevArrow:"",shorthandCurrentMonth:!1,showMonths:1,static:!1,time_24hr:!1,weekNumbers:!1,wrap:!1},o={weekdays:{shorthand:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],longhand:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},months:{shorthand:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],longhand:["January","February","March","April","May","June","July","August","September","October","November","December"]},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],firstDayOfWeek:0,ordinal:function(e){var n=e%100;if(n>3&&n<21)return"th";switch(n%10){case 1:return"st";case 2:return"nd";case 3:return"rd";default:return"th"}},rangeSeparator:" to ",weekAbbreviation:"Wk",scrollTitle:"Scroll to increment",toggleTitle:"Click to toggle",amPM:["AM","PM"],yearAriaLabel:"Year",monthAriaLabel:"Month",hourAriaLabel:"Hour",minuteAriaLabel:"Minute",time_24hr:!1},a=function(e,n){return void 0===n&&(n=2),("000"+e).slice(-1*n)},i=function(e){return!0===e?1:0};function s(e,n){var t;return function(){var r=this;clearTimeout(t),t=setTimeout((function(){return e.apply(r,arguments)}),n)}}var c=function(e){return e instanceof Array?e:[e]};function u(e,n,t){if(!0===t)return e.classList.add(n);e.classList.remove(n)}function f(e,n,t){var r=window.document.createElement(e);return n=n||"",t=t||"",r.className=n,void 0!==t&&(r.textContent=t),r}function l(e){for(;e.firstChild;)e.removeChild(e.firstChild)}function d(e,n){return n(e)?e:e.parentNode?d(e.parentNode,n):void 0}function h(e,n){var t=f("div","numInputWrapper"),r=f("input","numInput "+e),o=f("span","arrowUp"),a=f("span","arrowDown");if(-1===navigator.userAgent.indexOf("MSIE 9.0")?r.type="number":(r.type="text",r.pattern="\\d*"),void 0!==n)for(var i in n)r.setAttribute(i,n[i]);return t.appendChild(r),t.appendChild(o),t.appendChild(a),t}function p(e){try{return"function"==typeof e.composedPath?e.composedPath()[0]:e.target}catch(n){return e.target}}var v=function(){},y=function(e,n,t){return t.months[n?"shorthand":"longhand"][e]},m={D:v,F:function(e,n,t){e.setMonth(t.months.longhand.indexOf(n))},G:function(e,n){e.setHours(parseFloat(n))},H:function(e,n){e.setHours(parseFloat(n))},J:function(e,n){e.setDate(parseFloat(n))},K:function(e,n,t){e.setHours(e.getHours()%12+12*i(new RegExp(t.amPM[1],"i").test(n)))},M:function(e,n,t){e.setMonth(t.months.shorthand.indexOf(n))},S:function(e,n){e.setSeconds(parseFloat(n))},U:function(e,n){return new Date(1e3*parseFloat(n))},W:function(e,n,t){var r=parseInt(n),o=new Date(e.getFullYear(),0,2+7*(r-1),0,0,0,0);return o.setDate(o.getDate()-o.getDay()+t.firstDayOfWeek),o},Y:function(e,n){e.setFullYear(parseFloat(n))},Z:function(e,n){return new Date(n)},d:function(e,n){e.setDate(parseFloat(n))},h:function(e,n){e.setHours(parseFloat(n))},i:function(e,n){e.setMinutes(parseFloat(n))},j:function(e,n){e.setDate(parseFloat(n))},l:v,m:function(e,n){e.setMonth(parseFloat(n)-1)},n:function(e,n){e.setMonth(parseFloat(n)-1)},s:function(e,n){e.setSeconds(parseFloat(n))},u:function(e,n){return new Date(parseFloat(n))},w:v,y:function(e,n){e.setFullYear(2e3+parseFloat(n))}},g={D:"(\\w+)",F:"(\\w+)",G:"(\\d\\d|\\d)",H:"(\\d\\d|\\d)",J:"(\\d\\d|\\d)\\w+",K:"",M:"(\\w+)",S:"(\\d\\d|\\d)",U:"(.+)",W:"(\\d\\d|\\d)",Y:"(\\d{4})",Z:"(.+)",d:"(\\d\\d|\\d)",h:"(\\d\\d|\\d)",i:"(\\d\\d|\\d)",j:"(\\d\\d|\\d)",l:"(\\w+)",m:"(\\d\\d|\\d)",n:"(\\d\\d|\\d)",s:"(\\d\\d|\\d)",u:"(.+)",w:"(\\d\\d|\\d)",y:"(\\d{2})"},E={Z:function(e){return e.toISOString()},D:function(e,n,t){return n.weekdays.shorthand[E.w(e,n,t)]},F:function(e,n,t){return y(E.n(e,n,t)-1,!1,n)},G:function(e,n,t){return a(E.h(e,n,t))},H:function(e){return a(e.getHours())},J:function(e,n){return void 0!==n.ordinal?e.getDate()+n.ordinal(e.getDate()):e.getDate()},K:function(e,n){return n.amPM[i(e.getHours()>11)]},M:function(e,n){return y(e.getMonth(),!0,n)},S:function(e){return a(e.getSeconds())},U:function(e){return e.getTime()/1e3},W:function(e,n,t){return t.getWeek(e)},Y:function(e){return a(e.getFullYear(),4)},d:function(e){return a(e.getDate())},h:function(e){return e.getHours()%12?e.getHours()%12:12},i:function(e){return a(e.getMinutes())},j:function(e){return e.getDate()},l:function(e,n){return n.weekdays.longhand[e.getDay()]},m:function(e){return a(e.getMonth()+1)},n:function(e){return e.getMonth()+1},s:function(e){return e.getSeconds()},u:function(e){return e.getTime()},w:function(e){return e.getDay()},y:function(e){return String(e.getFullYear()).substring(2)}},b=function(e){var n=e.config,t=void 0===n?r:n,a=e.l10n,i=void 0===a?o:a,s=e.isMobile,c=void 0!==s&&s;return function(e,n,r){var o=r||i;return void 0===t.formatDate||c?n.split("").map((function(n,r,a){return E[n]&&"\\"!==a[r-1]?E[n](e,o,t):"\\"!==n?n:""})).join(""):t.formatDate(e,n,o)}},O=function(e){var n=e.config,t=void 0===n?r:n,a=e.l10n,i=void 0===a?o:a;return function(e,n,o,a){if(0===e||e){var s,c=a||i,u=e;if(e instanceof Date)s=new Date(e.getTime());else if("string"!=typeof e&&void 0!==e.toFixed)s=new Date(e);else if("string"==typeof e){var f=n||(t||r).dateFormat,l=String(e).trim();if("today"===l)s=new Date,o=!0;else if(/Z$/.test(l)||/GMT$/.test(l))s=new Date(e);else if(t&&t.parseDate)s=t.parseDate(e,f);else{s=t&&t.noCalendar?new Date((new Date).setHours(0,0,0,0)):new Date((new Date).getFullYear(),0,1,0,0,0,0);for(var d=void 0,h=[],p=0,v=0,y="";p=0?new Date:new Date(E.config.minDate.getTime()),t=D(E.config);n.setHours(t.hours,t.minutes,t.seconds,n.getMilliseconds()),E.selectedDates=[n],E.latestSelectedDateObj=n}void 0!==e&&"blur"!==e.type&&function(e){e.preventDefault();var n="keydown"===e.type,t=p(e),r=t;void 0!==E.amPM&&t===E.amPM&&(E.amPM.textContent=E.l10n.amPM[i(E.amPM.textContent===E.l10n.amPM[0])]);var o=parseFloat(r.getAttribute("min")),s=parseFloat(r.getAttribute("max")),c=parseFloat(r.getAttribute("step")),u=parseInt(r.value,10),f=u+c*(e.delta||(n?38===e.which?1:-1:0));if(void 0!==r.value&&2===r.value.length){var l=r===E.hourElement,d=r===E.minuteElement;fs&&(f=r===E.hourElement?f-s-i(!E.amPM):o,d&&L(void 0,1,E.hourElement)),E.amPM&&l&&(1===c?f+u===23:Math.abs(f-u)>c)&&(E.amPM.textContent=E.l10n.amPM[i(E.amPM.textContent===E.l10n.amPM[0])]),r.value=a(f)}}(e);var r=E._input.value;N(),be(),E._input.value!==r&&E._debouncedChange()}function N(){if(void 0!==E.hourElement&&void 0!==E.minuteElement){var e,n,t=(parseInt(E.hourElement.value.slice(-2),10)||0)%24,r=(parseInt(E.minuteElement.value,10)||0)%60,o=void 0!==E.secondElement?(parseInt(E.secondElement.value,10)||0)%60:0;void 0!==E.amPM&&(e=t,n=E.amPM.textContent,t=e%12+12*i(n===E.l10n.amPM[1]));var a=void 0!==E.config.minTime||E.config.minDate&&E.minDateHasTime&&E.latestSelectedDateObj&&0===A(E.latestSelectedDateObj,E.config.minDate,!0);if(void 0!==E.config.maxTime||E.config.maxDate&&E.maxDateHasTime&&E.latestSelectedDateObj&&0===A(E.latestSelectedDateObj,E.config.maxDate,!0)){var s=void 0!==E.config.maxTime?E.config.maxTime:E.config.maxDate;(t=Math.min(t,s.getHours()))===s.getHours()&&(r=Math.min(r,s.getMinutes())),r===s.getMinutes()&&(o=Math.min(o,s.getSeconds()))}if(a){var c=void 0!==E.config.minTime?E.config.minTime:E.config.minDate;(t=Math.max(t,c.getHours()))===c.getHours()&&r=12)]),void 0!==E.secondElement&&(E.secondElement.value=a(t)))}function R(e){var n=p(e),t=parseInt(n.value)+(e.delta||0);(t/1e3>1||"Enter"===e.key&&!/[^\d]/.test(t.toString()))&&Z(t)}function P(e,n,t,r){return n instanceof Array?n.forEach((function(n){return P(e,n,t,r)})):e instanceof Array?e.forEach((function(e){return P(e,n,t,r)})):(e.addEventListener(n,t,r),void E._handlers.push({remove:function(){return e.removeEventListener(n,t)}}))}function k(){ve("onChange")}function M(e,n){var t=void 0!==e?E.parseDate(e):E.latestSelectedDateObj||(E.config.minDate&&E.config.minDate>E.now?E.config.minDate:E.config.maxDate&&E.config.maxDate=0&&A(e,E.selectedDates[1])<=0}(n)&&!me(n)&&a.classList.add("inRange"),E.weekNumbers&&1===E.config.showMonths&&"prevMonthDay"!==e&&t%7==1&&E.weekNumbers.insertAdjacentHTML("beforeend",""+E.config.getWeek(n)+""),ve("onDayCreate",a),a}function j(e){e.focus(),"range"===E.config.mode&&re(e)}function K(e){for(var n=e>0?0:E.config.showMonths-1,t=e>0?E.config.showMonths:-1,r=n;r!=t;r+=e)for(var o=E.daysContainer.children[r],a=e>0?0:o.children.length-1,i=e>0?o.children.length:-1,s=a;s!=i;s+=e){var c=o.children[s];if(-1===c.className.indexOf("hidden")&&$(c.dateObj))return c}}function U(e,n){var t=ee(document.activeElement||document.body),r=void 0!==e?e:t?document.activeElement:void 0!==E.selectedDateElem&&ee(E.selectedDateElem)?E.selectedDateElem:void 0!==E.todayDateElem&&ee(E.todayDateElem)?E.todayDateElem:K(n>0?1:-1);void 0===r?E._input.focus():t?function(e,n){for(var t=-1===e.className.indexOf("Month")?e.dateObj.getMonth():E.currentMonth,r=n>0?E.config.showMonths:-1,o=n>0?1:-1,a=t-E.currentMonth;a!=r;a+=o)for(var i=E.daysContainer.children[a],s=t-E.currentMonth===a?e.$i+n:n<0?i.children.length-1:0,c=i.children.length,u=s;u>=0&&u0?c:-1);u+=o){var f=i.children[u];if(-1===f.className.indexOf("hidden")&&$(f.dateObj)&&Math.abs(e.$i-u)>=Math.abs(n))return j(f)}E.changeMonth(o),U(K(o),0)}(r,n):j(r)}function B(e,n){for(var t=(new Date(e,n,1).getDay()-E.l10n.firstDayOfWeek+7)%7,r=E.utils.getDaysInMonth((n-1+12)%12,e),o=E.utils.getDaysInMonth(n,e),a=window.document.createDocumentFragment(),i=E.config.showMonths>1,s=i?"prevMonthDay hidden":"prevMonthDay",c=i?"nextMonthDay hidden":"nextMonthDay",u=r+1-t,l=0;u<=r;u++,l++)a.appendChild(H(s,new Date(e,n-1,u),u,l));for(u=1;u<=o;u++,l++)a.appendChild(H("",new Date(e,n,u),u,l));for(var d=o+1;d<=42-t&&(1===E.config.showMonths||l%7!=0);d++,l++)a.appendChild(H(c,new Date(e,n+1,d%o),d,l));var h=f("div","dayContainer");return h.appendChild(a),h}function V(){if(void 0!==E.daysContainer){l(E.daysContainer),E.weekNumbers&&l(E.weekNumbers);for(var e=document.createDocumentFragment(),n=0;n1||"dropdown"!==E.config.monthSelectorType)){var e=function(e){return!(void 0!==E.config.minDate&&E.currentYear===E.config.minDate.getFullYear()&&eE.config.maxDate.getMonth())};E.monthsDropdownContainer.tabIndex=-1,E.monthsDropdownContainer.innerHTML="";for(var n=0;n<12;n++)if(e(n)){var t=f("option","flatpickr-monthDropdown-month");t.value=new Date(E.currentYear,n).getMonth().toString(),t.textContent=y(n,E.config.shorthandCurrentMonth,E.l10n),t.tabIndex=-1,E.currentMonth===n&&(t.selected=!0),E.monthsDropdownContainer.appendChild(t)}}}function G(){var e,n=f("div","flatpickr-month"),t=window.document.createDocumentFragment();E.config.showMonths>1||"static"===E.config.monthSelectorType?e=f("span","cur-month"):(E.monthsDropdownContainer=f("select","flatpickr-monthDropdown-months"),E.monthsDropdownContainer.setAttribute("aria-label",E.l10n.monthAriaLabel),P(E.monthsDropdownContainer,"change",(function(e){var n=p(e),t=parseInt(n.value,10);E.changeMonth(t-E.currentMonth),ve("onMonthChange")})),Y(),e=E.monthsDropdownContainer);var r=h("cur-year",{tabindex:"-1"}),o=r.getElementsByTagName("input")[0];o.setAttribute("aria-label",E.l10n.yearAriaLabel),E.config.minDate&&o.setAttribute("min",E.config.minDate.getFullYear().toString()),E.config.maxDate&&(o.setAttribute("max",E.config.maxDate.getFullYear().toString()),o.disabled=!!E.config.minDate&&E.config.minDate.getFullYear()===E.config.maxDate.getFullYear());var a=f("div","flatpickr-current-month");return a.appendChild(e),a.appendChild(r),t.appendChild(a),n.appendChild(t),{container:n,yearElement:o,monthElement:e}}function J(){l(E.monthNav),E.monthNav.appendChild(E.prevMonthNav),E.config.showMonths&&(E.yearElements=[],E.monthElements=[]);for(var e=E.config.showMonths;e--;){var n=G();E.yearElements.push(n.yearElement),E.monthElements.push(n.monthElement),E.monthNav.appendChild(n.container)}E.monthNav.appendChild(E.nextMonthNav)}function q(){E.weekdayContainer?l(E.weekdayContainer):E.weekdayContainer=f("div","flatpickr-weekdays");for(var e=E.config.showMonths;e--;){var n=f("div","flatpickr-weekdaycontainer");E.weekdayContainer.appendChild(n)}return W(),E.weekdayContainer}function W(){if(E.weekdayContainer){var e=E.l10n.firstDayOfWeek,t=n(E.l10n.weekdays.shorthand);e>0&&e\n "+t.join("")+"\n \n "}}function z(e,n){void 0===n&&(n=!0);var t=n?e:e-E.currentMonth;t<0&&!0===E._hidePrevMonthArrow||t>0&&!0===E._hideNextMonthArrow||(E.currentMonth+=t,(E.currentMonth<0||E.currentMonth>11)&&(E.currentYear+=E.currentMonth>11?1:-1,E.currentMonth=(E.currentMonth+12)%12,ve("onYearChange"),Y()),V(),ve("onMonthChange"),ge())}function Q(e){return!(!E.config.appendTo||!E.config.appendTo.contains(e))||E.calendarContainer.contains(e)}function X(e){if(E.isOpen&&!E.config.inline){var n=p(e),t=Q(n),r=n===E.input||n===E.altInput||E.element.contains(n)||e.path&&e.path.indexOf&&(~e.path.indexOf(E.input)||~e.path.indexOf(E.altInput)),o="blur"===e.type?r&&e.relatedTarget&&!Q(e.relatedTarget):!r&&!t&&!Q(e.relatedTarget),a=!E.config.ignoredFocusElements.some((function(e){return e.contains(n)}));o&&a&&(void 0!==E.timeContainer&&void 0!==E.minuteElement&&void 0!==E.hourElement&&""!==E.input.value&&void 0!==E.input.value&&x(),E.close(),E.config&&"range"===E.config.mode&&1===E.selectedDates.length&&(E.clear(!1),E.redraw()))}}function Z(e){if(!(!e||E.config.minDate&&eE.config.maxDate.getFullYear())){var n=e,t=E.currentYear!==n;E.currentYear=n||E.currentYear,E.config.maxDate&&E.currentYear===E.config.maxDate.getFullYear()?E.currentMonth=Math.min(E.config.maxDate.getMonth(),E.currentMonth):E.config.minDate&&E.currentYear===E.config.minDate.getFullYear()&&(E.currentMonth=Math.max(E.config.minDate.getMonth(),E.currentMonth)),t&&(E.redraw(),ve("onYearChange"),Y())}}function $(e,n){var t;void 0===n&&(n=!0);var r=E.parseDate(e,void 0,n);if(E.config.minDate&&r&&A(r,E.config.minDate,void 0!==n?n:!E.minDateHasTime)<0||E.config.maxDate&&r&&A(r,E.config.maxDate,void 0!==n?n:!E.maxDateHasTime)>0)return!1;if(!E.config.enable&&0===E.config.disable.length)return!0;if(void 0===r)return!1;for(var o=!!E.config.enable,a=null!==(t=E.config.enable)&&void 0!==t?t:E.config.disable,i=0,s=void 0;i=s.from.getTime()&&r.getTime()<=s.to.getTime())return o}return!o}function ee(e){return void 0!==E.daysContainer&&-1===e.className.indexOf("hidden")&&-1===e.className.indexOf("flatpickr-disabled")&&E.daysContainer.contains(e)}function ne(e){e.target!==E._input||!(E.selectedDates.length>0||E._input.value.length>0)||e.relatedTarget&&Q(e.relatedTarget)||E.setDate(E._input.value,!0,e.target===E.altInput?E.config.altFormat:E.config.dateFormat)}function te(e){var n=p(e),t=E.config.wrap?v.contains(n):n===E._input,r=E.config.allowInput,o=E.isOpen&&(!r||!t),a=E.config.inline&&t&&!r;if(13===e.keyCode&&t){if(r)return E.setDate(E._input.value,!0,n===E.altInput?E.config.altFormat:E.config.dateFormat),n.blur();E.open()}else if(Q(n)||o||a){var i=!!E.timeContainer&&E.timeContainer.contains(n);switch(e.keyCode){case 13:i?(e.preventDefault(),x(),fe()):le(e);break;case 27:e.preventDefault(),fe();break;case 8:case 46:t&&!E.config.allowInput&&(e.preventDefault(),E.clear());break;case 37:case 39:if(i||t)E.hourElement&&E.hourElement.focus();else if(e.preventDefault(),void 0!==E.daysContainer&&(!1===r||document.activeElement&&ee(document.activeElement))){var s=39===e.keyCode?1:-1;e.ctrlKey?(e.stopPropagation(),z(s),U(K(1),0)):U(void 0,s)}break;case 38:case 40:e.preventDefault();var c=40===e.keyCode?1:-1;E.daysContainer&&void 0!==n.$i||n===E.input||n===E.altInput?e.ctrlKey?(e.stopPropagation(),Z(E.currentYear-c),U(K(1),0)):i||U(void 0,7*c):n===E.currentYearElement?Z(E.currentYear-c):E.config.enableTime&&(!i&&E.hourElement&&E.hourElement.focus(),x(e),E._debouncedChange());break;case 9:if(i){var u=[E.hourElement,E.minuteElement,E.secondElement,E.amPM].concat(E.pluginElements).filter((function(e){return e})),f=u.indexOf(n);if(-1!==f){var l=u[f+(e.shiftKey?-1:1)];e.preventDefault(),(l||E._input).focus()}}else!E.config.noCalendar&&E.daysContainer&&E.daysContainer.contains(n)&&e.shiftKey&&(e.preventDefault(),E._input.focus())}}if(void 0!==E.amPM&&n===E.amPM)switch(e.key){case E.l10n.amPM[0].charAt(0):case E.l10n.amPM[0].charAt(0).toLowerCase():E.amPM.textContent=E.l10n.amPM[0],N(),be();break;case E.l10n.amPM[1].charAt(0):case E.l10n.amPM[1].charAt(0).toLowerCase():E.amPM.textContent=E.l10n.amPM[1],N(),be()}(t||Q(n))&&ve("onKeyDown",e)}function re(e){if(1===E.selectedDates.length&&(!e||e.classList.contains("flatpickr-day")&&!e.classList.contains("flatpickr-disabled"))){for(var n=e?e.dateObj.getTime():E.days.firstElementChild.dateObj.getTime(),t=E.parseDate(E.selectedDates[0],void 0,!0).getTime(),r=Math.min(n,E.selectedDates[0].getTime()),o=Math.max(n,E.selectedDates[0].getTime()),a=!1,i=0,s=0,c=r;cr&&ci)?i=c:c>t&&(!s||c0&&h0&&h>s;return p?(d.classList.add("notAllowed"),["inRange","startRange","endRange"].forEach((function(e){d.classList.remove(e)})),"continue"):a&&!p?"continue":(["startRange","inRange","endRange","notAllowed"].forEach((function(e){d.classList.remove(e)})),void(void 0!==e&&(e.classList.add(n<=E.selectedDates[0].getTime()?"startRange":"endRange"),tn&&h===t&&d.classList.add("endRange"),h>=i&&(0===s||h<=s)&&(u=t,l=n,(c=h)>Math.min(u,l)&&c0||t.getMinutes()>0||t.getSeconds()>0),E.selectedDates&&(E.selectedDates=E.selectedDates.filter((function(e){return $(e)})),E.selectedDates.length||"min"!==e||I(t),be()),E.daysContainer&&(ue(),void 0!==t?E.currentYearElement[e]=t.getFullYear().toString():E.currentYearElement.removeAttribute(e),E.currentYearElement.disabled=!!r&&void 0!==t&&r.getFullYear()===t.getFullYear())}}function ie(){return E.config.wrap?v.querySelector("[data-input]"):v}function se(){"object"!=typeof E.config.locale&&void 0===S.l10ns[E.config.locale]&&E.config.errorHandler(new Error("flatpickr: invalid locale "+E.config.locale)),E.l10n=e(e({},S.l10ns.default),"object"==typeof E.config.locale?E.config.locale:"default"!==E.config.locale?S.l10ns[E.config.locale]:void 0),g.K="("+E.l10n.amPM[0]+"|"+E.l10n.amPM[1]+"|"+E.l10n.amPM[0].toLowerCase()+"|"+E.l10n.amPM[1].toLowerCase()+")",void 0===e(e({},m),JSON.parse(JSON.stringify(v.dataset||{}))).time_24hr&&void 0===S.defaultConfig.time_24hr&&(E.config.time_24hr=E.l10n.time_24hr),E.formatDate=b(E),E.parseDate=O({config:E.config,l10n:E.l10n})}function ce(e){if("function"!=typeof E.config.position){if(void 0!==E.calendarContainer){ve("onPreCalendarPosition");var n=e||E._positionElement,t=Array.prototype.reduce.call(E.calendarContainer.children,(function(e,n){return e+n.offsetHeight}),0),r=E.calendarContainer.offsetWidth,o=E.config.position.split(" "),a=o[0],i=o.length>1?o[1]:null,s=n.getBoundingClientRect(),c=window.innerHeight-s.bottom,f="above"===a||"below"!==a&&ct,l=window.pageYOffset+s.top+(f?-t-2:n.offsetHeight+2);if(u(E.calendarContainer,"arrowTop",!f),u(E.calendarContainer,"arrowBottom",f),!E.config.inline){var d=window.pageXOffset+s.left,h=!1,p=!1;"center"===i?(d-=(r-s.width)/2,h=!0):"right"===i&&(d-=r-s.width,p=!0),u(E.calendarContainer,"arrowLeft",!h&&!p),u(E.calendarContainer,"arrowCenter",h),u(E.calendarContainer,"arrowRight",p);var v=window.document.body.offsetWidth-(window.pageXOffset+s.right),y=d+r>window.document.body.offsetWidth,m=v+r>window.document.body.offsetWidth;if(u(E.calendarContainer,"rightMost",y),!E.config.static)if(E.calendarContainer.style.top=l+"px",y)if(m){var g=function(){for(var e=null,n=0;nE.currentMonth+E.config.showMonths-1)&&"range"!==E.config.mode;if(E.selectedDateElem=t,"single"===E.config.mode)E.selectedDates=[r];else if("multiple"===E.config.mode){var a=me(r);a?E.selectedDates.splice(parseInt(a),1):E.selectedDates.push(r)}else"range"===E.config.mode&&(2===E.selectedDates.length&&E.clear(!1,!1),E.latestSelectedDateObj=r,E.selectedDates.push(r),0!==A(r,E.selectedDates[0],!0)&&E.selectedDates.sort((function(e,n){return e.getTime()-n.getTime()})));if(N(),o){var i=E.currentYear!==r.getFullYear();E.currentYear=r.getFullYear(),E.currentMonth=r.getMonth(),i&&(ve("onYearChange"),Y()),ve("onMonthChange")}if(ge(),V(),be(),o||"range"===E.config.mode||1!==E.config.showMonths?void 0!==E.selectedDateElem&&void 0===E.hourElement&&E.selectedDateElem&&E.selectedDateElem.focus():j(t),void 0!==E.hourElement&&void 0!==E.hourElement&&E.hourElement.focus(),E.config.closeOnSelect){var s="single"===E.config.mode&&!E.config.enableTime,c="range"===E.config.mode&&2===E.selectedDates.length&&!E.config.enableTime;(s||c)&&fe()}k()}}E.parseDate=O({config:E.config,l10n:E.l10n}),E._handlers=[],E.pluginElements=[],E.loadedPlugins=[],E._bind=P,E._setHoursFromDate=I,E._positionCalendar=ce,E.changeMonth=z,E.changeYear=Z,E.clear=function(e,n){if(void 0===e&&(e=!0),void 0===n&&(n=!0),E.input.value="",void 0!==E.altInput&&(E.altInput.value=""),void 0!==E.mobileInput&&(E.mobileInput.value=""),E.selectedDates=[],E.latestSelectedDateObj=void 0,!0===n&&(E.currentYear=E._initialDate.getFullYear(),E.currentMonth=E._initialDate.getMonth()),!0===E.config.enableTime){var t=D(E.config);C(t.hours,t.minutes,t.seconds)}E.redraw(),e&&ve("onChange")},E.close=function(){E.isOpen=!1,E.isMobile||(void 0!==E.calendarContainer&&E.calendarContainer.classList.remove("open"),void 0!==E._input&&E._input.classList.remove("active")),ve("onClose")},E._createElement=f,E.destroy=function(){void 0!==E.config&&ve("onDestroy");for(var e=E._handlers.length;e--;)E._handlers[e].remove();if(E._handlers=[],E.mobileInput)E.mobileInput.parentNode&&E.mobileInput.parentNode.removeChild(E.mobileInput),E.mobileInput=void 0;else if(E.calendarContainer&&E.calendarContainer.parentNode)if(E.config.static&&E.calendarContainer.parentNode){var n=E.calendarContainer.parentNode;if(n.lastChild&&n.removeChild(n.lastChild),n.parentNode){for(;n.firstChild;)n.parentNode.insertBefore(n.firstChild,n);n.parentNode.removeChild(n)}}else E.calendarContainer.parentNode.removeChild(E.calendarContainer);E.altInput&&(E.input.type="text",E.altInput.parentNode&&E.altInput.parentNode.removeChild(E.altInput),delete E.altInput),E.input&&(E.input.type=E.input._type,E.input.classList.remove("flatpickr-input"),E.input.removeAttribute("readonly")),["_showTimeInput","latestSelectedDateObj","_hideNextMonthArrow","_hidePrevMonthArrow","__hideNextMonthArrow","__hidePrevMonthArrow","isMobile","isOpen","selectedDateElem","minDateHasTime","maxDateHasTime","days","daysContainer","_input","_positionElement","innerContainer","rContainer","monthNav","todayDateElem","calendarContainer","weekdayContainer","prevMonthNav","nextMonthNav","monthsDropdownContainer","currentMonthElement","currentYearElement","navigationCurrentMonth","selectedDateElem","config"].forEach((function(e){try{delete E[e]}catch(e){}}))},E.isEnabled=$,E.jumpToDate=M,E.open=function(e,n){if(void 0===n&&(n=E._positionElement),!0===E.isMobile){if(e){e.preventDefault();var t=p(e);t&&t.blur()}return void 0!==E.mobileInput&&(E.mobileInput.focus(),E.mobileInput.click()),void ve("onOpen")}if(!E._input.disabled&&!E.config.inline){var r=E.isOpen;E.isOpen=!0,r||(E.calendarContainer.classList.add("open"),E._input.classList.add("active"),ve("onOpen"),ce(n)),!0===E.config.enableTime&&!0===E.config.noCalendar&&(!1!==E.config.allowInput||void 0!==e&&E.timeContainer.contains(e.relatedTarget)||setTimeout((function(){return E.hourElement.select()}),50))}},E.redraw=ue,E.set=function(e,n){if(null!==e&&"object"==typeof e)for(var r in Object.assign(E.config,e),e)void 0!==de[r]&&de[r].forEach((function(e){return e()}));else E.config[e]=n,void 0!==de[e]?de[e].forEach((function(e){return e()})):t.indexOf(e)>-1&&(E.config[e]=c(n));E.redraw(),be(!0)},E.setDate=function(e,n,t){if(void 0===n&&(n=!1),void 0===t&&(t=E.config.dateFormat),0!==e&&!e||e instanceof Array&&0===e.length)return E.clear(n);he(e,t),E.latestSelectedDateObj=E.selectedDates[E.selectedDates.length-1],E.redraw(),M(void 0,n),I(),0===E.selectedDates.length&&E.clear(!1),be(n),n&&ve("onChange")},E.toggle=function(e){if(!0===E.isOpen)return E.close();E.open(e)};var de={locale:[se,W],showMonths:[J,T,q],minDate:[M],maxDate:[M],clickOpens:[function(){!0===E.config.clickOpens?(P(E._input,"focus",E.open),P(E._input,"click",E.open)):(E._input.removeEventListener("focus",E.open),E._input.removeEventListener("click",E.open))}]};function he(e,n){var t=[];if(e instanceof Array)t=e.map((function(e){return E.parseDate(e,n)}));else if(e instanceof Date||"number"==typeof e)t=[E.parseDate(e,n)];else if("string"==typeof e)switch(E.config.mode){case"single":case"time":t=[E.parseDate(e,n)];break;case"multiple":t=e.split(E.config.conjunction).map((function(e){return E.parseDate(e,n)}));break;case"range":t=e.split(E.l10n.rangeSeparator).map((function(e){return E.parseDate(e,n)}))}else E.config.errorHandler(new Error("Invalid date supplied: "+JSON.stringify(e)));E.selectedDates=E.config.allowInvalidPreload?t:t.filter((function(e){return e instanceof Date&&$(e,!1)})),"range"===E.config.mode&&E.selectedDates.sort((function(e,n){return e.getTime()-n.getTime()}))}function pe(e){return e.slice().map((function(e){return"string"==typeof e||"number"==typeof e||e instanceof Date?E.parseDate(e,void 0,!0):e&&"object"==typeof e&&e.from&&e.to?{from:E.parseDate(e.from,void 0),to:E.parseDate(e.to,void 0)}:e})).filter((function(e){return e}))}function ve(e,n){if(void 0!==E.config){var t=E.config[e];if(void 0!==t&&t.length>0)for(var r=0;t[r]&&r1||"static"===E.config.monthSelectorType?E.monthElements[n].textContent=y(t.getMonth(),E.config.shorthandCurrentMonth,E.l10n)+" ":E.monthsDropdownContainer.value=t.getMonth().toString(),e.value=t.getFullYear().toString()})),E._hidePrevMonthArrow=void 0!==E.config.minDate&&(E.currentYear===E.config.minDate.getFullYear()?E.currentMonth<=E.config.minDate.getMonth():E.currentYearE.config.maxDate.getMonth():E.currentYear>E.config.maxDate.getFullYear()))}function Ee(e){return E.selectedDates.map((function(n){return E.formatDate(n,e)})).filter((function(e,n,t){return"range"!==E.config.mode||E.config.enableTime||t.indexOf(e)===n})).join("range"!==E.config.mode?E.config.conjunction:E.l10n.rangeSeparator)}function be(e){void 0===e&&(e=!0),void 0!==E.mobileInput&&E.mobileFormatStr&&(E.mobileInput.value=void 0!==E.latestSelectedDateObj?E.formatDate(E.latestSelectedDateObj,E.mobileFormatStr):""),E.input.value=Ee(E.config.dateFormat),void 0!==E.altInput&&(E.altInput.value=Ee(E.config.altFormat)),!1!==e&&ve("onValueUpdate")}function Oe(e){var n=p(e),t=E.prevMonthNav.contains(n),r=E.nextMonthNav.contains(n);t||r?z(t?-1:1):E.yearElements.indexOf(n)>=0?n.select():n.classList.contains("arrowUp")?E.changeYear(E.currentYear+1):n.classList.contains("arrowDown")&&E.changeYear(E.currentYear-1)}return function(){E.element=E.input=v,E.isOpen=!1,function(){var n=["wrap","weekNumbers","allowInput","allowInvalidPreload","clickOpens","time_24hr","enableTime","noCalendar","altInput","shorthandCurrentMonth","inline","static","enableSeconds","disableMobile"],o=e(e({},JSON.parse(JSON.stringify(v.dataset||{}))),m),a={};E.config.parseDate=o.parseDate,E.config.formatDate=o.formatDate,Object.defineProperty(E.config,"enable",{get:function(){return E.config._enable},set:function(e){E.config._enable=pe(e)}}),Object.defineProperty(E.config,"disable",{get:function(){return E.config._disable},set:function(e){E.config._disable=pe(e)}});var i="time"===o.mode;if(!o.dateFormat&&(o.enableTime||i)){var s=S.defaultConfig.dateFormat||r.dateFormat;a.dateFormat=o.noCalendar||i?"H:i"+(o.enableSeconds?":S":""):s+" H:i"+(o.enableSeconds?":S":"")}if(o.altInput&&(o.enableTime||i)&&!o.altFormat){var u=S.defaultConfig.altFormat||r.altFormat;a.altFormat=o.noCalendar||i?"h:i"+(o.enableSeconds?":S K":" K"):u+" h:i"+(o.enableSeconds?":S":"")+" K"}Object.defineProperty(E.config,"minDate",{get:function(){return E.config._minDate},set:ae("min")}),Object.defineProperty(E.config,"maxDate",{get:function(){return E.config._maxDate},set:ae("max")});var f=function(e){return function(n){E.config["min"===e?"_minTime":"_maxTime"]=E.parseDate(n,"H:i:S")}};Object.defineProperty(E.config,"minTime",{get:function(){return E.config._minTime},set:f("min")}),Object.defineProperty(E.config,"maxTime",{get:function(){return E.config._maxTime},set:f("max")}),"time"===o.mode&&(E.config.noCalendar=!0,E.config.enableTime=!0),Object.assign(E.config,a,o);for(var l=0;l-1?E.config[h]=c(d[h]).map(_).concat(E.config[h]):void 0===o[h]&&(E.config[h]=d[h])}o.altInputClass||(E.config.altInputClass=ie().className+" "+E.config.altInputClass),ve("onParseConfig")}(),se(),E.input=ie(),E.input?(E.input._type=E.input.type,E.input.type="text",E.input.classList.add("flatpickr-input"),E._input=E.input,E.config.altInput&&(E.altInput=f(E.input.nodeName,E.config.altInputClass),E._input=E.altInput,E.altInput.placeholder=E.input.placeholder,E.altInput.disabled=E.input.disabled,E.altInput.required=E.input.required,E.altInput.tabIndex=E.input.tabIndex,E.altInput.type="text",E.input.setAttribute("type","hidden"),!E.config.static&&E.input.parentNode&&E.input.parentNode.insertBefore(E.altInput,E.input.nextSibling)),E.config.allowInput||E._input.setAttribute("readonly","readonly"),E._positionElement=E.config.positionElement||E._input):E.config.errorHandler(new Error("Invalid input element specified")),function(){E.selectedDates=[],E.now=E.parseDate(E.config.now)||new Date;var e=E.config.defaultDate||("INPUT"!==E.input.nodeName&&"TEXTAREA"!==E.input.nodeName||!E.input.placeholder||E.input.value!==E.input.placeholder?E.input.value:null);e&&he(e,E.config.dateFormat),E._initialDate=E.selectedDates.length>0?E.selectedDates[0]:E.config.minDate&&E.config.minDate.getTime()>E.now.getTime()?E.config.minDate:E.config.maxDate&&E.config.maxDate.getTime()0&&(E.latestSelectedDateObj=E.selectedDates[0]),void 0!==E.config.minTime&&(E.config.minTime=E.parseDate(E.config.minTime,"H:i")),void 0!==E.config.maxTime&&(E.config.maxTime=E.parseDate(E.config.maxTime,"H:i")),E.minDateHasTime=!!E.config.minDate&&(E.config.minDate.getHours()>0||E.config.minDate.getMinutes()>0||E.config.minDate.getSeconds()>0),E.maxDateHasTime=!!E.config.maxDate&&(E.config.maxDate.getHours()>0||E.config.maxDate.getMinutes()>0||E.config.maxDate.getSeconds()>0)}(),E.utils={getDaysInMonth:function(e,n){return void 0===e&&(e=E.currentMonth),void 0===n&&(n=E.currentYear),1===e&&(n%4==0&&n%100!=0||n%400==0)?29:E.l10n.daysInMonth[e]}},E.isMobile||function(){var e=window.document.createDocumentFragment();if(E.calendarContainer=f("div","flatpickr-calendar"),E.calendarContainer.tabIndex=-1,!E.config.noCalendar){if(e.appendChild((E.monthNav=f("div","flatpickr-months"),E.yearElements=[],E.monthElements=[],E.prevMonthNav=f("span","flatpickr-prev-month"),E.prevMonthNav.innerHTML=E.config.prevArrow,E.nextMonthNav=f("span","flatpickr-next-month"),E.nextMonthNav.innerHTML=E.config.nextArrow,J(),Object.defineProperty(E,"_hidePrevMonthArrow",{get:function(){return E.__hidePrevMonthArrow},set:function(e){E.__hidePrevMonthArrow!==e&&(u(E.prevMonthNav,"flatpickr-disabled",e),E.__hidePrevMonthArrow=e)}}),Object.defineProperty(E,"_hideNextMonthArrow",{get:function(){return E.__hideNextMonthArrow},set:function(e){E.__hideNextMonthArrow!==e&&(u(E.nextMonthNav,"flatpickr-disabled",e),E.__hideNextMonthArrow=e)}}),E.currentYearElement=E.yearElements[0],ge(),E.monthNav)),E.innerContainer=f("div","flatpickr-innerContainer"),E.config.weekNumbers){var n=function(){E.calendarContainer.classList.add("hasWeeks");var e=f("div","flatpickr-weekwrapper");e.appendChild(f("span","flatpickr-weekday",E.l10n.weekAbbreviation));var n=f("div","flatpickr-weeks");return e.appendChild(n),{weekWrapper:e,weekNumbers:n}}(),t=n.weekWrapper,r=n.weekNumbers;E.innerContainer.appendChild(t),E.weekNumbers=r,E.weekWrapper=t}E.rContainer=f("div","flatpickr-rContainer"),E.rContainer.appendChild(q()),E.daysContainer||(E.daysContainer=f("div","flatpickr-days"),E.daysContainer.tabIndex=-1),V(),E.rContainer.appendChild(E.daysContainer),E.innerContainer.appendChild(E.rContainer),e.appendChild(E.innerContainer)}E.config.enableTime&&e.appendChild(function(){E.calendarContainer.classList.add("hasTime"),E.config.noCalendar&&E.calendarContainer.classList.add("noCalendar");var e=D(E.config);E.timeContainer=f("div","flatpickr-time"),E.timeContainer.tabIndex=-1;var n=f("span","flatpickr-time-separator",":"),t=h("flatpickr-hour",{"aria-label":E.l10n.hourAriaLabel});E.hourElement=t.getElementsByTagName("input")[0];var r=h("flatpickr-minute",{"aria-label":E.l10n.minuteAriaLabel});if(E.minuteElement=r.getElementsByTagName("input")[0],E.hourElement.tabIndex=E.minuteElement.tabIndex=-1,E.hourElement.value=a(E.latestSelectedDateObj?E.latestSelectedDateObj.getHours():E.config.time_24hr?e.hours:function(e){switch(e%24){case 0:case 12:return 12;default:return e%12}}(e.hours)),E.minuteElement.value=a(E.latestSelectedDateObj?E.latestSelectedDateObj.getMinutes():e.minutes),E.hourElement.setAttribute("step",E.config.hourIncrement.toString()),E.minuteElement.setAttribute("step",E.config.minuteIncrement.toString()),E.hourElement.setAttribute("min",E.config.time_24hr?"0":"1"),E.hourElement.setAttribute("max",E.config.time_24hr?"23":"12"),E.hourElement.setAttribute("maxlength","2"),E.minuteElement.setAttribute("min","0"),E.minuteElement.setAttribute("max","59"),E.minuteElement.setAttribute("maxlength","2"),E.timeContainer.appendChild(t),E.timeContainer.appendChild(n),E.timeContainer.appendChild(r),E.config.time_24hr&&E.timeContainer.classList.add("time24hr"),E.config.enableSeconds){E.timeContainer.classList.add("hasSeconds");var o=h("flatpickr-second");E.secondElement=o.getElementsByTagName("input")[0],E.secondElement.value=a(E.latestSelectedDateObj?E.latestSelectedDateObj.getSeconds():e.seconds),E.secondElement.setAttribute("step",E.minuteElement.getAttribute("step")),E.secondElement.setAttribute("min","0"),E.secondElement.setAttribute("max","59"),E.secondElement.setAttribute("maxlength","2"),E.timeContainer.appendChild(f("span","flatpickr-time-separator",":")),E.timeContainer.appendChild(o)}return E.config.time_24hr||(E.amPM=f("span","flatpickr-am-pm",E.l10n.amPM[i((E.latestSelectedDateObj?E.hourElement.value:E.config.defaultHour)>11)]),E.amPM.title=E.l10n.toggleTitle,E.amPM.tabIndex=-1,E.timeContainer.appendChild(E.amPM)),E.timeContainer}()),u(E.calendarContainer,"rangeMode","range"===E.config.mode),u(E.calendarContainer,"animate",!0===E.config.animate),u(E.calendarContainer,"multiMonth",E.config.showMonths>1),E.calendarContainer.appendChild(e);var o=void 0!==E.config.appendTo&&void 0!==E.config.appendTo.nodeType;if((E.config.inline||E.config.static)&&(E.calendarContainer.classList.add(E.config.inline?"inline":"static"),E.config.inline&&(!o&&E.element.parentNode?E.element.parentNode.insertBefore(E.calendarContainer,E._input.nextSibling):void 0!==E.config.appendTo&&E.config.appendTo.appendChild(E.calendarContainer)),E.config.static)){var s=f("div","flatpickr-wrapper");E.element.parentNode&&E.element.parentNode.insertBefore(s,E.element),s.appendChild(E.element),E.altInput&&s.appendChild(E.altInput),s.appendChild(E.calendarContainer)}E.config.static||E.config.inline||(void 0!==E.config.appendTo?E.config.appendTo:window.document.body).appendChild(E.calendarContainer)}(),function(){if(E.config.wrap&&["open","close","toggle","clear"].forEach((function(e){Array.prototype.forEach.call(E.element.querySelectorAll("[data-"+e+"]"),(function(n){return P(n,"click",E[e])}))})),E.isMobile)!function(){var e=E.config.enableTime?E.config.noCalendar?"time":"datetime-local":"date";E.mobileInput=f("input",E.input.className+" flatpickr-mobile"),E.mobileInput.tabIndex=1,E.mobileInput.type=e,E.mobileInput.disabled=E.input.disabled,E.mobileInput.required=E.input.required,E.mobileInput.placeholder=E.input.placeholder,E.mobileFormatStr="datetime-local"===e?"Y-m-d\\TH:i:S":"date"===e?"Y-m-d":"H:i:S",E.selectedDates.length>0&&(E.mobileInput.defaultValue=E.mobileInput.value=E.formatDate(E.selectedDates[0],E.mobileFormatStr)),E.config.minDate&&(E.mobileInput.min=E.formatDate(E.config.minDate,"Y-m-d")),E.config.maxDate&&(E.mobileInput.max=E.formatDate(E.config.maxDate,"Y-m-d")),E.input.getAttribute("step")&&(E.mobileInput.step=String(E.input.getAttribute("step"))),E.input.type="hidden",void 0!==E.altInput&&(E.altInput.type="hidden");try{E.input.parentNode&&E.input.parentNode.insertBefore(E.mobileInput,E.input.nextSibling)}catch(e){}P(E.mobileInput,"change",(function(e){E.setDate(p(e).value,!1,E.mobileFormatStr),ve("onChange"),ve("onClose")}))}();else{var e=s(oe,50);if(E._debouncedChange=s(k,300),E.daysContainer&&!/iPhone|iPad|iPod/i.test(navigator.userAgent)&&P(E.daysContainer,"mouseover",(function(e){"range"===E.config.mode&&re(p(e))})),P(window.document.body,"keydown",te),E.config.inline||E.config.static||P(window,"resize",e),void 0!==window.ontouchstart?P(window.document,"touchstart",X):P(window.document,"mousedown",X),P(window.document,"focus",X,{capture:!0}),!0===E.config.clickOpens&&(P(E._input,"focus",E.open),P(E._input,"click",E.open)),void 0!==E.daysContainer&&(P(E.monthNav,"click",Oe),P(E.monthNav,["keyup","increment"],R),P(E.daysContainer,"click",le)),void 0!==E.timeContainer&&void 0!==E.minuteElement&&void 0!==E.hourElement){var n=function(e){return p(e).select()};P(E.timeContainer,["increment"],x),P(E.timeContainer,"blur",x,{capture:!0}),P(E.timeContainer,"click",F),P([E.hourElement,E.minuteElement],["focus","click"],n),void 0!==E.secondElement&&P(E.secondElement,"focus",(function(){return E.secondElement&&E.secondElement.select()})),void 0!==E.amPM&&P(E.amPM,"click",(function(e){x(e),k()}))}E.config.allowInput&&P(E._input,"blur",ne)}}(),(E.selectedDates.length||E.config.noCalendar)&&(E.config.enableTime&&I(E.config.noCalendar?E.latestSelectedDateObj:void 0),be(!1)),T();var n=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);!E.isMobile&&n&&ce(),ve("onReady")}(),E}function T(e,n){for(var t=Array.prototype.slice.call(e).filter((function(e){return e instanceof HTMLElement})),r=[],o=0;o{const n=(e,n,t,r,o,a,i,s,c,u,f)=>{var l={setCustomize:()=>{}},d=function(e,n){if(!n||1===n)return e.store;var t=e.store.modules&&e.store.modules.team;return t?t.getTeam(n):void 0},h=function(n,t){n.emit("UPDATE",{teams:t.stores,roTeams:t.roStores,id:t.channel,loading:!t.ready&&!t.cacheready,readOnly:t.readOnly||!t.ready&&t.cacheready||t.offline,offline:t.offline,deleted:!t.stores.length,restricted:t.restricted,owned:n.Store.isOwned(t.owners),content:e.clone(t.proxy),hashes:t.hashes},n.clients)},p=function(e,n){var t=e.calendars[n];t&&t.reminders&&Object.keys(t.reminders).forEach((function(e){Array.isArray(t.reminders[e])&&t.reminders[e].forEach((function(e){clearTimeout(e)}))}))},v=function(e,n){var t=e.calendars[n];t&&(t.stores.length||(t.lm.stop(),p(e,n),delete e.calendars[n]))},y=function(e,n,t){n.stores.forEach((function(r){var o=d(e,r);if(o&&o.proxy&&o.rpc&&o.proxy.calendars){var a=o.proxy.calendars[n.channel];a&&(a.color!==t.color&&(a.color=t.color),a.title!==t.title&&(a.title=t.title))}}))},m=function(n,t,r,o){var a=+new Date,i=e.clone(r),s=i.id;if(Array.isArray(t[s])&&t[s].forEach((function(e){clearTimeout(e)})),t[s]=[],!r.deleted){var u=e.find(n,["store","proxy","hideReminders",s])||[],f=n.store.data.lastVisit;if(i.isAllDay&&(i.startDay&&(i.start=+c.parseDate(i.startDay)),i.endDay)){var l=c.parseDate(i.endDay);l.setHours(23),l.setMinutes(59),l.setSeconds(59),i.end=+l}var d=a-6048e5,h=o&&i.start>f&&i.end<=a&&i.end>d;if(i.end<=a&&!h)return delete t[s],void function(n,t){var r=e.find(n,["store","proxy","hideReminders"])||{};Object.keys(r).filter((function(e){return e===t})).forEach((function(e){delete r[e]}))}(n,s);var p=!1,v=function(t){p=!0,n.Store.onReadyEvt.reg((function(){!function(t){if(!e.find(n,["store","proxy","settings","general","calendar","hideNotif"])){var r=i.start<=a?i.start:+new Date;n.store.mailbox.showMessage("reminders",{msg:{ctime:r,type:"REMINDER",missed:Boolean(h),content:i},hash:"REMINDER|"+s+"-"+t},null,(function(){}))}}(t)}))},y=i.reminders||[];y.sort((function(e,n){return e-n})),y.some((function(e){var n=a+6e4*e;if(!u.some((function(n){return e>=n})))return i.start-n>=2147483647||(i.start<=n?(v(e),!0):void t[s].push(setTimeout((function(){v(e)}),i.start-n)))})),p||n.Store.onReadyEvt.reg((function(){n.store.mailbox.hideMessage("reminders",{hash:"REMINDER|"+s},null,(function(){}))}))}},g=function(n,t,r,o){var i=function(e){var n=new Date,t=new Date(n.getFullYear(),n.getMonth()-1,15),r=new Date(n.getFullYear(),n.getMonth()+1,15),o=a.getMonthId(t),i=a.getMonthId(n),s=a.getMonthId(r),c=a.getRecurring([o,i,s],[e]),u=[e];return Array.prototype.push.apply(u,c),a.applyUpdates(u)}(e.clone(r));i.forEach((function(e){m(n,t,e,o)}))},E=function(e,n,t){var r=e.calendars[n];t&&r&&r.reminders&&(1===r.stores.length&&0===r.stores[0]||g(e,r.reminders,t))},b=function(n,t,r){var o=n.calendars[t];if(o&&o.reminders&&!Object.keys(o.reminders).length&&(1!==o.stores.length||0!==o.stores[0])){var a=e.find(o,["proxy","content"]);a&&Object.keys(a).forEach((function(e){g(n,o.reminders,a[e],r)}))}},O=function(t,r,a){var c=e.once(e.mkAsync(a||function(){})),l=r.storeId,v=r.data,m=v.channel;if(m){var g=t.calendars[m],O=function(){h(t,g)};if(g){if(g.readOnly&&v.href){var A=n.parsePadUrl(v.href),w=n.getSecrets("calendar",A.hash,v.password),D=u.createEncryptor(w.keys);g.hashes.editHash=n.getEditHashFromKeys(w),g.lm.setReadOnly(!1,D),g.readOnly=!1}else if(0===l)return 1===g.stores.length&&0===g.stores[0]&&g.tempId.length&&r.cId&&g.tempId.push(r.cId),void c();return-1!==g.roStores.indexOf(l)&&v.href&&(g.roStores.splice(g.roStores.indexOf(l),1),-1!==g.stores.indexOf(0)&&g.stores.splice(g.stores.indexOf(0),1),O()),g.stores&&-1!==g.stores.indexOf(l)?void c():(-1!==g.stores.indexOf(0)&&(g.stores.splice(g.stores.indexOf(0),1),g.tempId=[]),g.stores.push(l),v.href||g.roStores.push(l),O(),void c())}g=t.calendars[m]={ready:!1,channel:m,readOnly:!v.href,tempId:[],stores:[l],roStores:v.href?[]:[l],reminders:{},hashes:{}},0===l&&g.tempId.push(r.cId);var _=n.parsePadUrl(v.href||v.roHref),T=n.getSecrets("calendar",_.hash,v.password),S=u.createEncryptor(T.keys);g.hashes.viewHash=n.getViewHashFromKeys(T),v.href&&(g.hashes.editHash=n.getEditHashFromKeys(T)),g.proxy={metadata:{color:v.color,title:v.title}},O();var x=function(){g.stores.forEach((function(e){var n=d(t,e);n&&n.rpc&&n.proxy.calendars&&(delete n.proxy.calendars[m],(n.unpin||t.unpinPads)([m],(function(e){e&&e.error&&console.error(e.error)})))})),g.lm&&g.lm.stop(),g.stores=[],h(t,g),p(t,m),delete t.calendars[m]};i((function(e){t.store.network&&!r.isNew&&t.Store.isNewChannel(null,m,e((function(n){if(!n||!n.error)return n&&"boolean"==typeof n.isNew&&n.isNew?(x(),c({error:"EDELETED"}),void e.abort()):void 0})))})).nThen((function(){var e;if(1!==l&&l){var n=t.store.modules.team&&t.store.modules.team.getTeamsData(),a=n&&n[l];e=a?a.edPublic:void 0}else e=t.store.proxy.edPublic;var i={data:{},network:t.store.network||t.store.networkPromise,channel:T.channel,crypto:S,owners:[e],ChainPad:f,validateKey:T.keys.validateKey||void 0,userName:"calendar",Cache:o,classic:!0,onRejected:t.Store&&t.Store.onRejected},u=s.create(i);g.lm=u;var d=g.proxy=u.proxy,h=!1,p=function(){h||(h=!0,setTimeout((function(){h=!1,O()})))};u.proxy.on("cacheready",(function(){d.metadata&&(g.cacheready=!0,p(),c&&c(null,u.proxy),b(t,m,r.lastVisitNotif))})).on("ready",(function(e){var n=e.metadata;if(g.owners=n.owners||[],g.ready=!0,!d.metadata){if(!r.isNew)return void x();d.metadata={color:v.color,title:v.title}}p(),c&&c(null,u.proxy),b(t,m,r.lastVisitNotif)})).on("change",[],(function(){g.ready&&p()})).on("change",["content"],(function(e,n,r){2!==r.length||!n||e?2!==r.length||n||!e?(r.length>=3&&["start","reminders","isAllDay"].includes(r[2])||r.length>=6&&["start","reminders","isAllDay"].includes(r[5]))&&setTimeout((function(){E(t,m,d.content[r[1]])})):E(t,m,{id:r[1],start:0}):E(t,m,n)})).on("remove",["content"],(function(e,n){p(),(n.length>=3&&"reminders"===n[2]||n.length>=6&&"reminders"===n[5])&&setTimeout((function(){E(t,m,d.content[n[1]])}))})).on("change",["metadata"],(function(){var e=d.metadata;e&&e.title&&e.color&&y(t,g,e)})).on("disconnect",(function(){g.offline=!0,p()})).on("reconnect",(function(){g.offline=!1,p()})).on("error",(function(e){e&&e.error&&("EDELETED"!==e.error?("ERESTRICTED"===e.error&&(g.restricted=!0,p()),c(e)):x())}))}))}},A=function(e,n){if(n.href&&-1===n.href.indexOf("#"))if(e.secondaryKey)try{n.href=e.userObject.cryptor.decrypt(n.href)}catch(e){console.error(e),delete n.href}else delete n.href},w=function(n,t){var r=t.proxy.calendars,o=t.id||1;t.proxy.on("change",["calendars"],(function(r,a,i){i.length<2||(r&&!a&&function(){var e=i[1],t=n.calendars[e];if(t){var r=t.stores.indexOf(o);if(-1!==r){t.stores.splice(r,1);var a=t.roStores.indexOf(o);-1!==a&&t.roStores.splice(a,1),v(n,e),h(n,t)}}}(),!r&&a&&function(){var r=i[1],a=t.proxy.calendars[r];if(a){var s=e.clone(a);A(t,s),O(n,{storeId:o,data:s})}}())})),Object.keys(r||{}).forEach((function(a){var i=e.clone(r[a]);A(t,i),O(n,{storeId:o,lastVisitNotif:!0,data:i})}))},D=function(e,t,o,a){var i=d(e,t.teamId);if(i)if(i.rpc){var s,c,u,f=i.proxy.calendars=i.proxy.calendars||{},l=(s=n.createRandomHash("calendar"),c=n.getSecrets("calendar",s),u=n.getViewHashFromKeys(c),{href:n.hashToHref(s,"calendar"),roHref:n.hashToHref(u,"calendar"),channel:c.channel});l.color=t.color,l.title=t.title,O(e,{storeId:i.id||1,data:l,isNew:!0},(function(n){if(n)return console.error(n),void a({error:n.error});var t=e.calendars[l.channel];r.whenRealtimeSyncs(t.lm.realtime,(function(){f[l.channel]=l,(i.pin||e.pinPads)([l.channel],(function(e){e&&e.error&&console.error(e.error)})),e.Store.onSync(i.id,a)}))}))}else a({error:"EFORBIDDEN"});else a({error:"NO_STORE"})};return l.init=function(t,o,a){var s={},c=t.store,u={loggedIn:c.loggedIn&&c.proxy.edPublic,store:c,Store:t.Store,pinPads:t.pinPads,unpinPads:t.unpinPads,updateMetadata:t.updateMetadata,emit:a,onReady:e.mkEvent(!0),calendars:{},clients:[]};return function(e,n){var t=e.store.proxy;t.calendars=t.calendars||{},setTimeout(n)}(u,o((function(e){e||function(e){w(e,e.store);var n=e.store.modules.team&&e.store.modules.team.getTeamsData();n&&Object.keys(n).forEach((function(n){var t=d(e,n);w(e,t)}))}(u)}))),u.store.proxy.on("change",["hideReminders"],(function(e,n,t){var r=t[1].split("|")[0];Object.keys(u.calendars).some((function(e){var n=u.calendars[e];if(n&&n.proxy&&n.proxy.content)return n.proxy.content[r]?(setTimeout((function(){E(u,e,n.proxy.content[r])})),!0):void 0}))})),s.closeTeam=function(e){Object.keys(u.calendars).forEach((function(n){var t=u.calendars[n],r=t.stores.indexOf(e);if(-1!==r){t.stores.splice(r,1);var o=t.roStores.indexOf(e);-1!==o&&t.roStores.splice(o,1),v(u,n),h(u,t)}}))},s.openTeam=function(e){var n=d(u,e);n&&w(u,n)},s.upgradeTeam=function(n){if(n){var t=d(u,n);t&&Object.keys(u.calendars).forEach((function(r){var o=u.calendars[r];if(-1!==o.stores.indexOf(n)){var a=t.proxy.calendars[r],i=e.clone(a);A(t,i),O(u,{storeId:n,data:i}),h(u,o)}}))}},s.removeClient=function(e){!function(e,n){var t=e.clients.indexOf(n);-1!==t&&e.clients.splice(t,1),Object.keys(e.calendars).forEach((function(t){var r=e.calendars[t];if(1===r.stores.length&&0===r.stores[0]&&r.tempId.length){var o=r.tempId.indexOf(n);-1!==o&&r.tempId.splice(o,1),r.tempId.length||(r.stores=[],v(e,t))}}))}(u,e)},s.execCommand=function(t,o,a){var s=o.cmd,c=o.data;if("SUBSCRIBE"!==s){if("OPEN"!==s)return"IMPORT"===s?u.store.offline?void a({error:"OFFLINE"}):u.loggedIn?void function(t,r,o,a){var i=r.id,s=t.calendars[i];if(s)if(Array.isArray(s.stores)&&-1!==s.stores.indexOf(r.teamId)){var c=t.store,u=c.proxy.calendars=c.proxy.calendars||{},f=s.hashes.editHash,l=s.hashes.viewHash;u[i]={href:f&&n.hashToHref(f,"calendar"),roHref:l&&n.hashToHref(l,"calendar"),channel:i,color:e.find(s,["proxy","metadata","color"])||e.getRandomColor(),title:e.find(s,["proxy","metadata","title"])||"..."},t.Store.onSync(null,a),O(t,{storeId:1,data:{href:u[i].href,toHref:u[i].roHref,channel:i}})}else a({error:"EINVAL"});else a({error:"ENOENT"})}(u,c,0,a):void a({error:"NOT_LOGGED_IN"}):"IMPORT_ICS"===s?u.store.offline?void a({error:"OFFLINE"}):void function(e,n,t,o){var a=n.id,i=e.calendars[a];if(i&&i.proxy){var s=n.json;i.proxy.content=i.proxy.content||{},Object.keys(s).forEach((function(n){i.proxy.content[n]=s[n],E(e,a,s[n])})),r.whenRealtimeSyncs(i.lm.realtime,(function(){h(e,i),o()}))}else o({error:"ENOENT"})}(u,c,0,a):"ADD"===s?u.store.offline?void a({error:"OFFLINE"}):u.loggedIn?void function(t,r,o,a){var i=d(t,r.teamId);if(i)if(i.rpc){var s=i.proxy.calendars=i.proxy.calendars||{},c=n.parsePadUrl(r.href),u=n.getSecrets(c.type,c.hash,r.password);if(u.channel===r.channel){var f=n.getEditHashFromKeys(u),l=n.getViewHashFromKeys(u),h=f&&n.hashToHref(f,"calendar"),p={href:h,roHref:l&&n.hashToHref(l,"calendar"),color:r.color,title:r.title,channel:r.channel};!s[r.channel]||!s[r.channel].href&&p.href?(p.color=r.color,p.title=r.title,O(t,{storeId:i.id||1,data:e.clone(p)},(function(e){if(e)return console.error(e),void a({error:e.error});if(h&&i.id&&i.secondaryKey)try{p.href=i.userObject.cryptor.encrypt(h)}catch(e){console.error(e)}s[p.channel]=p,(i.pin||t.pinPads)([p.channel],(function(e){e&&e.error&&console.error(e.error)})),t.Store.onSync(i.id,a)}))):a()}else a({error:"EINVAL"})}else a({error:"EFORBIDDEN"});else a({error:"NO_STORE"})}(u,c,0,a):void a({error:"NOT_LOGGED_IN"}):"CREATE"===s?u.loggedIn?c.initialCalendar?void u.Store.onReadyEvt.reg((function(){D(u,c,0,a)})):u.store.offline?void a({error:"OFFLINE"}):void D(u,c,0,a):void a({error:"NOT_LOGGED_IN"}):"UPDATE"===s?u.store.offline?void a({error:"OFFLINE"}):void function(n,t,o,a){var i=t.id,s=n.calendars[i];if(s){var c=e.find(s,["proxy","metadata"]);c?(c.title=t.title,c.color=t.color,r.whenRealtimeSyncs(s.lm.realtime,a),h(n,s),y(n,s,t)):a({error:"EINVAL"})}else a({error:"ENOENT"})}(u,c,0,a):"DELETE"===s?u.store.offline?void a({error:"OFFLINE"}):u.loggedIn?void function(e,n,t,r){var o=d(e,n.teamId);if(o)if(o.rpc){if(o.proxy.calendars){var a=n.id;if(o.proxy.calendars[a]){delete o.proxy.calendars[a],(o.unpin||e.unpinPads)([a],(function(e){e&&e.error&&console.error(e.error)}));var i=e.calendars[a],s=i.stores.indexOf(o.id||1);i.stores.splice(s,1),v(e,a),e.Store.onSync(o.id,(function(){h(e,i),r()}))}else r()}}else r({error:"EFORBIDDEN"});else r({error:"NO_STORE"})}(u,c,0,a):void a({error:"NOT_LOGGED_IN"}):"CREATE_EVENT"===s?u.store.offline?void a({error:"OFFLINE"}):void function(e,n,t,o){var a=n.calendarId,i=e.calendars[a];if(i){var s=new Date(n.start),c=new Date(n.end);n.isAllDay?(n.startDay=s.getFullYear()+"-"+(s.getMonth()+1)+"-"+s.getDate(),n.endDay=c.getFullYear()+"-"+(c.getMonth()+1)+"-"+c.getDate()):(delete n.startDay,delete n.endDay),i.proxy.content=i.proxy.content||{},i.proxy.content[n.id]=n,r.whenRealtimeSyncs(i.lm.realtime,(function(){E(e,a,n),h(e,i),o()}))}else o({error:"ENOENT"})}(u,c,0,a):"UPDATE_EVENT"===s?u.store.offline?void a({error:"OFFLINE"}):void function(n,t,o,a){if(t&&t.ev){var s=t.ev.calendarId,c=n.calendars[s];if(c&&c.proxy&&c.proxy.content){var u=c.proxy.content[t.ev.id];if(u){t.rawData=t.rawData||{};var f,l=t.changes||{},d=t.type||{};if(l.calendarId){if(!(f=n.calendars[l.calendarId])||!f.proxy)return void a({error:"ENOENT"});f.proxy.content=f.proxy.content||{}}var p={one:{},from:{}};["one","from","all"].includes(d.which)&&(u.recUpdate=u.recUpdate||p,u.recUpdate.one||(u.recUpdate.one={}),u.recUpdate.from||(u.recUpdate.from={}));var v=u.recUpdate,y=["calendarId"],m=Object.keys(l).filter((function(e){return!y.includes(e)})),g=function(e){[v.from,v.one].forEach((function(n){Object.keys(n).forEach((function(t){Number(t){const n=(e={},n,t,r,o,a,i,s,c,u,f,l,d,h,p,v,y,m,g,E,b,O,A,w,D,_,T,S,x,N,I={},C,R,P,k,M,F)=>{const L=y.Account,H=m.Drive,j=globalThis;globalThis.nacl=globalThis.nacl||C.Nacl;const K=i.Saferphore;var U=i.mkEvent(!0),B=i.mkEvent(!0),V=i.mkEvent(!0),Y=i.mkEvent(!0);var G={drive:{hideDuplicate:!0},pad:{width:!0,spellcheck:!0},security:{unsafeLinks:!1},general:{allowUserFeedback:!0}};return{setCustomize:n=>{e=n.ApiConfig,I=n.AppConfig},create:function(y){var m=j.Cryptpad_Store={};let R=y.query||function(){},k=y.broadcast||function(){};var J=j.CryptPad_AsyncStore={modules:{}};m.onReadyEvt=U;var q=[],W=function(e,n,t){q.forEach((function(r){r!==t&&R(r,e,n)}))},z=function(e){if(!e)return J;try{var n=J.modules.team.getTeam(e);return n||void console.error("Team not found",e)}catch(n){return console.error(n),void console.error("Team not found",e)}},Q=m.onSync=function(e,n){var t=z(e);t?F((function(e){if(t.realtime&&u.whenRealtimeSyncs(t.realtime,e()),!t.id&&t.drive?.realtime&&u.whenRealtimeSyncs(t.drive.realtime,e()),t.sharedFolders&&"object"==typeof t.sharedFolders)for(var n in t.sharedFolders)t.sharedFolders[n].realtime&&u.whenRealtimeSyncs(t.sharedFolders[n].realtime,e())})).nThen((function(){n()})):n({error:"ENOTFOUND"})};m.get=function(e,n,t){var r=z(n.teamId);r?r.proxy?t(i.find(r.proxy,n.key)):t({error:"ENODRIVE"}):t({error:"ENOTFOUND"})},m.set=function(e,n,t){var r=z(n.teamId);if(r)if(r.proxy){var o=n.key.slice(),a=o.pop(),s=i.find(r.proxy,o);s&&"object"==typeof s?(void 0===n.value?delete s[a]:s[a]=n.value,n.teamId||(k([e],"UPDATE_METADATA"),Array.isArray(o)&&"profile"===o[0]&&J.messenger&&f.updateMyData(J)),Q(n.teamId,t)):t({error:"INVALID_PATH"})}else t({error:"ENODRIVE"});else t({error:"ENOTFOUND"})};const X=e=>{let n;if(e){const t=z(e);n=t?.drive?.proxy}else n=J.drive?.proxy;return n};m.drive={get:(e,n,t)=>{let r=X(n.teamId);t(r||{error:"ENOTFOUND"})},set:(e,n,t)=>{let r=X(n.teamId);var o,a;r?(o=r,a=n.value,Object.keys(o).forEach((e=>{delete o[e]})),Object.keys(a).forEach((e=>{o[e]=i.clone(a[e])})),Q(n.teamId,t)):t({error:"ENOTFOUND"})}},m.getSharedFolder=function(e,n,r){var o,a=z(n.teamId),s=n.id;if(a&&a.manager){if(a.manager.folders[s])return(o=i.clone(a.manager.folders[s].proxy)).offline=Boolean(a.manager.folders[s].offline),void r(o);var c=i.find(a.proxy,["drive",t.SHARED_FOLDERS])||{};c[s]?m.loadSharedFolder(n.teamId,s,c[s],(function(){r(a.manager.folders[s].proxy)})):r({})}else r({error:"ENOTFOUND"})},m.restoreSharedFolder=function(e,n,t){if(n.sfId&&n.drive){var r=z(n.teamId);r.sharedFolders[n.sfId]&&(Object.keys(n.drive).forEach((function(e){r.sharedFolders[n.sfId].proxy[e]=n.drive[e]})),Object.keys(r.sharedFolders[n.sfId].proxy).forEach((function(e){n.drive[e]||delete r.sharedFolders[n.sfId].proxy[e]}))),Q(n.teamId,t)}else t({error:"EINVAL"})},m.hasSigningKeys=function(){if(J.proxy)return"string"==typeof J.proxy.edPrivate&&"string"==typeof J.proxy.edPublic},m.hasCurveKeys=function(){if(J.proxy)return"string"==typeof J.proxy.curvePrivate&&"string"==typeof J.proxy.curvePublic},m.isOwned=function(e){var n=J.proxy.edPublic;if(!n)return!1;if(!Array.isArray(e)||!e.length)return!1;if(-1!==e.indexOf(n))return!0;var t=J.proxy.teams;return!!t&&Object.keys(t).some((function(n){var r=i.find(t[n],["keys","drive","edPublic"]);return r&&-1!==e.indexOf(r)}))};var Z=function(e){var n=e?J.manager.getChannelsList("expirable"):function(){var e=`${J.driveChannel}#drive`;if(!e)return null;var n=J.manager.getChannelsList("pin"),t=J.proxy.profile;if(t){var r=t.edit?a.hrefToHexChannelId("/profile/#"+t.edit,null):null;r&&n.push(r);var o=t.avatar?a.hrefToHexChannelId(t.avatar,null):null;o&&n.push(o)}if(J.proxy.todo&&n.push(a.hrefToHexChannelId("/todo/#"+J.proxy.todo,null)),J.proxy.friends){var i=f.getFriendChannelsList(J.proxy);n=n.concat(i)}if(J.proxy.mailboxes){var s=Object.keys(J.proxy.mailboxes).map((function(e){if("broadcast"!==e||J.isAdmin)return J.proxy.mailboxes[e].channel})).filter(Boolean);n=n.concat(s)}if(J.proxy.calendars){var c=Object.keys(J.proxy.calendars).map((function(e){return J.proxy.calendars[e].channel}));n=n.concat(c)}return n.push(e),J.data&&J.data.blockId&&n.push(`${J.data.blockId}#block`),n.sort(),n}();return i.deduplicateString(n).sort()};m.pinPads=function(e,n,t){if(n){var r=z(n&&n.teamId);if(r.rpc){"function"!=typeof t&&(console.error("expected a callback"),t=function(){});var o=n.pads||n;r.rpc.pin(o,(function(e){t(e?{error:e}:{})}))}else t({error:"RPC_NOT_READY"})}else t({error:"EINVAL"})},m.unpinPads=function(e,n,t){if(n){var r=z(n&&n.teamId);if(r.rpc){var o=n.pads||n;r.rpc.unpin(o,(function(e){t(e?{error:e}:{})}))}else t({error:"RPC_NOT_READY"})}else t({error:"EINVAL"})};var $=J.account={};m.getPinnedUsage=function(e,n,t){var r=z(n&&n.teamId);r&&r.rpc?r.rpc.getFileListSize((function(e,n){r.id||"number"!=typeof n||($.usage=n),t({bytes:n})})):t({error:"RPC_NOT_READY"})},m.updatePinLimit=function(e,n,t){J.rpc?J.rpc.updatePinLimits((function(e,n,r,o){e?t({error:e}):($.limit=n,$.plan=r,$.note=o,t($))})):t({error:"RPC_NOT_READY"})},m.getPinLimit=function(e,n,t){var r=z(n&&n.teamId);r.rpc?r.rpc.getLimit((function(e,n,o,a){if(e)t({error:e});else{var i=r.id?{}:$;i.limit=n,i.plan=o,i.note=a,t(i)}})):t({error:"RPC_NOT_READY"})},m.clearOwnedChannel=function(e,n,t){var r=z(n&&n.teamId);r.rpc?r.rpc.clearOwnedChannel(n.channel,(function(e){t({error:e})})):t({error:"RPC_NOT_READY"})};var ee={};m.removeOwnedChannel=function(e,n,t){var r,o,a=n,i=!1;if(n&&"object"==typeof n&&(a=n.channel,i=n.force,r=n.teamId,o=n.reason),a!==J.driveChannel||i){var s=z(r);s?s.rpc?(m.channels[a]&&(ee[a]=!0),s.rpc.removeOwnedChannel(a,(function(e){e&&delete ee[a],t({error:e})}),o)):t({error:"RPC_NOT_READY"}):t({error:"ENOTFOUND"})}else t({error:"User drive removal blocked!"})};m.uploadComplete=function(e,n,t){var r=z(n.teamId);r?r.rpc?n.owned?r.rpc.ownedUploadComplete(n.id,(function(e,n){t(e?{error:e}:n)})):r.rpc.uploadComplete(n.id,(function(e,n){t(e?{error:e}:n)})):t({error:"RPC_NOT_READY"}):t({error:"ENOTFOUND"})},m.uploadStatus=function(e,n,t){var r=z(n.teamId);r?r.rpc?r.rpc.uploadStatus(n.size,(function(e,n){t(e?{error:e}:n)})):t({error:"RPC_NOT_READY"}):t({error:"ENOTFOUND"})},m.uploadCancel=function(e,n,t){var r=z(n.teamId);r?r.rpc?r.rpc.uploadCancel(n.size,(function(e,n){t(e?{error:e}:n)})):t({error:"RPC_NOT_READY"}):t({error:"ENOTFOUND"})},m.uploadChunk=function(e,n,t){var r=z(n.teamId);r?r.rpc?r.rpc.send.unauthenticated("UPLOAD",n.chunk,(function(e,n){t({error:e,msg:n})})):t({error:"RPC_NOT_READY"}):t({error:"ENOTFOUND"})};m.anonRpcMsg=function(e,n,t){J.anon_rpc?J.anon_rpc.send(n.msg,n.data,(function(e,n){t(e?{error:e}:n)})):t({error:"ANON_RPC_NOT_READY"})},m.getFileSize=function(e,n,t){var r=i.once(i.mkAsync(t));if(J.anon_rpc){var o=n.channel||a.hrefToHexChannelId(n.href,n.password);J.anon_rpc.send("GET_FILE_SIZE",o,(function(e,n){if(!e)return n&&n.length&&"number"==typeof n[0]?(0===n[0]&&p.clearChannel(o),void r({size:n[0]})):void r({error:"INVALID_RESPONSE"});r({error:e})}))}else r({error:"ANON_RPC_NOT_READY"})},m.isNewChannel=function(e,n,t){if(J.anon_rpc){var r=n.channel||a.hrefToHexChannelId(n.href,n.password);J.anon_rpc.send("IS_NEW_CHANNEL",r,(function(e,n){if(!e)return n&&n.length&&"object"==typeof n[0]?(n[0].isNew&&p.clearChannel(r),void t(n[0])):void t({error:"INVALID_RESPONSE"});t({error:e})}))}else t({error:"ANON_RPC_NOT_READY"})},m.getMultipleFileSize=function(e,n,t){J.anon_rpc?Array.isArray(n.files)?J.anon_rpc.send("GET_MULTIPLE_FILE_SIZE",n.files,(function(e,n){e?t({error:e}):n&&n.length&&"object"==typeof n[0]?t({size:n[0]}):t({error:"UNEXPECTED_RESPONSE"})})):t({error:"INVALID_FILE_LIST"}):t({error:"ANON_RPC_NOT_READY"})},m.getDeletedPads=function(e,n,t){if(J.anon_rpc){var r=n&&n.list||Z(!0);Array.isArray(r)?J.anon_rpc.send("GET_DELETED_PADS",r,(function(e,n){e?t({error:e}):n&&n.length&&Array.isArray(n[0])?t(n[0]):t({error:"UNEXPECTED_RESPONSE"})})):t({error:"INVALID_FILE_LIST"})}else t({error:"ANON_RPC_NOT_READY"})};var ne=function(e,n,t){J.anon_rpc?t():d.createAnonymous(J.network,(function(e,n){e?t({error:e}):(J.anon_rpc=n,t())}))},te=m.getAllStores=function(){if(!J.proxy||!J.manager)return[];var e=[J],n=J.modules.team;if(n){var t=n.getTeams().map((function(e){return n.getTeam(e)}));Array.prototype.push.apply(e,t)}return e};m.getUserColor=function(){var e=i.find(J,["proxy","settings","general","cursor","color"]);return e||(e=i.getRandomColor(!0),m.setAttribute(null,{attr:["general","cursor","color"],value:e},(function(){}))),e},m.getMetadata=function(e,n,t){var r=J.proxy||{},o=i.find(r,["settings","general","disableThumbnails"]),c=J.modules.team&&J.modules.team.getTeamsData(n)||{};r.uid||(J.noDriveUid=J.noDriveUid||a.createChannelId());var u={user:{name:r[s.displayNameKey]||J.noDriveName||"",uid:r.uid||J.noDriveUid,avatar:i.find(r,["profile","avatar"]),profile:i.find(r,["profile","view"]),color:m.getUserColor(),notifications:i.find(r,["mailboxes","notifications","channel"]),curvePublic:r.curvePublic},priv:{clientId:e,edPublic:r.edPublic,friends:r.friends||{},settings:r.settings||G,thumbnails:!1===o,isDriveOwned:Boolean(i.find(J,["driveMetadata","owners"])),driveChannel:J.driveChannel,pendingFriends:r.friends_pending||{},supportPrivateKey:i.find(r,["mailboxes","supportadmin","keys","curvePrivate"]),accountName:r.login_name||"",offline:J.proxy&&J.offline,teams:c,plan:J.ready?$.plan||"":void 0,mutedChannels:r.mutedChannels}};return t(JSON.parse(JSON.stringify(u))),u},m.onMaintenanceUpdate=function(){let n=e.httpUnsafeOrigin;i.fetchApi(n,"broadcast",!0,(e=>{e&&k([],"UNIVERSAL_EVENT",{type:"broadcast",data:{ev:"MAINTENANCE",data:e.maintenance}})}))},m.onSurveyUpdate=function(){let n=e.httpUnsafeOrigin;i.fetchApi(n,"broadcast",!0,(e=>{k([],"UNIVERSAL_EVENT",{type:"broadcast",data:{ev:"SURVEY",data:e.surveyURL}})}))};m.addPad=function(e,n,r){if(n.href||n.roHref){var o;if(!n.roHref){var i=a.parsePadUrl(n.href);"pad"===i.hashData.type&&(o=a.getSecrets(i.type,i.hash,n.password),n.roHref="/"+i.type+"/#"+a.getViewHashFromKeys(o))}var s,c,u,f,l=(s=n.href,c=n.roHref,u=n.title,f=+new Date,{href:s,roHref:c,atime:f,ctime:f,title:u||t.getDefaultName(a.parsePadUrl(s))});n.owners&&(l.owners=n.owners),n.expire&&(l.expire=n.expire),n.password&&(l.password=n.password),(n.channel||o)&&(l.channel=n.channel||o.channel),n.readme&&(l.readme=1),-1===n.teamId&&(n.teamId=void 0);var d=z(n.teamId);d&&d.manager?d.manager.addPad(n.path,l,(function(o){o?r({error:o}):(te().forEach((function(n){(n.id?n.sendEvent:W)("DRIVE_CHANGE",{path:["drive",t.FILES_DATA]},e)})),Q(n.teamId,r))})):r({error:"ENOTFOUND"})}else r({error:"NO_HREF"})};var re=function(e,n){var t=i.find(J,["proxy","edPublic"]),r=function(e){var n=[];return e?(J.proxy.todo&&n.push(a.hrefToHexChannelId("/todo/#"+J.proxy.todo,null)),J.proxy.profile&&J.proxy.profile.edit&&n.push(a.hrefToHexChannelId("/profile/#"+J.proxy.profile.edit,null)),J.proxy.mailboxes&&Object.keys(J.proxy.mailboxes||{}).forEach((function(e){if("supportadmin"!==e){var t=J.proxy.mailboxes[e];n.push(t.channel)}}))):n=J.manager.getChannelsList("owned"),n.filter((function(e){if("string"==typeof e)return-1!==[32,48].indexOf(e.length)}))}(e),o=K.create(10),s=function(n){e||J.manager.findChannel(n).forEach((function(e){var n=J.manager.findFile(e.id);J.manager.delete({paths:n})}))};r.forEach((function(e){var r=n();o.take((function(n){var o=!1;F((function(a){32===e.length&&m.anonRpcMsg(null,{msg:"GET_METADATA",data:e},a((function(i){if(i&&i.error)return n(),r(),void a.abort();var c=i[0];return Object.keys(c||{}).length?c&&Array.isArray(c.owners)&&-1!==c.owners.indexOf(t)?void(o=c.owners.some((function(e){return e!==t}))):(n(),r(),void a.abort()):(s(e),n(),r(),void a.abort())})))})).nThen((function(n){o?m.setPadMetadata(null,{channel:e,command:"RM_OWNERS",value:[t]},n()):J.rpc.removeOwnedChannel(e,n((function(n){n?console.error(n):s(e)})))})).nThen((function(){n(),r()}))}))}))};m.removeOwnedPads=function(e,n,t){J.proxy.edPublic?F((function(e){re(!1,e)})).nThen(t):t({error:"NOT_LOGGED_IN"})},m.deleteAccount=function(e,t,r){var o=J.proxy.edPublic,a=t&&t.keys,i=t&&t.auth;m.anonRpcMsg(e,{msg:"GET_METADATA",data:J.driveChannel},(function(t){var c=t[0];if(c&&c.owners&&1===c.owners.length&&-1!==c.owners.indexOf(o))F((function(e){x.checkRights({auth:i,blockKeys:a},e((function(n){if(n)return e.abort(),console.error(n),void r({error:"INVALID_CODE"})})))})).nThen((function(n){globalThis.accountDeletion=e,J.proxy[s.tokenKey]="DELETED",Q(null,n())})).nThen((function(e){J.rpc.removePins(e((function(e){e&&console.error(e)})))})).nThen((function(n){J.ownDeletion=!0,m.removeOwnedChannel(e,{channel:J.driveChannel,force:!0},n())})).nThen((function(e){a&&x.removeLoginBlock({reason:"ARCHIVE_OWNED",auth:i,edPublic:o,blockKeys:a},e((function(e){e&&console.error(e)})))})).nThen((function(e){re(!0,e)})).nThen((function(){k([e],"DRIVE_DELETED","ARCHIVE_OWNED"),R(e,"DELETE_ACCOUNT","DELETED",(function(){})),J.network.disconnect(),r({state:!0})}));else{var u={intent:"Please delete my account."};u.drive=J.driveChannel,u.edPublic=o;var f=C.Nacl.util.decodeBase64(J.proxy.edPrivate),l=C.Nacl.sign.detached(C.Nacl.util.decodeUTF8(n(u)),f);C.Nacl.sign.detached.verify(C.Nacl.util.decodeUTF8(n(u)),l,C.Nacl.util.decodeBase64(o))||console.error("signed message failed verification");var d=C.Nacl.util.encodeBase64(l);r({proof:d,toSign:JSON.parse(n(u))})}}))},m.migrateAnonDrive=function(e,n,t){var r=n.anonHash;h.anonDriveIntoUser(J,r,t)},m.setDisplayName=function(e,n,t){if(!J.proxy)return J.noDriveName=n,k([e],"UPDATE_METADATA"),void t();J.modules.profile&&J.modules.profile.setName(n),J.proxy[s.displayNameKey]=n,k([e],"UPDATE_METADATA"),f.updateMyData(J),Q(null,t)},m.resetDrive=function(e,n,t){F((function(e){re(e)})).nThen((function(){J.proxy.drive=J.userObject.getStructure(),W("DRIVE_CHANGE",{path:["drive","filesData"]},e),Q(null,t)}))},m.setPadAttribute=function(e,n,r){F((function(r){te().forEach((function(o){o.manager.setPadAttribute(n,r((function(){(o.id?o.sendEvent:W)("DRIVE_CHANGE",{path:["drive",t.FILES_DATA]},e),Q(o.id,r())})))}))})).nThen(r)},m.getPadAttribute=function(e,n,t){var r={};F((function(e){te().forEach((function(t){t.manager.getPadAttribute(n,e((function(e,n){e||(n&&"object"==typeof n?(!r.value||r.atime{if(J.loggedIn&&J.proxy.edPublic){var n,r=J.modules.team,o=r&&r.getTeams()||[];-1!==e.indexOf(J.proxy.edPublic)?n=J:o.some((function(t){var o=i.find(J,["proxy","teams",t,"keys","drive","edPublic"]),a=i.find(J,["proxy","teams",t,"keys","drive","edPrivate"]);if(-1===e.indexOf(o))return!1;if(!a)return!1;var s=r.getTeam(t);return n=s,!0}));var a=function(){if(n){var e=n.rpc;e?e.send("COOKIE","",(function(e){t(e)})):t("ERESTRICTED")}else t("ERESTRICTED")};n&&n.onRpcReadyEvt?n.onRpcReadyEvt.reg((function(){a()})):a()}else t("ERESTRICTED")}))):t("ERESTRICTED")},m.joinPad=function(e,n){if(n.versionHash)!function(e,n){var t,r=a.createChannelId();F((function(r){m.getPadMetadata(null,{channel:n.channel},r((function(n){if(n&&n.rejected)return R(e,"PAD_ERROR",{type:"ERESTRICTED"}),void r.abort();t=n.validateKey})))})).nThen((function(){m.getHistoryRange(e,{cpCount:1,channel:n.channel,lastKnownHash:n.versionHash},(function(o){if(o&&o.error)R(e,"PAD_ERROR",o.error);else{var a=o.messages||[];a.length&&a[a.length-1].serverHash!==n.versionHash?R(e,"PAD_ERROR",{type:"HASH_NOT_FOUND"}):(R(e,"PAD_CONNECT",{myID:r,id:n.channel,members:[r]}),(o.messages||[]).forEach((function(n){R(e,"PAD_MESSAGE",{msg:n.msg,time:n.time,user:r.slice(0,16)})})),t&&J.messenger&&J.messenger.storeValidateKey(n.channel,t),R(e,"PAD_READY"))}}))}))}(e,n);else if(a.isValidChannel(n.channel)){var r=void 0===ie[n.channel],o=ie[n.channel]=ie[n.channel]||{queue:[],data:{},clients:[],bcast:function(e,n,t){o.clients.forEach((function(r){r!==t&&R(r,e,n)}))},history:[],pushHistory:function(e,n){if(n){var t;for(o.history.push("cp|"+e),t=o.history.length-101;t>0&&!/^cp\|/.test(o.history[t]);t--);o.history=o.history.slice(Math.max(t,0))}else o.history.push(e)}};if(-1===o.clients.indexOf(e)&&o.clients.push(e),!r&&o.wc)return R(e,"PAD_CONNECT",{myID:o.wc.myID,id:o.wc.id,members:o.wc.members}),o.wc.members.forEach((function(n){R(e,"PAD_JOIN",n)})),o.history.forEach((function(n){R(e,"PAD_MESSAGE",{msg:P.removeCp(n),user:o.wc.myID,validateKey:o.data.validateKey})})),void R(e,"PAD_READY");var i=function(e){e&&"EDELETED"===e.type&&ee[n.channel]&&(delete ee[o],e.ownDeletion=!0),o.bcast("PAD_ERROR",e),e&&"EDELETED"===e.type&&p&&p.clearChannel&&p.clearChannel(n.channel),-1!==["EDELETED","EEXPIRED","ERESTRICTED"].indexOf(e.type)&&m.leavePad(null,n,(function(){}))},s={Cache:J.neverCache?void 0:p,priority:1,onCacheStart:function(){R(e,"PAD_CACHE")},onCacheReady:function(){R(e,"PAD_CACHE_READY")},onReady:function(t){var r=t.metadata||{};o.data=r,r&&r.validateKey&&J.messenger&&J.messenger.storeValidateKey(n.channel,r.validateKey),R(e,"PAD_READY",t.noCache)},onMessage:function(e,n,t,r,a){o.lastHash=a,o.pushHistory(e,r),o.bcast("PAD_MESSAGE",{user:n,msg:e,validateKey:t})},onJoin:function(e){o.bcast("PAD_JOIN",e)},onLeave:function(e){o.bcast("PAD_LEAVE",e)},onError:i,onChannelError:i,onRejected:m.onRejected,onConnectionChange:function(e){e.state||o.bcast("PAD_DISCONNECT")},onMetadataUpdate:function(e){o.data=e||{},te().forEach((function(r){r.manager.findChannel(n.channel,!0).forEach((function(n){n.data.owners=e.owners,n.data.atime=+new Date,e.expire&&(n.data.expire=+e.expire)})),(r.sendEvent||W)("DRIVE_CHANGE",{path:["drive",t.FILES_DATA]})})),o.bcast("PAD_METADATA",e)},crypto:{encrypt:function(e){return e},decrypt:function(e){return e}},noChainPad:!0,channel:n.channel,metadata:n.metadata,network:J.network||J.networkPromise,websocketURL:N.getWebsocketURL(),onInit:function(){V.fire()},onConnect:function(n,t){o.sendMessage=function(e,r,a){t(e,(function(t){t?a({error:t}):(o.lastHash=e.slice(0,64),o.pushHistory(P.removeCp(e),/^cp\|/.test(e)),o.bcast("PAD_MESSAGE",{user:n.myID,msg:P.removeCp(e),validateKey:o.data.validateKey},r),a())}))},o.wc=n,o.queue.forEach((function(n){o.sendMessage(n.message,e)})),o.queue=[],o.bcast("PAD_CONNECT",{myID:n.myID,id:n.id,members:n.members})}};o.cpNf=P.start(s)}else R(e,"PAD_ERROR","INVALID_CHAN")},m.leavePad=function(e,n,t){var r=ie[n.channel];r&&r.cpNf?(m.dropChannel(n.channel),t()):t({error:"EINVAL"})},m.sendPadMsg=function(e,n,t){var r=n.msg,o=ie[n.channel];if(o)return o.wc?void o.sendMessage(r,e,t):(o.queue.push(r),void t())},m.corruptedCache=function(e,n){var t=ie[n];t&&t.cpNf&&(p.clearChannel(n),t.cpNf.resetCache&&t.cpNf.resetCache())},m.changePadPasswordPin=function(e,n,t){var r=n.oldChannel,o=n.channel;F((function(e){te().forEach((function(n){n.manager.findChannel(o).length&&(n.rpc.unpin([r],e()),n.rpc.pin([o],e()))}))})).nThen(t)},m.contactPadOwner=function(e,n,t){var r=n.owners;if(!Array.isArray(r)||!r.length)return t({state:!1});n.send?F((function(e){r.forEach((function(t){!function(e,t,r,o){if(J.mailbox&&!n.anon)return J.mailbox.sendTo(e,t,r,o);A.sendToAnon(J.anon_rpc,e,t,r,o)}(n.query,{channel:n.channel,data:n.msgData},{channel:t.notifications,curvePublic:t.curvePublic},e())}))})).nThen((function(){t({state:!0})})):t({state:!0})},m.givePadAccess=function(e,n,t){var r,o,a=J.proxy.edPublic,i=n.channel,s=J.manager.findChannel(i);n.user&&n.user.notifications&&n.user.curvePublic?s.some((function(e){if(e.data&&Array.isArray(e.data.owners)&&-1!==e.data.owners.indexOf(a)&&e.data.href)return r=e.data.href,o=e.data.title,!0}))?(J.mailbox.sendTo("GIVE_PAD_ACCESS",{channel:i,href:r,title:o},{channel:n.user.notifications,curvePublic:n.user.curvePublic}),t()):t({error:"ENOTFOUND"}):t({error:"EINVAL"})},m.getLastHash=function(e,n,t){var r=ie[n.channel];r?r.lastHash?t({hash:r.lastHash}):t({error:"EINVAL"}):t({error:"ENOCHAN"})};m.burnPad=function(e,n){var t=n.channel,r=C.b64AddSlashes(n.ownerKey||"");if(t&&r)try{var o=a.decodeBase64(r),i=C.Nacl.sign.keyPair.fromSecretKey(o);l.create(J.network,{edPublic:a.encodeBase64(i.publicKey),edPrivate:a.encodeBase64(i.secretKey)},(function(e,r){e?console.error(e):m.getPadMetadata(null,{channel:t},(function(e){r.removeOwnedChannel(t,(function(t){t?console.error(t):function(e,n){var t=e.channel,r=e.href,o=a.parsePadUrl(r),i=a.getSecrets(o.type,o.hash,e.password);if((!n||!n.error)&&n.mailbox){var s,c=C.createEncryptor(i.keys),u=[];try{"string"==typeof n.mailbox?u.push(c.decrypt(n.mailbox,!0,!0)):Object.keys(n.mailbox).forEach((function(e){u.push(c.decrypt(n.mailbox[e],!0,!0))}))}catch(e){console.error(e)}try{s=J.proxy.curvePublic}catch(e){return void console.error(e)}u.forEach((function(e){var n=JSON.parse(e);n.curvePublic!==s&&J.mailbox.sendTo("OWNED_PAD_REMOVED",{channel:t},{channel:n.notifications,curvePublic:n.curvePublic},(function(){}))}))}}(n,e)}))}))}))}catch(e){console.error(e)}else console.error("Can't delete BAR pad")},m.getPadMetadata=function(e,r,o){var s=i.once(i.mkAsync(o));if(!J.offline&&J.anon_rpc)if(r.channel){if(32===r.channel.length)return a.isValidChannel(r.channel)?void J.anon_rpc.send("GET_METADATA",r.channel,(function(e,o){if(e)s({error:e});else{var a=o&&o[0]||{};s(a),a.rejected||te().forEach((function(e){var o=e.manager.findChannel(r.channel,!0),i=!1;(o.forEach((function(e){n(e.data.owners)!==n(a.owners)&&(i=!0),e.data.owners=a.owners,e.data.atime=+new Date,a.expire&&(e.data.expire=+a.expire)})),i)&&(e.sendEvent||W)("DRIVE_CHANGE",{path:["drive",t.FILES_DATA]})}))}})):(c.send("METADATA_INVALID_CHAN"),void s({error:"EINVAL"}));s({error:"EINVAL"})}else s({error:"ENOTFOUND"});else s({error:"OFFLINE"})},m.setPadMetadata=function(e,n,t){if(n.channel)if(n.command){var r=z(n.teamId);if(r){var o=n.channels;delete n.channels,r.rpc.setMetadata(n,(function(e,n){e?t({error:e}):Array.isArray(n)&&n.length?t(n[0]):t({})})),Array.isArray(o)&&o.forEach((function(t){var r=i.clone(n);r.channel=t,m.setPadMetadata(e,r,(function(){}))}))}else t({error:"ENOTFOUND"})}else t({error:"EINVAL"});else t({error:"ENOTFOUND"})},m.deleteMailboxMessage=function(e,n,t){J.anon_rpc?J.anon_rpc.send("DELETE_MAILBOX_MESSAGE",n,(function(e){t({error:e})})):t({error:"RPC_NOT_READY"})},m.getFullHistory=function(e,n,t){var r=J.network,o=r.historyKeeper,a=[],i=!1,s=function(e){if(!i){var o=function(e){try{return JSON.parse(e)}catch(e){return null}}(e);if(o)return"FULL_HISTORY_END"===o[0]?(t(a),r.off("message",s),void(i=!0)):void("FULL_HISTORY"===o[0]&&(o[1]&&o[1].validateKey||o[1][3]===n.channel&&(e=o[1][4])&&(e=e.replace(/cp\|(([A-Za-z0-9+\/=]+)\|)?/,""),n.debug?a.push({serverHash:e.slice(0,64),msg:e,author:o[1][1],time:o[1][5]}):a.push(e))))}};r.on("message",s),r.sendto(o,JSON.stringify(["GET_FULL_HISTORY",n.channel,n.validateKey]))},m.getHistory=function(e,n,t,r){var o=i.once(i.mkAsync(t)),a=J.network,s=a.historyKeeper,c=Math.floor(1e6*Math.random()),u=[],f=!1,l=function(e,t){if(!f&&t===s){var i=function(e){try{return JSON.parse(e)}catch(e){return null}}(e);if(i&&!(i.txid&&i.txid!==c||i.validateKey&&i.channel))if(i.error&&i.channel)i.channel===n.channel&&(a.off("message",l),f=!0,o({error:i.error}));else{if(1===i.state&&i.channel){if(i.channel!==n.channel)return;return o(u),a.off("message",l),void(f=!0)}Array.isArray(i)&&i[0]&&i[0]!==c||i[3]===n.channel&&(i[4]&&r?u.push({msg:e,hash:i[4].slice(0,64)}):(e=i[4])&&(e=e.replace(/cp\|(([A-Za-z0-9+\/=]+)\|)?/,""),u.push(e)))}}};a.on("message",l);var d={txid:c,lastKnownHash:n.lastKnownHash},h=["GET_HISTORY",n.channel,d];a.sendto(s,JSON.stringify(h))},m.getHistoryRange=function(e,n,t){var r,o=J.network,a=o.historyKeeper,s=[],c=!0,u=!1,f=!1,l=i.uid();o.on("message",(function(e){if(!f){var o=function(e){try{return JSON.parse(e)}catch(e){return null}}(e);if(o[1]===l){if("HISTORY_RANGE_ERROR"!==o[0])return"HISTORY_RANGE_END"===o[0]?(t({messages:s,isFull:u,lastKnownHash:r}),void(f=!0)):void("HISTORY_RANGE"===o[0]&&(o[2]&&o[1].validateKey||o[2][3]===n.channel&&(e=o[2][4])&&(c&&(/^cp\|/.test(e)||n.toHash||(u=!0),r=e.slice(0,64),c=!1),e=e.replace(/cp\|(([A-Za-z0-9+\/=]+)\|)?/,""),s.push({serverHash:e.slice(0,64),msg:e,author:o[2][1],time:o[2][5]}))));t({error:o[2]})}else console.log("bad txid")}})),o.sendto(a,JSON.stringify(["GET_HISTORY_RANGE",n.channel,{from:n.lastKnownHash,to:n.toHash,cpCount:n.cpCount||2,txid:l}]))};var se=function(e,n){e&&(e.deprecated||e.restricted||(n||e.on("change",["drive",t.SHARED_FOLDERS],(function(n,r,o){if(o.length>3&&"password"===o[3]){var i=o[2],s=e.drive[t.SHARED_FOLDERS][i],c=J.manager.user.userObject.getHref?J.manager.user.userObject.getHref(s):s.href,u=a.parsePadUrl(c),f=a.getSecrets(u.type,u.hash,n);return v.updatePassword(m,{oldChannel:f.channel,password:r,href:c},J.network,(function(){console.log("Shared folder password changed")})),!1}})),e.on("change",[],(function(e,r,o){if(n){if(o[0]===t.FILES_DATA&&"object"==typeof r&&r.channel&&!r.owners){var a=[r.channel];r.rtChannel&&a.push(r.rtChannel),r.lastVersion&&a.push(r.lastVersion),m.pinPads(null,a,(function(e){console.error(e)}))}if(o[0]===t.FILES_DATA&&"object"==typeof e&&e.channel&&!r){var i=[e.channel];J.manager.findChannel(e.channel).some((function(e){return e.fId!==n}))||(e.rtChannel&&i.push(e.rtChannel),e.lastVersion&&i.push(e.lastVersion),m.unpinPads(null,i,(function(e){console.error(e)})))}}e&&!r&&Array.isArray(o)&&(o[0]===t.FILES_DATA||"drive"===o[0]&&o[1]===t.FILES_DATA)&&setTimeout((function(){m.checkDeletedPad(e&&e.channel)})),W("DRIVE_CHANGE",{id:n,old:e,new:r,path:o})})),e.on("remove",[],(function(e,t){W("DRIVE_REMOVE",{id:n,old:e,path:t})}))))};m.loadSharedFolder=function(e,n,t,r,o){var i=z(e);if(i){var s=a.parsePadUrl(t.href||t.roHref);s||s.hashData?v.load({isNew:o,network:J.network||J.networkPromise,store:i,Store:m,isNewChannel:m.isNewChannel},n,t,r):r({error:"EINVAL"})}else r({error:"ENOTFOUND"})};var ce=function(e,n,t,r){m.loadSharedFolder(null,e,n,t,r)};m.loadSharedFolderAnon=function(e,n,t){m.loadSharedFolder(null,n.id,n.data,(function(e){t({error:e?void 0:"EDELETED"})}))},m.addSharedFolder=function(e,n,r){U.reg((function(){var o=z(n.teamId);o.manager.addSharedFolder(n,(function(a){a&&"object"==typeof a&&a.error?r(a):((n.teamId?o.sendEvent:W)("DRIVE_CHANGE",{path:["drive",t.FILES_DATA]},e),r(a))}))}))},m.updateSharedFolderPassword=function(e,n,t){v.updatePassword(m,n,J.network,t)},m.userObjectCommand=function(e,n,r){if(n&&n.cmd){var o=z(n.teamId);if(o.offline)return(o.id?o.sendEvent:W)("NETWORK_DISCONNECT"),void r({error:"OFFLINE"});o.manager.command(n,(function(o){te().forEach((function(n){(n.id?n.sendEvent:W)("DRIVE_CHANGE",{path:["drive",t.FILES_DATA]},e)})),Q(n.teamId,(function(){r(o)}))}))}};var ue=m.dropChannel=function(e){console.error("Drop channel",e);try{J.messenger.leavePad(e)}catch(e){console.error(e)}try{J.modules.cursor.leavePad(e)}catch(e){console.error(e)}try{J.modules.integration.leavePad(e)}catch(e){console.error(e)}try{J.onlyoffice.leavePad(e)}catch(e){console.error(e)}try{if(function(e){if(J){if(J.driveChannel===e)return!0;if(v.isSharedFolderChannel(e))return!0;if(i.find(J,["proxy","teams"])){var n=i.find(J,["proxy","teams"])||{};return Object.keys(n).some((function(t){return n[t].channel===e}))}return i.find(J,["proxy","profile","href"])?a.hrefToHexChannelId(i.find(J,["proxy","profile","href"]))===e:void 0}}(e))return void delete m.channels[e]}catch(e){console.error(e)}try{p.leaveChannel(e)}catch(e){console.error(e)}m.channels[e]&&(m.channels[e].cpNf&&m.channels[e].cpNf.stop(),delete m.channels[e])};m._removeClient=function(e){var n=q.indexOf(e);-1!==n&&q.splice(n,1);try{J.onlyoffice?.removeClient(e)}catch(e){console.error(e)}try{J.mailbox?.removeClient(e)}catch(e){console.error(e)}Object.keys(J.modules).forEach((function(n){if(J.modules[n]&&J.modules[n].removeClient)try{J.modules[n].removeClient(e)}catch(e){console.error(e)}})),Object.keys(m.channels).forEach((function(n){var t=m.channels[n].clients.indexOf(e);-1!==t&&m.channels[n].clients.splice(t,1),0===m.channels[n].clients.length&&ue(n)}))};m.refreshDriveUI=function(){te().forEach((function(e){(e.id?e.sendEvent:W)("DRIVE_CHANGE",{path:["drive",t.FILES_DATA]})}))};var fe=function(e,n){const t=i.mkAsync(n);var o=J.proxy,a=J.drive;if(J.manager)t();else{var s=J.manager=r.create(a.proxy,{onSync:function(e){Q(null,e)},edPublic:o.edPublic,pin:function(e,n){J.loggedIn?m.pinPads(null,e,n):n()},unpin:function(e,n){J.loggedIn?m.unpinPads(null,e,n):n()},loadSharedFolder:ce,settings:o.settings,removeOwnedChannel:function(e,n){m.removeOwnedChannel("",e,n)},store:J,Store:m},{outer:!0,edPublic:J.proxy.edPublic,loggedIn:J.loggedIn,log:function(e){W("DRIVE_LOG",e)},rt:a.realtime}),c=J.userObject=s.user.userObject;F((function(e){J.sharedFolders={},J.handleSharedFolder=function(e,n){n?(J.sharedFolders[e]=n,J.driveEvents&&se(n.proxy,e)):delete J.sharedFolders[e]},c.migrate(e())})).nThen((function(n){var t=J.network||J.networkPromise;v.loadSharedFolders(m,t,J,a.proxy,c,n,(n=>{var t={type:"sf",progress:100*n.progress/n.max};R(e,"LOADING_DRIVE",t)}),!0)})).nThen((function(n){ae(D,"team",n,e)})).nThen((function(e){ae(S,"calendar",e)})).nThen((function(){t()}))}};const le=(e=function(){})=>{ae(g,"cursor",e),ae(b,"integration",e),ae(_,"messenger",e),ae(T,"history",e),J.onlyoffice||(J.onlyoffice=O.init(J,(function(e,n,t){t.forEach((function(t){R(t,"OO_EVENT",{ev:e,data:n})}))}))),J&&(J.messenger=J.modules.messenger)};var de=function(e,n,t){J.ready=!0;var r=J.proxy,u=J.manager,f=J.userObject;F((function(n){r.settings||(r.settings=G),r.forms||(r.forms={}),r.friends_pending||(r.friends_pending={}),r.form_seed||(r.form_seed=a.createChannelId()),u||(fe(e,n()),u=J.manager,f=J.userObject),ne(0,0,n()),function(e,n,t){if(!J.loggedIn)return t();J.rpc?t($):l.create(J.network,J.proxy,(function(e,n){e?t({error:e}):(J.rpc=n,J.onRpcReadyEvt.fire(),m.getPinLimit(null,null,(function(e){e.error&&console.error(e.error),$.limit=e.limit,$.plan=e.plan,$.note=e.note,t(e)})))}),p)}(0,0,n()),R(e,"LOADING_DRIVE",{type:"migrate",progress:0})})).nThen((function(n){void 0===r.version&&(r.version=11),o(r,n(),(function(n,t){R(e,"LOADING_DRIVE",{type:"migrate",progress:t})}),J)})).nThen((function(n){R(e,"LOADING_DRIVE",{type:"sf",progress:0}),f.fixFiles(),v.loadSharedFolders(m,J.network,J,J.drive.proxy,f,n,(n=>{var t={type:"sf",progress:100*n.progress/n.max};R(e,"LOADING_DRIVE",t)})),le(n),ae(w,"profile",n),ae(S,"calendar",n),J.modules.team&&J.modules.team.onReady(n),ae(E,"support",n)})).nThen((function(){var e,o=function(){k([],"REQUEST_LOGIN")};J.loggedIn&&(function(e){if(J.rpc){var n=Z(!1),t=a.hashChannelList(n);J.rpc.getServerHash((function(n,r){n?e(n):e(null,r===t)}))}else e({error:"RPC_NOT_READY"})}((function(e,n){n||function(e){if(J.rpc){var n=Z(!1);J.rpc.reset(n,(function(n){e(n||null)}))}else e({error:"RPC_NOT_READY"})}((function(e){if(e)return console.error(e);console.log("RESET DONE")}))})),"number"!=typeof r.loginToken&&(r[s.tokenKey]=J.data.localToken||Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)),n[s.tokenKey]=r[s.tokenKey],J.data.localToken&&J.data.localToken!==r[s.tokenKey])?o():(n.feedback=i.find(r,["settings","general","allowUserFeedback"]),c.init(n.feedback),J.returned=n,"function"==typeof t&&t(n),J.offline=!1,W("NETWORK_RECONNECT"),k([],"UPDATE_METADATA"),k([],"STORE_READY",n),"string"==typeof r.uid&&32===r.uid.length||(console.log("generating a persistent identifier"),r.uid=a.createChannelId()),!J.loggedIn||m.hasSigningKeys()&&m.hasCurveKeys()?(r.on("change",[s.displayNameKey],(function(e,n){"string"==typeof n&&k([],"UPDATE_METADATA")})),r.on("change",["profile"],(function(){k([],"UPDATE_METADATA")})),r.on("change",["friends"],(function(e,n,t){if(k([],"UPDATE_METADATA"),J.messenger&&void 0===e){var o=t.slice(-1)[0],a=r.friends&&r.friends[o];J.messenger.onFriendAdded(a)}})),r.on("remove",["friends"],(function(e,n){if(k([],"UPDATE_METADATA"),J.messenger){var t=n[1];t&&"channel"===n[2]&&J.messenger.onFriendRemoved(t,e)}})),r.on("change",["friends_pending"],(function(){k([],"UPDATE_METADATA")})),r.on("remove",["friends_pending"],(function(){k([],"UPDATE_METADATA")})),r.on("change",["settings"],(function(){k([],"UPDATE_METADATA")})),r.on("change",[s.tokenKey],(function(){J.isDeleted||"DELETED"===r[s.tokenKey]||k([],"UPDATE_TOKEN",{token:r[s.tokenKey]})})),J.mailbox=A.init({Store:m,store:J,updateMetadata:function(){k([],"UPDATE_METADATA")},updateDrive:function(){W("DRIVE_CHANGE",{path:["drive","filesData"]})},pinPads:function(e,n){m.pinPads(null,e,n)}},e,(function(e,n,t,r){var o=i.once(r||function(){});t.forEach((function(t){R(t,"MAILBOX_EVENT",{ev:e,data:n},o)}))})),U.fire()):o())}))};const he=(e,n,t,r)=>{if(J.accountModule)return J.accountModule;const o=L.init({userHash:n.userHash,anonHash:n.anonHash,cache:n.cache,form_seed:n.form_seed,store:J,broadcast:k,postMessage:R});J.accountModule=o;const{channel:a,onAccountReady:s,onAccountCacheReady:c,onDisconnect:u,onReconnect:f}=o;J.driveChannel=a,c((e=>{J.returned||=e,t(e)})),s((e=>{J.returned||=e,r(e)})),u((()=>{W("NETWORK_DISCONNECT")})),f((()=>{W("NETWORK_RECONNECT")}));return setInterval((function(){var e=[];Object.keys(m.channels).forEach((function(n){var t=m.channels[n].clients;Array.prototype.push.apply(e,t)})),(e=i.deduplicateString(e)).forEach((function(e){var n=0,t=function(){if(n>=2)return m._removeClient(e),R(e,"TIMEOUT"),void console.error("TIMEOUT",e);n++;var r=setTimeout(t,3e4);R(e,"PING",null,(function(e){e&&console.error(e),clearTimeout(r)}))};t()}))}),12e4),o},pe=(e,n,t,r)=>{const o=i.once((e=>{const n=H.init({account:e,store:J,broadcast:k,postMessage:R}),{onDriveReady:o,onDriveCacheReady:a,onDisconnect:i,onReconnect:s}=n;a((()=>{t(J.returned)})),o((()=>{r(J.returned)})),i((()=>{})),s((()=>{}))})),a=()=>{},s=he(0,n,a,a);s.onAccountCacheReady((()=>{o(s)})),s.onAccountReady((()=>{o(s)}))};m.disableCache=function(e,n,t){n?p.disable():p.enable(),t()};var ve=!1;m.hasDrive=function(e,n,t){t({state:Boolean(J.proxy)})};const ye=e=>{if(J?.network?.historyKeeper)return setTimeout(e);const n=n=>{J.network||=n;n.join("0000000000000000000000000000000000").then((function(t){let r;t.members.forEach((e=>{16===e.length&&(r=e)})),n.historyKeeper=r,t.leave(),e()}),(function(n){console.error(n),e({error:"GET_HK"})}))};if(J.network)return n(J.network);J.networkPromise?.then(n)};var me=function(e,n,t){var r=function(){le();let e=()=>{ne(0,0,(function(){c.send("NO_DRIVE",!0),n({})}))};if(t)return((e,n)=>{if(J.rpc)n(J.rpc);else{var t=C.Nacl.sign.keyPair(),r={edPublic:C.Nacl.util.encodeBase64(t.publicKey),edPrivate:C.Nacl.util.encodeBase64(t.secretKey)};l.create(J.network,r,(function(e,t){e?n({error:e}):(J.rpc=t,n(t))}))}})(0,e);e()};if(J.network)r();else{var o=N.getWebsocketURL();M.connect(o).then((function(e){J.network?(e.disconnect(),e=J.network):J.network=e,ye((e=>{e?n(e):r()}))}),(function(e){console.error(e),n({error:"OFFLINE"})}))}};const ge=(e,n,t)=>{fe(e,(function(){t(n),B.fire()}))},Ee=(e,n,t)=>{J.manager?B.reg((function(){ye((r=>{J.network||=r,de(e,n,(()=>{t(n)}))}))})):de(e,n,(()=>{t(n)}))};return m.init=function(e,n,t){var r=i.once((function(r){n.driveEvents&&function(e){B.reg((()=>{-1===q.indexOf(e)&&q.push(e),J.driveEvents||(J.driveEvents=!0,se(J.proxy),Object.keys(J.manager.folders).forEach((function(e){var n=J.manager.folders[e].proxy;se(n,e)})))}))}(e),t(r)}));if(ve&&!J.returned&&n.cache)B.reg((function(){r({state:"ALREADY_INIT",returned:J.cacheReturned})}));else{if(ve)return J.networkTimeout&&R(e,"LOADING_DRIVE",{type:"offline"}),void U.reg((function(){r({state:"ALREADY_INIT",returned:J.returned})}));n.disableCache&&p.disable(),n.noDrive&&!n.requires&&(n.requires="pad"),((e,n,t)=>{if(n.neverDrive||n.noDrive&&!n.userHash&&!n.anonHash)return n.neverDrive&&(J.neverCache=!0),void me(0,(e=>{e?.error&&c.send("NO_DRIVE_ERROR",!0),t(e)}),!!n.neverDrive);const r=n.requires;ve=!0,J.data=n;let o=e=>{1===Object.keys(J.proxy).length&&c.send("FIRST_APP_USE",!0),e&&e.error&&(ve=!1)};if("pad"===r)return void me(0,(function(r){if(r&&r.error)return;t(r);let a=i.once((()=>{pe(0,n,(n=>{ge(e,n,o)}),(n=>{Ee(e,n,o)}))}));V.reg(a),Y.reg(a)}));if("file"===r)return void me(0,(function(r){r&&r.error||(t(r),pe(0,n,(n=>{ge(e,n,o)}),(n=>{Ee(e,n,o)})))}));if("team"===r){const r=i.once((r=>{F((n=>{ae(D,"team",n,e)})).nThen((()=>{t(r),pe(0,n,(n=>{ge(e,n,o)}),(n=>{Ee(e,n,o)}))}))}));return void he(0,n,r,r)}if("drive"===r)return void pe(0,n,(n=>{t(n),ge(e,n,o)}),(n=>{t(n),Ee(e,n,o)}));let a=e=>{o(e);const n=s.prefersDriveRedirectKey,r=i.find(J,["proxy","settings","general",n]);e[n]=r,t(e)};pe(0,n,(n=>{ge(e,n,a)}),(n=>{Ee(e,n,a)}))})(e,n,i.once((e=>{"GET_HK"!==e.error?r(e):r({error:"ERROR"})})))}},U.reg((function(){var e=+new Date-7776e6;p.getKeys((function(n,t){if(n)console.error(n);else{var r=function(){if(t.length){var n=t.pop();p.getTime(n,(function(t,o){t?r():!o||o{const n=(e,n={})=>({create:function(t,r,o){var a,i=[],s=e.mkEvent(!0);t.reg((function(e){if(!a){var n=e.data;if("_READY"===n)return r("_READY"),a=!0,s.fire(),void i.forEach((function(e){t.fire(e)}));i.push(n)}}));var c={},u={},f={},l=[],d={},h={};h.query=function(e,n,t,o){var a,i=Math.random().toString(16).replace("0.","")+Math.random().toString(16).replace("0.",""),c=(o=o||{}).timeout||3e4;c>0&&(a=setTimeout((function(){delete u[i],t("TIMEOUT")}),c)),f[i]=function(e){clearTimeout(a),delete f[i],e&&(delete u[i],t("UNHANDLED"))},u[i]=function(e,n){delete u[i],t(void 0,e.content,n)},s.reg((function(){var t={txid:i,content:n,q:e,raw:o.raw};r(o.raw?t:JSON.stringify(t))}))};var p=h.event=function(e,n,t){t=t||{},s.reg((function(){var o={content:n,q:e,raw:t.raw};r(t.raw?o:JSON.stringify(o))}))};h.on=function(e,n,t){var o=function(e,t,o){n(e.content,(function(n){var t={txid:e.txid,content:n};r(o?t:JSON.stringify(t))}),t)};return(c[e]=c[e]||[]).push(o),t||p("EV_REGISTER_HANDLER",e),{stop:function(){var n=c[e].indexOf(o);-1!==n&&c[e].splice(n,1)}}},h.whenReg=function(e,n,t){var r=t;l.indexOf(e)>-1?n():r=!0,r&&(d[e]=d[e]||[]).push(n)},h.onReg=function(e,n){h.whenReg(e,n,!0)},h.on("EV_REGISTER_HANDLER",(function(e){d[e]&&(d[e].forEach((function(e){e()})),delete d[e]),l.push(e)}));var v=!1;h.onReady=function(e){v?e():"function"==typeof e&&h.on("EV_RPC_READY",(function(){v=!0,e()}))},h.ready=function(){h.whenReg("EV_RPC_READY",(function(){h.event("EV_RPC_READY")}))};var y=[""];n.httpUnsafeOrigin?(y.push(n.httpUnsafeOrigin),y.push(n.httpSafeOrigin)):globalThis.location&&y.push(globalThis.location.origin),t.reg((function(e){if(a&&e.data&&"_READY"!==e.data&&y.includes(e.origin)){var n;try{n="object"==typeof e.data?e.data:JSON.parse(e.data)}catch(e){return void console.warn(e)}void 0!==n.ack?f[n.txid]&&f[n.txid](!n.ack):"string"==typeof n.q?c[n.q]?(n.txid&&r(JSON.stringify({txid:n.txid,ack:!0})),c[n.q].forEach((function(t){t(n||JSON.parse(e.data),e,n&&n.raw),n=void 0}))):n.txid&&r(JSON.stringify({txid:n.txid,ack:!1})):void 0===n.q&&u[n.txid]&&u[n.txid](n,e)}})),r("_READY"),o(h)}});e.exports&&(e.exports=n(q()))})()}(Gt)),Gt.exports}function qt(){return Bt||(Bt=1,function(e){e.exports&&(e.exports=((e,n,t)=>{const r={};let o,a,i={},s=()=>{};return r.init=n=>{a||(a=e.create({query:(e,n,t,r)=>{r=r||function(){},i[e].chan.query(n,t,(function(e,n){r(e?{error:e}:n)}))},broadcast:(e,n,t,r)=>{r=r||function(){},Object.keys(i).forEach((o=>{-1===e.indexOf(+o)&&i[o].chan.query(n,t,((e,n)=>{r(e?{error:e}:n)}))}))}}),s=n)},r.initClient=(e,r)=>{if(!a)return console.error("Not initialized"),void r("NOT_INIT");const{postMsg:c}=e,u=t.mkEvent(),f=Number(Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)),l=()=>{a._removeClient(f)};n.create(u,c,(function(e){let n=i[f]={chan:e};console.debug("SharedW Channel created"),Object.keys(a.queries).forEach((function(t){"CONNECT"!==t&&"JOIN_PAD"!==t&&"SEND_PAD_MSG"!==t&&"STOPWORKER"!==t&&e.on(t,(function(e,r){try{a.queries[t](f,e,r)}catch(n){console.error("Error in webworker when executing query "+t),console.error(n),console.log(e)}"DISCONNECT"===t&&(l(),globalThis.accountDeletion&&globalThis.accountDeletion===n.id&&(a=void 0,o=void 0))}))})),e.on("STOPWORKER",(function(e,n){s(),a.queries.DISCONNECT(f,e,n)})),e.on("CONNECT",(function(e,n){console.debug("Connecting to store..."),a.queries.CONNECT(f,e,(function(e){if(e&&"ALREADY_INIT"===e.state)return console.debug("Store already exists!"),o=o||e.returned,void n(e);o=e,n(e)}))})),e.on("JOIN_PAD",(function(e,t){n.channelId=e.channel;try{a.queries.JOIN_PAD(f,e,t)}catch(n){console.error("Error in webworker when executing query JOIN_PAD"),console.error(n),console.log(e)}})),e.on("SEND_PAD_MSG",(function(e,t){var r={msg:e,channel:n.channelId};try{a.queries.SEND_PAD_MSG(f,r,t)}catch(e){console.error("Error in webworker when executing query SEND_PAD_MSG"),console.error(e),console.log(r)}})),r(u,l)}),!0)},r})(Kt(),Jt(),q()))}(Ht)),Ht.exports}var Wt,zt,Qt=function(){if(Yt)return Vt;Yt=1;const e=qt();return Vt={start:n=>{let t=!1,r=()=>{globalThis.close()};globalThis.window=globalThis,addEventListener("connect",(o=>{console.debug("New SharedWorker client");const a=o.ports[0],i=e=>{a.postMessage(e)};let s,c=!1,u=()=>{};a.onmessage=function(o){if("INIT"===o.data?.type){if((o=>{t||(n(o),e.init(r),t=!0)})(o.data.cfg),c)return;c=!0,e.initClient({postMsg:i},(function(e,n){s=e,u=n,i("SW_READY")}))}else"CLOSE"===o.data?(console.debug("leave"),u()):s&&s.fire(o)}}))}}}();var Xt,Zt,$t=function(){if(zt)return Wt;zt=1;const e=qt();return Wt={start:n=>{let t,r=!1;const o=()=>{globalThis.close()},a=e=>{postMessage(e)};globalThis.window=globalThis,onmessage=function(i){if("INIT"===i.data?.type){let s=i.data.cfg;if(r)return;return n(s),e.init(o),r=!0,void e.initClient({postMsg:a},(function(e){t=e,a("WW_READY")}))}t&&t.fire(i)}}}}();var er=function(){if(Zt)return Xt;Zt=1;const e=qt(),n=q();return Xt={start:t=>{let r,o=!1,a=!1;const i=n.mkEvent(),s=()=>{a=!0},c=e=>{a||i.fire(e)};return{init:n=>{o||(t(n),e.init(s),o=!0,e.initClient({postMsg:c},(function(e){r=e,c("STORE_READY")})))},onMessage:e=>{i.reg((n=>{setTimeout((()=>{e(n)}))}))},query:e=>{r&&!a&&r.fire({data:e,origin:""})}}}}}(),nr=Hn(),tr=n({__proto__:null,default:r(nr)},[nr]),rr=Ln(),or=n({__proto__:null,default:r(rr)},[rr]),ar=Xn(),ir=n({__proto__:null,default:r(ar)},[ar]),sr=et(),cr=n({__proto__:null,default:r(sr)},[sr]),ur=Pt(),fr=n({__proto__:null,default:r(ur)},[ur]);let lr=e=>{[Ae,Xe,V,ze,H,tr,dn,on,Ie,ir,cr,fr,Lt,pe,or].forEach((n=>{"function"==typeof n.setCustomize&&n.setCustomize(e)}))},dr="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,hr="undefined"!=typeof SharedWorkerGlobalScope&&self instanceof SharedWorkerGlobalScope;e.store={},hr?Qt.start(lr):dr?$t.start(lr):("undefined"!=typeof module&&module.exports,e.store=er.start(lr)),e.start=lr}));