sliftutils 1.7.9 → 1.7.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/bin/storageserver.js +4 -0
  2. package/{teststorage → examplestorage}/browser.tsx +18 -22
  3. package/{teststorage/server.ts → examplestorage/exampleserver.ts} +4 -6
  4. package/index.d.ts +770 -84
  5. package/misc/dist/environment.ts.cache +3 -3
  6. package/misc/dist/getSecret.ts.cache +139 -0
  7. package/misc/dist/strings.ts.cache +13 -0
  8. package/misc/dist/zip.ts.cache +9 -0
  9. package/misc/getSecret.ts +38 -16
  10. package/misc/https/cloudflareHelpers.d.ts +19 -0
  11. package/misc/https/cloudflareHelpers.ts +69 -0
  12. package/misc/https/dist/certs.ts.cache +115 -179
  13. package/misc/https/dist/cloudflareHelpers.ts.cache +68 -0
  14. package/misc/https/dist/dns.ts.cache +112 -100
  15. package/misc/https/dist/hostServer.ts.cache +130 -0
  16. package/misc/https/dist/httpsCerts.ts.cache +24 -5
  17. package/misc/https/dist/persistentLocalStorage.ts.cache +3 -2
  18. package/misc/https/dns.d.ts +41 -8
  19. package/misc/https/dns.ts +104 -106
  20. package/misc/https/hostServer.d.ts +0 -3
  21. package/misc/https/hostServer.ts +12 -8
  22. package/package.json +3 -2
  23. package/render-utils/dist/observer.tsx.cache +3 -2
  24. package/spec.txt +0 -55
  25. package/storage/ArchivesDisk.d.ts +67 -0
  26. package/storage/ArchivesDisk.ts +369 -0
  27. package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +1242 -0
  28. package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +513 -0
  29. package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +352 -0
  30. package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +306 -0
  31. package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +435 -0
  32. package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +58 -0
  33. package/storage/BulkDatabase2/dist/blockCache.ts.cache +179 -0
  34. package/storage/BulkDatabase2/dist/mergeLock.ts.cache +149 -0
  35. package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +101 -0
  36. package/storage/BulkDatabase2/dist/streamLog.ts.cache +227 -0
  37. package/storage/BulkDatabase2/dist/syncClient.ts.cache +104 -0
  38. package/storage/IArchives.d.ts +127 -1
  39. package/storage/IArchives.ts +201 -1
  40. package/storage/backblaze.d.ts +29 -2
  41. package/storage/backblaze.ts +214 -78
  42. package/storage/dist/ArchivesDisk.ts.cache +373 -0
  43. package/storage/dist/FileFolderAPI.tsx.cache +508 -65
  44. package/storage/dist/IArchives.ts.cache +44 -0
  45. package/storage/dist/IndexedDBFileFolderAPI.ts.cache +8 -2
  46. package/storage/dist/JSONStorage.ts.cache +6 -2
  47. package/storage/dist/PendingManager.tsx.cache +1 -1
  48. package/storage/dist/TransactionStorage.ts.cache +231 -92
  49. package/storage/dist/backblaze.ts.cache +797 -0
  50. package/storage/dist/fileSystemPointer.ts.cache +36 -3
  51. package/storage/dist/remoteFileStorage.ts.cache +495 -0
  52. package/storage/remoteStorage/ArchivesRemote.d.ts +34 -18
  53. package/storage/remoteStorage/ArchivesRemote.ts +85 -65
  54. package/storage/remoteStorage/ArchivesUrl.d.ts +48 -0
  55. package/storage/remoteStorage/ArchivesUrl.ts +86 -0
  56. package/storage/remoteStorage/accessPage.tsx +111 -28
  57. package/storage/remoteStorage/blobStore.d.ts +128 -25
  58. package/storage/remoteStorage/blobStore.ts +757 -290
  59. package/storage/remoteStorage/cliArgs.d.ts +1 -0
  60. package/storage/remoteStorage/cliArgs.ts +9 -0
  61. package/storage/remoteStorage/createArchives.d.ts +85 -0
  62. package/storage/remoteStorage/createArchives.ts +612 -0
  63. package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +197 -0
  64. package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +85 -0
  65. package/storage/remoteStorage/dist/accessPage.tsx.cache +222 -0
  66. package/storage/remoteStorage/dist/blobStore.ts.cache +837 -0
  67. package/storage/remoteStorage/dist/cliArgs.ts.cache +16 -0
  68. package/storage/remoteStorage/dist/createArchives.ts.cache +610 -0
  69. package/storage/remoteStorage/dist/remoteConfig.ts.cache +206 -0
  70. package/storage/remoteStorage/dist/sourceWrapper.ts.cache +223 -0
  71. package/storage/remoteStorage/dist/storageController.ts.cache +500 -0
  72. package/storage/remoteStorage/dist/storageServer.ts.cache +106 -0
  73. package/storage/remoteStorage/dist/storageServerCli.ts.cache +39 -0
  74. package/storage/remoteStorage/dist/storageServerState.ts.cache +518 -0
  75. package/storage/remoteStorage/grantAccess.js +4 -0
  76. package/storage/remoteStorage/grantAccessCli.d.ts +1 -0
  77. package/storage/remoteStorage/grantAccessCli.ts +27 -0
  78. package/storage/remoteStorage/remoteConfig.d.ts +29 -0
  79. package/storage/remoteStorage/remoteConfig.ts +194 -0
  80. package/storage/remoteStorage/sourceWrapper.d.ts +41 -0
  81. package/storage/remoteStorage/sourceWrapper.ts +223 -0
  82. package/storage/remoteStorage/spec.md +31 -0
  83. package/storage/remoteStorage/storageController.d.ts +30 -27
  84. package/storage/remoteStorage/storageController.ts +297 -159
  85. package/storage/remoteStorage/storageServer.d.ts +6 -0
  86. package/storage/remoteStorage/storageServer.ts +88 -94
  87. package/storage/remoteStorage/storageServerCli.d.ts +1 -0
  88. package/storage/remoteStorage/storageServerCli.ts +38 -0
  89. package/storage/remoteStorage/storageServerState.d.ts +43 -0
  90. package/storage/remoteStorage/storageServerState.ts +540 -0
  91. package/testsite/server.ts +0 -2
  92. package/yarn.lock +11 -6
