From e570f66f79e8f664462e9706a5d0bf74af7b7e19 Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 21 Mar 2025 18:07:04 +0100 Subject: [PATCH] Clean build and minify --- .gitignore | 1 + eslint.config.js | 1 + rollup.config.mjs | 37 +- testapi.js => scripts/api/testapi.js | 6 +- src/tweetnacl/.npmignore | 3 - src/tweetnacl/CHANGELOG.md | 101 - src/tweetnacl/README.md | 455 - src/tweetnacl/nacl-fast.js | 2414 -- src/tweetnacl/nacl-fast.min.js | 2 - src/tweetnacl/nacl.js | 1201 - src/tweetnacl/nacl.min.js | 1 - src/tweetnacl/package-lock.json | 4327 --- src/tweetnacl/package.json | 59 - src/worker/store.ts | 4 +- tsconfig.json | 2 +- www/common/store-interface.js | 16 +- www/common/worker.bundle.js | 36400 ++++++++++++++++++++++++- www/common/worker.bundle.min.js | 1 + 18 files changed, 36438 insertions(+), 8593 deletions(-) rename testapi.js => scripts/api/testapi.js (81%) delete mode 100644 src/tweetnacl/.npmignore delete mode 100644 src/tweetnacl/CHANGELOG.md delete mode 100644 src/tweetnacl/README.md delete mode 100644 src/tweetnacl/nacl-fast.js delete mode 100644 src/tweetnacl/nacl-fast.min.js delete mode 100644 src/tweetnacl/nacl.js delete mode 100644 src/tweetnacl/nacl.min.js delete mode 100644 src/tweetnacl/package-lock.json delete mode 100644 src/tweetnacl/package.json mode change 120000 => 100644 www/common/worker.bundle.js create mode 100644 www/common/worker.bundle.min.js diff --git a/.gitignore b/.gitignore index 013a3e931..346d62bce 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ www/common/onlyoffice/v* /onlyoffice-conf/ /onlyoffice-dist/ +www/common/worker.bundle.js _build # ---> Node diff --git a/eslint.config.js b/eslint.config.js index 64f7373ab..359a96dd2 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -44,6 +44,7 @@ module.exports = [{ "www/code/mermaid*.js", "www/code/orgmode.js", "www/common/worker.bundle.js", + "www/common/worker.bundle.min.js", "src/tweetnacl", "_build", "testapi.js", diff --git a/rollup.config.mjs b/rollup.config.mjs index b087d2dbb..b8719eb7a 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -10,11 +10,30 @@ import json from '@rollup/plugin-json'; export default { //input: "./_src/worker/index.ts", input: "./src/worker/store.ts", - output: { + output: [{ name: 'cryptpad-worker', - file: "./_build/worker.bundle.js", - format: "umd" - }, + file: "./www/common/worker.bundle.js", + format: "umd", + plugins: [ + terser({ + format: { + comments: 'some', + beautify: true, + ecma: '2015', + }, + compress: false, + mangle: false, + module: true, + }), + ] + }, { + name: 'cryptpad-worker-min', + file: "./www/common/worker.bundle.min.js", + format: "umd", + plugins: [terser({ + format: { comments: false, ecma: '2015' } + })] + }], preserveSymlinks: true, plugins: [ json(), @@ -25,16 +44,6 @@ export default { commonjs({ ignore:['crypto', 'node:http', 'node:https'] // required by tweetnacl for node }), - terser({ - format: { - comments: 'some', - beautify: true, - ecma: '2015', - }, - compress: false, - mangle: false, - module: true, - }), //nodePolyfills( /* options */ ) ] } diff --git a/testapi.js b/scripts/api/testapi.js similarity index 81% rename from testapi.js rename to scripts/api/testapi.js index 4e521e86d..6b2b9cd2b 100644 --- a/testapi.js +++ b/scripts/api/testapi.js @@ -1,7 +1,7 @@ -const Messages = require('./src/messages'); -const AppConfig = require('./customize/application_config'); +const Messages = require('../../src/messages'); +const AppConfig = require('../../customize/application_config'); //const App = require('./_build/worker.bundle'); -const Store = require('./www/common/store-interface'); +const Store = require('../../www/common/store-interface'); const Http = require('node:http'); diff --git a/src/tweetnacl/.npmignore b/src/tweetnacl/.npmignore deleted file mode 100644 index 8491e7c1a..000000000 --- a/src/tweetnacl/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -test -.travis.yml -bower.json diff --git a/src/tweetnacl/CHANGELOG.md b/src/tweetnacl/CHANGELOG.md deleted file mode 100644 index 0ea161ee8..000000000 --- a/src/tweetnacl/CHANGELOG.md +++ /dev/null @@ -1,101 +0,0 @@ -TweetNaCl.js Changelog -====================== - - -v0.12.2 -------- - -* Improved performance of curve operations, making `nacl.scalarMult`, `nacl.box`, - `nacl.sign` and related functions up to 3x faster in `nacl-fast` version. - - -v0.12.1 -------- - -* Significantly improved performance of Salsa20 (~1.5x faster) and - Poly1305 (~3.5x faster) in `nacl-fast` version. - - -v0.12.0 -------- - -* Instead of using the given secret key directly, TweetNaCl.js now copies it to - a new array in `nacl.box.keyPair.fromSecretKey` and - `nacl.sign.keyPair.fromSecretKey`. - - -v0.11.2 -------- - -* Added new constant: `nacl.sign.seedLength`. - - -v0.11.1 -------- - -* Even faster hash for both short and long inputs (in `nacl-fast`). - - -v0.11.0 -------- - -* Implement `nacl.sign.keyPair.fromSeed` to enable creation of sign key pairs - deterministically from a 32-byte seed. (It behaves like - [libsodium's](http://doc.libsodium.org/public-key_cryptography/public-key_signatures.html) - `crypto_sign_seed_keypair`: the seed becomes a secret part of the secret key.) - -* Fast version now has an improved hash implementation that is 2x-5x faster. - -* Fixed benchmarks, which may have produced incorrect measurements. - - -v0.10.1 -------- - -* Exported undocumented `nacl.lowlevel.crypto_core_hsalsa20`. - - -v0.10.0 -------- - -* **Signature API breaking change!** `nacl.sign` and `nacl.sign.open` now deal - with signed messages, and new `nacl.sign.detached` and - `nacl.sign.detached.verify` are available. - - Previously, `nacl.sign` returned a signature, and `nacl.sign.open` accepted a - message and "detached" signature. This was unlike NaCl's API, which dealt with - signed messages (concatenation of signature and message). - - The new API is: - - nacl.sign(message, secretKey) -> signedMessage - nacl.sign.open(signedMessage, publicKey) -> message | null - - Since detached signatures are common, two new API functions were introduced: - - nacl.sign.detached(message, secretKey) -> signature - nacl.sign.detached.verify(message, signature, publicKey) -> true | false - - (Note that it's `verify`, not `open`, and it returns a boolean value, unlike - `open`, which returns an "unsigned" message.) - -* NPM package now comes without `test` directory to keep it small. - - -v0.9.2 ------- - -* Improved documentation. -* Fast version: increased theoretical message size limit from 2^32-1 to 2^52 - bytes in Poly1305 (and thus, secretbox and box). However this has no impact - in practice since JavaScript arrays or ArrayBuffers are limited to 32-bit - indexes, and most implementations won't allocate more than a gigabyte or so. - (Obviously, there are no tests for the correctness of implementation.) Also, - it's not recommended to use messages that large without splitting them into - smaller packets anyway. - - -v0.9.1 ------- - -* Initial release diff --git a/src/tweetnacl/README.md b/src/tweetnacl/README.md deleted file mode 100644 index 849b8fad2..000000000 --- a/src/tweetnacl/README.md +++ /dev/null @@ -1,455 +0,0 @@ -TweetNaCl.js -============ - -Port of [TweetNaCl](http://tweetnacl.cr.yp.to) / [NaCl](http://nacl.cr.yp.to/) -to JavaScript for modern browsers and Node.js. Public domain. - -[![Build Status](https://travis-ci.org/dchest/tweetnacl-js.svg?branch=master) -](https://travis-ci.org/dchest/tweetnacl-js) - -[Demo](https://dchest.github.io/tweetnacl-js/) - -**:warning: Beta version. The library is stable and API is frozen, however -it has not been independently reviewed. If you can help reviewing it, please -[contact me](mailto:dmitry@codingrobots.com).** - -Documentation -============= - -* [Overview](#overview) -* [Installation](#installation) -* [Usage](#usage) - * [Public-key authenticated encryption (box)](#public-key-authenticated-encryption-box) - * [Secret-key authenticated encryption (secretbox)](#secret-key-authenticated-encryption-secretbox) - * [Scalar multiplication](#scalar-multiplication) - * [Signatures](#signatures) - * [Hashing](#hashing) - * [Random bytes generation](#random-bytes-generation) - * [Constant-time comparison](#constant-time-comparison) - * [Utilities](#utilities) -* [Examples](#examples) -* [System requirements](#system-requirements) -* [Development and testing](#development-and-testing) -* [Contributors](#contributors) -* [Who uses it](#who-uses-it) - - -Overview --------- - -The primary goal of this project is to produce a translation of TweetNaCl to -JavaScript which is as close as possible to the original C implementation, plus -a thin layer of idiomatic high-level API on top of it. - -There are two versions, you can use either of them: - -* `nacl.js` is the port of TweetNaCl with minimum differences from the - original + high-level API. - -* `nacl-fast.js` is like `nacl.js`, but with some functions replaced with - faster versions. - - -Installation ------------- - -You can install TweetNaCl.is via a package manager: - -[Bower](http://bower.io): - - $ bower install tweetnacl - -[NPM](https://www.npmjs.org/): - - $ npm install tweetnacl - -or [download source code](https://github.com/dchest/tweetnacl-js/releases). - - -Usage ------- - -All API functions accept and return bytes as `Uint8Array`s. If you need to -encode or decode strings, use functions from `nacl.util` namespace. - -### Public-key authenticated encryption (box) - -Implements *curve25519-xsalsa20-poly1305*. - -#### nacl.box.keyPair() - -Generates a new random key pair for box and returns it as an object with -`publicKey` and `secretKey` members: - - { - publicKey: ..., // Uint8Array with 32-byte public key - secretKey: ... // Uint8Array with 32-byte secret key - } - - -#### nacl.box.keyPair.fromSecretKey(secretKey) - -Returns a key pair for box with public key corresponding to the given secret -key. - -#### nacl.box(message, nonce, theirPublicKey, mySecretKey) - -Encrypt and authenticates message using peer's public key, our secret key, and -the given nonce, which must be unique for each distinct message for a key pair. - -Returns an encrypted and authenticated message, which is -`nacl.box.overheadLength` longer than the original message. - -#### nacl.box.open(box, nonce, theirPublicKey, mySecretKey) - -Authenticates and decrypts the given box with peer's public key, our secret -key, and the given nonce. - -Returns the original message, or `false` if authentication fails. - -#### nacl.box.before(theirPublicKey, mySecretKey) - -Returns a precomputed shared key which can be used in `nacl.box.after` and -`nacl.box.open.after`. - -#### nacl.box.after(message, nonce, sharedKey) - -Same as `nacl.box`, but uses a shared key precomputed with `nacl.box.before`. - -#### nacl.box.open.after(box, nonce, sharedKey) - -Same as `nacl.box.open`, but uses a shared key precomputed with `nacl.box.before`. - -#### nacl.box.publicKeyLength = 32 - -Length of public key in bytes. - -#### nacl.box.secretKeyLength = 32 - -Length of secret key in bytes. - -#### nacl.box.sharedKeyLength = 32 - -Length of precomputed shared key in bytes. - -#### nacl.box.nonceLength = 24 - -Length of nonce in bytes. - -#### nacl.box.overheadLength = 16 - -Length of overhead added to box compared to original message. - - -### Secret-key authenticated encryption (secretbox) - -Implements *xsalsa20-poly1305*. - -#### nacl.secretbox(message, nonce, key) - -Encrypt and authenticates message using the key and the nonce. The nonce must -be unique for each distinct message for this key. - -Returns an encrypted and authenticated message, which is -`nacl.secretbox.overheadLength` longer than the original message. - -#### nacl.secretbox.open(box, nonce, key) - -Authenticates and decrypts the given secret box using the key and the nonce. - -Returns the original message, or `false` if authentication fails. - -#### nacl.secretbox.keyLength = 32 - -Length of key in bytes. - -#### nacl.secretbox.nonceLength = 24 - -Length of nonce in bytes. - -#### nacl.secretbox.overheadLength = 16 - -Length of overhead added to secret box compared to original message. - - -### Scalar multiplication - -Implements *curve25519*. - -#### nacl.scalarMult(n, p) - -Multiplies an integer `n` by a group element `p` and returns the resulting -group element. - -#### nacl.scalarMult.base(n) - -Multiplies an integer `n` by a standard group element and returns the resulting -group element. - -#### nacl.scalarMult.scalarLength = 32 - -Length of scalar in bytes. - -#### nacl.scalarMult.groupElementLength = 32 - -Length of group element in bytes. - - -### Signatures - -Implements [ed25519](http://ed25519.cr.yp.to). - -#### nacl.sign.keyPair() - -Generates new random key pair for signing and returns it as an object with -`publicKey` and `secretKey` members: - - { - publicKey: ..., // Uint8Array with 32-byte public key - secretKey: ... // Uint8Array with 64-byte secret key - } - -#### nacl.sign.keyPair.fromSecretKey(secretKey) - -Returns a signing key pair with public key corresponding to the given -64-byte secret key. The secret key must have been generated by -`nacl.sign.keyPair` or `nacl.sign.keyPair.fromSeed`. - -#### nacl.sign.keyPair.fromSeed(seed) - -Returns a new signing key pair generated deterministically from a 32-byte seed. -The seed must contain enough entropy to be secure. This method is not -recommended for general use: instead, use `nacl.sign.keyPair` to generate a new -key pair from a random seed. - -#### nacl.sign(message, secretKey) - -Signs the message using the secret key and returns a signed message. - -#### nacl.sign.open(signedMessage, publicKey) - -Verifies the signed message and returns the message without signature. - -Returns `null` if verification failed. - -#### nacl.sign.detached(message, secretKey) - -Signs the message using the secret key and returns a signature. - -#### nacl.sign.detached.verify(message, signature, publicKey) - -Verifies the signature for the message and returns `true` if verification -succeeded or `false` if it failed. - -#### nacl.sign.publicKeyLength = 32 - -Length of signing public key in bytes. - -#### nacl.sign.secretKeyLength = 64 - -Length of signing secret key in bytes. - -#### nacl.sign.seedLength = 32 - -Length of seed for `nacl.sign.keyPair.fromSeed` in bytes. - -#### nacl.sign.signatureLength = 64 - -Length of signature in bytes. - - -### Hashing - -Implements *SHA-512*. - -#### nacl.hash(message) - -Returns SHA-512 hash of the message. - -#### nacl.hash.hashLength = 64 - -Length of hash in bytes. - - -### Random bytes generation - -#### nacl.randomBytes(length) - -Returns a `Uint8Array` of the given length containing random bytes of -cryptographic quality. - -**Implementation note** - -TweetNaCl.js uses the following methods to generate random bytes, -depending on the platform it runs on: - -* `window.crypto.getRandomValues` (WebCrypto standard) -* `window.msCrypto.getRandomValues` (Internet Explorer 11) -* `crypto.randomBytes` (Node.js) - -Note that browsers are required to throw `QuotaExceededError` exception if -requested `length` is more than 65536, so do not ask for more than 65536 bytes -in *one call* (multiple calls to get as many bytes as you like are okay: -browsers can generate infinite amount of random bytes without any bad -consequences). - -If the platform doesn't provide a suitable PRNG, the following functions, -which require random numbers, will throw exception: - -* `nacl.randomBytes` -* `nacl.box.keyPair` -* `nacl.sign.keyPair` - -Other functions are deterministic and will continue working. - -If a platform you are targeting doesn't implement secure random number -generator, but you somehow have a cryptographically-strong source of entropy -(not `Math.random`!), and you know what you are doing, you can plug it into -TweetNaCl.js like this: - - nacl.setPRNG(function(x, n) { - // ... copy n random bytes into x ... - }); - -Note that `nacl.setPRNG` *completely replaces* internal random byte generator -with the one provided. - - -### Constant-time comparison - -#### nacl.verify(x, y) - -Compares `x` and `y` in constant time and returns `true` if their lengths are -non-zero and equal, and their contents are equal. - -Returns `false` if either of the arguments has zero length, or arguments have -different lengths, or their contents differ. - - -### Utilities - -Encoding/decoding functions are provided for convenience. They are correct, -however their performance and wide compatibility with uncommon runtimes is not -something that is considered important compared to the simplicity and size of -implementation. You can use third-party libraries if you need to. - -#### nacl.util.decodeUTF8(string) - -Decodes string and returns `Uint8Array` of bytes. - -#### nacl.util.encodeUTF8(array) - -Encodes `Uint8Array` or `Array` of bytes into string. - -#### nacl.util.decodeBase64(string) - -Decodes Base-64 encoded string and returns `Uint8Array` of bytes. - -#### nacl.util.encodeBase64(array) - -Encodes `Uint8Array` or `Array` of bytes into string using Base-64 encoding. - - -System requirements -------------------- - -TweetNaCl.js supports modern browsers that have a cryptographically secure -pseudorandom number generator and typed arrays, including the latest versions -of: - -* Chrome -* Firefox -* Safari (Mac, iOS) -* Internet Explorer 11 - -Other systems: - -* Node.js (we test on 0.10 and later) - - -Development and testing ------------------------- - -Install NPM modules needed for development: - - $ npm install - -To build minified versions: - - $ npm run build - -Tests use minified version, so make sure to rebuild it every time you change -`nacl.js` or `nacl-fast.js`. - -### Testing - -To run tests in Node.js: - - $ npm test - -By default all tests described here work on `nacl.min.js`. To test other -versions, set environment variable `NACL_SRC` to the file name you want to test. -For example, the following command will test fast minified version: - - $ NACL_SRC=nacl-fast.min.js npm test - -To run full suite of tests in Node.hs, including comparing outputs of -JavaScript port to outputs of the original C version: - - $ npm run testall - -To prepare tests for browsers: - - $ npm run browser - -and then open `tests/browser/test.html` (or `tests/browser/test-fast.html`) to -run them. - -To run headless browser tests with `testling`: - - $ npm run testling - -(If you get `Error: spawn ENOENT`, install *xvfb*: `sudo apt-get install xvfb`.) - -### Benchmarking - -To run benchmarks in Node.js: - - $ npm run bench - $ NACL_SRC=nacl-fast.min.js npm run bench - -To run benchmarks in a browser, open `test/benchmark/bench.html` (or -`test/benchmark/bench-fast.html`). - - -Contributors ------------- - -JavaScript port: - - * [Dmitry Chestnykh](http://github.com/dchest) (ported xsalsa20, poly1305, curve25519) - * [Devi Mandiri](https://github.com/devi) (ported curve25519, ed25519, sha512) - -Original authors of [NaCl](http://nacl.cr.yp.to), [TweetNaCl](http://tweetnacl.cr.yp.to) -and [Poly1305-donna](https://github.com/floodyberry/poly1305-donna) -(who are *not* responsible for any errors in this implementation): - - * [Daniel J. Bernstein](http://cr.yp.to/djb.html) - * Wesley Janssen - * [Tanja Lange](http://hyperelliptic.org/tanja) - * [Peter Schwabe](http://www.cryptojedi.org/users/peter/) - * [Matthew Dempsky](https://github.com/mdempsky) - * [Andrew Moon](https://github.com/floodyberry) - -Contributors have dedicated their work to the public domain. - -This software is distributed without any warranty. - - -Who uses it ------------ - -Some notable users of TweetNaCl.js: - -* [miniLock](http://minilock.io/) -* [Stellar](https://www.stellar.org/) diff --git a/src/tweetnacl/nacl-fast.js b/src/tweetnacl/nacl-fast.js deleted file mode 100644 index 270f21e82..000000000 --- a/src/tweetnacl/nacl-fast.js +++ /dev/null @@ -1,2414 +0,0 @@ -(function(nacl) { -'use strict'; - -// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri. -// Public domain. -// -// Implementation derived from TweetNaCl version 20140427. -// See for details: http://tweetnacl.cr.yp.to/ - -/* jshint newcap: false */ - -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; -}; - -// Pluggable, initialized in high-level API below. -var randombytes = function(/* x, n */) { 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([0xdb41, 1]), - D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]), - D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]), - X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]), - Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]), - I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]); - -function ts64(x, i, h, l) { - x[i] = (h >> 24) & 0xff; - x[i+1] = (h >> 16) & 0xff; - x[i+2] = (h >> 8) & 0xff; - x[i+3] = h & 0xff; - x[i+4] = (l >> 24) & 0xff; - x[i+5] = (l >> 16) & 0xff; - x[i+6] = (l >> 8) & 0xff; - x[i+7] = l & 0xff; -} - -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] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24, - j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24, - j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24, - j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24, - j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24, - j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24, - j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24, - j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24, - j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24, - j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24, - j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24, - j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24, - j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24, - j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24, - j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24, - j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<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 & 0xff; - o[ 1] = x0 >>> 8 & 0xff; - o[ 2] = x0 >>> 16 & 0xff; - o[ 3] = x0 >>> 24 & 0xff; - - o[ 4] = x1 >>> 0 & 0xff; - o[ 5] = x1 >>> 8 & 0xff; - o[ 6] = x1 >>> 16 & 0xff; - o[ 7] = x1 >>> 24 & 0xff; - - o[ 8] = x2 >>> 0 & 0xff; - o[ 9] = x2 >>> 8 & 0xff; - o[10] = x2 >>> 16 & 0xff; - o[11] = x2 >>> 24 & 0xff; - - o[12] = x3 >>> 0 & 0xff; - o[13] = x3 >>> 8 & 0xff; - o[14] = x3 >>> 16 & 0xff; - o[15] = x3 >>> 24 & 0xff; - - o[16] = x4 >>> 0 & 0xff; - o[17] = x4 >>> 8 & 0xff; - o[18] = x4 >>> 16 & 0xff; - o[19] = x4 >>> 24 & 0xff; - - o[20] = x5 >>> 0 & 0xff; - o[21] = x5 >>> 8 & 0xff; - o[22] = x5 >>> 16 & 0xff; - o[23] = x5 >>> 24 & 0xff; - - o[24] = x6 >>> 0 & 0xff; - o[25] = x6 >>> 8 & 0xff; - o[26] = x6 >>> 16 & 0xff; - o[27] = x6 >>> 24 & 0xff; - - o[28] = x7 >>> 0 & 0xff; - o[29] = x7 >>> 8 & 0xff; - o[30] = x7 >>> 16 & 0xff; - o[31] = x7 >>> 24 & 0xff; - - o[32] = x8 >>> 0 & 0xff; - o[33] = x8 >>> 8 & 0xff; - o[34] = x8 >>> 16 & 0xff; - o[35] = x8 >>> 24 & 0xff; - - o[36] = x9 >>> 0 & 0xff; - o[37] = x9 >>> 8 & 0xff; - o[38] = x9 >>> 16 & 0xff; - o[39] = x9 >>> 24 & 0xff; - - o[40] = x10 >>> 0 & 0xff; - o[41] = x10 >>> 8 & 0xff; - o[42] = x10 >>> 16 & 0xff; - o[43] = x10 >>> 24 & 0xff; - - o[44] = x11 >>> 0 & 0xff; - o[45] = x11 >>> 8 & 0xff; - o[46] = x11 >>> 16 & 0xff; - o[47] = x11 >>> 24 & 0xff; - - o[48] = x12 >>> 0 & 0xff; - o[49] = x12 >>> 8 & 0xff; - o[50] = x12 >>> 16 & 0xff; - o[51] = x12 >>> 24 & 0xff; - - o[52] = x13 >>> 0 & 0xff; - o[53] = x13 >>> 8 & 0xff; - o[54] = x13 >>> 16 & 0xff; - o[55] = x13 >>> 24 & 0xff; - - o[56] = x14 >>> 0 & 0xff; - o[57] = x14 >>> 8 & 0xff; - o[58] = x14 >>> 16 & 0xff; - o[59] = x14 >>> 24 & 0xff; - - o[60] = x15 >>> 0 & 0xff; - o[61] = x15 >>> 8 & 0xff; - o[62] = x15 >>> 16 & 0xff; - o[63] = x15 >>> 24 & 0xff; -} - -function core_hsalsa20(o,p,k,c) { - var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24, - j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24, - j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24, - j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24, - j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24, - j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24, - j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24, - j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24, - j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24, - j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24, - j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24, - j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24, - j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24, - j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24, - j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24, - j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<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 & 0xff; - o[ 1] = x0 >>> 8 & 0xff; - o[ 2] = x0 >>> 16 & 0xff; - o[ 3] = x0 >>> 24 & 0xff; - - o[ 4] = x5 >>> 0 & 0xff; - o[ 5] = x5 >>> 8 & 0xff; - o[ 6] = x5 >>> 16 & 0xff; - o[ 7] = x5 >>> 24 & 0xff; - - o[ 8] = x10 >>> 0 & 0xff; - o[ 9] = x10 >>> 8 & 0xff; - o[10] = x10 >>> 16 & 0xff; - o[11] = x10 >>> 24 & 0xff; - - o[12] = x15 >>> 0 & 0xff; - o[13] = x15 >>> 8 & 0xff; - o[14] = x15 >>> 16 & 0xff; - o[15] = x15 >>> 24 & 0xff; - - o[16] = x6 >>> 0 & 0xff; - o[17] = x6 >>> 8 & 0xff; - o[18] = x6 >>> 16 & 0xff; - o[19] = x6 >>> 24 & 0xff; - - o[20] = x7 >>> 0 & 0xff; - o[21] = x7 >>> 8 & 0xff; - o[22] = x7 >>> 16 & 0xff; - o[23] = x7 >>> 24 & 0xff; - - o[24] = x8 >>> 0 & 0xff; - o[25] = x8 >>> 8 & 0xff; - o[26] = x8 >>> 16 & 0xff; - o[27] = x8 >>> 24 & 0xff; - - o[28] = x9 >>> 0 & 0xff; - o[29] = x9 >>> 8 & 0xff; - o[30] = x9 >>> 16 & 0xff; - o[31] = x9 >>> 24 & 0xff; -} - -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]); - // "expand 32-byte k" - -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] & 0xff) | 0; - z[i] = u & 0xff; - 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] & 0xff) | 0; - z[i] = u & 0xff; - 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); -} - -/* -* Port of Andrew Moon's Poly1305-donna-16. Public domain. -* https://github.com/floodyberry/poly1305-donna -*/ - -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] & 0xff | (key[ 1] & 0xff) << 8; this.r[0] = ( t0 ) & 0x1fff; - t1 = key[ 2] & 0xff | (key[ 3] & 0xff) << 8; this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff; - t2 = key[ 4] & 0xff | (key[ 5] & 0xff) << 8; this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03; - t3 = key[ 6] & 0xff | (key[ 7] & 0xff) << 8; this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff; - t4 = key[ 8] & 0xff | (key[ 9] & 0xff) << 8; this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff; - this.r[5] = ((t4 >>> 1)) & 0x1ffe; - t5 = key[10] & 0xff | (key[11] & 0xff) << 8; this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff; - t6 = key[12] & 0xff | (key[13] & 0xff) << 8; this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81; - t7 = key[14] & 0xff | (key[15] & 0xff) << 8; this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff; - this.r[9] = ((t7 >>> 5)) & 0x007f; - - this.pad[0] = key[16] & 0xff | (key[17] & 0xff) << 8; - this.pad[1] = key[18] & 0xff | (key[19] & 0xff) << 8; - this.pad[2] = key[20] & 0xff | (key[21] & 0xff) << 8; - this.pad[3] = key[22] & 0xff | (key[23] & 0xff) << 8; - this.pad[4] = key[24] & 0xff | (key[25] & 0xff) << 8; - this.pad[5] = key[26] & 0xff | (key[27] & 0xff) << 8; - this.pad[6] = key[28] & 0xff | (key[29] & 0xff) << 8; - this.pad[7] = key[30] & 0xff | (key[31] & 0xff) << 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] & 0xff | (m[mpos+ 1] & 0xff) << 8; h0 += ( t0 ) & 0x1fff; - t1 = m[mpos+ 2] & 0xff | (m[mpos+ 3] & 0xff) << 8; h1 += ((t0 >>> 13) | (t1 << 3)) & 0x1fff; - t2 = m[mpos+ 4] & 0xff | (m[mpos+ 5] & 0xff) << 8; h2 += ((t1 >>> 10) | (t2 << 6)) & 0x1fff; - t3 = m[mpos+ 6] & 0xff | (m[mpos+ 7] & 0xff) << 8; h3 += ((t2 >>> 7) | (t3 << 9)) & 0x1fff; - t4 = m[mpos+ 8] & 0xff | (m[mpos+ 9] & 0xff) << 8; h4 += ((t3 >>> 4) | (t4 << 12)) & 0x1fff; - h5 += ((t4 >>> 1)) & 0x1fff; - t5 = m[mpos+10] & 0xff | (m[mpos+11] & 0xff) << 8; h6 += ((t4 >>> 14) | (t5 << 2)) & 0x1fff; - t6 = m[mpos+12] & 0xff | (m[mpos+13] & 0xff) << 8; h7 += ((t5 >>> 11) | (t6 << 5)) & 0x1fff; - t7 = m[mpos+14] & 0xff | (m[mpos+15] & 0xff) << 8; h8 += ((t6 >>> 8) | (t7 << 8)) & 0x1fff; - 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 &= 0x1fff; - d0 += h5 * (5 * r5); - d0 += h6 * (5 * r4); - d0 += h7 * (5 * r3); - d0 += h8 * (5 * r2); - d0 += h9 * (5 * r1); - c += (d0 >>> 13); d0 &= 0x1fff; - - d1 = c; - d1 += h0 * r1; - d1 += h1 * r0; - d1 += h2 * (5 * r9); - d1 += h3 * (5 * r8); - d1 += h4 * (5 * r7); - c = (d1 >>> 13); d1 &= 0x1fff; - d1 += h5 * (5 * r6); - d1 += h6 * (5 * r5); - d1 += h7 * (5 * r4); - d1 += h8 * (5 * r3); - d1 += h9 * (5 * r2); - c += (d1 >>> 13); d1 &= 0x1fff; - - d2 = c; - d2 += h0 * r2; - d2 += h1 * r1; - d2 += h2 * r0; - d2 += h3 * (5 * r9); - d2 += h4 * (5 * r8); - c = (d2 >>> 13); d2 &= 0x1fff; - d2 += h5 * (5 * r7); - d2 += h6 * (5 * r6); - d2 += h7 * (5 * r5); - d2 += h8 * (5 * r4); - d2 += h9 * (5 * r3); - c += (d2 >>> 13); d2 &= 0x1fff; - - d3 = c; - d3 += h0 * r3; - d3 += h1 * r2; - d3 += h2 * r1; - d3 += h3 * r0; - d3 += h4 * (5 * r9); - c = (d3 >>> 13); d3 &= 0x1fff; - d3 += h5 * (5 * r8); - d3 += h6 * (5 * r7); - d3 += h7 * (5 * r6); - d3 += h8 * (5 * r5); - d3 += h9 * (5 * r4); - c += (d3 >>> 13); d3 &= 0x1fff; - - d4 = c; - d4 += h0 * r4; - d4 += h1 * r3; - d4 += h2 * r2; - d4 += h3 * r1; - d4 += h4 * r0; - c = (d4 >>> 13); d4 &= 0x1fff; - d4 += h5 * (5 * r9); - d4 += h6 * (5 * r8); - d4 += h7 * (5 * r7); - d4 += h8 * (5 * r6); - d4 += h9 * (5 * r5); - c += (d4 >>> 13); d4 &= 0x1fff; - - d5 = c; - d5 += h0 * r5; - d5 += h1 * r4; - d5 += h2 * r3; - d5 += h3 * r2; - d5 += h4 * r1; - c = (d5 >>> 13); d5 &= 0x1fff; - d5 += h5 * r0; - d5 += h6 * (5 * r9); - d5 += h7 * (5 * r8); - d5 += h8 * (5 * r7); - d5 += h9 * (5 * r6); - c += (d5 >>> 13); d5 &= 0x1fff; - - d6 = c; - d6 += h0 * r6; - d6 += h1 * r5; - d6 += h2 * r4; - d6 += h3 * r3; - d6 += h4 * r2; - c = (d6 >>> 13); d6 &= 0x1fff; - d6 += h5 * r1; - d6 += h6 * r0; - d6 += h7 * (5 * r9); - d6 += h8 * (5 * r8); - d6 += h9 * (5 * r7); - c += (d6 >>> 13); d6 &= 0x1fff; - - d7 = c; - d7 += h0 * r7; - d7 += h1 * r6; - d7 += h2 * r5; - d7 += h3 * r4; - d7 += h4 * r3; - c = (d7 >>> 13); d7 &= 0x1fff; - d7 += h5 * r2; - d7 += h6 * r1; - d7 += h7 * r0; - d7 += h8 * (5 * r9); - d7 += h9 * (5 * r8); - c += (d7 >>> 13); d7 &= 0x1fff; - - d8 = c; - d8 += h0 * r8; - d8 += h1 * r7; - d8 += h2 * r6; - d8 += h3 * r5; - d8 += h4 * r4; - c = (d8 >>> 13); d8 &= 0x1fff; - d8 += h5 * r3; - d8 += h6 * r2; - d8 += h7 * r1; - d8 += h8 * r0; - d8 += h9 * (5 * r9); - c += (d8 >>> 13); d8 &= 0x1fff; - - d9 = c; - d9 += h0 * r9; - d9 += h1 * r8; - d9 += h2 * r7; - d9 += h3 * r6; - d9 += h4 * r5; - c = (d9 >>> 13); d9 &= 0x1fff; - d9 += h5 * r4; - d9 += h6 * r3; - d9 += h7 * r2; - d9 += h8 * r1; - d9 += h9 * r0; - c += (d9 >>> 13); d9 &= 0x1fff; - - c = (((c << 2) + c)) | 0; - c = (c + d0) | 0; - d0 = c & 0x1fff; - 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] &= 0x1fff; - for (i = 2; i < 10; i++) { - this.h[i] += c; - c = this.h[i] >>> 13; - this.h[i] &= 0x1fff; - } - this.h[0] += (c * 5); - c = this.h[0] >>> 13; - this.h[0] &= 0x1fff; - this.h[1] += c; - c = this.h[1] >>> 13; - this.h[1] &= 0x1fff; - this.h[2] += c; - - g[0] = this.h[0] + 5; - c = g[0] >>> 13; - g[0] &= 0x1fff; - for (i = 1; i < 10; i++) { - g[i] = this.h[i] + c; - c = g[i] >>> 13; - g[i] &= 0x1fff; - } - 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) ) & 0xffff; - this.h[1] = ((this.h[1] >>> 3) | (this.h[2] << 10) ) & 0xffff; - this.h[2] = ((this.h[2] >>> 6) | (this.h[3] << 7) ) & 0xffff; - this.h[3] = ((this.h[3] >>> 9) | (this.h[4] << 4) ) & 0xffff; - this.h[4] = ((this.h[4] >>> 12) | (this.h[5] << 1) | (this.h[6] << 14)) & 0xffff; - this.h[5] = ((this.h[6] >>> 2) | (this.h[7] << 11) ) & 0xffff; - this.h[6] = ((this.h[7] >>> 5) | (this.h[8] << 8) ) & 0xffff; - this.h[7] = ((this.h[8] >>> 8) | (this.h[9] << 5) ) & 0xffff; - - f = this.h[0] + this.pad[0]; - this.h[0] = f & 0xffff; - for (i = 1; i < 8; i++) { - f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0; - this.h[i] = f & 0xffff; - } - - mac[macpos+ 0] = (this.h[0] >>> 0) & 0xff; - mac[macpos+ 1] = (this.h[0] >>> 8) & 0xff; - mac[macpos+ 2] = (this.h[1] >>> 0) & 0xff; - mac[macpos+ 3] = (this.h[1] >>> 8) & 0xff; - mac[macpos+ 4] = (this.h[2] >>> 0) & 0xff; - mac[macpos+ 5] = (this.h[2] >>> 8) & 0xff; - mac[macpos+ 6] = (this.h[3] >>> 0) & 0xff; - mac[macpos+ 7] = (this.h[3] >>> 8) & 0xff; - mac[macpos+ 8] = (this.h[4] >>> 0) & 0xff; - mac[macpos+ 9] = (this.h[4] >>> 8) & 0xff; - mac[macpos+10] = (this.h[5] >>> 0) & 0xff; - mac[macpos+11] = (this.h[5] >>> 8) & 0xff; - mac[macpos+12] = (this.h[6] >>> 0) & 0xff; - mac[macpos+13] = (this.h[6] >>> 8) & 0xff; - mac[macpos+14] = (this.h[7] >>> 0) & 0xff; - mac[macpos+15] = (this.h[7] >>> 8) & 0xff; -}; - -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] - 0xffed; - for (i = 1; i < 15; i++) { - m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1); - m[i-1] &= 0xffff; - } - m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1); - b = (m[15]>>16) & 1; - m[14] &= 0xffff; - sel25519(t, m, 1-b); - } - for (i = 0; i < 16; i++) { - o[2*i] = t[i] & 0xff; - 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] &= 0x7fff; -} - -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; - // t15 left as is - - // first car - 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); - - // second car - 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 = [ - 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, - 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, - 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, - 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, - 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, - 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, - 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, - 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, - 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, - 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, - 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, - 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, - 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, - 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, - 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, - 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, - 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, - 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, - 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, - 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, - 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, - 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, - 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, - 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, - 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, - 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, - 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, - 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, - 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, - 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, - 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, - 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, - 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, - 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, - 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, - 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, - 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, - 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, - 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, - 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 -]; - -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; - - // add - h = ah7; - l = al7; - - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; - - // Sigma1 - 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 & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - // Ch - h = (ah4 & ah5) ^ (~ah4 & ah6); - l = (al4 & al5) ^ (~al4 & al6); - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - // K - h = K[i*2]; - l = K[i*2+1]; - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - // w - h = wh[i%16]; - l = wl[i%16]; - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - - th = c & 0xffff | d << 16; - tl = a & 0xffff | b << 16; - - // add - h = th; - l = tl; - - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; - - // Sigma0 - 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 & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - // Maj - h = (ah0 & ah1) ^ (ah0 & ah2) ^ (ah1 & ah2); - l = (al0 & al1) ^ (al0 & al2) ^ (al1 & al2); - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - - bh7 = (c & 0xffff) | (d << 16); - bl7 = (a & 0xffff) | (b << 16); - - // add - h = bh3; - l = bl3; - - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; - - h = th; - l = tl; - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - - bh3 = (c & 0xffff) | (d << 16); - bl3 = (a & 0xffff) | (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++) { - // add - h = wh[j]; - l = wl[j]; - - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; - - h = wh[(j+9)%16]; - l = wl[(j+9)%16]; - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - // sigma0 - 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 & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - // sigma1 - 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 & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - - wh[j] = (c & 0xffff) | (d << 16); - wl[j] = (a & 0xffff) | (b << 16); - } - } - } - - // add - h = ah0; - l = al0; - - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; - - h = hh[0]; - l = hl[0]; - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - - hh[0] = ah0 = (c & 0xffff) | (d << 16); - hl[0] = al0 = (a & 0xffff) | (b << 16); - - h = ah1; - l = al1; - - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; - - h = hh[1]; - l = hl[1]; - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - - hh[1] = ah1 = (c & 0xffff) | (d << 16); - hl[1] = al1 = (a & 0xffff) | (b << 16); - - h = ah2; - l = al2; - - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; - - h = hh[2]; - l = hl[2]; - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - - hh[2] = ah2 = (c & 0xffff) | (d << 16); - hl[2] = al2 = (a & 0xffff) | (b << 16); - - h = ah3; - l = al3; - - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; - - h = hh[3]; - l = hl[3]; - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - - hh[3] = ah3 = (c & 0xffff) | (d << 16); - hl[3] = al3 = (a & 0xffff) | (b << 16); - - h = ah4; - l = al4; - - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; - - h = hh[4]; - l = hl[4]; - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - - hh[4] = ah4 = (c & 0xffff) | (d << 16); - hl[4] = al4 = (a & 0xffff) | (b << 16); - - h = ah5; - l = al5; - - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; - - h = hh[5]; - l = hl[5]; - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - - hh[5] = ah5 = (c & 0xffff) | (d << 16); - hl[5] = al5 = (a & 0xffff) | (b << 16); - - h = ah6; - l = al6; - - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; - - h = hh[6]; - l = hl[6]; - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - - hh[6] = ah6 = (c & 0xffff) | (d << 16); - hl[6] = al6 = (a & 0xffff) | (b << 16); - - h = ah7; - l = al7; - - a = l & 0xffff; b = l >>> 16; - c = h & 0xffff; d = h >>> 16; - - h = hh[7]; - l = hl[7]; - - a += l & 0xffff; b += l >>> 16; - c += h & 0xffff; d += h >>> 16; - - b += a >>> 16; - c += b >>> 16; - d += c >>> 16; - - hh[7] = ah7 = (c & 0xffff) | (d << 16); - hl[7] = al7 = (a & 0xffff) | (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] = 0x6a09e667; - hh[1] = 0xbb67ae85; - hh[2] = 0x3c6ef372; - hh[3] = 0xa54ff53a; - hh[4] = 0x510e527f; - hh[5] = 0x9b05688c; - hh[6] = 0x1f83d9ab; - hh[7] = 0x5be0cd19; - - hl[0] = 0xf3bcc908; - hl[1] = 0x84caa73b; - hl[2] = 0xfe94f82b; - hl[3] = 0x5f1d36f1; - hl[4] = 0xade682d1; - hl[5] = 0x2b3e6c1f; - hl[6] = 0xfb41bd6b; - hl[7] = 0x137e2179; - - 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 / 0x20000000) | 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([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]); - -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); -} - -// Note: difference from C - smlen returned, not passed as argument. -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_core_hsalsa20, - crypto_stream_xor : crypto_stream_xor, - crypto_stream : crypto_stream, - crypto_stream_salsa20_xor : crypto_stream_salsa20_xor, - crypto_stream_salsa20 : crypto_stream_salsa20, - crypto_onetimeauth : crypto_onetimeauth, - crypto_onetimeauth_verify : crypto_onetimeauth_verify, - crypto_verify_16 : crypto_verify_16, - crypto_verify_32 : crypto_verify_32, - crypto_secretbox : crypto_secretbox, - crypto_secretbox_open : crypto_secretbox_open, - crypto_scalarmult : crypto_scalarmult, - crypto_scalarmult_base : crypto_scalarmult_base, - crypto_box_beforenm : crypto_box_beforenm, - crypto_box_afternm : crypto_box_afternm, - crypto_box : crypto_box, - crypto_box_open : crypto_box_open, - crypto_box_keypair : crypto_box_keypair, - crypto_hash : crypto_hash, - crypto_sign : crypto_sign, - crypto_sign_keypair : crypto_sign_keypair, - crypto_sign_open : crypto_sign_open, - - crypto_secretbox_KEYBYTES : crypto_secretbox_KEYBYTES, - crypto_secretbox_NONCEBYTES : crypto_secretbox_NONCEBYTES, - crypto_secretbox_ZEROBYTES : crypto_secretbox_ZEROBYTES, - crypto_secretbox_BOXZEROBYTES : crypto_secretbox_BOXZEROBYTES, - crypto_scalarmult_BYTES : crypto_scalarmult_BYTES, - crypto_scalarmult_SCALARBYTES : crypto_scalarmult_SCALARBYTES, - crypto_box_PUBLICKEYBYTES : crypto_box_PUBLICKEYBYTES, - crypto_box_SECRETKEYBYTES : crypto_box_SECRETKEYBYTES, - crypto_box_BEFORENMBYTES : crypto_box_BEFORENMBYTES, - crypto_box_NONCEBYTES : crypto_box_NONCEBYTES, - crypto_box_ZEROBYTES : crypto_box_ZEROBYTES, - crypto_box_BOXZEROBYTES : crypto_box_BOXZEROBYTES, - crypto_sign_BYTES : crypto_sign_BYTES, - crypto_sign_PUBLICKEYBYTES : crypto_sign_PUBLICKEYBYTES, - crypto_sign_SECRETKEYBYTES : crypto_sign_SECRETKEYBYTES, - crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES, - crypto_hash_BYTES : crypto_hash_BYTES -}; - -/* High-level API */ - -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); - // Zero length arguments are considered not equal. - 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() { - // Initialize PRNG if environment provides CSPRNG. - // If not, methods calling randombytes will throw. - var crypto; - if (typeof self !== 'undefined') { - // Browser. - if (self.crypto && self.crypto.getRandomValues) { - crypto = self.crypto; // Standard - } else if (self.msCrypto && self.msCrypto.getRandomValues) { - crypto = self.msCrypto; // Internet Explorer 11+ - } - 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 require !== 'undefined') { - // Node.js. - 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]; - }); - } - } -})(); - -})(typeof module !== 'undefined' && module.exports ? module.exports : (window.nacl = window.nacl || {})); diff --git a/src/tweetnacl/nacl-fast.min.js b/src/tweetnacl/nacl-fast.min.js deleted file mode 100644 index bff8f34a8..000000000 --- a/src/tweetnacl/nacl-fast.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(r){"use strict";function t(r,t,n,e){r[t]=n>>24&255,r[t+1]=n>>16&255,r[t+2]=n>>8&255,r[t+3]=255&n,r[t+4]=e>>24&255,r[t+5]=e>>16&255,r[t+6]=e>>8&255,r[t+7]=255&e}function n(r,t,n,e,o){var i,h=0;for(i=0;o>i;i++)h|=r[t+i]^n[e+i];return(1&h-1>>>8)-1}function e(r,t,e,o){return n(r,t,e,o,16)}function o(r,t,e,o){return n(r,t,e,o,32)}function i(r,t,n,e){for(var o,i=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,h=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,f=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,s=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,u=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,c=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,y=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,l=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,w=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,p=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,g=255&n[16]|(255&n[17])<<8|(255&n[18])<<16|(255&n[19])<<24,v=255&n[20]|(255&n[21])<<8|(255&n[22])<<16|(255&n[23])<<24,b=255&n[24]|(255&n[25])<<8|(255&n[26])<<16|(255&n[27])<<24,d=255&n[28]|(255&n[29])<<8|(255&n[30])<<16|(255&n[31])<<24,A=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,_=i,U=h,E=a,x=f,M=s,m=u,B=c,S=y,K=l,T=w,Y=p,k=g,L=v,C=b,R=d,z=A,P=0;20>P;P+=2)o=_+L|0,M^=o<<7|o>>>25,o=M+_|0,K^=o<<9|o>>>23,o=K+M|0,L^=o<<13|o>>>19,o=L+K|0,_^=o<<18|o>>>14,o=m+U|0,T^=o<<7|o>>>25,o=T+m|0,C^=o<<9|o>>>23,o=C+T|0,U^=o<<13|o>>>19,o=U+C|0,m^=o<<18|o>>>14,o=Y+B|0,R^=o<<7|o>>>25,o=R+Y|0,E^=o<<9|o>>>23,o=E+R|0,B^=o<<13|o>>>19,o=B+E|0,Y^=o<<18|o>>>14,o=z+k|0,x^=o<<7|o>>>25,o=x+z|0,S^=o<<9|o>>>23,o=S+x|0,k^=o<<13|o>>>19,o=k+S|0,z^=o<<18|o>>>14,o=_+x|0,U^=o<<7|o>>>25,o=U+_|0,E^=o<<9|o>>>23,o=E+U|0,x^=o<<13|o>>>19,o=x+E|0,_^=o<<18|o>>>14,o=m+M|0,B^=o<<7|o>>>25,o=B+m|0,S^=o<<9|o>>>23,o=S+B|0,M^=o<<13|o>>>19,o=M+S|0,m^=o<<18|o>>>14,o=Y+T|0,k^=o<<7|o>>>25,o=k+Y|0,K^=o<<9|o>>>23,o=K+k|0,T^=o<<13|o>>>19,o=T+K|0,Y^=o<<18|o>>>14,o=z+R|0,L^=o<<7|o>>>25,o=L+z|0,C^=o<<9|o>>>23,o=C+L|0,R^=o<<13|o>>>19,o=R+C|0,z^=o<<18|o>>>14;_=_+i|0,U=U+h|0,E=E+a|0,x=x+f|0,M=M+s|0,m=m+u|0,B=B+c|0,S=S+y|0,K=K+l|0,T=T+w|0,Y=Y+p|0,k=k+g|0,L=L+v|0,C=C+b|0,R=R+d|0,z=z+A|0,r[0]=_>>>0&255,r[1]=_>>>8&255,r[2]=_>>>16&255,r[3]=_>>>24&255,r[4]=U>>>0&255,r[5]=U>>>8&255,r[6]=U>>>16&255,r[7]=U>>>24&255,r[8]=E>>>0&255,r[9]=E>>>8&255,r[10]=E>>>16&255,r[11]=E>>>24&255,r[12]=x>>>0&255,r[13]=x>>>8&255,r[14]=x>>>16&255,r[15]=x>>>24&255,r[16]=M>>>0&255,r[17]=M>>>8&255,r[18]=M>>>16&255,r[19]=M>>>24&255,r[20]=m>>>0&255,r[21]=m>>>8&255,r[22]=m>>>16&255,r[23]=m>>>24&255,r[24]=B>>>0&255,r[25]=B>>>8&255,r[26]=B>>>16&255,r[27]=B>>>24&255,r[28]=S>>>0&255,r[29]=S>>>8&255,r[30]=S>>>16&255,r[31]=S>>>24&255,r[32]=K>>>0&255,r[33]=K>>>8&255,r[34]=K>>>16&255,r[35]=K>>>24&255,r[36]=T>>>0&255,r[37]=T>>>8&255,r[38]=T>>>16&255,r[39]=T>>>24&255,r[40]=Y>>>0&255,r[41]=Y>>>8&255,r[42]=Y>>>16&255,r[43]=Y>>>24&255,r[44]=k>>>0&255,r[45]=k>>>8&255,r[46]=k>>>16&255,r[47]=k>>>24&255,r[48]=L>>>0&255,r[49]=L>>>8&255,r[50]=L>>>16&255,r[51]=L>>>24&255,r[52]=C>>>0&255,r[53]=C>>>8&255,r[54]=C>>>16&255,r[55]=C>>>24&255,r[56]=R>>>0&255,r[57]=R>>>8&255,r[58]=R>>>16&255,r[59]=R>>>24&255,r[60]=z>>>0&255,r[61]=z>>>8&255,r[62]=z>>>16&255,r[63]=z>>>24&255}function h(r,t,n,e){for(var o,i=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,h=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,f=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,s=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,u=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,c=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,y=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,l=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,w=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,p=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,g=255&n[16]|(255&n[17])<<8|(255&n[18])<<16|(255&n[19])<<24,v=255&n[20]|(255&n[21])<<8|(255&n[22])<<16|(255&n[23])<<24,b=255&n[24]|(255&n[25])<<8|(255&n[26])<<16|(255&n[27])<<24,d=255&n[28]|(255&n[29])<<8|(255&n[30])<<16|(255&n[31])<<24,A=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,_=i,U=h,E=a,x=f,M=s,m=u,B=c,S=y,K=l,T=w,Y=p,k=g,L=v,C=b,R=d,z=A,P=0;20>P;P+=2)o=_+L|0,M^=o<<7|o>>>25,o=M+_|0,K^=o<<9|o>>>23,o=K+M|0,L^=o<<13|o>>>19,o=L+K|0,_^=o<<18|o>>>14,o=m+U|0,T^=o<<7|o>>>25,o=T+m|0,C^=o<<9|o>>>23,o=C+T|0,U^=o<<13|o>>>19,o=U+C|0,m^=o<<18|o>>>14,o=Y+B|0,R^=o<<7|o>>>25,o=R+Y|0,E^=o<<9|o>>>23,o=E+R|0,B^=o<<13|o>>>19,o=B+E|0,Y^=o<<18|o>>>14,o=z+k|0,x^=o<<7|o>>>25,o=x+z|0,S^=o<<9|o>>>23,o=S+x|0,k^=o<<13|o>>>19,o=k+S|0,z^=o<<18|o>>>14,o=_+x|0,U^=o<<7|o>>>25,o=U+_|0,E^=o<<9|o>>>23,o=E+U|0,x^=o<<13|o>>>19,o=x+E|0,_^=o<<18|o>>>14,o=m+M|0,B^=o<<7|o>>>25,o=B+m|0,S^=o<<9|o>>>23,o=S+B|0,M^=o<<13|o>>>19,o=M+S|0,m^=o<<18|o>>>14,o=Y+T|0,k^=o<<7|o>>>25,o=k+Y|0,K^=o<<9|o>>>23,o=K+k|0,T^=o<<13|o>>>19,o=T+K|0,Y^=o<<18|o>>>14,o=z+R|0,L^=o<<7|o>>>25,o=L+z|0,C^=o<<9|o>>>23,o=C+L|0,R^=o<<13|o>>>19,o=R+C|0,z^=o<<18|o>>>14;r[0]=_>>>0&255,r[1]=_>>>8&255,r[2]=_>>>16&255,r[3]=_>>>24&255,r[4]=m>>>0&255,r[5]=m>>>8&255,r[6]=m>>>16&255,r[7]=m>>>24&255,r[8]=Y>>>0&255,r[9]=Y>>>8&255,r[10]=Y>>>16&255,r[11]=Y>>>24&255,r[12]=z>>>0&255,r[13]=z>>>8&255,r[14]=z>>>16&255,r[15]=z>>>24&255,r[16]=B>>>0&255,r[17]=B>>>8&255,r[18]=B>>>16&255,r[19]=B>>>24&255,r[20]=S>>>0&255,r[21]=S>>>8&255,r[22]=S>>>16&255,r[23]=S>>>24&255,r[24]=K>>>0&255,r[25]=K>>>8&255,r[26]=K>>>16&255,r[27]=K>>>24&255,r[28]=T>>>0&255,r[29]=T>>>8&255,r[30]=T>>>16&255,r[31]=T>>>24&255}function a(r,t,n,e){i(r,t,n,e)}function f(r,t,n,e){h(r,t,n,e)}function s(r,t,n,e,o,i,h){var f,s,u=new Uint8Array(16),c=new Uint8Array(64);for(s=0;16>s;s++)u[s]=0;for(s=0;8>s;s++)u[s]=i[s];for(;o>=64;){for(a(c,u,h,ut),s=0;64>s;s++)r[t+s]=n[e+s]^c[s];for(f=1,s=8;16>s;s++)f=f+(255&u[s])|0,u[s]=255&f,f>>>=8;o-=64,t+=64,e+=64}if(o>0)for(a(c,u,h,ut),s=0;o>s;s++)r[t+s]=n[e+s]^c[s];return 0}function u(r,t,n,e,o){var i,h,f=new Uint8Array(16),s=new Uint8Array(64);for(h=0;16>h;h++)f[h]=0;for(h=0;8>h;h++)f[h]=e[h];for(;n>=64;){for(a(s,f,o,ut),h=0;64>h;h++)r[t+h]=s[h];for(i=1,h=8;16>h;h++)i=i+(255&f[h])|0,f[h]=255&i,i>>>=8;n-=64,t+=64}if(n>0)for(a(s,f,o,ut),h=0;n>h;h++)r[t+h]=s[h];return 0}function c(r,t,n,e,o){var i=new Uint8Array(32);f(i,e,o,ut);for(var h=new Uint8Array(8),a=0;8>a;a++)h[a]=e[a+16];return u(r,t,n,h,i)}function y(r,t,n,e,o,i,h){var a=new Uint8Array(32);f(a,i,h,ut);for(var u=new Uint8Array(8),c=0;8>c;c++)u[c]=i[c+16];return s(r,t,n,e,o,u,a)}function l(r,t,n,e,o,i){var h=new ct(i);return h.update(n,e,o),h.finish(r,t),0}function w(r,t,n,o,i,h){var a=new Uint8Array(16);return l(a,0,n,o,i,h),e(r,t,a,0)}function p(r,t,n,e,o){var i;if(32>n)return-1;for(y(r,0,t,0,n,e,o),l(r,16,r,32,n-32,r),i=0;16>i;i++)r[i]=0;return 0}function g(r,t,n,e,o){var i,h=new Uint8Array(32);if(32>n)return-1;if(c(h,0,32,e,o),0!==w(t,16,t,32,n-32,h))return-1;for(y(r,0,t,0,n,e,o),i=0;32>i;i++)r[i]=0;return 0}function v(r,t){var n;for(n=0;16>n;n++)r[n]=0|t[n]}function b(r){var t,n,e=1;for(t=0;16>t;t++)n=r[t]+e+65535,e=Math.floor(n/65536),r[t]=n-65536*e;r[0]+=e-1+37*(e-1)}function d(r,t,n){for(var e,o=~(n-1),i=0;16>i;i++)e=o&(r[i]^t[i]),r[i]^=e,t[i]^=e}function A(r,t){var n,e,o,i=W(),h=W();for(n=0;16>n;n++)h[n]=t[n];for(b(h),b(h),b(h),e=0;2>e;e++){for(i[0]=h[0]-65517,n=1;15>n;n++)i[n]=h[n]-65535-(i[n-1]>>16&1),i[n-1]&=65535;i[15]=h[15]-32767-(i[14]>>16&1),o=i[15]>>16&1,i[14]&=65535,d(h,i,1-o)}for(n=0;16>n;n++)r[2*n]=255&h[n],r[2*n+1]=h[n]>>8}function _(r,t){var n=new Uint8Array(32),e=new Uint8Array(32);return A(n,r),A(e,t),o(n,0,e,0)}function U(r){var t=new Uint8Array(32);return A(t,r),1&t[0]}function E(r,t){var n;for(n=0;16>n;n++)r[n]=t[2*n]+(t[2*n+1]<<8);r[15]&=32767}function x(r,t,n){for(var e=0;16>e;e++)r[e]=t[e]+n[e]}function M(r,t,n){for(var e=0;16>e;e++)r[e]=t[e]-n[e]}function m(r,t,n){var e,o,i=0,h=0,a=0,f=0,s=0,u=0,c=0,y=0,l=0,w=0,p=0,g=0,v=0,b=0,d=0,A=0,_=0,U=0,E=0,x=0,M=0,m=0,B=0,S=0,K=0,T=0,Y=0,k=0,L=0,C=0,R=0,z=n[0],P=n[1],N=n[2],O=n[3],F=n[4],I=n[5],G=n[6],Z=n[7],j=n[8],V=n[9],q=n[10],X=n[11],D=n[12],H=n[13],J=n[14],Q=n[15];e=t[0],i+=e*z,h+=e*P,a+=e*N,f+=e*O,s+=e*F,u+=e*I,c+=e*G,y+=e*Z,l+=e*j,w+=e*V,p+=e*q,g+=e*X,v+=e*D,b+=e*H,d+=e*J,A+=e*Q,e=t[1],h+=e*z,a+=e*P,f+=e*N,s+=e*O,u+=e*F,c+=e*I,y+=e*G,l+=e*Z,w+=e*j,p+=e*V,g+=e*q,v+=e*X,b+=e*D,d+=e*H,A+=e*J,_+=e*Q,e=t[2],a+=e*z,f+=e*P,s+=e*N,u+=e*O,c+=e*F,y+=e*I,l+=e*G,w+=e*Z,p+=e*j,g+=e*V,v+=e*q,b+=e*X,d+=e*D,A+=e*H,_+=e*J,U+=e*Q,e=t[3],f+=e*z,s+=e*P,u+=e*N,c+=e*O,y+=e*F,l+=e*I,w+=e*G,p+=e*Z,g+=e*j,v+=e*V,b+=e*q,d+=e*X,A+=e*D,_+=e*H,U+=e*J,E+=e*Q,e=t[4],s+=e*z,u+=e*P,c+=e*N,y+=e*O,l+=e*F,w+=e*I,p+=e*G,g+=e*Z,v+=e*j,b+=e*V,d+=e*q,A+=e*X,_+=e*D,U+=e*H,E+=e*J,x+=e*Q,e=t[5],u+=e*z,c+=e*P,y+=e*N,l+=e*O,w+=e*F,p+=e*I,g+=e*G,v+=e*Z,b+=e*j,d+=e*V,A+=e*q,_+=e*X,U+=e*D,E+=e*H,x+=e*J,M+=e*Q,e=t[6],c+=e*z,y+=e*P,l+=e*N,w+=e*O,p+=e*F,g+=e*I,v+=e*G,b+=e*Z,d+=e*j,A+=e*V,_+=e*q,U+=e*X,E+=e*D,x+=e*H,M+=e*J,m+=e*Q,e=t[7],y+=e*z,l+=e*P,w+=e*N,p+=e*O,g+=e*F,v+=e*I,b+=e*G,d+=e*Z,A+=e*j,_+=e*V,U+=e*q,E+=e*X,x+=e*D,M+=e*H,m+=e*J,B+=e*Q,e=t[8],l+=e*z,w+=e*P,p+=e*N,g+=e*O,v+=e*F,b+=e*I,d+=e*G,A+=e*Z,_+=e*j,U+=e*V,E+=e*q,x+=e*X,M+=e*D,m+=e*H,B+=e*J,S+=e*Q,e=t[9],w+=e*z,p+=e*P,g+=e*N,v+=e*O,b+=e*F,d+=e*I,A+=e*G,_+=e*Z,U+=e*j,E+=e*V,x+=e*q,M+=e*X,m+=e*D,B+=e*H,S+=e*J,K+=e*Q,e=t[10],p+=e*z,g+=e*P,v+=e*N,b+=e*O,d+=e*F,A+=e*I,_+=e*G,U+=e*Z,E+=e*j,x+=e*V,M+=e*q,m+=e*X,B+=e*D,S+=e*H,K+=e*J,T+=e*Q,e=t[11],g+=e*z,v+=e*P,b+=e*N,d+=e*O,A+=e*F,_+=e*I,U+=e*G,E+=e*Z,x+=e*j,M+=e*V,m+=e*q,B+=e*X,S+=e*D,K+=e*H,T+=e*J,Y+=e*Q,e=t[12],v+=e*z,b+=e*P,d+=e*N,A+=e*O,_+=e*F,U+=e*I,E+=e*G,x+=e*Z,M+=e*j,m+=e*V,B+=e*q,S+=e*X,K+=e*D,T+=e*H,Y+=e*J,k+=e*Q,e=t[13],b+=e*z,d+=e*P,A+=e*N,_+=e*O,U+=e*F,E+=e*I,x+=e*G,M+=e*Z,m+=e*j,B+=e*V,S+=e*q,K+=e*X,T+=e*D,Y+=e*H,k+=e*J,L+=e*Q,e=t[14],d+=e*z,A+=e*P,_+=e*N,U+=e*O,E+=e*F,x+=e*I,M+=e*G,m+=e*Z,B+=e*j,S+=e*V,K+=e*q,T+=e*X,Y+=e*D,k+=e*H,L+=e*J,C+=e*Q,e=t[15],A+=e*z,_+=e*P,U+=e*N,E+=e*O,x+=e*F,M+=e*I,m+=e*G,B+=e*Z,S+=e*j,K+=e*V,T+=e*q,Y+=e*X,k+=e*D,L+=e*H,C+=e*J,R+=e*Q,i+=38*_,h+=38*U,a+=38*E,f+=38*x,s+=38*M,u+=38*m,c+=38*B,y+=38*S,l+=38*K,w+=38*T,p+=38*Y,g+=38*k,v+=38*L,b+=38*C,d+=38*R,o=1,e=i+o+65535,o=Math.floor(e/65536),i=e-65536*o,e=h+o+65535,o=Math.floor(e/65536),h=e-65536*o,e=a+o+65535,o=Math.floor(e/65536),a=e-65536*o,e=f+o+65535,o=Math.floor(e/65536),f=e-65536*o,e=s+o+65535,o=Math.floor(e/65536),s=e-65536*o,e=u+o+65535,o=Math.floor(e/65536),u=e-65536*o,e=c+o+65535,o=Math.floor(e/65536),c=e-65536*o,e=y+o+65535,o=Math.floor(e/65536),y=e-65536*o,e=l+o+65535,o=Math.floor(e/65536),l=e-65536*o,e=w+o+65535,o=Math.floor(e/65536),w=e-65536*o,e=p+o+65535,o=Math.floor(e/65536),p=e-65536*o,e=g+o+65535,o=Math.floor(e/65536),g=e-65536*o,e=v+o+65535,o=Math.floor(e/65536),v=e-65536*o,e=b+o+65535,o=Math.floor(e/65536),b=e-65536*o,e=d+o+65535,o=Math.floor(e/65536),d=e-65536*o,e=A+o+65535,o=Math.floor(e/65536),A=e-65536*o,i+=o-1+37*(o-1),o=1,e=i+o+65535,o=Math.floor(e/65536),i=e-65536*o,e=h+o+65535,o=Math.floor(e/65536),h=e-65536*o,e=a+o+65535,o=Math.floor(e/65536),a=e-65536*o,e=f+o+65535,o=Math.floor(e/65536),f=e-65536*o,e=s+o+65535,o=Math.floor(e/65536),s=e-65536*o,e=u+o+65535,o=Math.floor(e/65536),u=e-65536*o,e=c+o+65535,o=Math.floor(e/65536),c=e-65536*o,e=y+o+65535,o=Math.floor(e/65536),y=e-65536*o,e=l+o+65535,o=Math.floor(e/65536),l=e-65536*o,e=w+o+65535,o=Math.floor(e/65536),w=e-65536*o,e=p+o+65535,o=Math.floor(e/65536),p=e-65536*o,e=g+o+65535,o=Math.floor(e/65536),g=e-65536*o,e=v+o+65535,o=Math.floor(e/65536),v=e-65536*o,e=b+o+65535,o=Math.floor(e/65536),b=e-65536*o,e=d+o+65535,o=Math.floor(e/65536),d=e-65536*o,e=A+o+65535,o=Math.floor(e/65536),A=e-65536*o,i+=o-1+37*(o-1),r[0]=i,r[1]=h,r[2]=a,r[3]=f,r[4]=s,r[5]=u,r[6]=c,r[7]=y,r[8]=l,r[9]=w,r[10]=p,r[11]=g,r[12]=v,r[13]=b,r[14]=d,r[15]=A}function B(r,t){m(r,t,t)}function S(r,t){var n,e=W();for(n=0;16>n;n++)e[n]=t[n];for(n=253;n>=0;n--)B(e,e),2!==n&&4!==n&&m(e,e,t);for(n=0;16>n;n++)r[n]=e[n]}function K(r,t){var n,e=W();for(n=0;16>n;n++)e[n]=t[n];for(n=250;n>=0;n--)B(e,e),1!==n&&m(e,e,t);for(n=0;16>n;n++)r[n]=e[n]}function T(r,t,n){var e,o,i=new Uint8Array(32),h=new Float64Array(80),a=W(),f=W(),s=W(),u=W(),c=W(),y=W();for(o=0;31>o;o++)i[o]=t[o];for(i[31]=127&t[31]|64,i[0]&=248,E(h,n),o=0;16>o;o++)f[o]=h[o],u[o]=a[o]=s[o]=0;for(a[0]=u[0]=1,o=254;o>=0;--o)e=i[o>>>3]>>>(7&o)&1,d(a,f,e),d(s,u,e),x(c,a,s),M(a,a,s),x(s,f,u),M(f,f,u),B(u,c),B(y,a),m(a,s,a),m(s,f,c),x(c,a,s),M(a,a,s),B(f,a),M(s,u,y),m(a,s,ot),x(a,a,u),m(s,s,a),m(a,u,y),m(u,f,h),B(f,c),d(a,f,e),d(s,u,e);for(o=0;16>o;o++)h[o+16]=a[o],h[o+32]=s[o],h[o+48]=f[o],h[o+64]=u[o];var l=h.subarray(32),w=h.subarray(16);return S(l,l),m(w,w,l),A(r,w),0}function Y(r,t){return T(r,t,tt)}function k(r,t){return $(t,32),Y(r,t)}function L(r,t,n){var e=new Uint8Array(32);return T(e,n,t),f(r,rt,e,ut)}function C(r,t,n,e,o,i){var h=new Uint8Array(32);return L(h,o,i),yt(r,t,n,e,h)}function R(r,t,n,e,o,i){var h=new Uint8Array(32);return L(h,o,i),lt(r,t,n,e,h)}function z(r,t,n,e){for(var o,i,h,a,f,s,u,c,y,l,w,p,g,v,b,d,A,_,U,E,x,M,m,B,S,K,T=new Int32Array(16),Y=new Int32Array(16),k=r[0],L=r[1],C=r[2],R=r[3],z=r[4],P=r[5],N=r[6],O=r[7],F=t[0],I=t[1],G=t[2],Z=t[3],j=t[4],V=t[5],q=t[6],X=t[7],D=0;e>=128;){for(U=0;16>U;U++)E=8*U+D,T[U]=n[E+0]<<24|n[E+1]<<16|n[E+2]<<8|n[E+3],Y[U]=n[E+4]<<24|n[E+5]<<16|n[E+6]<<8|n[E+7];for(U=0;80>U;U++)if(o=k,i=L,h=C,a=R,f=z,s=P,u=N,c=O,y=F,l=I,w=G,p=Z,g=j,v=V,b=q,d=X,x=O,M=X,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=(z>>>14|j<<18)^(z>>>18|j<<14)^(j>>>9|z<<23),M=(j>>>14|z<<18)^(j>>>18|z<<14)^(z>>>9|j<<23),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=z&P^~z&N,M=j&V^~j&q,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=wt[2*U],M=wt[2*U+1],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=T[U%16],M=Y[U%16],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,A=65535&S|K<<16,_=65535&m|B<<16,x=A,M=_,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=(k>>>28|F<<4)^(F>>>2|k<<30)^(F>>>7|k<<25),M=(F>>>28|k<<4)^(k>>>2|F<<30)^(k>>>7|F<<25),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=k&L^k&C^L&C,M=F&I^F&G^I&G,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,c=65535&S|K<<16,d=65535&m|B<<16,x=a,M=p,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=A,M=_,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,a=65535&S|K<<16,p=65535&m|B<<16,L=o,C=i,R=h,z=a,P=f,N=s,O=u,k=c,I=y,G=l,Z=w,j=p,V=g,q=v,X=b,F=d,U%16===15)for(E=0;16>E;E++)x=T[E],M=Y[E],m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=T[(E+9)%16],M=Y[(E+9)%16],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,A=T[(E+1)%16],_=Y[(E+1)%16],x=(A>>>1|_<<31)^(A>>>8|_<<24)^A>>>7,M=(_>>>1|A<<31)^(_>>>8|A<<24)^(_>>>7|A<<25),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,A=T[(E+14)%16],_=Y[(E+14)%16],x=(A>>>19|_<<13)^(_>>>29|A<<3)^A>>>6,M=(_>>>19|A<<13)^(A>>>29|_<<3)^(_>>>6|A<<26),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,T[E]=65535&S|K<<16,Y[E]=65535&m|B<<16;x=k,M=F,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[0],M=t[0],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[0]=k=65535&S|K<<16,t[0]=F=65535&m|B<<16,x=L,M=I,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[1],M=t[1],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[1]=L=65535&S|K<<16,t[1]=I=65535&m|B<<16,x=C,M=G,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[2],M=t[2],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[2]=C=65535&S|K<<16,t[2]=G=65535&m|B<<16,x=R,M=Z,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[3],M=t[3],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[3]=R=65535&S|K<<16,t[3]=Z=65535&m|B<<16,x=z,M=j,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[4],M=t[4],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[4]=z=65535&S|K<<16,t[4]=j=65535&m|B<<16,x=P,M=V,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[5],M=t[5],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[5]=P=65535&S|K<<16,t[5]=V=65535&m|B<<16,x=N,M=q,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[6],M=t[6],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[6]=N=65535&S|K<<16,t[6]=q=65535&m|B<<16,x=O,M=X,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[7],M=t[7],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[7]=O=65535&S|K<<16,t[7]=X=65535&m|B<<16,D+=128,e-=128}return e}function P(r,n,e){var o,i=new Int32Array(8),h=new Int32Array(8),a=new Uint8Array(256),f=e;for(i[0]=1779033703,i[1]=3144134277,i[2]=1013904242,i[3]=2773480762,i[4]=1359893119,i[5]=2600822924,i[6]=528734635,i[7]=1541459225,h[0]=4089235720,h[1]=2227873595,h[2]=4271175723,h[3]=1595750129,h[4]=2917565137,h[5]=725511199,h[6]=4215389547,h[7]=327033209,z(i,h,n,e),e%=128,o=0;e>o;o++)a[o]=n[f-e+o];for(a[e]=128,e=256-128*(112>e?1:0),a[e-9]=0,t(a,e-8,f/536870912|0,f<<3),z(i,h,a,e),o=0;8>o;o++)t(r,8*o,i[o],h[o]);return 0}function N(r,t){var n=W(),e=W(),o=W(),i=W(),h=W(),a=W(),f=W(),s=W(),u=W();M(n,r[1],r[0]),M(u,t[1],t[0]),m(n,n,u),x(e,r[0],r[1]),x(u,t[0],t[1]),m(e,e,u),m(o,r[3],t[3]),m(o,o,ht),m(i,r[2],t[2]),x(i,i,i),M(h,e,n),M(a,i,o),x(f,i,o),x(s,e,n),m(r[0],h,a),m(r[1],s,f),m(r[2],f,a),m(r[3],h,s)}function O(r,t,n){var e;for(e=0;4>e;e++)d(r[e],t[e],n)}function F(r,t){var n=W(),e=W(),o=W();S(o,t[2]),m(n,t[0],o),m(e,t[1],o),A(r,e),r[31]^=U(n)<<7}function I(r,t,n){var e,o;for(v(r[0],nt),v(r[1],et),v(r[2],et),v(r[3],nt),o=255;o>=0;--o)e=n[o/8|0]>>(7&o)&1,O(r,t,e),N(t,r),N(r,r),O(r,t,e)}function G(r,t){var n=[W(),W(),W(),W()];v(n[0],at),v(n[1],ft),v(n[2],et),m(n[3],at,ft),I(r,n,t)}function Z(r,t,n){var e,o=new Uint8Array(64),i=[W(),W(),W(),W()];for(n||$(t,32),P(o,t,32),o[0]&=248,o[31]&=127,o[31]|=64,G(i,o),F(r,i),e=0;32>e;e++)t[e+32]=r[e];return 0}function j(r,t){var n,e,o,i;for(e=63;e>=32;--e){for(n=0,o=e-32,i=e-12;i>o;++o)t[o]+=n-16*t[e]*pt[o-(e-32)],n=t[o]+128>>8,t[o]-=256*n;t[o]+=n,t[e]=0}for(n=0,o=0;32>o;o++)t[o]+=n-(t[31]>>4)*pt[o],n=t[o]>>8,t[o]&=255;for(o=0;32>o;o++)t[o]-=n*pt[o];for(e=0;32>e;e++)t[e+1]+=t[e]>>8,r[e]=255&t[e]}function V(r){var t,n=new Float64Array(64);for(t=0;64>t;t++)n[t]=r[t];for(t=0;64>t;t++)r[t]=0;j(r,n)}function q(r,t,n,e){var o,i,h=new Uint8Array(64),a=new Uint8Array(64),f=new Uint8Array(64),s=new Float64Array(64),u=[W(),W(),W(),W()];P(h,e,32),h[0]&=248,h[31]&=127,h[31]|=64;var c=n+64;for(o=0;n>o;o++)r[64+o]=t[o];for(o=0;32>o;o++)r[32+o]=h[32+o];for(P(f,r.subarray(32),n+32),V(f),G(u,f),F(r,u),o=32;64>o;o++)r[o]=e[o];for(P(a,r,n+64),V(a),o=0;64>o;o++)s[o]=0;for(o=0;32>o;o++)s[o]=f[o];for(o=0;32>o;o++)for(i=0;32>i;i++)s[o+i]+=a[o]*h[i];return j(r.subarray(32),s),c}function X(r,t){var n=W(),e=W(),o=W(),i=W(),h=W(),a=W(),f=W();return v(r[2],et),E(r[1],t),B(o,r[1]),m(i,o,it),M(o,o,r[2]),x(i,r[2],i),B(h,i),B(a,h),m(f,a,h),m(n,f,o),m(n,n,i),K(n,n),m(n,n,o),m(n,n,i),m(n,n,i),m(r[0],n,i),B(e,r[0]),m(e,e,i),_(e,o)&&m(r[0],r[0],st),B(e,r[0]),m(e,e,i),_(e,o)?-1:(U(r[0])===t[31]>>7&&M(r[0],nt,r[0]),m(r[3],r[0],r[1]),0)}function D(r,t,n,e){var i,h,a=new Uint8Array(32),f=new Uint8Array(64),s=[W(),W(),W(),W()],u=[W(),W(),W(),W()];if(h=-1,64>n)return-1;if(X(u,e))return-1;for(i=0;n>i;i++)r[i]=t[i];for(i=0;32>i;i++)r[i+32]=e[i];if(P(f,r,n),V(f),I(s,u,f),G(u,t.subarray(32)),N(s,u),F(a,s),n-=64,o(t,0,a,0)){for(i=0;n>i;i++)r[i]=0;return-1}for(i=0;n>i;i++)r[i]=t[i+64];return h=n}function H(r,t){if(r.length!==gt)throw new Error("bad key size");if(t.length!==vt)throw new Error("bad nonce size")}function J(r,t){if(r.length!==Ut)throw new Error("bad public key size");if(t.length!==Et)throw new Error("bad secret key size")}function Q(){for(var r,t={}.toString,n=0;n>>13|n<<3),e=255&r[4]|(255&r[5])<<8,this.r[2]=7939&(n>>>10|e<<6),o=255&r[6]|(255&r[7])<<8,this.r[3]=8191&(e>>>7|o<<9),i=255&r[8]|(255&r[9])<<8,this.r[4]=255&(o>>>4|i<<12),this.r[5]=i>>>1&8190,h=255&r[10]|(255&r[11])<<8,this.r[6]=8191&(i>>>14|h<<2),a=255&r[12]|(255&r[13])<<8,this.r[7]=8065&(h>>>11|a<<5),f=255&r[14]|(255&r[15])<<8,this.r[8]=8191&(a>>>8|f<<8),this.r[9]=f>>>5&127,this.pad[0]=255&r[16]|(255&r[17])<<8,this.pad[1]=255&r[18]|(255&r[19])<<8,this.pad[2]=255&r[20]|(255&r[21])<<8,this.pad[3]=255&r[22]|(255&r[23])<<8,this.pad[4]=255&r[24]|(255&r[25])<<8,this.pad[5]=255&r[26]|(255&r[27])<<8,this.pad[6]=255&r[28]|(255&r[29])<<8,this.pad[7]=255&r[30]|(255&r[31])<<8};ct.prototype.blocks=function(r,t,n){for(var e,o,i,h,a,f,s,u,c,y,l,w,p,g,v,b,d,A,_,U=this.fin?0:2048,E=this.h[0],x=this.h[1],M=this.h[2],m=this.h[3],B=this.h[4],S=this.h[5],K=this.h[6],T=this.h[7],Y=this.h[8],k=this.h[9],L=this.r[0],C=this.r[1],R=this.r[2],z=this.r[3],P=this.r[4],N=this.r[5],O=this.r[6],F=this.r[7],I=this.r[8],G=this.r[9];n>=16;)e=255&r[t+0]|(255&r[t+1])<<8,E+=8191&e,o=255&r[t+2]|(255&r[t+3])<<8,x+=8191&(e>>>13|o<<3),i=255&r[t+4]|(255&r[t+5])<<8,M+=8191&(o>>>10|i<<6),h=255&r[t+6]|(255&r[t+7])<<8,m+=8191&(i>>>7|h<<9),a=255&r[t+8]|(255&r[t+9])<<8,B+=8191&(h>>>4|a<<12),S+=a>>>1&8191,f=255&r[t+10]|(255&r[t+11])<<8,K+=8191&(a>>>14|f<<2),s=255&r[t+12]|(255&r[t+13])<<8,T+=8191&(f>>>11|s<<5),u=255&r[t+14]|(255&r[t+15])<<8,Y+=8191&(s>>>8|u<<8),k+=u>>>5|U,c=0,y=c,y+=E*L,y+=5*x*G,y+=5*M*I,y+=5*m*F,y+=5*B*O,c=y>>>13,y&=8191,y+=5*S*N,y+=5*K*P,y+=5*T*z,y+=5*Y*R,y+=5*k*C,c+=y>>>13,y&=8191,l=c,l+=E*C,l+=x*L,l+=5*M*G,l+=5*m*I,l+=5*B*F,c=l>>>13,l&=8191,l+=5*S*O,l+=5*K*N,l+=5*T*P,l+=5*Y*z,l+=5*k*R,c+=l>>>13,l&=8191,w=c,w+=E*R,w+=x*C,w+=M*L,w+=5*m*G,w+=5*B*I,c=w>>>13,w&=8191,w+=5*S*F,w+=5*K*O,w+=5*T*N,w+=5*Y*P,w+=5*k*z,c+=w>>>13,w&=8191,p=c,p+=E*z,p+=x*R,p+=M*C,p+=m*L,p+=5*B*G,c=p>>>13,p&=8191,p+=5*S*I,p+=5*K*F,p+=5*T*O,p+=5*Y*N,p+=5*k*P,c+=p>>>13,p&=8191,g=c,g+=E*P,g+=x*z,g+=M*R,g+=m*C,g+=B*L,c=g>>>13,g&=8191,g+=5*S*G,g+=5*K*I,g+=5*T*F,g+=5*Y*O,g+=5*k*N,c+=g>>>13,g&=8191,v=c,v+=E*N,v+=x*P,v+=M*z,v+=m*R,v+=B*C,c=v>>>13,v&=8191,v+=S*L,v+=5*K*G,v+=5*T*I,v+=5*Y*F,v+=5*k*O,c+=v>>>13,v&=8191,b=c,b+=E*O,b+=x*N,b+=M*P,b+=m*z,b+=B*R,c=b>>>13,b&=8191,b+=S*C,b+=K*L,b+=5*T*G,b+=5*Y*I,b+=5*k*F,c+=b>>>13,b&=8191,d=c,d+=E*F,d+=x*O,d+=M*N,d+=m*P,d+=B*z,c=d>>>13,d&=8191,d+=S*R,d+=K*C,d+=T*L,d+=5*Y*G,d+=5*k*I,c+=d>>>13,d&=8191,A=c,A+=E*I,A+=x*F,A+=M*O,A+=m*N,A+=B*P,c=A>>>13,A&=8191,A+=S*z,A+=K*R,A+=T*C,A+=Y*L,A+=5*k*G,c+=A>>>13,A&=8191,_=c,_+=E*G,_+=x*I,_+=M*F,_+=m*O,_+=B*N,c=_>>>13,_&=8191,_+=S*P,_+=K*z,_+=T*R,_+=Y*C,_+=k*L,c+=_>>>13,_&=8191,c=(c<<2)+c|0,c=c+y|0,y=8191&c,c>>>=13,l+=c,E=y,x=l,M=w,m=p,B=g,S=v,K=b,T=d,Y=A,k=_,t+=16,n-=16;this.h[0]=E,this.h[1]=x,this.h[2]=M,this.h[3]=m,this.h[4]=B,this.h[5]=S,this.h[6]=K,this.h[7]=T,this.h[8]=Y,this.h[9]=k},ct.prototype.finish=function(r,t){var n,e,o,i,h=new Uint16Array(10);if(this.leftover){for(i=this.leftover,this.buffer[i++]=1;16>i;i++)this.buffer[i]=0;this.fin=1,this.blocks(this.buffer,0,16)}for(n=this.h[1]>>>13,this.h[1]&=8191,i=2;10>i;i++)this.h[i]+=n,n=this.h[i]>>>13,this.h[i]&=8191;for(this.h[0]+=5*n,n=this.h[0]>>>13,this.h[0]&=8191,this.h[1]+=n,n=this.h[1]>>>13,this.h[1]&=8191,this.h[2]+=n,h[0]=this.h[0]+5,n=h[0]>>>13,h[0]&=8191,i=1;10>i;i++)h[i]=this.h[i]+n,n=h[i]>>>13,h[i]&=8191;for(h[9]-=8192,e=(h[9]>>>15)-1,i=0;10>i;i++)h[i]&=e;for(e=~e,i=0;10>i;i++)this.h[i]=this.h[i]&e|h[i];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,i=1;8>i;i++)o=(this.h[i]+this.pad[i]|0)+(o>>>16)|0,this.h[i]=65535&o;r[t+0]=this.h[0]>>>0&255,r[t+1]=this.h[0]>>>8&255,r[t+2]=this.h[1]>>>0&255,r[t+3]=this.h[1]>>>8&255,r[t+4]=this.h[2]>>>0&255,r[t+5]=this.h[2]>>>8&255,r[t+6]=this.h[3]>>>0&255,r[t+7]=this.h[3]>>>8&255,r[t+8]=this.h[4]>>>0&255,r[t+9]=this.h[4]>>>8&255,r[t+10]=this.h[5]>>>0&255,r[t+11]=this.h[5]>>>8&255,r[t+12]=this.h[6]>>>0&255,r[t+13]=this.h[6]>>>8&255,r[t+14]=this.h[7]>>>0&255,r[t+15]=this.h[7]>>>8&255},ct.prototype.update=function(r,t,n){var e,o;if(this.leftover){for(o=16-this.leftover,o>n&&(o=n),e=0;o>e;e++)this.buffer[this.leftover+e]=r[t+e];if(n-=o,t+=o,this.leftover+=o,this.leftover<16)return;this.blocks(buffer,0,16),this.leftover=0}if(n>=16&&(o=n-n%16,this.blocks(r,t,o),t+=o,n-=o),n){for(e=0;n>e;e++)this.buffer[this.leftover+e]=r[t+e];this.leftover+=n}};var yt=p,lt=g,wt=[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],pt=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]),gt=32,vt=24,bt=32,dt=16,At=32,_t=32,Ut=32,Et=32,xt=32,Mt=vt,mt=bt,Bt=dt,St=64,Kt=32,Tt=64,Yt=32,kt=64;r.lowlevel={crypto_core_hsalsa20:f,crypto_stream_xor:y,crypto_stream:c,crypto_stream_salsa20_xor:s,crypto_stream_salsa20:u,crypto_onetimeauth:l,crypto_onetimeauth_verify:w,crypto_verify_16:e,crypto_verify_32:o,crypto_secretbox:p,crypto_secretbox_open:g,crypto_scalarmult:T,crypto_scalarmult_base:Y,crypto_box_beforenm:L,crypto_box_afternm:yt,crypto_box:C,crypto_box_open:R,crypto_box_keypair:k,crypto_hash:P,crypto_sign:q,crypto_sign_keypair:Z,crypto_sign_open:D,crypto_secretbox_KEYBYTES:gt,crypto_secretbox_NONCEBYTES:vt,crypto_secretbox_ZEROBYTES:bt,crypto_secretbox_BOXZEROBYTES:dt,crypto_scalarmult_BYTES:At,crypto_scalarmult_SCALARBYTES:_t,crypto_box_PUBLICKEYBYTES:Ut,crypto_box_SECRETKEYBYTES:Et,crypto_box_BEFORENMBYTES:xt,crypto_box_NONCEBYTES:Mt,crypto_box_ZEROBYTES:mt,crypto_box_BOXZEROBYTES:Bt,crypto_sign_BYTES:St,crypto_sign_PUBLICKEYBYTES:Kt,crypto_sign_SECRETKEYBYTES:Tt,crypto_sign_SEEDBYTES:Yt,crypto_hash_BYTES:kt},r.util={},r.util.decodeUTF8=function(r){var t,n=unescape(encodeURIComponent(r)),e=new Uint8Array(n.length);for(t=0;tt;t++)n.push(String.fromCharCode(r[t]));return btoa(n.join(""))},r.util.decodeBase64=function(r){if("undefined"==typeof atob)return new Uint8Array(Array.prototype.slice.call(new Buffer(r,"base64"),0));var t,n=atob(r),e=new Uint8Array(n.length);for(t=0;te)return null;for(var o=new Uint8Array(e),i=0;ie;e++)o[e]=t[e];for(e=0;e=0},r.sign.keyPair=function(){var r=new Uint8Array(Kt),t=new Uint8Array(Tt);return Z(r,t),{publicKey:r,secretKey:t}},r.sign.keyPair.fromSecretKey=function(r){if(Q(r),r.length!==Tt)throw new Error("bad secret key size");for(var t=new Uint8Array(Kt),n=0;ne;e++)n[e]=r[e];return Z(t,n,!0),{publicKey:t,secretKey:n}},r.sign.publicKeyLength=Kt,r.sign.secretKeyLength=Tt,r.sign.seedLength=Yt,r.sign.signatureLength=St,r.hash=function(r){Q(r);var t=new Uint8Array(kt);return P(t,r,r.length),t},r.hash.hashLength=kt,r.verify=function(r,t){return Q(r,t),0===r.length||0===t.length?!1:r.length!==t.length?!1:0===n(r,0,t,0,r.length)?!0:!1},r.setPRNG=function(r){$=r},function(){var t;"undefined"!=typeof window?(window.crypto&&window.crypto.getRandomValues?t=window.crypto:window.msCrypto&&window.msCrypto.getRandomValues&&(t=window.msCrypto),t&&r.setPRNG(function(r,n){var e,o=new Uint8Array(n);for(t.getRandomValues(o),e=0;n>e;e++)r[e]=o[e]})):"undefined"!=typeof require&&(t=require("crypto"),t&&r.setPRNG(function(r,n){var e,o=t.randomBytes(n);for(e=0;n>e;e++)r[e]=o[e]}))}()}("undefined"!=typeof module&&module.exports?module.exports:window.nacl=window.nacl||{}); \ No newline at end of file diff --git a/src/tweetnacl/nacl.js b/src/tweetnacl/nacl.js deleted file mode 100644 index 22c2dc6fc..000000000 --- a/src/tweetnacl/nacl.js +++ /dev/null @@ -1,1201 +0,0 @@ -(function(nacl) { -'use strict'; - -// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri. -// Public domain. -// -// Implementation derived from TweetNaCl version 20140427. -// See for details: http://tweetnacl.cr.yp.to/ - -/* jshint newcap: false */ - -var u64 = function (h, l) { this.hi = h|0 >>> 0; this.lo = l|0 >>> 0; }; -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; -}; - -// Pluggable, initialized in high-level API below. -var randombytes = function(/* x, n */) { 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([0xdb41, 1]), - D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]), - D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]), - X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]), - Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]), - I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]); - -function L32(x, c) { return (x << c) | (x >>> (32 - c)); } - -function ld32(x, i) { - var u = x[i+3] & 0xff; - u = (u<<8)|(x[i+2] & 0xff); - u = (u<<8)|(x[i+1] & 0xff); - return (u<<8)|(x[i+0] & 0xff); -} - -function dl64(x, i) { - var h = (x[i] << 24) | (x[i+1] << 16) | (x[i+2] << 8) | x[i+3]; - var l = (x[i+4] << 24) | (x[i+5] << 16) | (x[i+6] << 8) | x[i+7]; - return new u64(h, l); -} - -function st32(x, j, u) { - var i; - for (i = 0; i < 4; i++) { x[j+i] = u & 255; u >>>= 8; } -} - -function ts64(x, i, u) { - x[i] = (u.hi >> 24) & 0xff; - x[i+1] = (u.hi >> 16) & 0xff; - x[i+2] = (u.hi >> 8) & 0xff; - x[i+3] = u.hi & 0xff; - x[i+4] = (u.lo >> 24) & 0xff; - x[i+5] = (u.lo >> 16) & 0xff; - x[i+6] = (u.lo >> 8) & 0xff; - x[i+7] = u.lo & 0xff; -} - -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(out,inp,k,c,h) { - var w = new Uint32Array(16), x = new Uint32Array(16), - y = new Uint32Array(16), t = new Uint32Array(4); - var i, j, m; - - for (i = 0; i < 4; i++) { - x[5*i] = ld32(c, 4*i); - x[1+i] = ld32(k, 4*i); - x[6+i] = ld32(inp, 4*i); - x[11+i] = ld32(k, 16+4*i); - } - - for (i = 0; i < 16; i++) y[i] = x[i]; - - for (i = 0; i < 20; i++) { - for (j = 0; j < 4; j++) { - for (m = 0; m < 4; m++) t[m] = x[(5*j+4*m)%16]; - t[1] ^= L32((t[0]+t[3])|0, 7); - t[2] ^= L32((t[1]+t[0])|0, 9); - t[3] ^= L32((t[2]+t[1])|0,13); - t[0] ^= L32((t[3]+t[2])|0,18); - for (m = 0; m < 4; m++) w[4*j+(j+m)%4] = t[m]; - } - for (m = 0; m < 16; m++) x[m] = w[m]; - } - - if (h) { - for (i = 0; i < 16; i++) x[i] = (x[i] + y[i]) | 0; - for (i = 0; i < 4; i++) { - x[5*i] = (x[5*i] - ld32(c, 4*i)) | 0; - x[6+i] = (x[6+i] - ld32(inp, 4*i)) | 0; - } - for (i = 0; i < 4; i++) { - st32(out,4*i,x[5*i]); - st32(out,16+4*i,x[6+i]); - } - } else { - for (i = 0; i < 16; i++) st32(out, 4 * i, (x[i] + y[i]) | 0); - } -} - -function crypto_core_salsa20(out,inp,k,c) { - core(out,inp,k,c,false); - return 0; -} - -function crypto_core_hsalsa20(out,inp,k,c) { - core(out,inp,k,c,true); - return 0; -} - -var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]); - // "expand 32-byte k" - -function crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) { - var z = new Uint8Array(16), x = new Uint8Array(64); - var u, i; - if (!b) return 0; - 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?m[mpos+i]:0) ^ x[i]; - u = 1; - for (i = 8; i < 16; i++) { - u = u + (z[i] & 0xff) | 0; - z[i] = u & 0xff; - u >>>= 8; - } - b -= 64; - cpos += 64; - if (m) mpos += 64; - } - if (b > 0) { - crypto_core_salsa20(x,z,k,sigma); - for (i = 0; i < b; i++) c[cpos+i] = (m?m[mpos+i]:0) ^ x[i]; - } - return 0; -} - -function crypto_stream_salsa20(c,cpos,d,n,k) { - return crypto_stream_salsa20_xor(c,cpos,null,0,d,n,k); -} - -function crypto_stream(c,cpos,d,n,k) { - var s = new Uint8Array(32); - crypto_core_hsalsa20(s,n,k,sigma); - return crypto_stream_salsa20(c,cpos,d,n.subarray(16),s); -} - -function crypto_stream_xor(c,cpos,m,mpos,d,n,k) { - var s = new Uint8Array(32); - crypto_core_hsalsa20(s,n,k,sigma); - return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,n.subarray(16),s); -} - -function add1305(h, c) { - var j, u = 0; - for (j = 0; j < 17; j++) { - u = (u + ((h[j] + c[j]) | 0)) | 0; - h[j] = u & 255; - u >>>= 8; - } -} - -var minusp = new Uint32Array([ - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252 -]); - -function crypto_onetimeauth(out, outpos, m, mpos, n, k) { - var s, i, j, u; - var x = new Uint32Array(17), r = new Uint32Array(17), - h = new Uint32Array(17), c = new Uint32Array(17), - g = new Uint32Array(17); - for (j = 0; j < 17; j++) r[j]=h[j]=0; - for (j = 0; j < 16; j++) r[j]=k[j]; - r[3]&=15; - r[4]&=252; - r[7]&=15; - r[8]&=252; - r[11]&=15; - r[12]&=252; - r[15]&=15; - - while (n > 0) { - for (j = 0; j < 17; j++) c[j] = 0; - for (j = 0;(j < 16) && (j < n);++j) c[j] = m[mpos+j]; - c[j] = 1; - mpos += j; n -= j; - add1305(h,c); - for (i = 0; i < 17; i++) { - x[i] = 0; - for (j = 0; j < 17; j++) x[i] = (x[i] + (h[j] * ((j <= i) ? r[i - j] : ((320 * r[i + 17 - j])|0))) | 0) | 0; - } - for (i = 0; i < 17; i++) h[i] = x[i]; - u = 0; - for (j = 0; j < 16; j++) { - u = (u + h[j]) | 0; - h[j] = u & 255; - u >>>= 8; - } - u = (u + h[16]) | 0; h[16] = u & 3; - u = (5 * (u >>> 2)) | 0; - for (j = 0; j < 16; j++) { - u = (u + h[j]) | 0; - h[j] = u & 255; - u >>>= 8; - } - u = (u + h[16]) | 0; h[16] = u; - } - - for (j = 0; j < 17; j++) g[j] = h[j]; - add1305(h,minusp); - s = (-(h[16] >>> 7) | 0); - for (j = 0; j < 17; j++) h[j] ^= s & (g[j] ^ h[j]); - - for (j = 0; j < 16; j++) c[j] = k[j + 16]; - c[16] = 0; - add1305(h,c); - for (j = 0; j < 16; j++) out[outpos+j] = h[j]; - 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 c; - var i; - for (i = 0; i < 16; i++) { - o[i] += 65536; - c = Math.floor(o[i] / 65536); - o[(i+1)*(i<15?1:0)] += c - 1 + 37 * (c-1) * (i===15?1:0); - o[i] -= (c * 65536); - } -} - -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] - 0xffed; - for (i = 1; i < 15; i++) { - m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1); - m[i-1] &= 0xffff; - } - m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1); - b = (m[15]>>16) & 1; - m[14] &= 0xffff; - sel25519(t, m, 1-b); - } - for (i = 0; i < 16; i++) { - o[2*i] = t[i] & 0xff; - 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] &= 0x7fff; -} - -function A(o, a, b) { - var i; - for (i = 0; i < 16; i++) o[i] = (a[i] + b[i])|0; -} - -function Z(o, a, b) { - var i; - for (i = 0; i < 16; i++) o[i] = (a[i] - b[i])|0; -} - -function M(o, a, b) { - var i, j, t = new Float64Array(31); - for (i = 0; i < 31; i++) t[i] = 0; - for (i = 0; i < 16; i++) { - for (j = 0; j < 16; j++) { - t[i+j] += a[i] * b[j]; - } - } - for (i = 0; i < 15; i++) { - t[i] += 38 * t[i+16]; - } - for (i = 0; i < 16; i++) o[i] = t[i]; - car25519(o); - car25519(o); -} - -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); -} - -function add64() { - var a = 0, b = 0, c = 0, d = 0, m16 = 65535, l, h, i; - for (i = 0; i < arguments.length; i++) { - l = arguments[i].lo; - h = arguments[i].hi; - a += (l & m16); b += (l >>> 16); - c += (h & m16); d += (h >>> 16); - } - - b += (a >>> 16); - c += (b >>> 16); - d += (c >>> 16); - - return new u64((c & m16) | (d << 16), (a & m16) | (b << 16)); -} - -function shr64(x, c) { - return new u64((x.hi >>> c), (x.lo >>> c) | (x.hi << (32 - c))); -} - -function xor64() { - var l = 0, h = 0, i; - for (i = 0; i < arguments.length; i++) { - l ^= arguments[i].lo; - h ^= arguments[i].hi; - } - return new u64(h, l); -} - -function R(x, c) { - var h, l, c1 = 32 - c; - if (c < 32) { - h = (x.hi >>> c) | (x.lo << c1); - l = (x.lo >>> c) | (x.hi << c1); - } else if (c < 64) { - h = (x.lo >>> c) | (x.hi << c1); - l = (x.hi >>> c) | (x.lo << c1); - } - return new u64(h, l); -} - -function Ch(x, y, z) { - var h = (x.hi & y.hi) ^ (~x.hi & z.hi), - l = (x.lo & y.lo) ^ (~x.lo & z.lo); - return new u64(h, l); -} - -function Maj(x, y, z) { - var h = (x.hi & y.hi) ^ (x.hi & z.hi) ^ (y.hi & z.hi), - l = (x.lo & y.lo) ^ (x.lo & z.lo) ^ (y.lo & z.lo); - return new u64(h, l); -} - -function Sigma0(x) { return xor64(R(x,28), R(x,34), R(x,39)); } -function Sigma1(x) { return xor64(R(x,14), R(x,18), R(x,41)); } -function sigma0(x) { return xor64(R(x, 1), R(x, 8), shr64(x,7)); } -function sigma1(x) { return xor64(R(x,19), R(x,61), shr64(x,6)); } - -var K = [ - new u64(0x428a2f98, 0xd728ae22), new u64(0x71374491, 0x23ef65cd), - new u64(0xb5c0fbcf, 0xec4d3b2f), new u64(0xe9b5dba5, 0x8189dbbc), - new u64(0x3956c25b, 0xf348b538), new u64(0x59f111f1, 0xb605d019), - new u64(0x923f82a4, 0xaf194f9b), new u64(0xab1c5ed5, 0xda6d8118), - new u64(0xd807aa98, 0xa3030242), new u64(0x12835b01, 0x45706fbe), - new u64(0x243185be, 0x4ee4b28c), new u64(0x550c7dc3, 0xd5ffb4e2), - new u64(0x72be5d74, 0xf27b896f), new u64(0x80deb1fe, 0x3b1696b1), - new u64(0x9bdc06a7, 0x25c71235), new u64(0xc19bf174, 0xcf692694), - new u64(0xe49b69c1, 0x9ef14ad2), new u64(0xefbe4786, 0x384f25e3), - new u64(0x0fc19dc6, 0x8b8cd5b5), new u64(0x240ca1cc, 0x77ac9c65), - new u64(0x2de92c6f, 0x592b0275), new u64(0x4a7484aa, 0x6ea6e483), - new u64(0x5cb0a9dc, 0xbd41fbd4), new u64(0x76f988da, 0x831153b5), - new u64(0x983e5152, 0xee66dfab), new u64(0xa831c66d, 0x2db43210), - new u64(0xb00327c8, 0x98fb213f), new u64(0xbf597fc7, 0xbeef0ee4), - new u64(0xc6e00bf3, 0x3da88fc2), new u64(0xd5a79147, 0x930aa725), - new u64(0x06ca6351, 0xe003826f), new u64(0x14292967, 0x0a0e6e70), - new u64(0x27b70a85, 0x46d22ffc), new u64(0x2e1b2138, 0x5c26c926), - new u64(0x4d2c6dfc, 0x5ac42aed), new u64(0x53380d13, 0x9d95b3df), - new u64(0x650a7354, 0x8baf63de), new u64(0x766a0abb, 0x3c77b2a8), - new u64(0x81c2c92e, 0x47edaee6), new u64(0x92722c85, 0x1482353b), - new u64(0xa2bfe8a1, 0x4cf10364), new u64(0xa81a664b, 0xbc423001), - new u64(0xc24b8b70, 0xd0f89791), new u64(0xc76c51a3, 0x0654be30), - new u64(0xd192e819, 0xd6ef5218), new u64(0xd6990624, 0x5565a910), - new u64(0xf40e3585, 0x5771202a), new u64(0x106aa070, 0x32bbd1b8), - new u64(0x19a4c116, 0xb8d2d0c8), new u64(0x1e376c08, 0x5141ab53), - new u64(0x2748774c, 0xdf8eeb99), new u64(0x34b0bcb5, 0xe19b48a8), - new u64(0x391c0cb3, 0xc5c95a63), new u64(0x4ed8aa4a, 0xe3418acb), - new u64(0x5b9cca4f, 0x7763e373), new u64(0x682e6ff3, 0xd6b2b8a3), - new u64(0x748f82ee, 0x5defb2fc), new u64(0x78a5636f, 0x43172f60), - new u64(0x84c87814, 0xa1f0ab72), new u64(0x8cc70208, 0x1a6439ec), - new u64(0x90befffa, 0x23631e28), new u64(0xa4506ceb, 0xde82bde9), - new u64(0xbef9a3f7, 0xb2c67915), new u64(0xc67178f2, 0xe372532b), - new u64(0xca273ece, 0xea26619c), new u64(0xd186b8c7, 0x21c0c207), - new u64(0xeada7dd6, 0xcde0eb1e), new u64(0xf57d4f7f, 0xee6ed178), - new u64(0x06f067aa, 0x72176fba), new u64(0x0a637dc5, 0xa2c898a6), - new u64(0x113f9804, 0xbef90dae), new u64(0x1b710b35, 0x131c471b), - new u64(0x28db77f5, 0x23047d84), new u64(0x32caab7b, 0x40c72493), - new u64(0x3c9ebe0a, 0x15c9bebc), new u64(0x431d67c4, 0x9c100d4c), - new u64(0x4cc5d4be, 0xcb3e42b6), new u64(0x597f299c, 0xfc657e2a), - new u64(0x5fcb6fab, 0x3ad6faec), new u64(0x6c44198c, 0x4a475817) -]; - -function crypto_hashblocks(x, m, n) { - var z = [], b = [], a = [], w = [], t, i, j; - - for (i = 0; i < 8; i++) z[i] = a[i] = dl64(x, 8*i); - - var pos = 0; - while (n >= 128) { - for (i = 0; i < 16; i++) w[i] = dl64(m, 8*i+pos); - for (i = 0; i < 80; i++) { - for (j = 0; j < 8; j++) b[j] = a[j]; - t = add64(a[7], Sigma1(a[4]), Ch(a[4], a[5], a[6]), K[i], w[i%16]); - b[7] = add64(t, Sigma0(a[0]), Maj(a[0], a[1], a[2])); - b[3] = add64(b[3], t); - for (j = 0; j < 8; j++) a[(j+1)%8] = b[j]; - if (i%16 === 15) { - for (j = 0; j < 16; j++) { - w[j] = add64(w[j], w[(j+9)%16], sigma0(w[(j+1)%16]), sigma1(w[(j+14)%16])); - } - } - } - - for (i = 0; i < 8; i++) { - a[i] = add64(a[i], z[i]); - z[i] = a[i]; - } - - pos += 128; - n -= 128; - } - - for (i = 0; i < 8; i++) ts64(x, 8*i, z[i]); - return n; -} - -var iv = new Uint8Array([ - 0x6a,0x09,0xe6,0x67,0xf3,0xbc,0xc9,0x08, - 0xbb,0x67,0xae,0x85,0x84,0xca,0xa7,0x3b, - 0x3c,0x6e,0xf3,0x72,0xfe,0x94,0xf8,0x2b, - 0xa5,0x4f,0xf5,0x3a,0x5f,0x1d,0x36,0xf1, - 0x51,0x0e,0x52,0x7f,0xad,0xe6,0x82,0xd1, - 0x9b,0x05,0x68,0x8c,0x2b,0x3e,0x6c,0x1f, - 0x1f,0x83,0xd9,0xab,0xfb,0x41,0xbd,0x6b, - 0x5b,0xe0,0xcd,0x19,0x13,0x7e,0x21,0x79 -]); - -function crypto_hash(out, m, n) { - var h = new Uint8Array(64), x = new Uint8Array(256); - var i, b = n; - - for (i = 0; i < 64; i++) h[i] = iv[i]; - - crypto_hashblocks(h, m, n); - n %= 128; - - for (i = 0; i < 256; i++) x[i] = 0; - 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, new u64((b / 0x20000000) | 0, b << 3)); - crypto_hashblocks(h, x, n); - - for (i = 0; i < 64; i++) out[i] = h[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([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]); - -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); -} - -// Note: difference from C - smlen returned, not passed as argument. -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_core_hsalsa20, - crypto_stream_xor : crypto_stream_xor, - crypto_stream : crypto_stream, - crypto_stream_salsa20_xor : crypto_stream_salsa20_xor, - crypto_stream_salsa20 : crypto_stream_salsa20, - crypto_onetimeauth : crypto_onetimeauth, - crypto_onetimeauth_verify : crypto_onetimeauth_verify, - crypto_verify_16 : crypto_verify_16, - crypto_verify_32 : crypto_verify_32, - crypto_secretbox : crypto_secretbox, - crypto_secretbox_open : crypto_secretbox_open, - crypto_scalarmult : crypto_scalarmult, - crypto_scalarmult_base : crypto_scalarmult_base, - crypto_box_beforenm : crypto_box_beforenm, - crypto_box_afternm : crypto_box_afternm, - crypto_box : crypto_box, - crypto_box_open : crypto_box_open, - crypto_box_keypair : crypto_box_keypair, - crypto_hash : crypto_hash, - crypto_sign : crypto_sign, - crypto_sign_keypair : crypto_sign_keypair, - crypto_sign_open : crypto_sign_open, - - crypto_secretbox_KEYBYTES : crypto_secretbox_KEYBYTES, - crypto_secretbox_NONCEBYTES : crypto_secretbox_NONCEBYTES, - crypto_secretbox_ZEROBYTES : crypto_secretbox_ZEROBYTES, - crypto_secretbox_BOXZEROBYTES : crypto_secretbox_BOXZEROBYTES, - crypto_scalarmult_BYTES : crypto_scalarmult_BYTES, - crypto_scalarmult_SCALARBYTES : crypto_scalarmult_SCALARBYTES, - crypto_box_PUBLICKEYBYTES : crypto_box_PUBLICKEYBYTES, - crypto_box_SECRETKEYBYTES : crypto_box_SECRETKEYBYTES, - crypto_box_BEFORENMBYTES : crypto_box_BEFORENMBYTES, - crypto_box_NONCEBYTES : crypto_box_NONCEBYTES, - crypto_box_ZEROBYTES : crypto_box_ZEROBYTES, - crypto_box_BOXZEROBYTES : crypto_box_BOXZEROBYTES, - crypto_sign_BYTES : crypto_sign_BYTES, - crypto_sign_PUBLICKEYBYTES : crypto_sign_PUBLICKEYBYTES, - crypto_sign_SECRETKEYBYTES : crypto_sign_SECRETKEYBYTES, - crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES, - crypto_hash_BYTES : crypto_hash_BYTES -}; - -/* High-level API */ - -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); - // Zero length arguments are considered not equal. - 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() { - // Initialize PRNG if environment provides CSPRNG. - // If not, methods calling randombytes will throw. - var crypto; - if (typeof self !== 'undefined') { - // Browser. - if (self.crypto && self.crypto.getRandomValues) { - crypto = self.crypto; // Standard - } else if (self.msCrypto && self.msCrypto.getRandomValues) { - crypto = self.msCrypto; // Internet Explorer 11+ - } - 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 require !== 'undefined') { - // Node.js. - 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]; - }); - } - } -})(); - -})(typeof module !== 'undefined' && module.exports ? module.exports : (window.nacl = window.nacl || {})); diff --git a/src/tweetnacl/nacl.min.js b/src/tweetnacl/nacl.min.js deleted file mode 100644 index f69945813..000000000 --- a/src/tweetnacl/nacl.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(r){"use strict";function n(r,n){return r<>>32-n}function e(r,n){var e=255&r[n+3];return e=e<<8|255&r[n+2],e=e<<8|255&r[n+1],e<<8|255&r[n+0]}function t(r,n){var e=r[n]<<24|r[n+1]<<16|r[n+2]<<8|r[n+3],t=r[n+4]<<24|r[n+5]<<16|r[n+6]<<8|r[n+7];return new ln(e,t)}function o(r,n,e){var t;for(t=0;4>t;t++)r[n+t]=255&e,e>>>=8}function i(r,n,e){r[n]=e.hi>>24&255,r[n+1]=e.hi>>16&255,r[n+2]=e.hi>>8&255,r[n+3]=255&e.hi,r[n+4]=e.lo>>24&255,r[n+5]=e.lo>>16&255,r[n+6]=e.lo>>8&255,r[n+7]=255&e.lo}function a(r,n,e,t,o){var i,a=0;for(i=0;o>i;i++)a|=r[n+i]^e[t+i];return(1&a-1>>>8)-1}function f(r,n,e,t){return a(r,n,e,t,16)}function u(r,n,e,t){return a(r,n,e,t,32)}function c(r,t,i,a,f){var u,c,w,y=new Uint32Array(16),s=new Uint32Array(16),l=new Uint32Array(16),h=new Uint32Array(4);for(u=0;4>u;u++)s[5*u]=e(a,4*u),s[1+u]=e(i,4*u),s[6+u]=e(t,4*u),s[11+u]=e(i,16+4*u);for(u=0;16>u;u++)l[u]=s[u];for(u=0;20>u;u++){for(c=0;4>c;c++){for(w=0;4>w;w++)h[w]=s[(5*c+4*w)%16];for(h[1]^=n(h[0]+h[3]|0,7),h[2]^=n(h[1]+h[0]|0,9),h[3]^=n(h[2]+h[1]|0,13),h[0]^=n(h[3]+h[2]|0,18),w=0;4>w;w++)y[4*c+(c+w)%4]=h[w]}for(w=0;16>w;w++)s[w]=y[w]}if(f){for(u=0;16>u;u++)s[u]=s[u]+l[u]|0;for(u=0;4>u;u++)s[5*u]=s[5*u]-e(a,4*u)|0,s[6+u]=s[6+u]-e(t,4*u)|0;for(u=0;4>u;u++)o(r,4*u,s[5*u]),o(r,16+4*u,s[6+u])}else for(u=0;16>u;u++)o(r,4*u,s[u]+l[u]|0)}function w(r,n,e,t){return c(r,n,e,t,!1),0}function y(r,n,e,t){return c(r,n,e,t,!0),0}function s(r,n,e,t,o,i,a){var f,u,c=new Uint8Array(16),y=new Uint8Array(64);if(!o)return 0;for(u=0;16>u;u++)c[u]=0;for(u=0;8>u;u++)c[u]=i[u];for(;o>=64;){for(w(y,c,a,Bn),u=0;64>u;u++)r[n+u]=(e?e[t+u]:0)^y[u];for(f=1,u=8;16>u;u++)f=f+(255&c[u])|0,c[u]=255&f,f>>>=8;o-=64,n+=64,e&&(t+=64)}if(o>0)for(w(y,c,a,Bn),u=0;o>u;u++)r[n+u]=(e?e[t+u]:0)^y[u];return 0}function l(r,n,e,t,o){return s(r,n,null,0,e,t,o)}function h(r,n,e,t,o){var i=new Uint8Array(32);return y(i,t,o,Bn),l(r,n,e,t.subarray(16),i)}function g(r,n,e,t,o,i,a){var f=new Uint8Array(32);return y(f,i,a,Bn),s(r,n,e,t,o,i.subarray(16),f)}function v(r,n){var e,t=0;for(e=0;17>e;e++)t=t+(r[e]+n[e]|0)|0,r[e]=255&t,t>>>=8}function p(r,n,e,t,o,i){var a,f,u,c,w=new Uint32Array(17),y=new Uint32Array(17),s=new Uint32Array(17),l=new Uint32Array(17),h=new Uint32Array(17);for(u=0;17>u;u++)y[u]=s[u]=0;for(u=0;16>u;u++)y[u]=i[u];for(y[3]&=15,y[4]&=252,y[7]&=15,y[8]&=252,y[11]&=15,y[12]&=252,y[15]&=15;o>0;){for(u=0;17>u;u++)l[u]=0;for(u=0;16>u&&o>u;++u)l[u]=e[t+u];for(l[u]=1,t+=u,o-=u,v(s,l),f=0;17>f;f++)for(w[f]=0,u=0;17>u;u++)w[f]=w[f]+s[u]*(f>=u?y[f-u]:320*y[f+17-u]|0)|0|0;for(f=0;17>f;f++)s[f]=w[f];for(c=0,u=0;16>u;u++)c=c+s[u]|0,s[u]=255&c,c>>>=8;for(c=c+s[16]|0,s[16]=3&c,c=5*(c>>>2)|0,u=0;16>u;u++)c=c+s[u]|0,s[u]=255&c,c>>>=8;c=c+s[16]|0,s[16]=c}for(u=0;17>u;u++)h[u]=s[u];for(v(s,Sn),a=0|-(s[16]>>>7),u=0;17>u;u++)s[u]^=a&(h[u]^s[u]);for(u=0;16>u;u++)l[u]=i[u+16];for(l[16]=0,v(s,l),u=0;16>u;u++)r[n+u]=s[u];return 0}function b(r,n,e,t,o,i){var a=new Uint8Array(16);return p(a,0,e,t,o,i),f(r,n,a,0)}function A(r,n,e,t,o){var i;if(32>e)return-1;for(g(r,0,n,0,e,t,o),p(r,16,r,32,e-32,r),i=0;16>i;i++)r[i]=0;return 0}function U(r,n,e,t,o){var i,a=new Uint8Array(32);if(32>e)return-1;if(h(a,0,32,t,o),0!==b(n,16,n,32,e-32,a))return-1;for(g(r,0,n,0,e,t,o),i=0;32>i;i++)r[i]=0;return 0}function _(r,n){var e;for(e=0;16>e;e++)r[e]=0|n[e]}function d(r){var n,e;for(e=0;16>e;e++)r[e]+=65536,n=Math.floor(r[e]/65536),r[(e+1)*(15>e?1:0)]+=n-1+37*(n-1)*(15===e?1:0),r[e]-=65536*n}function E(r,n,e){for(var t,o=~(e-1),i=0;16>i;i++)t=o&(r[i]^n[i]),r[i]^=t,n[i]^=t}function x(r,n){var e,t,o,i=hn(),a=hn();for(e=0;16>e;e++)a[e]=n[e];for(d(a),d(a),d(a),t=0;2>t;t++){for(i[0]=a[0]-65517,e=1;15>e;e++)i[e]=a[e]-65535-(i[e-1]>>16&1),i[e-1]&=65535;i[15]=a[15]-32767-(i[14]>>16&1),o=i[15]>>16&1,i[14]&=65535,E(a,i,1-o)}for(e=0;16>e;e++)r[2*e]=255&a[e],r[2*e+1]=a[e]>>8}function m(r,n){var e=new Uint8Array(32),t=new Uint8Array(32);return x(e,r),x(t,n),u(e,0,t,0)}function B(r){var n=new Uint8Array(32);return x(n,r),1&n[0]}function S(r,n){var e;for(e=0;16>e;e++)r[e]=n[2*e]+(n[2*e+1]<<8);r[15]&=32767}function K(r,n,e){var t;for(t=0;16>t;t++)r[t]=n[t]+e[t]|0}function T(r,n,e){var t;for(t=0;16>t;t++)r[t]=n[t]-e[t]|0}function Y(r,n,e){var t,o,i=new Float64Array(31);for(t=0;31>t;t++)i[t]=0;for(t=0;16>t;t++)for(o=0;16>o;o++)i[t+o]+=n[t]*e[o];for(t=0;15>t;t++)i[t]+=38*i[t+16];for(t=0;16>t;t++)r[t]=i[t];d(r),d(r)}function L(r,n){Y(r,n,n)}function C(r,n){var e,t=hn();for(e=0;16>e;e++)t[e]=n[e];for(e=253;e>=0;e--)L(t,t),2!==e&&4!==e&&Y(t,t,n);for(e=0;16>e;e++)r[e]=t[e]}function R(r,n){var e,t=hn();for(e=0;16>e;e++)t[e]=n[e];for(e=250;e>=0;e--)L(t,t),1!==e&&Y(t,t,n);for(e=0;16>e;e++)r[e]=t[e]}function k(r,n,e){var t,o,i=new Uint8Array(32),a=new Float64Array(80),f=hn(),u=hn(),c=hn(),w=hn(),y=hn(),s=hn();for(o=0;31>o;o++)i[o]=n[o];for(i[31]=127&n[31]|64,i[0]&=248,S(a,e),o=0;16>o;o++)u[o]=a[o],w[o]=f[o]=c[o]=0;for(f[0]=w[0]=1,o=254;o>=0;--o)t=i[o>>>3]>>>(7&o)&1,E(f,u,t),E(c,w,t),K(y,f,c),T(f,f,c),K(c,u,w),T(u,u,w),L(w,y),L(s,f),Y(f,c,f),Y(c,u,y),K(y,f,c),T(f,f,c),L(u,f),T(c,w,s),Y(f,c,Un),K(f,f,w),Y(c,c,f),Y(f,w,s),Y(w,u,a),L(u,y),E(f,u,t),E(c,w,t);for(o=0;16>o;o++)a[o+16]=f[o],a[o+32]=c[o],a[o+48]=u[o],a[o+64]=w[o];var l=a.subarray(32),h=a.subarray(16);return C(l,l),Y(h,h,l),x(r,h),0}function z(r,n){return k(r,n,pn)}function P(r,n){return gn(n,32),z(r,n)}function F(r,n,e){var t=new Uint8Array(32);return k(t,e,n),y(r,vn,t,Bn)}function N(r,n,e,t,o,i){var a=new Uint8Array(32);return F(a,o,i),Kn(r,n,e,t,a)}function O(r,n,e,t,o,i){var a=new Uint8Array(32);return F(a,o,i),Tn(r,n,e,t,a)}function M(){var r,n,e,t=0,o=0,i=0,a=0,f=65535;for(e=0;e>>16,i+=n&f,a+=n>>>16;return o+=t>>>16,i+=o>>>16,a+=i>>>16,new ln(i&f|a<<16,t&f|o<<16)}function G(r,n){return new ln(r.hi>>>n,r.lo>>>n|r.hi<<32-n)}function I(){var r,n=0,e=0;for(r=0;rn?(e=r.hi>>>n|r.lo<>>n|r.hi<n&&(e=r.lo>>>n|r.hi<>>n|r.lo<a;a++)u[a]=w[a]=t(r,8*a);for(var s=0;e>=128;){for(a=0;16>a;a++)y[a]=t(n,8*a+s);for(a=0;80>a;a++){for(f=0;8>f;f++)c[f]=w[f];for(o=M(w[7],X(w[4]),j(w[4],w[5],w[6]),Yn[a],y[a%16]),c[7]=M(o,q(w[0]),V(w[0],w[1],w[2])),c[3]=M(c[3],o),f=0;8>f;f++)w[(f+1)%8]=c[f];if(a%16===15)for(f=0;16>f;f++)y[f]=M(y[f],y[(f+9)%16],D(y[(f+1)%16]),H(y[(f+14)%16]))}for(a=0;8>a;a++)w[a]=M(w[a],u[a]),u[a]=w[a];s+=128,e-=128}for(a=0;8>a;a++)i(r,8*a,u[a]);return e}function Q(r,n,e){var t,o=new Uint8Array(64),a=new Uint8Array(256),f=e;for(t=0;64>t;t++)o[t]=Ln[t];for(J(o,n,e),e%=128,t=0;256>t;t++)a[t]=0;for(t=0;e>t;t++)a[t]=n[f-e+t];for(a[e]=128,e=256-128*(112>e?1:0),a[e-9]=0,i(a,e-8,new ln(f/536870912|0,f<<3)),J(o,a,e),t=0;64>t;t++)r[t]=o[t];return 0}function W(r,n){var e=hn(),t=hn(),o=hn(),i=hn(),a=hn(),f=hn(),u=hn(),c=hn(),w=hn();T(e,r[1],r[0]),T(w,n[1],n[0]),Y(e,e,w),K(t,r[0],r[1]),K(w,n[0],n[1]),Y(t,t,w),Y(o,r[3],n[3]),Y(o,o,dn),Y(i,r[2],n[2]),K(i,i,i),T(a,t,e),T(f,i,o),K(u,i,o),K(c,t,e),Y(r[0],a,f),Y(r[1],c,u),Y(r[2],u,f),Y(r[3],a,c)}function $(r,n,e){var t;for(t=0;4>t;t++)E(r[t],n[t],e)}function rn(r,n){var e=hn(),t=hn(),o=hn();C(o,n[2]),Y(e,n[0],o),Y(t,n[1],o),x(r,t),r[31]^=B(e)<<7}function nn(r,n,e){var t,o;for(_(r[0],bn),_(r[1],An),_(r[2],An),_(r[3],bn),o=255;o>=0;--o)t=e[o/8|0]>>(7&o)&1,$(r,n,t),W(n,r),W(r,r),$(r,n,t)}function en(r,n){var e=[hn(),hn(),hn(),hn()];_(e[0],En),_(e[1],xn),_(e[2],An),Y(e[3],En,xn),nn(r,e,n)}function tn(r,n,e){var t,o=new Uint8Array(64),i=[hn(),hn(),hn(),hn()];for(e||gn(n,32),Q(o,n,32),o[0]&=248,o[31]&=127,o[31]|=64,en(i,o),rn(r,i),t=0;32>t;t++)n[t+32]=r[t];return 0}function on(r,n){var e,t,o,i;for(t=63;t>=32;--t){for(e=0,o=t-32,i=t-12;i>o;++o)n[o]+=e-16*n[t]*Cn[o-(t-32)],e=n[o]+128>>8,n[o]-=256*e;n[o]+=e,n[t]=0}for(e=0,o=0;32>o;o++)n[o]+=e-(n[31]>>4)*Cn[o],e=n[o]>>8,n[o]&=255;for(o=0;32>o;o++)n[o]-=e*Cn[o];for(t=0;32>t;t++)n[t+1]+=n[t]>>8,r[t]=255&n[t]}function an(r){var n,e=new Float64Array(64);for(n=0;64>n;n++)e[n]=r[n];for(n=0;64>n;n++)r[n]=0;on(r,e)}function fn(r,n,e,t){var o,i,a=new Uint8Array(64),f=new Uint8Array(64),u=new Uint8Array(64),c=new Float64Array(64),w=[hn(),hn(),hn(),hn()];Q(a,t,32),a[0]&=248,a[31]&=127,a[31]|=64;var y=e+64;for(o=0;e>o;o++)r[64+o]=n[o];for(o=0;32>o;o++)r[32+o]=a[32+o];for(Q(u,r.subarray(32),e+32),an(u),en(w,u),rn(r,w),o=32;64>o;o++)r[o]=t[o];for(Q(f,r,e+64),an(f),o=0;64>o;o++)c[o]=0;for(o=0;32>o;o++)c[o]=u[o];for(o=0;32>o;o++)for(i=0;32>i;i++)c[o+i]+=f[o]*a[i];return on(r.subarray(32),c),y}function un(r,n){var e=hn(),t=hn(),o=hn(),i=hn(),a=hn(),f=hn(),u=hn();return _(r[2],An),S(r[1],n),L(o,r[1]),Y(i,o,_n),T(o,o,r[2]),K(i,r[2],i),L(a,i),L(f,a),Y(u,f,a),Y(e,u,o),Y(e,e,i),R(e,e),Y(e,e,o),Y(e,e,i),Y(e,e,i),Y(r[0],e,i),L(t,r[0]),Y(t,t,i),m(t,o)&&Y(r[0],r[0],mn),L(t,r[0]),Y(t,t,i),m(t,o)?-1:(B(r[0])===n[31]>>7&&T(r[0],bn,r[0]),Y(r[3],r[0],r[1]),0)}function cn(r,n,e,t){var o,i,a=new Uint8Array(32),f=new Uint8Array(64),c=[hn(),hn(),hn(),hn()],w=[hn(),hn(),hn(),hn()];if(i=-1,64>e)return-1;if(un(w,t))return-1;for(o=0;e>o;o++)r[o]=n[o];for(o=0;32>o;o++)r[o+32]=t[o];if(Q(f,r,e),an(f),nn(c,w,f),en(w,n.subarray(32)),W(c,w),rn(a,c),e-=64,u(n,0,a,0)){for(o=0;e>o;o++)r[o]=0;return-1}for(o=0;e>o;o++)r[o]=n[o+64];return i=e}function wn(r,n){if(r.length!==Rn)throw new Error("bad key size");if(n.length!==kn)throw new Error("bad nonce size")}function yn(r,n){if(r.length!==On)throw new Error("bad public key size");if(n.length!==Mn)throw new Error("bad secret key size")}function sn(){for(var r,n={}.toString,e=0;en;n++)e.push(String.fromCharCode(r[n]));return btoa(e.join(""))},r.util.decodeBase64=function(r){if("undefined"==typeof atob)return new Uint8Array(Array.prototype.slice.call(new Buffer(r,"base64"),0));var n,e=atob(r),t=new Uint8Array(e.length);for(n=0;nt)return null;for(var o=new Uint8Array(t),i=0;it;t++)o[t]=n[t];for(t=0;t=0},r.sign.keyPair=function(){var r=new Uint8Array(qn),n=new Uint8Array(Xn);return tn(r,n),{publicKey:r,secretKey:n}},r.sign.keyPair.fromSecretKey=function(r){if(sn(r),r.length!==Xn)throw new Error("bad secret key size");for(var n=new Uint8Array(qn),e=0;et;t++)e[t]=r[t];return tn(n,e,!0),{publicKey:n,secretKey:e}},r.sign.publicKeyLength=qn,r.sign.secretKeyLength=Xn,r.sign.seedLength=Dn,r.sign.signatureLength=Vn,r.hash=function(r){sn(r);var n=new Uint8Array(Hn);return Q(n,r,r.length),n},r.hash.hashLength=Hn,r.verify=function(r,n){return sn(r,n),0===r.length||0===n.length?!1:r.length!==n.length?!1:0===a(r,0,n,0,r.length)?!0:!1},r.setPRNG=function(r){gn=r},function(){var n;"undefined"!=typeof window?(window.crypto&&window.crypto.getRandomValues?n=window.crypto:window.msCrypto&&window.msCrypto.getRandomValues&&(n=window.msCrypto),n&&r.setPRNG(function(r,e){var t,o=new Uint8Array(e);for(n.getRandomValues(o),t=0;e>t;t++)r[t]=o[t]})):"undefined"!=typeof require&&(n=require("crypto"),n&&r.setPRNG(function(r,e){var t,o=n.randomBytes(e);for(t=0;e>t;t++)r[t]=o[t]}))}()}("undefined"!=typeof module&&module.exports?module.exports:window.nacl=window.nacl||{}); \ No newline at end of file diff --git a/src/tweetnacl/package-lock.json b/src/tweetnacl/package-lock.json deleted file mode 100644 index 40614d448..000000000 --- a/src/tweetnacl/package-lock.json +++ /dev/null @@ -1,4327 +0,0 @@ -{ - "name": "tweetnacl", - "version": "0.12.2", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "tweetnacl", - "version": "0.12.2", - "license": "Public domain", - "devDependencies": { - "browserify": "4.x.x", - "faucet": "0.x.x", - "tap-browser-color": "0.x.x", - "tape": "2.x.x", - "testling": "1.x.x", - "uglify-js": "2.x.x" - } - }, - "node_modules/@ljharb/resumer": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@ljharb/resumer/-/resumer-0.1.3.tgz", - "integrity": "sha512-d+tsDgfkj9X5QTriqM4lKesCkMMJC3IrbPKHvayP00ELx2axdXvDfWkqjxrLXIzGcQzmj7VAUT1wopqARTvafw==", - "dev": true, - "dependencies": { - "@ljharb/through": "^2.3.13", - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/@ljharb/through": { - "version": "2.3.13", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", - "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/@tapjs/tap-finished": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@tapjs/tap-finished/-/tap-finished-0.0.3.tgz", - "integrity": "sha512-cnOg0S1CnbfB3MCtmIU4FcvNCz2nyJOIEQJvnSxR0B10GU32MsFr+7F+k6EJvumnIFxcS/G+sSc6y0AV09TMbw==", - "dev": true, - "dependencies": { - "object.assign": "^4.1.4", - "tap-parser": "^5.4.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@tapjs/tap-finished/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "optional": true - }, - "node_modules/@tapjs/tap-finished/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "optional": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/@tapjs/tap-finished/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/@tapjs/tap-finished/node_modules/tap-parser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz", - "integrity": "sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA==", - "dev": true, - "dependencies": { - "events-to-array": "^1.0.1", - "js-yaml": "^3.2.7" - }, - "bin": { - "tap-parser": "bin/cmd.js" - }, - "optionalDependencies": { - "readable-stream": "^2" - } - }, - "node_modules/acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "node_modules/acorn-node/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-node/node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", - "dev": true, - "engines": { - "node": ">=0.4.2" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/argparse/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.every": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/array.prototype.every/-/array.prototype.every-1.1.6.tgz", - "integrity": "sha512-gNEqZD97w6bfQRNmHkFv7rNnGM+VWyHZT+h/rf9C+22owcXuENr66Lfo0phItpU5KoXW6Owb34q2+8MnSIZ57w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.foreach": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/array.prototype.foreach/-/array.prototype.foreach-1.0.7.tgz", - "integrity": "sha512-T6Y2wgc24suLW78a3Iq/Iu0zgucdBRtj11GElARgGZaqNC8ESFZV8qeJR9/I7bHCB3Vh5N6ATYUOBIZLLl9WCw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-array-method-boxes-properly": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.join": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array.prototype.join/-/array.prototype.join-1.0.3.tgz", - "integrity": "sha512-eej2wtApyj3MzqwTju3+web8Iu3x9gDjIKGKTM0pnIFoJuVuhh3MWwUPsrKmaUd7GoR3GjqhVMJFj/IrUOQPxA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.map": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.7.tgz", - "integrity": "sha512-XpcFfLoBEAhezrrNw1V+yLXkE7M6uR7xJEsxbG6c/V9v043qurwVJB9r9UTnoSioFDoz1i1VOydpWGmJpfVZbg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-array-method-boxes-properly": "^1.0.0", - "es-object-atoms": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.push": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/array.prototype.push/-/array.prototype.push-1.0.6.tgz", - "integrity": "sha512-Dwj4cUyjHWAAoDCIIg+RkIVYMuooXzXYrpGnugHKHmFBfsbef1gLg/iyNRCg0zHvm2pjUD95t/MsKstShLvzig==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "has-property-descriptors": "^1.0.2", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array.prototype.slice/-/array.prototype.slice-1.0.3.tgz", - "integrity": "sha512-mBqKR+J5OMJd+CxH1KcyddtIHoci1aKTK23QWVScR/+1JvETDwZIadxMP1ynZa+InvPwcGV+THC0y2hHxwoO7g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/assert": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.1.2.tgz", - "integrity": "sha512-pSLN/C6u6JFR8L+0TzQ0Elc+VboxUXFtNw11RI1UcTcHEktQqIKIKK5S4nAZX4j8mpTpnCtmqpR+thPfqT11Kg==", - "dev": true, - "dependencies": { - "util": "0.10.3" - } - }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", - "dev": true - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", - "dev": true, - "dependencies": { - "inherits": "2.0.1" - } - }, - "node_modules/astw": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", - "integrity": "sha512-E/4z//dvN0lfr8zAx8hXeQ8o3nRoQaL/wqI7fAALEvh/40mnyUxfFB9MwyDHYKVDtS3cp3Pow5s96djZR5lkWw==", - "dev": true, - "dependencies": { - "acorn": "^4.0.3" - } - }, - "node_modules/async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", - "dev": true - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/Base64": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz", - "integrity": "sha512-reGEWshDmTDQDsCec/HduOO9Wyj6yMOupMfhIf3ugN1TDlK2NQW4DDJSqNNtp380SNcvRfXtO8HSCQot0d0SMw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.7.tgz", - "integrity": "sha512-0nMfGOwe+glKQmfi9trLwlSMeLuTkupKQ6scwrlRP4TdfZR87kwZwMBNYOz8xdtXqefa2uI7rQy6n8GxxtYFvw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/bouncy": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/bouncy/-/bouncy-3.2.2.tgz", - "integrity": "sha512-a8jzO5DVJFHx16Iep1y9zcDj0iGCKMWbMCYxfOwt8mnGEy4aaPAEqeihdPWvTbomnmxUGXwonoB3aQWtvAZH7Q==", - "dev": true, - "dependencies": { - "optimist": "~0.3.5", - "through": "~2.3.4" - }, - "bin": { - "bouncy": "bin/bouncy.js" - } - }, - "node_modules/bouncy/node_modules/optimist": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==", - "dev": true, - "dependencies": { - "wordwrap": "~0.0.2" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/browser-launcher": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browser-launcher/-/browser-launcher-1.0.2.tgz", - "integrity": "sha512-MX5NJw6vm9v5WhRmb2R2q28DmXxFPIEL5TF0k/2LlMSd3+pRdoCkwH+qPFPOgPZnZklw1IZh9wTtqBJKUy4Ccg==", - "bundleDependencies": [ - "headless" - ], - "dev": true, - "dependencies": { - "headless": "~0.1.3", - "minimist": "0.0.5", - "mkdirp": "~0.3.3", - "plist": "0.2.1", - "xtend": "^4.0.0" - }, - "bin": { - "browser-launcher": "bin/cmd.js" - } - }, - "node_modules/browser-launcher/node_modules/minimist": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.5.tgz", - "integrity": "sha512-rSJ0cdmCj3qmKdObcnMcWgPVOyaOWlazLhZAJW0s6G6lx1ZEuFkraWmEH5LTvX90btkfHPclQBjvjU7A/kYRFg==", - "dev": true - }, - "node_modules/browser-launcher/node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/browser-pack": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-2.0.1.tgz", - "integrity": "sha512-wa2mYzXIk+0MC5N8xDA3sFUiyJx3GyK2ry1fyMSW2ON4XHDUz+YJTYSLAXFrSl6k/JDbfNBwaG8kuELQghAQRQ==", - "dev": true, - "dependencies": { - "combine-source-map": "~0.3.0", - "JSONStream": "~0.6.4", - "through": "~2.3.4" - }, - "bin": { - "browser-pack": "bin/cmd.js" - } - }, - "node_modules/browser-pack/node_modules/JSONStream": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.6.4.tgz", - "integrity": "sha512-ER8YVJ+Xk4a1g+d8Xq9RFe2rjsUHV9eSRqfwe9DS5J5ga8bKWx4FwXZNWXpGDYchuOfqf4NFmDlwuloqHIj/5A==", - "dev": true, - "dependencies": { - "jsonparse": "0.0.5", - "through": "~2.2.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/browser-pack/node_modules/JSONStream/node_modules/through": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/through/-/through-2.2.7.tgz", - "integrity": "sha512-JIR0m0ybkmTcR8URann+HbwKmodP+OE8UCbsifQDYMLD5J3em1Cdn3MYPpbEd5elGDwmP98T+WbqP/tvzA5Mjg==", - "dev": true - }, - "node_modules/browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "dev": true, - "dependencies": { - "resolve": "1.1.7" - } - }, - "node_modules/browser-resolve/node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", - "dev": true - }, - "node_modules/browserify": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-4.2.3.tgz", - "integrity": "sha512-94P3zDGuqOhNvPSeHLvdeNIA5GY7BAcZG0DB1RoxH++UQPiaucZN68WoKaVx95QK6KUeKBKhqkeBRvOTVdX4Fw==", - "dev": true, - "dependencies": { - "assert": "~1.1.0", - "browser-pack": "~2.0.0", - "browser-resolve": "^1.3.0", - "browserify-zlib": "~0.1.2", - "buffer": "^2.3.0", - "builtins": "~0.0.3", - "commondir": "0.0.1", - "concat-stream": "~1.4.1", - "console-browserify": "^1.1.0", - "constants-browserify": "~0.0.1", - "crypto-browserify": "^2.1.8", - "deep-equal": "~0.2.1", - "defined": "~0.0.0", - "deps-sort": "~0.1.1", - "derequire": "~0.8.0", - "domain-browser": "~1.1.0", - "duplexer": "~0.1.1", - "events": "~1.0.0", - "glob": "~3.2.8", - "http-browserify": "^1.4.0", - "https-browserify": "~0.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "~6.0.0", - "JSONStream": "~0.8.3", - "module-deps": "~2.1.1", - "os-browserify": "~0.1.1", - "parents": "~0.0.1", - "path-browserify": "~0.0.0", - "process": "^0.7.0", - "punycode": "~1.2.3", - "querystring-es3": "~0.2.0", - "readable-stream": "^1.0.27-1", - "resolve": "~0.7.1", - "shallow-copy": "0.0.1", - "shell-quote": "~0.0.1", - "stream-browserify": "^1.0.0", - "stream-combiner": "~0.0.2", - "string_decoder": "~0.0.0", - "subarg": "0.0.1", - "syntax-error": "^1.1.1", - "through2": "^1.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "~0.0.0", - "umd": "~2.1.0", - "url": "~0.10.1", - "util": "~0.10.1", - "vm-browserify": "~0.0.1", - "xtend": "^3.0.0" - }, - "bin": { - "browserify": "bin/cmd.js" - } - }, - "node_modules/browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", - "dev": true, - "dependencies": { - "pako": "~0.2.0" - } - }, - "node_modules/buffer": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-2.8.3.tgz", - "integrity": "sha512-dyatqxbSWlkhnG5lthQ7TDh2NfShsKesnKiGyt5DmiJfvKJ1zBq1AvC3+neSY565BziAiYwbothV2tizAr2WRg==", - "dev": true, - "dependencies": { - "base64-js": "0.0.7", - "ieee754": "^1.1.4", - "is-array": "^1.0.1" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builtins": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz", - "integrity": "sha512-T8uCGKc0/2aLVt6omt8JxDRBoWEMkku+wFesxnhxnt4NygVZG99zqxo7ciK8eebszceKamGoUiLdkXCgGQyrQw==", - "dev": true - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", - "dev": true, - "dependencies": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", - "dev": true, - "dependencies": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "node_modules/cliui/node_modules/wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/combine-source-map": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.3.0.tgz", - "integrity": "sha512-HRKa6g9SC1xd6ifto8ay6SxvyHaaQ50/8NO1ZONXx2hsIF9t/52qXa7Eeivaf5KFOSowK7Nm8TkIL/VC4khdBA==", - "dev": true, - "dependencies": { - "convert-source-map": "~0.3.0", - "inline-source-map": "~0.3.0", - "source-map": "~0.1.31" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/commondir": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-0.0.1.tgz", - "integrity": "sha512-Ghe1LmLv3G3c0XJYu+c88MCRIPqWQ67qaqKY1KvuN4uPAjfUj+y4hvcpZ2kCPrjpRNyklW4dpAZZ8a7vOh50tg==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/concat-stream": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.11.tgz", - "integrity": "sha512-X3JMh8+4je3U1cQpG87+f9lXHDrqcb2MVLg9L7o8b1UZ0DzhRrUpdn65ttzu10PpJPPI3MQNkis+oha6TSA9Mw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "~1.1.9", - "typedarray": "~0.0.5" - } - }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "node_modules/constants-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz", - "integrity": "sha512-FL+diDS9AKR5BAA2M+GNk8lnH64tRE3zepTG9hucxc7o04LgCRhkQZhF7u/OKHZT8LLRT+sZEi9qFzXUchq9pA==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha512-+4nRk0k3oEpwUB7/CalD7xE2z4VmtEnnq0GO2IPTkrooTrAhEsWvuLF5iWP1dXrwluki/azwXV1ve7gtYuPldg==", - "dev": true - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/cross-spawn/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/crypto-browserify": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-2.1.10.tgz", - "integrity": "sha512-2HfNnWhgjFE76P5+Pvq4n7gQwYibHbqffxT48YK399+p1T05drxZBI/vetsVe3mShsYtw7NT0KPfhD7ketN63g==", - "dev": true, - "dependencies": { - "ripemd160": "0.2.0", - "sha.js": "2.1.6" - }, - "engines": { - "node": "*" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-equal": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", - "integrity": "sha512-FXgye2Jr6oEk01S7gmSrHrPEQ1ontR7wwl+nYiZ8h4SXlHVm0DYda74BIPcHz2s2qPz4+375IcAz1vsWLwddgQ==", - "dev": true - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/defined": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", - "integrity": "sha512-zpqiCT8bODLu3QSmLLic8xJnYWBFjOSu/fBCm189oAiTtPq/PSanNACKZDS7kgSyCJY7P+IcODzlIogBK/9RBg==", - "dev": true - }, - "node_modules/deps-sort": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-0.1.2.tgz", - "integrity": "sha512-bF5sJp2YeGQAx+vI3KBQwn6wHHyuCcsrPS0qvqnNLgGF1NrjhdvopP3exfdLLKaFtS6V5K/CMjQLtzR7C3Wa6A==", - "dev": true, - "dependencies": { - "JSONStream": "~0.6.4", - "minimist": "~0.0.1", - "through": "~2.3.4" - }, - "bin": { - "deps-sort": "bin/cmd.js" - } - }, - "node_modules/deps-sort/node_modules/JSONStream": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.6.4.tgz", - "integrity": "sha512-ER8YVJ+Xk4a1g+d8Xq9RFe2rjsUHV9eSRqfwe9DS5J5ga8bKWx4FwXZNWXpGDYchuOfqf4NFmDlwuloqHIj/5A==", - "dev": true, - "dependencies": { - "jsonparse": "0.0.5", - "through": "~2.2.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/deps-sort/node_modules/JSONStream/node_modules/through": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/through/-/through-2.2.7.tgz", - "integrity": "sha512-JIR0m0ybkmTcR8URann+HbwKmodP+OE8UCbsifQDYMLD5J3em1Cdn3MYPpbEd5elGDwmP98T+WbqP/tvzA5Mjg==", - "dev": true - }, - "node_modules/derequire": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/derequire/-/derequire-0.8.0.tgz", - "integrity": "sha512-luNtMBeScoqdoYW+Je4ROWJZjF6TLiNtbuqC/NAvBgXMn/s5SF4AUws9/NOoDnTLu/qg5c9oNZBfwzzQftkyOw==", - "dev": true, - "dependencies": { - "esprima-fb": "^3001.1.0-dev-harmony-fb", - "esrefactor": "~0.1.0", - "estraverse": "~1.5.0" - } - }, - "node_modules/detective": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-3.1.0.tgz", - "integrity": "sha512-BIvQHuiVSRMufK1OnlpeAzVqF2yXD75ZzYIx8XV4VQiJ48chF/MMYAdsz/NkulhZznwb4fAX8vyi5CUc24I2BA==", - "dev": true, - "dependencies": { - "escodegen": "~1.1.0", - "esprima-fb": "3001.1.0-dev-harmony-fb" - } - }, - "node_modules/domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha512-fJ5MoHxe69h3E4/lJtFRhcWwLb04bhIBSfvCEMS1YDH+/9yEZTqBHTSTgch8nCP5tE5k2gdQEjodUqJzy7qJ9Q==", - "dev": true, - "engines": { - "node": ">=0.4", - "npm": ">=1.2" - } - }, - "node_modules/dotignore": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", - "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.4" - }, - "bin": { - "ignored": "bin/ignored" - } - }, - "node_modules/dotignore/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "node_modules/duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", - "dev": true, - "dependencies": { - "readable-stream": "~1.1.9" - } - }, - "node_modules/ecstatic": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/ecstatic/-/ecstatic-0.4.13.tgz", - "integrity": "sha512-dIKJNQulD/Pi//s8H75KRH6gjK23v7E/ZyeW4ssfTMHgboIZiqGstOZZ4kGpeUomJCgZ9Qg8ub1fB2zYBM6cKw==", - "deprecated": "This package is unmaintained and deprecated. See the GH Issue 259.", - "dev": true, - "dependencies": { - "ent": "0.0.x", - "mime": "1.2.x", - "optimist": "~0.3.5" - }, - "bin": { - "ecstatic": "lib/ecstatic.js" - } - }, - "node_modules/ecstatic/node_modules/optimist": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==", - "dev": true, - "dependencies": { - "wordwrap": "~0.0.2" - } - }, - "node_modules/ent": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ent/-/ent-0.0.8.tgz", - "integrity": "sha512-lH6CgAllw9UO8HdUbsl/gqkvcwV230kPxH1wTwLR3Iu5NrUs4F2Q4hPnIshfW9OQzj/sdDgdQtcrUpTMAKF0cQ==", - "dev": true, - "dependencies": { - "punycode": "^1.4.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ent/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true - }, - "node_modules/es-abstract": { - "version": "1.23.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", - "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escodegen": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.1.0.tgz", - "integrity": "sha512-md+WjA8K+DJELEYe0n4XAOE0XbUYfw2rzb8T+nhZ19OnQxlh+0jMLS6d+z2oqWugIh3uYKu1+KJh6QKeoogLzg==", - "dev": true, - "dependencies": { - "esprima": "~1.0.4", - "estraverse": "~1.5.0", - "esutils": "~1.0.0" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=0.4.0" - }, - "optionalDependencies": { - "source-map": "~0.1.30" - } - }, - "node_modules/escope": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/escope/-/escope-0.0.16.tgz", - "integrity": "sha512-3nipzlX/noBWi/vvQSLvifQ4lKalvX570eAVgrbK0TD0Cwlbh3EQ3OpcongoFaD7IeWIaQKsRS16Bt2epx71TQ==", - "dev": true, - "dependencies": { - "estraverse": ">= 0.0.2" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/esprima": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/esprima-fb": { - "version": "3001.1.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz", - "integrity": "sha512-a3RFiCVBiy8KdO6q/C+8BQiP/sRk8XshBU3QHHDP8tNzjYwR3FKBOImu+PXfVhPoZL0JKtJLBAOWlDMCCFY8SQ==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/esrefactor": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/esrefactor/-/esrefactor-0.1.0.tgz", - "integrity": "sha512-QxD1acYl9jmkDI+0xnPcwjhrwiKvfaaAZV5cVXX5uXTSp9uJ7xddqXOfnNPzWP1JoorLwj7OWF+RQOLKh7Vnjw==", - "dev": true, - "dependencies": { - "escope": "~0.0.13", - "esprima": "~1.0.2", - "estraverse": "~0.0.4" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/esrefactor/node_modules/estraverse": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-0.0.4.tgz", - "integrity": "sha512-21DfBCsFJGb3HZr0vEBH1Wk1tGSbbzA8I/xtSSoy/pRtupHv0OgBmObcNGXM3ec6/pOXTOOUYY9/5bfluzz0sw==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/estraverse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", - "integrity": "sha512-FpCjJDfmo3vsc/1zKSeqR5k42tcIhxFIlvq+h9j0fO2q/h2uLKyweq7rYJ+0CoVvrGQOxIS5wyBrW/+vF58BUQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/esutils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", - "integrity": "sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/events": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/events/-/events-1.0.2.tgz", - "integrity": "sha512-XK19KwlDJo8XsceooxNDK1pObtcT44+Xte6V/jQc4a+fHq1qEouThyyX2ePmS0hS8RcCulmRxzg+T8jiLKAFFQ==", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/events-to-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", - "integrity": "sha512-inRWzRY7nG+aXZxBzEqYKB3HPgwflZRopAjDCHv0whhRx+MTUr1ei0ICZUypdyE0HRm4L2d5VEcIqLD6yl+BFA==", - "dev": true - }, - "node_modules/faucet": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/faucet/-/faucet-0.0.4.tgz", - "integrity": "sha512-vSUB+9iT2n77DPv2x3zYEt3rEIGIhVZJmNTfrx3Y0XVXlBiNOPq2jJVOucqkZ6MNHCgVQUZ5xxe78LkkYCRSFg==", - "dev": true, - "dependencies": { - "array.prototype.foreach": "^1.0.4", - "array.prototype.join": "^1.0.1", - "array.prototype.map": "^1.0.5", - "array.prototype.push": "^1.0.3", - "array.prototype.slice": "^1.0.1", - "defined": "^1.0.1", - "duplexer": "^0.1.2", - "minimist": "^1.2.7", - "npm-which": "^1.0.2", - "readable-stream": "^2.3.7", - "safe-regex-test": "^1.0.0", - "sprintf-js": "^1.1.2", - "string.prototype.split": "^1.0.7", - "string.prototype.trim": "^1.2.7", - "tap-parser": "^0.7.0", - "tape": "^5.6.3", - "through2": "^0.2.3" - }, - "bin": { - "faucet": "bin/cmd.js" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/faucet/node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/faucet/node_modules/deep-equal/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/faucet/node_modules/defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/faucet/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/faucet/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/faucet/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/faucet/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/faucet/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/faucet/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/faucet/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/faucet/node_modules/tape": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/tape/-/tape-5.9.0.tgz", - "integrity": "sha512-czbGgxSVwRlbB3Ly/aqQrNwrDAzKHDW/kVXegp4hSFmR2c8qqm3hCgZbUy1+3QAQFGhPDG7J56UsV1uNilBFCA==", - "dev": true, - "dependencies": { - "@ljharb/resumer": "^0.1.3", - "@ljharb/through": "^2.3.13", - "array.prototype.every": "^1.1.6", - "call-bind": "^1.0.7", - "deep-equal": "^2.2.3", - "defined": "^1.0.1", - "dotignore": "^0.1.2", - "for-each": "^0.3.3", - "get-package-type": "^0.1.0", - "glob": "^7.2.3", - "has-dynamic-import": "^2.1.0", - "hasown": "^2.0.2", - "inherits": "^2.0.4", - "is-regex": "^1.1.4", - "minimist": "^1.2.8", - "mock-property": "^1.1.0", - "object-inspect": "^1.13.2", - "object-is": "^1.1.6", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "resolve": "^2.0.0-next.5", - "string.prototype.trim": "^1.2.9" - }, - "bin": { - "tape": "bin/tape" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/faucet/node_modules/through2": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", - "integrity": "sha512-mLa8Bn2mZurjyomGKWRu3Bo2mvoQojFks9NvOK8H+k4kDJNkdEqG522KFZsEFBEl6rKkxTgFbE5+OPcgfvPEHA==", - "dev": true, - "dependencies": { - "readable-stream": "~1.1.9", - "xtend": "~2.1.1" - } - }, - "node_modules/faucet/node_modules/through2/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/faucet/node_modules/through2/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/faucet/node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "node_modules/faucet/node_modules/xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", - "dev": true, - "dependencies": { - "object-keys": "~0.4.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/faucet/node_modules/xtend/node_modules/object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha512-hVb0zwEZwC1FXSKRPFTeOtN7AArJcJlI6ULGLtrstaswKNlrTJqAA+1lYlSUop4vjA423xlBzqfVS3iWGlqJ+g==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "inherits": "2", - "minimatch": "0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-0.0.1.tgz", - "integrity": "sha512-Ulo9uG05SN7r55LqJxpU84yWzVPfJGv+GZSaEnm5mKO/jtwV5KODce9bPEDJh1uoYGJpsy5pKi4dQOdDSFzCvw==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-dynamic-import": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.1.0.tgz", - "integrity": "sha512-su0anMkNEnJKZ/rB99jn3y6lV/J8Ro96hBJ28YAeVzj5rWxH+YL/AdCyiYYA1HDLV9YhmvqpWSJJj2KLo1MX6g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-browserify": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", - "integrity": "sha512-Irf/LJXmE3cBzU1eaR4+NEX6bmVLqt1wkmDiA7kBwH7zmb0D8kBAXsDmQ88hhj/qv9iEZKlyGx/hrMcFi8sOHw==", - "dev": true, - "dependencies": { - "Base64": "~0.2.0", - "inherits": "~2.0.1" - } - }, - "node_modules/https-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha512-EjDQFbgJr1vDD/175UJeSX3ncQ3+RUnCL5NkthQGHvF4VNHlzTy8ifJfTqz47qiPRqaFH58+CbuG3x51WuB1XQ==", - "dev": true - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==", - "dev": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/inline-source-map": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.3.1.tgz", - "integrity": "sha512-RNlldBXZ7BBcVm3HjXIXiwKxih1lnuKbzeLBRDSB/qaqk8/g4JEZBjxpBQMhqEthQyGv7ycu8r/8PKGgBdIqrA==", - "dev": true, - "dependencies": { - "source-map": "~0.3.0" - } - }, - "node_modules/inline-source-map/node_modules/source-map": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz", - "integrity": "sha512-jz8leTIGS8+qJywWiO9mKza0hJxexdeIYXhDHw9avTQcXSNAGk3hiiRMpmI2Qf9dOrZDrDpgH9VNefzuacWC9A==", - "dev": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/insert-module-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-6.0.0.tgz", - "integrity": "sha512-4enFV8Caao6e6ezxe6/2JrLjwLka7adyvyOM39Lird3Z8aOboAY+uCs/RSbwSbVVhzZF/OQMw4h/5KbOB+eo2w==", - "dev": true, - "dependencies": { - "concat-stream": "~1.4.1", - "JSONStream": "~0.7.1", - "lexical-scope": "~1.1.0", - "process": "~0.6.0", - "through": "~2.3.4", - "xtend": "^3.0.0" - }, - "bin": { - "insert-module-globals": "bin/cmd.js" - } - }, - "node_modules/insert-module-globals/node_modules/JSONStream": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.7.4.tgz", - "integrity": "sha512-hVgF0Ox1AtvxJmpwzb2dOEUz2ms1J8DZVbqKUSIGSyPBPy0MuxCJsQxj8y5dadTzsjI+T4TpyyhXORPdz15m9w==", - "dev": true, - "dependencies": { - "jsonparse": "0.0.5", - "through": ">=2.2.7 <3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/insert-module-globals/node_modules/process": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/process/-/process-0.6.0.tgz", - "integrity": "sha512-wKdRDRIisD/dfTBK678QFFEwi1oI5Q8U4JCu4lJSRZn7QlTilsXXlE/JytTY5xA8bAIADkwXaU8Vt6zE8ClzVw==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-array/-/is-array-1.0.1.tgz", - "integrity": "sha512-gxiZ+y/u67AzpeFmAmo4CbtME/bs7J2C++su5zQzvQyaxUqVzkh69DI+jN+KZuSO6JaH6TIIU6M6LhqxMjxEpw==", - "dev": true - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "dev": true, - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/js-yaml/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jsonify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", - "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/jsonparse": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", - "integrity": "sha512-fw7Q/8gFR8iSekUi9I+HqWIap6mywuoe7hQIg3buTVjuZgALKj4HAmm0X6f+TaL4c9NJbvyFQdaI2ppr5p6dnQ==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/JSONStream": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", - "integrity": "sha512-l0NN3IcqrZfZBJp7JWDJIHsnPV7yzJWqsYxQzL8Fwdx1BmEMjLuvtYkv+P9pbvpyfP75/f4MeDZhWNU4is32uA==", - "dev": true, - "dependencies": { - "jsonparse": "0.0.5", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "index.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lexical-scope": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.1.1.tgz", - "integrity": "sha512-g7yj6l+qIPeVUruqnF1WQ7D4naBvMMY5+1a4B8l7AbJVHGb93AdEB7nk9uVciwFo+Y+SxKW1ZmEXjTuuZEiyYQ==", - "dev": true, - "dependencies": { - "astw": "^2.0.0" - } - }, - "node_modules/longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ==", - "dev": true - }, - "node_modules/mime": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "integrity": "sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==", - "dev": true - }, - "node_modules/minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha512-WFX1jI1AaxNTZVOHLBVazwTWKaQjoykSzCBNXB72vDTCzopQGtyP91tKdFK5cv1+qMwPyiTu1HqUriqplI8pcA==", - "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", - "dev": true, - "dependencies": { - "lru-cache": "2", - "sigmund": "~1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dev": true - }, - "node_modules/mock-property": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mock-property/-/mock-property-1.1.0.tgz", - "integrity": "sha512-1/JjbLoGwv87xVsutkX0XJc0M0W4kb40cZl/K41xtTViBOD9JuFPKfyMNTrLJ/ivYAd0aPqu/vduamXO0emTFQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "functions-have-names": "^1.2.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "hasown": "^2.0.2", - "isarray": "^2.0.5", - "object-inspect": "^1.13.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mock-property/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/module-deps": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-2.1.5.tgz", - "integrity": "sha512-5xDKabxJZpz8+NsSeSmHxr6ZUwsbrtG2zdKUOyj/9RNOKFF4HFSOnWH8ZJWbLJO1F3pDcpj6dmpvPXIiJIydBg==", - "dev": true, - "dependencies": { - "browser-resolve": "~1.2.4", - "concat-stream": "~1.4.5", - "detective": "~3.1.0", - "duplexer2": "0.0.2", - "inherits": "~2.0.1", - "JSONStream": "~0.7.1", - "minimist": "~0.0.9", - "parents": "0.0.2", - "readable-stream": "^1.0.27-1", - "resolve": "~0.6.3", - "stream-combiner": "~0.1.0", - "subarg": "0.0.1", - "through2": "~0.4.1" - }, - "bin": { - "module-deps": "bin/cmd.js" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/module-deps/node_modules/browser-resolve": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.2.4.tgz", - "integrity": "sha512-z8CRZZEv/MVAuJ9u9/LwzAcGswFtWbdAHh8f8ZkHgThUb88rBZbpwoxYZaQnmbAxvCoOA1gFIONrspStOhldkg==", - "dev": true, - "dependencies": { - "resolve": "0.6.3" - } - }, - "node_modules/module-deps/node_modules/JSONStream": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.7.4.tgz", - "integrity": "sha512-hVgF0Ox1AtvxJmpwzb2dOEUz2ms1J8DZVbqKUSIGSyPBPy0MuxCJsQxj8y5dadTzsjI+T4TpyyhXORPdz15m9w==", - "dev": true, - "dependencies": { - "jsonparse": "0.0.5", - "through": ">=2.2.7 <3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/module-deps/node_modules/object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==", - "dev": true - }, - "node_modules/module-deps/node_modules/parents": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/parents/-/parents-0.0.2.tgz", - "integrity": "sha512-yrIRMwRkp5H3d6X9f8Pohz4wtiHnn+KTccwE5kj0Q4Tx1i3FIeZCY7avrxVPcDt6Bm+8Mv0Me6yPLbhB+QNGOg==", - "dev": true - }, - "node_modules/module-deps/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/module-deps/node_modules/resolve": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", - "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==", - "dev": true - }, - "node_modules/module-deps/node_modules/stream-combiner": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.1.0.tgz", - "integrity": "sha512-/RD3Tuc5XWyB2zLMO1kZlSUC7Pogi64BoYPDbAHEkFJNt5RKmRmsrEU3Kpr0hNxQ1p/KlUWBeJflr5zLtmdYGw==", - "dev": true, - "dependencies": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "node_modules/module-deps/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "node_modules/module-deps/node_modules/through2": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", - "integrity": "sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==", - "dev": true, - "dependencies": { - "readable-stream": "~1.0.17", - "xtend": "~2.1.1" - } - }, - "node_modules/module-deps/node_modules/xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", - "dev": true, - "dependencies": { - "object-keys": "~0.4.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/npm-path": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-1.1.0.tgz", - "integrity": "sha512-wsL+YXGWlE3DWEqhpgKdt0RWxQrHKpVZ5u6uDYFSpxrxKYVPOctOun8q77VwD02zPTQD4wkc35elWPcocaICag==", - "dev": true, - "dependencies": { - "which": "^1.2.4" - }, - "bin": { - "npm-path": "bin/npm-path" - } - }, - "node_modules/npm-which": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-1.0.2.tgz", - "integrity": "sha512-y1s2PrTct2DuRudZNyu4+l4HteWFzaHcN+mMtA54htjA8xIzYza9casIqUdf+/Lqb4Zg2harBpCxBUt83Dwnuw==", - "dev": true, - "dependencies": { - "commander": "^2.2.0", - "npm-path": "^1.0.0", - "which": "^1.0.5" - }, - "bin": { - "npm-which": "bin/npm-which.js" - } - }, - "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", - "dev": true, - "dependencies": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "node_modules/ordered-emitter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ordered-emitter/-/ordered-emitter-0.1.1.tgz", - "integrity": "sha512-0IVH1dx0jn7yXAsGb9gXN/YeGgN0vInK8UjCG4r0p+WhkUpf63jvjQt2XNGLmcrkUfnLBb6CIvnXsY4Jh4Ytkw==", - "dev": true - }, - "node_modules/os-browserify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", - "integrity": "sha512-aZicJZccvxWOZ0Bja2eAch2L8RIJWBuRYmM8Gwl/JjNtRltH0Itcz4eH/ESyuIWfse8cc93ZCf0XrzhXK2HEDA==", - "dev": true - }, - "node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", - "dev": true - }, - "node_modules/parents": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/parents/-/parents-0.0.3.tgz", - "integrity": "sha512-ASkdjFPS2nrxujzSBZGt8ZCKeG0/K2ZZVKveqXt7XGtXfu+ssnk4DQhnK91KRvt83f36LjfxOfwi0cv1+Re0eA==", - "dev": true, - "dependencies": { - "path-platform": "^0.0.1" - } - }, - "node_modules/path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-platform": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.0.1.tgz", - "integrity": "sha512-ydK1VKZFYwy0mT2JvimJfxt5z6Z6sjBbLfsFMoJczbwZ/ul0AjgpXLHinUzclf4/XYC8mtsWGuFERZ95Rnm8wA==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/plist": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/plist/-/plist-0.2.1.tgz", - "integrity": "sha512-tVUIDXgjyBNU23Yq8YQqJZ++u6Uj4DDHmeusiyB1neGzIit7wjuZO7SKnPvlPO4QDiEE9KutDY5ABz/Makrn4Q==", - "dev": true, - "dependencies": { - "sax": "0.1.x" - }, - "engines": { - "node": ">= 0.1.100" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/process": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/process/-/process-0.7.0.tgz", - "integrity": "sha512-zJYE4ZXy79hFghxwR6iYQfa6u6hU/790qdv0QKnU5RhUYYDmX0XwPGwGUARR4JGZcIiidlh3q+rjqUNEDlg7nw==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, - "node_modules/punycode": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.2.4.tgz", - "integrity": "sha512-h/vscxLPvI2l7k/0dFUKZ5I5TgMCJ/Pl+J6rw77PDuQM6UApf/GaRVkjv/YSm2k+fbp7Yw8dxsoe29DolT7h7w==", - "dev": true, - "engines": [ - "node", - "rhino" - ] - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/readable-stream/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", - "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/resolve": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.7.4.tgz", - "integrity": "sha512-zxmAcifDjKxmUbk7chQdKhDSn8ml08g+MYyU37xhEXBp+N81cfbYsm4e0Gn9jtLbAvbR8w8Ox09xqUZtPuCoeA==", - "dev": true - }, - "node_modules/resumer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w==", - "dev": true, - "dependencies": { - "through": "~2.3.4" - } - }, - "node_modules/rfile": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rfile/-/rfile-1.0.0.tgz", - "integrity": "sha512-aNeTpY8g6DYmqPvakau22B0SipQTskO8FtYXzn8qg4X4bN9ExIH8VAhq/L9w7N8HvESYeSSwk3e4GmW+rLLAxQ==", - "dev": true, - "dependencies": { - "callsite": "~1.0.0", - "resolve": "~0.3.0" - } - }, - "node_modules/rfile/node_modules/resolve": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.3.1.tgz", - "integrity": "sha512-mxx/I/wLjxtryDBtrrb0ZNzaYERVWaHpJ0W0Arm8N4l8b+jiX/U5yKcsj0zQpF9UuKN1uz80EUTOudON6OPuaQ==", - "dev": true - }, - "node_modules/right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", - "dev": true, - "dependencies": { - "align-text": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ripemd160": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-0.2.0.tgz", - "integrity": "sha512-JJsJ74Mw4sUDDisXGDnNNyN9xWmt5HcH6Kwvb/0m/IvTKjnLAtZfzeoLdpxk44AxQZki54oCCd+Kt0nPQ2AF2g==", - "dev": true - }, - "node_modules/ruglify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ruglify/-/ruglify-1.0.0.tgz", - "integrity": "sha512-XfRj1YJdm/gnZNvmpQ5L+2YGRHglDGMPgJRbitgCxC3GzKVQF/t+ij1aNcNg2AnEXGtLHJDwoSWrAq3TUm0EVg==", - "dev": true, - "dependencies": { - "rfile": "~1.0", - "uglify-js": "~2.2" - } - }, - "node_modules/ruglify/node_modules/optimist": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==", - "dev": true, - "dependencies": { - "wordwrap": "~0.0.2" - } - }, - "node_modules/ruglify/node_modules/uglify-js": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", - "integrity": "sha512-viLk+/8G0zm2aKt1JJAVcz5J/5ytdiNaIsKgrre3yvSUjwVG6ZUujGH7E2TiPigZUwLYCe7eaIUEP2Zka2VJPA==", - "dev": true, - "dependencies": { - "optimist": "~0.3.5", - "source-map": "~0.1.7" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sax": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.1.5.tgz", - "integrity": "sha512-w+8N4kgEKvjp/f5wpSPE62jrNN/839sGE0pa3+oZUjEFGiV/VbA3moJN7VxFnPuZnjI770VSMaYwGzU/SsIHdQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/sha.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.1.6.tgz", - "integrity": "sha512-l1th5h1wxFv/nXn81ZxQWM+yafIB6F40FrQuI9N5jUsU0nYQC/vrmQQky7AR9HHCfimR060tD05V1zMUIvRsZA==", - "dev": true, - "dependencies": { - "buffer": "~2.3.2" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/sha.js/node_modules/buffer": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-2.3.4.tgz", - "integrity": "sha512-MNqufiw8CQ3yoNU7qRiccXWFd4NlelGBNTJYbauYlOCj+0SEJOIsvvrlhSopsoW0FxZAAq4yXO53I/VREIaGKQ==", - "deprecated": "This version of 'buffer' is out-of-date. You must update to v2.8.3 or newer", - "dev": true, - "dependencies": { - "base64-js": "~0.0.4", - "ieee754": "~1.1.1" - } - }, - "node_modules/sha.js/node_modules/ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "node_modules/shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shell-quote": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-0.0.1.tgz", - "integrity": "sha512-uEWz7wa9vnCi9w4mvKZMgbHFk3DCKjLQlZcy0tJxUH4NwZjRrPPHXAYIEt2TmJs600Dcgj0Z3fZLZKVPVdGNbQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", - "dev": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/stream-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-1.0.0.tgz", - "integrity": "sha512-e+V5xc4LlkOiRr64kZTUdb11exsbpSnwb9uwmXaHeDXCpfHg7vaefMJOxi21Pe74ZOqjZ87blBcqqpNAM4Ku0g==", - "dev": true, - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^1.0.27-1" - } - }, - "node_modules/stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", - "dev": true, - "dependencies": { - "duplexer": "~0.1.1" - } - }, - "node_modules/string_decoder": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.0.1.tgz", - "integrity": "sha512-nWi0z/o2vMFV7SJoJDEGqCUPfcpdC/hzCNnbHWhzt6SenBdJ3vVK0aeZuqnVVQ8fPci2h2WXIL6N3O+OJHJhZA==", - "dev": true - }, - "node_modules/string.prototype.split": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.split/-/string.prototype.split-1.0.9.tgz", - "integrity": "sha512-chFmJKYnperPnXRDYVwW3u2/ZnrQh4f6ONkhuzgayT/099jD+NJSXvh2qXmPn9tn7STk2cgAI5IOl4YlojWvwg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-regex": "^1.1.4", - "regexp.prototype.flags": "^1.5.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/subarg": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-0.0.1.tgz", - "integrity": "sha512-6HUY31sAPDdNBT4Gy1c2a2mfpzRiFPMOsR9eQkqO2ZMIVL11mPzywLgsSSGYJ+UVidEfds6XEsh4RnZiDbM60A==", - "dev": true, - "dependencies": { - "minimist": "~0.0.7" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/syntax-error": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", - "dev": true, - "dependencies": { - "acorn-node": "^1.2.0" - } - }, - "node_modules/tap-browser-color": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tap-browser-color/-/tap-browser-color-0.1.2.tgz", - "integrity": "sha512-W1rZGYGNQtMJ4AyTzR2w3dJuxzk6iEnT4XGDrPgolDV9nCAIAhNWdvJ8rasdsSceWnWleSgsVmXCtsJxXwNcOw==", - "dev": true - }, - "node_modules/tap-parser": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-0.7.0.tgz", - "integrity": "sha512-eg6Vt2kTjxJyjrt1luqrMD6jbOM2W5MCZ53ci6+9K97f/aQFI0R/01l70hTES66fTuqhMkNQQGjZESz+/7wsGA==", - "dev": true, - "dependencies": { - "inherits": "~2.0.1", - "minimist": "^0.2.0", - "readable-stream": "~1.1.11" - }, - "bin": { - "tap-parser": "bin/cmd.js" - } - }, - "node_modules/tap-parser/node_modules/minimist": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.4.tgz", - "integrity": "sha512-Pkrrm8NjyQ8yVt8Am9M+yUt74zE3iokhzbG1bFVNjLB92vwM71hf40RkEsryg98BujhVOncKm/C1xROxZ030LQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tape": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/tape/-/tape-2.14.1.tgz", - "integrity": "sha512-kh37Wjs0ZkZY3Pd73v67GDjOhPFvnu7lHiqAgFfkblD96M4HqrI8ldk4/Q+3h+eKKNvLhZ3kk7ppO+AmYJNthQ==", - "dev": true, - "dependencies": { - "deep-equal": "~0.2.0", - "defined": "~0.0.0", - "glob": "^3.2.9", - "has": "~0.0.1", - "inherits": "^2.0.1", - "object-inspect": "^1.0.0", - "resumer": "~0.0.0", - "through": "^2.3.4" - }, - "bin": { - "tape": "bin/tape" - } - }, - "node_modules/testling": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/testling/-/testling-1.7.7.tgz", - "integrity": "sha512-2VeY2XwMzmtHp+fBmbufq9+o9tNMcBJ1wI7JawayNPI+tsWPgzsZ3N24vAPbGY6UyOS2+bRMhJtZq+QybWeZ2g==", - "dev": true, - "dependencies": { - "@tapjs/tap-finished": "^0.0.3", - "bouncy": "^3.2.2", - "browser-launcher": "^1.0.2", - "browserify": "^3.46.1", - "concat-stream": "^1.6.2", - "cross-spawn": "^5.1.0", - "ecstatic": "^0.4.13", - "ent": "^0.0.8", - "glob": "^3.2.11", - "jsonify": "^0.0.1", - "object-inspect": "^1.13.2", - "optimist": "^0.6.1", - "resolve": "^2.0.0-next.5", - "shallow-copy": "^0.0.1", - "shell-quote": "^1.8.1", - "xhr-write-stream": "^0.1.2" - }, - "bin": { - "testling": "bin/cmd.js" - }, - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/testling/node_modules/acorn": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", - "integrity": "sha512-pXK8ez/pVjqFdAgBkF1YPVRacuLQ9EXBKaKWaeh58WNfMkCmZhOZzu+NtKSPD5PHmCCHheQ5cD29qM1K4QTxIg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/testling/node_modules/browser-resolve": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.2.4.tgz", - "integrity": "sha512-z8CRZZEv/MVAuJ9u9/LwzAcGswFtWbdAHh8f8ZkHgThUb88rBZbpwoxYZaQnmbAxvCoOA1gFIONrspStOhldkg==", - "dev": true, - "dependencies": { - "resolve": "0.6.3" - } - }, - "node_modules/testling/node_modules/browser-resolve/node_modules/resolve": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", - "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==", - "dev": true - }, - "node_modules/testling/node_modules/browserify": { - "version": "3.46.1", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-3.46.1.tgz", - "integrity": "sha512-hHl4EM5OgFxTqdWx7fL1FXjqIRpeR7Et9OroBcG/NSZgt9Zgn/37xeHdgJE5OXbnIksow2Et19xQcj/GzfETgw==", - "dev": true, - "dependencies": { - "assert": "~1.1.0", - "browser-pack": "~2.0.0", - "browser-resolve": "~1.2.1", - "browserify-zlib": "~0.1.2", - "buffer": "~2.1.4", - "builtins": "~0.0.3", - "commondir": "0.0.1", - "concat-stream": "~1.4.1", - "console-browserify": "~1.0.1", - "constants-browserify": "~0.0.1", - "crypto-browserify": "~1.0.9", - "deep-equal": "~0.1.0", - "defined": "~0.0.0", - "deps-sort": "~0.1.1", - "derequire": "~0.8.0", - "domain-browser": "~1.1.0", - "duplexer": "~0.1.1", - "events": "~1.0.0", - "glob": "~3.2.8", - "http-browserify": "~1.3.1", - "https-browserify": "~0.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "~6.0.0", - "JSONStream": "~0.7.1", - "module-deps": "~2.0.0", - "os-browserify": "~0.1.1", - "parents": "~0.0.1", - "path-browserify": "~0.0.0", - "process": "^0.7.0", - "punycode": "~1.2.3", - "querystring-es3": "0.2.0", - "resolve": "~0.6.1", - "shallow-copy": "0.0.1", - "shell-quote": "~0.0.1", - "stream-browserify": "~0.1.0", - "stream-combiner": "~0.0.2", - "string_decoder": "~0.0.0", - "subarg": "0.0.1", - "syntax-error": "~1.1.0", - "through2": "~0.4.1", - "timers-browserify": "~1.0.1", - "tty-browserify": "~0.0.0", - "umd": "~2.0.0", - "url": "~0.10.1", - "util": "~0.10.1", - "vm-browserify": "~0.0.1", - "xtend": "^3.0.0" - }, - "bin": { - "browserify": "bin/cmd.js" - } - }, - "node_modules/testling/node_modules/browserify/node_modules/concat-stream": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.11.tgz", - "integrity": "sha512-X3JMh8+4je3U1cQpG87+f9lXHDrqcb2MVLg9L7o8b1UZ0DzhRrUpdn65ttzu10PpJPPI3MQNkis+oha6TSA9Mw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "~1.1.9", - "typedarray": "~0.0.5" - } - }, - "node_modules/testling/node_modules/browserify/node_modules/resolve": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", - "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==", - "dev": true - }, - "node_modules/testling/node_modules/browserify/node_modules/shell-quote": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-0.0.1.tgz", - "integrity": "sha512-uEWz7wa9vnCi9w4mvKZMgbHFk3DCKjLQlZcy0tJxUH4NwZjRrPPHXAYIEt2TmJs600Dcgj0Z3fZLZKVPVdGNbQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/testling/node_modules/buffer": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-2.1.13.tgz", - "integrity": "sha512-MBwiv6k5+FIvbBMZSCn8ol6hzf//muWr8CuIFEZK3KhSQbClDcm99ayh9mEuZXcOTE9Y3J6wC+iOQyVbpMFmEQ==", - "deprecated": "This version of 'buffer' is out-of-date. You must update to v2.8.3 or newer", - "dev": true, - "dependencies": { - "base64-js": "~0.0.4", - "ieee754": "~1.1.1" - } - }, - "node_modules/testling/node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/testling/node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/testling/node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/testling/node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/testling/node_modules/console-browserify": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.0.3.tgz", - "integrity": "sha512-mIy/TXtcNHCzckiUr4f8m9MSQkG2rjvtI7QAK5vM7VdSlCjZqsoYUkcx9NaLEFuKBYJqd5+hLKj/YCo33heXOQ==", - "dev": true - }, - "node_modules/testling/node_modules/crypto-browserify": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-1.0.9.tgz", - "integrity": "sha512-fWmkaZPmccreTmANMdpvI0UrF34pzTAZDLKDcF0n5ThwpyeAs+DtSVxyhrZc6kHFiOFdyzjW5uZ8jAWE3kNY6A==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/testling/node_modules/deep-equal": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.1.2.tgz", - "integrity": "sha512-rUCt39nKM7s6qUyYgp/reJmtXjgkOS/JbLO24DioMZaBNkD3b7C7cD3zJjSyjclEElNTpetAIRD6fMIbBIbX1Q==", - "dev": true - }, - "node_modules/testling/node_modules/http-browserify": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.3.2.tgz", - "integrity": "sha512-RVXRJV5BchDT1obHNo0lCrso0hL56fpjDGknM8Z5OWvZQysZY7pHM5shsmnKyTLLdKNou6sJ1p5a7zo/BLF95g==", - "dev": true, - "dependencies": { - "Base64": "~0.2.0", - "inherits": "~2.0.1" - } - }, - "node_modules/testling/node_modules/ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "node_modules/testling/node_modules/JSONStream": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.7.4.tgz", - "integrity": "sha512-hVgF0Ox1AtvxJmpwzb2dOEUz2ms1J8DZVbqKUSIGSyPBPy0MuxCJsQxj8y5dadTzsjI+T4TpyyhXORPdz15m9w==", - "dev": true, - "dependencies": { - "jsonparse": "0.0.5", - "through": ">=2.2.7 <3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/testling/node_modules/module-deps": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-2.0.6.tgz", - "integrity": "sha512-k1pfAH9sicjEbMnj2fkorHZgwZ1PQ6OzgiYVq3jYtk/u7S8qkERjYXin+iY8FQSGdNAdqXGTHi7aHyGKBSSUng==", - "dev": true, - "dependencies": { - "browser-resolve": "~1.2.4", - "concat-stream": "~1.4.5", - "detective": "~3.1.0", - "duplexer2": "0.0.2", - "inherits": "~2.0.1", - "JSONStream": "~0.7.1", - "minimist": "~0.0.9", - "parents": "0.0.2", - "readable-stream": "^1.0.27-1", - "resolve": "~0.6.3", - "stream-combiner": "~0.1.0", - "through2": "~0.4.1" - }, - "bin": { - "module-deps": "cmd.js" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/testling/node_modules/module-deps/node_modules/concat-stream": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.11.tgz", - "integrity": "sha512-X3JMh8+4je3U1cQpG87+f9lXHDrqcb2MVLg9L7o8b1UZ0DzhRrUpdn65ttzu10PpJPPI3MQNkis+oha6TSA9Mw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "~1.1.9", - "typedarray": "~0.0.5" - } - }, - "node_modules/testling/node_modules/module-deps/node_modules/resolve": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", - "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==", - "dev": true - }, - "node_modules/testling/node_modules/module-deps/node_modules/stream-combiner": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.1.0.tgz", - "integrity": "sha512-/RD3Tuc5XWyB2zLMO1kZlSUC7Pogi64BoYPDbAHEkFJNt5RKmRmsrEU3Kpr0hNxQ1p/KlUWBeJflr5zLtmdYGw==", - "dev": true, - "dependencies": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "node_modules/testling/node_modules/object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==", - "dev": true - }, - "node_modules/testling/node_modules/parents": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/parents/-/parents-0.0.2.tgz", - "integrity": "sha512-yrIRMwRkp5H3d6X9f8Pohz4wtiHnn+KTccwE5kj0Q4Tx1i3FIeZCY7avrxVPcDt6Bm+8Mv0Me6yPLbhB+QNGOg==", - "dev": true - }, - "node_modules/testling/node_modules/querystring-es3": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.0.tgz", - "integrity": "sha512-YODXTP5RSWoSsx4Dyqql8/akWHprR7hQhIbp0STp7JRjWKxwR1vZtVtREXcI3qRh1Jsi5lm15Q/y0GO1OvxEIA==", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/testling/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/testling/node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/testling/node_modules/source-map": { - "version": "0.1.34", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", - "integrity": "sha512-yfCwDj0vR9RTwt3pEzglgb3ZgmcXHt6DjG3bjJvzPwTL+5zDQ2MhmSzAcTy0GTiQuCiriSWXvWM1/NhKdXuoQA==", - "dev": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/testling/node_modules/stream-browserify": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-0.1.3.tgz", - "integrity": "sha512-kSJCt45VQx5NFfb7pedoQPWSaIDilq74p7H6qlofTB1oj70QKA3OtO9bQbYSBFW40LbF+3/Lgp7rjZt8s+rdKw==", - "dev": true, - "dependencies": { - "inherits": "~2.0.1", - "process": "~0.5.1" - } - }, - "node_modules/testling/node_modules/stream-browserify/node_modules/process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha512-oNpcutj+nYX2FjdEW7PGltWhXulAnFlM0My/k48L90hARCOJtvBbQXc/6itV2jDvU5xAAtonP+r6wmQgCcbAUA==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/testling/node_modules/syntax-error": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.1.6.tgz", - "integrity": "sha512-PR60b6QEsF95amTCi4TwqwH+FRTLjg90DOHiHBgvtauFafhnc8sDT4fXnNEXAbke1cCqrrJGDbFRlwSmo50mOQ==", - "dev": true, - "dependencies": { - "acorn": "^2.7.0" - } - }, - "node_modules/testling/node_modules/through2": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", - "integrity": "sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==", - "dev": true, - "dependencies": { - "readable-stream": "~1.0.17", - "xtend": "~2.1.1" - } - }, - "node_modules/testling/node_modules/through2/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/testling/node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "node_modules/testling/node_modules/through2/node_modules/xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", - "dev": true, - "dependencies": { - "object-keys": "~0.4.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/testling/node_modules/timers-browserify": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.0.3.tgz", - "integrity": "sha512-cD8NV/kFxuEuDNT6Aq9mw1KYiWVCegdjSYDA0w9LFXd8bkj7JgMWH71b61dYoQbt48GTtG1eLzx7nSkWTYJhhw==", - "dev": true, - "dependencies": { - "process": "~0.5.1" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/testling/node_modules/timers-browserify/node_modules/process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha512-oNpcutj+nYX2FjdEW7PGltWhXulAnFlM0My/k48L90hARCOJtvBbQXc/6itV2jDvU5xAAtonP+r6wmQgCcbAUA==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/testling/node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "node_modules/testling/node_modules/uglify-js": { - "version": "2.4.24", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", - "integrity": "sha512-tktIjwackfZLd893KGJmXc1hrRHH1vH9Po3xFh1XBjjeGAnN02xJ3SuoA+n1L29/ZaCA18KzCFlckS+vfPugiA==", - "dev": true, - "dependencies": { - "async": "~0.2.6", - "source-map": "0.1.34", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.5.4" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/testling/node_modules/umd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/umd/-/umd-2.0.0.tgz", - "integrity": "sha512-SlVMYqNP+wxDKiH8Agjsmnuu/Rx1DJOLU7CzbJqUlzeoueskRj+tJlisLAdSoiMFvKj0tYwcl95xoA31+HSgHg==", - "dev": true, - "dependencies": { - "rfile": "~1.0.0", - "ruglify": "~1.0.0", - "through": "~2.3.4", - "uglify-js": "~2.4.0" - }, - "bin": { - "umd": "bin/cli.js" - } - }, - "node_modules/testling/node_modules/wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/testling/node_modules/yargs": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", - "integrity": "sha512-5j382E4xQSs71p/xZQsU1PtRA2HXPAjX0E0DkoGLxwNASMOKX6A9doV1NrZmj85u2Pjquz402qonBzz/yLPbPA==", - "dev": true, - "dependencies": { - "camelcase": "^1.0.2", - "decamelize": "^1.0.0", - "window-size": "0.1.0", - "wordwrap": "0.0.2" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/through2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", - "integrity": "sha512-zEbpaeSMHxczpTzO1KkMHjBC1enTA68ojeaZGG4toqdASpb9t4xUZaYFBq2/9OHo5nTGFVSYd4c910OR+6wxbQ==", - "dev": true, - "dependencies": { - "readable-stream": ">=1.1.13-1 <1.2.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "node_modules/through2/node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==", - "dev": true, - "dependencies": { - "process": "~0.11.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/timers-browserify/node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz", - "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.7.tgz", - "integrity": "sha512-ueeb9YybpjhivjbHP2LdFDAjbS948fGEPj+ACAMs4xCMmh72OCOMQWBQKlaN4ZNQ04yfLSDLSx1tGRIoWimObQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", - "dev": true, - "dependencies": { - "source-map": "~0.5.1", - "yargs": "~3.10.0" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - }, - "optionalDependencies": { - "uglify-to-browserify": "~1.0.0" - } - }, - "node_modules/uglify-js/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", - "dev": true - }, - "node_modules/umd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/umd/-/umd-2.1.0.tgz", - "integrity": "sha512-mEAJeceExHnblcAwN3BQtDPYOrTy4ALeBh6nQ9KW0cUCd0UU714jAfil2jvq09b67IizwJIiTVFOjE+/52Dyvw==", - "dev": true, - "dependencies": { - "rfile": "~1.0.0", - "ruglify": "~1.0.0", - "through": "~2.3.4", - "uglify-js": "~2.4.0" - }, - "bin": { - "umd": "bin/cli.js" - } - }, - "node_modules/umd/node_modules/source-map": { - "version": "0.1.34", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", - "integrity": "sha512-yfCwDj0vR9RTwt3pEzglgb3ZgmcXHt6DjG3bjJvzPwTL+5zDQ2MhmSzAcTy0GTiQuCiriSWXvWM1/NhKdXuoQA==", - "dev": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/umd/node_modules/uglify-js": { - "version": "2.4.24", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", - "integrity": "sha512-tktIjwackfZLd893KGJmXc1hrRHH1vH9Po3xFh1XBjjeGAnN02xJ3SuoA+n1L29/ZaCA18KzCFlckS+vfPugiA==", - "dev": true, - "dependencies": { - "async": "~0.2.6", - "source-map": "0.1.34", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.5.4" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/umd/node_modules/wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/umd/node_modules/yargs": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", - "integrity": "sha512-5j382E4xQSs71p/xZQsU1PtRA2HXPAjX0E0DkoGLxwNASMOKX6A9doV1NrZmj85u2Pjquz402qonBzz/yLPbPA==", - "dev": true, - "dependencies": { - "camelcase": "^1.0.2", - "decamelize": "^1.0.0", - "window-size": "0.1.0", - "wordwrap": "0.0.2" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", - "dev": true - }, - "node_modules/util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha512-NyZNR3WDah+NPkjh/YmhuWSsT4a0mF0BJYgUmvrJ70zxjTXh5Y2Asobxlh0Nfs0PCFB5FVpRJft7NozAWFMwLQ==", - "dev": true, - "dependencies": { - "indexof": "0.0.1" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/xhr-write-stream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/xhr-write-stream/-/xhr-write-stream-0.1.2.tgz", - "integrity": "sha512-KLYqF/tkuGjHovIX5GjPPas+Ij1xxnIJG3v4Z73hQhKErm5rOqZSLV0lYxigPueDCOogf9jbey5WXrkPtr8gLQ==", - "dev": true, - "dependencies": { - "concat-stream": "~0.1.0", - "ordered-emitter": "~0.1.0" - } - }, - "node_modules/xhr-write-stream/node_modules/concat-stream": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-0.1.1.tgz", - "integrity": "sha512-1CHCCGbRAxvBHGGxNvED9ph+M90ZjquE0QhJHkr4aIf9+u85zIvcwRk/sF2HW4rZflt9Q97DFIJh5E4rM5eDwA==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ] - }, - "node_modules/xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - }, - "node_modules/yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", - "dev": true, - "dependencies": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } -} diff --git a/src/tweetnacl/package.json b/src/tweetnacl/package.json deleted file mode 100644 index b4713f18b..000000000 --- a/src/tweetnacl/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "name": "tweetnacl", - "version": "0.12.2", - "description": "Port of TweetNaCl cryptographic library to JavaScript", - "main": "nacl.js", - "directories": { - "test": "test" - }, - "scripts": { - "build": "uglifyjs nacl.js -c -m -o nacl.min.js && uglifyjs nacl-fast.js -c -m -o nacl-fast.min.js", - "test": "tape test/*.js | faucet", - "testall": "make -C test/c && tape test/*.js test/c/*.js | faucet", - "browser": "browserify test/browser/init.js test/*.js | uglifyjs -c -m -o test/browser/_bundle.js 2>/dev/null", - "browser-quick": "browserify test/browser/init.js test/*.quick.js | uglifyjs -c -m -o test/browser/_bundle-quick.js 2>/dev/null", - "testling": "browserify test/browser/testling_init.js test/*.js | testling | faucet", - "firefox": "browserify test/browser/testling_init.js test/*.js | testling -x firefox | faucet", - "chrome": "browserify test/browser/testling_init.js test/*.js | testling -x google-chrome | faucet", - "bench": "node test/benchmark/bench.js" - }, - "testling": { - "files": "test/*.js", - "browsers": [ - "ie/11..latest", - "chrome/22..latest", - "firefox/16..latest", - "safari/latest", - "opera/11.0..latest", - "iphone/6..latest", - "ipad/6..latest", - "android-browser/latest" - ] - }, - "repository": { - "type": "git", - "url": "https://github.com/dchest/tweetnacl-js.git" - }, - "keywords": [ - "crypto", - "cryptography", - "curve25519", - "ed25519", - "encrypt", - "hash", - "key", - "nacl", - "poly1305", - "public", - "salsa20", - "signatures" - ], - "author": "TweetNaCl-js contributors", - "license": "Public domain", - "bugs": { - "url": "https://github.com/dchest/tweetnacl-js/issues" - }, - "homepage": "https://dchest.github.io/tweetnacl-js", - "devDependencies": { - } -} diff --git a/src/worker/store.ts b/src/worker/store.ts index e02087423..2d2e32227 100644 --- a/src/worker/store.ts +++ b/src/worker/store.ts @@ -1,6 +1,6 @@ -import nacl from 'tweetnacl/nacl-fast'; +//import nacl from 'tweetnacl/nacl-fast'; import { Module } from './types'; -import { TestModule, TestModuleObject } from './modules/test'; +//import { TestModule, TestModuleObject } from './modules/test'; import { Account } from './components/account'; diff --git a/tsconfig.json b/tsconfig.json index 1fe96fa51..2b80358a4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,7 @@ "target": "es6", "lib": ["ES2017", "DOM", "ES2020"], "moduleResolution": "node", - "outDir": "./_build" + "outDir": "./www/common" }, "include": ["src/**/*"] } diff --git a/www/common/store-interface.js b/www/common/store-interface.js index b43f7e550..8e7f73d92 100644 --- a/www/common/store-interface.js +++ b/www/common/store-interface.js @@ -1,11 +1,9 @@ (() => { const factory = function () { - // XXX TODO - // Support NodeJS - // Support WebWorker - // Return a usable API instead of postMsg/msgEv - // XXX handle AppConfig, ApiConfig, MEssages and Broadcast in this file directly? - // --> pull them using require if browser or... ? + let USE_MIN = false; + + let path = '/common/worker.bundle.js?'; + if (USE_MIN) { path = '/common/worker.bundle.min.js?'; } let create = function (cfg = {}) { let { noWorker, noSharedWorker, AppConfig, @@ -39,7 +37,7 @@ const factory = function () { let worker, postMsg; if (!noWorker && !noSharedWorker && typeof(SharedWorker) !== "undefined") { - worker = new SharedWorker('/common/worker.bundle.js?' + urlArgs); + worker = new SharedWorker(path + urlArgs); worker.onerror = function (e) { console.error(e.message); }; @@ -68,7 +66,7 @@ const factory = function () { } if (!noWorker && typeof(Worker) !== "undefined") { - worker = new Worker('/common/worker.bundle.js?' + urlArgs); + worker = new Worker(path + urlArgs); worker.onerror = function (e) { console.error(e.message); }; @@ -93,7 +91,7 @@ const factory = function () { // Use the async store in the main thread if workers // aren't available //if (typeof(require) === "undefined") { return; } - require(['/common/worker.bundle.js'], function (Store) { + require([path], function (Store) { let store = Store?.store; if (!store) { return void console.error("No store"); } store.onMessage(function (data) { diff --git a/www/common/worker.bundle.js b/www/common/worker.bundle.js deleted file mode 120000 index 169cd2ebb..000000000 --- a/www/common/worker.bundle.js +++ /dev/null @@ -1 +0,0 @@ -../../_build/worker.bundle.js \ No newline at end of file diff --git a/www/common/worker.bundle.js b/www/common/worker.bundle.js new file mode 100644 index 000000000..a69ec50ba --- /dev/null +++ b/www/common/worker.bundle.js @@ -0,0 +1,36399 @@ +(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 new file mode 100644 index 000000000..655d651c2 --- /dev/null +++ b/www/common/worker.bundle.min.js @@ -0,0 +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}));