@@ -0,0 +1,106 @@
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
6
+ //exports.hostStorageServer = void 0;
7
+ const os_1 = __importDefault(require("os"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const promises_1 = __importDefault(require("fs/promises"));
10
+ const SocketFunction_1 = require("socket-function/SocketFunction");
11
+ const networking_1 = require("socket-function/src/networking");
12
+ const RequireController_1 = require("socket-function/require/RequireController");
13
+ const hostServer_1 = require("../../misc/https/hostServer");
14
+ const storageController_1 = require("./storageController");
15
+ const storageServerState_1 = require("./storageServerState");
16
+ const ArchivesRemote_1 = require("./ArchivesRemote");
17
+ // Import browser code, so it is allowed to be required by the client
18
+ require("./accessPage");
19
+ const DEFAULT_LOW_SPACE_THRESHOLD_BYTES = 25 * 1024 ** 3;
20
+ const DISK_SPACE_CHECK_INTERVAL_MS = 15 * 60 * 1000;
21
+ // Below this fraction of the warn threshold, we start rejecting writes so the server itself doesn't
22
+ // tip the machine into instability. Reads/deletes still work so users can free space.
23
+ const HARD_REJECT_FRACTION = 0.1;
24
+ function formatBytes(bytes) {
25
+ return `${(bytes / 1024 ** 3).toFixed(2)} GiB`;
26
+ }
27
+ async function checkDiskSpace(config) {
28
+ let { folder, threshold } = config;
29
+ let stats = await promises_1.default.statfs(folder);
30
+ let free = Number(stats.bavail) * Number(stats.bsize);
31
+ let hardLimit = threshold * HARD_REJECT_FRACTION;
32
+ if (free >= threshold) {
33
+ (0, storageServerState_1.setWritesRejectedReason)(undefined);
34
+ return;
35
+ }
36
+ let under = threshold - free;
37
+ let rejecting = free < hardLimit;
38
+ console.error(`Storage folder ${folder} is low on disk: ${formatBytes(free)} free`
39
+ + ` (warn threshold ${formatBytes(threshold)}, ${formatBytes(under)} under;`
40
+ + ` hard-reject threshold ${formatBytes(hardLimit)}${rejecting ? ", REACHED — write ops now rejected" : ""}).`);
41
+ if (rejecting) {
42
+ (0, storageServerState_1.setWritesRejectedReason)(`Storage server is out of disk space: only ${formatBytes(free)} free on ${folder}`
43
+ + ` (hard-reject threshold ${formatBytes(hardLimit)}, warn threshold ${formatBytes(threshold)}).`
44
+ + ` Write operations (create/append/new bucket) are rejected; reads, findInfo, and deletes still work — please free space.`);
45
+ }
46
+ else {
47
+ (0, storageServerState_1.setWritesRejectedReason)(undefined);
48
+ }
49
+ }
50
+ // Full path to the grantAccess CLI bootstrap that lives next to this file. The SSH command shown on
51
+ // the access page invokes it via `node <path> ...` (found through __dirname so consumers don't have
52
+ // to know where our source lives).
53
+ function getGrantAccessCliPath() {
54
+ return path_1.default.join(__dirname, "grantAccess.js");
55
+ }
56
+ async function hostStorageServer(config) {
57
+ var _a, _b, _c;
58
+ let { url, folder } = config;
59
+ let { address: domain, port } = (0, ArchivesRemote_1.parseStorageUrl)(url);
60
+ let rootDomain = domain.split(".").slice(-2).join(".");
61
+ let externalIP = (await (0, networking_1.getExternalIP)()).trim();
62
+ // The subdomain must be an ip domain: the domain's A record points at exactly one machine, so a
63
+ // dynamic name would let the same script run on two servers and silently fight over it. Encoding
64
+ // the IP makes that mistake fail loudly - the wrong machine's domain just doesn't match.
65
+ let allowedDomains = [`127-0-0-1.${rootDomain}`, `${externalIP.replaceAll(".", "-")}.${rootDomain}`];
66
+ if (!allowedDomains.includes(domain)) {
67
+ throw new Error(`The storage server domain is based on the machine's IP (the subdomain is the IP with dots replaced by dashes). Expected ${allowedDomains.join(" or ")}, was ${domain}. Your external IP is ${externalIP}.`);
68
+ }
69
+ await promises_1.default.mkdir(folder, { recursive: true });
70
+ let lowSpaceThreshold = (_a = config.lowSpaceThresholdBytes) !== null && _a !== void 0 ? _a : DEFAULT_LOW_SPACE_THRESHOLD_BYTES;
71
+ (0, storageServerState_1.setStorageServerConfig)({
72
+ domain,
73
+ port,
74
+ rootDomain,
75
+ sshTarget: `${os_1.default.userInfo().username}@${externalIP}`,
76
+ serverCommand: `node ${getGrantAccessCliPath()} --url ${url}`,
77
+ folder: path_1.default.resolve(folder),
78
+ });
79
+ RequireController_1.RequireController.allowAllNodeModules();
80
+ SocketFunction_1.SocketFunction.expose(RequireController_1.RequireController);
81
+ SocketFunction_1.SocketFunction.expose(storageController_1.RemoteStorageController);
82
+ // Every HTTP path goes through httpEntry: /file/<account>/<bucketName>/... serves public
83
+ // bucket files, everything else serves the access page (the path is the account name, see
84
+ // accessPage.tsx).
85
+ // A full URL, so the page resolves modules from the origin root even when served at
86
+ // /accountName (a relative require would resolve inside the account path).
87
+ SocketFunction_1.SocketFunction.setDefaultHTTPCall(storageController_1.RemoteStorageController, "httpEntry", {
88
+ requireCalls: [`https://${domain}:${port}/./storage/remoteStorage/accessPage.tsx`],
89
+ });
90
+ // Initial check so a server starting under-limit immediately rejects writes; then keep checking
91
+ // every 15 minutes so recovery (freed disk space) is picked up automatically.
92
+ await checkDiskSpace({ folder, threshold: lowSpaceThreshold });
93
+ let interval = setInterval(() => {
94
+ void checkDiskSpace({ folder, threshold: lowSpaceThreshold })
95
+ .catch(e => console.error(`Disk space check failed for ${folder}:`, e));
96
+ }, DISK_SPACE_CHECK_INTERVAL_MS);
97
+ (_c = (_b = interval).unref) === null || _c === void 0 ? void 0 : _c.call(_b);
98
+ await (0, hostServer_1.hostServer)({
99
+ domain,
100
+ port,
101
+ setDNSRecord: true,
102
+ });
103
+ }
104
+ exports.hostStorageServer = hostStorageServer;
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0b3JhZ2VTZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4QiwyREFBOEI7QUFDOUIsbUVBQWdFO0FBQ2hFLCtEQUErRDtBQUMvRCxpRkFBOEU7QUFDOUUsNERBQXlEO0FBQ3pELDJEQUE4RDtBQUM5RCw2REFBdUY7QUFDdkYscURBQW1EO0FBQ25ELHFFQUFxRTtBQUNyRSx3QkFBc0I7QUFFdEIsTUFBTSxpQ0FBaUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUN6RCxNQUFNLDRCQUE0QixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3BELG9HQUFvRztBQUNwRyxzRkFBc0Y7QUFDdEYsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUM7QUFxQmpDLFNBQVMsV0FBVyxDQUFDLEtBQWE7SUFDOUIsT0FBTyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNuRCxDQUFDO0FBRUQsS0FBSyxVQUFVLGNBQWMsQ0FBQyxNQUE2QztJQUN2RSxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUNuQyxJQUFJLEtBQUssR0FBRyxNQUFNLGtCQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JDLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0RCxJQUFJLFNBQVMsR0FBRyxTQUFTLEdBQUcsb0JBQW9CLENBQUM7SUFDakQsSUFBSSxJQUFJLElBQUksU0FBUyxFQUFFLENBQUM7UUFDcEIsSUFBQSw0Q0FBdUIsRUFBQyxTQUFTLENBQUMsQ0FBQztRQUNuQyxPQUFPO0lBQ1gsQ0FBQztJQUNELElBQUksS0FBSyxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDN0IsSUFBSSxTQUFTLEdBQUcsSUFBSSxHQUFHLFNBQVMsQ0FBQztJQUNqQyxPQUFPLENBQUMsS0FBSyxDQUNULGtCQUFrQixNQUFNLG9CQUFvQixXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU87VUFDbEUsb0JBQW9CLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVM7VUFDMUUsMEJBQTBCLFdBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLG9DQUFvQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FDakgsQ0FBQztJQUNGLElBQUksU0FBUyxFQUFFLENBQUM7UUFDWixJQUFBLDRDQUF1QixFQUNuQiw2Q0FBNkMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLE1BQU0sRUFBRTtjQUNoRiwyQkFBMkIsV0FBVyxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJO2NBQy9GLHlIQUF5SCxDQUM5SCxDQUFDO0lBQ04sQ0FBQztTQUFNLENBQUM7UUFDSixJQUFBLDRDQUF1QixFQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7QUFDTCxDQUFDO0FBRUQsb0dBQW9HO0FBQ3BHLG9HQUFvRztBQUNwRyxtQ0FBbUM7QUFDbkMsU0FBUyxxQkFBcUI7SUFDMUIsT0FBTyxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFTSxLQUFLLFVBQVUsaUJBQWlCLENBQUMsTUFBK0I7O0lBQ25FLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBQzdCLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUEsZ0NBQWUsRUFBQyxHQUFHLENBQUMsQ0FBQztJQUNyRCxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2RCxJQUFJLFVBQVUsR0FBRyxDQUFDLE1BQU0sSUFBQSwwQkFBYSxHQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoRCxnR0FBZ0c7SUFDaEcsaUdBQWlHO0lBQ2pHLHlGQUF5RjtJQUN6RixJQUFJLGNBQWMsR0FBRyxDQUFDLGFBQWEsVUFBVSxFQUFFLEVBQUUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3JHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQywySEFBMkgsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxNQUFNLHlCQUF5QixVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBQ2pPLENBQUM7SUFDRCxNQUFNLGtCQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLElBQUksaUJBQWlCLEdBQUcsTUFBQSxNQUFNLENBQUMsc0JBQXNCLG1DQUFJLGlDQUFpQyxDQUFDO0lBQzNGLElBQUEsMkNBQXNCLEVBQUM7UUFDbkIsTUFBTTtRQUNOLElBQUk7UUFDSixVQUFVO1FBQ1YsU0FBUyxFQUFFLEdBQUcsWUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsSUFBSSxVQUFVLEVBQUU7UUFDcEQsYUFBYSxFQUFFLFFBQVEscUJBQXFCLEVBQUUsVUFBVSxHQUFHLEVBQUU7UUFDN0QsTUFBTSxFQUFFLGNBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0tBQy9CLENBQUMsQ0FBQztJQUVILHFDQUFpQixDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDeEMsK0JBQWMsQ0FBQyxNQUFNLENBQUMscUNBQWlCLENBQUMsQ0FBQztJQUN6QywrQkFBYyxDQUFDLE1BQU0sQ0FBQywyQ0FBdUIsQ0FBQyxDQUFDO0lBQy9DLHlGQUF5RjtJQUN6RiwwRkFBMEY7SUFDMUYsbUJBQW1CO0lBQ25CLG9GQUFvRjtJQUNwRiwyRUFBMkU7SUFDM0UsK0JBQWMsQ0FBQyxrQkFBa0IsQ0FBQywyQ0FBdUIsRUFBRSxXQUFXLEVBQUU7UUFDcEUsWUFBWSxFQUFFLENBQUMsV0FBVyxNQUFNLElBQUksSUFBSSx5Q0FBeUMsQ0FBQztLQUNyRixDQUFDLENBQUM7SUFFSCxnR0FBZ0c7SUFDaEcsOEVBQThFO0lBQzlFLE1BQU0sY0FBYyxDQUFDLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7SUFDL0QsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUM1QixLQUFLLGNBQWMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQzthQUN4RCxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUMsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO0lBQ2pDLE1BQUEsTUFBQyxRQUFtQyxFQUFDLEtBQUssa0RBQUksQ0FBQztJQUUvQyxNQUFNLElBQUEsdUJBQVUsRUFBQztRQUNiLE1BQU07UUFDTixJQUFJO1FBQ0osWUFBWSxFQUFFLElBQUk7S0FDckIsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQWpERCw4Q0FpREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IGZzcCBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IFNvY2tldEZ1bmN0aW9uIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9Tb2NrZXRGdW5jdGlvblwiO1xuaW1wb3J0IHsgZ2V0RXh0ZXJuYWxJUCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL25ldHdvcmtpbmdcIjtcbmltcG9ydCB7IFJlcXVpcmVDb250cm9sbGVyIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9yZXF1aXJlL1JlcXVpcmVDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBob3N0U2VydmVyIH0gZnJvbSBcIi4uLy4uL21pc2MvaHR0cHMvaG9zdFNlcnZlclwiO1xuaW1wb3J0IHsgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIgfSBmcm9tIFwiLi9zdG9yYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgc2V0U3RvcmFnZVNlcnZlckNvbmZpZywgc2V0V3JpdGVzUmVqZWN0ZWRSZWFzb24gfSBmcm9tIFwiLi9zdG9yYWdlU2VydmVyU3RhdGVcIjtcbmltcG9ydCB7IHBhcnNlU3RvcmFnZVVybCB9IGZyb20gXCIuL0FyY2hpdmVzUmVtb3RlXCI7XG4vLyBJbXBvcnQgYnJvd3NlciBjb2RlLCBzbyBpdCBpcyBhbGxvd2VkIHRvIGJlIHJlcXVpcmVkIGJ5IHRoZSBjbGllbnRcbmltcG9ydCBcIi4vYWNjZXNzUGFnZVwiO1xuXG5jb25zdCBERUZBVUxUX0xPV19TUEFDRV9USFJFU0hPTERfQllURVMgPSAyNSAqIDEwMjQgKiogMztcbmNvbnN0IERJU0tfU1BBQ0VfQ0hFQ0tfSU5URVJWQUxfTVMgPSAxNSAqIDYwICogMTAwMDtcbi8vIEJlbG93IHRoaXMgZnJhY3Rpb24gb2YgdGhlIHdhcm4gdGhyZXNob2xkLCB3ZSBzdGFydCByZWplY3Rpbmcgd3JpdGVzIHNvIHRoZSBzZXJ2ZXIgaXRzZWxmIGRvZXNuJ3Rcbi8vIHRpcCB0aGUgbWFjaGluZSBpbnRvIGluc3RhYmlsaXR5LiBSZWFkcy9kZWxldGVzIHN0aWxsIHdvcmsgc28gdXNlcnMgY2FuIGZyZWUgc3BhY2UuXG5jb25zdCBIQVJEX1JFSkVDVF9GUkFDVElPTiA9IDAuMTtcblxuLy8gVGhlIHJlbW90ZSBzdG9yYWdlIHNlcnZlciwgYXMgYSBsaWJyYXJ5IGZ1bmN0aW9uOiBjb25zdW1lcnMgY2FsbCBob3N0U3RvcmFnZVNlcnZlcigpIGZyb20gdGhlaXJcbi8vIG93biBwcm9jZXNzIHRvIHN0YXJ0IGhvc3RpbmcgKG9yIHVzZSB0aGUgc3RvcmFnZXNlcnZlciBiaW4sIHNlZSBzdG9yYWdlU2VydmVyQ2xpLnRzKS4gVGhlXG4vLyBncmFudEFjY2Vzcy5qcyBib290c3RyYXAgKG5leHQgdG8gdGhpcyBmaWxlKSBpcyB3aGF0IHRoZSBhY2Nlc3MgcGFnZSdzIHNob3duIFNTSCBjb21tYW5kIHBvaW50cyBhdC5cblxuZXhwb3J0IHR5cGUgSG9zdFN0b3JhZ2VTZXJ2ZXJDb25maWcgPSB7XG4gICAgLy8gRnVsbCBVUkwgb2YgdGhpcyBzdG9yYWdlIHNlcnZlciwgZS5nLiBcImh0dHBzOi8vMS0yLTMtNC5leGFtcGxlLmNvbTo0NDQ0XCIuIFRoZSBzdWJkb21haW4gbXVzdFxuICAgIC8vIGJlIGFuIGlwIGRvbWFpbiAtIHRoaXMgbWFjaGluZSdzIGV4dGVybmFsIElQIHdpdGggZGFzaGVzLCBvciAxMjctMC0wLTEgZm9yIGxvY2FsIHRlc3RpbmdcbiAgICAvLyAoc2VlIHRoZSB2YWxpZGF0aW9uIGluIGhvc3RTdG9yYWdlU2VydmVyKS4gVGhlIGRvbWFpbiBhbmQgcG9ydCBhcmUgZXh0cmFjdGVkIGZyb20gaXQgKGJ1Y2tldFxuICAgIC8vIHJvdXRpbmcgVVJMcyBjbGllbnRzIHVzZSBsb29rIGxpa2VcbiAgICAvLyBodHRwczovLzEtMi0zLTQuZXhhbXBsZS5jb206NDQ0NC9maWxlLzxhY2NvdW50Pi88YnVja2V0TmFtZT4vc3RvcmFnZS9zdG9yYWdlcm91dGluZy5qc29uKS5cbiAgICB1cmw6IHN0cmluZztcbiAgICBmb2xkZXI6IHN0cmluZztcbiAgICAvLyBXaGVuIGZyZWUgc3BhY2Ugb24gdGhlIGZvbGRlcidzIGRyaXZlIGRyb3BzIGJlbG93IHRoaXMgbWFueSBieXRlcywgdGhlIHNlcnZlciBjb25zb2xlLmVycm9yc1xuICAgIC8vIGV2ZXJ5IDE1IG1pbnV0ZXMuIEJlbG93IDEwJSBvZiBpdCwgdGhlIHNlcnZlciBhbHNvIHJlamVjdHMgd3JpdGUgb3BlcmF0aW9ucyAoY3JlYXRpbmcgZmlsZXMsXG4gICAgLy8gbGFyZ2UgdXBsb2FkcywgbmV3IGJ1Y2tldHMpIOKAlCByZWFkcywgZmluZEluZm8sIGFuZCBkZWxldGVzIHN0aWxsIHdvcmsgc28gdGhlIHVzZXIgY2FuIGZyZWVcbiAgICAvLyBzcGFjZS4gRGVmYXVsdCAyNSBHaUIuXG4gICAgbG93U3BhY2VUaHJlc2hvbGRCeXRlcz86IG51bWJlcjtcbn07XG5cbmZ1bmN0aW9uIGZvcm1hdEJ5dGVzKGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHsoYnl0ZXMgLyAxMDI0ICoqIDMpLnRvRml4ZWQoMil9IEdpQmA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrRGlza1NwYWNlKGNvbmZpZzogeyBmb2xkZXI6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB7IGZvbGRlciwgdGhyZXNob2xkIH0gPSBjb25maWc7XG4gICAgbGV0IHN0YXRzID0gYXdhaXQgZnNwLnN0YXRmcyhmb2xkZXIpO1xuICAgIGxldCBmcmVlID0gTnVtYmVyKHN0YXRzLmJhdmFpbCkgKiBOdW1iZXIoc3RhdHMuYnNpemUpO1xuICAgIGxldCBoYXJkTGltaXQgPSB0aHJlc2hvbGQgKiBIQVJEX1JFSkVDVF9GUkFDVElPTjtcbiAgICBpZiAoZnJlZSA+PSB0aHJlc2hvbGQpIHtcbiAgICAgICAgc2V0V3JpdGVzUmVqZWN0ZWRSZWFzb24odW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgdW5kZXIgPSB0aHJlc2hvbGQgLSBmcmVlO1xuICAgIGxldCByZWplY3RpbmcgPSBmcmVlIDwgaGFyZExpbWl0O1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBTdG9yYWdlIGZvbGRlciAke2ZvbGRlcn0gaXMgbG93IG9uIGRpc2s6ICR7Zm9ybWF0Qnl0ZXMoZnJlZSl9IGZyZWVgXG4gICAgICAgICsgYCAod2FybiB0aHJlc2hvbGQgJHtmb3JtYXRCeXRlcyh0aHJlc2hvbGQpfSwgJHtmb3JtYXRCeXRlcyh1bmRlcil9IHVuZGVyO2BcbiAgICAgICAgKyBgIGhhcmQtcmVqZWN0IHRocmVzaG9sZCAke2Zvcm1hdEJ5dGVzKGhhcmRMaW1pdCl9JHtyZWplY3RpbmcgPyBcIiwgUkVBQ0hFRCDigJQgd3JpdGUgb3BzIG5vdyByZWplY3RlZFwiIDogXCJcIn0pLmBcbiAgICApO1xuICAgIGlmIChyZWplY3RpbmcpIHtcbiAgICAgICAgc2V0V3JpdGVzUmVqZWN0ZWRSZWFzb24oXG4gICAgICAgICAgICBgU3RvcmFnZSBzZXJ2ZXIgaXMgb3V0IG9mIGRpc2sgc3BhY2U6IG9ubHkgJHtmb3JtYXRCeXRlcyhmcmVlKX0gZnJlZSBvbiAke2ZvbGRlcn1gXG4gICAgICAgICAgICArIGAgKGhhcmQtcmVqZWN0IHRocmVzaG9sZCAke2Zvcm1hdEJ5dGVzKGhhcmRMaW1pdCl9LCB3YXJuIHRocmVzaG9sZCAke2Zvcm1hdEJ5dGVzKHRocmVzaG9sZCl9KS5gXG4gICAgICAgICAgICArIGAgV3JpdGUgb3BlcmF0aW9ucyAoY3JlYXRlL2FwcGVuZC9uZXcgYnVja2V0KSBhcmUgcmVqZWN0ZWQ7IHJlYWRzLCBmaW5kSW5mbywgYW5kIGRlbGV0ZXMgc3RpbGwgd29yayDigJQgcGxlYXNlIGZyZWUgc3BhY2UuYFxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFdyaXRlc1JlamVjdGVkUmVhc29uKHVuZGVmaW5lZCk7XG4gICAgfVxufVxuXG4vLyBGdWxsIHBhdGggdG8gdGhlIGdyYW50QWNjZXNzIENMSSBib290c3RyYXAgdGhhdCBsaXZlcyBuZXh0IHRvIHRoaXMgZmlsZS4gVGhlIFNTSCBjb21tYW5kIHNob3duIG9uXG4vLyB0aGUgYWNjZXNzIHBhZ2UgaW52b2tlcyBpdCB2aWEgYG5vZGUgPHBhdGg+IC4uLmAgKGZvdW5kIHRocm91Z2ggX19kaXJuYW1lIHNvIGNvbnN1bWVycyBkb24ndCBoYXZlXG4vLyB0byBrbm93IHdoZXJlIG91ciBzb3VyY2UgbGl2ZXMpLlxuZnVuY3Rpb24gZ2V0R3JhbnRBY2Nlc3NDbGlQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbihfX2Rpcm5hbWUsIFwiZ3JhbnRBY2Nlc3MuanNcIik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBob3N0U3RvcmFnZVNlcnZlcihjb25maWc6IEhvc3RTdG9yYWdlU2VydmVyQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHsgdXJsLCBmb2xkZXIgfSA9IGNvbmZpZztcbiAgICBsZXQgeyBhZGRyZXNzOiBkb21haW4sIHBvcnQgfSA9IHBhcnNlU3RvcmFnZVVybCh1cmwpO1xuICAgIGxldCByb290RG9tYWluID0gZG9tYWluLnNwbGl0KFwiLlwiKS5zbGljZSgtMikuam9pbihcIi5cIik7XG4gICAgbGV0IGV4dGVybmFsSVAgPSAoYXdhaXQgZ2V0RXh0ZXJuYWxJUCgpKS50cmltKCk7XG4gICAgLy8gVGhlIHN1YmRvbWFpbiBtdXN0IGJlIGFuIGlwIGRvbWFpbjogdGhlIGRvbWFpbidzIEEgcmVjb3JkIHBvaW50cyBhdCBleGFjdGx5IG9uZSBtYWNoaW5lLCBzbyBhXG4gICAgLy8gZHluYW1pYyBuYW1lIHdvdWxkIGxldCB0aGUgc2FtZSBzY3JpcHQgcnVuIG9uIHR3byBzZXJ2ZXJzIGFuZCBzaWxlbnRseSBmaWdodCBvdmVyIGl0LiBFbmNvZGluZ1xuICAgIC8vIHRoZSBJUCBtYWtlcyB0aGF0IG1pc3Rha2UgZmFpbCBsb3VkbHkgLSB0aGUgd3JvbmcgbWFjaGluZSdzIGRvbWFpbiBqdXN0IGRvZXNuJ3QgbWF0Y2guXG4gICAgbGV0IGFsbG93ZWREb21haW5zID0gW2AxMjctMC0wLTEuJHtyb290RG9tYWlufWAsIGAke2V4dGVybmFsSVAucmVwbGFjZUFsbChcIi5cIiwgXCItXCIpfS4ke3Jvb3REb21haW59YF07XG4gICAgaWYgKCFhbGxvd2VkRG9tYWlucy5pbmNsdWRlcyhkb21haW4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHN0b3JhZ2Ugc2VydmVyIGRvbWFpbiBpcyBiYXNlZCBvbiB0aGUgbWFjaGluZSdzIElQICh0aGUgc3ViZG9tYWluIGlzIHRoZSBJUCB3aXRoIGRvdHMgcmVwbGFjZWQgYnkgZGFzaGVzKS4gRXhwZWN0ZWQgJHthbGxvd2VkRG9tYWlucy5qb2luKFwiIG9yIFwiKX0sIHdhcyAke2RvbWFpbn0uIFlvdXIgZXh0ZXJuYWwgSVAgaXMgJHtleHRlcm5hbElQfS5gKTtcbiAgICB9XG4gICAgYXdhaXQgZnNwLm1rZGlyKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgbGV0IGxvd1NwYWNlVGhyZXNob2xkID0gY29uZmlnLmxvd1NwYWNlVGhyZXNob2xkQnl0ZXMgPz8gREVGQVVMVF9MT1dfU1BBQ0VfVEhSRVNIT0xEX0JZVEVTO1xuICAgIHNldFN0b3JhZ2VTZXJ2ZXJDb25maWcoe1xuICAgICAgICBkb21haW4sXG4gICAgICAgIHBvcnQsXG4gICAgICAgIHJvb3REb21haW4sXG4gICAgICAgIHNzaFRhcmdldDogYCR7b3MudXNlckluZm8oKS51c2VybmFtZX1AJHtleHRlcm5hbElQfWAsXG4gICAgICAgIHNlcnZlckNvbW1hbmQ6IGBub2RlICR7Z2V0R3JhbnRBY2Nlc3NDbGlQYXRoKCl9IC0tdXJsICR7dXJsfWAsXG4gICAgICAgIGZvbGRlcjogcGF0aC5yZXNvbHZlKGZvbGRlciksXG4gICAgfSk7XG5cbiAgICBSZXF1aXJlQ29udHJvbGxlci5hbGxvd0FsbE5vZGVNb2R1bGVzKCk7XG4gICAgU29ja2V0RnVuY3Rpb24uZXhwb3NlKFJlcXVpcmVDb250cm9sbGVyKTtcbiAgICBTb2NrZXRGdW5jdGlvbi5leHBvc2UoUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIpO1xuICAgIC8vIEV2ZXJ5IEhUVFAgcGF0aCBnb2VzIHRocm91Z2ggaHR0cEVudHJ5OiAvZmlsZS88YWNjb3VudD4vPGJ1Y2tldE5hbWU+Ly4uLiBzZXJ2ZXMgcHVibGljXG4gICAgLy8gYnVja2V0IGZpbGVzLCBldmVyeXRoaW5nIGVsc2Ugc2VydmVzIHRoZSBhY2Nlc3MgcGFnZSAodGhlIHBhdGggaXMgdGhlIGFjY291bnQgbmFtZSwgc2VlXG4gICAgLy8gYWNjZXNzUGFnZS50c3gpLlxuICAgIC8vIEEgZnVsbCBVUkwsIHNvIHRoZSBwYWdlIHJlc29sdmVzIG1vZHVsZXMgZnJvbSB0aGUgb3JpZ2luIHJvb3QgZXZlbiB3aGVuIHNlcnZlZCBhdFxuICAgIC8vIC9hY2NvdW50TmFtZSAoYSByZWxhdGl2ZSByZXF1aXJlIHdvdWxkIHJlc29sdmUgaW5zaWRlIHRoZSBhY2NvdW50IHBhdGgpLlxuICAgIFNvY2tldEZ1bmN0aW9uLnNldERlZmF1bHRIVFRQQ2FsbChSZW1vdGVTdG9yYWdlQ29udHJvbGxlciwgXCJodHRwRW50cnlcIiwge1xuICAgICAgICByZXF1aXJlQ2FsbHM6IFtgaHR0cHM6Ly8ke2RvbWFpbn06JHtwb3J0fS8uL3N0b3JhZ2UvcmVtb3RlU3RvcmFnZS9hY2Nlc3NQYWdlLnRzeGBdLFxuICAgIH0pO1xuXG4gICAgLy8gSW5pdGlhbCBjaGVjayBzbyBhIHNlcnZlciBzdGFydGluZyB1bmRlci1saW1pdCBpbW1lZGlhdGVseSByZWplY3RzIHdyaXRlczsgdGhlbiBrZWVwIGNoZWNraW5nXG4gICAgLy8gZXZlcnkgMTUgbWludXRlcyBzbyByZWNvdmVyeSAoZnJlZWQgZGlzayBzcGFjZSkgaXMgcGlja2VkIHVwIGF1dG9tYXRpY2FsbHkuXG4gICAgYXdhaXQgY2hlY2tEaXNrU3BhY2UoeyBmb2xkZXIsIHRocmVzaG9sZDogbG93U3BhY2VUaHJlc2hvbGQgfSk7XG4gICAgbGV0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICB2b2lkIGNoZWNrRGlza1NwYWNlKHsgZm9sZGVyLCB0aHJlc2hvbGQ6IGxvd1NwYWNlVGhyZXNob2xkIH0pXG4gICAgICAgICAgICAuY2F0Y2goZSA9PiBjb25zb2xlLmVycm9yKGBEaXNrIHNwYWNlIGNoZWNrIGZhaWxlZCBmb3IgJHtmb2xkZXJ9OmAsIGUpKTtcbiAgICB9LCBESVNLX1NQQUNFX0NIRUNLX0lOVEVSVkFMX01TKTtcbiAgICAoaW50ZXJ2YWwgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuXG4gICAgYXdhaXQgaG9zdFNlcnZlcih7XG4gICAgICAgIGRvbWFpbixcbiAgICAgICAgcG9ydCxcbiAgICAgICAgc2V0RE5TUmVjb3JkOiB0cnVlLFxuICAgIH0pO1xufVxuIl19
106
+ /* _JS_SOURCE_HASH = "474bc7acdfadc03dbbce5f77ef769213581cb00763fe1b3ceb2ee97208dde71c"; */
@@ -0,0 +1,39 @@
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
+ process.env.NODE_ENV = "production";
4
+ const storageServer_1 = require("./storageServer");
5
+ const cliArgs_1 = require("./cliArgs");
6
+ // Hosts a storage server from the command line (via the storageserver bin, see package.json).
7
+ process.on("unhandledRejection", (error) => {
8
+ console.error("Unhandled promise rejection:", error);
9
+ });
10
+ process.on("uncaughtException", (error) => {
11
+ console.error("Uncaught exception:", error);
12
+ });
13
+ async function main() {
14
+ let url = (0, cliArgs_1.getArg)("url");
15
+ if (!url)
16
+ throw new Error(`--url is required (ex: --url https://storage.example.com:4444)`);
17
+ let folder = (0, cliArgs_1.getArg)("folder");
18
+ if (!folder)
19
+ throw new Error(`--folder is required (the folder all data is stored in)`);
20
+ let lowSpaceThresholdBytes;
21
+ let lowSpaceThreshold = (0, cliArgs_1.getArg)("lowSpaceThreshold");
22
+ if (lowSpaceThreshold) {
23
+ lowSpaceThresholdBytes = +lowSpaceThreshold;
24
+ if (isNaN(lowSpaceThresholdBytes)) {
25
+ throw new Error(`--lowSpaceThreshold must be a number of bytes, was ${JSON.stringify(lowSpaceThreshold)}`);
26
+ }
27
+ }
28
+ await (0, storageServer_1.hostStorageServer)({
29
+ url,
30
+ folder,
31
+ lowSpaceThresholdBytes,
32
+ });
33
+ }
34
+ main().catch(e => {
35
+ console.error(e);
36
+ process.exit(1);
37
+ });
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlckNsaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0b3JhZ2VTZXJ2ZXJDbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUM7QUFDcEMsbURBQW9EO0FBQ3BELHVDQUFtQztBQUVuQyw4RkFBOEY7QUFFOUYsT0FBTyxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO0lBQ3ZDLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDekQsQ0FBQyxDQUFDLENBQUM7QUFDSCxPQUFPLENBQUMsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7SUFDdEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNoRCxDQUFDLENBQUMsQ0FBQztBQUVILEtBQUssVUFBVSxJQUFJO0lBQ2YsSUFBSSxHQUFHLEdBQUcsSUFBQSxnQkFBTSxFQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxHQUFHO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO0lBQzVGLElBQUksTUFBTSxHQUFHLElBQUEsZ0JBQU0sRUFBQyxRQUFRLENBQUMsQ0FBQztJQUM5QixJQUFJLENBQUMsTUFBTTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQztJQUN4RixJQUFJLHNCQUEwQyxDQUFDO0lBQy9DLElBQUksaUJBQWlCLEdBQUcsSUFBQSxnQkFBTSxFQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDcEQsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBQ3BCLHNCQUFzQixHQUFHLENBQUMsaUJBQWlCLENBQUM7UUFDNUMsSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0csQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLElBQUEsaUNBQWlCLEVBQUM7UUFDcEIsR0FBRztRQUNILE1BQU07UUFDTixzQkFBc0I7S0FDekIsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVELElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbInByb2Nlc3MuZW52Lk5PREVfRU5WID0gXCJwcm9kdWN0aW9uXCI7XG5pbXBvcnQgeyBob3N0U3RvcmFnZVNlcnZlciB9IGZyb20gXCIuL3N0b3JhZ2VTZXJ2ZXJcIjtcbmltcG9ydCB7IGdldEFyZyB9IGZyb20gXCIuL2NsaUFyZ3NcIjtcblxuLy8gSG9zdHMgYSBzdG9yYWdlIHNlcnZlciBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKHZpYSB0aGUgc3RvcmFnZXNlcnZlciBiaW4sIHNlZSBwYWNrYWdlLmpzb24pLlxuXG5wcm9jZXNzLm9uKFwidW5oYW5kbGVkUmVqZWN0aW9uXCIsIChlcnJvcikgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb246XCIsIGVycm9yKTtcbn0pO1xucHJvY2Vzcy5vbihcInVuY2F1Z2h0RXhjZXB0aW9uXCIsIChlcnJvcikgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJVbmNhdWdodCBleGNlcHRpb246XCIsIGVycm9yKTtcbn0pO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICAgIGxldCB1cmwgPSBnZXRBcmcoXCJ1cmxcIik7XG4gICAgaWYgKCF1cmwpIHRocm93IG5ldyBFcnJvcihgLS11cmwgaXMgcmVxdWlyZWQgKGV4OiAtLXVybCBodHRwczovL3N0b3JhZ2UuZXhhbXBsZS5jb206NDQ0NClgKTtcbiAgICBsZXQgZm9sZGVyID0gZ2V0QXJnKFwiZm9sZGVyXCIpO1xuICAgIGlmICghZm9sZGVyKSB0aHJvdyBuZXcgRXJyb3IoYC0tZm9sZGVyIGlzIHJlcXVpcmVkICh0aGUgZm9sZGVyIGFsbCBkYXRhIGlzIHN0b3JlZCBpbilgKTtcbiAgICBsZXQgbG93U3BhY2VUaHJlc2hvbGRCeXRlczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCBsb3dTcGFjZVRocmVzaG9sZCA9IGdldEFyZyhcImxvd1NwYWNlVGhyZXNob2xkXCIpO1xuICAgIGlmIChsb3dTcGFjZVRocmVzaG9sZCkge1xuICAgICAgICBsb3dTcGFjZVRocmVzaG9sZEJ5dGVzID0gK2xvd1NwYWNlVGhyZXNob2xkO1xuICAgICAgICBpZiAoaXNOYU4obG93U3BhY2VUaHJlc2hvbGRCeXRlcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgLS1sb3dTcGFjZVRocmVzaG9sZCBtdXN0IGJlIGEgbnVtYmVyIG9mIGJ5dGVzLCB3YXMgJHtKU09OLnN0cmluZ2lmeShsb3dTcGFjZVRocmVzaG9sZCl9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBob3N0U3RvcmFnZVNlcnZlcih7XG4gICAgICAgIHVybCxcbiAgICAgICAgZm9sZGVyLFxuICAgICAgICBsb3dTcGFjZVRocmVzaG9sZEJ5dGVzLFxuICAgIH0pO1xufVxuXG5tYWluKCkuY2F0Y2goZSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihlKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG59KTtcbiJdfQ=//=
39
+ /* _JS_SOURCE_HASH = "2b80e5f04ace1cd89cf9a9655983f618a7c3e948f3154c72619c56bb63fd4db7"; */