Content-addressed version deploy system for Diffuse elements.diffuse.sh
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore: deploy 4.0.0-alpha update

+14757 -2
+5
artifacts/artifacts.json
··· 213 213 "cid": "bafybeicp5hi5rw4vffqlbmyqqaxhmxzx4ilejru3cq4esycpeyuuhen5ha", 214 214 "createdAt": "2026-03-01T22:22:39.808Z", 215 215 "version": "4.0.0-alpha" 216 + }, 217 + "bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma": { 218 + "cid": "bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma", 219 + "createdAt": "2026-03-02T10:33:45.846Z", 220 + "version": "4.0.0-alpha" 216 221 } 217 222 }
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/APEv2Parser-LJ7N3HNS.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/APEv2Parser-LJ7N3HNS.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/APEv2Parser-LJ7N3HNS.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/APEv2Parser-LJ7N3HNS.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/AiffParser-73LZIKSO.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/AiffParser-73LZIKSO.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/AiffParser-73LZIKSO.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/AiffParser-73LZIKSO.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/AsfParser-YRIKESZW.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/AsfParser-YRIKESZW.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/AsfParser-YRIKESZW.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/AsfParser-YRIKESZW.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/DsdiffParser-V5ROCCMP.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/DsdiffParser-V5ROCCMP.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/DsdiffParser-V5ROCCMP.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/DsdiffParser-V5ROCCMP.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/DsfParser-GSHWLMZG.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/DsfParser-GSHWLMZG.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/DsfParser-GSHWLMZG.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/DsfParser-GSHWLMZG.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/FlacParser-3WLRWEM5.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/FlacParser-3WLRWEM5.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/FlacParser-3WLRWEM5.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/FlacParser-3WLRWEM5.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/MP4Parser-WGWY2YG6.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/MP4Parser-WGWY2YG6.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/MP4Parser-WGWY2YG6.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/MP4Parser-WGWY2YG6.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/MatroskaParser-2BD5GINE.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/MatroskaParser-2BD5GINE.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/MatroskaParser-2BD5GINE.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/MatroskaParser-2BD5GINE.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/MpegParser-3YF6H5NF.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/MpegParser-3YF6H5NF.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/MpegParser-3YF6H5NF.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/MpegParser-3YF6H5NF.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/MusepackParser-UV4ARQ3H.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/MusepackParser-UV4ARQ3H.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/MusepackParser-UV4ARQ3H.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/MusepackParser-UV4ARQ3H.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/OggParser-P4VZHADT.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/OggParser-P4VZHADT.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/OggParser-P4VZHADT.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/OggParser-P4VZHADT.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/WavPackParser-VXYVIQFV.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/WavPackParser-VXYVIQFV.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/WavPackParser-VXYVIQFV.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/WavPackParser-VXYVIQFV.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/WaveParser-OAMFGZFK.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/WaveParser-OAMFGZFK.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/WaveParser-OAMFGZFK.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/WaveParser-OAMFGZFK.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/android-chrome-192x192.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/android-chrome-192x192.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/android-chrome-512x512.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/android-chrome-512x512.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/apple-touch-icon.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/apple-touch-icon.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/browserconfig.xml
··· 1 + ../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/browserconfig.xml
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-242LG3VP.js
··· 1 + ../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/chunk-242LG3VP.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-242LG3VP.js.map
··· 1 + ../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/chunk-242LG3VP.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-2E662X3X.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-2E662X3X.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-2E662X3X.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-2E662X3X.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-3AO35WC3.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-3AO35WC3.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-3AO35WC3.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-3AO35WC3.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-3CXPPL5Z.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-3CXPPL5Z.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-3CXPPL5Z.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-3CXPPL5Z.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-3ENCKNXO.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-3ENCKNXO.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-3ENCKNXO.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-3ENCKNXO.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-3IXJYTB6.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-3IXJYTB6.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-3IXJYTB6.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-3IXJYTB6.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-3THWHK2M.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-3THWHK2M.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-3THWHK2M.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-3THWHK2M.js.map
+87
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-4IGBJYF3.js
··· 1 + import { 2 + IDB_PREFIX 3 + } from "./chunk-FAW4EB7G.js"; 4 + import { 5 + BroadcastedOutputElement, 6 + outputManager 7 + } from "./chunk-YCKIJVMK.js"; 8 + import { 9 + get, 10 + set 11 + } from "./chunk-JBHW662S.js"; 12 + import { 13 + __name, 14 + init_Buffer, 15 + init_process 16 + } from "./chunk-FZQXS3RE.js"; 17 + 18 + // components/output/polymorphic/indexed-db/element.js 19 + init_Buffer(); 20 + init_process(); 21 + var IndexedDBOutput = class extends BroadcastedOutputElement { 22 + static { 23 + __name(this, "IndexedDBOutput"); 24 + } 25 + static NAME = "diffuse/output/polymorphic/indexed-db"; 26 + static WORKER_URL = "components/output/polymorphic/indexed-db/worker.js"; 27 + #manager; 28 + constructor() { 29 + super(); 30 + this.#manager = outputManager({ 31 + facets: { 32 + empty: /* @__PURE__ */ __name(() => void 0, "empty"), 33 + get: /* @__PURE__ */ __name(() => this.#get("facets"), "get"), 34 + put: /* @__PURE__ */ __name((data) => this.#put("facets", data), "put") 35 + }, 36 + init: /* @__PURE__ */ __name(() => this.whenConnected(), "init"), 37 + playlistItems: { 38 + empty: /* @__PURE__ */ __name(() => void 0, "empty"), 39 + get: /* @__PURE__ */ __name(() => this.#get("playlistItems"), "get"), 40 + put: /* @__PURE__ */ __name((data) => this.#put("playlistItems", data), "put") 41 + }, 42 + themes: { 43 + empty: /* @__PURE__ */ __name(() => void 0, "empty"), 44 + get: /* @__PURE__ */ __name(() => this.#get("themes"), "get"), 45 + put: /* @__PURE__ */ __name((data) => this.#put("themes", data), "put") 46 + }, 47 + tracks: { 48 + empty: /* @__PURE__ */ __name(() => void 0, "empty"), 49 + get: /* @__PURE__ */ __name(() => this.#get("tracks"), "get"), 50 + put: /* @__PURE__ */ __name((data) => this.#put("tracks", data), "put") 51 + } 52 + }); 53 + this.facets = this.#manager.facets; 54 + this.playlistItems = this.#manager.playlistItems; 55 + this.themes = this.#manager.themes; 56 + this.tracks = this.#manager.tracks; 57 + this.ready = () => true; 58 + } 59 + // LIFECYCLE 60 + /** @override */ 61 + connectedCallback() { 62 + this.replicateSavedData(this.#manager); 63 + super.connectedCallback(); 64 + } 65 + // GET & PUT 66 + /** @param {string} name */ 67 + #get = /* @__PURE__ */ __name((name) => get(`${IDB_PREFIX}/${this.#cat(name)}`), "#get"); 68 + /** @param {string} name; @param {any} data */ 69 + #put = /* @__PURE__ */ __name((name, data) => set(`${IDB_PREFIX}/${this.#cat(name)}`, data), "#put"); 70 + // 🛠️ 71 + /** @param {string} name */ 72 + #cat(name) { 73 + return `${this.namespace?.length ? this.namespace + "/" : ""}${name}`; 74 + } 75 + }; 76 + var element_default = IndexedDBOutput; 77 + var CLASS = IndexedDBOutput; 78 + var NAME = "dop-indexed-db"; 79 + customElements.define(NAME, IndexedDBOutput); 80 + 81 + export { 82 + element_default, 83 + CLASS, 84 + NAME 85 + }; 86 + 87 + //# sourceMappingURL=./chunk-4IGBJYF3.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-4IGBJYF3.js.map
··· 1 + {"version":3,"sources":["/components/output/polymorphic/indexed-db/element.js"],"sourcesContent":["import * as IDB from \"idb-keyval\";\n\nimport { IDB_PREFIX } from \"./constants.js\";\nimport { BroadcastedOutputElement, outputManager } from \"../../common.js\";\n\n/**\n * @import {OutputElement, OutputManager, OutputWorkerActions} from \"../../types.d.ts\"\n * @import {SupportedDataTypes} from \"./types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {OutputElement<SupportedDataTypes>}\n */\nclass IndexedDBOutput extends BroadcastedOutputElement {\n static NAME = \"diffuse/output/polymorphic/indexed-db\";\n static WORKER_URL = \"components/output/polymorphic/indexed-db/worker.js\";\n\n #manager;\n\n constructor() {\n super();\n\n /** @type {OutputManager<SupportedDataTypes>} */\n this.#manager = outputManager({\n facets: {\n empty: () => undefined,\n get: () => this.#get(\"facets\"),\n put: (data) => this.#put(\"facets\", data),\n },\n init: () => this.whenConnected(),\n playlistItems: {\n empty: () => undefined,\n get: () => this.#get(\"playlistItems\"),\n put: (data) => this.#put(\"playlistItems\", data),\n },\n themes: {\n empty: () => undefined,\n get: () => this.#get(\"themes\"),\n put: (data) => this.#put(\"themes\", data),\n },\n tracks: {\n empty: () => undefined,\n get: () => this.#get(\"tracks\"),\n put: (data) => this.#put(\"tracks\", data),\n },\n });\n\n this.facets = this.#manager.facets;\n this.playlistItems = this.#manager.playlistItems;\n this.themes = this.#manager.themes;\n this.tracks = this.#manager.tracks;\n\n this.ready = () => true;\n }\n\n // LIFECYCLE\n\n /** @override */\n connectedCallback() {\n this.replicateSavedData(this.#manager);\n super.connectedCallback();\n }\n\n // GET & PUT\n\n /** @param {string} name */\n #get = (name) => IDB.get(`${IDB_PREFIX}/${this.#cat(name)}`);\n\n /** @param {string} name; @param {any} data */\n #put = (name, data) => IDB.set(`${IDB_PREFIX}/${this.#cat(name)}`, data);\n\n // 🛠️\n\n /** @param {string} name */\n #cat(name) {\n return `${this.namespace?.length ? this.namespace + \"/\" : \"\"}${name}`;\n }\n}\n\nexport default IndexedDBOutput;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = IndexedDBOutput;\nexport const NAME = \"dop-indexed-db\";\n\ncustomElements.define(NAME, IndexedDBOutput);\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAiBA,IAAM,kBAAN,cAA8B,yBAAyB;AAAA,EAjBvD,OAiBuD;AAAA;AAAA;AAAA,EACrD,OAAO,OAAO;AAAA,EACd,OAAO,aAAa;AAAA,EAEpB;AAAA,EAEA,cAAc;AACZ,UAAM;AAGN,SAAK,WAAW,cAAc;AAAA,MAC5B,QAAQ;AAAA,QACN,OAAO,6BAAM,QAAN;AAAA,QACP,KAAK,6BAAM,KAAK,KAAK,QAAQ,GAAxB;AAAA,QACL,KAAK,wBAAC,SAAS,KAAK,KAAK,UAAU,IAAI,GAAlC;AAAA,MACP;AAAA,MACA,MAAM,6BAAM,KAAK,cAAc,GAAzB;AAAA,MACN,eAAe;AAAA,QACb,OAAO,6BAAM,QAAN;AAAA,QACP,KAAK,6BAAM,KAAK,KAAK,eAAe,GAA/B;AAAA,QACL,KAAK,wBAAC,SAAS,KAAK,KAAK,iBAAiB,IAAI,GAAzC;AAAA,MACP;AAAA,MACA,QAAQ;AAAA,QACN,OAAO,6BAAM,QAAN;AAAA,QACP,KAAK,6BAAM,KAAK,KAAK,QAAQ,GAAxB;AAAA,QACL,KAAK,wBAAC,SAAS,KAAK,KAAK,UAAU,IAAI,GAAlC;AAAA,MACP;AAAA,MACA,QAAQ;AAAA,QACN,OAAO,6BAAM,QAAN;AAAA,QACP,KAAK,6BAAM,KAAK,KAAK,QAAQ,GAAxB;AAAA,QACL,KAAK,wBAAC,SAAS,KAAK,KAAK,UAAU,IAAI,GAAlC;AAAA,MACP;AAAA,IACF,CAAC;AAED,SAAK,SAAS,KAAK,SAAS;AAC5B,SAAK,gBAAgB,KAAK,SAAS;AACnC,SAAK,SAAS,KAAK,SAAS;AAC5B,SAAK,SAAS,KAAK,SAAS;AAE5B,SAAK,QAAQ,MAAM;AAAA,EACrB;AAAA;AAAA;AAAA,EAKA,oBAAoB;AAClB,SAAK,mBAAmB,KAAK,QAAQ;AACrC,UAAM,kBAAkB;AAAA,EAC1B;AAAA;AAAA;AAAA,EAKA,OAAO,wBAAC,SAAa,IAAI,GAAG,UAAU,IAAI,KAAK,KAAK,IAAI,CAAC,EAAE,GAApD;AAAA;AAAA,EAGP,OAAO,wBAAC,MAAM,SAAa,IAAI,GAAG,UAAU,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,IAAI,GAAhE;AAAA;AAAA;AAAA,EAKP,KAAK,MAAM;AACT,WAAO,GAAG,KAAK,WAAW,SAAS,KAAK,YAAY,MAAM,EAAE,GAAG,IAAI;AAAA,EACrE;AACF;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,eAAe;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-4IGBJYF3.js.map"}
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-4LOJTZ72.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-4LOJTZ72.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-4LOJTZ72.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-4LOJTZ72.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-4QN6X76O.js
··· 1 + ../bafybeicp5hi5rw4vffqlbmyqqaxhmxzx4ilejru3cq4esycpeyuuhen5ha/chunk-4QN6X76O.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-4QN6X76O.js.map
··· 1 + ../bafybeicp5hi5rw4vffqlbmyqqaxhmxzx4ilejru3cq4esycpeyuuhen5ha/chunk-4QN6X76O.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-4YB6QUPN.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-4YB6QUPN.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-4YB6QUPN.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-4YB6QUPN.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-676R57TH.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-676R57TH.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-676R57TH.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-676R57TH.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-6CB2LXND.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-6CB2LXND.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-6CB2LXND.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-6CB2LXND.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-6DKPDMFE.js
··· 1 + ../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/chunk-6DKPDMFE.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-6DKPDMFE.js.map
··· 1 + ../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/chunk-6DKPDMFE.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-6DRHTH2U.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-6DRHTH2U.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-6DRHTH2U.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-6DRHTH2U.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-6JNRNMZQ.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-6JNRNMZQ.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-6JNRNMZQ.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-6JNRNMZQ.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-6KMZB5IA.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-6KMZB5IA.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-6KMZB5IA.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-6KMZB5IA.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-6WKBRQHS.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-6WKBRQHS.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-6WKBRQHS.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-6WKBRQHS.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-77XZB4M3.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-77XZB4M3.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-77XZB4M3.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-77XZB4M3.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-77ZY4GQV.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-77ZY4GQV.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-77ZY4GQV.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-77ZY4GQV.js.map
+705
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-7LJOF6CE.js
··· 1 + import { 2 + NAME as NAME2 3 + } from "./chunk-BLEJHIYA.js"; 4 + import { 5 + NAME 6 + } from "./chunk-XCWUJTYE.js"; 7 + import { 8 + NAME as NAME3 9 + } from "./chunk-IGKYDHDK.js"; 10 + import { 11 + A, 12 + DiffuseElement, 13 + query 14 + } from "./chunk-V7EQPFPD.js"; 15 + import { 16 + signal 17 + } from "./chunk-HNJPKCUJ.js"; 18 + import { 19 + __name, 20 + init_Buffer, 21 + init_process 22 + } from "./chunk-FZQXS3RE.js"; 23 + 24 + // themes/webamp/configurators/output/element.js 25 + init_Buffer(); 26 + init_process(); 27 + var OutputConfig = class extends DiffuseElement { 28 + static { 29 + __name(this, "OutputConfig"); 30 + } 31 + constructor() { 32 + super(); 33 + this.attachShadow({ mode: "open" }); 34 + } 35 + // SIGNALS 36 + $output = signal( 37 + /** @type {OutputElement | OutputConfiguratorElement<VariousOutputElements> | undefined} */ 38 + void 0 39 + ); 40 + $atproto = signal( 41 + /** @type {ATProtoOutputElement | null} */ 42 + null 43 + ); 44 + $atprotoPasskey = signal( 45 + /** @type {TrackUriPasskeyTransformer | null} */ 46 + null 47 + ); 48 + $s3 = signal( 49 + /** @type {S3OutputElement | null} */ 50 + null 51 + ); 52 + $atprotoError = signal( 53 + /** @type {string | null} */ 54 + null 55 + ); 56 + $passkeyError = signal( 57 + /** @type {string | null} */ 58 + null 59 + ); 60 + $passkeyWorking = signal(false); 61 + $tab = signal("overview"); 62 + // LIFECYCLE 63 + /** @override */ 64 + async connectedCallback() { 65 + super.connectedCallback(); 66 + const output = query(this, "output-selector"); 67 + await customElements.whenDefined(output.localName); 68 + this.$output.value = output; 69 + const atproto = output.root().querySelector(NAME); 70 + if (atproto) { 71 + this.$atproto.value = /** @type {ATProtoOutputElement} */ 72 + atproto; 73 + } 74 + const atprotoPasskey = output.root().querySelector( 75 + `${NAME2}[namespace="atproto"]` 76 + ); 77 + if (atprotoPasskey) { 78 + await customElements.whenDefined(NAME2); 79 + this.$atprotoPasskey.value = /** @type {TrackUriPasskeyTransformer} */ 80 + atprotoPasskey; 81 + } 82 + const s3 = output.root().querySelector(NAME3); 83 + if (s3) { 84 + this.$s3.value = /** @type {S3OutputElement} */ 85 + s3; 86 + } 87 + } 88 + // EVENTS 89 + /** @param {Event} event */ 90 + #handleAtprotoLogin = /* @__PURE__ */ __name(async (event) => { 91 + event.preventDefault(); 92 + const input = this.root().querySelector("#atproto-handle"); 93 + const handle = input?.value?.trim(); 94 + if (!handle) return; 95 + const atproto = this.$atproto.value; 96 + if (!atproto) return; 97 + const button = this.root().querySelector("#atproto-submit"); 98 + if (button) { 99 + button.disabled = true; 100 + button.textContent = "Loading ..."; 101 + } 102 + this.$atprotoError.value = null; 103 + try { 104 + await atproto.login(handle); 105 + } catch (err) { 106 + this.$atprotoError.value = err instanceof Error ? err.message : "login failed"; 107 + if (button) { 108 + button.disabled = false; 109 + button.textContent = "Sign in"; 110 + } 111 + } 112 + }, "#handleAtprotoLogin"); 113 + #handleAtprotoLogout = /* @__PURE__ */ __name(async () => { 114 + const atproto = this.$atproto.value; 115 + if (!atproto) return; 116 + await atproto.logout(); 117 + }, "#handleAtprotoLogout"); 118 + #handlePasskeySetup = /* @__PURE__ */ __name(async () => { 119 + const passkey = this.$atprotoPasskey.value; 120 + if (!passkey) return; 121 + this.$passkeyError.value = null; 122 + this.$passkeyWorking.value = true; 123 + try { 124 + await passkey.setupPasskey(); 125 + } catch (err) { 126 + this.$passkeyError.value = err instanceof Error ? err.message : "Passkey setup failed"; 127 + } finally { 128 + this.$passkeyWorking.value = false; 129 + } 130 + }, "#handlePasskeySetup"); 131 + #handlePasskeyAdopt = /* @__PURE__ */ __name(async () => { 132 + const passkey = this.$atprotoPasskey.value; 133 + if (!passkey) return; 134 + this.$passkeyError.value = null; 135 + this.$passkeyWorking.value = true; 136 + try { 137 + await passkey.adoptPasskey(); 138 + } catch (err) { 139 + this.$passkeyError.value = err instanceof Error ? err.message : "Passkey adoption failed"; 140 + } finally { 141 + this.$passkeyWorking.value = false; 142 + } 143 + }, "#handlePasskeyAdopt"); 144 + #handlePasskeyRemove = /* @__PURE__ */ __name(async () => { 145 + const passkey = this.$atprotoPasskey.value; 146 + if (!passkey) return; 147 + this.$passkeyError.value = null; 148 + await passkey.removePasskey(); 149 + }, "#handlePasskeyRemove"); 150 + /** @param {Event} event */ 151 + #handleAtprotoActivate = /* @__PURE__ */ __name(async (event) => { 152 + event.preventDefault(); 153 + const output = this.$output.value; 154 + if (!output || !("select" in output)) return; 155 + const atproto = this.$atproto.value; 156 + if (!atproto) return; 157 + const option = (await output.options()).find( 158 + (o) => o.label === "AT Protocol" 159 + ); 160 + if (option) await output.select(option.id); 161 + }, "#handleAtprotoActivate"); 162 + /** 163 + * @param {Event} event 164 + */ 165 + #handleS3SetBucket = /* @__PURE__ */ __name(async (event) => { 166 + event.preventDefault(); 167 + const s3 = this.$s3.value; 168 + if (!s3) return; 169 + const button = this.root().querySelector("#s3-submit"); 170 + if (button) button.disabled = true; 171 + const accessKey = ( 172 + /** @type {HTMLInputElement | null} */ 173 + this.root().querySelector( 174 + "#s3-access-key" 175 + )?.value 176 + ); 177 + const bucketName = ( 178 + /** @type {HTMLInputElement | null} */ 179 + this.root().querySelector( 180 + "#s3-bucket-name" 181 + )?.value 182 + ); 183 + const host = ( 184 + /** @type {HTMLInputElement | null} */ 185 + this.root().querySelector( 186 + "#s3-host" 187 + )?.value 188 + ); 189 + const path = ( 190 + /** @type {HTMLInputElement | null} */ 191 + this.root().querySelector( 192 + "#s3-path" 193 + )?.value 194 + ); 195 + const region = ( 196 + /** @type {HTMLInputElement | null} */ 197 + this.root().querySelector( 198 + "#s3-region" 199 + )?.value 200 + ); 201 + const secretKey = ( 202 + /** @type {HTMLInputElement | null} */ 203 + this.root().querySelector( 204 + "#s3-secret-key" 205 + )?.value 206 + ); 207 + if (!accessKey || !bucketName || !secretKey) return; 208 + const bucket = { 209 + accessKey, 210 + bucketName, 211 + host: host?.length ? host.replace(/^\w+:\/\//, "") : "s3.amazonaws.com", 212 + path: path?.length ? path : "/", 213 + region: region?.length ? region : "us-east-1", 214 + secretKey 215 + }; 216 + await s3.setBucket(bucket); 217 + if (button) button.disabled = false; 218 + }, "#handleS3SetBucket"); 219 + #handleS3Unset = /* @__PURE__ */ __name(async () => { 220 + const s3 = this.$s3.value; 221 + if (!s3) return; 222 + await s3.unsetBucket(); 223 + }, "#handleS3Unset"); 224 + /** @param {Event} event */ 225 + #handleS3Activate = /* @__PURE__ */ __name(async (event) => { 226 + event.preventDefault(); 227 + const output = this.$output.value; 228 + if (!output || !("select" in output)) return; 229 + const s3 = this.$s3.value; 230 + if (!s3) return; 231 + const option = (await output.options()).find((o) => o.label === "S3"); 232 + if (option) await output.select(option.id); 233 + }, "#handleS3Activate"); 234 + #handleDeactivate = /* @__PURE__ */ __name(async () => { 235 + const output = this.$output.value; 236 + if (!output || !("deselect" in output)) return; 237 + await output.deselect(); 238 + }, "#handleDeactivate"); 239 + // RENDER 240 + /** 241 + * @param {RenderArg} _ 242 + */ 243 + render({ html }) { 244 + return html` 245 + <link rel="stylesheet" href="styles/vendor/98.css" /> 246 + <link rel="stylesheet" href="themes/webamp/98-extra.css" /> 247 + 248 + <style> 249 + @import "./themes/webamp/98-vars.css"; 250 + 251 + .button-row { 252 + display: inline-flex; 253 + gap: var(--grouped-button-spacing); 254 + } 255 + 256 + #tabbed { 257 + display: flex; 258 + flex-direction: column; 259 + height: 100%; 260 + } 261 + 262 + .window { 263 + flex: 1; 264 + overflow-y: auto; 265 + } 266 + 267 + /* TABS */ 268 + 269 + menu[role="tablist"] { 270 + padding-top: 2px; 271 + 272 + li > label { 273 + cursor: pointer; 274 + display: block; 275 + padding: var(--radio-label-spacing); 276 + } 277 + 278 + li[aria-selected="true"] { 279 + padding-bottom: 2px; 280 + margin-top: -2px; 281 + background-color: var(--surface); 282 + position: relative; 283 + z-index: 8; 284 + margin-left: -3px; 285 + } 286 + } 287 + </style> 288 + 289 + <div id="tabbed"> 290 + <menu role="tablist" class="multirows"> 291 + <li role="tab" aria-selected="${this.$tab.value === "overview"}"> 292 + <label @click="${() => this.$tab.value = "overview"}"> 293 + <span>Overview</span> 294 + </label> 295 + </li> 296 + <li role="tab" aria-selected="${this.$tab.value === "atproto"}"> 297 + <label @click="${() => this.$tab.value = "atproto"}"> 298 + <span>AT Protocol</span> 299 + </label> 300 + </li> 301 + <li role="tab" aria-selected="${this.$tab.value === "s3"}"> 302 + <label @click="${() => this.$tab.value = "s3"}"> 303 + <span>S3</span> 304 + </label> 305 + </li> 306 + </menu> 307 + 308 + <div class="window" role="tabpanel"> 309 + ${this.#renderTab(html)} 310 + </div> 311 + </div> 312 + `; 313 + } 314 + /** 315 + * @param {RenderArg["html"]} html 316 + */ 317 + #renderTab(html) { 318 + switch (this.$tab.value) { 319 + case "overview": 320 + return this.#renderOverviewTab(html); 321 + case "atproto": 322 + return this.#renderAtprotoTab(html); 323 + case "s3": 324 + return this.#renderS3Tab(html); 325 + default: 326 + return A; 327 + } 328 + } 329 + /** 330 + * @param {RenderArg["html"]} html 331 + */ 332 + #renderOverviewTab(html) { 333 + const selectedOutput = this.$output.value && "selected" in this.$output.value ? this.$output.value.selected() : void 0; 334 + return html` 335 + <div class="window-body"> 336 + <fieldset> 337 + <span class="with-icon with-icon--large"> 338 + <img 339 + src="images/icons/windows_98/computer_user_pencil-0.png" 340 + width="24" 341 + /> 342 + <span>Here you can configure where to keep your user data.<br />Each 343 + storage method comes with its pros and cons.<br />By default your data 344 + is only kept locally here in the browser. 345 + </span> 346 + </span> 347 + </fieldset> 348 + 349 + <fieldset> 350 + <span class="with-icon with-icon--large"> 351 + <img 352 + src="images/icons/windows_98/msg_information-0.png" 353 + width="24" 354 + /> 355 + <span> 356 + Data does not transfer across storage methods!<br />You can however 357 + merge data between them though, if you wish to do so. 358 + </span> 359 + </span> 360 + </fieldset> 361 + 362 + <fieldset> 363 + <legend>Active storage method</legend> 364 + <div class="with-icon with-icon--large"> 365 + <img 366 + src="images/icons/windows_98/${selectedOutput ? `directory_channels-2.png` : `msg_warning-0.png`}" 367 + width="24" 368 + /> 369 + <div> 370 + ${this.$output.value && "selected" in this.$output.value ? selectedOutput ? html` 371 + <p> 372 + Selected output: 373 + <strong>${selectedOutput.label}</strong><br /> 374 + </p> 375 + <p> 376 + <button @click="${this.#handleDeactivate}">Deactivate</button> 377 + </p> 378 + ` : this.#defaultOutputMessage : this.#defaultOutputMessage} 379 + </div> 380 + </div> 381 + </fieldset> 382 + </div> 383 + `; 384 + } 385 + /** 386 + * @param {RenderArg["html"]} html 387 + */ 388 + #renderAtprotoTab(html) { 389 + const did = this.$atproto.value?.did() ?? null; 390 + const selectedOutput = this.$output.value && "selected" in this.$output.value ? this.$output.value.selected() : void 0; 391 + const authenticated = /* @__PURE__ */ __name(() => { 392 + return html` 393 + <fieldset> 394 + <span class="with-icon with-icon--large"> 395 + <img src="images/icons/windows_98/computer_user_pencil-0.png" width="24" /> 396 + <span>Signed in as <strong>${did}</strong></span> 397 + </span> 398 + </fieldset> 399 + 400 + ${this.#renderPasskeySection(html)} 401 + 402 + <p class="button-row"> 403 + <button @click="${this.#handleAtprotoLogout}">Sign out</button> 404 + ${this.#renderAtprotoActivation(html, selectedOutput)} 405 + </p> 406 + `; 407 + }, "authenticated"); 408 + const unauthenticated = /* @__PURE__ */ __name(() => { 409 + return html` 410 + <fieldset> 411 + <span class="with-icon with-icon--large"> 412 + <img src="images/icons/windows_98/computer_user_pencil-0.png" width="24" /> 413 + <span> 414 + Store your user data on the storage associated with your AT Protocol 415 + identity. 416 + </span> 417 + </span> 418 + </fieldset> 419 + 420 + <fieldset> 421 + <form @submit="${this.#handleAtprotoLogin}" class="field-row"> 422 + <label for="atproto-handle">Your internet handle:</label> 423 + <input 424 + id="atproto-handle" 425 + type="text" 426 + required 427 + placeholder="you.bsky.social" 428 + /> 429 + </form> 430 + </fieldset> 431 + 432 + ${this.$atprotoError.value ? html` 433 + <fieldset> 434 + <span class="with-icon with-icon--large"> 435 + <img src="images/icons/windows_98/msg_error-0.png" width="24" /> 436 + <span> 437 + Sign in failed, please check the provided handle and try again. 438 + </span> 439 + </span> 440 + </fieldset> 441 + ` : A} ${this.#renderPasskeySection(html)} 442 + 443 + <p> 444 + <button @click="${this.#handleAtprotoLogin}" id="atproto-submit">Sign in</button> 445 + ${this.#renderAtprotoActivation(html, selectedOutput)} 446 + </p> 447 + `; 448 + }, "unauthenticated"); 449 + return html` 450 + <div class="window-body"> 451 + ${did ? authenticated() : unauthenticated()} 452 + </div> 453 + `; 454 + } 455 + /** 456 + * @param {RenderArg["html"]} html 457 + */ 458 + #renderS3Tab(html) { 459 + const s3 = this.$s3.value; 460 + const ready = s3?.ready() ?? false; 461 + const selectedOutput = this.$output.value && "selected" in this.$output.value ? this.$output.value.selected() : void 0; 462 + const configured = /* @__PURE__ */ __name(() => { 463 + const bucket = s3?.bucket(); 464 + return html` 465 + <fieldset> 466 + <div class="with-icon with-icon--large"> 467 + <img src="images/icons/windows_98/computer_user_pencil-0.png" width="24" /> 468 + <div> 469 + Bucket configured: 470 + <ul 471 + style="margin-bottom: 0; padding-left: 0; list-style-position: inside;" 472 + > 473 + <li>Name: <strong>${bucket?.bucketName}</strong></li> 474 + <li>Host: ${bucket?.host}</li> 475 + <li>Access key: ${bucket?.accessKey}</li> 476 + </ul> 477 + </div> 478 + </div> 479 + </fieldset> 480 + 481 + <fieldset> 482 + <span class="with-icon with-icon--large"> 483 + <img 484 + src="images/icons/windows_98/msg_information-0.png" 485 + width="24" 486 + /> 487 + <span> 488 + Make sure the bucket has CORS configured properly. 489 + </span> 490 + </span> 491 + </fieldset> 492 + 493 + <p class="button-row"> 494 + <button id="s3-unset-bucket" @click="${this.#handleS3Unset}"> 495 + Remove bucket configuration 496 + </button> 497 + ${this.#renderS3Activation(html, selectedOutput)} 498 + </p> 499 + `; 500 + }, "configured"); 501 + const unconfigured = /* @__PURE__ */ __name(() => { 502 + return html` 503 + <fieldset> 504 + <span class="with-icon with-icon--large"> 505 + <img src="images/icons/windows_98/computer_user_pencil-0.png" width="24" /> 506 + <span> 507 + Store your user data on an S3-compatible storage service. 508 + </span> 509 + </span> 510 + </fieldset> 511 + 512 + <form @submit="${this.#handleS3SetBucket}"> 513 + <fieldset> 514 + <legend>Bucket details</legend> 515 + 516 + <div class="field-row"> 517 + <label for="s3-access-key">Access Key:*</label> 518 + <input type="text" id="s3-access-key" required /> 519 + </div> 520 + 521 + <div class="field-row"> 522 + <label for="s3-secret-key">Secret Key:*</label> 523 + <input type="password" id="s3-secret-key" required /> 524 + </div> 525 + 526 + <div class="field-row"> 527 + <label for="s3-bucket-name">Bucket Name:*</label> 528 + <input type="text" id="s3-bucket-name" required /> 529 + </div> 530 + 531 + <div class="field-row"> 532 + <label for="s3-host">Host:</label> 533 + <input 534 + type="text" 535 + id="s3-host" 536 + placeholder="s3.amazonaws.com" 537 + /> 538 + </div> 539 + 540 + <div class="field-row"> 541 + <label for="s3-region">Region:</label> 542 + <input 543 + type="text" 544 + id="s3-region" 545 + placeholder="us-east-1" 546 + /> 547 + </div> 548 + 549 + <div class="field-row"> 550 + <label for="s3-path">Path:</label> 551 + <input type="text" id="s3-path" /> 552 + </div> 553 + 554 + <p> 555 + * are required fields. 556 + </p> 557 + </fieldset> 558 + 559 + <p> 560 + <button type="submit" id="s3-submit">Set bucket</button> 561 + ${this.#renderS3Activation(html, selectedOutput)} 562 + </p> 563 + </form> 564 + `; 565 + }, "unconfigured"); 566 + return html` 567 + <div class="window-body"> 568 + ${ready ? configured() : unconfigured()} 569 + </div> 570 + `; 571 + } 572 + /** 573 + * @param {RenderArg["html"]} html 574 + */ 575 + #renderPasskeySection(html) { 576 + const passkey = this.$atprotoPasskey.value; 577 + if (!passkey) return A; 578 + const passkeyActive = passkey.passkeyActive() ?? false; 579 + const lockedTracksCount = passkey.lockedTracks().length ?? 0; 580 + return html` 581 + <fieldset> 582 + <legend>Passkey encryption (optional)</legend> 583 + 584 + <div class="with-icon with-icon--large"> 585 + <img src="images/icons/windows_98/keys-5.png" width="24" /> 586 + 587 + <div> 588 + ${passkeyActive ? html` 589 + <p class="with-icon with-icon--large"> 590 + <input type="checkbox" checked /> 591 + <label>Passkey active — Track URIs are encrypted</label> 592 + </p> 593 + 594 + ${this.$passkeyError.value ? html` 595 + <fieldset> 596 + <span class="with-icon with-icon--large"> 597 + <img src="images/icons/windows_98/msg_error-0.png" width="24" /> 598 + <span>${this.$passkeyError.value}</span> 599 + </span> 600 + </fieldset> 601 + ` : A} 602 + 603 + <p> 604 + <button @click="${this.#handlePasskeyRemove}">Remove passkey</button> 605 + </p> 606 + 607 + <p> 608 + Removing the passkey will expose all the sensitive<br /> 609 + information that was previously encrypted. 610 + </p> 611 + ` : html` 612 + <p> 613 + Track URIs can optionally be encrypted so that passwords and<br /> 614 + other sensitive authentication details are kept private. 615 + </p> 616 + <p> 617 + Note that, with this enabled, other people can NOT play audio listed on your 618 + account. 619 + </p> 620 + 621 + ${this.$passkeyError.value ? html` 622 + <fieldset> 623 + <span class="with-icon with-icon--large"> 624 + <img src="images/icons/windows_98/msg_error-0.png" width="24" /> 625 + <span>${this.$passkeyError.value}</span> 626 + </span> 627 + </fieldset> 628 + ` : A} 629 + 630 + <p class="button-row"> 631 + <button 632 + ?disabled="${this.$passkeyWorking.value}" 633 + @click="${this.#handlePasskeySetup}" 634 + > 635 + ${this.$passkeyWorking.value ? "Setting up ..." : "Set up passkey encryption"} 636 + </button> 637 + <button 638 + ?disabled="${this.$passkeyWorking.value}" 639 + @click="${this.#handlePasskeyAdopt}" 640 + > 641 + ${this.$passkeyWorking.value ? "Authenticating ..." : "Use existing passkey"} 642 + </button> 643 + </p> 644 + `} 645 + </div> 646 + </div> 647 + </fieldset> 648 + 649 + ${lockedTracksCount > 0 ? html` 650 + <fieldset> 651 + <p class="with-icon with-icon--large"> 652 + <img 653 + src="images/icons/windows_98/msg_warning-0.png" 654 + width="24" 655 + /> 656 + ${lockedTracksCount} encrypted track(s) cannot be played until you unlock them with 657 + your passkey. If you're already using a passkey, remember that you have to 658 + use same passkey as the one you originally locked the tracks with. 659 + </p> 660 + </fieldset> 661 + ` : A} 662 + `; 663 + } 664 + /** 665 + * @param {RenderArg['html']} html 666 + * @param {VariousOutputElements | null | undefined} selectedOutput 667 + */ 668 + #renderAtprotoActivation(html, selectedOutput) { 669 + const output = this.$output.value; 670 + if (!output || !("select" in output)) return A; 671 + const isActive = selectedOutput?.label === "AT Protocol"; 672 + return isActive ? html` 673 + <button @click="${this.#handleDeactivate}">Deactivate</button> 674 + ` : html` 675 + <button @click="${this.#handleAtprotoActivate}">Activate this storage</button> 676 + `; 677 + } 678 + /** 679 + * @param {RenderArg['html']} html 680 + * @param {VariousOutputElements | null | undefined} selectedOutput 681 + */ 682 + #renderS3Activation(html, selectedOutput) { 683 + const output = this.$output.value; 684 + if (!output || !("select" in output)) return A; 685 + const isActive = selectedOutput?.label === "S3"; 686 + return isActive ? html` 687 + <button @click="${this.#handleDeactivate}">Deactivate</button> 688 + ` : html` 689 + <button @click="${this.#handleS3Activate}">Activate this storage</button> 690 + `; 691 + } 692 + #defaultOutputMessage = "Storing data locally in the browser without any backup or syncing enabled."; 693 + }; 694 + var element_default = OutputConfig; 695 + var CLASS = OutputConfig; 696 + var NAME4 = "dtw-output-config"; 697 + customElements.define(NAME4, CLASS); 698 + 699 + export { 700 + element_default, 701 + CLASS, 702 + NAME4 as NAME 703 + }; 704 + 705 + //# sourceMappingURL=./chunk-7LJOF6CE.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-7LJOF6CE.js.map
··· 1 + {"version":3,"sources":["/themes/webamp/configurators/output/element.js"],"sourcesContent":["import { DiffuseElement, nothing, query } from \"@common/element.js\";\nimport { signal } from \"@common/signal.js\";\n\nimport { NAME as ATPROTO_NAME } from \"@components/output/raw/atproto/element.js\";\nimport { NAME as S3_NAME } from \"@components/output/bytes/s3/element.js\";\n\nimport { NAME as PASSKEY_NAME } from \"@components/transformer/output/refiner/track-uri-passkey/element.js\";\n\n/**\n * @import {ATProtoOutputElement} from \"@components/output/raw/atproto/types.d.ts\"\n *\n * @import {Bucket as S3Bucket} from \"@components/input/s3/types.d.ts\"\n * @import {S3OutputElement} from \"@components/output/bytes/s3/types.d.ts\"\n *\n * @import {OutputElement} from \"@components/output/types.d.ts\"\n * @import {OutputConfiguratorElement} from \"@components/configurator/output/types.d.ts\"\n * @import TrackUriPasskeyTransformer from \"@components/transformer/output/refiner/track-uri-passkey/element.js\";\n *\n * @import {RenderArg} from \"@common/element.d.ts\"\n */\n\n/**\n * @typedef {OutputElement<any>} VariousOutputElements\n */\n\nclass OutputConfig extends DiffuseElement {\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n }\n\n // SIGNALS\n\n $output = signal(\n /** @type {OutputElement | OutputConfiguratorElement<VariousOutputElements> | undefined} */ (undefined),\n );\n\n $atproto = signal(\n /** @type {ATProtoOutputElement | null} */ (null),\n );\n\n $atprotoPasskey = signal(\n /** @type {TrackUriPasskeyTransformer | null} */ (null),\n );\n\n $s3 = signal(\n /** @type {S3OutputElement | null} */ (null),\n );\n\n $atprotoError = signal(/** @type {string | null} */ (null));\n $passkeyError = signal(/** @type {string | null} */ (null));\n $passkeyWorking = signal(false);\n $tab = signal(\"overview\");\n\n // LIFECYCLE\n\n /** @override */\n async connectedCallback() {\n super.connectedCallback();\n\n /** @type {OutputElement | OutputConfiguratorElement<VariousOutputElements>} */\n const output = query(this, \"output-selector\");\n\n await customElements.whenDefined(output.localName);\n\n this.$output.value = output;\n\n // Try setting up specific outputs\n const atproto = output.root().querySelector(ATPROTO_NAME);\n\n if (atproto) {\n this.$atproto.value = /** @type {ATProtoOutputElement} */ (atproto);\n }\n\n const atprotoPasskey = output.root().querySelector(\n `${PASSKEY_NAME}[namespace=\"atproto\"]`,\n );\n\n if (atprotoPasskey) {\n await customElements.whenDefined(PASSKEY_NAME);\n this.$atprotoPasskey.value =\n /** @type {TrackUriPasskeyTransformer} */ (atprotoPasskey);\n }\n\n const s3 = output.root().querySelector(S3_NAME);\n\n if (s3) {\n this.$s3.value = /** @type {S3OutputElement} */ (s3);\n }\n }\n\n // EVENTS\n\n /** @param {Event} event */\n #handleAtprotoLogin = async (event) => {\n event.preventDefault();\n\n /** @type {HTMLInputElement | null} */\n const input = this.root().querySelector(\"#atproto-handle\");\n const handle = input?.value?.trim();\n if (!handle) return;\n\n const atproto = this.$atproto.value;\n if (!atproto) return;\n\n /** @type {HTMLButtonElement | null} */\n const button = this.root().querySelector(\"#atproto-submit\");\n if (button) {\n button.disabled = true;\n button.textContent = \"Loading ...\";\n }\n\n this.$atprotoError.value = null;\n\n try {\n await atproto.login(handle);\n } catch (err) {\n this.$atprotoError.value = err instanceof Error\n ? err.message\n : \"login failed\";\n if (button) {\n button.disabled = false;\n button.textContent = \"Sign in\";\n }\n }\n };\n\n #handleAtprotoLogout = async () => {\n const atproto = this.$atproto.value;\n if (!atproto) return;\n\n await atproto.logout();\n };\n\n #handlePasskeySetup = async () => {\n const passkey = this.$atprotoPasskey.value;\n if (!passkey) return;\n\n this.$passkeyError.value = null;\n this.$passkeyWorking.value = true;\n\n try {\n await passkey.setupPasskey();\n } catch (err) {\n this.$passkeyError.value = err instanceof Error\n ? err.message\n : \"Passkey setup failed\";\n } finally {\n this.$passkeyWorking.value = false;\n }\n };\n\n #handlePasskeyAdopt = async () => {\n const passkey = this.$atprotoPasskey.value;\n if (!passkey) return;\n\n this.$passkeyError.value = null;\n this.$passkeyWorking.value = true;\n\n try {\n await passkey.adoptPasskey();\n } catch (err) {\n this.$passkeyError.value = err instanceof Error\n ? err.message\n : \"Passkey adoption failed\";\n } finally {\n this.$passkeyWorking.value = false;\n }\n };\n\n #handlePasskeyRemove = async () => {\n const passkey = this.$atprotoPasskey.value;\n if (!passkey) return;\n\n this.$passkeyError.value = null;\n await passkey.removePasskey();\n };\n\n /** @param {Event} event */\n #handleAtprotoActivate = async (event) => {\n event.preventDefault();\n\n const output = this.$output.value;\n if (!output || !(\"select\" in output)) return;\n\n const atproto = this.$atproto.value;\n if (!atproto) return;\n\n const option = (await output.options()).find((o) =>\n o.label === \"AT Protocol\"\n );\n if (option) await output.select(option.id);\n };\n\n /**\n * @param {Event} event\n */\n #handleS3SetBucket = async (event) => {\n event.preventDefault();\n\n const s3 = this.$s3.value;\n if (!s3) return;\n\n /** @type {HTMLButtonElement | null} */\n const button = this.root().querySelector(\"#s3-submit\");\n if (button) button.disabled = true;\n\n const accessKey =\n /** @type {HTMLInputElement | null} */ (this.root().querySelector(\n \"#s3-access-key\",\n ))?.value;\n const bucketName =\n /** @type {HTMLInputElement | null} */ (this.root().querySelector(\n \"#s3-bucket-name\",\n ))?.value;\n const host =\n /** @type {HTMLInputElement | null} */ (this.root().querySelector(\n \"#s3-host\",\n ))?.value;\n const path =\n /** @type {HTMLInputElement | null} */ (this.root().querySelector(\n \"#s3-path\",\n ))?.value;\n const region =\n /** @type {HTMLInputElement | null} */ (this.root().querySelector(\n \"#s3-region\",\n ))?.value;\n const secretKey =\n /** @type {HTMLInputElement | null} */ (this.root().querySelector(\n \"#s3-secret-key\",\n ))?.value;\n\n if (!accessKey || !bucketName || !secretKey) return;\n\n /** @type {S3Bucket} */\n const bucket = {\n accessKey,\n bucketName,\n host: host?.length ? host.replace(/^\\w+:\\/\\//, \"\") : \"s3.amazonaws.com\",\n path: path?.length ? path : \"/\",\n region: region?.length ? region : \"us-east-1\",\n secretKey,\n };\n\n await s3.setBucket(bucket);\n\n if (button) button.disabled = false;\n };\n\n #handleS3Unset = async () => {\n const s3 = this.$s3.value;\n if (!s3) return;\n\n await s3.unsetBucket();\n };\n\n /** @param {Event} event */\n #handleS3Activate = async (event) => {\n event.preventDefault();\n\n const output = this.$output.value;\n if (!output || !(\"select\" in output)) return;\n\n const s3 = this.$s3.value;\n if (!s3) return;\n\n const option = (await output.options()).find((o) => o.label === \"S3\");\n if (option) await output.select(option.id);\n };\n\n #handleDeactivate = async () => {\n const output = this.$output.value;\n if (!output || !(\"deselect\" in output)) return;\n\n await output.deselect();\n };\n\n // RENDER\n\n /**\n * @param {RenderArg} _\n */\n render({ html }) {\n return html`\n <link rel=\"stylesheet\" href=\"styles/vendor/98.css\" />\n <link rel=\"stylesheet\" href=\"themes/webamp/98-extra.css\" />\n\n <style>\n @import \"./themes/webamp/98-vars.css\";\n\n .button-row {\n display: inline-flex;\n gap: var(--grouped-button-spacing);\n }\n\n #tabbed {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .window {\n flex: 1;\n overflow-y: auto;\n }\n\n /* TABS */\n\n menu[role=\"tablist\"] {\n padding-top: 2px;\n\n li > label {\n cursor: pointer;\n display: block;\n padding: var(--radio-label-spacing);\n }\n\n li[aria-selected=\"true\"] {\n padding-bottom: 2px;\n margin-top: -2px;\n background-color: var(--surface);\n position: relative;\n z-index: 8;\n margin-left: -3px;\n }\n }\n </style>\n\n <div id=\"tabbed\">\n <menu role=\"tablist\" class=\"multirows\">\n <li role=\"tab\" aria-selected=\"${this.$tab.value === \"overview\"}\">\n <label @click=\"${() => this.$tab.value = \"overview\"}\">\n <span>Overview</span>\n </label>\n </li>\n <li role=\"tab\" aria-selected=\"${this.$tab.value === \"atproto\"}\">\n <label @click=\"${() => this.$tab.value = \"atproto\"}\">\n <span>AT Protocol</span>\n </label>\n </li>\n <li role=\"tab\" aria-selected=\"${this.$tab.value === \"s3\"}\">\n <label @click=\"${() => this.$tab.value = \"s3\"}\">\n <span>S3</span>\n </label>\n </li>\n </menu>\n\n <div class=\"window\" role=\"tabpanel\">\n ${this.#renderTab(html)}\n </div>\n </div>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderTab(html) {\n switch (this.$tab.value) {\n case \"overview\":\n return this.#renderOverviewTab(html);\n case \"atproto\":\n return this.#renderAtprotoTab(html);\n case \"s3\":\n return this.#renderS3Tab(html);\n default:\n return nothing;\n }\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderOverviewTab(html) {\n const selectedOutput =\n this.$output.value && \"selected\" in this.$output.value\n ? this.$output.value.selected()\n : undefined;\n\n return html`\n <div class=\"window-body\">\n <fieldset>\n <span class=\"with-icon with-icon--large\">\n <img\n src=\"images/icons/windows_98/computer_user_pencil-0.png\"\n width=\"24\"\n />\n <span>Here you can configure where to keep your user data.<br />Each\n storage method comes with its pros and cons.<br />By default your data\n is only kept locally here in the browser.\n </span>\n </span>\n </fieldset>\n\n <fieldset>\n <span class=\"with-icon with-icon--large\">\n <img\n src=\"images/icons/windows_98/msg_information-0.png\"\n width=\"24\"\n />\n <span>\n Data does not transfer across storage methods!<br />You can however\n merge data between them though, if you wish to do so.\n </span>\n </span>\n </fieldset>\n\n <fieldset>\n <legend>Active storage method</legend>\n <div class=\"with-icon with-icon--large\">\n <img\n src=\"images/icons/windows_98/${selectedOutput\n ? `directory_channels-2.png`\n : `msg_warning-0.png`}\"\n width=\"24\"\n />\n <div>\n ${this.$output.value &&\n \"selected\" in this.$output.value\n ? selectedOutput\n ? html`\n <p>\n Selected output:\n <strong>${selectedOutput.label}</strong><br />\n </p>\n <p>\n <button @click=\"${this\n .#handleDeactivate}\">Deactivate</button>\n </p>\n `\n : this.#defaultOutputMessage\n : this.#defaultOutputMessage}\n </div>\n </div>\n </fieldset>\n </div>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderAtprotoTab(html) {\n const did = this.$atproto.value?.did() ?? null;\n const selectedOutput =\n this.$output.value && \"selected\" in this.$output.value\n ? this.$output.value.selected()\n : undefined;\n\n const authenticated = () => {\n return html`\n <fieldset>\n <span class=\"with-icon with-icon--large\">\n <img src=\"images/icons/windows_98/computer_user_pencil-0.png\" width=\"24\" />\n <span>Signed in as <strong>${did}</strong></span>\n </span>\n </fieldset>\n\n ${this.#renderPasskeySection(html)}\n\n <p class=\"button-row\">\n <button @click=\"${this.#handleAtprotoLogout}\">Sign out</button>\n ${this.#renderAtprotoActivation(html, selectedOutput)}\n </p>\n `;\n };\n\n const unauthenticated = () => {\n return html`\n <fieldset>\n <span class=\"with-icon with-icon--large\">\n <img src=\"images/icons/windows_98/computer_user_pencil-0.png\" width=\"24\" />\n <span>\n Store your user data on the storage associated with your AT Protocol\n identity.\n </span>\n </span>\n </fieldset>\n\n <fieldset>\n <form @submit=\"${this.#handleAtprotoLogin}\" class=\"field-row\">\n <label for=\"atproto-handle\">Your internet handle:</label>\n <input\n id=\"atproto-handle\"\n type=\"text\"\n required\n placeholder=\"you.bsky.social\"\n />\n </form>\n </fieldset>\n\n ${this.$atprotoError.value\n ? html`\n <fieldset>\n <span class=\"with-icon with-icon--large\">\n <img src=\"images/icons/windows_98/msg_error-0.png\" width=\"24\" />\n <span>\n Sign in failed, please check the provided handle and try again.\n </span>\n </span>\n </fieldset>\n `\n : nothing} ${this.#renderPasskeySection(html)}\n\n <p>\n <button @click=\"${this\n .#handleAtprotoLogin}\" id=\"atproto-submit\">Sign in</button>\n ${this.#renderAtprotoActivation(html, selectedOutput)}\n </p>\n `;\n };\n\n return html`\n <div class=\"window-body\">\n ${did ? authenticated() : unauthenticated()}\n </div>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderS3Tab(html) {\n const s3 = this.$s3.value;\n const ready = s3?.ready() ?? false;\n const selectedOutput =\n this.$output.value && \"selected\" in this.$output.value\n ? this.$output.value.selected()\n : undefined;\n\n const configured = () => {\n const bucket = s3?.bucket();\n\n return html`\n <fieldset>\n <div class=\"with-icon with-icon--large\">\n <img src=\"images/icons/windows_98/computer_user_pencil-0.png\" width=\"24\" />\n <div>\n Bucket configured:\n <ul\n style=\"margin-bottom: 0; padding-left: 0; list-style-position: inside;\"\n >\n <li>Name: <strong>${bucket?.bucketName}</strong></li>\n <li>Host: ${bucket?.host}</li>\n <li>Access key: ${bucket?.accessKey}</li>\n </ul>\n </div>\n </div>\n </fieldset>\n\n <fieldset>\n <span class=\"with-icon with-icon--large\">\n <img\n src=\"images/icons/windows_98/msg_information-0.png\"\n width=\"24\"\n />\n <span>\n Make sure the bucket has CORS configured properly.\n </span>\n </span>\n </fieldset>\n\n <p class=\"button-row\">\n <button id=\"s3-unset-bucket\" @click=\"${this.#handleS3Unset}\">\n Remove bucket configuration\n </button>\n ${this.#renderS3Activation(html, selectedOutput)}\n </p>\n `;\n };\n\n const unconfigured = () => {\n return html`\n <fieldset>\n <span class=\"with-icon with-icon--large\">\n <img src=\"images/icons/windows_98/computer_user_pencil-0.png\" width=\"24\" />\n <span>\n Store your user data on an S3-compatible storage service.\n </span>\n </span>\n </fieldset>\n\n <form @submit=\"${this.#handleS3SetBucket}\">\n <fieldset>\n <legend>Bucket details</legend>\n\n <div class=\"field-row\">\n <label for=\"s3-access-key\">Access Key:*</label>\n <input type=\"text\" id=\"s3-access-key\" required />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-secret-key\">Secret Key:*</label>\n <input type=\"password\" id=\"s3-secret-key\" required />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-bucket-name\">Bucket Name:*</label>\n <input type=\"text\" id=\"s3-bucket-name\" required />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-host\">Host:</label>\n <input\n type=\"text\"\n id=\"s3-host\"\n placeholder=\"s3.amazonaws.com\"\n />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-region\">Region:</label>\n <input\n type=\"text\"\n id=\"s3-region\"\n placeholder=\"us-east-1\"\n />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-path\">Path:</label>\n <input type=\"text\" id=\"s3-path\" />\n </div>\n\n <p>\n * are required fields.\n </p>\n </fieldset>\n\n <p>\n <button type=\"submit\" id=\"s3-submit\">Set bucket</button>\n ${this.#renderS3Activation(html, selectedOutput)}\n </p>\n </form>\n `;\n };\n\n return html`\n <div class=\"window-body\">\n ${ready ? configured() : unconfigured()}\n </div>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderPasskeySection(html) {\n const passkey = this.$atprotoPasskey.value;\n if (!passkey) return nothing;\n\n const passkeyActive = passkey.passkeyActive() ?? false;\n const lockedTracksCount = passkey.lockedTracks().length ?? 0;\n\n return html`\n <fieldset>\n <legend>Passkey encryption (optional)</legend>\n\n <div class=\"with-icon with-icon--large\">\n <img src=\"images/icons/windows_98/keys-5.png\" width=\"24\" />\n\n <div>\n ${passkeyActive\n ? html`\n <p class=\"with-icon with-icon--large\">\n <input type=\"checkbox\" checked />\n <label>Passkey active — Track URIs are encrypted</label>\n </p>\n\n ${this.$passkeyError.value\n ? html`\n <fieldset>\n <span class=\"with-icon with-icon--large\">\n <img src=\"images/icons/windows_98/msg_error-0.png\" width=\"24\" />\n <span>${this.$passkeyError.value}</span>\n </span>\n </fieldset>\n `\n : nothing}\n\n <p>\n <button @click=\"${this\n .#handlePasskeyRemove}\">Remove passkey</button>\n </p>\n\n <p>\n Removing the passkey will expose all the sensitive<br />\n information that was previously encrypted.\n </p>\n `\n : html`\n <p>\n Track URIs can optionally be encrypted so that passwords and<br />\n other sensitive authentication details are kept private.\n </p>\n <p>\n Note that, with this enabled, other people can NOT play audio listed on your\n account.\n </p>\n\n ${this.$passkeyError.value\n ? html`\n <fieldset>\n <span class=\"with-icon with-icon--large\">\n <img src=\"images/icons/windows_98/msg_error-0.png\" width=\"24\" />\n <span>${this.$passkeyError.value}</span>\n </span>\n </fieldset>\n `\n : nothing}\n\n <p class=\"button-row\">\n <button\n ?disabled=\"${this.$passkeyWorking.value}\"\n @click=\"${this.#handlePasskeySetup}\"\n >\n ${this.$passkeyWorking.value\n ? \"Setting up ...\"\n : \"Set up passkey encryption\"}\n </button>\n <button\n ?disabled=\"${this.$passkeyWorking.value}\"\n @click=\"${this.#handlePasskeyAdopt}\"\n >\n ${this.$passkeyWorking.value\n ? \"Authenticating ...\"\n : \"Use existing passkey\"}\n </button>\n </p>\n `}\n </div>\n </div>\n </fieldset>\n\n ${lockedTracksCount > 0\n ? html`\n <fieldset>\n <p class=\"with-icon with-icon--large\">\n <img\n src=\"images/icons/windows_98/msg_warning-0.png\"\n width=\"24\"\n />\n ${lockedTracksCount} encrypted track(s) cannot be played until you unlock them with\n your passkey. If you're already using a passkey, remember that you have to\n use same passkey as the one you originally locked the tracks with.\n </p>\n </fieldset>\n `\n : nothing}\n `;\n }\n\n /**\n * @param {RenderArg['html']} html\n * @param {VariousOutputElements | null | undefined} selectedOutput\n */\n #renderAtprotoActivation(html, selectedOutput) {\n const output = this.$output.value;\n if (!output || !(\"select\" in output)) return nothing;\n\n const isActive = selectedOutput?.label === \"AT Protocol\";\n\n return isActive\n ? html`\n <button @click=\"${this.#handleDeactivate}\">Deactivate</button>\n `\n : html`\n <button @click=\"${this\n .#handleAtprotoActivate}\">Activate this storage</button>\n `;\n }\n\n /**\n * @param {RenderArg['html']} html\n * @param {VariousOutputElements | null | undefined} selectedOutput\n */\n #renderS3Activation(html, selectedOutput) {\n const output = this.$output.value;\n if (!output || !(\"select\" in output)) return nothing;\n\n const isActive = selectedOutput?.label === \"S3\";\n\n return isActive\n ? html`\n <button @click=\"${this.#handleDeactivate}\">Deactivate</button>\n `\n : html`\n <button @click=\"${this\n .#handleS3Activate}\">Activate this storage</button>\n `;\n }\n\n #defaultOutputMessage =\n \"Storing data locally in the browser without any backup or syncing enabled.\";\n}\n\nexport default OutputConfig;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = OutputConfig;\nexport const NAME = \"dtw-output-config\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":"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","names":["NAME"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-7LJOF6CE.js.map"}
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-7SBFGDAO.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-7SBFGDAO.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-7SBFGDAO.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-7SBFGDAO.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-7XAKBJEU.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-7XAKBJEU.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-7XAKBJEU.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-7XAKBJEU.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-AHN37DQ6.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-AHN37DQ6.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-AHN37DQ6.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-AHN37DQ6.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-B63ZUKFI.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-B63ZUKFI.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-B63ZUKFI.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-B63ZUKFI.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-BKRD2ZIW.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-BKRD2ZIW.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-BKRD2ZIW.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-BKRD2ZIW.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-BLEJHIYA.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-BLEJHIYA.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-BLEJHIYA.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-BLEJHIYA.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-BT6SPCM2.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-BT6SPCM2.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-BT6SPCM2.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-BT6SPCM2.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-CMU4QLMC.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-CMU4QLMC.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-CMU4QLMC.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-CMU4QLMC.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-CRZ7HJJ4.js
··· 1 + ../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/chunk-CRZ7HJJ4.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-CRZ7HJJ4.js.map
··· 1 + ../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/chunk-CRZ7HJJ4.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-DDF5P57I.js
··· 1 + ../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/chunk-DDF5P57I.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-DDF5P57I.js.map
··· 1 + ../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/chunk-DDF5P57I.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-E4JXX72S.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-E4JXX72S.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-E4JXX72S.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-E4JXX72S.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-EEUCFWD4.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-EEUCFWD4.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-EEUCFWD4.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-EEUCFWD4.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-EEZ5A5ST.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-EEZ5A5ST.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-EEZ5A5ST.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-EEZ5A5ST.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-ESYALJPH.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-ESYALJPH.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-ESYALJPH.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-ESYALJPH.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-F27JDJI2.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-F27JDJI2.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-F27JDJI2.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-F27JDJI2.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-FAW4EB7G.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-FAW4EB7G.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-FAW4EB7G.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-FAW4EB7G.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-FJBTJV3K.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-FJBTJV3K.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-FJBTJV3K.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-FJBTJV3K.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-FPIXTJ7E.js
··· 1 + ../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-FPIXTJ7E.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-FPIXTJ7E.js.map
··· 1 + ../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-FPIXTJ7E.js.map
+5101
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-FPOQLPK4.js
··· 1 + import { 2 + TrackType, 3 + TrackTypeValueToKeyMap 4 + } from "./chunk-YEYOLW6N.js"; 5 + import { 6 + hasID3v1Header 7 + } from "./chunk-77XZB4M3.js"; 8 + import { 9 + APEv2Parser 10 + } from "./chunk-E4JXX72S.js"; 11 + import { 12 + AbstractTokenizer, 13 + EndOfStreamError, 14 + fromBlob, 15 + fromBuffer, 16 + fromWebStream, 17 + open2 18 + } from "./chunk-CMU4QLMC.js"; 19 + import { 20 + LyricsContentType, 21 + TimestampFormat 22 + } from "./chunk-3IXJYTB6.js"; 23 + import { 24 + decodeString, 25 + getUintBE, 26 + toRatio 27 + } from "./chunk-J67JY2AB.js"; 28 + import { 29 + CouldNotDetermineFileTypeError, 30 + INT32_BE, 31 + InternalParserError, 32 + StringType, 33 + UINT16_BE, 34 + UINT16_LE, 35 + UINT32_BE, 36 + UINT32_LE, 37 + UINT64_LE, 38 + UINT8, 39 + UnsupportedFileTypeError, 40 + require_src, 41 + textDecode 42 + } from "./chunk-F27JDJI2.js"; 43 + import { 44 + removeUndefinedValuesFromRecord 45 + } from "./chunk-KJFA7KRK.js"; 46 + import { 47 + require_fast_uri 48 + } from "./chunk-SGR5ST3A.js"; 49 + import { 50 + __commonJS, 51 + __name, 52 + __toESM, 53 + init_Buffer, 54 + init_process 55 + } from "./chunk-FZQXS3RE.js"; 56 + 57 + // ../node_modules/.deno/content-type@1.0.5/node_modules/content-type/index.js 58 + var require_content_type = __commonJS({ 59 + "../node_modules/.deno/content-type@1.0.5/node_modules/content-type/index.js"(exports) { 60 + "use strict"; 61 + init_Buffer(); 62 + init_process(); 63 + var PARAM_REGEXP = /; *([!#$%&'*+.^_`|~0-9A-Za-z-]+) *= *("(?:[\u000b\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u000b\u0020-\u00ff])*"|[!#$%&'*+.^_`|~0-9A-Za-z-]+) */g; 64 + var TEXT_REGEXP = /^[\u000b\u0020-\u007e\u0080-\u00ff]+$/; 65 + var TOKEN_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/; 66 + var QESC_REGEXP = /\\([\u000b\u0020-\u00ff])/g; 67 + var QUOTE_REGEXP = /([\\"])/g; 68 + var TYPE_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/; 69 + exports.format = format; 70 + exports.parse = parse2; 71 + function format(obj) { 72 + if (!obj || typeof obj !== "object") { 73 + throw new TypeError("argument obj is required"); 74 + } 75 + var parameters = obj.parameters; 76 + var type = obj.type; 77 + if (!type || !TYPE_REGEXP.test(type)) { 78 + throw new TypeError("invalid type"); 79 + } 80 + var string = type; 81 + if (parameters && typeof parameters === "object") { 82 + var param; 83 + var params = Object.keys(parameters).sort(); 84 + for (var i = 0; i < params.length; i++) { 85 + param = params[i]; 86 + if (!TOKEN_REGEXP.test(param)) { 87 + throw new TypeError("invalid parameter name"); 88 + } 89 + string += "; " + param + "=" + qstring(parameters[param]); 90 + } 91 + } 92 + return string; 93 + } 94 + __name(format, "format"); 95 + function parse2(string) { 96 + if (!string) { 97 + throw new TypeError("argument string is required"); 98 + } 99 + var header = typeof string === "object" ? getcontenttype(string) : string; 100 + if (typeof header !== "string") { 101 + throw new TypeError("argument string is required to be a string"); 102 + } 103 + var index = header.indexOf(";"); 104 + var type = index !== -1 ? header.slice(0, index).trim() : header.trim(); 105 + if (!TYPE_REGEXP.test(type)) { 106 + throw new TypeError("invalid media type"); 107 + } 108 + var obj = new ContentType2(type.toLowerCase()); 109 + if (index !== -1) { 110 + var key; 111 + var match; 112 + var value; 113 + PARAM_REGEXP.lastIndex = index; 114 + while (match = PARAM_REGEXP.exec(header)) { 115 + if (match.index !== index) { 116 + throw new TypeError("invalid parameter format"); 117 + } 118 + index += match[0].length; 119 + key = match[1].toLowerCase(); 120 + value = match[2]; 121 + if (value.charCodeAt(0) === 34) { 122 + value = value.slice(1, -1); 123 + if (value.indexOf("\\") !== -1) { 124 + value = value.replace(QESC_REGEXP, "$1"); 125 + } 126 + } 127 + obj.parameters[key] = value; 128 + } 129 + if (index !== header.length) { 130 + throw new TypeError("invalid parameter format"); 131 + } 132 + } 133 + return obj; 134 + } 135 + __name(parse2, "parse"); 136 + function getcontenttype(obj) { 137 + var header; 138 + if (typeof obj.getHeader === "function") { 139 + header = obj.getHeader("content-type"); 140 + } else if (typeof obj.headers === "object") { 141 + header = obj.headers && obj.headers["content-type"]; 142 + } 143 + if (typeof header !== "string") { 144 + throw new TypeError("content-type header is missing from object"); 145 + } 146 + return header; 147 + } 148 + __name(getcontenttype, "getcontenttype"); 149 + function qstring(val) { 150 + var str = String(val); 151 + if (TOKEN_REGEXP.test(str)) { 152 + return str; 153 + } 154 + if (str.length > 0 && !TEXT_REGEXP.test(str)) { 155 + throw new TypeError("invalid parameter value"); 156 + } 157 + return '"' + str.replace(QUOTE_REGEXP, "\\$1") + '"'; 158 + } 159 + __name(qstring, "qstring"); 160 + function ContentType2(type) { 161 + this.parameters = /* @__PURE__ */ Object.create(null); 162 + this.type = type; 163 + } 164 + __name(ContentType2, "ContentType"); 165 + } 166 + }); 167 + 168 + // ../node_modules/.deno/media-typer@1.1.0/node_modules/media-typer/index.js 169 + var require_media_typer = __commonJS({ 170 + "../node_modules/.deno/media-typer@1.1.0/node_modules/media-typer/index.js"(exports) { 171 + "use strict"; 172 + init_Buffer(); 173 + init_process(); 174 + var SUBTYPE_NAME_REGEXP = /^[A-Za-z0-9][A-Za-z0-9!#$&^_.-]{0,126}$/; 175 + var TYPE_NAME_REGEXP = /^[A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126}$/; 176 + var TYPE_REGEXP = /^ *([A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126})\/([A-Za-z0-9][A-Za-z0-9!#$&^_.+-]{0,126}) *$/; 177 + exports.format = format; 178 + exports.parse = parse2; 179 + exports.test = test; 180 + function format(obj) { 181 + if (!obj || typeof obj !== "object") { 182 + throw new TypeError("argument obj is required"); 183 + } 184 + var subtype = obj.subtype; 185 + var suffix = obj.suffix; 186 + var type = obj.type; 187 + if (!type || !TYPE_NAME_REGEXP.test(type)) { 188 + throw new TypeError("invalid type"); 189 + } 190 + if (!subtype || !SUBTYPE_NAME_REGEXP.test(subtype)) { 191 + throw new TypeError("invalid subtype"); 192 + } 193 + var string = type + "/" + subtype; 194 + if (suffix) { 195 + if (!TYPE_NAME_REGEXP.test(suffix)) { 196 + throw new TypeError("invalid suffix"); 197 + } 198 + string += "+" + suffix; 199 + } 200 + return string; 201 + } 202 + __name(format, "format"); 203 + function test(string) { 204 + if (!string) { 205 + throw new TypeError("argument string is required"); 206 + } 207 + if (typeof string !== "string") { 208 + throw new TypeError("argument string is required to be a string"); 209 + } 210 + return TYPE_REGEXP.test(string.toLowerCase()); 211 + } 212 + __name(test, "test"); 213 + function parse2(string) { 214 + if (!string) { 215 + throw new TypeError("argument string is required"); 216 + } 217 + if (typeof string !== "string") { 218 + throw new TypeError("argument string is required to be a string"); 219 + } 220 + var match = TYPE_REGEXP.exec(string.toLowerCase()); 221 + if (!match) { 222 + throw new TypeError("invalid media type"); 223 + } 224 + var type = match[1]; 225 + var subtype = match[2]; 226 + var suffix; 227 + var index = subtype.lastIndexOf("+"); 228 + if (index !== -1) { 229 + suffix = subtype.substr(index + 1); 230 + subtype = subtype.substr(0, index); 231 + } 232 + return new MediaType(type, subtype, suffix); 233 + } 234 + __name(parse2, "parse"); 235 + function MediaType(type, subtype, suffix) { 236 + this.type = type; 237 + this.subtype = subtype; 238 + this.suffix = suffix; 239 + } 240 + __name(MediaType, "MediaType"); 241 + } 242 + }); 243 + 244 + // components/processor/metadata/common.js 245 + init_Buffer(); 246 + init_process(); 247 + 248 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/index.js 249 + init_Buffer(); 250 + init_process(); 251 + var import_debug4 = __toESM(require_src()); 252 + 253 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/core.js 254 + init_Buffer(); 255 + init_process(); 256 + 257 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/ParserFactory.js 258 + init_Buffer(); 259 + init_process(); 260 + 261 + // ../node_modules/.deno/file-type@21.3.0/node_modules/file-type/index.js 262 + init_Buffer(); 263 + init_process(); 264 + 265 + // ../node_modules/.deno/file-type@21.3.0/node_modules/file-type/core.js 266 + init_Buffer(); 267 + init_process(); 268 + 269 + // ../node_modules/.deno/@tokenizer+inflate@0.4.1/node_modules/@tokenizer/inflate/lib/index.js 270 + init_Buffer(); 271 + init_process(); 272 + 273 + // ../node_modules/.deno/@tokenizer+inflate@0.4.1/node_modules/@tokenizer/inflate/lib/ZipHandler.js 274 + init_Buffer(); 275 + init_process(); 276 + var import_debug = __toESM(require_src()); 277 + 278 + // ../node_modules/.deno/@tokenizer+inflate@0.4.1/node_modules/@tokenizer/inflate/lib/ZipToken.js 279 + init_Buffer(); 280 + init_process(); 281 + var Signature = { 282 + LocalFileHeader: 67324752, 283 + DataDescriptor: 134695760, 284 + CentralFileHeader: 33639248, 285 + EndOfCentralDirectory: 101010256 286 + }; 287 + var DataDescriptor = { 288 + get(array) { 289 + return { 290 + signature: UINT32_LE.get(array, 0), 291 + compressedSize: UINT32_LE.get(array, 8), 292 + uncompressedSize: UINT32_LE.get(array, 12) 293 + }; 294 + }, 295 + len: 16 296 + }; 297 + var LocalFileHeaderToken = { 298 + get(array) { 299 + const flags = UINT16_LE.get(array, 6); 300 + return { 301 + signature: UINT32_LE.get(array, 0), 302 + minVersion: UINT16_LE.get(array, 4), 303 + dataDescriptor: !!(flags & 8), 304 + compressedMethod: UINT16_LE.get(array, 8), 305 + compressedSize: UINT32_LE.get(array, 18), 306 + uncompressedSize: UINT32_LE.get(array, 22), 307 + filenameLength: UINT16_LE.get(array, 26), 308 + extraFieldLength: UINT16_LE.get(array, 28), 309 + filename: null 310 + }; 311 + }, 312 + len: 30 313 + }; 314 + var EndOfCentralDirectoryRecordToken = { 315 + get(array) { 316 + return { 317 + signature: UINT32_LE.get(array, 0), 318 + nrOfThisDisk: UINT16_LE.get(array, 4), 319 + nrOfThisDiskWithTheStart: UINT16_LE.get(array, 6), 320 + nrOfEntriesOnThisDisk: UINT16_LE.get(array, 8), 321 + nrOfEntriesOfSize: UINT16_LE.get(array, 10), 322 + sizeOfCd: UINT32_LE.get(array, 12), 323 + offsetOfStartOfCd: UINT32_LE.get(array, 16), 324 + zipFileCommentLength: UINT16_LE.get(array, 20) 325 + }; 326 + }, 327 + len: 22 328 + }; 329 + var FileHeader = { 330 + get(array) { 331 + const flags = UINT16_LE.get(array, 8); 332 + return { 333 + signature: UINT32_LE.get(array, 0), 334 + minVersion: UINT16_LE.get(array, 6), 335 + dataDescriptor: !!(flags & 8), 336 + compressedMethod: UINT16_LE.get(array, 10), 337 + compressedSize: UINT32_LE.get(array, 20), 338 + uncompressedSize: UINT32_LE.get(array, 24), 339 + filenameLength: UINT16_LE.get(array, 28), 340 + extraFieldLength: UINT16_LE.get(array, 30), 341 + fileCommentLength: UINT16_LE.get(array, 32), 342 + relativeOffsetOfLocalHeader: UINT32_LE.get(array, 42), 343 + filename: null 344 + }; 345 + }, 346 + len: 46 347 + }; 348 + 349 + // ../node_modules/.deno/@tokenizer+inflate@0.4.1/node_modules/@tokenizer/inflate/lib/ZipHandler.js 350 + function signatureToArray(signature) { 351 + const signatureBytes = new Uint8Array(UINT32_LE.len); 352 + UINT32_LE.put(signatureBytes, 0, signature); 353 + return signatureBytes; 354 + } 355 + __name(signatureToArray, "signatureToArray"); 356 + var debug = (0, import_debug.default)("tokenizer:inflate"); 357 + var syncBufferSize = 256 * 1024; 358 + var ddSignatureArray = signatureToArray(Signature.DataDescriptor); 359 + var eocdSignatureBytes = signatureToArray(Signature.EndOfCentralDirectory); 360 + var ZipHandler = class _ZipHandler { 361 + static { 362 + __name(this, "ZipHandler"); 363 + } 364 + constructor(tokenizer3) { 365 + this.tokenizer = tokenizer3; 366 + this.syncBuffer = new Uint8Array(syncBufferSize); 367 + } 368 + async isZip() { 369 + return await this.peekSignature() === Signature.LocalFileHeader; 370 + } 371 + peekSignature() { 372 + return this.tokenizer.peekToken(UINT32_LE); 373 + } 374 + async findEndOfCentralDirectoryLocator() { 375 + const randomReadTokenizer = this.tokenizer; 376 + const chunkLength = Math.min(16 * 1024, randomReadTokenizer.fileInfo.size); 377 + const buffer = this.syncBuffer.subarray(0, chunkLength); 378 + await this.tokenizer.readBuffer(buffer, { position: randomReadTokenizer.fileInfo.size - chunkLength }); 379 + for (let i = buffer.length - 4; i >= 0; i--) { 380 + if (buffer[i] === eocdSignatureBytes[0] && buffer[i + 1] === eocdSignatureBytes[1] && buffer[i + 2] === eocdSignatureBytes[2] && buffer[i + 3] === eocdSignatureBytes[3]) { 381 + return randomReadTokenizer.fileInfo.size - chunkLength + i; 382 + } 383 + } 384 + return -1; 385 + } 386 + async readCentralDirectory() { 387 + if (!this.tokenizer.supportsRandomAccess()) { 388 + debug("Cannot reading central-directory without random-read support"); 389 + return; 390 + } 391 + debug("Reading central-directory..."); 392 + const pos = this.tokenizer.position; 393 + const offset = await this.findEndOfCentralDirectoryLocator(); 394 + if (offset > 0) { 395 + debug("Central-directory 32-bit signature found"); 396 + const eocdHeader = await this.tokenizer.readToken(EndOfCentralDirectoryRecordToken, offset); 397 + const files = []; 398 + this.tokenizer.setPosition(eocdHeader.offsetOfStartOfCd); 399 + for (let n = 0; n < eocdHeader.nrOfEntriesOfSize; ++n) { 400 + const entry = await this.tokenizer.readToken(FileHeader); 401 + if (entry.signature !== Signature.CentralFileHeader) { 402 + throw new Error("Expected Central-File-Header signature"); 403 + } 404 + entry.filename = await this.tokenizer.readToken(new StringType(entry.filenameLength, "utf-8")); 405 + await this.tokenizer.ignore(entry.extraFieldLength); 406 + await this.tokenizer.ignore(entry.fileCommentLength); 407 + files.push(entry); 408 + debug(`Add central-directory file-entry: n=${n + 1}/${files.length}: filename=${files[n].filename}`); 409 + } 410 + this.tokenizer.setPosition(pos); 411 + return files; 412 + } 413 + this.tokenizer.setPosition(pos); 414 + } 415 + async unzip(fileCb) { 416 + const entries = await this.readCentralDirectory(); 417 + if (entries) { 418 + return this.iterateOverCentralDirectory(entries, fileCb); 419 + } 420 + let stop = false; 421 + do { 422 + const zipHeader = await this.readLocalFileHeader(); 423 + if (!zipHeader) 424 + break; 425 + const next = fileCb(zipHeader); 426 + stop = !!next.stop; 427 + let fileData; 428 + await this.tokenizer.ignore(zipHeader.extraFieldLength); 429 + if (zipHeader.dataDescriptor && zipHeader.compressedSize === 0) { 430 + const chunks = []; 431 + let len = syncBufferSize; 432 + debug("Compressed-file-size unknown, scanning for next data-descriptor-signature...."); 433 + let nextHeaderIndex = -1; 434 + while (nextHeaderIndex < 0 && len === syncBufferSize) { 435 + len = await this.tokenizer.peekBuffer(this.syncBuffer, { mayBeLess: true }); 436 + nextHeaderIndex = indexOf(this.syncBuffer.subarray(0, len), ddSignatureArray); 437 + const size = nextHeaderIndex >= 0 ? nextHeaderIndex : len; 438 + if (next.handler) { 439 + const data = new Uint8Array(size); 440 + await this.tokenizer.readBuffer(data); 441 + chunks.push(data); 442 + } else { 443 + await this.tokenizer.ignore(size); 444 + } 445 + } 446 + debug(`Found data-descriptor-signature at pos=${this.tokenizer.position}`); 447 + if (next.handler) { 448 + await this.inflate(zipHeader, mergeArrays(chunks), next.handler); 449 + } 450 + } else { 451 + if (next.handler) { 452 + debug(`Reading compressed-file-data: ${zipHeader.compressedSize} bytes`); 453 + fileData = new Uint8Array(zipHeader.compressedSize); 454 + await this.tokenizer.readBuffer(fileData); 455 + await this.inflate(zipHeader, fileData, next.handler); 456 + } else { 457 + debug(`Ignoring compressed-file-data: ${zipHeader.compressedSize} bytes`); 458 + await this.tokenizer.ignore(zipHeader.compressedSize); 459 + } 460 + } 461 + debug(`Reading data-descriptor at pos=${this.tokenizer.position}`); 462 + if (zipHeader.dataDescriptor) { 463 + const dataDescriptor = await this.tokenizer.readToken(DataDescriptor); 464 + if (dataDescriptor.signature !== 134695760) { 465 + throw new Error(`Expected data-descriptor-signature at position ${this.tokenizer.position - DataDescriptor.len}`); 466 + } 467 + } 468 + } while (!stop); 469 + } 470 + async iterateOverCentralDirectory(entries, fileCb) { 471 + for (const fileHeader of entries) { 472 + const next = fileCb(fileHeader); 473 + if (next.handler) { 474 + this.tokenizer.setPosition(fileHeader.relativeOffsetOfLocalHeader); 475 + const zipHeader = await this.readLocalFileHeader(); 476 + if (zipHeader) { 477 + await this.tokenizer.ignore(zipHeader.extraFieldLength); 478 + const fileData = new Uint8Array(fileHeader.compressedSize); 479 + await this.tokenizer.readBuffer(fileData); 480 + await this.inflate(zipHeader, fileData, next.handler); 481 + } 482 + } 483 + if (next.stop) 484 + break; 485 + } 486 + } 487 + async inflate(zipHeader, fileData, cb) { 488 + if (zipHeader.compressedMethod === 0) { 489 + return cb(fileData); 490 + } 491 + if (zipHeader.compressedMethod !== 8) { 492 + throw new Error(`Unsupported ZIP compression method: ${zipHeader.compressedMethod}`); 493 + } 494 + debug(`Decompress filename=${zipHeader.filename}, compressed-size=${fileData.length}`); 495 + const uncompressedData = await _ZipHandler.decompressDeflateRaw(fileData); 496 + return cb(uncompressedData); 497 + } 498 + static async decompressDeflateRaw(data) { 499 + const input = new ReadableStream({ 500 + start(controller) { 501 + controller.enqueue(data); 502 + controller.close(); 503 + } 504 + }); 505 + const ds = new DecompressionStream("deflate-raw"); 506 + const output = input.pipeThrough(ds); 507 + try { 508 + const response = new Response(output); 509 + const buffer = await response.arrayBuffer(); 510 + return new Uint8Array(buffer); 511 + } catch (err) { 512 + const message = err instanceof Error ? `Failed to deflate ZIP entry: ${err.message}` : "Unknown decompression error in ZIP entry"; 513 + throw new TypeError(message); 514 + } 515 + } 516 + async readLocalFileHeader() { 517 + const signature = await this.tokenizer.peekToken(UINT32_LE); 518 + if (signature === Signature.LocalFileHeader) { 519 + const header = await this.tokenizer.readToken(LocalFileHeaderToken); 520 + header.filename = await this.tokenizer.readToken(new StringType(header.filenameLength, "utf-8")); 521 + return header; 522 + } 523 + if (signature === Signature.CentralFileHeader) { 524 + return false; 525 + } 526 + if (signature === 3759263696) { 527 + throw new Error("Encrypted ZIP"); 528 + } 529 + throw new Error("Unexpected signature"); 530 + } 531 + }; 532 + function indexOf(buffer, portion) { 533 + const bufferLength = buffer.length; 534 + const portionLength = portion.length; 535 + if (portionLength > bufferLength) 536 + return -1; 537 + for (let i = 0; i <= bufferLength - portionLength; i++) { 538 + let found = true; 539 + for (let j = 0; j < portionLength; j++) { 540 + if (buffer[i + j] !== portion[j]) { 541 + found = false; 542 + break; 543 + } 544 + } 545 + if (found) { 546 + return i; 547 + } 548 + } 549 + return -1; 550 + } 551 + __name(indexOf, "indexOf"); 552 + function mergeArrays(chunks) { 553 + const totalLength = chunks.reduce((acc, curr) => acc + curr.length, 0); 554 + const mergedArray = new Uint8Array(totalLength); 555 + let offset = 0; 556 + for (const chunk of chunks) { 557 + mergedArray.set(chunk, offset); 558 + offset += chunk.length; 559 + } 560 + return mergedArray; 561 + } 562 + __name(mergeArrays, "mergeArrays"); 563 + 564 + // ../node_modules/.deno/@tokenizer+inflate@0.4.1/node_modules/@tokenizer/inflate/lib/GzipHandler.js 565 + init_Buffer(); 566 + init_process(); 567 + var GzipHandler = class { 568 + static { 569 + __name(this, "GzipHandler"); 570 + } 571 + constructor(tokenizer3) { 572 + this.tokenizer = tokenizer3; 573 + } 574 + inflate() { 575 + const tokenizer3 = this.tokenizer; 576 + return new ReadableStream({ 577 + async pull(controller) { 578 + const buffer = new Uint8Array(1024); 579 + const size = await tokenizer3.readBuffer(buffer, { mayBeLess: true }); 580 + if (size === 0) { 581 + controller.close(); 582 + return; 583 + } 584 + controller.enqueue(buffer.subarray(0, size)); 585 + } 586 + }).pipeThrough(new DecompressionStream("gzip")); 587 + } 588 + }; 589 + 590 + // ../node_modules/.deno/file-type@21.3.0/node_modules/file-type/util.js 591 + init_Buffer(); 592 + init_process(); 593 + function stringToBytes(string, encoding) { 594 + if (encoding === "utf-16le") { 595 + const bytes = []; 596 + for (let index = 0; index < string.length; index++) { 597 + const code = string.charCodeAt(index); 598 + bytes.push(code & 255, code >> 8 & 255); 599 + } 600 + return bytes; 601 + } 602 + if (encoding === "utf-16be") { 603 + const bytes = []; 604 + for (let index = 0; index < string.length; index++) { 605 + const code = string.charCodeAt(index); 606 + bytes.push(code >> 8 & 255, code & 255); 607 + } 608 + return bytes; 609 + } 610 + return [...string].map((character) => character.charCodeAt(0)); 611 + } 612 + __name(stringToBytes, "stringToBytes"); 613 + function tarHeaderChecksumMatches(arrayBuffer, offset = 0) { 614 + const readSum = Number.parseInt(new StringType(6).get(arrayBuffer, 148).replace(/\0.*$/, "").trim(), 8); 615 + if (Number.isNaN(readSum)) { 616 + return false; 617 + } 618 + let sum = 8 * 32; 619 + for (let index = offset; index < offset + 148; index++) { 620 + sum += arrayBuffer[index]; 621 + } 622 + for (let index = offset + 156; index < offset + 512; index++) { 623 + sum += arrayBuffer[index]; 624 + } 625 + return readSum === sum; 626 + } 627 + __name(tarHeaderChecksumMatches, "tarHeaderChecksumMatches"); 628 + var uint32SyncSafeToken = { 629 + get: /* @__PURE__ */ __name((buffer, offset) => buffer[offset + 3] & 127 | buffer[offset + 2] << 7 | buffer[offset + 1] << 14 | buffer[offset] << 21, "get"), 630 + len: 4 631 + }; 632 + 633 + // ../node_modules/.deno/file-type@21.3.0/node_modules/file-type/supported.js 634 + init_Buffer(); 635 + init_process(); 636 + var extensions = [ 637 + "jpg", 638 + "png", 639 + "apng", 640 + "gif", 641 + "webp", 642 + "flif", 643 + "xcf", 644 + "cr2", 645 + "cr3", 646 + "orf", 647 + "arw", 648 + "dng", 649 + "nef", 650 + "rw2", 651 + "raf", 652 + "tif", 653 + "bmp", 654 + "icns", 655 + "jxr", 656 + "psd", 657 + "indd", 658 + "zip", 659 + "tar", 660 + "rar", 661 + "gz", 662 + "bz2", 663 + "7z", 664 + "dmg", 665 + "mp4", 666 + "mid", 667 + "mkv", 668 + "webm", 669 + "mov", 670 + "avi", 671 + "mpg", 672 + "mp2", 673 + "mp3", 674 + "m4a", 675 + "oga", 676 + "ogg", 677 + "ogv", 678 + "opus", 679 + "flac", 680 + "wav", 681 + "spx", 682 + "amr", 683 + "pdf", 684 + "epub", 685 + "elf", 686 + "macho", 687 + "exe", 688 + "swf", 689 + "rtf", 690 + "wasm", 691 + "woff", 692 + "woff2", 693 + "eot", 694 + "ttf", 695 + "otf", 696 + "ttc", 697 + "ico", 698 + "flv", 699 + "ps", 700 + "xz", 701 + "sqlite", 702 + "nes", 703 + "crx", 704 + "xpi", 705 + "cab", 706 + "deb", 707 + "ar", 708 + "rpm", 709 + "Z", 710 + "lz", 711 + "cfb", 712 + "mxf", 713 + "mts", 714 + "blend", 715 + "bpg", 716 + "docx", 717 + "pptx", 718 + "xlsx", 719 + "3gp", 720 + "3g2", 721 + "j2c", 722 + "jp2", 723 + "jpm", 724 + "jpx", 725 + "mj2", 726 + "aif", 727 + "qcp", 728 + "odt", 729 + "ods", 730 + "odp", 731 + "xml", 732 + "mobi", 733 + "heic", 734 + "cur", 735 + "ktx", 736 + "ape", 737 + "wv", 738 + "dcm", 739 + "ics", 740 + "glb", 741 + "pcap", 742 + "dsf", 743 + "lnk", 744 + "alias", 745 + "voc", 746 + "ac3", 747 + "m4v", 748 + "m4p", 749 + "m4b", 750 + "f4v", 751 + "f4p", 752 + "f4b", 753 + "f4a", 754 + "mie", 755 + "asf", 756 + "ogm", 757 + "ogx", 758 + "mpc", 759 + "arrow", 760 + "shp", 761 + "aac", 762 + "mp1", 763 + "it", 764 + "s3m", 765 + "xm", 766 + "skp", 767 + "avif", 768 + "eps", 769 + "lzh", 770 + "pgp", 771 + "asar", 772 + "stl", 773 + "chm", 774 + "3mf", 775 + "zst", 776 + "jxl", 777 + "vcf", 778 + "jls", 779 + "pst", 780 + "dwg", 781 + "parquet", 782 + "class", 783 + "arj", 784 + "cpio", 785 + "ace", 786 + "avro", 787 + "icc", 788 + "fbx", 789 + "vsdx", 790 + "vtt", 791 + "apk", 792 + "drc", 793 + "lz4", 794 + "potx", 795 + "xltx", 796 + "dotx", 797 + "xltm", 798 + "ott", 799 + "ots", 800 + "otp", 801 + "odg", 802 + "otg", 803 + "xlsm", 804 + "docm", 805 + "dotm", 806 + "potm", 807 + "pptm", 808 + "jar", 809 + "jmp", 810 + "rm", 811 + "sav", 812 + "ppsm", 813 + "ppsx", 814 + "tar.gz", 815 + "reg", 816 + "dat" 817 + ]; 818 + var mimeTypes = [ 819 + "image/jpeg", 820 + "image/png", 821 + "image/gif", 822 + "image/webp", 823 + "image/flif", 824 + "image/x-xcf", 825 + "image/x-canon-cr2", 826 + "image/x-canon-cr3", 827 + "image/tiff", 828 + "image/bmp", 829 + "image/vnd.ms-photo", 830 + "image/vnd.adobe.photoshop", 831 + "application/x-indesign", 832 + "application/epub+zip", 833 + "application/x-xpinstall", 834 + "application/vnd.ms-powerpoint.slideshow.macroenabled.12", 835 + "application/vnd.oasis.opendocument.text", 836 + "application/vnd.oasis.opendocument.spreadsheet", 837 + "application/vnd.oasis.opendocument.presentation", 838 + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", 839 + "application/vnd.openxmlformats-officedocument.presentationml.presentation", 840 + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 841 + "application/vnd.openxmlformats-officedocument.presentationml.slideshow", 842 + "application/zip", 843 + "application/x-tar", 844 + "application/x-rar-compressed", 845 + "application/gzip", 846 + "application/x-bzip2", 847 + "application/x-7z-compressed", 848 + "application/x-apple-diskimage", 849 + "application/vnd.apache.arrow.file", 850 + "video/mp4", 851 + "audio/midi", 852 + "video/matroska", 853 + "video/webm", 854 + "video/quicktime", 855 + "video/vnd.avi", 856 + "audio/wav", 857 + "audio/qcelp", 858 + "audio/x-ms-asf", 859 + "video/x-ms-asf", 860 + "application/vnd.ms-asf", 861 + "video/mpeg", 862 + "video/3gpp", 863 + "audio/mpeg", 864 + "audio/mp4", 865 + // RFC 4337 866 + "video/ogg", 867 + "audio/ogg", 868 + "audio/ogg; codecs=opus", 869 + "application/ogg", 870 + "audio/flac", 871 + "audio/ape", 872 + "audio/wavpack", 873 + "audio/amr", 874 + "application/pdf", 875 + "application/x-elf", 876 + "application/x-mach-binary", 877 + "application/x-msdownload", 878 + "application/x-shockwave-flash", 879 + "application/rtf", 880 + "application/wasm", 881 + "font/woff", 882 + "font/woff2", 883 + "application/vnd.ms-fontobject", 884 + "font/ttf", 885 + "font/otf", 886 + "font/collection", 887 + "image/x-icon", 888 + "video/x-flv", 889 + "application/postscript", 890 + "application/eps", 891 + "application/x-xz", 892 + "application/x-sqlite3", 893 + "application/x-nintendo-nes-rom", 894 + "application/x-google-chrome-extension", 895 + "application/vnd.ms-cab-compressed", 896 + "application/x-deb", 897 + "application/x-unix-archive", 898 + "application/x-rpm", 899 + "application/x-compress", 900 + "application/x-lzip", 901 + "application/x-cfb", 902 + "application/x-mie", 903 + "application/mxf", 904 + "video/mp2t", 905 + "application/x-blender", 906 + "image/bpg", 907 + "image/j2c", 908 + "image/jp2", 909 + "image/jpx", 910 + "image/jpm", 911 + "image/mj2", 912 + "audio/aiff", 913 + "application/xml", 914 + "application/x-mobipocket-ebook", 915 + "image/heif", 916 + "image/heif-sequence", 917 + "image/heic", 918 + "image/heic-sequence", 919 + "image/icns", 920 + "image/ktx", 921 + "application/dicom", 922 + "audio/x-musepack", 923 + "text/calendar", 924 + "text/vcard", 925 + "text/vtt", 926 + "model/gltf-binary", 927 + "application/vnd.tcpdump.pcap", 928 + "audio/x-dsf", 929 + // Non-standard 930 + "application/x.ms.shortcut", 931 + // Invented by us 932 + "application/x.apple.alias", 933 + // Invented by us 934 + "audio/x-voc", 935 + "audio/vnd.dolby.dd-raw", 936 + "audio/x-m4a", 937 + "image/apng", 938 + "image/x-olympus-orf", 939 + "image/x-sony-arw", 940 + "image/x-adobe-dng", 941 + "image/x-nikon-nef", 942 + "image/x-panasonic-rw2", 943 + "image/x-fujifilm-raf", 944 + "video/x-m4v", 945 + "video/3gpp2", 946 + "application/x-esri-shape", 947 + "audio/aac", 948 + "audio/x-it", 949 + "audio/x-s3m", 950 + "audio/x-xm", 951 + "video/MP1S", 952 + "video/MP2P", 953 + "application/vnd.sketchup.skp", 954 + "image/avif", 955 + "application/x-lzh-compressed", 956 + "application/pgp-encrypted", 957 + "application/x-asar", 958 + "model/stl", 959 + "application/vnd.ms-htmlhelp", 960 + "model/3mf", 961 + "image/jxl", 962 + "application/zstd", 963 + "image/jls", 964 + "application/vnd.ms-outlook", 965 + "image/vnd.dwg", 966 + "application/vnd.apache.parquet", 967 + "application/java-vm", 968 + "application/x-arj", 969 + "application/x-cpio", 970 + "application/x-ace-compressed", 971 + "application/avro", 972 + "application/vnd.iccprofile", 973 + "application/x.autodesk.fbx", 974 + // Invented by us 975 + "application/vnd.visio", 976 + "application/vnd.android.package-archive", 977 + "application/vnd.google.draco", 978 + // Invented by us 979 + "application/x-lz4", 980 + // Invented by us 981 + "application/vnd.openxmlformats-officedocument.presentationml.template", 982 + "application/vnd.openxmlformats-officedocument.spreadsheetml.template", 983 + "application/vnd.openxmlformats-officedocument.wordprocessingml.template", 984 + "application/vnd.ms-excel.template.macroenabled.12", 985 + "application/vnd.oasis.opendocument.text-template", 986 + "application/vnd.oasis.opendocument.spreadsheet-template", 987 + "application/vnd.oasis.opendocument.presentation-template", 988 + "application/vnd.oasis.opendocument.graphics", 989 + "application/vnd.oasis.opendocument.graphics-template", 990 + "application/vnd.ms-excel.sheet.macroenabled.12", 991 + "application/vnd.ms-word.document.macroenabled.12", 992 + "application/vnd.ms-word.template.macroenabled.12", 993 + "application/vnd.ms-powerpoint.template.macroenabled.12", 994 + "application/vnd.ms-powerpoint.presentation.macroenabled.12", 995 + "application/java-archive", 996 + "application/vnd.rn-realmedia", 997 + "application/x-spss-sav", 998 + "application/x-ms-regedit", 999 + "application/x-ft-windows-registry-hive", 1000 + "application/x-jmp-data" 1001 + ]; 1002 + 1003 + // ../node_modules/.deno/file-type@21.3.0/node_modules/file-type/core.js 1004 + var reasonableDetectionSizeInBytes = 4100; 1005 + async function fileTypeFromBuffer(input, options) { 1006 + return new FileTypeParser(options).fromBuffer(input); 1007 + } 1008 + __name(fileTypeFromBuffer, "fileTypeFromBuffer"); 1009 + function getFileTypeFromMimeType(mimeType) { 1010 + mimeType = mimeType.toLowerCase(); 1011 + switch (mimeType) { 1012 + case "application/epub+zip": 1013 + return { 1014 + ext: "epub", 1015 + mime: mimeType 1016 + }; 1017 + case "application/vnd.oasis.opendocument.text": 1018 + return { 1019 + ext: "odt", 1020 + mime: mimeType 1021 + }; 1022 + case "application/vnd.oasis.opendocument.text-template": 1023 + return { 1024 + ext: "ott", 1025 + mime: mimeType 1026 + }; 1027 + case "application/vnd.oasis.opendocument.spreadsheet": 1028 + return { 1029 + ext: "ods", 1030 + mime: mimeType 1031 + }; 1032 + case "application/vnd.oasis.opendocument.spreadsheet-template": 1033 + return { 1034 + ext: "ots", 1035 + mime: mimeType 1036 + }; 1037 + case "application/vnd.oasis.opendocument.presentation": 1038 + return { 1039 + ext: "odp", 1040 + mime: mimeType 1041 + }; 1042 + case "application/vnd.oasis.opendocument.presentation-template": 1043 + return { 1044 + ext: "otp", 1045 + mime: mimeType 1046 + }; 1047 + case "application/vnd.oasis.opendocument.graphics": 1048 + return { 1049 + ext: "odg", 1050 + mime: mimeType 1051 + }; 1052 + case "application/vnd.oasis.opendocument.graphics-template": 1053 + return { 1054 + ext: "otg", 1055 + mime: mimeType 1056 + }; 1057 + case "application/vnd.openxmlformats-officedocument.presentationml.slideshow": 1058 + return { 1059 + ext: "ppsx", 1060 + mime: mimeType 1061 + }; 1062 + case "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": 1063 + return { 1064 + ext: "xlsx", 1065 + mime: mimeType 1066 + }; 1067 + case "application/vnd.ms-excel.sheet.macroenabled": 1068 + return { 1069 + ext: "xlsm", 1070 + mime: "application/vnd.ms-excel.sheet.macroenabled.12" 1071 + }; 1072 + case "application/vnd.openxmlformats-officedocument.spreadsheetml.template": 1073 + return { 1074 + ext: "xltx", 1075 + mime: mimeType 1076 + }; 1077 + case "application/vnd.ms-excel.template.macroenabled": 1078 + return { 1079 + ext: "xltm", 1080 + mime: "application/vnd.ms-excel.template.macroenabled.12" 1081 + }; 1082 + case "application/vnd.ms-powerpoint.slideshow.macroenabled": 1083 + return { 1084 + ext: "ppsm", 1085 + mime: "application/vnd.ms-powerpoint.slideshow.macroenabled.12" 1086 + }; 1087 + case "application/vnd.openxmlformats-officedocument.wordprocessingml.document": 1088 + return { 1089 + ext: "docx", 1090 + mime: mimeType 1091 + }; 1092 + case "application/vnd.ms-word.document.macroenabled": 1093 + return { 1094 + ext: "docm", 1095 + mime: "application/vnd.ms-word.document.macroenabled.12" 1096 + }; 1097 + case "application/vnd.openxmlformats-officedocument.wordprocessingml.template": 1098 + return { 1099 + ext: "dotx", 1100 + mime: mimeType 1101 + }; 1102 + case "application/vnd.ms-word.template.macroenabledtemplate": 1103 + return { 1104 + ext: "dotm", 1105 + mime: "application/vnd.ms-word.template.macroenabled.12" 1106 + }; 1107 + case "application/vnd.openxmlformats-officedocument.presentationml.template": 1108 + return { 1109 + ext: "potx", 1110 + mime: mimeType 1111 + }; 1112 + case "application/vnd.ms-powerpoint.template.macroenabled": 1113 + return { 1114 + ext: "potm", 1115 + mime: "application/vnd.ms-powerpoint.template.macroenabled.12" 1116 + }; 1117 + case "application/vnd.openxmlformats-officedocument.presentationml.presentation": 1118 + return { 1119 + ext: "pptx", 1120 + mime: mimeType 1121 + }; 1122 + case "application/vnd.ms-powerpoint.presentation.macroenabled": 1123 + return { 1124 + ext: "pptm", 1125 + mime: "application/vnd.ms-powerpoint.presentation.macroenabled.12" 1126 + }; 1127 + case "application/vnd.ms-visio.drawing": 1128 + return { 1129 + ext: "vsdx", 1130 + mime: "application/vnd.visio" 1131 + }; 1132 + case "application/vnd.ms-package.3dmanufacturing-3dmodel+xml": 1133 + return { 1134 + ext: "3mf", 1135 + mime: "model/3mf" 1136 + }; 1137 + default: 1138 + } 1139 + } 1140 + __name(getFileTypeFromMimeType, "getFileTypeFromMimeType"); 1141 + function _check(buffer, headers, options) { 1142 + options = { 1143 + offset: 0, 1144 + ...options 1145 + }; 1146 + for (const [index, header] of headers.entries()) { 1147 + if (options.mask) { 1148 + if (header !== (options.mask[index] & buffer[index + options.offset])) { 1149 + return false; 1150 + } 1151 + } else if (header !== buffer[index + options.offset]) { 1152 + return false; 1153 + } 1154 + } 1155 + return true; 1156 + } 1157 + __name(_check, "_check"); 1158 + var FileTypeParser = class { 1159 + static { 1160 + __name(this, "FileTypeParser"); 1161 + } 1162 + constructor(options) { 1163 + this.options = { 1164 + mpegOffsetTolerance: 0, 1165 + ...options 1166 + }; 1167 + this.detectors = [ 1168 + ...options?.customDetectors ?? [], 1169 + { id: "core", detect: this.detectConfident }, 1170 + { id: "core.imprecise", detect: this.detectImprecise } 1171 + ]; 1172 + this.tokenizerOptions = { 1173 + abortSignal: options?.signal 1174 + }; 1175 + } 1176 + async fromTokenizer(tokenizer3) { 1177 + const initialPosition = tokenizer3.position; 1178 + for (const detector of this.detectors) { 1179 + const fileType = await detector.detect(tokenizer3); 1180 + if (fileType) { 1181 + return fileType; 1182 + } 1183 + if (initialPosition !== tokenizer3.position) { 1184 + return void 0; 1185 + } 1186 + } 1187 + } 1188 + async fromBuffer(input) { 1189 + if (!(input instanceof Uint8Array || input instanceof ArrayBuffer)) { 1190 + throw new TypeError(`Expected the \`input\` argument to be of type \`Uint8Array\` or \`ArrayBuffer\`, got \`${typeof input}\``); 1191 + } 1192 + const buffer = input instanceof Uint8Array ? input : new Uint8Array(input); 1193 + if (!(buffer?.length > 1)) { 1194 + return; 1195 + } 1196 + return this.fromTokenizer(fromBuffer(buffer, this.tokenizerOptions)); 1197 + } 1198 + async fromBlob(blob) { 1199 + const tokenizer3 = fromBlob(blob, this.tokenizerOptions); 1200 + try { 1201 + return await this.fromTokenizer(tokenizer3); 1202 + } finally { 1203 + await tokenizer3.close(); 1204 + } 1205 + } 1206 + async fromStream(stream) { 1207 + const tokenizer3 = fromWebStream(stream, this.tokenizerOptions); 1208 + try { 1209 + return await this.fromTokenizer(tokenizer3); 1210 + } finally { 1211 + await tokenizer3.close(); 1212 + } 1213 + } 1214 + async toDetectionStream(stream, options) { 1215 + const { sampleSize = reasonableDetectionSizeInBytes } = options; 1216 + let detectedFileType; 1217 + let firstChunk; 1218 + const reader = stream.getReader({ mode: "byob" }); 1219 + try { 1220 + const { value: chunk, done } = await reader.read(new Uint8Array(sampleSize)); 1221 + firstChunk = chunk; 1222 + if (!done && chunk) { 1223 + try { 1224 + detectedFileType = await this.fromBuffer(chunk.subarray(0, sampleSize)); 1225 + } catch (error) { 1226 + if (!(error instanceof EndOfStreamError)) { 1227 + throw error; 1228 + } 1229 + detectedFileType = void 0; 1230 + } 1231 + } 1232 + firstChunk = chunk; 1233 + } finally { 1234 + reader.releaseLock(); 1235 + } 1236 + const transformStream = new TransformStream({ 1237 + async start(controller) { 1238 + controller.enqueue(firstChunk); 1239 + }, 1240 + transform(chunk, controller) { 1241 + controller.enqueue(chunk); 1242 + } 1243 + }); 1244 + const newStream = stream.pipeThrough(transformStream); 1245 + newStream.fileType = detectedFileType; 1246 + return newStream; 1247 + } 1248 + check(header, options) { 1249 + return _check(this.buffer, header, options); 1250 + } 1251 + checkString(header, options) { 1252 + return this.check(stringToBytes(header, options?.encoding), options); 1253 + } 1254 + // Detections with a high degree of certainty in identifying the correct file type 1255 + detectConfident = /* @__PURE__ */ __name(async (tokenizer3) => { 1256 + this.buffer = new Uint8Array(reasonableDetectionSizeInBytes); 1257 + if (tokenizer3.fileInfo.size === void 0) { 1258 + tokenizer3.fileInfo.size = Number.MAX_SAFE_INTEGER; 1259 + } 1260 + this.tokenizer = tokenizer3; 1261 + await tokenizer3.peekBuffer(this.buffer, { length: 32, mayBeLess: true }); 1262 + if (this.check([66, 77])) { 1263 + return { 1264 + ext: "bmp", 1265 + mime: "image/bmp" 1266 + }; 1267 + } 1268 + if (this.check([11, 119])) { 1269 + return { 1270 + ext: "ac3", 1271 + mime: "audio/vnd.dolby.dd-raw" 1272 + }; 1273 + } 1274 + if (this.check([120, 1])) { 1275 + return { 1276 + ext: "dmg", 1277 + mime: "application/x-apple-diskimage" 1278 + }; 1279 + } 1280 + if (this.check([77, 90])) { 1281 + return { 1282 + ext: "exe", 1283 + mime: "application/x-msdownload" 1284 + }; 1285 + } 1286 + if (this.check([37, 33])) { 1287 + await tokenizer3.peekBuffer(this.buffer, { length: 24, mayBeLess: true }); 1288 + if (this.checkString("PS-Adobe-", { offset: 2 }) && this.checkString(" EPSF-", { offset: 14 })) { 1289 + return { 1290 + ext: "eps", 1291 + mime: "application/eps" 1292 + }; 1293 + } 1294 + return { 1295 + ext: "ps", 1296 + mime: "application/postscript" 1297 + }; 1298 + } 1299 + if (this.check([31, 160]) || this.check([31, 157])) { 1300 + return { 1301 + ext: "Z", 1302 + mime: "application/x-compress" 1303 + }; 1304 + } 1305 + if (this.check([199, 113])) { 1306 + return { 1307 + ext: "cpio", 1308 + mime: "application/x-cpio" 1309 + }; 1310 + } 1311 + if (this.check([96, 234])) { 1312 + return { 1313 + ext: "arj", 1314 + mime: "application/x-arj" 1315 + }; 1316 + } 1317 + if (this.check([239, 187, 191])) { 1318 + this.tokenizer.ignore(3); 1319 + return this.detectConfident(tokenizer3); 1320 + } 1321 + if (this.check([71, 73, 70])) { 1322 + return { 1323 + ext: "gif", 1324 + mime: "image/gif" 1325 + }; 1326 + } 1327 + if (this.check([73, 73, 188])) { 1328 + return { 1329 + ext: "jxr", 1330 + mime: "image/vnd.ms-photo" 1331 + }; 1332 + } 1333 + if (this.check([31, 139, 8])) { 1334 + const gzipHandler = new GzipHandler(tokenizer3); 1335 + const stream = gzipHandler.inflate(); 1336 + let shouldCancelStream = true; 1337 + try { 1338 + let compressedFileType; 1339 + try { 1340 + compressedFileType = await this.fromStream(stream); 1341 + } catch { 1342 + shouldCancelStream = false; 1343 + } 1344 + if (compressedFileType && compressedFileType.ext === "tar") { 1345 + return { 1346 + ext: "tar.gz", 1347 + mime: "application/gzip" 1348 + }; 1349 + } 1350 + } finally { 1351 + if (shouldCancelStream) { 1352 + await stream.cancel(); 1353 + } 1354 + } 1355 + return { 1356 + ext: "gz", 1357 + mime: "application/gzip" 1358 + }; 1359 + } 1360 + if (this.check([66, 90, 104])) { 1361 + return { 1362 + ext: "bz2", 1363 + mime: "application/x-bzip2" 1364 + }; 1365 + } 1366 + if (this.checkString("ID3")) { 1367 + await tokenizer3.ignore(6); 1368 + const id3HeaderLength = await tokenizer3.readToken(uint32SyncSafeToken); 1369 + if (tokenizer3.position + id3HeaderLength > tokenizer3.fileInfo.size) { 1370 + return { 1371 + ext: "mp3", 1372 + mime: "audio/mpeg" 1373 + }; 1374 + } 1375 + await tokenizer3.ignore(id3HeaderLength); 1376 + return this.fromTokenizer(tokenizer3); 1377 + } 1378 + if (this.checkString("MP+")) { 1379 + return { 1380 + ext: "mpc", 1381 + mime: "audio/x-musepack" 1382 + }; 1383 + } 1384 + if ((this.buffer[0] === 67 || this.buffer[0] === 70) && this.check([87, 83], { offset: 1 })) { 1385 + return { 1386 + ext: "swf", 1387 + mime: "application/x-shockwave-flash" 1388 + }; 1389 + } 1390 + if (this.check([255, 216, 255])) { 1391 + if (this.check([247], { offset: 3 })) { 1392 + return { 1393 + ext: "jls", 1394 + mime: "image/jls" 1395 + }; 1396 + } 1397 + return { 1398 + ext: "jpg", 1399 + mime: "image/jpeg" 1400 + }; 1401 + } 1402 + if (this.check([79, 98, 106, 1])) { 1403 + return { 1404 + ext: "avro", 1405 + mime: "application/avro" 1406 + }; 1407 + } 1408 + if (this.checkString("FLIF")) { 1409 + return { 1410 + ext: "flif", 1411 + mime: "image/flif" 1412 + }; 1413 + } 1414 + if (this.checkString("8BPS")) { 1415 + return { 1416 + ext: "psd", 1417 + mime: "image/vnd.adobe.photoshop" 1418 + }; 1419 + } 1420 + if (this.checkString("MPCK")) { 1421 + return { 1422 + ext: "mpc", 1423 + mime: "audio/x-musepack" 1424 + }; 1425 + } 1426 + if (this.checkString("FORM")) { 1427 + return { 1428 + ext: "aif", 1429 + mime: "audio/aiff" 1430 + }; 1431 + } 1432 + if (this.checkString("icns", { offset: 0 })) { 1433 + return { 1434 + ext: "icns", 1435 + mime: "image/icns" 1436 + }; 1437 + } 1438 + if (this.check([80, 75, 3, 4])) { 1439 + let fileType; 1440 + await new ZipHandler(tokenizer3).unzip((zipHeader) => { 1441 + switch (zipHeader.filename) { 1442 + case "META-INF/mozilla.rsa": 1443 + fileType = { 1444 + ext: "xpi", 1445 + mime: "application/x-xpinstall" 1446 + }; 1447 + return { 1448 + stop: true 1449 + }; 1450 + case "META-INF/MANIFEST.MF": 1451 + fileType = { 1452 + ext: "jar", 1453 + mime: "application/java-archive" 1454 + }; 1455 + return { 1456 + stop: true 1457 + }; 1458 + case "mimetype": 1459 + return { 1460 + async handler(fileData) { 1461 + const mimeType = new TextDecoder("utf-8").decode(fileData).trim(); 1462 + fileType = getFileTypeFromMimeType(mimeType); 1463 + }, 1464 + stop: true 1465 + }; 1466 + case "[Content_Types].xml": 1467 + return { 1468 + async handler(fileData) { 1469 + let xmlContent = new TextDecoder("utf-8").decode(fileData); 1470 + const endPos = xmlContent.indexOf('.main+xml"'); 1471 + if (endPos === -1) { 1472 + const mimeType = "application/vnd.ms-package.3dmanufacturing-3dmodel+xml"; 1473 + if (xmlContent.includes(`ContentType="${mimeType}"`)) { 1474 + fileType = getFileTypeFromMimeType(mimeType); 1475 + } 1476 + } else { 1477 + xmlContent = xmlContent.slice(0, Math.max(0, endPos)); 1478 + const firstPos = xmlContent.lastIndexOf('"'); 1479 + const mimeType = xmlContent.slice(Math.max(0, firstPos + 1)); 1480 + fileType = getFileTypeFromMimeType(mimeType); 1481 + } 1482 + }, 1483 + stop: true 1484 + }; 1485 + default: 1486 + if (/classes\d*\.dex/.test(zipHeader.filename)) { 1487 + fileType = { 1488 + ext: "apk", 1489 + mime: "application/vnd.android.package-archive" 1490 + }; 1491 + return { stop: true }; 1492 + } 1493 + return {}; 1494 + } 1495 + }).catch((error) => { 1496 + if (!(error instanceof EndOfStreamError)) { 1497 + throw error; 1498 + } 1499 + }); 1500 + return fileType ?? { 1501 + ext: "zip", 1502 + mime: "application/zip" 1503 + }; 1504 + } 1505 + if (this.checkString("OggS")) { 1506 + await tokenizer3.ignore(28); 1507 + const type = new Uint8Array(8); 1508 + await tokenizer3.readBuffer(type); 1509 + if (_check(type, [79, 112, 117, 115, 72, 101, 97, 100])) { 1510 + return { 1511 + ext: "opus", 1512 + mime: "audio/ogg; codecs=opus" 1513 + }; 1514 + } 1515 + if (_check(type, [128, 116, 104, 101, 111, 114, 97])) { 1516 + return { 1517 + ext: "ogv", 1518 + mime: "video/ogg" 1519 + }; 1520 + } 1521 + if (_check(type, [1, 118, 105, 100, 101, 111, 0])) { 1522 + return { 1523 + ext: "ogm", 1524 + mime: "video/ogg" 1525 + }; 1526 + } 1527 + if (_check(type, [127, 70, 76, 65, 67])) { 1528 + return { 1529 + ext: "oga", 1530 + mime: "audio/ogg" 1531 + }; 1532 + } 1533 + if (_check(type, [83, 112, 101, 101, 120, 32, 32])) { 1534 + return { 1535 + ext: "spx", 1536 + mime: "audio/ogg" 1537 + }; 1538 + } 1539 + if (_check(type, [1, 118, 111, 114, 98, 105, 115])) { 1540 + return { 1541 + ext: "ogg", 1542 + mime: "audio/ogg" 1543 + }; 1544 + } 1545 + return { 1546 + ext: "ogx", 1547 + mime: "application/ogg" 1548 + }; 1549 + } 1550 + if (this.check([80, 75]) && (this.buffer[2] === 3 || this.buffer[2] === 5 || this.buffer[2] === 7) && (this.buffer[3] === 4 || this.buffer[3] === 6 || this.buffer[3] === 8)) { 1551 + return { 1552 + ext: "zip", 1553 + mime: "application/zip" 1554 + }; 1555 + } 1556 + if (this.checkString("MThd")) { 1557 + return { 1558 + ext: "mid", 1559 + mime: "audio/midi" 1560 + }; 1561 + } 1562 + if (this.checkString("wOFF") && (this.check([0, 1, 0, 0], { offset: 4 }) || this.checkString("OTTO", { offset: 4 }))) { 1563 + return { 1564 + ext: "woff", 1565 + mime: "font/woff" 1566 + }; 1567 + } 1568 + if (this.checkString("wOF2") && (this.check([0, 1, 0, 0], { offset: 4 }) || this.checkString("OTTO", { offset: 4 }))) { 1569 + return { 1570 + ext: "woff2", 1571 + mime: "font/woff2" 1572 + }; 1573 + } 1574 + if (this.check([212, 195, 178, 161]) || this.check([161, 178, 195, 212])) { 1575 + return { 1576 + ext: "pcap", 1577 + mime: "application/vnd.tcpdump.pcap" 1578 + }; 1579 + } 1580 + if (this.checkString("DSD ")) { 1581 + return { 1582 + ext: "dsf", 1583 + mime: "audio/x-dsf" 1584 + // Non-standard 1585 + }; 1586 + } 1587 + if (this.checkString("LZIP")) { 1588 + return { 1589 + ext: "lz", 1590 + mime: "application/x-lzip" 1591 + }; 1592 + } 1593 + if (this.checkString("fLaC")) { 1594 + return { 1595 + ext: "flac", 1596 + mime: "audio/flac" 1597 + }; 1598 + } 1599 + if (this.check([66, 80, 71, 251])) { 1600 + return { 1601 + ext: "bpg", 1602 + mime: "image/bpg" 1603 + }; 1604 + } 1605 + if (this.checkString("wvpk")) { 1606 + return { 1607 + ext: "wv", 1608 + mime: "audio/wavpack" 1609 + }; 1610 + } 1611 + if (this.checkString("%PDF")) { 1612 + return { 1613 + ext: "pdf", 1614 + mime: "application/pdf" 1615 + }; 1616 + } 1617 + if (this.check([0, 97, 115, 109])) { 1618 + return { 1619 + ext: "wasm", 1620 + mime: "application/wasm" 1621 + }; 1622 + } 1623 + if (this.check([73, 73])) { 1624 + const fileType = await this.readTiffHeader(false); 1625 + if (fileType) { 1626 + return fileType; 1627 + } 1628 + } 1629 + if (this.check([77, 77])) { 1630 + const fileType = await this.readTiffHeader(true); 1631 + if (fileType) { 1632 + return fileType; 1633 + } 1634 + } 1635 + if (this.checkString("MAC ")) { 1636 + return { 1637 + ext: "ape", 1638 + mime: "audio/ape" 1639 + }; 1640 + } 1641 + if (this.check([26, 69, 223, 163])) { 1642 + async function readField() { 1643 + const msb = await tokenizer3.peekNumber(UINT8); 1644 + let mask = 128; 1645 + let ic = 0; 1646 + while ((msb & mask) === 0 && mask !== 0) { 1647 + ++ic; 1648 + mask >>= 1; 1649 + } 1650 + const id = new Uint8Array(ic + 1); 1651 + await tokenizer3.readBuffer(id); 1652 + return id; 1653 + } 1654 + __name(readField, "readField"); 1655 + async function readElement() { 1656 + const idField = await readField(); 1657 + const lengthField = await readField(); 1658 + lengthField[0] ^= 128 >> lengthField.length - 1; 1659 + const nrLength = Math.min(6, lengthField.length); 1660 + const idView = new DataView(idField.buffer); 1661 + const lengthView = new DataView(lengthField.buffer, lengthField.length - nrLength, nrLength); 1662 + return { 1663 + id: getUintBE(idView), 1664 + len: getUintBE(lengthView) 1665 + }; 1666 + } 1667 + __name(readElement, "readElement"); 1668 + async function readChildren(children) { 1669 + while (children > 0) { 1670 + const element = await readElement(); 1671 + if (element.id === 17026) { 1672 + const rawValue = await tokenizer3.readToken(new StringType(element.len)); 1673 + return rawValue.replaceAll(/\00.*$/g, ""); 1674 + } 1675 + await tokenizer3.ignore(element.len); 1676 + --children; 1677 + } 1678 + } 1679 + __name(readChildren, "readChildren"); 1680 + const re = await readElement(); 1681 + const documentType = await readChildren(re.len); 1682 + switch (documentType) { 1683 + case "webm": 1684 + return { 1685 + ext: "webm", 1686 + mime: "video/webm" 1687 + }; 1688 + case "matroska": 1689 + return { 1690 + ext: "mkv", 1691 + mime: "video/matroska" 1692 + }; 1693 + default: 1694 + return; 1695 + } 1696 + } 1697 + if (this.checkString("SQLi")) { 1698 + return { 1699 + ext: "sqlite", 1700 + mime: "application/x-sqlite3" 1701 + }; 1702 + } 1703 + if (this.check([78, 69, 83, 26])) { 1704 + return { 1705 + ext: "nes", 1706 + mime: "application/x-nintendo-nes-rom" 1707 + }; 1708 + } 1709 + if (this.checkString("Cr24")) { 1710 + return { 1711 + ext: "crx", 1712 + mime: "application/x-google-chrome-extension" 1713 + }; 1714 + } 1715 + if (this.checkString("MSCF") || this.checkString("ISc(")) { 1716 + return { 1717 + ext: "cab", 1718 + mime: "application/vnd.ms-cab-compressed" 1719 + }; 1720 + } 1721 + if (this.check([237, 171, 238, 219])) { 1722 + return { 1723 + ext: "rpm", 1724 + mime: "application/x-rpm" 1725 + }; 1726 + } 1727 + if (this.check([197, 208, 211, 198])) { 1728 + return { 1729 + ext: "eps", 1730 + mime: "application/eps" 1731 + }; 1732 + } 1733 + if (this.check([40, 181, 47, 253])) { 1734 + return { 1735 + ext: "zst", 1736 + mime: "application/zstd" 1737 + }; 1738 + } 1739 + if (this.check([127, 69, 76, 70])) { 1740 + return { 1741 + ext: "elf", 1742 + mime: "application/x-elf" 1743 + }; 1744 + } 1745 + if (this.check([33, 66, 68, 78])) { 1746 + return { 1747 + ext: "pst", 1748 + mime: "application/vnd.ms-outlook" 1749 + }; 1750 + } 1751 + if (this.checkString("PAR1") || this.checkString("PARE")) { 1752 + return { 1753 + ext: "parquet", 1754 + mime: "application/vnd.apache.parquet" 1755 + }; 1756 + } 1757 + if (this.checkString("ttcf")) { 1758 + return { 1759 + ext: "ttc", 1760 + mime: "font/collection" 1761 + }; 1762 + } 1763 + if (this.check([254, 237, 250, 206]) || this.check([254, 237, 250, 207]) || this.check([206, 250, 237, 254]) || this.check([207, 250, 237, 254])) { 1764 + return { 1765 + ext: "macho", 1766 + mime: "application/x-mach-binary" 1767 + }; 1768 + } 1769 + if (this.check([4, 34, 77, 24])) { 1770 + return { 1771 + ext: "lz4", 1772 + mime: "application/x-lz4" 1773 + // Invented by us 1774 + }; 1775 + } 1776 + if (this.checkString("regf")) { 1777 + return { 1778 + ext: "dat", 1779 + mime: "application/x-ft-windows-registry-hive" 1780 + }; 1781 + } 1782 + if (this.checkString("$FL2") || this.checkString("$FL3")) { 1783 + return { 1784 + ext: "sav", 1785 + mime: "application/x-spss-sav" 1786 + }; 1787 + } 1788 + if (this.check([79, 84, 84, 79, 0])) { 1789 + return { 1790 + ext: "otf", 1791 + mime: "font/otf" 1792 + }; 1793 + } 1794 + if (this.checkString("#!AMR")) { 1795 + return { 1796 + ext: "amr", 1797 + mime: "audio/amr" 1798 + }; 1799 + } 1800 + if (this.checkString("{\\rtf")) { 1801 + return { 1802 + ext: "rtf", 1803 + mime: "application/rtf" 1804 + }; 1805 + } 1806 + if (this.check([70, 76, 86, 1])) { 1807 + return { 1808 + ext: "flv", 1809 + mime: "video/x-flv" 1810 + }; 1811 + } 1812 + if (this.checkString("IMPM")) { 1813 + return { 1814 + ext: "it", 1815 + mime: "audio/x-it" 1816 + }; 1817 + } 1818 + if (this.checkString("-lh0-", { offset: 2 }) || this.checkString("-lh1-", { offset: 2 }) || this.checkString("-lh2-", { offset: 2 }) || this.checkString("-lh3-", { offset: 2 }) || this.checkString("-lh4-", { offset: 2 }) || this.checkString("-lh5-", { offset: 2 }) || this.checkString("-lh6-", { offset: 2 }) || this.checkString("-lh7-", { offset: 2 }) || this.checkString("-lzs-", { offset: 2 }) || this.checkString("-lz4-", { offset: 2 }) || this.checkString("-lz5-", { offset: 2 }) || this.checkString("-lhd-", { offset: 2 })) { 1819 + return { 1820 + ext: "lzh", 1821 + mime: "application/x-lzh-compressed" 1822 + }; 1823 + } 1824 + if (this.check([0, 0, 1, 186])) { 1825 + if (this.check([33], { offset: 4, mask: [241] })) { 1826 + return { 1827 + ext: "mpg", 1828 + // May also be .ps, .mpeg 1829 + mime: "video/MP1S" 1830 + }; 1831 + } 1832 + if (this.check([68], { offset: 4, mask: [196] })) { 1833 + return { 1834 + ext: "mpg", 1835 + // May also be .mpg, .m2p, .vob or .sub 1836 + mime: "video/MP2P" 1837 + }; 1838 + } 1839 + } 1840 + if (this.checkString("ITSF")) { 1841 + return { 1842 + ext: "chm", 1843 + mime: "application/vnd.ms-htmlhelp" 1844 + }; 1845 + } 1846 + if (this.check([202, 254, 186, 190])) { 1847 + const machOArchitectureCount = UINT32_BE.get(this.buffer, 4); 1848 + const javaClassFileMajorVersion = UINT16_BE.get(this.buffer, 6); 1849 + if (machOArchitectureCount > 0 && machOArchitectureCount <= 30) { 1850 + return { 1851 + ext: "macho", 1852 + mime: "application/x-mach-binary" 1853 + }; 1854 + } 1855 + if (javaClassFileMajorVersion > 30) { 1856 + return { 1857 + ext: "class", 1858 + mime: "application/java-vm" 1859 + }; 1860 + } 1861 + } 1862 + if (this.checkString(".RMF")) { 1863 + return { 1864 + ext: "rm", 1865 + mime: "application/vnd.rn-realmedia" 1866 + }; 1867 + } 1868 + if (this.checkString("DRACO")) { 1869 + return { 1870 + ext: "drc", 1871 + mime: "application/vnd.google.draco" 1872 + // Invented by us 1873 + }; 1874 + } 1875 + if (this.check([253, 55, 122, 88, 90, 0])) { 1876 + return { 1877 + ext: "xz", 1878 + mime: "application/x-xz" 1879 + }; 1880 + } 1881 + if (this.checkString("<?xml ")) { 1882 + return { 1883 + ext: "xml", 1884 + mime: "application/xml" 1885 + }; 1886 + } 1887 + if (this.check([55, 122, 188, 175, 39, 28])) { 1888 + return { 1889 + ext: "7z", 1890 + mime: "application/x-7z-compressed" 1891 + }; 1892 + } 1893 + if (this.check([82, 97, 114, 33, 26, 7]) && (this.buffer[6] === 0 || this.buffer[6] === 1)) { 1894 + return { 1895 + ext: "rar", 1896 + mime: "application/x-rar-compressed" 1897 + }; 1898 + } 1899 + if (this.checkString("solid ")) { 1900 + return { 1901 + ext: "stl", 1902 + mime: "model/stl" 1903 + }; 1904 + } 1905 + if (this.checkString("AC")) { 1906 + const version = new StringType(4, "latin1").get(this.buffer, 2); 1907 + if (version.match("^d*") && version >= 1e3 && version <= 1050) { 1908 + return { 1909 + ext: "dwg", 1910 + mime: "image/vnd.dwg" 1911 + }; 1912 + } 1913 + } 1914 + if (this.checkString("070707")) { 1915 + return { 1916 + ext: "cpio", 1917 + mime: "application/x-cpio" 1918 + }; 1919 + } 1920 + if (this.checkString("BLENDER")) { 1921 + return { 1922 + ext: "blend", 1923 + mime: "application/x-blender" 1924 + }; 1925 + } 1926 + if (this.checkString("!<arch>")) { 1927 + await tokenizer3.ignore(8); 1928 + const string = await tokenizer3.readToken(new StringType(13, "ascii")); 1929 + if (string === "debian-binary") { 1930 + return { 1931 + ext: "deb", 1932 + mime: "application/x-deb" 1933 + }; 1934 + } 1935 + return { 1936 + ext: "ar", 1937 + mime: "application/x-unix-archive" 1938 + }; 1939 + } 1940 + if (this.checkString("WEBVTT") && // One of LF, CR, tab, space, or end of file must follow "WEBVTT" per the spec (see `fixture/fixture-vtt-*.vtt` for examples). Note that `\0` is technically the null character (there is no such thing as an EOF character). However, checking for `\0` gives us the same result as checking for the end of the stream. 1941 + ["\n", "\r", " ", " ", "\0"].some((char7) => this.checkString(char7, { offset: 6 }))) { 1942 + return { 1943 + ext: "vtt", 1944 + mime: "text/vtt" 1945 + }; 1946 + } 1947 + if (this.check([137, 80, 78, 71, 13, 10, 26, 10])) { 1948 + await tokenizer3.ignore(8); 1949 + async function readChunkHeader() { 1950 + return { 1951 + length: await tokenizer3.readToken(INT32_BE), 1952 + type: await tokenizer3.readToken(new StringType(4, "latin1")) 1953 + }; 1954 + } 1955 + __name(readChunkHeader, "readChunkHeader"); 1956 + do { 1957 + const chunk = await readChunkHeader(); 1958 + if (chunk.length < 0) { 1959 + return; 1960 + } 1961 + switch (chunk.type) { 1962 + case "IDAT": 1963 + return { 1964 + ext: "png", 1965 + mime: "image/png" 1966 + }; 1967 + case "acTL": 1968 + return { 1969 + ext: "apng", 1970 + mime: "image/apng" 1971 + }; 1972 + default: 1973 + await tokenizer3.ignore(chunk.length + 4); 1974 + } 1975 + } while (tokenizer3.position + 8 < tokenizer3.fileInfo.size); 1976 + return { 1977 + ext: "png", 1978 + mime: "image/png" 1979 + }; 1980 + } 1981 + if (this.check([65, 82, 82, 79, 87, 49, 0, 0])) { 1982 + return { 1983 + ext: "arrow", 1984 + mime: "application/vnd.apache.arrow.file" 1985 + }; 1986 + } 1987 + if (this.check([103, 108, 84, 70, 2, 0, 0, 0])) { 1988 + return { 1989 + ext: "glb", 1990 + mime: "model/gltf-binary" 1991 + }; 1992 + } 1993 + if (this.check([102, 114, 101, 101], { offset: 4 }) || this.check([109, 100, 97, 116], { offset: 4 }) || this.check([109, 111, 111, 118], { offset: 4 }) || this.check([119, 105, 100, 101], { offset: 4 })) { 1994 + return { 1995 + ext: "mov", 1996 + mime: "video/quicktime" 1997 + }; 1998 + } 1999 + if (this.check([73, 73, 82, 79, 8, 0, 0, 0, 24])) { 2000 + return { 2001 + ext: "orf", 2002 + mime: "image/x-olympus-orf" 2003 + }; 2004 + } 2005 + if (this.checkString("gimp xcf ")) { 2006 + return { 2007 + ext: "xcf", 2008 + mime: "image/x-xcf" 2009 + }; 2010 + } 2011 + if (this.checkString("ftyp", { offset: 4 }) && (this.buffer[8] & 96) !== 0) { 2012 + const brandMajor = new StringType(4, "latin1").get(this.buffer, 8).replace("\0", " ").trim(); 2013 + switch (brandMajor) { 2014 + case "avif": 2015 + case "avis": 2016 + return { ext: "avif", mime: "image/avif" }; 2017 + case "mif1": 2018 + return { ext: "heic", mime: "image/heif" }; 2019 + case "msf1": 2020 + return { ext: "heic", mime: "image/heif-sequence" }; 2021 + case "heic": 2022 + case "heix": 2023 + return { ext: "heic", mime: "image/heic" }; 2024 + case "hevc": 2025 + case "hevx": 2026 + return { ext: "heic", mime: "image/heic-sequence" }; 2027 + case "qt": 2028 + return { ext: "mov", mime: "video/quicktime" }; 2029 + case "M4V": 2030 + case "M4VH": 2031 + case "M4VP": 2032 + return { ext: "m4v", mime: "video/x-m4v" }; 2033 + case "M4P": 2034 + return { ext: "m4p", mime: "video/mp4" }; 2035 + case "M4B": 2036 + return { ext: "m4b", mime: "audio/mp4" }; 2037 + case "M4A": 2038 + return { ext: "m4a", mime: "audio/x-m4a" }; 2039 + case "F4V": 2040 + return { ext: "f4v", mime: "video/mp4" }; 2041 + case "F4P": 2042 + return { ext: "f4p", mime: "video/mp4" }; 2043 + case "F4A": 2044 + return { ext: "f4a", mime: "audio/mp4" }; 2045 + case "F4B": 2046 + return { ext: "f4b", mime: "audio/mp4" }; 2047 + case "crx": 2048 + return { ext: "cr3", mime: "image/x-canon-cr3" }; 2049 + default: 2050 + if (brandMajor.startsWith("3g")) { 2051 + if (brandMajor.startsWith("3g2")) { 2052 + return { ext: "3g2", mime: "video/3gpp2" }; 2053 + } 2054 + return { ext: "3gp", mime: "video/3gpp" }; 2055 + } 2056 + return { ext: "mp4", mime: "video/mp4" }; 2057 + } 2058 + } 2059 + if (this.checkString("REGEDIT4\r\n")) { 2060 + return { 2061 + ext: "reg", 2062 + mime: "application/x-ms-regedit" 2063 + }; 2064 + } 2065 + if (this.check([82, 73, 70, 70])) { 2066 + if (this.checkString("WEBP", { offset: 8 })) { 2067 + return { 2068 + ext: "webp", 2069 + mime: "image/webp" 2070 + }; 2071 + } 2072 + if (this.check([65, 86, 73], { offset: 8 })) { 2073 + return { 2074 + ext: "avi", 2075 + mime: "video/vnd.avi" 2076 + }; 2077 + } 2078 + if (this.check([87, 65, 86, 69], { offset: 8 })) { 2079 + return { 2080 + ext: "wav", 2081 + mime: "audio/wav" 2082 + }; 2083 + } 2084 + if (this.check([81, 76, 67, 77], { offset: 8 })) { 2085 + return { 2086 + ext: "qcp", 2087 + mime: "audio/qcelp" 2088 + }; 2089 + } 2090 + } 2091 + if (this.check([73, 73, 85, 0, 24, 0, 0, 0, 136, 231, 116, 216])) { 2092 + return { 2093 + ext: "rw2", 2094 + mime: "image/x-panasonic-rw2" 2095 + }; 2096 + } 2097 + if (this.check([48, 38, 178, 117, 142, 102, 207, 17, 166, 217])) { 2098 + async function readHeader() { 2099 + const guid = new Uint8Array(16); 2100 + await tokenizer3.readBuffer(guid); 2101 + return { 2102 + id: guid, 2103 + size: Number(await tokenizer3.readToken(UINT64_LE)) 2104 + }; 2105 + } 2106 + __name(readHeader, "readHeader"); 2107 + await tokenizer3.ignore(30); 2108 + while (tokenizer3.position + 24 < tokenizer3.fileInfo.size) { 2109 + const header = await readHeader(); 2110 + let payload = header.size - 24; 2111 + if (_check(header.id, [145, 7, 220, 183, 183, 169, 207, 17, 142, 230, 0, 192, 12, 32, 83, 101])) { 2112 + const typeId = new Uint8Array(16); 2113 + payload -= await tokenizer3.readBuffer(typeId); 2114 + if (_check(typeId, [64, 158, 105, 248, 77, 91, 207, 17, 168, 253, 0, 128, 95, 92, 68, 43])) { 2115 + return { 2116 + ext: "asf", 2117 + mime: "audio/x-ms-asf" 2118 + }; 2119 + } 2120 + if (_check(typeId, [192, 239, 25, 188, 77, 91, 207, 17, 168, 253, 0, 128, 95, 92, 68, 43])) { 2121 + return { 2122 + ext: "asf", 2123 + mime: "video/x-ms-asf" 2124 + }; 2125 + } 2126 + break; 2127 + } 2128 + await tokenizer3.ignore(payload); 2129 + } 2130 + return { 2131 + ext: "asf", 2132 + mime: "application/vnd.ms-asf" 2133 + }; 2134 + } 2135 + if (this.check([171, 75, 84, 88, 32, 49, 49, 187, 13, 10, 26, 10])) { 2136 + return { 2137 + ext: "ktx", 2138 + mime: "image/ktx" 2139 + }; 2140 + } 2141 + if ((this.check([126, 16, 4]) || this.check([126, 24, 4])) && this.check([48, 77, 73, 69], { offset: 4 })) { 2142 + return { 2143 + ext: "mie", 2144 + mime: "application/x-mie" 2145 + }; 2146 + } 2147 + if (this.check([39, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], { offset: 2 })) { 2148 + return { 2149 + ext: "shp", 2150 + mime: "application/x-esri-shape" 2151 + }; 2152 + } 2153 + if (this.check([255, 79, 255, 81])) { 2154 + return { 2155 + ext: "j2c", 2156 + mime: "image/j2c" 2157 + }; 2158 + } 2159 + if (this.check([0, 0, 0, 12, 106, 80, 32, 32, 13, 10, 135, 10])) { 2160 + await tokenizer3.ignore(20); 2161 + const type = await tokenizer3.readToken(new StringType(4, "ascii")); 2162 + switch (type) { 2163 + case "jp2 ": 2164 + return { 2165 + ext: "jp2", 2166 + mime: "image/jp2" 2167 + }; 2168 + case "jpx ": 2169 + return { 2170 + ext: "jpx", 2171 + mime: "image/jpx" 2172 + }; 2173 + case "jpm ": 2174 + return { 2175 + ext: "jpm", 2176 + mime: "image/jpm" 2177 + }; 2178 + case "mjp2": 2179 + return { 2180 + ext: "mj2", 2181 + mime: "image/mj2" 2182 + }; 2183 + default: 2184 + return; 2185 + } 2186 + } 2187 + if (this.check([255, 10]) || this.check([0, 0, 0, 12, 74, 88, 76, 32, 13, 10, 135, 10])) { 2188 + return { 2189 + ext: "jxl", 2190 + mime: "image/jxl" 2191 + }; 2192 + } 2193 + if (this.check([254, 255])) { 2194 + if (this.checkString("<?xml ", { offset: 2, encoding: "utf-16be" })) { 2195 + return { 2196 + ext: "xml", 2197 + mime: "application/xml" 2198 + }; 2199 + } 2200 + return void 0; 2201 + } 2202 + if (this.check([208, 207, 17, 224, 161, 177, 26, 225])) { 2203 + return { 2204 + ext: "cfb", 2205 + mime: "application/x-cfb" 2206 + }; 2207 + } 2208 + await tokenizer3.peekBuffer(this.buffer, { length: Math.min(256, tokenizer3.fileInfo.size), mayBeLess: true }); 2209 + if (this.check([97, 99, 115, 112], { offset: 36 })) { 2210 + return { 2211 + ext: "icc", 2212 + mime: "application/vnd.iccprofile" 2213 + }; 2214 + } 2215 + if (this.checkString("**ACE", { offset: 7 }) && this.checkString("**", { offset: 12 })) { 2216 + return { 2217 + ext: "ace", 2218 + mime: "application/x-ace-compressed" 2219 + }; 2220 + } 2221 + if (this.checkString("BEGIN:")) { 2222 + if (this.checkString("VCARD", { offset: 6 })) { 2223 + return { 2224 + ext: "vcf", 2225 + mime: "text/vcard" 2226 + }; 2227 + } 2228 + if (this.checkString("VCALENDAR", { offset: 6 })) { 2229 + return { 2230 + ext: "ics", 2231 + mime: "text/calendar" 2232 + }; 2233 + } 2234 + } 2235 + if (this.checkString("FUJIFILMCCD-RAW")) { 2236 + return { 2237 + ext: "raf", 2238 + mime: "image/x-fujifilm-raf" 2239 + }; 2240 + } 2241 + if (this.checkString("Extended Module:")) { 2242 + return { 2243 + ext: "xm", 2244 + mime: "audio/x-xm" 2245 + }; 2246 + } 2247 + if (this.checkString("Creative Voice File")) { 2248 + return { 2249 + ext: "voc", 2250 + mime: "audio/x-voc" 2251 + }; 2252 + } 2253 + if (this.check([4, 0, 0, 0]) && this.buffer.length >= 16) { 2254 + const jsonSize = new DataView(this.buffer.buffer).getUint32(12, true); 2255 + if (jsonSize > 12 && this.buffer.length >= jsonSize + 16) { 2256 + try { 2257 + const header = new TextDecoder().decode(this.buffer.subarray(16, jsonSize + 16)); 2258 + const json = JSON.parse(header); 2259 + if (json.files) { 2260 + return { 2261 + ext: "asar", 2262 + mime: "application/x-asar" 2263 + }; 2264 + } 2265 + } catch { 2266 + } 2267 + } 2268 + } 2269 + if (this.check([6, 14, 43, 52, 2, 5, 1, 1, 13, 1, 2, 1, 1, 2])) { 2270 + return { 2271 + ext: "mxf", 2272 + mime: "application/mxf" 2273 + }; 2274 + } 2275 + if (this.checkString("SCRM", { offset: 44 })) { 2276 + return { 2277 + ext: "s3m", 2278 + mime: "audio/x-s3m" 2279 + }; 2280 + } 2281 + if (this.check([71]) && this.check([71], { offset: 188 })) { 2282 + return { 2283 + ext: "mts", 2284 + mime: "video/mp2t" 2285 + }; 2286 + } 2287 + if (this.check([71], { offset: 4 }) && this.check([71], { offset: 196 })) { 2288 + return { 2289 + ext: "mts", 2290 + mime: "video/mp2t" 2291 + }; 2292 + } 2293 + if (this.check([66, 79, 79, 75, 77, 79, 66, 73], { offset: 60 })) { 2294 + return { 2295 + ext: "mobi", 2296 + mime: "application/x-mobipocket-ebook" 2297 + }; 2298 + } 2299 + if (this.check([68, 73, 67, 77], { offset: 128 })) { 2300 + return { 2301 + ext: "dcm", 2302 + mime: "application/dicom" 2303 + }; 2304 + } 2305 + if (this.check([76, 0, 0, 0, 1, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70])) { 2306 + return { 2307 + ext: "lnk", 2308 + mime: "application/x.ms.shortcut" 2309 + // Invented by us 2310 + }; 2311 + } 2312 + if (this.check([98, 111, 111, 107, 0, 0, 0, 0, 109, 97, 114, 107, 0, 0, 0, 0])) { 2313 + return { 2314 + ext: "alias", 2315 + mime: "application/x.apple.alias" 2316 + // Invented by us 2317 + }; 2318 + } 2319 + if (this.checkString("Kaydara FBX Binary \0")) { 2320 + return { 2321 + ext: "fbx", 2322 + mime: "application/x.autodesk.fbx" 2323 + // Invented by us 2324 + }; 2325 + } 2326 + if (this.check([76, 80], { offset: 34 }) && (this.check([0, 0, 1], { offset: 8 }) || this.check([1, 0, 2], { offset: 8 }) || this.check([2, 0, 2], { offset: 8 }))) { 2327 + return { 2328 + ext: "eot", 2329 + mime: "application/vnd.ms-fontobject" 2330 + }; 2331 + } 2332 + if (this.check([6, 6, 237, 245, 216, 29, 70, 229, 189, 49, 239, 231, 254, 116, 183, 29])) { 2333 + return { 2334 + ext: "indd", 2335 + mime: "application/x-indesign" 2336 + }; 2337 + } 2338 + if (this.check([255, 255, 0, 0, 7, 0, 0, 0, 4, 0, 0, 0, 1, 0, 1, 0]) || this.check([0, 0, 255, 255, 0, 0, 0, 7, 0, 0, 0, 4, 0, 1, 0, 1])) { 2339 + return { 2340 + ext: "jmp", 2341 + mime: "application/x-jmp-data" 2342 + }; 2343 + } 2344 + await tokenizer3.peekBuffer(this.buffer, { length: Math.min(512, tokenizer3.fileInfo.size), mayBeLess: true }); 2345 + if (this.checkString("ustar", { offset: 257 }) && (this.checkString("\0", { offset: 262 }) || this.checkString(" ", { offset: 262 })) || this.check([0, 0, 0, 0, 0, 0], { offset: 257 }) && tarHeaderChecksumMatches(this.buffer)) { 2346 + return { 2347 + ext: "tar", 2348 + mime: "application/x-tar" 2349 + }; 2350 + } 2351 + if (this.check([255, 254])) { 2352 + const encoding = "utf-16le"; 2353 + if (this.checkString("<?xml ", { offset: 2, encoding })) { 2354 + return { 2355 + ext: "xml", 2356 + mime: "application/xml" 2357 + }; 2358 + } 2359 + if (this.check([255, 14], { offset: 2 }) && this.checkString("SketchUp Model", { offset: 4, encoding })) { 2360 + return { 2361 + ext: "skp", 2362 + mime: "application/vnd.sketchup.skp" 2363 + }; 2364 + } 2365 + if (this.checkString("Windows Registry Editor Version 5.00\r\n", { offset: 2, encoding })) { 2366 + return { 2367 + ext: "reg", 2368 + mime: "application/x-ms-regedit" 2369 + }; 2370 + } 2371 + return void 0; 2372 + } 2373 + if (this.checkString("-----BEGIN PGP MESSAGE-----")) { 2374 + return { 2375 + ext: "pgp", 2376 + mime: "application/pgp-encrypted" 2377 + }; 2378 + } 2379 + }, "detectConfident"); 2380 + // Detections with limited supporting data, resulting in a higher likelihood of false positives 2381 + detectImprecise = /* @__PURE__ */ __name(async (tokenizer3) => { 2382 + this.buffer = new Uint8Array(reasonableDetectionSizeInBytes); 2383 + await tokenizer3.peekBuffer(this.buffer, { length: Math.min(8, tokenizer3.fileInfo.size), mayBeLess: true }); 2384 + if (this.check([0, 0, 1, 186]) || this.check([0, 0, 1, 179])) { 2385 + return { 2386 + ext: "mpg", 2387 + mime: "video/mpeg" 2388 + }; 2389 + } 2390 + if (this.check([0, 1, 0, 0, 0])) { 2391 + return { 2392 + ext: "ttf", 2393 + mime: "font/ttf" 2394 + }; 2395 + } 2396 + if (this.check([0, 0, 1, 0])) { 2397 + return { 2398 + ext: "ico", 2399 + mime: "image/x-icon" 2400 + }; 2401 + } 2402 + if (this.check([0, 0, 2, 0])) { 2403 + return { 2404 + ext: "cur", 2405 + mime: "image/x-icon" 2406 + }; 2407 + } 2408 + await tokenizer3.peekBuffer(this.buffer, { length: Math.min(2 + this.options.mpegOffsetTolerance, tokenizer3.fileInfo.size), mayBeLess: true }); 2409 + if (this.buffer.length >= 2 + this.options.mpegOffsetTolerance) { 2410 + for (let depth = 0; depth <= this.options.mpegOffsetTolerance; ++depth) { 2411 + const type = this.scanMpeg(depth); 2412 + if (type) { 2413 + return type; 2414 + } 2415 + } 2416 + } 2417 + }, "detectImprecise"); 2418 + async readTiffTag(bigEndian) { 2419 + const tagId = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); 2420 + this.tokenizer.ignore(10); 2421 + switch (tagId) { 2422 + case 50341: 2423 + return { 2424 + ext: "arw", 2425 + mime: "image/x-sony-arw" 2426 + }; 2427 + case 50706: 2428 + return { 2429 + ext: "dng", 2430 + mime: "image/x-adobe-dng" 2431 + }; 2432 + default: 2433 + } 2434 + } 2435 + async readTiffIFD(bigEndian) { 2436 + const numberOfTags = await this.tokenizer.readToken(bigEndian ? UINT16_BE : UINT16_LE); 2437 + for (let n = 0; n < numberOfTags; ++n) { 2438 + const fileType = await this.readTiffTag(bigEndian); 2439 + if (fileType) { 2440 + return fileType; 2441 + } 2442 + } 2443 + } 2444 + async readTiffHeader(bigEndian) { 2445 + const version = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 2); 2446 + const ifdOffset = (bigEndian ? UINT32_BE : UINT32_LE).get(this.buffer, 4); 2447 + if (version === 42) { 2448 + if (ifdOffset >= 6) { 2449 + if (this.checkString("CR", { offset: 8 })) { 2450 + return { 2451 + ext: "cr2", 2452 + mime: "image/x-canon-cr2" 2453 + }; 2454 + } 2455 + if (ifdOffset >= 8) { 2456 + const someId1 = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 8); 2457 + const someId2 = (bigEndian ? UINT16_BE : UINT16_LE).get(this.buffer, 10); 2458 + if (someId1 === 28 && someId2 === 254 || someId1 === 31 && someId2 === 11) { 2459 + return { 2460 + ext: "nef", 2461 + mime: "image/x-nikon-nef" 2462 + }; 2463 + } 2464 + } 2465 + } 2466 + await this.tokenizer.ignore(ifdOffset); 2467 + const fileType = await this.readTiffIFD(bigEndian); 2468 + return fileType ?? { 2469 + ext: "tif", 2470 + mime: "image/tiff" 2471 + }; 2472 + } 2473 + if (version === 43) { 2474 + return { 2475 + ext: "tif", 2476 + mime: "image/tiff" 2477 + }; 2478 + } 2479 + } 2480 + /** 2481 + Scan check MPEG 1 or 2 Layer 3 header, or 'layer 0' for ADTS (MPEG sync-word 0xFFE). 2482 + 2483 + @param offset - Offset to scan for sync-preamble. 2484 + @returns {{ext: string, mime: string}} 2485 + */ 2486 + scanMpeg(offset) { 2487 + if (this.check([255, 224], { offset, mask: [255, 224] })) { 2488 + if (this.check([16], { offset: offset + 1, mask: [22] })) { 2489 + if (this.check([8], { offset: offset + 1, mask: [8] })) { 2490 + return { 2491 + ext: "aac", 2492 + mime: "audio/aac" 2493 + }; 2494 + } 2495 + return { 2496 + ext: "aac", 2497 + mime: "audio/aac" 2498 + }; 2499 + } 2500 + if (this.check([2], { offset: offset + 1, mask: [6] })) { 2501 + return { 2502 + ext: "mp3", 2503 + mime: "audio/mpeg" 2504 + }; 2505 + } 2506 + if (this.check([4], { offset: offset + 1, mask: [6] })) { 2507 + return { 2508 + ext: "mp2", 2509 + mime: "audio/mpeg" 2510 + }; 2511 + } 2512 + if (this.check([6], { offset: offset + 1, mask: [6] })) { 2513 + return { 2514 + ext: "mp1", 2515 + mime: "audio/mpeg" 2516 + }; 2517 + } 2518 + } 2519 + } 2520 + }; 2521 + var supportedExtensions = new Set(extensions); 2522 + var supportedMimeTypes = new Set(mimeTypes); 2523 + 2524 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/ParserFactory.js 2525 + var import_content_type = __toESM(require_content_type()); 2526 + var import_media_typer = __toESM(require_media_typer()); 2527 + var import_debug3 = __toESM(require_src()); 2528 + 2529 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/common/MetadataCollector.js 2530 + init_Buffer(); 2531 + init_process(); 2532 + var import_debug2 = __toESM(require_src()); 2533 + 2534 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/common/GenericTagTypes.js 2535 + init_Buffer(); 2536 + init_process(); 2537 + var defaultTagInfo = { 2538 + multiple: false 2539 + }; 2540 + var commonTags = { 2541 + year: defaultTagInfo, 2542 + track: defaultTagInfo, 2543 + disk: defaultTagInfo, 2544 + title: defaultTagInfo, 2545 + artist: defaultTagInfo, 2546 + artists: { multiple: true, unique: true }, 2547 + albumartist: defaultTagInfo, 2548 + albumartists: { multiple: true, unique: true }, 2549 + album: defaultTagInfo, 2550 + date: defaultTagInfo, 2551 + originaldate: defaultTagInfo, 2552 + originalyear: defaultTagInfo, 2553 + releasedate: defaultTagInfo, 2554 + comment: { multiple: true, unique: false }, 2555 + genre: { multiple: true, unique: true }, 2556 + picture: { multiple: true, unique: true }, 2557 + composer: { multiple: true, unique: true }, 2558 + lyrics: { multiple: true, unique: false }, 2559 + albumsort: { multiple: false, unique: true }, 2560 + titlesort: { multiple: false, unique: true }, 2561 + work: { multiple: false, unique: true }, 2562 + artistsort: { multiple: false, unique: true }, 2563 + albumartistsort: { multiple: false, unique: true }, 2564 + composersort: { multiple: false, unique: true }, 2565 + lyricist: { multiple: true, unique: true }, 2566 + writer: { multiple: true, unique: true }, 2567 + conductor: { multiple: true, unique: true }, 2568 + remixer: { multiple: true, unique: true }, 2569 + arranger: { multiple: true, unique: true }, 2570 + engineer: { multiple: true, unique: true }, 2571 + producer: { multiple: true, unique: true }, 2572 + technician: { multiple: true, unique: true }, 2573 + djmixer: { multiple: true, unique: true }, 2574 + mixer: { multiple: true, unique: true }, 2575 + label: { multiple: true, unique: true }, 2576 + grouping: defaultTagInfo, 2577 + subtitle: { multiple: true }, 2578 + discsubtitle: defaultTagInfo, 2579 + totaltracks: defaultTagInfo, 2580 + totaldiscs: defaultTagInfo, 2581 + compilation: defaultTagInfo, 2582 + rating: { multiple: true }, 2583 + bpm: defaultTagInfo, 2584 + mood: defaultTagInfo, 2585 + media: defaultTagInfo, 2586 + catalognumber: { multiple: true, unique: true }, 2587 + tvShow: defaultTagInfo, 2588 + tvShowSort: defaultTagInfo, 2589 + tvSeason: defaultTagInfo, 2590 + tvEpisode: defaultTagInfo, 2591 + tvEpisodeId: defaultTagInfo, 2592 + tvNetwork: defaultTagInfo, 2593 + podcast: defaultTagInfo, 2594 + podcasturl: defaultTagInfo, 2595 + releasestatus: defaultTagInfo, 2596 + releasetype: { multiple: true }, 2597 + releasecountry: defaultTagInfo, 2598 + script: defaultTagInfo, 2599 + language: defaultTagInfo, 2600 + copyright: defaultTagInfo, 2601 + license: defaultTagInfo, 2602 + encodedby: defaultTagInfo, 2603 + encodersettings: defaultTagInfo, 2604 + gapless: defaultTagInfo, 2605 + barcode: defaultTagInfo, 2606 + isrc: { multiple: true }, 2607 + asin: defaultTagInfo, 2608 + musicbrainz_recordingid: defaultTagInfo, 2609 + musicbrainz_trackid: defaultTagInfo, 2610 + musicbrainz_albumid: defaultTagInfo, 2611 + musicbrainz_artistid: { multiple: true }, 2612 + musicbrainz_albumartistid: { multiple: true }, 2613 + musicbrainz_releasegroupid: defaultTagInfo, 2614 + musicbrainz_workid: defaultTagInfo, 2615 + musicbrainz_trmid: defaultTagInfo, 2616 + musicbrainz_discid: defaultTagInfo, 2617 + acoustid_id: defaultTagInfo, 2618 + acoustid_fingerprint: defaultTagInfo, 2619 + musicip_puid: defaultTagInfo, 2620 + musicip_fingerprint: defaultTagInfo, 2621 + website: defaultTagInfo, 2622 + "performer:instrument": { multiple: true, unique: true }, 2623 + averageLevel: defaultTagInfo, 2624 + peakLevel: defaultTagInfo, 2625 + notes: { multiple: true, unique: false }, 2626 + key: defaultTagInfo, 2627 + originalalbum: defaultTagInfo, 2628 + originalartist: defaultTagInfo, 2629 + discogs_artist_id: { multiple: true, unique: true }, 2630 + discogs_release_id: defaultTagInfo, 2631 + discogs_label_id: defaultTagInfo, 2632 + discogs_master_release_id: defaultTagInfo, 2633 + discogs_votes: defaultTagInfo, 2634 + discogs_rating: defaultTagInfo, 2635 + replaygain_track_peak: defaultTagInfo, 2636 + replaygain_track_gain: defaultTagInfo, 2637 + replaygain_album_peak: defaultTagInfo, 2638 + replaygain_album_gain: defaultTagInfo, 2639 + replaygain_track_minmax: defaultTagInfo, 2640 + replaygain_album_minmax: defaultTagInfo, 2641 + replaygain_undo: defaultTagInfo, 2642 + description: { multiple: true }, 2643 + longDescription: defaultTagInfo, 2644 + category: { multiple: true }, 2645 + hdVideo: defaultTagInfo, 2646 + keywords: { multiple: true }, 2647 + movement: defaultTagInfo, 2648 + movementIndex: defaultTagInfo, 2649 + movementTotal: defaultTagInfo, 2650 + podcastId: defaultTagInfo, 2651 + showMovement: defaultTagInfo, 2652 + stik: defaultTagInfo, 2653 + playCounter: defaultTagInfo 2654 + }; 2655 + function isSingleton(alias) { 2656 + return commonTags[alias] && !commonTags[alias].multiple; 2657 + } 2658 + __name(isSingleton, "isSingleton"); 2659 + function isUnique(alias) { 2660 + return !commonTags[alias].multiple || commonTags[alias].unique || false; 2661 + } 2662 + __name(isUnique, "isUnique"); 2663 + 2664 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/common/CombinedTagMapper.js 2665 + init_Buffer(); 2666 + init_process(); 2667 + 2668 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/id3v1/ID3v1TagMap.js 2669 + init_Buffer(); 2670 + init_process(); 2671 + 2672 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/common/GenericTagMapper.js 2673 + init_Buffer(); 2674 + init_process(); 2675 + var CommonTagMapper = class { 2676 + static { 2677 + __name(this, "CommonTagMapper"); 2678 + } 2679 + static toIntOrNull(str) { 2680 + const cleaned = Number.parseInt(str, 10); 2681 + return Number.isNaN(cleaned) ? null : cleaned; 2682 + } 2683 + // TODO: a string of 1of1 would fail to be converted 2684 + // converts 1/10 to no : 1, of : 10 2685 + // or 1 to no : 1, of : 0 2686 + static normalizeTrack(origVal) { 2687 + const split = origVal.toString().split("/"); 2688 + return { 2689 + no: Number.parseInt(split[0], 10) || null, 2690 + of: Number.parseInt(split[1], 10) || null 2691 + }; 2692 + } 2693 + constructor(tagTypes, tagMap2) { 2694 + this.tagTypes = tagTypes; 2695 + this.tagMap = tagMap2; 2696 + } 2697 + /** 2698 + * Process and set common tags 2699 + * write common tags to 2700 + * @param tag Native tag 2701 + * @param warnings Register warnings 2702 + * @return common name 2703 + */ 2704 + mapGenericTag(tag, warnings) { 2705 + tag = { id: tag.id, value: tag.value }; 2706 + this.postMap(tag, warnings); 2707 + const id = this.getCommonName(tag.id); 2708 + return id ? { id, value: tag.value } : null; 2709 + } 2710 + /** 2711 + * Convert native tag key to common tag key 2712 + * @param tag Native header tag 2713 + * @return common tag name (alias) 2714 + */ 2715 + getCommonName(tag) { 2716 + return this.tagMap[tag]; 2717 + } 2718 + /** 2719 + * Handle post mapping exceptions / correction 2720 + * @param tag Tag e.g. {"©alb", "Buena Vista Social Club") 2721 + * @param warnings Used to register warnings 2722 + */ 2723 + postMap(_tag, _warnings) { 2724 + return; 2725 + } 2726 + }; 2727 + CommonTagMapper.maxRatingScore = 1; 2728 + 2729 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/id3v1/ID3v1TagMap.js 2730 + var id3v1TagMap = { 2731 + title: "title", 2732 + artist: "artist", 2733 + album: "album", 2734 + year: "year", 2735 + comment: "comment", 2736 + track: "track", 2737 + genre: "genre" 2738 + }; 2739 + var ID3v1TagMapper = class extends CommonTagMapper { 2740 + static { 2741 + __name(this, "ID3v1TagMapper"); 2742 + } 2743 + constructor() { 2744 + super(["ID3v1"], id3v1TagMap); 2745 + } 2746 + }; 2747 + 2748 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/id3v2/ID3v24TagMapper.js 2749 + init_Buffer(); 2750 + init_process(); 2751 + 2752 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/common/CaseInsensitiveTagMap.js 2753 + init_Buffer(); 2754 + init_process(); 2755 + var CaseInsensitiveTagMap = class extends CommonTagMapper { 2756 + static { 2757 + __name(this, "CaseInsensitiveTagMap"); 2758 + } 2759 + constructor(tagTypes, tagMap2) { 2760 + const upperCaseMap = {}; 2761 + for (const tag of Object.keys(tagMap2)) { 2762 + upperCaseMap[tag.toUpperCase()] = tagMap2[tag]; 2763 + } 2764 + super(tagTypes, upperCaseMap); 2765 + } 2766 + /** 2767 + * @tag Native header tag 2768 + * @return common tag name (alias) 2769 + */ 2770 + getCommonName(tag) { 2771 + return this.tagMap[tag.toUpperCase()]; 2772 + } 2773 + }; 2774 + 2775 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/id3v2/ID3v24TagMapper.js 2776 + var id3v24TagMap = { 2777 + // id3v2.3 2778 + TIT2: "title", 2779 + TPE1: "artist", 2780 + "TXXX:Artists": "artists", 2781 + TPE2: "albumartist", 2782 + TALB: "album", 2783 + TDRV: "date", 2784 + // [ 'date', 'year' ] ToDo: improve 'year' mapping 2785 + /** 2786 + * Original release year 2787 + */ 2788 + TORY: "originalyear", 2789 + TPOS: "disk", 2790 + TCON: "genre", 2791 + APIC: "picture", 2792 + TCOM: "composer", 2793 + USLT: "lyrics", 2794 + TSOA: "albumsort", 2795 + TSOT: "titlesort", 2796 + TOAL: "originalalbum", 2797 + TSOP: "artistsort", 2798 + TSO2: "albumartistsort", 2799 + TSOC: "composersort", 2800 + TEXT: "lyricist", 2801 + "TXXX:Writer": "writer", 2802 + TPE3: "conductor", 2803 + // 'IPLS:instrument': 'performer:instrument', // ToDo 2804 + TPE4: "remixer", 2805 + "IPLS:arranger": "arranger", 2806 + "IPLS:engineer": "engineer", 2807 + "IPLS:producer": "producer", 2808 + "IPLS:DJ-mix": "djmixer", 2809 + "IPLS:mix": "mixer", 2810 + TPUB: "label", 2811 + TIT1: "grouping", 2812 + TIT3: "subtitle", 2813 + TRCK: "track", 2814 + TCMP: "compilation", 2815 + POPM: "rating", 2816 + TBPM: "bpm", 2817 + TMED: "media", 2818 + "TXXX:CATALOGNUMBER": "catalognumber", 2819 + "TXXX:MusicBrainz Album Status": "releasestatus", 2820 + "TXXX:MusicBrainz Album Type": "releasetype", 2821 + /** 2822 + * Release country as documented: https://picard.musicbrainz.org/docs/mappings/#cite_note-0 2823 + */ 2824 + "TXXX:MusicBrainz Album Release Country": "releasecountry", 2825 + /** 2826 + * Release country as implemented // ToDo: report 2827 + */ 2828 + "TXXX:RELEASECOUNTRY": "releasecountry", 2829 + "TXXX:SCRIPT": "script", 2830 + TLAN: "language", 2831 + TCOP: "copyright", 2832 + WCOP: "license", 2833 + TENC: "encodedby", 2834 + TSSE: "encodersettings", 2835 + "TXXX:BARCODE": "barcode", 2836 + "TXXX:ISRC": "isrc", 2837 + TSRC: "isrc", 2838 + "TXXX:ASIN": "asin", 2839 + "TXXX:originalyear": "originalyear", 2840 + "UFID:http://musicbrainz.org": "musicbrainz_recordingid", 2841 + "TXXX:MusicBrainz Release Track Id": "musicbrainz_trackid", 2842 + "TXXX:MusicBrainz Album Id": "musicbrainz_albumid", 2843 + "TXXX:MusicBrainz Artist Id": "musicbrainz_artistid", 2844 + "TXXX:MusicBrainz Album Artist Id": "musicbrainz_albumartistid", 2845 + "TXXX:MusicBrainz Release Group Id": "musicbrainz_releasegroupid", 2846 + "TXXX:MusicBrainz Work Id": "musicbrainz_workid", 2847 + "TXXX:MusicBrainz TRM Id": "musicbrainz_trmid", 2848 + "TXXX:MusicBrainz Disc Id": "musicbrainz_discid", 2849 + "TXXX:ACOUSTID_ID": "acoustid_id", 2850 + "TXXX:Acoustid Id": "acoustid_id", 2851 + "TXXX:Acoustid Fingerprint": "acoustid_fingerprint", 2852 + "TXXX:MusicIP PUID": "musicip_puid", 2853 + "TXXX:MusicMagic Fingerprint": "musicip_fingerprint", 2854 + WOAR: "website", 2855 + // id3v2.4 2856 + // ToDo: In same sequence as defined at http://id3.org/id3v2.4.0-frames 2857 + TDRC: "date", 2858 + // date YYYY-MM-DD 2859 + TYER: "year", 2860 + TDOR: "originaldate", 2861 + // 'TMCL:instrument': 'performer:instrument', 2862 + "TIPL:arranger": "arranger", 2863 + "TIPL:engineer": "engineer", 2864 + "TIPL:producer": "producer", 2865 + "TIPL:DJ-mix": "djmixer", 2866 + "TIPL:mix": "mixer", 2867 + TMOO: "mood", 2868 + // additional mappings: 2869 + SYLT: "lyrics", 2870 + TSST: "discsubtitle", 2871 + TKEY: "key", 2872 + COMM: "comment", 2873 + TOPE: "originalartist", 2874 + // Windows Media Player 2875 + "PRIV:AverageLevel": "averageLevel", 2876 + "PRIV:PeakLevel": "peakLevel", 2877 + // Discogs 2878 + "TXXX:DISCOGS_ARTIST_ID": "discogs_artist_id", 2879 + "TXXX:DISCOGS_ARTISTS": "artists", 2880 + "TXXX:DISCOGS_ARTIST_NAME": "artists", 2881 + "TXXX:DISCOGS_ALBUM_ARTISTS": "albumartist", 2882 + "TXXX:DISCOGS_CATALOG": "catalognumber", 2883 + "TXXX:DISCOGS_COUNTRY": "releasecountry", 2884 + "TXXX:DISCOGS_DATE": "originaldate", 2885 + "TXXX:DISCOGS_LABEL": "label", 2886 + "TXXX:DISCOGS_LABEL_ID": "discogs_label_id", 2887 + "TXXX:DISCOGS_MASTER_RELEASE_ID": "discogs_master_release_id", 2888 + "TXXX:DISCOGS_RATING": "discogs_rating", 2889 + "TXXX:DISCOGS_RELEASED": "date", 2890 + "TXXX:DISCOGS_RELEASE_ID": "discogs_release_id", 2891 + "TXXX:DISCOGS_VOTES": "discogs_votes", 2892 + "TXXX:CATALOGID": "catalognumber", 2893 + "TXXX:STYLE": "genre", 2894 + "TXXX:REPLAYGAIN_TRACK_PEAK": "replaygain_track_peak", 2895 + "TXXX:REPLAYGAIN_TRACK_GAIN": "replaygain_track_gain", 2896 + "TXXX:REPLAYGAIN_ALBUM_PEAK": "replaygain_album_peak", 2897 + "TXXX:REPLAYGAIN_ALBUM_GAIN": "replaygain_album_gain", 2898 + "TXXX:MP3GAIN_MINMAX": "replaygain_track_minmax", 2899 + "TXXX:MP3GAIN_ALBUM_MINMAX": "replaygain_album_minmax", 2900 + "TXXX:MP3GAIN_UNDO": "replaygain_undo", 2901 + MVNM: "movement", 2902 + MVIN: "movementIndex", 2903 + PCST: "podcast", 2904 + TCAT: "category", 2905 + TDES: "description", 2906 + TDRL: "releasedate", 2907 + TGID: "podcastId", 2908 + TKWD: "keywords", 2909 + WFED: "podcasturl", 2910 + GRP1: "grouping", 2911 + PCNT: "playCounter" 2912 + }; 2913 + var ID3v24TagMapper = class _ID3v24TagMapper extends CaseInsensitiveTagMap { 2914 + static { 2915 + __name(this, "ID3v24TagMapper"); 2916 + } 2917 + static toRating(popm) { 2918 + return { 2919 + source: popm.email, 2920 + rating: popm.rating > 0 ? (popm.rating - 1) / 254 * CommonTagMapper.maxRatingScore : void 0 2921 + }; 2922 + } 2923 + constructor() { 2924 + super(["ID3v2.3", "ID3v2.4"], id3v24TagMap); 2925 + } 2926 + /** 2927 + * Handle post mapping exceptions / correction 2928 + * @param tag to post map 2929 + * @param warnings Wil be used to register (collect) warnings 2930 + */ 2931 + postMap(tag, warnings) { 2932 + switch (tag.id) { 2933 + case "UFID": 2934 + { 2935 + const idTag = tag.value; 2936 + if (idTag.owner_identifier === "http://musicbrainz.org") { 2937 + tag.id += `:${idTag.owner_identifier}`; 2938 + tag.value = decodeString(idTag.identifier, "latin1"); 2939 + } 2940 + } 2941 + break; 2942 + case "PRIV": 2943 + { 2944 + const customTag = tag.value; 2945 + switch (customTag.owner_identifier) { 2946 + // decode Windows Media Player 2947 + case "AverageLevel": 2948 + case "PeakValue": 2949 + tag.id += `:${customTag.owner_identifier}`; 2950 + tag.value = customTag.data.length === 4 ? UINT32_LE.get(customTag.data, 0) : null; 2951 + if (tag.value === null) { 2952 + warnings.addWarning("Failed to parse PRIV:PeakValue"); 2953 + } 2954 + break; 2955 + default: 2956 + warnings.addWarning(`Unknown PRIV owner-identifier: ${customTag.data}`); 2957 + } 2958 + } 2959 + break; 2960 + case "POPM": 2961 + tag.value = _ID3v24TagMapper.toRating(tag.value); 2962 + break; 2963 + default: 2964 + break; 2965 + } 2966 + } 2967 + }; 2968 + 2969 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/asf/AsfTagMapper.js 2970 + init_Buffer(); 2971 + init_process(); 2972 + var asfTagMap = { 2973 + Title: "title", 2974 + Author: "artist", 2975 + "WM/AlbumArtist": "albumartist", 2976 + "WM/AlbumTitle": "album", 2977 + "WM/Year": "date", 2978 + // changed to 'year' to 'date' based on Picard mappings; ToDo: check me 2979 + "WM/OriginalReleaseTime": "originaldate", 2980 + "WM/OriginalReleaseYear": "originalyear", 2981 + Description: "comment", 2982 + "WM/TrackNumber": "track", 2983 + "WM/PartOfSet": "disk", 2984 + "WM/Genre": "genre", 2985 + "WM/Composer": "composer", 2986 + "WM/Lyrics": "lyrics", 2987 + "WM/AlbumSortOrder": "albumsort", 2988 + "WM/TitleSortOrder": "titlesort", 2989 + "WM/ArtistSortOrder": "artistsort", 2990 + "WM/AlbumArtistSortOrder": "albumartistsort", 2991 + "WM/ComposerSortOrder": "composersort", 2992 + "WM/Writer": "lyricist", 2993 + "WM/Conductor": "conductor", 2994 + "WM/ModifiedBy": "remixer", 2995 + "WM/Engineer": "engineer", 2996 + "WM/Producer": "producer", 2997 + "WM/DJMixer": "djmixer", 2998 + "WM/Mixer": "mixer", 2999 + "WM/Publisher": "label", 3000 + "WM/ContentGroupDescription": "grouping", 3001 + "WM/SubTitle": "subtitle", 3002 + "WM/SetSubTitle": "discsubtitle", 3003 + // 'WM/PartOfSet': 'totaldiscs', 3004 + "WM/IsCompilation": "compilation", 3005 + "WM/SharedUserRating": "rating", 3006 + "WM/BeatsPerMinute": "bpm", 3007 + "WM/Mood": "mood", 3008 + "WM/Media": "media", 3009 + "WM/CatalogNo": "catalognumber", 3010 + "MusicBrainz/Album Status": "releasestatus", 3011 + "MusicBrainz/Album Type": "releasetype", 3012 + "MusicBrainz/Album Release Country": "releasecountry", 3013 + "WM/Script": "script", 3014 + "WM/Language": "language", 3015 + Copyright: "copyright", 3016 + LICENSE: "license", 3017 + "WM/EncodedBy": "encodedby", 3018 + "WM/EncodingSettings": "encodersettings", 3019 + "WM/Barcode": "barcode", 3020 + "WM/ISRC": "isrc", 3021 + "MusicBrainz/Track Id": "musicbrainz_recordingid", 3022 + "MusicBrainz/Release Track Id": "musicbrainz_trackid", 3023 + "MusicBrainz/Album Id": "musicbrainz_albumid", 3024 + "MusicBrainz/Artist Id": "musicbrainz_artistid", 3025 + "MusicBrainz/Album Artist Id": "musicbrainz_albumartistid", 3026 + "MusicBrainz/Release Group Id": "musicbrainz_releasegroupid", 3027 + "MusicBrainz/Work Id": "musicbrainz_workid", 3028 + "MusicBrainz/TRM Id": "musicbrainz_trmid", 3029 + "MusicBrainz/Disc Id": "musicbrainz_discid", 3030 + "Acoustid/Id": "acoustid_id", 3031 + "Acoustid/Fingerprint": "acoustid_fingerprint", 3032 + "MusicIP/PUID": "musicip_puid", 3033 + "WM/ARTISTS": "artists", 3034 + "WM/InitialKey": "key", 3035 + ASIN: "asin", 3036 + "WM/Work": "work", 3037 + "WM/AuthorURL": "website", 3038 + "WM/Picture": "picture" 3039 + }; 3040 + var AsfTagMapper = class _AsfTagMapper extends CommonTagMapper { 3041 + static { 3042 + __name(this, "AsfTagMapper"); 3043 + } 3044 + static toRating(rating) { 3045 + return { 3046 + rating: Number.parseFloat(rating + 1) / 5 3047 + }; 3048 + } 3049 + constructor() { 3050 + super(["asf"], asfTagMap); 3051 + } 3052 + postMap(tag) { 3053 + switch (tag.id) { 3054 + case "WM/SharedUserRating": { 3055 + const keys = tag.id.split(":"); 3056 + tag.value = _AsfTagMapper.toRating(tag.value); 3057 + tag.id = keys[0]; 3058 + break; 3059 + } 3060 + } 3061 + } 3062 + }; 3063 + 3064 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/id3v2/ID3v22TagMapper.js 3065 + init_Buffer(); 3066 + init_process(); 3067 + var id3v22TagMap = { 3068 + TT2: "title", 3069 + TP1: "artist", 3070 + TP2: "albumartist", 3071 + TAL: "album", 3072 + TYE: "year", 3073 + COM: "comment", 3074 + TRK: "track", 3075 + TPA: "disk", 3076 + TCO: "genre", 3077 + PIC: "picture", 3078 + TCM: "composer", 3079 + TOR: "originaldate", 3080 + TOT: "originalalbum", 3081 + TXT: "lyricist", 3082 + TP3: "conductor", 3083 + TPB: "label", 3084 + TT1: "grouping", 3085 + TT3: "subtitle", 3086 + TLA: "language", 3087 + TCR: "copyright", 3088 + WCP: "license", 3089 + TEN: "encodedby", 3090 + TSS: "encodersettings", 3091 + WAR: "website", 3092 + PCS: "podcast", 3093 + TCP: "compilation", 3094 + TDR: "date", 3095 + TS2: "albumartistsort", 3096 + TSA: "albumsort", 3097 + TSC: "composersort", 3098 + TSP: "artistsort", 3099 + TST: "titlesort", 3100 + WFD: "podcasturl", 3101 + TBP: "bpm", 3102 + GP1: "grouping" 3103 + }; 3104 + var ID3v22TagMapper = class extends CaseInsensitiveTagMap { 3105 + static { 3106 + __name(this, "ID3v22TagMapper"); 3107 + } 3108 + constructor() { 3109 + super(["ID3v2.2"], id3v22TagMap); 3110 + } 3111 + }; 3112 + 3113 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/apev2/APEv2TagMapper.js 3114 + init_Buffer(); 3115 + init_process(); 3116 + var apev2TagMap = { 3117 + Title: "title", 3118 + Artist: "artist", 3119 + Artists: "artists", 3120 + "Album Artist": "albumartist", 3121 + Album: "album", 3122 + Year: "date", 3123 + Originalyear: "originalyear", 3124 + Originaldate: "originaldate", 3125 + Releasedate: "releasedate", 3126 + Comment: "comment", 3127 + Track: "track", 3128 + Disc: "disk", 3129 + DISCNUMBER: "disk", 3130 + // ToDo: backwards compatibility', valid tag? 3131 + Genre: "genre", 3132 + "Cover Art (Front)": "picture", 3133 + "Cover Art (Back)": "picture", 3134 + Composer: "composer", 3135 + Lyrics: "lyrics", 3136 + ALBUMSORT: "albumsort", 3137 + TITLESORT: "titlesort", 3138 + WORK: "work", 3139 + ARTISTSORT: "artistsort", 3140 + ALBUMARTISTSORT: "albumartistsort", 3141 + COMPOSERSORT: "composersort", 3142 + Lyricist: "lyricist", 3143 + Writer: "writer", 3144 + Conductor: "conductor", 3145 + // 'Performer=artist (instrument)': 'performer:instrument', 3146 + MixArtist: "remixer", 3147 + Arranger: "arranger", 3148 + Engineer: "engineer", 3149 + Producer: "producer", 3150 + DJMixer: "djmixer", 3151 + Mixer: "mixer", 3152 + Label: "label", 3153 + Grouping: "grouping", 3154 + Subtitle: "subtitle", 3155 + DiscSubtitle: "discsubtitle", 3156 + Compilation: "compilation", 3157 + BPM: "bpm", 3158 + Mood: "mood", 3159 + Media: "media", 3160 + CatalogNumber: "catalognumber", 3161 + MUSICBRAINZ_ALBUMSTATUS: "releasestatus", 3162 + MUSICBRAINZ_ALBUMTYPE: "releasetype", 3163 + RELEASECOUNTRY: "releasecountry", 3164 + Script: "script", 3165 + Language: "language", 3166 + Copyright: "copyright", 3167 + LICENSE: "license", 3168 + EncodedBy: "encodedby", 3169 + EncoderSettings: "encodersettings", 3170 + Barcode: "barcode", 3171 + ISRC: "isrc", 3172 + ASIN: "asin", 3173 + musicbrainz_trackid: "musicbrainz_recordingid", 3174 + musicbrainz_releasetrackid: "musicbrainz_trackid", 3175 + MUSICBRAINZ_ALBUMID: "musicbrainz_albumid", 3176 + MUSICBRAINZ_ARTISTID: "musicbrainz_artistid", 3177 + MUSICBRAINZ_ALBUMARTISTID: "musicbrainz_albumartistid", 3178 + MUSICBRAINZ_RELEASEGROUPID: "musicbrainz_releasegroupid", 3179 + MUSICBRAINZ_WORKID: "musicbrainz_workid", 3180 + MUSICBRAINZ_TRMID: "musicbrainz_trmid", 3181 + MUSICBRAINZ_DISCID: "musicbrainz_discid", 3182 + Acoustid_Id: "acoustid_id", 3183 + ACOUSTID_FINGERPRINT: "acoustid_fingerprint", 3184 + MUSICIP_PUID: "musicip_puid", 3185 + Weblink: "website", 3186 + REPLAYGAIN_TRACK_GAIN: "replaygain_track_gain", 3187 + REPLAYGAIN_TRACK_PEAK: "replaygain_track_peak", 3188 + MP3GAIN_MINMAX: "replaygain_track_minmax", 3189 + MP3GAIN_UNDO: "replaygain_undo" 3190 + }; 3191 + var APEv2TagMapper = class extends CaseInsensitiveTagMap { 3192 + static { 3193 + __name(this, "APEv2TagMapper"); 3194 + } 3195 + constructor() { 3196 + super(["APEv2"], apev2TagMap); 3197 + } 3198 + }; 3199 + 3200 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/mp4/MP4TagMapper.js 3201 + init_Buffer(); 3202 + init_process(); 3203 + var mp4TagMap = { 3204 + "\xA9nam": "title", 3205 + "\xA9ART": "artist", 3206 + aART: "albumartist", 3207 + /** 3208 + * ToDo: Album artist seems to be stored here while Picard documentation says: aART 3209 + */ 3210 + "----:com.apple.iTunes:Band": "albumartist", 3211 + "\xA9alb": "album", 3212 + "\xA9day": "date", 3213 + "\xA9cmt": "comment", 3214 + "\xA9com": "comment", 3215 + trkn: "track", 3216 + disk: "disk", 3217 + "\xA9gen": "genre", 3218 + covr: "picture", 3219 + "\xA9wrt": "composer", 3220 + "\xA9lyr": "lyrics", 3221 + soal: "albumsort", 3222 + sonm: "titlesort", 3223 + soar: "artistsort", 3224 + soaa: "albumartistsort", 3225 + soco: "composersort", 3226 + "----:com.apple.iTunes:LYRICIST": "lyricist", 3227 + "----:com.apple.iTunes:CONDUCTOR": "conductor", 3228 + "----:com.apple.iTunes:REMIXER": "remixer", 3229 + "----:com.apple.iTunes:ENGINEER": "engineer", 3230 + "----:com.apple.iTunes:PRODUCER": "producer", 3231 + "----:com.apple.iTunes:DJMIXER": "djmixer", 3232 + "----:com.apple.iTunes:MIXER": "mixer", 3233 + "----:com.apple.iTunes:LABEL": "label", 3234 + "\xA9grp": "grouping", 3235 + "----:com.apple.iTunes:SUBTITLE": "subtitle", 3236 + "----:com.apple.iTunes:DISCSUBTITLE": "discsubtitle", 3237 + cpil: "compilation", 3238 + tmpo: "bpm", 3239 + "----:com.apple.iTunes:MOOD": "mood", 3240 + "----:com.apple.iTunes:MEDIA": "media", 3241 + "----:com.apple.iTunes:CATALOGNUMBER": "catalognumber", 3242 + tvsh: "tvShow", 3243 + tvsn: "tvSeason", 3244 + tves: "tvEpisode", 3245 + sosn: "tvShowSort", 3246 + tven: "tvEpisodeId", 3247 + tvnn: "tvNetwork", 3248 + pcst: "podcast", 3249 + purl: "podcasturl", 3250 + "----:com.apple.iTunes:MusicBrainz Album Status": "releasestatus", 3251 + "----:com.apple.iTunes:MusicBrainz Album Type": "releasetype", 3252 + "----:com.apple.iTunes:MusicBrainz Album Release Country": "releasecountry", 3253 + "----:com.apple.iTunes:SCRIPT": "script", 3254 + "----:com.apple.iTunes:LANGUAGE": "language", 3255 + cprt: "copyright", 3256 + "\xA9cpy": "copyright", 3257 + "----:com.apple.iTunes:LICENSE": "license", 3258 + "\xA9too": "encodedby", 3259 + pgap: "gapless", 3260 + "----:com.apple.iTunes:BARCODE": "barcode", 3261 + "----:com.apple.iTunes:ISRC": "isrc", 3262 + "----:com.apple.iTunes:ASIN": "asin", 3263 + "----:com.apple.iTunes:NOTES": "comment", 3264 + "----:com.apple.iTunes:MusicBrainz Track Id": "musicbrainz_recordingid", 3265 + "----:com.apple.iTunes:MusicBrainz Release Track Id": "musicbrainz_trackid", 3266 + "----:com.apple.iTunes:MusicBrainz Album Id": "musicbrainz_albumid", 3267 + "----:com.apple.iTunes:MusicBrainz Artist Id": "musicbrainz_artistid", 3268 + "----:com.apple.iTunes:MusicBrainz Album Artist Id": "musicbrainz_albumartistid", 3269 + "----:com.apple.iTunes:MusicBrainz Release Group Id": "musicbrainz_releasegroupid", 3270 + "----:com.apple.iTunes:MusicBrainz Work Id": "musicbrainz_workid", 3271 + "----:com.apple.iTunes:MusicBrainz TRM Id": "musicbrainz_trmid", 3272 + "----:com.apple.iTunes:MusicBrainz Disc Id": "musicbrainz_discid", 3273 + "----:com.apple.iTunes:Acoustid Id": "acoustid_id", 3274 + "----:com.apple.iTunes:Acoustid Fingerprint": "acoustid_fingerprint", 3275 + "----:com.apple.iTunes:MusicIP PUID": "musicip_puid", 3276 + "----:com.apple.iTunes:fingerprint": "musicip_fingerprint", 3277 + "----:com.apple.iTunes:replaygain_track_gain": "replaygain_track_gain", 3278 + "----:com.apple.iTunes:replaygain_track_peak": "replaygain_track_peak", 3279 + "----:com.apple.iTunes:replaygain_album_gain": "replaygain_album_gain", 3280 + "----:com.apple.iTunes:replaygain_album_peak": "replaygain_album_peak", 3281 + "----:com.apple.iTunes:replaygain_track_minmax": "replaygain_track_minmax", 3282 + "----:com.apple.iTunes:replaygain_album_minmax": "replaygain_album_minmax", 3283 + "----:com.apple.iTunes:replaygain_undo": "replaygain_undo", 3284 + // Additional mappings: 3285 + gnre: "genre", 3286 + // ToDo: check mapping 3287 + "----:com.apple.iTunes:ALBUMARTISTSORT": "albumartistsort", 3288 + "----:com.apple.iTunes:ARTISTS": "artists", 3289 + "----:com.apple.iTunes:ORIGINALDATE": "originaldate", 3290 + "----:com.apple.iTunes:ORIGINALYEAR": "originalyear", 3291 + "----:com.apple.iTunes:RELEASEDATE": "releasedate", 3292 + // '----:com.apple.iTunes:PERFORMER': 'performer' 3293 + desc: "description", 3294 + ldes: "longDescription", 3295 + "\xA9mvn": "movement", 3296 + "\xA9mvi": "movementIndex", 3297 + "\xA9mvc": "movementTotal", 3298 + "\xA9wrk": "work", 3299 + catg: "category", 3300 + egid: "podcastId", 3301 + hdvd: "hdVideo", 3302 + keyw: "keywords", 3303 + shwm: "showMovement", 3304 + stik: "stik", 3305 + rate: "rating" 3306 + }; 3307 + var tagType = "iTunes"; 3308 + var MP4TagMapper = class extends CaseInsensitiveTagMap { 3309 + static { 3310 + __name(this, "MP4TagMapper"); 3311 + } 3312 + constructor() { 3313 + super([tagType], mp4TagMap); 3314 + } 3315 + postMap(tag, _warnings) { 3316 + switch (tag.id) { 3317 + case "rate": 3318 + tag.value = { 3319 + source: void 0, 3320 + rating: Number.parseFloat(tag.value) / 100 3321 + }; 3322 + break; 3323 + } 3324 + } 3325 + }; 3326 + 3327 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/ogg/vorbis/VorbisTagMapper.js 3328 + init_Buffer(); 3329 + init_process(); 3330 + var vorbisTagMap = { 3331 + TITLE: "title", 3332 + ARTIST: "artist", 3333 + ARTISTS: "artists", 3334 + ALBUMARTIST: "albumartist", 3335 + "ALBUM ARTIST": "albumartist", 3336 + ALBUM: "album", 3337 + DATE: "date", 3338 + ORIGINALDATE: "originaldate", 3339 + ORIGINALYEAR: "originalyear", 3340 + RELEASEDATE: "releasedate", 3341 + COMMENT: "comment", 3342 + TRACKNUMBER: "track", 3343 + DISCNUMBER: "disk", 3344 + GENRE: "genre", 3345 + METADATA_BLOCK_PICTURE: "picture", 3346 + COMPOSER: "composer", 3347 + LYRICS: "lyrics", 3348 + ALBUMSORT: "albumsort", 3349 + TITLESORT: "titlesort", 3350 + WORK: "work", 3351 + ARTISTSORT: "artistsort", 3352 + ALBUMARTISTSORT: "albumartistsort", 3353 + COMPOSERSORT: "composersort", 3354 + LYRICIST: "lyricist", 3355 + WRITER: "writer", 3356 + CONDUCTOR: "conductor", 3357 + // 'PERFORMER=artist (instrument)': 'performer:instrument', // ToDo 3358 + REMIXER: "remixer", 3359 + ARRANGER: "arranger", 3360 + ENGINEER: "engineer", 3361 + PRODUCER: "producer", 3362 + DJMIXER: "djmixer", 3363 + MIXER: "mixer", 3364 + LABEL: "label", 3365 + GROUPING: "grouping", 3366 + SUBTITLE: "subtitle", 3367 + DISCSUBTITLE: "discsubtitle", 3368 + TRACKTOTAL: "totaltracks", 3369 + DISCTOTAL: "totaldiscs", 3370 + COMPILATION: "compilation", 3371 + RATING: "rating", 3372 + BPM: "bpm", 3373 + KEY: "key", 3374 + MOOD: "mood", 3375 + MEDIA: "media", 3376 + CATALOGNUMBER: "catalognumber", 3377 + RELEASESTATUS: "releasestatus", 3378 + RELEASETYPE: "releasetype", 3379 + RELEASECOUNTRY: "releasecountry", 3380 + SCRIPT: "script", 3381 + LANGUAGE: "language", 3382 + COPYRIGHT: "copyright", 3383 + LICENSE: "license", 3384 + ENCODEDBY: "encodedby", 3385 + ENCODERSETTINGS: "encodersettings", 3386 + BARCODE: "barcode", 3387 + ISRC: "isrc", 3388 + ASIN: "asin", 3389 + MUSICBRAINZ_TRACKID: "musicbrainz_recordingid", 3390 + MUSICBRAINZ_RELEASETRACKID: "musicbrainz_trackid", 3391 + MUSICBRAINZ_ALBUMID: "musicbrainz_albumid", 3392 + MUSICBRAINZ_ARTISTID: "musicbrainz_artistid", 3393 + MUSICBRAINZ_ALBUMARTISTID: "musicbrainz_albumartistid", 3394 + MUSICBRAINZ_RELEASEGROUPID: "musicbrainz_releasegroupid", 3395 + MUSICBRAINZ_WORKID: "musicbrainz_workid", 3396 + MUSICBRAINZ_TRMID: "musicbrainz_trmid", 3397 + MUSICBRAINZ_DISCID: "musicbrainz_discid", 3398 + ACOUSTID_ID: "acoustid_id", 3399 + ACOUSTID_ID_FINGERPRINT: "acoustid_fingerprint", 3400 + MUSICIP_PUID: "musicip_puid", 3401 + // 'FINGERPRINT=MusicMagic Fingerprint {fingerprint}': 'musicip_fingerprint', // ToDo 3402 + WEBSITE: "website", 3403 + NOTES: "notes", 3404 + TOTALTRACKS: "totaltracks", 3405 + TOTALDISCS: "totaldiscs", 3406 + // Discogs 3407 + DISCOGS_ARTIST_ID: "discogs_artist_id", 3408 + DISCOGS_ARTISTS: "artists", 3409 + DISCOGS_ARTIST_NAME: "artists", 3410 + DISCOGS_ALBUM_ARTISTS: "albumartist", 3411 + DISCOGS_CATALOG: "catalognumber", 3412 + DISCOGS_COUNTRY: "releasecountry", 3413 + DISCOGS_DATE: "originaldate", 3414 + DISCOGS_LABEL: "label", 3415 + DISCOGS_LABEL_ID: "discogs_label_id", 3416 + DISCOGS_MASTER_RELEASE_ID: "discogs_master_release_id", 3417 + DISCOGS_RATING: "discogs_rating", 3418 + DISCOGS_RELEASED: "date", 3419 + DISCOGS_RELEASE_ID: "discogs_release_id", 3420 + DISCOGS_VOTES: "discogs_votes", 3421 + CATALOGID: "catalognumber", 3422 + STYLE: "genre", 3423 + // 3424 + REPLAYGAIN_TRACK_GAIN: "replaygain_track_gain", 3425 + REPLAYGAIN_TRACK_PEAK: "replaygain_track_peak", 3426 + REPLAYGAIN_ALBUM_GAIN: "replaygain_album_gain", 3427 + REPLAYGAIN_ALBUM_PEAK: "replaygain_album_peak", 3428 + // To Sure if these (REPLAYGAIN_MINMAX, REPLAYGAIN_ALBUM_MINMAX & REPLAYGAIN_UNDO) are used for Vorbis: 3429 + REPLAYGAIN_MINMAX: "replaygain_track_minmax", 3430 + REPLAYGAIN_ALBUM_MINMAX: "replaygain_album_minmax", 3431 + REPLAYGAIN_UNDO: "replaygain_undo" 3432 + }; 3433 + var VorbisTagMapper = class _VorbisTagMapper extends CommonTagMapper { 3434 + static { 3435 + __name(this, "VorbisTagMapper"); 3436 + } 3437 + static toRating(email, rating, maxScore) { 3438 + return { 3439 + source: email ? email.toLowerCase() : void 0, 3440 + rating: Number.parseFloat(rating) / maxScore * CommonTagMapper.maxRatingScore 3441 + }; 3442 + } 3443 + constructor() { 3444 + super(["vorbis"], vorbisTagMap); 3445 + } 3446 + postMap(tag) { 3447 + if (tag.id === "RATING") { 3448 + tag.value = _VorbisTagMapper.toRating(void 0, tag.value, 100); 3449 + } else if (tag.id.indexOf("RATING:") === 0) { 3450 + const keys = tag.id.split(":"); 3451 + tag.value = _VorbisTagMapper.toRating(keys[1], tag.value, 1); 3452 + tag.id = keys[0]; 3453 + } 3454 + } 3455 + }; 3456 + 3457 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/riff/RiffInfoTagMap.js 3458 + init_Buffer(); 3459 + init_process(); 3460 + var riffInfoTagMap = { 3461 + IART: "artist", 3462 + // Artist 3463 + ICRD: "date", 3464 + // DateCreated 3465 + INAM: "title", 3466 + // Title 3467 + TITL: "title", 3468 + IPRD: "album", 3469 + // Product 3470 + ITRK: "track", 3471 + IPRT: "track", 3472 + // Additional tag for track index 3473 + COMM: "comment", 3474 + // Comments 3475 + ICMT: "comment", 3476 + // Country 3477 + ICNT: "releasecountry", 3478 + GNRE: "genre", 3479 + // Genre 3480 + IWRI: "writer", 3481 + // WrittenBy 3482 + RATE: "rating", 3483 + YEAR: "year", 3484 + ISFT: "encodedby", 3485 + // Software 3486 + CODE: "encodedby", 3487 + // EncodedBy 3488 + TURL: "website", 3489 + // URL, 3490 + IGNR: "genre", 3491 + // Genre 3492 + IENG: "engineer", 3493 + // Engineer 3494 + ITCH: "technician", 3495 + // Technician 3496 + IMED: "media", 3497 + // Original Media 3498 + IRPD: "album" 3499 + // Product, where the file was intended for 3500 + }; 3501 + var RiffInfoTagMapper = class extends CommonTagMapper { 3502 + static { 3503 + __name(this, "RiffInfoTagMapper"); 3504 + } 3505 + constructor() { 3506 + super(["exif"], riffInfoTagMap); 3507 + } 3508 + }; 3509 + 3510 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/matroska/MatroskaTagMapper.js 3511 + init_Buffer(); 3512 + init_process(); 3513 + var ebmlTagMap = { 3514 + "segment:title": "title", 3515 + "album:ARTIST": "albumartist", 3516 + "album:ARTISTSORT": "albumartistsort", 3517 + "album:TITLE": "album", 3518 + "album:DATE_RECORDED": "originaldate", 3519 + "album:DATE_RELEASED": "releasedate", 3520 + "album:PART_NUMBER": "disk", 3521 + "album:TOTAL_PARTS": "totaltracks", 3522 + "track:ARTIST": "artist", 3523 + "track:ARTISTSORT": "artistsort", 3524 + "track:TITLE": "title", 3525 + "track:PART_NUMBER": "track", 3526 + "track:MUSICBRAINZ_TRACKID": "musicbrainz_recordingid", 3527 + "track:MUSICBRAINZ_ALBUMID": "musicbrainz_albumid", 3528 + "track:MUSICBRAINZ_ARTISTID": "musicbrainz_artistid", 3529 + "track:PUBLISHER": "label", 3530 + "track:GENRE": "genre", 3531 + "track:ENCODER": "encodedby", 3532 + "track:ENCODER_OPTIONS": "encodersettings", 3533 + "edition:TOTAL_PARTS": "totaldiscs", 3534 + picture: "picture" 3535 + }; 3536 + var MatroskaTagMapper = class extends CaseInsensitiveTagMap { 3537 + static { 3538 + __name(this, "MatroskaTagMapper"); 3539 + } 3540 + constructor() { 3541 + super(["matroska"], ebmlTagMap); 3542 + } 3543 + }; 3544 + 3545 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/aiff/AiffTagMap.js 3546 + init_Buffer(); 3547 + init_process(); 3548 + var tagMap = { 3549 + NAME: "title", 3550 + AUTH: "artist", 3551 + "(c) ": "copyright", 3552 + ANNO: "comment" 3553 + }; 3554 + var AiffTagMapper = class extends CommonTagMapper { 3555 + static { 3556 + __name(this, "AiffTagMapper"); 3557 + } 3558 + constructor() { 3559 + super(["AIFF"], tagMap); 3560 + } 3561 + }; 3562 + 3563 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/common/CombinedTagMapper.js 3564 + var CombinedTagMapper = class { 3565 + static { 3566 + __name(this, "CombinedTagMapper"); 3567 + } 3568 + constructor() { 3569 + this.tagMappers = {}; 3570 + [ 3571 + new ID3v1TagMapper(), 3572 + new ID3v22TagMapper(), 3573 + new ID3v24TagMapper(), 3574 + new MP4TagMapper(), 3575 + new MP4TagMapper(), 3576 + new VorbisTagMapper(), 3577 + new APEv2TagMapper(), 3578 + new AsfTagMapper(), 3579 + new RiffInfoTagMapper(), 3580 + new MatroskaTagMapper(), 3581 + new AiffTagMapper() 3582 + ].forEach((mapper) => { 3583 + this.registerTagMapper(mapper); 3584 + }); 3585 + } 3586 + /** 3587 + * Convert native to generic (common) tags 3588 + * @param tagType Originating tag format 3589 + * @param tag Native tag to map to a generic tag id 3590 + * @param warnings 3591 + * @return Generic tag result (output of this function) 3592 + */ 3593 + mapTag(tagType2, tag, warnings) { 3594 + const tagMapper = this.tagMappers[tagType2]; 3595 + if (tagMapper) { 3596 + return this.tagMappers[tagType2].mapGenericTag(tag, warnings); 3597 + } 3598 + throw new InternalParserError(`No generic tag mapper defined for tag-format: ${tagType2}`); 3599 + } 3600 + registerTagMapper(genericTagMapper) { 3601 + for (const tagType2 of genericTagMapper.tagTypes) { 3602 + this.tagMappers[tagType2] = genericTagMapper; 3603 + } 3604 + } 3605 + }; 3606 + 3607 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/lrc/LyricsParser.js 3608 + init_Buffer(); 3609 + init_process(); 3610 + var TIMESTAMP_REGEX = /\[(\d{2}):(\d{2})\.(\d{2,3})]/; 3611 + function parseLyrics(input) { 3612 + if (TIMESTAMP_REGEX.test(input)) { 3613 + return parseLrc(input); 3614 + } 3615 + return toUnsyncedLyrics(input); 3616 + } 3617 + __name(parseLyrics, "parseLyrics"); 3618 + function toUnsyncedLyrics(lyrics) { 3619 + return { 3620 + contentType: LyricsContentType.lyrics, 3621 + timeStampFormat: TimestampFormat.notSynchronized, 3622 + text: lyrics.trim(), 3623 + syncText: [] 3624 + }; 3625 + } 3626 + __name(toUnsyncedLyrics, "toUnsyncedLyrics"); 3627 + function parseLrc(lrcString) { 3628 + const lines = lrcString.split("\n"); 3629 + const syncText = []; 3630 + for (const line of lines) { 3631 + const match = line.match(TIMESTAMP_REGEX); 3632 + if (match) { 3633 + const minutes = Number.parseInt(match[1], 10); 3634 + const seconds = Number.parseInt(match[2], 10); 3635 + const ms = match[3].length === 3 ? Number.parseInt(match[3], 10) : Number.parseInt(match[3], 10) * 10; 3636 + const timestamp = (minutes * 60 + seconds) * 1e3 + ms; 3637 + const text = line.replace(TIMESTAMP_REGEX, "").trim(); 3638 + syncText.push({ timestamp, text }); 3639 + } 3640 + } 3641 + return { 3642 + contentType: LyricsContentType.lyrics, 3643 + timeStampFormat: TimestampFormat.milliseconds, 3644 + text: syncText.map((line) => line.text).join("\n"), 3645 + syncText 3646 + }; 3647 + } 3648 + __name(parseLrc, "parseLrc"); 3649 + 3650 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/common/MetadataCollector.js 3651 + var debug2 = (0, import_debug2.default)("music-metadata:collector"); 3652 + var TagPriority = ["matroska", "APEv2", "vorbis", "ID3v2.4", "ID3v2.3", "ID3v2.2", "exif", "asf", "iTunes", "AIFF", "ID3v1"]; 3653 + var MetadataCollector = class { 3654 + static { 3655 + __name(this, "MetadataCollector"); 3656 + } 3657 + constructor(opts) { 3658 + this.format = { 3659 + tagTypes: [], 3660 + trackInfo: [] 3661 + }; 3662 + this.native = {}; 3663 + this.common = { 3664 + track: { no: null, of: null }, 3665 + disk: { no: null, of: null }, 3666 + movementIndex: { no: null, of: null } 3667 + }; 3668 + this.quality = { 3669 + warnings: [] 3670 + }; 3671 + this.commonOrigin = {}; 3672 + this.originPriority = {}; 3673 + this.tagMapper = new CombinedTagMapper(); 3674 + this.opts = opts; 3675 + let priority = 1; 3676 + for (const tagType2 of TagPriority) { 3677 + this.originPriority[tagType2] = priority++; 3678 + } 3679 + this.originPriority.artificial = 500; 3680 + this.originPriority.id3v1 = 600; 3681 + } 3682 + /** 3683 + * @returns {boolean} true if one or more tags have been found 3684 + */ 3685 + hasAny() { 3686 + return Object.keys(this.native).length > 0; 3687 + } 3688 + addStreamInfo(streamInfo) { 3689 + debug2(`streamInfo: type=${streamInfo.type ? TrackTypeValueToKeyMap[streamInfo.type] : "?"}, codec=${streamInfo.codecName}`); 3690 + this.format.trackInfo.push(streamInfo); 3691 + } 3692 + setFormat(key, value) { 3693 + debug2(`format: ${key} = ${value}`); 3694 + this.format[key] = value; 3695 + if (this.opts?.observer) { 3696 + this.opts.observer({ metadata: this, tag: { type: "format", id: key, value } }); 3697 + } 3698 + } 3699 + setAudioOnly() { 3700 + this.setFormat("hasAudio", true); 3701 + this.setFormat("hasVideo", false); 3702 + } 3703 + async addTag(tagType2, tagId, value) { 3704 + debug2(`tag ${tagType2}.${tagId} = ${value}`); 3705 + if (!this.native[tagType2]) { 3706 + this.format.tagTypes.push(tagType2); 3707 + this.native[tagType2] = []; 3708 + } 3709 + this.native[tagType2].push({ id: tagId, value }); 3710 + await this.toCommon(tagType2, tagId, value); 3711 + } 3712 + addWarning(warning) { 3713 + this.quality.warnings.push({ message: warning }); 3714 + } 3715 + async postMap(tagType2, tag) { 3716 + switch (tag.id) { 3717 + case "artist": 3718 + return this.handleSingularArtistTag(tagType2, tag, "artist", "artists"); 3719 + case "albumartist": 3720 + return this.handleSingularArtistTag(tagType2, tag, "albumartist", "albumartists"); 3721 + case "artists": 3722 + return this.handlePluralArtistTag(tagType2, tag, "artist", "artists"); 3723 + case "albumartists": 3724 + return this.handlePluralArtistTag(tagType2, tag, "albumartist", "albumartists"); 3725 + case "picture": 3726 + return this.postFixPicture(tag.value).then((picture) => { 3727 + if (picture !== null) { 3728 + tag.value = picture; 3729 + this.setGenericTag(tagType2, tag); 3730 + } 3731 + }); 3732 + case "totaltracks": 3733 + this.common.track.of = CommonTagMapper.toIntOrNull(tag.value); 3734 + return; 3735 + case "totaldiscs": 3736 + this.common.disk.of = CommonTagMapper.toIntOrNull(tag.value); 3737 + return; 3738 + case "movementTotal": 3739 + this.common.movementIndex.of = CommonTagMapper.toIntOrNull(tag.value); 3740 + return; 3741 + case "track": 3742 + case "disk": 3743 + case "movementIndex": { 3744 + const of = this.common[tag.id].of; 3745 + this.common[tag.id] = CommonTagMapper.normalizeTrack(tag.value); 3746 + this.common[tag.id].of = of != null ? of : this.common[tag.id].of; 3747 + return; 3748 + } 3749 + case "bpm": 3750 + case "year": 3751 + case "originalyear": 3752 + tag.value = Number.parseInt(tag.value, 10); 3753 + break; 3754 + case "date": { 3755 + const year = Number.parseInt(tag.value.substr(0, 4), 10); 3756 + if (!Number.isNaN(year)) { 3757 + this.common.year = year; 3758 + } 3759 + break; 3760 + } 3761 + case "discogs_label_id": 3762 + case "discogs_release_id": 3763 + case "discogs_master_release_id": 3764 + case "discogs_artist_id": 3765 + case "discogs_votes": 3766 + tag.value = typeof tag.value === "string" ? Number.parseInt(tag.value, 10) : tag.value; 3767 + break; 3768 + case "replaygain_track_gain": 3769 + case "replaygain_track_peak": 3770 + case "replaygain_album_gain": 3771 + case "replaygain_album_peak": 3772 + tag.value = toRatio(tag.value); 3773 + break; 3774 + case "replaygain_track_minmax": 3775 + tag.value = tag.value.split(",").map((v) => Number.parseInt(v, 10)); 3776 + break; 3777 + case "replaygain_undo": { 3778 + const minMix = tag.value.split(",").map((v) => Number.parseInt(v, 10)); 3779 + tag.value = { 3780 + leftChannel: minMix[0], 3781 + rightChannel: minMix[1] 3782 + }; 3783 + break; 3784 + } 3785 + case "gapless": 3786 + // iTunes gap-less flag 3787 + case "compilation": 3788 + case "podcast": 3789 + case "showMovement": 3790 + tag.value = tag.value === "1" || tag.value === 1; 3791 + break; 3792 + case "isrc": { 3793 + const commonTag = this.common[tag.id]; 3794 + if (commonTag && commonTag.indexOf(tag.value) !== -1) 3795 + return; 3796 + break; 3797 + } 3798 + case "comment": 3799 + if (typeof tag.value === "string") { 3800 + tag.value = { text: tag.value }; 3801 + } 3802 + if (tag.value.descriptor === "iTunPGAP") { 3803 + this.setGenericTag(tagType2, { id: "gapless", value: tag.value.text === "1" }); 3804 + } 3805 + break; 3806 + case "lyrics": 3807 + if (typeof tag.value === "string") { 3808 + tag.value = parseLyrics(tag.value); 3809 + } 3810 + break; 3811 + default: 3812 + } 3813 + if (tag.value !== null) { 3814 + this.setGenericTag(tagType2, tag); 3815 + } 3816 + } 3817 + /** 3818 + * Convert native tags to common tags 3819 + * @returns {IAudioMetadata} Native + common tags 3820 + */ 3821 + toCommonMetadata() { 3822 + return { 3823 + format: this.format, 3824 + native: this.native, 3825 + quality: this.quality, 3826 + common: this.common 3827 + }; 3828 + } 3829 + /** 3830 + * Handle singular artist tags (artist, albumartist) and cross-populate to plural form 3831 + */ 3832 + handleSingularArtistTag(tagType2, tag, singularId, pluralId) { 3833 + if (this.commonOrigin[singularId] === this.originPriority[tagType2]) { 3834 + return this.postMap("artificial", { id: pluralId, value: tag.value }); 3835 + } 3836 + if (!this.common[pluralId]) { 3837 + this.setGenericTag("artificial", { id: pluralId, value: tag.value }); 3838 + } 3839 + this.setGenericTag(tagType2, tag); 3840 + } 3841 + /** 3842 + * Handle plural artist tags (artists, albumartists) and cross-populate to singular form 3843 + */ 3844 + handlePluralArtistTag(tagType2, tag, singularId, pluralId) { 3845 + if (!this.common[singularId] || this.commonOrigin[singularId] === this.originPriority.artificial) { 3846 + if (!this.common[pluralId] || this.common[pluralId].indexOf(tag.value) === -1) { 3847 + const values = (this.common[pluralId] || []).concat([tag.value]); 3848 + const value = joinArtists(values); 3849 + this.setGenericTag("artificial", { id: singularId, value }); 3850 + } 3851 + } 3852 + this.setGenericTag(tagType2, tag); 3853 + } 3854 + /** 3855 + * Fix some common issues with picture object 3856 + * @param picture Picture 3857 + */ 3858 + async postFixPicture(picture) { 3859 + if (picture.data && picture.data.length > 0) { 3860 + if (!picture.format) { 3861 + const fileType = await fileTypeFromBuffer(Uint8Array.from(picture.data)); 3862 + if (fileType) { 3863 + picture.format = fileType.mime; 3864 + } else { 3865 + return null; 3866 + } 3867 + } 3868 + picture.format = picture.format.toLocaleLowerCase(); 3869 + switch (picture.format) { 3870 + case "image/jpg": 3871 + picture.format = "image/jpeg"; 3872 + } 3873 + return picture; 3874 + } 3875 + this.addWarning("Empty picture tag found"); 3876 + return null; 3877 + } 3878 + /** 3879 + * Convert native tag to common tags 3880 + */ 3881 + async toCommon(tagType2, tagId, value) { 3882 + const tag = { id: tagId, value }; 3883 + const genericTag = this.tagMapper.mapTag(tagType2, tag, this); 3884 + if (genericTag) { 3885 + await this.postMap(tagType2, genericTag); 3886 + } 3887 + } 3888 + /** 3889 + * Set generic tag 3890 + */ 3891 + setGenericTag(tagType2, tag) { 3892 + debug2(`common.${tag.id} = ${tag.value}`); 3893 + const prio0 = this.commonOrigin[tag.id] || 1e3; 3894 + const prio1 = this.originPriority[tagType2]; 3895 + if (isSingleton(tag.id)) { 3896 + if (prio1 <= prio0) { 3897 + this.common[tag.id] = tag.value; 3898 + this.commonOrigin[tag.id] = prio1; 3899 + } else { 3900 + return debug2(`Ignore native tag (singleton): ${tagType2}.${tag.id} = ${tag.value}`); 3901 + } 3902 + } else { 3903 + if (prio1 === prio0) { 3904 + if (!isUnique(tag.id) || this.common[tag.id].indexOf(tag.value) === -1) { 3905 + this.common[tag.id].push(tag.value); 3906 + } else { 3907 + debug2(`Ignore duplicate value: ${tagType2}.${tag.id} = ${tag.value}`); 3908 + } 3909 + } else if (prio1 < prio0) { 3910 + this.common[tag.id] = [tag.value]; 3911 + this.commonOrigin[tag.id] = prio1; 3912 + } else { 3913 + return debug2(`Ignore native tag (list): ${tagType2}.${tag.id} = ${tag.value}`); 3914 + } 3915 + } 3916 + if (this.opts?.observer) { 3917 + this.opts.observer({ metadata: this, tag: { type: "common", id: tag.id, value: tag.value } }); 3918 + } 3919 + } 3920 + }; 3921 + function joinArtists(artists) { 3922 + if (artists.length > 2) { 3923 + return `${artists.slice(0, artists.length - 1).join(", ")} & ${artists[artists.length - 1]}`; 3924 + } 3925 + return artists.join(" & "); 3926 + } 3927 + __name(joinArtists, "joinArtists"); 3928 + 3929 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/mpeg/MpegLoader.js 3930 + init_Buffer(); 3931 + init_process(); 3932 + var mpegParserLoader = { 3933 + parserType: "mpeg", 3934 + extensions: [".mp2", ".mp3", ".m2a", ".aac", "aacp"], 3935 + mimeTypes: ["audio/mpeg", "audio/mp3", "audio/aacs", "audio/aacp"], 3936 + async load() { 3937 + return (await import("./MpegParser-3YF6H5NF.js")).MpegParser; 3938 + } 3939 + }; 3940 + 3941 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/apev2/Apev2Loader.js 3942 + init_Buffer(); 3943 + init_process(); 3944 + var apeParserLoader = { 3945 + parserType: "apev2", 3946 + extensions: [".ape"], 3947 + mimeTypes: ["audio/ape", "audio/monkeys-audio"], 3948 + async load() { 3949 + return (await import("./APEv2Parser-LJ7N3HNS.js")).APEv2Parser; 3950 + } 3951 + }; 3952 + 3953 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/asf/AsfLoader.js 3954 + init_Buffer(); 3955 + init_process(); 3956 + var asfParserLoader = { 3957 + parserType: "asf", 3958 + extensions: [".asf"], 3959 + mimeTypes: ["audio/ms-wma", "video/ms-wmv", "audio/ms-asf", "video/ms-asf", "application/vnd.ms-asf"], 3960 + async load() { 3961 + return (await import("./AsfParser-YRIKESZW.js")).AsfParser; 3962 + } 3963 + }; 3964 + 3965 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/dsdiff/DsdiffLoader.js 3966 + init_Buffer(); 3967 + init_process(); 3968 + var dsdiffParserLoader = { 3969 + parserType: "dsdiff", 3970 + extensions: [".dff"], 3971 + mimeTypes: ["audio/dsf", "audio/dsd"], 3972 + async load() { 3973 + return (await import("./DsdiffParser-V5ROCCMP.js")).DsdiffParser; 3974 + } 3975 + }; 3976 + 3977 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/aiff/AiffLoader.js 3978 + init_Buffer(); 3979 + init_process(); 3980 + var aiffParserLoader = { 3981 + parserType: "aiff", 3982 + extensions: [".aif", "aiff", "aifc"], 3983 + mimeTypes: ["audio/aiff", "audio/aif", "audio/aifc", "application/aiff"], 3984 + async load() { 3985 + return (await import("./AiffParser-73LZIKSO.js")).AIFFParser; 3986 + } 3987 + }; 3988 + 3989 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/dsf/DsfLoader.js 3990 + init_Buffer(); 3991 + init_process(); 3992 + var dsfParserLoader = { 3993 + parserType: "dsf", 3994 + extensions: [".dsf"], 3995 + mimeTypes: ["audio/dsf"], 3996 + async load() { 3997 + return (await import("./DsfParser-GSHWLMZG.js")).DsfParser; 3998 + } 3999 + }; 4000 + 4001 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/flac/FlacLoader.js 4002 + init_Buffer(); 4003 + init_process(); 4004 + var flacParserLoader = { 4005 + parserType: "flac", 4006 + extensions: [".flac"], 4007 + mimeTypes: ["audio/flac"], 4008 + async load() { 4009 + return (await import("./FlacParser-3WLRWEM5.js")).FlacParser; 4010 + } 4011 + }; 4012 + 4013 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/matroska/MatroskaLoader.js 4014 + init_Buffer(); 4015 + init_process(); 4016 + var matroskaParserLoader = { 4017 + parserType: "matroska", 4018 + extensions: [".mka", ".mkv", ".mk3d", ".mks", "webm"], 4019 + mimeTypes: ["audio/matroska", "video/matroska", "audio/webm", "video/webm"], 4020 + async load() { 4021 + return (await import("./MatroskaParser-2BD5GINE.js")).MatroskaParser; 4022 + } 4023 + }; 4024 + 4025 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/mp4/Mp4Loader.js 4026 + init_Buffer(); 4027 + init_process(); 4028 + var mp4ParserLoader = { 4029 + parserType: "mp4", 4030 + extensions: [".mp4", ".m4a", ".m4b", ".m4pa", "m4v", "m4r", "3gp", ".mov", ".movie", ".qt"], 4031 + mimeTypes: ["audio/mp4", "audio/m4a", "video/m4v", "video/mp4", "video/quicktime"], 4032 + async load() { 4033 + return (await import("./MP4Parser-WGWY2YG6.js")).MP4Parser; 4034 + } 4035 + }; 4036 + 4037 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/musepack/MusepackLoader.js 4038 + init_Buffer(); 4039 + init_process(); 4040 + var musepackParserLoader = { 4041 + parserType: "musepack", 4042 + extensions: [".mpc"], 4043 + mimeTypes: ["audio/musepack"], 4044 + async load() { 4045 + return (await import("./MusepackParser-UV4ARQ3H.js")).MusepackParser; 4046 + } 4047 + }; 4048 + 4049 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/ogg/OggLoader.js 4050 + init_Buffer(); 4051 + init_process(); 4052 + var oggParserLoader = { 4053 + parserType: "ogg", 4054 + extensions: [".ogg", ".ogv", ".oga", ".ogm", ".ogx", ".opus", ".spx"], 4055 + mimeTypes: ["audio/ogg", "audio/opus", "audio/speex", "video/ogg"], 4056 + // RFC 7845, RFC 6716, RFC 5574 4057 + async load() { 4058 + return (await import("./OggParser-P4VZHADT.js")).OggParser; 4059 + } 4060 + }; 4061 + 4062 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/wavpack/WavPackLoader.js 4063 + init_Buffer(); 4064 + init_process(); 4065 + var wavpackParserLoader = { 4066 + parserType: "wavpack", 4067 + extensions: [".wv", ".wvp"], 4068 + mimeTypes: ["audio/wavpack"], 4069 + async load() { 4070 + return (await import("./WavPackParser-VXYVIQFV.js")).WavPackParser; 4071 + } 4072 + }; 4073 + 4074 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/wav/WaveLoader.js 4075 + init_Buffer(); 4076 + init_process(); 4077 + var riffParserLoader = { 4078 + parserType: "riff", 4079 + extensions: [".wav", "wave", ".bwf"], 4080 + mimeTypes: ["audio/vnd.wave", "audio/wav", "audio/wave"], 4081 + async load() { 4082 + return (await import("./WaveParser-OAMFGZFK.js")).WaveParser; 4083 + } 4084 + }; 4085 + 4086 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/ParserFactory.js 4087 + var debug3 = (0, import_debug3.default)("music-metadata:parser:factory"); 4088 + function parseHttpContentType(contentType) { 4089 + const type = import_content_type.default.parse(contentType); 4090 + const mime = (0, import_media_typer.parse)(type.type); 4091 + return { 4092 + type: mime.type, 4093 + subtype: mime.subtype, 4094 + suffix: mime.suffix, 4095 + parameters: type.parameters 4096 + }; 4097 + } 4098 + __name(parseHttpContentType, "parseHttpContentType"); 4099 + var ParserFactory = class { 4100 + static { 4101 + __name(this, "ParserFactory"); 4102 + } 4103 + constructor() { 4104 + this.parsers = []; 4105 + [ 4106 + flacParserLoader, 4107 + mpegParserLoader, 4108 + apeParserLoader, 4109 + mp4ParserLoader, 4110 + matroskaParserLoader, 4111 + riffParserLoader, 4112 + oggParserLoader, 4113 + asfParserLoader, 4114 + aiffParserLoader, 4115 + wavpackParserLoader, 4116 + musepackParserLoader, 4117 + dsfParserLoader, 4118 + dsdiffParserLoader 4119 + ].forEach((parser) => { 4120 + this.registerParser(parser); 4121 + }); 4122 + } 4123 + registerParser(parser) { 4124 + this.parsers.push(parser); 4125 + } 4126 + async parse(tokenizer3, parserLoader, opts) { 4127 + if (tokenizer3.supportsRandomAccess()) { 4128 + debug3("tokenizer supports random-access, scanning for appending headers"); 4129 + await scanAppendingHeaders(tokenizer3, opts); 4130 + } else { 4131 + debug3("tokenizer does not support random-access, cannot scan for appending headers"); 4132 + } 4133 + if (!parserLoader) { 4134 + const buf = new Uint8Array(4100); 4135 + if (tokenizer3.fileInfo.mimeType) { 4136 + parserLoader = this.findLoaderForContentType(tokenizer3.fileInfo.mimeType); 4137 + } 4138 + if (!parserLoader && tokenizer3.fileInfo.path) { 4139 + parserLoader = this.findLoaderForExtension(tokenizer3.fileInfo.path); 4140 + } 4141 + if (!parserLoader) { 4142 + debug3("Guess parser on content..."); 4143 + await tokenizer3.peekBuffer(buf, { mayBeLess: true }); 4144 + const guessedType = await fileTypeFromBuffer(buf, { mpegOffsetTolerance: 10 }); 4145 + if (!guessedType || !guessedType.mime) { 4146 + throw new CouldNotDetermineFileTypeError("Failed to determine audio format"); 4147 + } 4148 + debug3(`Guessed file type is mime=${guessedType.mime}, extension=${guessedType.ext}`); 4149 + parserLoader = this.findLoaderForContentType(guessedType.mime); 4150 + if (!parserLoader) { 4151 + throw new UnsupportedFileTypeError(`Guessed MIME-type not supported: ${guessedType.mime}`); 4152 + } 4153 + } 4154 + } 4155 + debug3(`Loading ${parserLoader.parserType} parser...`); 4156 + const metadata = new MetadataCollector(opts); 4157 + const ParserImpl = await parserLoader.load(); 4158 + const parser = new ParserImpl(metadata, tokenizer3, opts ?? {}); 4159 + debug3(`Parser ${parserLoader.parserType} loaded`); 4160 + await parser.parse(); 4161 + if (metadata.format.trackInfo) { 4162 + if (metadata.format.hasAudio === void 0) { 4163 + metadata.setFormat("hasAudio", !!metadata.format.trackInfo.find((track) => track.type === TrackType.audio)); 4164 + } 4165 + if (metadata.format.hasVideo === void 0) { 4166 + metadata.setFormat("hasVideo", !!metadata.format.trackInfo.find((track) => track.type === TrackType.video)); 4167 + } 4168 + } 4169 + return metadata.toCommonMetadata(); 4170 + } 4171 + /** 4172 + * @param filePath - Path, filename or extension to audio file 4173 + * @return Parser submodule name 4174 + */ 4175 + findLoaderForExtension(filePath) { 4176 + if (!filePath) 4177 + return; 4178 + const extension = getExtension(filePath).toLocaleLowerCase() || filePath; 4179 + return this.parsers.find((parser) => parser.extensions.indexOf(extension) !== -1); 4180 + } 4181 + findLoaderForContentType(httpContentType) { 4182 + let mime; 4183 + if (!httpContentType) 4184 + return; 4185 + try { 4186 + mime = parseHttpContentType(httpContentType); 4187 + } catch (_err) { 4188 + debug3(`Invalid HTTP Content-Type header value: ${httpContentType}`); 4189 + return; 4190 + } 4191 + const subType = mime.subtype.indexOf("x-") === 0 ? mime.subtype.substring(2) : mime.subtype; 4192 + return this.parsers.find((parser) => parser.mimeTypes.find((loader) => loader.indexOf(`${mime.type}/${subType}`) !== -1)); 4193 + } 4194 + getSupportedMimeTypes() { 4195 + const mimeTypeSet = /* @__PURE__ */ new Set(); 4196 + this.parsers.forEach((loader) => { 4197 + loader.mimeTypes.forEach((mimeType) => { 4198 + mimeTypeSet.add(mimeType); 4199 + mimeTypeSet.add(mimeType.replace("/", "/x-")); 4200 + }); 4201 + }); 4202 + return Array.from(mimeTypeSet); 4203 + } 4204 + }; 4205 + function getExtension(fname) { 4206 + const i = fname.lastIndexOf("."); 4207 + return i === -1 ? "" : fname.substring(i); 4208 + } 4209 + __name(getExtension, "getExtension"); 4210 + 4211 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/lyrics3/Lyrics3.js 4212 + init_Buffer(); 4213 + init_process(); 4214 + var endTag2 = "LYRICS200"; 4215 + async function getLyricsHeaderLength(tokenizer3) { 4216 + const fileSize = tokenizer3.fileInfo.size; 4217 + if (fileSize >= 143) { 4218 + const buf = new Uint8Array(15); 4219 + const position = tokenizer3.position; 4220 + await tokenizer3.readBuffer(buf, { position: fileSize - 143 }); 4221 + tokenizer3.setPosition(position); 4222 + const txt = textDecode(buf, "latin1"); 4223 + const tag = txt.substring(6); 4224 + if (tag === endTag2) { 4225 + return Number.parseInt(txt.substring(0, 6), 10) + 15; 4226 + } 4227 + } 4228 + return 0; 4229 + } 4230 + __name(getLyricsHeaderLength, "getLyricsHeaderLength"); 4231 + 4232 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/core.js 4233 + async function parseBlob(blob, options = {}) { 4234 + const tokenizer3 = fromBlob(blob); 4235 + try { 4236 + return await parseFromTokenizer(tokenizer3, options); 4237 + } finally { 4238 + await tokenizer3.close(); 4239 + } 4240 + } 4241 + __name(parseBlob, "parseBlob"); 4242 + async function parseWebStream(webStream, fileInfo, options = {}) { 4243 + const tokenizer3 = fromWebStream(webStream, { fileInfo: typeof fileInfo === "string" ? { mimeType: fileInfo } : fileInfo }); 4244 + try { 4245 + return await parseFromTokenizer(tokenizer3, options); 4246 + } finally { 4247 + await tokenizer3.close(); 4248 + } 4249 + } 4250 + __name(parseWebStream, "parseWebStream"); 4251 + function parseFromTokenizer(tokenizer3, options) { 4252 + const parserFactory = new ParserFactory(); 4253 + return parserFactory.parse(tokenizer3, void 0, options); 4254 + } 4255 + __name(parseFromTokenizer, "parseFromTokenizer"); 4256 + async function scanAppendingHeaders(tokenizer3, options = {}) { 4257 + let apeOffset = tokenizer3.fileInfo.size; 4258 + if (await hasID3v1Header(tokenizer3)) { 4259 + apeOffset -= 128; 4260 + const lyricsLen = await getLyricsHeaderLength(tokenizer3); 4261 + apeOffset -= lyricsLen; 4262 + } 4263 + options.apeHeader = await APEv2Parser.findApeFooterOffset(tokenizer3, apeOffset); 4264 + } 4265 + __name(scanAppendingHeaders, "scanAppendingHeaders"); 4266 + 4267 + // ../node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/index.js 4268 + var debug4 = (0, import_debug4.default)("music-metadata:parser"); 4269 + 4270 + // components/processor/metadata/common.js 4271 + var URI = __toESM(require_fast_uri()); 4272 + 4273 + // ../node_modules/.deno/@tokenizer+http@0.9.2/node_modules/@tokenizer/http/lib/index.js 4274 + init_Buffer(); 4275 + init_process(); 4276 + 4277 + // ../node_modules/.deno/@tokenizer+http@0.9.2/node_modules/@tokenizer/http/lib/http-client.js 4278 + init_Buffer(); 4279 + init_process(); 4280 + var import_debug7 = __toESM(require_src()); 4281 + 4282 + // ../node_modules/.deno/@tokenizer+http@0.9.2/node_modules/@tokenizer/http/lib/response-info.js 4283 + init_Buffer(); 4284 + init_process(); 4285 + 4286 + // ../node_modules/.deno/@tokenizer+range@0.12.0/node_modules/@tokenizer/range/lib/index.js 4287 + init_Buffer(); 4288 + init_process(); 4289 + 4290 + // ../node_modules/.deno/@tokenizer+range@0.12.0/node_modules/@tokenizer/range/lib/range-request-factory.js 4291 + init_Buffer(); 4292 + init_process(); 4293 + 4294 + // ../node_modules/.deno/@tokenizer+range@0.12.0/node_modules/@tokenizer/range/lib/range-request-tokenizer.js 4295 + init_Buffer(); 4296 + init_process(); 4297 + 4298 + // ../node_modules/.deno/strtok3@9.1.1/node_modules/strtok3/lib/index.js 4299 + init_Buffer(); 4300 + init_process(); 4301 + 4302 + // ../node_modules/.deno/strtok3@9.1.1/node_modules/strtok3/lib/core.js 4303 + init_Buffer(); 4304 + init_process(); 4305 + 4306 + // ../node_modules/.deno/peek-readable@5.4.2/node_modules/peek-readable/lib/index.js 4307 + init_Buffer(); 4308 + init_process(); 4309 + 4310 + // ../node_modules/.deno/peek-readable@5.4.2/node_modules/peek-readable/lib/EndOfStreamError.js 4311 + init_Buffer(); 4312 + init_process(); 4313 + var defaultMessages = "End-Of-Stream"; 4314 + var EndOfStreamError2 = class extends Error { 4315 + static { 4316 + __name(this, "EndOfStreamError"); 4317 + } 4318 + constructor() { 4319 + super(defaultMessages); 4320 + } 4321 + }; 4322 + 4323 + // ../node_modules/.deno/peek-readable@5.4.2/node_modules/peek-readable/lib/StreamReader.js 4324 + init_Buffer(); 4325 + init_process(); 4326 + 4327 + // ../node_modules/.deno/peek-readable@5.4.2/node_modules/peek-readable/lib/Deferred.js 4328 + init_Buffer(); 4329 + init_process(); 4330 + 4331 + // ../node_modules/.deno/peek-readable@5.4.2/node_modules/peek-readable/lib/AbstractStreamReader.js 4332 + init_Buffer(); 4333 + init_process(); 4334 + 4335 + // ../node_modules/.deno/peek-readable@5.4.2/node_modules/peek-readable/lib/WebStreamReader.js 4336 + init_Buffer(); 4337 + init_process(); 4338 + 4339 + // ../node_modules/.deno/strtok3@9.1.1/node_modules/strtok3/lib/ReadStreamTokenizer.js 4340 + init_Buffer(); 4341 + init_process(); 4342 + 4343 + // ../node_modules/.deno/strtok3@9.1.1/node_modules/strtok3/lib/AbstractTokenizer.js 4344 + init_Buffer(); 4345 + init_process(); 4346 + var AbstractTokenizer2 = class { 4347 + static { 4348 + __name(this, "AbstractTokenizer"); 4349 + } 4350 + /** 4351 + * Constructor 4352 + * @param options Tokenizer options 4353 + * @protected 4354 + */ 4355 + constructor(options) { 4356 + this.numBuffer = new Uint8Array(8); 4357 + this.position = 0; 4358 + this.onClose = options?.onClose; 4359 + if (options?.abortSignal) { 4360 + options.abortSignal.addEventListener("abort", () => { 4361 + this.abort(); 4362 + }); 4363 + } 4364 + } 4365 + /** 4366 + * Read a token from the tokenizer-stream 4367 + * @param token - The token to read 4368 + * @param position - If provided, the desired position in the tokenizer-stream 4369 + * @returns Promise with token data 4370 + */ 4371 + async readToken(token, position = this.position) { 4372 + const uint8Array = new Uint8Array(token.len); 4373 + const len = await this.readBuffer(uint8Array, { position }); 4374 + if (len < token.len) 4375 + throw new EndOfStreamError2(); 4376 + return token.get(uint8Array, 0); 4377 + } 4378 + /** 4379 + * Peek a token from the tokenizer-stream. 4380 + * @param token - Token to peek from the tokenizer-stream. 4381 + * @param position - Offset where to begin reading within the file. If position is null, data will be read from the current file position. 4382 + * @returns Promise with token data 4383 + */ 4384 + async peekToken(token, position = this.position) { 4385 + const uint8Array = new Uint8Array(token.len); 4386 + const len = await this.peekBuffer(uint8Array, { position }); 4387 + if (len < token.len) 4388 + throw new EndOfStreamError2(); 4389 + return token.get(uint8Array, 0); 4390 + } 4391 + /** 4392 + * Read a numeric token from the stream 4393 + * @param token - Numeric token 4394 + * @returns Promise with number 4395 + */ 4396 + async readNumber(token) { 4397 + const len = await this.readBuffer(this.numBuffer, { length: token.len }); 4398 + if (len < token.len) 4399 + throw new EndOfStreamError2(); 4400 + return token.get(this.numBuffer, 0); 4401 + } 4402 + /** 4403 + * Read a numeric token from the stream 4404 + * @param token - Numeric token 4405 + * @returns Promise with number 4406 + */ 4407 + async peekNumber(token) { 4408 + const len = await this.peekBuffer(this.numBuffer, { length: token.len }); 4409 + if (len < token.len) 4410 + throw new EndOfStreamError2(); 4411 + return token.get(this.numBuffer, 0); 4412 + } 4413 + /** 4414 + * Ignore number of bytes, advances the pointer in under tokenizer-stream. 4415 + * @param length - Number of bytes to ignore 4416 + * @return resolves the number of bytes ignored, equals length if this available, otherwise the number of bytes available 4417 + */ 4418 + async ignore(length) { 4419 + if (this.fileInfo.size !== void 0) { 4420 + const bytesLeft = this.fileInfo.size - this.position; 4421 + if (length > bytesLeft) { 4422 + this.position += bytesLeft; 4423 + return bytesLeft; 4424 + } 4425 + } 4426 + this.position += length; 4427 + return length; 4428 + } 4429 + async close() { 4430 + await this.abort(); 4431 + await this.onClose?.(); 4432 + } 4433 + normalizeOptions(uint8Array, options) { 4434 + if (options && options.position !== void 0 && options.position < this.position) { 4435 + throw new Error("`options.position` must be equal or greater than `tokenizer.position`"); 4436 + } 4437 + if (options) { 4438 + return { 4439 + mayBeLess: options.mayBeLess === true, 4440 + offset: options.offset ? options.offset : 0, 4441 + length: options.length ? options.length : uint8Array.length - (options.offset ? options.offset : 0), 4442 + position: options.position ? options.position : this.position 4443 + }; 4444 + } 4445 + return { 4446 + mayBeLess: false, 4447 + offset: 0, 4448 + length: uint8Array.length, 4449 + position: this.position 4450 + }; 4451 + } 4452 + abort() { 4453 + return Promise.resolve(); 4454 + } 4455 + }; 4456 + 4457 + // ../node_modules/.deno/strtok3@9.1.1/node_modules/strtok3/lib/BufferTokenizer.js 4458 + init_Buffer(); 4459 + init_process(); 4460 + 4461 + // ../node_modules/.deno/strtok3@9.1.1/node_modules/strtok3/lib/FileTokenizer.js 4462 + init_Buffer(); 4463 + init_process(); 4464 + var FileTokenizer = class _FileTokenizer extends AbstractTokenizer2 { 4465 + static { 4466 + __name(this, "FileTokenizer"); 4467 + } 4468 + /** 4469 + * Create tokenizer from provided file path 4470 + * @param sourceFilePath File path 4471 + */ 4472 + static async fromFile(sourceFilePath) { 4473 + const fileHandle = await open2(sourceFilePath, "r"); 4474 + const stat = await fileHandle.stat(); 4475 + return new _FileTokenizer(fileHandle, { fileInfo: { path: sourceFilePath, size: stat.size } }); 4476 + } 4477 + constructor(fileHandle, options) { 4478 + super(options); 4479 + this.fileHandle = fileHandle; 4480 + this.fileInfo = options.fileInfo; 4481 + } 4482 + /** 4483 + * Read buffer from file 4484 + * @param uint8Array - Uint8Array to write result to 4485 + * @param options - Read behaviour options 4486 + * @returns Promise number of bytes read 4487 + */ 4488 + async readBuffer(uint8Array, options) { 4489 + const normOptions = this.normalizeOptions(uint8Array, options); 4490 + this.position = normOptions.position; 4491 + if (normOptions.length === 0) 4492 + return 0; 4493 + const res = await this.fileHandle.read(uint8Array, normOptions.offset, normOptions.length, normOptions.position); 4494 + this.position += res.bytesRead; 4495 + if (res.bytesRead < normOptions.length && (!options || !options.mayBeLess)) { 4496 + throw new EndOfStreamError2(); 4497 + } 4498 + return res.bytesRead; 4499 + } 4500 + /** 4501 + * Peek buffer from file 4502 + * @param uint8Array - Uint8Array (or Buffer) to write data to 4503 + * @param options - Read behaviour options 4504 + * @returns Promise number of bytes read 4505 + */ 4506 + async peekBuffer(uint8Array, options) { 4507 + const normOptions = this.normalizeOptions(uint8Array, options); 4508 + const res = await this.fileHandle.read(uint8Array, normOptions.offset, normOptions.length, normOptions.position); 4509 + if (!normOptions.mayBeLess && res.bytesRead < normOptions.length) { 4510 + throw new EndOfStreamError2(); 4511 + } 4512 + return res.bytesRead; 4513 + } 4514 + async close() { 4515 + await this.fileHandle.close(); 4516 + return super.close(); 4517 + } 4518 + setPosition(position) { 4519 + this.position = position; 4520 + } 4521 + supportsRandomAccess() { 4522 + return true; 4523 + } 4524 + }; 4525 + 4526 + // ../node_modules/.deno/strtok3@9.1.1/node_modules/strtok3/lib/index.js 4527 + var fromFile2 = FileTokenizer.fromFile; 4528 + 4529 + // ../node_modules/.deno/@tokenizer+range@0.12.0/node_modules/@tokenizer/range/lib/chunked-file-data.js 4530 + init_Buffer(); 4531 + init_process(); 4532 + 4533 + // ../node_modules/.deno/@tokenizer+range@0.12.0/node_modules/@tokenizer/range/lib/range-request-tokenizer.js 4534 + var import_debug5 = __toESM(require_src()); 4535 + var debug5 = (0, import_debug5.default)("range-request-reader"); 4536 + function parseContentRange(contentRange) { 4537 + if (!contentRange) { 4538 + throw new Error("Content range must be provided"); 4539 + } 4540 + debug5(`parseContentRange response: contentRange=${contentRange}`); 4541 + const parsedContentRange = contentRange.match(/bytes (\d+)-(\d+)\/(?:(\d+)|\*)/i); 4542 + if (!parsedContentRange) { 4543 + throw new Error(`FIXME: Unknown Content-Range syntax: ${contentRange}`); 4544 + } 4545 + return { 4546 + firstBytePosition: Number.parseInt(parsedContentRange[1], 10), 4547 + lastBytePosition: Number.parseInt(parsedContentRange[2], 10), 4548 + instanceLength: parsedContentRange[3] ? Number.parseInt(parsedContentRange[3], 10) : void 0 4549 + }; 4550 + } 4551 + __name(parseContentRange, "parseContentRange"); 4552 + 4553 + // ../node_modules/.deno/@tokenizer+range@0.12.0/node_modules/@tokenizer/range/lib/range-request-factory.js 4554 + var import_debug6 = __toESM(require_src()); 4555 + var debug6 = (0, import_debug6.default)("range-request-reader"); 4556 + 4557 + // ../node_modules/.deno/@tokenizer+http@0.9.2/node_modules/@tokenizer/http/lib/response-info.js 4558 + var ResponseInfo = class { 4559 + static { 4560 + __name(this, "ResponseInfo"); 4561 + } 4562 + constructor(response) { 4563 + this.response = response; 4564 + } 4565 + getContentLength() { 4566 + const contentLength = this.response.headers.get("Content-Length"); 4567 + return contentLength ? Number.parseInt(contentLength, 10) : void 0; 4568 + } 4569 + getAcceptRangesHeaderValue() { 4570 + return this.response.headers.get("Accept-Ranges"); 4571 + } 4572 + getContentType() { 4573 + return this.response.headers.get("Content-Type"); 4574 + } 4575 + acceptRanges() { 4576 + const value = this.getAcceptRangesHeaderValue(); 4577 + return value !== null && value.trim().toLowerCase() === "bytes"; 4578 + } 4579 + getContentRange() { 4580 + const contentRange = this.response.headers.get("Content-Range"); 4581 + if (!contentRange) { 4582 + return; 4583 + } 4584 + return parseContentRange(contentRange); 4585 + } 4586 + toRangeRequestResponse() { 4587 + const contentRange = this.getContentRange(); 4588 + const size = contentRange ? contentRange.instanceLength : this.getContentLength(); 4589 + if (typeof size !== "number") { 4590 + throw new Error("Could not determine file-size from HTTP response"); 4591 + } 4592 + return { 4593 + url: this.response.url, 4594 + size, 4595 + mimeType: this.getContentType() ?? void 0, 4596 + acceptPartialRequests: this.acceptRanges(), 4597 + contentRange, 4598 + arrayBuffer: /* @__PURE__ */ __name(() => this.response.arrayBuffer().then((res) => new Uint8Array(res)), "arrayBuffer") 4599 + }; 4600 + } 4601 + }; 4602 + 4603 + // ../node_modules/.deno/@tokenizer+http@0.9.2/node_modules/@tokenizer/http/lib/http-client.js 4604 + var debug7 = (0, import_debug7.default)("streaming-http-token-reader:http-client"); 4605 + var DEFAULT_CONFIG = { 4606 + resolveUrl: false 4607 + }; 4608 + var HttpClient = class { 4609 + static { 4610 + __name(this, "HttpClient"); 4611 + } 4612 + constructor(url, config) { 4613 + this.url = url; 4614 + this.abortController = new AbortController(); 4615 + this.config = DEFAULT_CONFIG; 4616 + Object.assign(this.config, config); 4617 + } 4618 + async getHeadInfo() { 4619 + const response = new ResponseInfo(await fetch(this.url, { method: "HEAD", signal: this.abortController.signal })); 4620 + if (this.config.resolveUrl) 4621 + this.resolvedUrl = response.response.url; 4622 + return response.toRangeRequestResponse(); 4623 + } 4624 + async getResponse(method, range) { 4625 + const headers = new Headers(); 4626 + if (range) { 4627 + debug7(`_getResponse ${method} ${range[0]}..${range[1]}`); 4628 + headers.set("Range", `bytes=${range[0]}-${range[1]}`); 4629 + } else { 4630 + debug7(`_getResponse ${method} (range not provided)`); 4631 + } 4632 + const response = new ResponseInfo(await fetch(this.resolvedUrl || this.url, { method, headers, signal: this.abortController.signal })); 4633 + if (response.response.ok) { 4634 + if (this.config.resolveUrl) 4635 + this.resolvedUrl = response.response.url; 4636 + return response.toRangeRequestResponse(); 4637 + } 4638 + throw new Error(`Unexpected HTTP response status=${response.response.status}`); 4639 + } 4640 + abort() { 4641 + debug7("abort"); 4642 + this.abortController.abort(); 4643 + } 4644 + }; 4645 + 4646 + // ../node_modules/.deno/@tokenizer+range@0.13.1/node_modules/@tokenizer/range/lib/index.js 4647 + init_Buffer(); 4648 + init_process(); 4649 + 4650 + // ../node_modules/.deno/@tokenizer+range@0.13.1/node_modules/@tokenizer/range/lib/range-request-factory.js 4651 + init_Buffer(); 4652 + init_process(); 4653 + 4654 + // ../node_modules/.deno/@tokenizer+range@0.13.1/node_modules/@tokenizer/range/lib/range-request-tokenizer.js 4655 + init_Buffer(); 4656 + init_process(); 4657 + 4658 + // ../node_modules/.deno/@tokenizer+range@0.13.1/node_modules/@tokenizer/range/lib/chunked-file-data.js 4659 + init_Buffer(); 4660 + init_process(); 4661 + var NOT_FOUND = -1; 4662 + var ChunkedFileData2 = class { 4663 + static { 4664 + __name(this, "ChunkedFileData"); 4665 + } 4666 + constructor() { 4667 + this._fileData = []; 4668 + } 4669 + /** 4670 + * Adds data to the file storage at a specific offset. 4671 + */ 4672 + addData(offset, data) { 4673 + const offsetEnd = offset + data.byteLength - 1; 4674 + const chunkRange = this._getChunkRange(offset, offsetEnd); 4675 + if (chunkRange.startIx === NOT_FOUND) { 4676 + this._fileData.splice(chunkRange.insertIx || 0, 0, { 4677 + offset, 4678 + data 4679 + }); 4680 + } else { 4681 + const firstChunk = this._fileData[chunkRange.startIx]; 4682 + const lastChunk = this._fileData[chunkRange.endIx]; 4683 + const needsPrepend = offset > firstChunk.offset; 4684 + const needsAppend = offsetEnd < lastChunk.offset + lastChunk.data.byteLength - 1; 4685 + const chunk = { 4686 + offset: Math.min(offset, firstChunk.offset), 4687 + data 4688 + }; 4689 + if (needsPrepend) { 4690 + const slicedData = firstChunk.data.slice(0, offset - firstChunk.offset); 4691 + chunk.data = this._concatData(slicedData, data); 4692 + } 4693 + if (needsAppend) { 4694 + const slicedData = chunk.data.slice(0, lastChunk.offset - chunk.offset); 4695 + chunk.data = this._concatData(slicedData, lastChunk.data); 4696 + } 4697 + this._fileData.splice(chunkRange.startIx, chunkRange.endIx - chunkRange.startIx + 1, chunk); 4698 + } 4699 + } 4700 + hasDataRange(offsetStart, offsetEnd) { 4701 + for (let i = 0; i < this._fileData.length; i++) { 4702 + const chunk = this._fileData[i]; 4703 + if (offsetEnd < chunk.offset) { 4704 + return false; 4705 + } 4706 + if (offsetStart >= chunk.offset && offsetEnd < chunk.offset + chunk.data.byteLength) { 4707 + return true; 4708 + } 4709 + } 4710 + return false; 4711 + } 4712 + readToBuffer(buffer, offset, position, length) { 4713 + const _pos_offset = position; 4714 + let dataChunk; 4715 + for (let i = 0; i < this._fileData.length; i++) { 4716 + const dataChunkStart = this._fileData[i].offset; 4717 + const dataChunkEnd = dataChunkStart + this._fileData[i].data.byteLength; 4718 + if (_pos_offset >= dataChunkStart && _pos_offset < dataChunkEnd) { 4719 + dataChunk = this._fileData[i]; 4720 + const chunkOffset = _pos_offset - dataChunkStart; 4721 + let chunkLength = Math.min(length, dataChunk.data.byteLength - chunkOffset); 4722 + buffer.set(dataChunk.data.subarray(chunkOffset, chunkOffset + chunkLength), offset); 4723 + if (chunkLength < length) { 4724 + chunkLength += this.readToBuffer(buffer, offset + chunkLength, position + chunkLength, length - chunkLength); 4725 + } 4726 + return chunkLength; 4727 + } 4728 + } 4729 + return 0; 4730 + } 4731 + _concatData(buffer1, buffer2) { 4732 + const tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength); 4733 + tmp.set(new Uint8Array(buffer1), 0); 4734 + tmp.set(new Uint8Array(buffer2), buffer1.byteLength); 4735 + return tmp; 4736 + } 4737 + /** 4738 + * Finds the chunk range that overlaps the [offsetStart-1,offsetEnd+1] range. 4739 + * When a chunk is adjacent to the offset we still consider it part of the 4740 + * range (this is the situation of offsetStart-1 or offsetEnd+1). 4741 + * When no chunks are found `insertIx` denotes the index where the data 4742 + * should be inserted in the data list (startIx == NOT_FOUND and endIX == 4743 + * NOT_FOUND). 4744 + */ 4745 + _getChunkRange(offsetStart, offsetEnd) { 4746 + let startChunkIx = NOT_FOUND; 4747 + let endChunkIx = NOT_FOUND; 4748 + let insertIx = 0; 4749 + for (let i = 0; i < this._fileData.length; i++, insertIx = i) { 4750 + const chunkOffsetStart = this._fileData[i].offset; 4751 + const chunkOffsetEnd = chunkOffsetStart + this._fileData[i].data.byteLength; 4752 + if (offsetEnd < chunkOffsetStart - 1) { 4753 + break; 4754 + } 4755 + if (offsetStart <= chunkOffsetEnd + 1 && offsetEnd >= chunkOffsetStart - 1) { 4756 + startChunkIx = i; 4757 + break; 4758 + } 4759 + } 4760 + if (startChunkIx === NOT_FOUND) { 4761 + return { 4762 + startIx: NOT_FOUND, 4763 + endIx: NOT_FOUND, 4764 + insertIx 4765 + }; 4766 + } 4767 + for (let i = startChunkIx; i < this._fileData.length; i++) { 4768 + const chunkOffsetStart = this._fileData[i].offset; 4769 + const chunkOffsetEnd = chunkOffsetStart + this._fileData[i].data.byteLength; 4770 + if (offsetEnd >= chunkOffsetStart - 1) { 4771 + endChunkIx = i; 4772 + } 4773 + if (offsetEnd <= chunkOffsetEnd + 1) { 4774 + break; 4775 + } 4776 + } 4777 + if (endChunkIx === NOT_FOUND) { 4778 + endChunkIx = startChunkIx; 4779 + } 4780 + return { 4781 + startIx: startChunkIx, 4782 + endIx: endChunkIx 4783 + }; 4784 + } 4785 + }; 4786 + 4787 + // ../node_modules/.deno/@tokenizer+range@0.13.1/node_modules/@tokenizer/range/lib/range-request-tokenizer.js 4788 + var import_debug8 = __toESM(require_src()); 4789 + var debug8 = (0, import_debug8.default)("range-request-reader"); 4790 + var RangeRequestTokenizer2 = class extends AbstractTokenizer { 4791 + static { 4792 + __name(this, "RangeRequestTokenizer"); 4793 + } 4794 + constructor(rangeRequestClient, options) { 4795 + super({ fileInfo: options.fileInfo }); 4796 + this.rangeRequestClient = rangeRequestClient; 4797 + this.options = options; 4798 + this.fileInfo = options.fileInfo; 4799 + if (Number.isNaN(options.minimumChunkSize)) { 4800 + throw new Error("minimumChunkSize must be a number"); 4801 + } 4802 + this._fileData = new ChunkedFileData2(); 4803 + this.options.abortSignal?.addEventListener("abort", () => { 4804 + this.abort(); 4805 + }); 4806 + } 4807 + setPosition(position) { 4808 + this.position = position; 4809 + } 4810 + /** 4811 + * Read portion from stream 4812 + * @param uint8array - Target `Uint8Array` 4813 + * @param options - Additional read options 4814 + * @returns Promise with number of bytes read 4815 + */ 4816 + async readBuffer(uint8array, options) { 4817 + if (options?.position) { 4818 + this.position = options.position; 4819 + } 4820 + const length = await this.peekBuffer(uint8array, options); 4821 + this.position += length; 4822 + return length; 4823 + } 4824 + /** 4825 + * Peek (read ahead) buffer from tokenizer 4826 + * @param uint8array - Target `Uint8Array` to fill with data peek from the tokenizer-stream 4827 + * @param options - Additional read options 4828 + * @returns Promise with number of bytes read 4829 + */ 4830 + async peekBuffer(uint8array, options) { 4831 + const offset = 0; 4832 + if (!this.fileInfo) 4833 + throw new Error("File-info missing"); 4834 + const size = this.fileInfo.size; 4835 + const position = options?.position !== void 0 ? options.position : this.position; 4836 + const requested = options?.length !== void 0 ? options.length : uint8array.length - offset; 4837 + if (requested <= 0) 4838 + return 0; 4839 + const available = size - position; 4840 + if (available <= 0) { 4841 + if (options?.mayBeLess) 4842 + return 0; 4843 + throw new RangeError(`peekBuffer position ${position} is beyond EOF ${size}`); 4844 + } 4845 + const length = options?.mayBeLess ? Math.min(requested, available) : requested; 4846 + if (!options?.mayBeLess && length > available) { 4847 + throw new RangeError(`peekBuffer length ${length} exceeds remaining ${available} at position ${position}`); 4848 + } 4849 + const lastPos = position + length - 1; 4850 + await this.loadRange([position, lastPos]); 4851 + this._fileData.readToBuffer(uint8array, offset, position, length); 4852 + return length; 4853 + } 4854 + /** 4855 + * Ignore number of bytes, advances the pointer in under tokenizer-stream. 4856 + * @param length - Number of bytes to skip (ignore) 4857 + * @return actual number of bytes ignored 4858 + */ 4859 + async ignore(length) { 4860 + const bytesLeft = this.fileInfo.size - this.position; 4861 + if (length <= bytesLeft) { 4862 + this.position += length; 4863 + return length; 4864 + } 4865 + this.position += bytesLeft; 4866 + return bytesLeft; 4867 + } 4868 + async abort() { 4869 + this.rangeRequestClient.abort(); 4870 + } 4871 + supportsRandomAccess() { 4872 + return true; 4873 + } 4874 + async loadRange(range) { 4875 + debug8(`request range ${range[0]}..${range[1]}`); 4876 + if (range[0] > this.fileInfo.size - 1) { 4877 + throw new Error("End-Of-File"); 4878 + } 4879 + debug8(`adjusted range ${range[0]}..${range[1]}`); 4880 + if (this._fileData.hasDataRange(range[0], range[1])) { 4881 + debug8("Read from cache"); 4882 + return; 4883 + } 4884 + range = roundRange2(range, this.options.minimumChunkSize); 4885 + range[1] = Math.min(this.fileInfo.size - 1, range[1]); 4886 + debug8(`blocked range: ${range[0]}..${range[1]}`); 4887 + return this.rangeRequestClient.getResponse("GET", range).then((response) => { 4888 + return response.arrayBuffer().then((data) => { 4889 + this._fileData.addData(range[0], data); 4890 + }); 4891 + }); 4892 + } 4893 + }; 4894 + function roundRange2(range, minimumChunkSize) { 4895 + const length = range[1] - range[0] + 1; 4896 + const newLength = Math.max(minimumChunkSize, length); 4897 + return [range[0], range[0] + newLength - 1]; 4898 + } 4899 + __name(roundRange2, "roundRange"); 4900 + 4901 + // ../node_modules/.deno/@tokenizer+range@0.13.1/node_modules/@tokenizer/range/lib/range-request-factory.js 4902 + var import_debug9 = __toESM(require_src()); 4903 + var debug9 = (0, import_debug9.default)("range-request-reader"); 4904 + var RangeRequestFactory2 = class { 4905 + static { 4906 + __name(this, "RangeRequestFactory"); 4907 + } 4908 + constructor(rangeRequestClient) { 4909 + this.rangeRequestClient = rangeRequestClient; 4910 + this.config = { 4911 + avoidHeadRequests: false, 4912 + initialChunkSize: 4 * 1024, 4913 + minimumChunkSize: 1024 4914 + }; 4915 + } 4916 + async initTokenizer(config) { 4917 + if (config) { 4918 + this.config = { ...this.config, ...config }; 4919 + } 4920 + const headRequestInfo = await this.getHeadRequestInfo(); 4921 + if (!headRequestInfo.acceptPartialRequests) { 4922 + throw new Error("Server does not accept partial requests"); 4923 + } 4924 + return new RangeRequestTokenizer2(this.rangeRequestClient, { 4925 + fileInfo: headRequestInfo, 4926 + minimumChunkSize: this.config.minimumChunkSize, 4927 + abortSignal: config?.abortSignal 4928 + }); 4929 + } 4930 + /** 4931 + * Get file information, an HTTP-client may implement this doing a HEAD request 4932 + * @return Promise with head-request-info, extending tokenizer file-info. 4933 + */ 4934 + getHeadRequestInfo() { 4935 + return this.config.avoidHeadRequests ? this.fetchFileInfoWithGetRequest() : this.fetchFileInfoWithHeadRequest(); 4936 + } 4937 + async fetchFileInfoWithHeadRequest() { 4938 + debug9("_fetchSizeWithHeadRequest()"); 4939 + if (this.rangeRequestClient.getHeadInfo) { 4940 + const info = await this.rangeRequestClient.getHeadInfo(); 4941 + if (info.size) { 4942 + debug9(`MIME-type=${info.mimeType}, content-length=${info.size}, accept-partial-requests=${info.acceptPartialRequests}`); 4943 + return info; 4944 + } 4945 + } 4946 + debug9("Content-Length not provided by the server, fallback to GET requests"); 4947 + return this.fetchFileInfoWithGetRequest(); 4948 + } 4949 + async fetchFileInfoWithGetRequest() { 4950 + const range = roundRange2([0, this.config.initialChunkSize], this.config.minimumChunkSize); 4951 + const response = await this.rangeRequestClient.getResponse("GET", range); 4952 + debug9(`_fetchSizeWithGetRequest response: contentRange=[${response.contentRange?.firstBytePosition}-${response.contentRange?.lastBytePosition}/${response.contentRange?.instanceLength}]`); 4953 + if (!response.contentRange) { 4954 + throw new Error("Failed to resolve content range (file size)"); 4955 + } 4956 + return response; 4957 + } 4958 + }; 4959 + 4960 + // ../node_modules/.deno/@tokenizer+range@0.13.1/node_modules/@tokenizer/range/lib/index.js 4961 + function tokenizer2(rangeRequestClient, config) { 4962 + const factory = new RangeRequestFactory2(rangeRequestClient); 4963 + return factory.initTokenizer(config); 4964 + } 4965 + __name(tokenizer2, "tokenizer"); 4966 + 4967 + // components/processor/metadata/common.js 4968 + async function musicMetadataTags({ 4969 + includeArtwork, 4970 + mimeType, 4971 + stream, 4972 + urls 4973 + }) { 4974 + const uri = urls ? URI.parse(urls.get) : void 0; 4975 + const pathParts = uri?.path?.split("/"); 4976 + const filename = pathParts?.[pathParts.length - 1]; 4977 + let meta; 4978 + if (urls?.get.startsWith("blob:")) { 4979 + const blob = await fetch(urls.get).then((r) => r.blob()); 4980 + meta = await parseBlob(blob, { skipCovers: !includeArtwork }); 4981 + } else if (urls) { 4982 + const httpClient = new HttpClient(urls.head, { 4983 + resolveUrl: false 4984 + }); 4985 + httpClient.resolvedUrl = urls.get; 4986 + const getHeadInfo = httpClient.getHeadInfo; 4987 + httpClient.getHeadInfo = async () => { 4988 + const info = await getHeadInfo.call(httpClient); 4989 + return { ...info, acceptPartialRequests: true }; 4990 + }; 4991 + const tokenizer3 = await tokenizer2(httpClient); 4992 + meta = await parseFromTokenizer(tokenizer3, { skipCovers: !includeArtwork }); 4993 + } else if (stream) { 4994 + meta = await parseWebStream(stream, { mimeType }, { 4995 + skipCovers: !includeArtwork 4996 + }); 4997 + } else { 4998 + throw new Error("Missing args, need either some urls or a stream."); 4999 + } 5000 + const statsFull = { 5001 + albumGain: maybeRound(meta.format.albumGain), 5002 + bitrate: maybeRound(meta.format.bitrate), 5003 + bitsPerSample: maybeRound(meta.format.bitsPerSample), 5004 + codec: meta.format.codec, 5005 + container: meta.format.container, 5006 + duration: meta.format.duration != null ? Math.round(meta.format.duration * 1e3) : void 0, 5007 + lossless: meta.format.lossless, 5008 + numberOfChannels: maybeRound(meta.format.numberOfChannels), 5009 + sampleRate: maybeRound(meta.format.sampleRate), 5010 + trackGain: maybeRound(meta.format.trackGain) 5011 + }; 5012 + const tagsFull = { 5013 + album: meta.common.album, 5014 + albumartist: meta.common.albumartist, 5015 + albumartists: Array.isArray(meta.common.albumartist) ? meta.common.albumartist : meta.common.albumartist ? [meta.common.albumartist] : void 0, 5016 + albumartistsort: meta.common.albumartistsort, 5017 + albumsort: meta.common.albumsort, 5018 + arranger: meta.common.arranger, 5019 + artist: meta.common.artist, 5020 + artists: meta.common.artists ?? (meta.common.artist ? [meta.common.artist] : []), 5021 + artistsort: meta.common.artistsort, 5022 + asin: meta.common.asin, 5023 + averageLevel: meta.common.averageLevel, 5024 + barcode: meta.common.barcode, 5025 + bpm: meta.common.bpm, 5026 + catalognumbers: meta.common.catalognumber, 5027 + compilation: meta.common.compilation, 5028 + composers: meta.common.composer, 5029 + composersort: meta.common.composersort, 5030 + conductors: meta.common.conductor, 5031 + date: meta.common.date, 5032 + disc: { 5033 + no: meta.common.disk.no || 1, 5034 + ...meta.common.disk.of && { of: meta.common.disk.of } 5035 + }, 5036 + djmixers: meta.common.djmixer, 5037 + engineers: meta.common.engineer, 5038 + gapless: meta.common.gapless, 5039 + genres: Array.isArray(meta.common.genre) ? meta.common.genre : meta.common.genre ? [meta.common.genre] : void 0, 5040 + isrc: meta.common.isrc, 5041 + labels: meta.common.label, 5042 + lyricists: meta.common.lyricist, 5043 + media: meta.common.media, 5044 + mixers: meta.common.mixer, 5045 + moods: Array.isArray(meta.common.mood) ? meta.common.mood : meta.common.mood ? [meta.common.mood] : void 0, 5046 + originaldate: meta.common.originaldate, 5047 + originalyear: meta.common.originalyear, 5048 + peakLevel: meta.common.peakLevel, 5049 + producers: meta.common.producer, 5050 + publishers: meta.common.publisher, 5051 + releasecountry: meta.common.releasecountry, 5052 + releasedate: meta.common.releasedate, 5053 + releasestatus: meta.common.releasestatus, 5054 + releasetypes: meta.common.releasetype, 5055 + remixers: meta.common.remixer, 5056 + technicians: meta.common.technician, 5057 + title: meta.common.title || filename || urls?.head || "Unknown", 5058 + titlesort: meta.common.titlesort, 5059 + track: { 5060 + no: meta.common.track.no || 1, 5061 + ...meta.common.track.of && { of: meta.common.track.of } 5062 + }, 5063 + work: meta.common.work, 5064 + writers: meta.common.writer, 5065 + year: meta.common.year 5066 + }; 5067 + const stats = removeUndefinedValuesFromRecord(statsFull); 5068 + const tags = removeUndefinedValuesFromRecord(tagsFull); 5069 + return { 5070 + artwork: includeArtwork ? meta.common.picture : void 0, 5071 + stats, 5072 + tags 5073 + }; 5074 + } 5075 + __name(musicMetadataTags, "musicMetadataTags"); 5076 + function maybeRound(value) { 5077 + return typeof value === "number" ? Math.round(value) : value; 5078 + } 5079 + __name(maybeRound, "maybeRound"); 5080 + 5081 + export { 5082 + musicMetadataTags 5083 + }; 5084 + /*! Bundled license information: 5085 + 5086 + content-type/index.js: 5087 + (*! 5088 + * content-type 5089 + * Copyright(c) 2015 Douglas Christopher Wilson 5090 + * MIT Licensed 5091 + *) 5092 + 5093 + media-typer/index.js: 5094 + (*! 5095 + * media-typer 5096 + * Copyright(c) 2014-2017 Douglas Christopher Wilson 5097 + * MIT Licensed 5098 + *) 5099 + */ 5100 + 5101 + //# sourceMappingURL=./chunk-FPOQLPK4.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-FPOQLPK4.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/content-type@1.0.5/node_modules/content-type/index.js","/node_modules/.deno/media-typer@1.1.0/node_modules/media-typer/index.js","/components/processor/metadata/common.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/index.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/core.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/ParserFactory.js","/node_modules/.deno/file-type@21.3.0/node_modules/file-type/index.js","/node_modules/.deno/file-type@21.3.0/node_modules/file-type/core.js","/node_modules/.deno/@tokenizer+inflate@0.4.1/node_modules/@tokenizer/inflate/lib/index.js","/node_modules/.deno/@tokenizer+inflate@0.4.1/node_modules/@tokenizer/inflate/lib/ZipHandler.js","/node_modules/.deno/@tokenizer+inflate@0.4.1/node_modules/@tokenizer/inflate/lib/ZipToken.js","/node_modules/.deno/@tokenizer+inflate@0.4.1/node_modules/@tokenizer/inflate/lib/GzipHandler.js","/node_modules/.deno/file-type@21.3.0/node_modules/file-type/util.js","/node_modules/.deno/file-type@21.3.0/node_modules/file-type/supported.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/common/MetadataCollector.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/common/GenericTagTypes.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/common/CombinedTagMapper.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/id3v1/ID3v1TagMap.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/common/GenericTagMapper.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/id3v2/ID3v24TagMapper.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/common/CaseInsensitiveTagMap.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/asf/AsfTagMapper.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/id3v2/ID3v22TagMapper.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/apev2/APEv2TagMapper.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/mp4/MP4TagMapper.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/ogg/vorbis/VorbisTagMapper.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/riff/RiffInfoTagMap.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/matroska/MatroskaTagMapper.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/aiff/AiffTagMap.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/lrc/LyricsParser.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/mpeg/MpegLoader.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/apev2/Apev2Loader.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/asf/AsfLoader.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/dsdiff/DsdiffLoader.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/aiff/AiffLoader.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/dsf/DsfLoader.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/flac/FlacLoader.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/matroska/MatroskaLoader.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/mp4/Mp4Loader.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/musepack/MusepackLoader.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/ogg/OggLoader.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/wavpack/WavPackLoader.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/wav/WaveLoader.js","/node_modules/.deno/music-metadata@11.12.1/node_modules/music-metadata/lib/lyrics3/Lyrics3.js","/node_modules/.deno/@tokenizer+http@0.9.2/node_modules/@tokenizer/http/lib/index.js","/node_modules/.deno/@tokenizer+http@0.9.2/node_modules/@tokenizer/http/lib/http-client.js","/node_modules/.deno/@tokenizer+http@0.9.2/node_modules/@tokenizer/http/lib/response-info.js","/node_modules/.deno/@tokenizer+range@0.12.0/node_modules/@tokenizer/range/lib/index.js","/node_modules/.deno/@tokenizer+range@0.12.0/node_modules/@tokenizer/range/lib/range-request-factory.js","/node_modules/.deno/@tokenizer+range@0.12.0/node_modules/@tokenizer/range/lib/range-request-tokenizer.js","/node_modules/.deno/strtok3@9.1.1/node_modules/strtok3/lib/index.js","/node_modules/.deno/strtok3@9.1.1/node_modules/strtok3/lib/core.js","/node_modules/.deno/peek-readable@5.4.2/node_modules/peek-readable/lib/index.js","/node_modules/.deno/peek-readable@5.4.2/node_modules/peek-readable/lib/EndOfStreamError.js","/node_modules/.deno/peek-readable@5.4.2/node_modules/peek-readable/lib/StreamReader.js","/node_modules/.deno/peek-readable@5.4.2/node_modules/peek-readable/lib/Deferred.js","/node_modules/.deno/peek-readable@5.4.2/node_modules/peek-readable/lib/AbstractStreamReader.js","/node_modules/.deno/peek-readable@5.4.2/node_modules/peek-readable/lib/WebStreamReader.js","/node_modules/.deno/strtok3@9.1.1/node_modules/strtok3/lib/ReadStreamTokenizer.js","/node_modules/.deno/strtok3@9.1.1/node_modules/strtok3/lib/AbstractTokenizer.js","/node_modules/.deno/strtok3@9.1.1/node_modules/strtok3/lib/BufferTokenizer.js","/node_modules/.deno/strtok3@9.1.1/node_modules/strtok3/lib/FileTokenizer.js","/node_modules/.deno/@tokenizer+range@0.12.0/node_modules/@tokenizer/range/lib/chunked-file-data.js","/node_modules/.deno/@tokenizer+range@0.13.1/node_modules/@tokenizer/range/lib/index.js","/node_modules/.deno/@tokenizer+range@0.13.1/node_modules/@tokenizer/range/lib/range-request-factory.js","/node_modules/.deno/@tokenizer+range@0.13.1/node_modules/@tokenizer/range/lib/range-request-tokenizer.js","/node_modules/.deno/@tokenizer+range@0.13.1/node_modules/@tokenizer/range/lib/chunked-file-data.js"],"sourcesContent":["/*!\n * content-type\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n'use strict'\n\n/**\n * RegExp to match *( \";\" parameter ) in RFC 7231 sec 3.1.1.1\n *\n * parameter = token \"=\" ( token / quoted-string )\n * token = 1*tchar\n * tchar = \"!\" / \"#\" / \"$\" / \"%\" / \"&\" / \"'\" / \"*\"\n * / \"+\" / \"-\" / \".\" / \"^\" / \"_\" / \"`\" / \"|\" / \"~\"\n * / DIGIT / ALPHA\n * ; any VCHAR, except delimiters\n * quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE\n * qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text\n * obs-text = %x80-FF\n * quoted-pair = \"\\\" ( HTAB / SP / VCHAR / obs-text )\n */\nvar PARAM_REGEXP = /; *([!#$%&'*+.^_`|~0-9A-Za-z-]+) *= *(\"(?:[\\u000b\\u0020\\u0021\\u0023-\\u005b\\u005d-\\u007e\\u0080-\\u00ff]|\\\\[\\u000b\\u0020-\\u00ff])*\"|[!#$%&'*+.^_`|~0-9A-Za-z-]+) */g // eslint-disable-line no-control-regex\nvar TEXT_REGEXP = /^[\\u000b\\u0020-\\u007e\\u0080-\\u00ff]+$/ // eslint-disable-line no-control-regex\nvar TOKEN_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/\n\n/**\n * RegExp to match quoted-pair in RFC 7230 sec 3.2.6\n *\n * quoted-pair = \"\\\" ( HTAB / SP / VCHAR / obs-text )\n * obs-text = %x80-FF\n */\nvar QESC_REGEXP = /\\\\([\\u000b\\u0020-\\u00ff])/g // eslint-disable-line no-control-regex\n\n/**\n * RegExp to match chars that must be quoted-pair in RFC 7230 sec 3.2.6\n */\nvar QUOTE_REGEXP = /([\\\\\"])/g\n\n/**\n * RegExp to match type in RFC 7231 sec 3.1.1.1\n *\n * media-type = type \"/\" subtype\n * type = token\n * subtype = token\n */\nvar TYPE_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+\\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/\n\n/**\n * Module exports.\n * @public\n */\n\nexports.format = format\nexports.parse = parse\n\n/**\n * Format object to media type.\n *\n * @param {object} obj\n * @return {string}\n * @public\n */\n\nfunction format (obj) {\n if (!obj || typeof obj !== 'object') {\n throw new TypeError('argument obj is required')\n }\n\n var parameters = obj.parameters\n var type = obj.type\n\n if (!type || !TYPE_REGEXP.test(type)) {\n throw new TypeError('invalid type')\n }\n\n var string = type\n\n // append parameters\n if (parameters && typeof parameters === 'object') {\n var param\n var params = Object.keys(parameters).sort()\n\n for (var i = 0; i < params.length; i++) {\n param = params[i]\n\n if (!TOKEN_REGEXP.test(param)) {\n throw new TypeError('invalid parameter name')\n }\n\n string += '; ' + param + '=' + qstring(parameters[param])\n }\n }\n\n return string\n}\n\n/**\n * Parse media type to object.\n *\n * @param {string|object} string\n * @return {Object}\n * @public\n */\n\nfunction parse (string) {\n if (!string) {\n throw new TypeError('argument string is required')\n }\n\n // support req/res-like objects as argument\n var header = typeof string === 'object'\n ? getcontenttype(string)\n : string\n\n if (typeof header !== 'string') {\n throw new TypeError('argument string is required to be a string')\n }\n\n var index = header.indexOf(';')\n var type = index !== -1\n ? header.slice(0, index).trim()\n : header.trim()\n\n if (!TYPE_REGEXP.test(type)) {\n throw new TypeError('invalid media type')\n }\n\n var obj = new ContentType(type.toLowerCase())\n\n // parse parameters\n if (index !== -1) {\n var key\n var match\n var value\n\n PARAM_REGEXP.lastIndex = index\n\n while ((match = PARAM_REGEXP.exec(header))) {\n if (match.index !== index) {\n throw new TypeError('invalid parameter format')\n }\n\n index += match[0].length\n key = match[1].toLowerCase()\n value = match[2]\n\n if (value.charCodeAt(0) === 0x22 /* \" */) {\n // remove quotes\n value = value.slice(1, -1)\n\n // remove escapes\n if (value.indexOf('\\\\') !== -1) {\n value = value.replace(QESC_REGEXP, '$1')\n }\n }\n\n obj.parameters[key] = value\n }\n\n if (index !== header.length) {\n throw new TypeError('invalid parameter format')\n }\n }\n\n return obj\n}\n\n/**\n * Get content-type from req/res objects.\n *\n * @param {object}\n * @return {Object}\n * @private\n */\n\nfunction getcontenttype (obj) {\n var header\n\n if (typeof obj.getHeader === 'function') {\n // res-like\n header = obj.getHeader('content-type')\n } else if (typeof obj.headers === 'object') {\n // req-like\n header = obj.headers && obj.headers['content-type']\n }\n\n if (typeof header !== 'string') {\n throw new TypeError('content-type header is missing from object')\n }\n\n return header\n}\n\n/**\n * Quote a string if necessary.\n *\n * @param {string} val\n * @return {string}\n * @private\n */\n\nfunction qstring (val) {\n var str = String(val)\n\n // no need to quote tokens\n if (TOKEN_REGEXP.test(str)) {\n return str\n }\n\n if (str.length > 0 && !TEXT_REGEXP.test(str)) {\n throw new TypeError('invalid parameter value')\n }\n\n return '\"' + str.replace(QUOTE_REGEXP, '\\\\$1') + '\"'\n}\n\n/**\n * Class to represent a content type.\n * @private\n */\nfunction ContentType (type) {\n this.parameters = Object.create(null)\n this.type = type\n}\n","/*!\n * media-typer\n * Copyright(c) 2014-2017 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n'use strict'\n\n/**\n * RegExp to match type in RFC 6838\n *\n * type-name = restricted-name\n * subtype-name = restricted-name\n * restricted-name = restricted-name-first *126restricted-name-chars\n * restricted-name-first = ALPHA / DIGIT\n * restricted-name-chars = ALPHA / DIGIT / \"!\" / \"#\" /\n * \"$\" / \"&\" / \"-\" / \"^\" / \"_\"\n * restricted-name-chars =/ \".\" ; Characters before first dot always\n * ; specify a facet name\n * restricted-name-chars =/ \"+\" ; Characters after last plus always\n * ; specify a structured syntax suffix\n * ALPHA = %x41-5A / %x61-7A ; A-Z / a-z\n * DIGIT = %x30-39 ; 0-9\n */\nvar SUBTYPE_NAME_REGEXP = /^[A-Za-z0-9][A-Za-z0-9!#$&^_.-]{0,126}$/\nvar TYPE_NAME_REGEXP = /^[A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126}$/\nvar TYPE_REGEXP = /^ *([A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126})\\/([A-Za-z0-9][A-Za-z0-9!#$&^_.+-]{0,126}) *$/\n\n/**\n * Module exports.\n */\n\nexports.format = format\nexports.parse = parse\nexports.test = test\n\n/**\n * Format object to media type.\n *\n * @param {object} obj\n * @return {string}\n * @public\n */\n\nfunction format (obj) {\n if (!obj || typeof obj !== 'object') {\n throw new TypeError('argument obj is required')\n }\n\n var subtype = obj.subtype\n var suffix = obj.suffix\n var type = obj.type\n\n if (!type || !TYPE_NAME_REGEXP.test(type)) {\n throw new TypeError('invalid type')\n }\n\n if (!subtype || !SUBTYPE_NAME_REGEXP.test(subtype)) {\n throw new TypeError('invalid subtype')\n }\n\n // format as type/subtype\n var string = type + '/' + subtype\n\n // append +suffix\n if (suffix) {\n if (!TYPE_NAME_REGEXP.test(suffix)) {\n throw new TypeError('invalid suffix')\n }\n\n string += '+' + suffix\n }\n\n return string\n}\n\n/**\n * Test media type.\n *\n * @param {string} string\n * @return {object}\n * @public\n */\n\nfunction test (string) {\n if (!string) {\n throw new TypeError('argument string is required')\n }\n\n if (typeof string !== 'string') {\n throw new TypeError('argument string is required to be a string')\n }\n\n return TYPE_REGEXP.test(string.toLowerCase())\n}\n\n/**\n * Parse media type to object.\n *\n * @param {string} string\n * @return {object}\n * @public\n */\n\nfunction parse (string) {\n if (!string) {\n throw new TypeError('argument string is required')\n }\n\n if (typeof string !== 'string') {\n throw new TypeError('argument string is required to be a string')\n }\n\n var match = TYPE_REGEXP.exec(string.toLowerCase())\n\n if (!match) {\n throw new TypeError('invalid media type')\n }\n\n var type = match[1]\n var subtype = match[2]\n var suffix\n\n // suffix after last +\n var index = subtype.lastIndexOf('+')\n if (index !== -1) {\n suffix = subtype.substr(index + 1)\n subtype = subtype.substr(0, index)\n }\n\n return new MediaType(type, subtype, suffix)\n}\n\n/**\n * Class for MediaType object.\n * @public\n */\n\nfunction MediaType (type, subtype, suffix) {\n this.type = type\n this.subtype = subtype\n this.suffix = suffix\n}\n","import { parseBlob, parseFromTokenizer, parseWebStream } from \"music-metadata\";\nimport * as URI from \"fast-uri\";\nimport { HttpClient } from \"@tokenizer/http\";\nimport { tokenizer as rangeTokenizer } from \"@tokenizer/range\";\n\nimport { removeUndefinedValuesFromRecord } from \"@common/utils.js\";\n\n/**\n * @import { TrackStats, TrackTags } from \"@definitions/types.d.ts\";\n * @import { Extraction, Urls } from \"./types.d.ts\";\n */\n\n// 🛠️\n\n/**\n * @param {{ includeArtwork?: boolean; mimeType?: string; stream?: ReadableStream; urls?: Urls; }} _\n * @returns {Promise<Extraction>}\n */\nexport async function musicMetadataTags({\n includeArtwork,\n mimeType,\n stream,\n urls,\n}) {\n const uri = urls ? URI.parse(urls.get) : undefined;\n const pathParts = uri?.path?.split(\"/\");\n const filename = pathParts?.[pathParts.length - 1];\n\n let meta;\n\n if (urls?.get.startsWith(\"blob:\")) {\n const blob = await fetch(urls.get).then((r) => r.blob());\n meta = await parseBlob(blob, { skipCovers: !includeArtwork });\n } else if (urls) {\n const httpClient = new HttpClient(urls.head, {\n resolveUrl: false,\n });\n httpClient.resolvedUrl = urls.get;\n const getHeadInfo = httpClient.getHeadInfo;\n\n // FUCKAROUND: Not sure of the downsides of this\n httpClient.getHeadInfo = async () => {\n const info = await getHeadInfo.call(httpClient);\n return { ...info, acceptPartialRequests: true };\n };\n\n /** @type {any} */\n const tokenizer = await rangeTokenizer(httpClient);\n meta = await parseFromTokenizer(tokenizer, { skipCovers: !includeArtwork });\n } else if (stream) {\n meta = await parseWebStream(stream, { mimeType }, {\n skipCovers: !includeArtwork,\n });\n } else {\n throw new Error(\"Missing args, need either some urls or a stream.\");\n }\n\n /** @type {TrackStats} */\n const statsFull = {\n albumGain: maybeRound(meta.format.albumGain),\n bitrate: maybeRound(meta.format.bitrate),\n bitsPerSample: maybeRound(meta.format.bitsPerSample),\n codec: meta.format.codec,\n container: meta.format.container,\n duration: meta.format.duration != null\n ? Math.round(meta.format.duration * 1000)\n : undefined,\n lossless: meta.format.lossless,\n numberOfChannels: maybeRound(meta.format.numberOfChannels),\n sampleRate: maybeRound(meta.format.sampleRate),\n trackGain: maybeRound(meta.format.trackGain),\n };\n\n /** @type {TrackTags} */\n const tagsFull = {\n album: meta.common.album,\n albumartist: meta.common.albumartist,\n albumartists: Array.isArray(meta.common.albumartist)\n ? meta.common.albumartist\n : (meta.common.albumartist ? [meta.common.albumartist] : undefined),\n albumartistsort: meta.common.albumartistsort,\n albumsort: meta.common.albumsort,\n arranger: meta.common.arranger,\n artist: meta.common.artist,\n artists: meta.common.artists ??\n (meta.common.artist ? [meta.common.artist] : []),\n artistsort: meta.common.artistsort,\n asin: meta.common.asin,\n averageLevel: meta.common.averageLevel,\n barcode: meta.common.barcode,\n bpm: meta.common.bpm,\n catalognumbers: meta.common.catalognumber,\n compilation: meta.common.compilation,\n composers: meta.common.composer,\n composersort: meta.common.composersort,\n conductors: meta.common.conductor,\n date: meta.common.date,\n disc: {\n no: meta.common.disk.no || 1,\n ...(meta.common.disk.of && { of: meta.common.disk.of }),\n },\n djmixers: meta.common.djmixer,\n engineers: meta.common.engineer,\n gapless: meta.common.gapless,\n genres: Array.isArray(meta.common.genre)\n ? meta.common.genre\n : meta.common.genre\n ? [meta.common.genre]\n : undefined,\n isrc: meta.common.isrc,\n labels: meta.common.label,\n lyricists: meta.common.lyricist,\n media: meta.common.media,\n mixers: meta.common.mixer,\n moods: Array.isArray(meta.common.mood)\n ? meta.common.mood\n : meta.common.mood\n ? [meta.common.mood]\n : undefined,\n originaldate: meta.common.originaldate,\n originalyear: meta.common.originalyear,\n peakLevel: meta.common.peakLevel,\n producers: meta.common.producer,\n publishers: meta.common.publisher,\n releasecountry: meta.common.releasecountry,\n releasedate: meta.common.releasedate,\n releasestatus: meta.common.releasestatus,\n releasetypes: meta.common.releasetype,\n remixers: meta.common.remixer,\n technicians: meta.common.technician,\n title: meta.common.title || filename || urls?.head || \"Unknown\",\n titlesort: meta.common.titlesort,\n track: {\n no: meta.common.track.no || 1,\n ...(meta.common.track.of && { of: meta.common.track.of }),\n },\n work: meta.common.work,\n writers: meta.common.writer,\n year: meta.common.year,\n };\n\n const stats = removeUndefinedValuesFromRecord(statsFull);\n const tags = removeUndefinedValuesFromRecord(tagsFull);\n\n return {\n artwork: includeArtwork ? meta.common.picture : undefined,\n stats,\n tags,\n };\n}\n\n/**\n * @param {number | undefined} value\n * @returns {number | undefined}\n */\nfunction maybeRound(value) {\n return typeof value === \"number\" ? Math.round(value) : value;\n}\n","/**\n * Node.js specific entry point.\n */\nimport { fromFile, fromStream } from 'strtok3';\nimport initDebug from 'debug';\nimport { CouldNotDetermineFileTypeError, parseFromTokenizer, UnsupportedFileTypeError } from './core.js';\nimport { ParserFactory } from './ParserFactory.js';\nexport * from './core.js';\nconst debug = initDebug('music-metadata:parser');\n/**\n * Parse audio from Node Stream.Readable\n * @param stream - Stream to read the audio track from\n * @param fileInfo - File information object or MIME-type, e.g.: 'audio/mpeg'\n * @param options - Parsing options\n * @returns Metadata\n */\nexport async function parseStream(stream, fileInfo, options = {}) {\n const tokenizer = await fromStream(stream, { fileInfo: typeof fileInfo === 'string' ? { mimeType: fileInfo } : fileInfo });\n try {\n return await parseFromTokenizer(tokenizer, options);\n }\n finally {\n await tokenizer.close();\n }\n}\n/**\n * Parse audio from Node file\n * @param filePath - Media file to read meta-data from\n * @param options - Parsing options\n * @returns Metadata\n */\nexport async function parseFile(filePath, options = {}) {\n debug(`parseFile: ${filePath}`);\n const fileTokenizer = await fromFile(filePath);\n const parserFactory = new ParserFactory();\n try {\n const parserLoader = parserFactory.findLoaderForExtension(filePath);\n if (!parserLoader)\n debug('Parser could not be determined by file extension');\n try {\n return await parserFactory.parse(fileTokenizer, parserLoader, options);\n }\n catch (error) {\n if (error instanceof CouldNotDetermineFileTypeError || error instanceof UnsupportedFileTypeError) {\n error.message += `: ${filePath}`;\n }\n throw error;\n }\n }\n finally {\n await fileTokenizer.close();\n }\n}\n","/**\n * Primary entry point, Node.js specific entry point is MusepackParser.ts\n */\nimport { fromWebStream, fromBuffer, fromBlob } from 'strtok3';\nimport { ParserFactory } from './ParserFactory.js';\nimport { APEv2Parser } from './apev2/APEv2Parser.js';\nimport { hasID3v1Header } from './id3v1/ID3v1Parser.js';\nimport { getLyricsHeaderLength } from './lyrics3/Lyrics3.js';\nexport { LyricsContentType, TimestampFormat } from './type.js';\nexport { CouldNotDetermineFileTypeError, UnsupportedFileTypeError } from './ParseError.js';\nexport * from './ParseError.js';\n/**\n * Parse Web API File\n * Requires Blob to be able to stream using a ReadableStreamBYOBReader, only available since Node.js ≥ 20\n * @param blob - Blob to parse\n * @param options - Parsing options\n * @returns Metadata\n */\nexport async function parseBlob(blob, options = {}) {\n const tokenizer = fromBlob(blob);\n try {\n return await parseFromTokenizer(tokenizer, options);\n }\n finally {\n await tokenizer.close();\n }\n}\n/**\n * Parse audio from Web Stream.Readable\n * @param webStream - WebStream to read the audio track from\n * @param options - Parsing options\n * @param fileInfo - File information object or MIME-type string\n * @returns Metadata\n */\nexport async function parseWebStream(webStream, fileInfo, options = {}) {\n const tokenizer = fromWebStream(webStream, { fileInfo: typeof fileInfo === 'string' ? { mimeType: fileInfo } : fileInfo });\n try {\n return await parseFromTokenizer(tokenizer, options);\n }\n finally {\n await tokenizer.close();\n }\n}\n/**\n * Parse audio from memory\n * @param uint8Array - Uint8Array holding audio data\n * @param fileInfo - File information object or MIME-type string\n * @param options - Parsing options\n * @returns Metadata\n * Ref: https://github.com/Borewit/strtok3/blob/e6938c81ff685074d5eb3064a11c0b03ca934c1d/src/index.ts#L15\n */\nexport async function parseBuffer(uint8Array, fileInfo, options = {}) {\n const tokenizer = fromBuffer(uint8Array, { fileInfo: typeof fileInfo === 'string' ? { mimeType: fileInfo } : fileInfo });\n return parseFromTokenizer(tokenizer, options);\n}\n/**\n * Parse audio from ITokenizer source\n * @param tokenizer - Audio source implementing the tokenizer interface\n * @param options - Parsing options\n * @returns Metadata\n */\nexport function parseFromTokenizer(tokenizer, options) {\n const parserFactory = new ParserFactory();\n return parserFactory.parse(tokenizer, undefined, options);\n}\n/**\n * Create a dictionary ordered by their tag id (key)\n * @param nativeTags list of tags\n * @returns tags indexed by id\n */\nexport function orderTags(nativeTags) {\n const tags = {};\n for (const { id, value } of nativeTags) {\n (tags[id] || (tags[id] = [])).push(value);\n }\n return tags;\n}\n/**\n * Convert rating to 1-5 star rating\n * @param rating Normalized rating [0..1] (common.rating[n].rating)\n * @returns Number of stars: 1, 2, 3, 4 or 5 stars\n */\nexport function ratingToStars(rating) {\n return rating === undefined ? 0 : 1 + Math.round(rating * 4);\n}\n/**\n * Select most likely cover image.\n * @param pictures Usually metadata.common.picture\n * @return Cover image, if any, otherwise null\n */\nexport function selectCover(pictures) {\n return pictures ? pictures.reduce((acc, cur) => {\n if (cur.name && cur.name.toLowerCase() in ['front', 'cover', 'cover (front)'])\n return cur;\n return acc;\n }) : null;\n}\nexport async function scanAppendingHeaders(tokenizer, options = {}) {\n let apeOffset = tokenizer.fileInfo.size;\n if (await hasID3v1Header(tokenizer)) {\n apeOffset -= 128;\n const lyricsLen = await getLyricsHeaderLength(tokenizer);\n apeOffset -= lyricsLen;\n }\n options.apeHeader = await APEv2Parser.findApeFooterOffset(tokenizer, apeOffset);\n}\n/**\n * Implementation only available when loaded as Node.js\n * This method will throw an Error, always.\n */\nexport async function parseFile(_filePath, _options = {}) {\n throw new Error('This function require a Node engine. To load Web API File objects use parseBlob instead.');\n}\n/**\n * Implementation only available when loaded as Node.js\n * This method will throw an Error, always.\n */\nexport async function parseStream(_stream, _fileInfo, _options = {}) {\n throw new Error('This function require a Node engine.');\n}\n/**\n * Return a list of supported mime-types\n */\nexport function getSupportedMimeTypes() {\n return new ParserFactory().getSupportedMimeTypes();\n}\n","import { fileTypeFromBuffer } from 'file-type';\nimport ContentType from 'content-type';\nimport { parse as mimeTypeParse } from 'media-typer';\nimport initDebug from 'debug';\nimport { MetadataCollector } from './common/MetadataCollector.js';\nimport { TrackType } from './type.js';\nimport { mpegParserLoader } from './mpeg/MpegLoader.js';\nimport { CouldNotDetermineFileTypeError, UnsupportedFileTypeError } from './ParseError.js';\nimport { apeParserLoader } from './apev2/Apev2Loader.js';\nimport { asfParserLoader } from './asf/AsfLoader.js';\nimport { dsdiffParserLoader } from './dsdiff/DsdiffLoader.js';\nimport { aiffParserLoader } from './aiff/AiffLoader.js';\nimport { dsfParserLoader } from './dsf/DsfLoader.js';\nimport { flacParserLoader } from './flac/FlacLoader.js';\nimport { matroskaParserLoader } from './matroska/MatroskaLoader.js';\nimport { mp4ParserLoader } from './mp4/Mp4Loader.js';\nimport { musepackParserLoader } from './musepack/MusepackLoader.js';\nimport { oggParserLoader } from './ogg/OggLoader.js';\nimport { wavpackParserLoader } from './wavpack/WavPackLoader.js';\nimport { riffParserLoader } from './wav/WaveLoader.js';\nimport { scanAppendingHeaders } from './core.js';\nconst debug = initDebug('music-metadata:parser:factory');\nexport function parseHttpContentType(contentType) {\n const type = ContentType.parse(contentType);\n const mime = mimeTypeParse(type.type);\n return {\n type: mime.type,\n subtype: mime.subtype,\n suffix: mime.suffix,\n parameters: type.parameters\n };\n}\nexport class ParserFactory {\n constructor() {\n this.parsers = [];\n [\n flacParserLoader,\n mpegParserLoader,\n apeParserLoader,\n mp4ParserLoader,\n matroskaParserLoader,\n riffParserLoader,\n oggParserLoader,\n asfParserLoader,\n aiffParserLoader,\n wavpackParserLoader,\n musepackParserLoader,\n dsfParserLoader,\n dsdiffParserLoader\n ].forEach(parser => { this.registerParser(parser); });\n }\n registerParser(parser) {\n this.parsers.push(parser);\n }\n async parse(tokenizer, parserLoader, opts) {\n if (tokenizer.supportsRandomAccess()) {\n debug('tokenizer supports random-access, scanning for appending headers');\n await scanAppendingHeaders(tokenizer, opts);\n }\n else {\n debug('tokenizer does not support random-access, cannot scan for appending headers');\n }\n if (!parserLoader) {\n const buf = new Uint8Array(4100);\n if (tokenizer.fileInfo.mimeType) {\n parserLoader = this.findLoaderForContentType(tokenizer.fileInfo.mimeType);\n }\n if (!parserLoader && tokenizer.fileInfo.path) {\n parserLoader = this.findLoaderForExtension(tokenizer.fileInfo.path);\n }\n if (!parserLoader) {\n // Parser could not be determined on MIME-type or extension\n debug('Guess parser on content...');\n await tokenizer.peekBuffer(buf, { mayBeLess: true });\n const guessedType = await fileTypeFromBuffer(buf, { mpegOffsetTolerance: 10 });\n if (!guessedType || !guessedType.mime) {\n throw new CouldNotDetermineFileTypeError('Failed to determine audio format');\n }\n debug(`Guessed file type is mime=${guessedType.mime}, extension=${guessedType.ext}`);\n parserLoader = this.findLoaderForContentType(guessedType.mime);\n if (!parserLoader) {\n throw new UnsupportedFileTypeError(`Guessed MIME-type not supported: ${guessedType.mime}`);\n }\n }\n }\n // Parser found, execute parser\n debug(`Loading ${parserLoader.parserType} parser...`);\n const metadata = new MetadataCollector(opts);\n const ParserImpl = await parserLoader.load();\n const parser = new ParserImpl(metadata, tokenizer, opts ?? {});\n debug(`Parser ${parserLoader.parserType} loaded`);\n await parser.parse();\n if (metadata.format.trackInfo) {\n if (metadata.format.hasAudio === undefined) {\n metadata.setFormat('hasAudio', !!metadata.format.trackInfo.find(track => track.type === TrackType.audio));\n }\n if (metadata.format.hasVideo === undefined) {\n metadata.setFormat('hasVideo', !!metadata.format.trackInfo.find(track => track.type === TrackType.video));\n }\n }\n return metadata.toCommonMetadata();\n }\n /**\n * @param filePath - Path, filename or extension to audio file\n * @return Parser submodule name\n */\n findLoaderForExtension(filePath) {\n if (!filePath)\n return;\n const extension = getExtension(filePath).toLocaleLowerCase() || filePath;\n return this.parsers.find(parser => parser.extensions.indexOf(extension) !== -1);\n }\n findLoaderForContentType(httpContentType) {\n let mime;\n if (!httpContentType)\n return;\n try {\n mime = parseHttpContentType(httpContentType);\n }\n catch (_err) {\n debug(`Invalid HTTP Content-Type header value: ${httpContentType}`);\n return;\n }\n const subType = mime.subtype.indexOf('x-') === 0 ? mime.subtype.substring(2) : mime.subtype;\n return this.parsers.find(parser => parser.mimeTypes.find(loader => loader.indexOf(`${mime.type}/${subType}`) !== -1));\n }\n getSupportedMimeTypes() {\n const mimeTypeSet = new Set();\n this.parsers.forEach(loader => {\n loader.mimeTypes.forEach(mimeType => {\n mimeTypeSet.add(mimeType);\n mimeTypeSet.add(mimeType.replace('/', '/x-'));\n });\n });\n return Array.from(mimeTypeSet);\n }\n}\nfunction getExtension(fname) {\n const i = fname.lastIndexOf('.');\n return i === -1 ? '' : fname.substring(i);\n}\n","/**\nNode.js specific entry point.\n*/\n\nimport {ReadableStream as WebReadableStream} from 'node:stream/web';\nimport {pipeline, PassThrough, Readable} from 'node:stream';\nimport * as strtok3 from 'strtok3';\nimport {FileTypeParser as DefaultFileTypeParser, reasonableDetectionSizeInBytes} from './core.js';\n\nexport class FileTypeParser extends DefaultFileTypeParser {\n\tasync fromStream(stream) {\n\t\tconst tokenizer = await (stream instanceof WebReadableStream ? strtok3.fromWebStream(stream, this.tokenizerOptions) : strtok3.fromStream(stream, this.tokenizerOptions));\n\t\ttry {\n\t\t\treturn await super.fromTokenizer(tokenizer);\n\t\t} finally {\n\t\t\tawait tokenizer.close();\n\t\t}\n\t}\n\n\tasync fromFile(path) {\n\t\tconst tokenizer = await strtok3.fromFile(path);\n\t\ttry {\n\t\t\treturn await super.fromTokenizer(tokenizer);\n\t\t} finally {\n\t\t\tawait tokenizer.close();\n\t\t}\n\t}\n\n\tasync toDetectionStream(readableStream, options = {}) {\n\t\tif (!(readableStream instanceof Readable)) {\n\t\t\treturn super.toDetectionStream(readableStream, options);\n\t\t}\n\n\t\tconst {sampleSize = reasonableDetectionSizeInBytes} = options;\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\treadableStream.on('error', reject);\n\n\t\t\treadableStream.once('readable', () => {\n\t\t\t\t(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Set up output stream\n\t\t\t\t\t\tconst pass = new PassThrough();\n\t\t\t\t\t\tconst outputStream = pipeline ? pipeline(readableStream, pass, () => {}) : readableStream.pipe(pass);\n\n\t\t\t\t\t\t// Read the input stream and detect the filetype\n\t\t\t\t\t\tconst chunk = readableStream.read(sampleSize) ?? readableStream.read() ?? new Uint8Array(0);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tpass.fileType = await this.fromBuffer(chunk);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tif (error instanceof strtok3.EndOfStreamError) {\n\t\t\t\t\t\t\t\tpass.fileType = undefined;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tresolve(outputStream);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t});\n\t\t});\n\t}\n}\n\nexport async function fileTypeFromFile(path, options) {\n\treturn (new FileTypeParser(options)).fromFile(path, options);\n}\n\nexport async function fileTypeFromStream(stream, options) {\n\treturn (new FileTypeParser(options)).fromStream(stream);\n}\n\nexport async function fileTypeStream(readableStream, options = {}) {\n\treturn new FileTypeParser(options).toDetectionStream(readableStream, options);\n}\n\nexport {\n\tfileTypeFromTokenizer,\n\tfileTypeFromBuffer,\n\tfileTypeFromBlob,\n\tsupportedMimeTypes,\n\tsupportedExtensions,\n} from './core.js';\n","/**\nPrimary entry point, Node.js specific entry point is index.js\n*/\n\nimport * as Token from 'token-types';\nimport * as strtok3 from 'strtok3/core';\nimport {ZipHandler, GzipHandler} from '@tokenizer/inflate';\nimport {getUintBE} from 'uint8array-extras';\nimport {\n\tstringToBytes,\n\ttarHeaderChecksumMatches,\n\tuint32SyncSafeToken,\n} from './util.js';\nimport {extensions, mimeTypes} from './supported.js';\n\nexport const reasonableDetectionSizeInBytes = 4100; // A fair amount of file-types are detectable within this range.\n\nexport async function fileTypeFromStream(stream, options) {\n\treturn new FileTypeParser(options).fromStream(stream);\n}\n\nexport async function fileTypeFromBuffer(input, options) {\n\treturn new FileTypeParser(options).fromBuffer(input);\n}\n\nexport async function fileTypeFromBlob(blob, options) {\n\treturn new FileTypeParser(options).fromBlob(blob);\n}\n\nfunction getFileTypeFromMimeType(mimeType) {\n\tmimeType = mimeType.toLowerCase();\n\tswitch (mimeType) {\n\t\tcase 'application/epub+zip':\n\t\t\treturn {\n\t\t\t\text: 'epub',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.text':\n\t\t\treturn {\n\t\t\t\text: 'odt',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.text-template':\n\t\t\treturn {\n\t\t\t\text: 'ott',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.spreadsheet':\n\t\t\treturn {\n\t\t\t\text: 'ods',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.spreadsheet-template':\n\t\t\treturn {\n\t\t\t\text: 'ots',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.presentation':\n\t\t\treturn {\n\t\t\t\text: 'odp',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.presentation-template':\n\t\t\treturn {\n\t\t\t\text: 'otp',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.graphics':\n\t\t\treturn {\n\t\t\t\text: 'odg',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.oasis.opendocument.graphics-template':\n\t\t\treturn {\n\t\t\t\text: 'otg',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.presentationml.slideshow':\n\t\t\treturn {\n\t\t\t\text: 'ppsx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':\n\t\t\treturn {\n\t\t\t\text: 'xlsx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.ms-excel.sheet.macroenabled':\n\t\t\treturn {\n\t\t\t\text: 'xlsm',\n\t\t\t\tmime: 'application/vnd.ms-excel.sheet.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.spreadsheetml.template':\n\t\t\treturn {\n\t\t\t\text: 'xltx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.ms-excel.template.macroenabled':\n\t\t\treturn {\n\t\t\t\text: 'xltm',\n\t\t\t\tmime: 'application/vnd.ms-excel.template.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.ms-powerpoint.slideshow.macroenabled':\n\t\t\treturn {\n\t\t\t\text: 'ppsm',\n\t\t\t\tmime: 'application/vnd.ms-powerpoint.slideshow.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':\n\t\t\treturn {\n\t\t\t\text: 'docx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.ms-word.document.macroenabled':\n\t\t\treturn {\n\t\t\t\text: 'docm',\n\t\t\t\tmime: 'application/vnd.ms-word.document.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.wordprocessingml.template':\n\t\t\treturn {\n\t\t\t\text: 'dotx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.ms-word.template.macroenabledtemplate':\n\t\t\treturn {\n\t\t\t\text: 'dotm',\n\t\t\t\tmime: 'application/vnd.ms-word.template.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.presentationml.template':\n\t\t\treturn {\n\t\t\t\text: 'potx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.ms-powerpoint.template.macroenabled':\n\t\t\treturn {\n\t\t\t\text: 'potm',\n\t\t\t\tmime: 'application/vnd.ms-powerpoint.template.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.openxmlformats-officedocument.presentationml.presentation':\n\t\t\treturn {\n\t\t\t\text: 'pptx',\n\t\t\t\tmime: mimeType,\n\t\t\t};\n\t\tcase 'application/vnd.ms-powerpoint.presentation.macroenabled':\n\t\t\treturn {\n\t\t\t\text: 'pptm',\n\t\t\t\tmime: 'application/vnd.ms-powerpoint.presentation.macroenabled.12',\n\t\t\t};\n\t\tcase 'application/vnd.ms-visio.drawing':\n\t\t\treturn {\n\t\t\t\text: 'vsdx',\n\t\t\t\tmime: 'application/vnd.visio',\n\t\t\t};\n\t\tcase 'application/vnd.ms-package.3dmanufacturing-3dmodel+xml':\n\t\t\treturn {\n\t\t\t\text: '3mf',\n\t\t\t\tmime: 'model/3mf',\n\t\t\t};\n\t\tdefault:\n\t}\n}\n\nfunction _check(buffer, headers, options) {\n\toptions = {\n\t\toffset: 0,\n\t\t...options,\n\t};\n\n\tfor (const [index, header] of headers.entries()) {\n\t\t// If a bitmask is set\n\t\tif (options.mask) {\n\t\t\t// If header doesn't equal `buf` with bits masked off\n\t\t\tif (header !== (options.mask[index] & buffer[index + options.offset])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (header !== buffer[index + options.offset]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nexport async function fileTypeFromTokenizer(tokenizer, options) {\n\treturn new FileTypeParser(options).fromTokenizer(tokenizer);\n}\n\nexport async function fileTypeStream(webStream, options) {\n\treturn new FileTypeParser(options).toDetectionStream(webStream, options);\n}\n\nexport class FileTypeParser {\n\tconstructor(options) {\n\t\tthis.options = {\n\t\t\tmpegOffsetTolerance: 0,\n\t\t\t...options,\n\t\t};\n\n\t\tthis.detectors = [...(options?.customDetectors ?? []),\n\t\t\t{id: 'core', detect: this.detectConfident},\n\t\t\t{id: 'core.imprecise', detect: this.detectImprecise}];\n\t\tthis.tokenizerOptions = {\n\t\t\tabortSignal: options?.signal,\n\t\t};\n\t}\n\n\tasync fromTokenizer(tokenizer) {\n\t\tconst initialPosition = tokenizer.position;\n\n\t\t// Iterate through all file-type detectors\n\t\tfor (const detector of this.detectors) {\n\t\t\tconst fileType = await detector.detect(tokenizer);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\n\t\t\tif (initialPosition !== tokenizer.position) {\n\t\t\t\treturn undefined; // Cannot proceed scanning of the tokenizer is at an arbitrary position\n\t\t\t}\n\t\t}\n\t}\n\n\tasync fromBuffer(input) {\n\t\tif (!(input instanceof Uint8Array || input instanceof ArrayBuffer)) {\n\t\t\tthrow new TypeError(`Expected the \\`input\\` argument to be of type \\`Uint8Array\\` or \\`ArrayBuffer\\`, got \\`${typeof input}\\``);\n\t\t}\n\n\t\tconst buffer = input instanceof Uint8Array ? input : new Uint8Array(input);\n\n\t\tif (!(buffer?.length > 1)) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.fromTokenizer(strtok3.fromBuffer(buffer, this.tokenizerOptions));\n\t}\n\n\tasync fromBlob(blob) {\n\t\tconst tokenizer = strtok3.fromBlob(blob, this.tokenizerOptions);\n\t\ttry {\n\t\t\treturn await this.fromTokenizer(tokenizer);\n\t\t} finally {\n\t\t\tawait tokenizer.close();\n\t\t}\n\t}\n\n\tasync fromStream(stream) {\n\t\tconst tokenizer = strtok3.fromWebStream(stream, this.tokenizerOptions);\n\t\ttry {\n\t\t\treturn await this.fromTokenizer(tokenizer);\n\t\t} finally {\n\t\t\tawait tokenizer.close();\n\t\t}\n\t}\n\n\tasync toDetectionStream(stream, options) {\n\t\tconst {sampleSize = reasonableDetectionSizeInBytes} = options;\n\t\tlet detectedFileType;\n\t\tlet firstChunk;\n\n\t\tconst reader = stream.getReader({mode: 'byob'});\n\t\ttry {\n\t\t\t// Read the first chunk from the stream\n\t\t\tconst {value: chunk, done} = await reader.read(new Uint8Array(sampleSize));\n\t\t\tfirstChunk = chunk;\n\t\t\tif (!done && chunk) {\n\t\t\t\ttry {\n\t\t\t\t\t// Attempt to detect the file type from the chunk\n\t\t\t\t\tdetectedFileType = await this.fromBuffer(chunk.subarray(0, sampleSize));\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!(error instanceof strtok3.EndOfStreamError)) {\n\t\t\t\t\t\tthrow error; // Re-throw non-EndOfStreamError\n\t\t\t\t\t}\n\n\t\t\t\t\tdetectedFileType = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfirstChunk = chunk;\n\t\t} finally {\n\t\t\treader.releaseLock(); // Ensure the reader is released\n\t\t}\n\n\t\t// Create a new ReadableStream to manage locking issues\n\t\tconst transformStream = new TransformStream({\n\t\t\tasync start(controller) {\n\t\t\t\tcontroller.enqueue(firstChunk); // Enqueue the initial chunk\n\t\t\t},\n\t\t\ttransform(chunk, controller) {\n\t\t\t\t// Pass through the chunks without modification\n\t\t\t\tcontroller.enqueue(chunk);\n\t\t\t},\n\t\t});\n\n\t\tconst newStream = stream.pipeThrough(transformStream);\n\t\tnewStream.fileType = detectedFileType;\n\n\t\treturn newStream;\n\t}\n\n\tcheck(header, options) {\n\t\treturn _check(this.buffer, header, options);\n\t}\n\n\tcheckString(header, options) {\n\t\treturn this.check(stringToBytes(header, options?.encoding), options);\n\t}\n\n\t// Detections with a high degree of certainty in identifying the correct file type\n\tdetectConfident = async tokenizer => {\n\t\tthis.buffer = new Uint8Array(reasonableDetectionSizeInBytes);\n\n\t\t// Keep reading until EOF if the file size is unknown.\n\t\tif (tokenizer.fileInfo.size === undefined) {\n\t\t\ttokenizer.fileInfo.size = Number.MAX_SAFE_INTEGER;\n\t\t}\n\n\t\tthis.tokenizer = tokenizer;\n\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: 32, mayBeLess: true});\n\n\t\t// -- 2-byte signatures --\n\n\t\tif (this.check([0x42, 0x4D])) {\n\t\t\treturn {\n\t\t\t\text: 'bmp',\n\t\t\t\tmime: 'image/bmp',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x0B, 0x77])) {\n\t\t\treturn {\n\t\t\t\text: 'ac3',\n\t\t\t\tmime: 'audio/vnd.dolby.dd-raw',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x78, 0x01])) {\n\t\t\treturn {\n\t\t\t\text: 'dmg',\n\t\t\t\tmime: 'application/x-apple-diskimage',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4D, 0x5A])) {\n\t\t\treturn {\n\t\t\t\text: 'exe',\n\t\t\t\tmime: 'application/x-msdownload',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x25, 0x21])) {\n\t\t\tawait tokenizer.peekBuffer(this.buffer, {length: 24, mayBeLess: true});\n\n\t\t\tif (\n\t\t\t\tthis.checkString('PS-Adobe-', {offset: 2})\n\t\t\t\t&& this.checkString(' EPSF-', {offset: 14})\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'eps',\n\t\t\t\t\tmime: 'application/eps',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'ps',\n\t\t\t\tmime: 'application/postscript',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x1F, 0xA0])\n\t\t\t|| this.check([0x1F, 0x9D])\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'Z',\n\t\t\t\tmime: 'application/x-compress',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xC7, 0x71])) {\n\t\t\treturn {\n\t\t\t\text: 'cpio',\n\t\t\t\tmime: 'application/x-cpio',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x60, 0xEA])) {\n\t\t\treturn {\n\t\t\t\text: 'arj',\n\t\t\t\tmime: 'application/x-arj',\n\t\t\t};\n\t\t}\n\n\t\t// -- 3-byte signatures --\n\n\t\tif (this.check([0xEF, 0xBB, 0xBF])) { // UTF-8-BOM\n\t\t\t// Strip off UTF-8-BOM\n\t\t\tthis.tokenizer.ignore(3);\n\t\t\treturn this.detectConfident(tokenizer);\n\t\t}\n\n\t\tif (this.check([0x47, 0x49, 0x46])) {\n\t\t\treturn {\n\t\t\t\text: 'gif',\n\t\t\t\tmime: 'image/gif',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x49, 0x49, 0xBC])) {\n\t\t\treturn {\n\t\t\t\text: 'jxr',\n\t\t\t\tmime: 'image/vnd.ms-photo',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x1F, 0x8B, 0x8])) {\n\t\t\tconst gzipHandler = new GzipHandler(tokenizer);\n\n\t\t\tconst stream = gzipHandler.inflate();\n\t\t\tlet shouldCancelStream = true;\n\t\t\ttry {\n\t\t\t\tlet compressedFileType;\n\t\t\t\ttry {\n\t\t\t\t\tcompressedFileType = await this.fromStream(stream);\n\t\t\t\t} catch {\n\t\t\t\t\tshouldCancelStream = false;\n\t\t\t\t}\n\n\t\t\t\tif (compressedFileType && compressedFileType.ext === 'tar') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'tar.gz',\n\t\t\t\t\t\tmime: 'application/gzip',\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (shouldCancelStream) {\n\t\t\t\t\tawait stream.cancel();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'gz',\n\t\t\t\tmime: 'application/gzip',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x42, 0x5A, 0x68])) {\n\t\t\treturn {\n\t\t\t\text: 'bz2',\n\t\t\t\tmime: 'application/x-bzip2',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('ID3')) {\n\t\t\tawait tokenizer.ignore(6); // Skip ID3 header until the header size\n\t\t\tconst id3HeaderLength = await tokenizer.readToken(uint32SyncSafeToken);\n\t\t\tif (tokenizer.position + id3HeaderLength > tokenizer.fileInfo.size) {\n\t\t\t\t// Guess file type based on ID3 header for backward compatibility\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp3',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tawait tokenizer.ignore(id3HeaderLength);\n\t\t\treturn this.fromTokenizer(tokenizer); // Skip ID3 header, recursion\n\t\t}\n\n\t\t// Musepack, SV7\n\t\tif (this.checkString('MP+')) {\n\t\t\treturn {\n\t\t\t\text: 'mpc',\n\t\t\t\tmime: 'audio/x-musepack',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\t(this.buffer[0] === 0x43 || this.buffer[0] === 0x46)\n\t\t\t&& this.check([0x57, 0x53], {offset: 1})\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'swf',\n\t\t\t\tmime: 'application/x-shockwave-flash',\n\t\t\t};\n\t\t}\n\n\t\t// -- 4-byte signatures --\n\n\t\t// Requires a sample size of 4 bytes\n\t\tif (this.check([0xFF, 0xD8, 0xFF])) {\n\t\t\tif (this.check([0xF7], {offset: 3})) { // JPG7/SOF55, indicating a ISO/IEC 14495 / JPEG-LS file\n\t\t\t\treturn {\n\t\t\t\t\text: 'jls',\n\t\t\t\t\tmime: 'image/jls',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'jpg',\n\t\t\t\tmime: 'image/jpeg',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4F, 0x62, 0x6A, 0x01])) {\n\t\t\treturn {\n\t\t\t\text: 'avro',\n\t\t\t\tmime: 'application/avro',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('FLIF')) {\n\t\t\treturn {\n\t\t\t\text: 'flif',\n\t\t\t\tmime: 'image/flif',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('8BPS')) {\n\t\t\treturn {\n\t\t\t\text: 'psd',\n\t\t\t\tmime: 'image/vnd.adobe.photoshop',\n\t\t\t};\n\t\t}\n\n\t\t// Musepack, SV8\n\t\tif (this.checkString('MPCK')) {\n\t\t\treturn {\n\t\t\t\text: 'mpc',\n\t\t\t\tmime: 'audio/x-musepack',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('FORM')) {\n\t\t\treturn {\n\t\t\t\text: 'aif',\n\t\t\t\tmime: 'audio/aiff',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('icns', {offset: 0})) {\n\t\t\treturn {\n\t\t\t\text: 'icns',\n\t\t\t\tmime: 'image/icns',\n\t\t\t};\n\t\t}\n\n\t\t// Zip-based file formats\n\t\t// Need to be before the `zip` check\n\t\tif (this.check([0x50, 0x4B, 0x3, 0x4])) { // Local file header signature\n\t\t\tlet fileType;\n\t\t\tawait new ZipHandler(tokenizer).unzip(zipHeader => {\n\t\t\t\tswitch (zipHeader.filename) {\n\t\t\t\t\tcase 'META-INF/mozilla.rsa':\n\t\t\t\t\t\tfileType = {\n\t\t\t\t\t\t\text: 'xpi',\n\t\t\t\t\t\t\tmime: 'application/x-xpinstall',\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstop: true,\n\t\t\t\t\t\t};\n\t\t\t\t\tcase 'META-INF/MANIFEST.MF':\n\t\t\t\t\t\tfileType = {\n\t\t\t\t\t\t\text: 'jar',\n\t\t\t\t\t\t\tmime: 'application/java-archive',\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstop: true,\n\t\t\t\t\t\t};\n\t\t\t\t\tcase 'mimetype':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tasync handler(fileData) {\n\t\t\t\t\t\t\t\t// Use TextDecoder to decode the UTF-8 encoded data\n\t\t\t\t\t\t\t\tconst mimeType = new TextDecoder('utf-8').decode(fileData).trim();\n\t\t\t\t\t\t\t\tfileType = getFileTypeFromMimeType(mimeType);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tstop: true,\n\t\t\t\t\t\t};\n\n\t\t\t\t\tcase '[Content_Types].xml':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tasync handler(fileData) {\n\t\t\t\t\t\t\t\t// Use TextDecoder to decode the UTF-8 encoded data\n\t\t\t\t\t\t\t\tlet xmlContent = new TextDecoder('utf-8').decode(fileData);\n\t\t\t\t\t\t\t\tconst endPos = xmlContent.indexOf('.main+xml\"');\n\t\t\t\t\t\t\t\tif (endPos === -1) {\n\t\t\t\t\t\t\t\t\tconst mimeType = 'application/vnd.ms-package.3dmanufacturing-3dmodel+xml';\n\t\t\t\t\t\t\t\t\tif (xmlContent.includes(`ContentType=\"${mimeType}\"`)) {\n\t\t\t\t\t\t\t\t\t\tfileType = getFileTypeFromMimeType(mimeType);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\txmlContent = xmlContent.slice(0, Math.max(0, endPos));\n\t\t\t\t\t\t\t\t\tconst firstPos = xmlContent.lastIndexOf('\"');\n\t\t\t\t\t\t\t\t\tconst mimeType = xmlContent.slice(Math.max(0, firstPos + 1));\n\t\t\t\t\t\t\t\t\tfileType = getFileTypeFromMimeType(mimeType);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tstop: true,\n\t\t\t\t\t\t};\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif (/classes\\d*\\.dex/.test(zipHeader.filename)) {\n\t\t\t\t\t\t\tfileType = {\n\t\t\t\t\t\t\t\text: 'apk',\n\t\t\t\t\t\t\t\tmime: 'application/vnd.android.package-archive',\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treturn {stop: true};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {};\n\t\t\t\t}\n\t\t\t}).catch(error => {\n\t\t\t\tif (!(error instanceof strtok3.EndOfStreamError)) {\n\t\t\t\t\tthrow error; // Re-throw non-EndOfStreamError\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn fileType ?? {\n\t\t\t\text: 'zip',\n\t\t\t\tmime: 'application/zip',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('OggS')) {\n\t\t\t// This is an OGG container\n\t\t\tawait tokenizer.ignore(28);\n\t\t\tconst type = new Uint8Array(8);\n\t\t\tawait tokenizer.readBuffer(type);\n\n\t\t\t// Needs to be before `ogg` check\n\t\t\tif (_check(type, [0x4F, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'opus',\n\t\t\t\t\tmime: 'audio/ogg; codecs=opus',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If ' theora' in header.\n\t\t\tif (_check(type, [0x80, 0x74, 0x68, 0x65, 0x6F, 0x72, 0x61])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ogv',\n\t\t\t\t\tmime: 'video/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If '\\x01video' in header.\n\t\t\tif (_check(type, [0x01, 0x76, 0x69, 0x64, 0x65, 0x6F, 0x00])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ogm',\n\t\t\t\t\tmime: 'video/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If ' FLAC' in header https://xiph.org/flac/faq.html\n\t\t\tif (_check(type, [0x7F, 0x46, 0x4C, 0x41, 0x43])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'oga',\n\t\t\t\t\tmime: 'audio/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// 'Speex ' in header https://en.wikipedia.org/wiki/Speex\n\t\t\tif (_check(type, [0x53, 0x70, 0x65, 0x65, 0x78, 0x20, 0x20])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'spx',\n\t\t\t\t\tmime: 'audio/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If '\\x01vorbis' in header\n\t\t\tif (_check(type, [0x01, 0x76, 0x6F, 0x72, 0x62, 0x69, 0x73])) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ogg',\n\t\t\t\t\tmime: 'audio/ogg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Default OGG container https://www.iana.org/assignments/media-types/application/ogg\n\t\t\treturn {\n\t\t\t\text: 'ogx',\n\t\t\t\tmime: 'application/ogg',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x50, 0x4B])\n\t\t\t&& (this.buffer[2] === 0x3 || this.buffer[2] === 0x5 || this.buffer[2] === 0x7)\n\t\t\t&& (this.buffer[3] === 0x4 || this.buffer[3] === 0x6 || this.buffer[3] === 0x8)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'zip',\n\t\t\t\tmime: 'application/zip',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('MThd')) {\n\t\t\treturn {\n\t\t\t\text: 'mid',\n\t\t\t\tmime: 'audio/midi',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('wOFF')\n\t\t\t&& (\n\t\t\t\tthis.check([0x00, 0x01, 0x00, 0x00], {offset: 4})\n\t\t\t\t|| this.checkString('OTTO', {offset: 4})\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'woff',\n\t\t\t\tmime: 'font/woff',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('wOF2')\n\t\t\t&& (\n\t\t\t\tthis.check([0x00, 0x01, 0x00, 0x00], {offset: 4})\n\t\t\t\t|| this.checkString('OTTO', {offset: 4})\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'woff2',\n\t\t\t\tmime: 'font/woff2',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xD4, 0xC3, 0xB2, 0xA1]) || this.check([0xA1, 0xB2, 0xC3, 0xD4])) {\n\t\t\treturn {\n\t\t\t\text: 'pcap',\n\t\t\t\tmime: 'application/vnd.tcpdump.pcap',\n\t\t\t};\n\t\t}\n\n\t\t// Sony DSD Stream File (DSF)\n\t\tif (this.checkString('DSD ')) {\n\t\t\treturn {\n\t\t\t\text: 'dsf',\n\t\t\t\tmime: 'audio/x-dsf', // Non-standard\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('LZIP')) {\n\t\t\treturn {\n\t\t\t\text: 'lz',\n\t\t\t\tmime: 'application/x-lzip',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('fLaC')) {\n\t\t\treturn {\n\t\t\t\text: 'flac',\n\t\t\t\tmime: 'audio/flac',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x42, 0x50, 0x47, 0xFB])) {\n\t\t\treturn {\n\t\t\t\text: 'bpg',\n\t\t\t\tmime: 'image/bpg',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('wvpk')) {\n\t\t\treturn {\n\t\t\t\text: 'wv',\n\t\t\t\tmime: 'audio/wavpack',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('%PDF')) {\n\t\t\t// Assume this is just a normal PDF\n\t\t\treturn {\n\t\t\t\text: 'pdf',\n\t\t\t\tmime: 'application/pdf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x61, 0x73, 0x6D])) {\n\t\t\treturn {\n\t\t\t\text: 'wasm',\n\t\t\t\tmime: 'application/wasm',\n\t\t\t};\n\t\t}\n\n\t\t// TIFF, little-endian type\n\t\tif (this.check([0x49, 0x49])) {\n\t\t\tconst fileType = await this.readTiffHeader(false);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\t\t}\n\n\t\t// TIFF, big-endian type\n\t\tif (this.check([0x4D, 0x4D])) {\n\t\t\tconst fileType = await this.readTiffHeader(true);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('MAC ')) {\n\t\t\treturn {\n\t\t\t\text: 'ape',\n\t\t\t\tmime: 'audio/ape',\n\t\t\t};\n\t\t}\n\n\t\t// https://github.com/file/file/blob/master/magic/Magdir/matroska\n\t\tif (this.check([0x1A, 0x45, 0xDF, 0xA3])) { // Root element: EBML\n\t\t\tasync function readField() {\n\t\t\t\tconst msb = await tokenizer.peekNumber(Token.UINT8);\n\t\t\t\tlet mask = 0x80;\n\t\t\t\tlet ic = 0; // 0 = A, 1 = B, 2 = C, 3 = D\n\n\t\t\t\twhile ((msb & mask) === 0 && mask !== 0) {\n\t\t\t\t\t++ic;\n\t\t\t\t\tmask >>= 1;\n\t\t\t\t}\n\n\t\t\t\tconst id = new Uint8Array(ic + 1);\n\t\t\t\tawait tokenizer.readBuffer(id);\n\t\t\t\treturn id;\n\t\t\t}\n\n\t\t\tasync function readElement() {\n\t\t\t\tconst idField = await readField();\n\t\t\t\tconst lengthField = await readField();\n\n\t\t\t\tlengthField[0] ^= 0x80 >> (lengthField.length - 1);\n\t\t\t\tconst nrLength = Math.min(6, lengthField.length); // JavaScript can max read 6 bytes integer\n\n\t\t\t\tconst idView = new DataView(idField.buffer);\n\t\t\t\tconst lengthView = new DataView(lengthField.buffer, lengthField.length - nrLength, nrLength);\n\n\t\t\t\treturn {\n\t\t\t\t\tid: getUintBE(idView),\n\t\t\t\t\tlen: getUintBE(lengthView),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tasync function readChildren(children) {\n\t\t\t\twhile (children > 0) {\n\t\t\t\t\tconst element = await readElement();\n\t\t\t\t\tif (element.id === 0x42_82) {\n\t\t\t\t\t\tconst rawValue = await tokenizer.readToken(new Token.StringType(element.len));\n\t\t\t\t\t\treturn rawValue.replaceAll(/\\00.*$/g, ''); // Return DocType\n\t\t\t\t\t}\n\n\t\t\t\t\tawait tokenizer.ignore(element.len); // ignore payload\n\t\t\t\t\t--children;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst re = await readElement();\n\t\t\tconst documentType = await readChildren(re.len);\n\n\t\t\tswitch (documentType) {\n\t\t\t\tcase 'webm':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'webm',\n\t\t\t\t\t\tmime: 'video/webm',\n\t\t\t\t\t};\n\n\t\t\t\tcase 'matroska':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'mkv',\n\t\t\t\t\t\tmime: 'video/matroska',\n\t\t\t\t\t};\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('SQLi')) {\n\t\t\treturn {\n\t\t\t\text: 'sqlite',\n\t\t\t\tmime: 'application/x-sqlite3',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4E, 0x45, 0x53, 0x1A])) {\n\t\t\treturn {\n\t\t\t\text: 'nes',\n\t\t\t\tmime: 'application/x-nintendo-nes-rom',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Cr24')) {\n\t\t\treturn {\n\t\t\t\text: 'crx',\n\t\t\t\tmime: 'application/x-google-chrome-extension',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('MSCF')\n\t\t\t|| this.checkString('ISc(')\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'cab',\n\t\t\t\tmime: 'application/vnd.ms-cab-compressed',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xED, 0xAB, 0xEE, 0xDB])) {\n\t\t\treturn {\n\t\t\t\text: 'rpm',\n\t\t\t\tmime: 'application/x-rpm',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xC5, 0xD0, 0xD3, 0xC6])) {\n\t\t\treturn {\n\t\t\t\text: 'eps',\n\t\t\t\tmime: 'application/eps',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x28, 0xB5, 0x2F, 0xFD])) {\n\t\t\treturn {\n\t\t\t\text: 'zst',\n\t\t\t\tmime: 'application/zstd',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x7F, 0x45, 0x4C, 0x46])) {\n\t\t\treturn {\n\t\t\t\text: 'elf',\n\t\t\t\tmime: 'application/x-elf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x21, 0x42, 0x44, 0x4E])) {\n\t\t\treturn {\n\t\t\t\text: 'pst',\n\t\t\t\tmime: 'application/vnd.ms-outlook',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('PAR1') || this.checkString('PARE')) {\n\t\t\treturn {\n\t\t\t\text: 'parquet',\n\t\t\t\tmime: 'application/vnd.apache.parquet',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('ttcf')) {\n\t\t\treturn {\n\t\t\t\text: 'ttc',\n\t\t\t\tmime: 'font/collection',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0xFE, 0xED, 0xFA, 0xCE]) // 32-bit, big-endian\n\t\t\t|| this.check([0xFE, 0xED, 0xFA, 0xCF]) // 64-bit, big-endian\n\t\t\t|| this.check([0xCE, 0xFA, 0xED, 0xFE]) // 32-bit, little-endian\n\t\t\t|| this.check([0xCF, 0xFA, 0xED, 0xFE]) // 64-bit, little-endian\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'macho',\n\t\t\t\tmime: 'application/x-mach-binary',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x04, 0x22, 0x4D, 0x18])) {\n\t\t\treturn {\n\t\t\t\text: 'lz4',\n\t\t\t\tmime: 'application/x-lz4', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('regf')) {\n\t\t\treturn {\n\t\t\t\text: 'dat',\n\t\t\t\tmime: 'application/x-ft-windows-registry-hive',\n\t\t\t};\n\t\t}\n\n\t\t// SPSS Statistical Data File\n\t\tif (this.checkString('$FL2') || this.checkString('$FL3')) {\n\t\t\treturn {\n\t\t\t\text: 'sav',\n\t\t\t\tmime: 'application/x-spss-sav',\n\t\t\t};\n\t\t}\n\n\t\t// -- 5-byte signatures --\n\n\t\tif (this.check([0x4F, 0x54, 0x54, 0x4F, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'otf',\n\t\t\t\tmime: 'font/otf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('#!AMR')) {\n\t\t\treturn {\n\t\t\t\text: 'amr',\n\t\t\t\tmime: 'audio/amr',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('{\\\\rtf')) {\n\t\t\treturn {\n\t\t\t\text: 'rtf',\n\t\t\t\tmime: 'application/rtf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x46, 0x4C, 0x56, 0x01])) {\n\t\t\treturn {\n\t\t\t\text: 'flv',\n\t\t\t\tmime: 'video/x-flv',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('IMPM')) {\n\t\t\treturn {\n\t\t\t\text: 'it',\n\t\t\t\tmime: 'audio/x-it',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('-lh0-', {offset: 2})\n\t\t\t|| this.checkString('-lh1-', {offset: 2})\n\t\t\t|| this.checkString('-lh2-', {offset: 2})\n\t\t\t|| this.checkString('-lh3-', {offset: 2})\n\t\t\t|| this.checkString('-lh4-', {offset: 2})\n\t\t\t|| this.checkString('-lh5-', {offset: 2})\n\t\t\t|| this.checkString('-lh6-', {offset: 2})\n\t\t\t|| this.checkString('-lh7-', {offset: 2})\n\t\t\t|| this.checkString('-lzs-', {offset: 2})\n\t\t\t|| this.checkString('-lz4-', {offset: 2})\n\t\t\t|| this.checkString('-lz5-', {offset: 2})\n\t\t\t|| this.checkString('-lhd-', {offset: 2})\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'lzh',\n\t\t\t\tmime: 'application/x-lzh-compressed',\n\t\t\t};\n\t\t}\n\n\t\t// MPEG program stream (PS or MPEG-PS)\n\t\tif (this.check([0x00, 0x00, 0x01, 0xBA])) {\n\t\t\t// MPEG-PS, MPEG-1 Part 1\n\t\t\tif (this.check([0x21], {offset: 4, mask: [0xF1]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mpg', // May also be .ps, .mpeg\n\t\t\t\t\tmime: 'video/MP1S',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// MPEG-PS, MPEG-2 Part 1\n\t\t\tif (this.check([0x44], {offset: 4, mask: [0xC4]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mpg', // May also be .mpg, .m2p, .vob or .sub\n\t\t\t\t\tmime: 'video/MP2P',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('ITSF')) {\n\t\t\treturn {\n\t\t\t\text: 'chm',\n\t\t\t\tmime: 'application/vnd.ms-htmlhelp',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xCA, 0xFE, 0xBA, 0xBE])) {\n\t\t\t// Java bytecode and Mach-O universal binaries have the same magic number.\n\t\t\t// We disambiguate based on the next 4 bytes, as done by `file`.\n\t\t\t// See https://github.com/file/file/blob/master/magic/Magdir/cafebabe\n\t\t\tconst machOArchitectureCount = Token.UINT32_BE.get(this.buffer, 4);\n\t\t\tconst javaClassFileMajorVersion = Token.UINT16_BE.get(this.buffer, 6);\n\n\t\t\tif (machOArchitectureCount > 0 && machOArchitectureCount <= 30) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'macho',\n\t\t\t\t\tmime: 'application/x-mach-binary',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (javaClassFileMajorVersion > 30) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'class',\n\t\t\t\t\tmime: 'application/java-vm',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('.RMF')) {\n\t\t\treturn {\n\t\t\t\text: 'rm',\n\t\t\t\tmime: 'application/vnd.rn-realmedia',\n\t\t\t};\n\t\t}\n\n\t\t// -- 5-byte signatures --\n\n\t\tif (this.checkString('DRACO')) {\n\t\t\treturn {\n\t\t\t\text: 'drc',\n\t\t\t\tmime: 'application/vnd.google.draco', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\t// -- 6-byte signatures --\n\n\t\tif (this.check([0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'xz',\n\t\t\t\tmime: 'application/x-xz',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('<?xml ')) {\n\t\t\treturn {\n\t\t\t\text: 'xml',\n\t\t\t\tmime: 'application/xml',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C])) {\n\t\t\treturn {\n\t\t\t\text: '7z',\n\t\t\t\tmime: 'application/x-7z-compressed',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x52, 0x61, 0x72, 0x21, 0x1A, 0x7])\n\t\t\t&& (this.buffer[6] === 0x0 || this.buffer[6] === 0x1)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'rar',\n\t\t\t\tmime: 'application/x-rar-compressed',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('solid ')) {\n\t\t\treturn {\n\t\t\t\text: 'stl',\n\t\t\t\tmime: 'model/stl',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('AC')) {\n\t\t\tconst version = new Token.StringType(4, 'latin1').get(this.buffer, 2);\n\t\t\tif (version.match('^d*') && version >= 1000 && version <= 1050) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'dwg',\n\t\t\t\t\tmime: 'image/vnd.dwg',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (this.checkString('070707')) {\n\t\t\treturn {\n\t\t\t\text: 'cpio',\n\t\t\t\tmime: 'application/x-cpio',\n\t\t\t};\n\t\t}\n\n\t\t// -- 7-byte signatures --\n\n\t\tif (this.checkString('BLENDER')) {\n\t\t\treturn {\n\t\t\t\text: 'blend',\n\t\t\t\tmime: 'application/x-blender',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('!<arch>')) {\n\t\t\tawait tokenizer.ignore(8);\n\t\t\tconst string = await tokenizer.readToken(new Token.StringType(13, 'ascii'));\n\t\t\tif (string === 'debian-binary') {\n\t\t\t\treturn {\n\t\t\t\t\text: 'deb',\n\t\t\t\t\tmime: 'application/x-deb',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\text: 'ar',\n\t\t\t\tmime: 'application/x-unix-archive',\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.checkString('WEBVTT')\n\t\t\t&&\t(\n\t\t\t\t// One of LF, CR, tab, space, or end of file must follow \"WEBVTT\" per the spec (see `fixture/fixture-vtt-*.vtt` for examples). Note that `\\0` is technically the null character (there is no such thing as an EOF character). However, checking for `\\0` gives us the same result as checking for the end of the stream.\n\t\t\t\t(['\\n', '\\r', '\\t', ' ', '\\0'].some(char7 => this.checkString(char7, {offset: 6}))))\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'vtt',\n\t\t\t\tmime: 'text/vtt',\n\t\t\t};\n\t\t}\n\n\t\t// -- 8-byte signatures --\n\n\t\tif (this.check([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])) {\n\t\t\t// APNG format (https://wiki.mozilla.org/APNG_Specification)\n\t\t\t// 1. Find the first IDAT (image data) chunk (49 44 41 54)\n\t\t\t// 2. Check if there is an \"acTL\" chunk before the IDAT one (61 63 54 4C)\n\n\t\t\t// Offset calculated as follows:\n\t\t\t// - 8 bytes: PNG signature\n\t\t\t// - 4 (length) + 4 (chunk type) + 13 (chunk data) + 4 (CRC): IHDR chunk\n\n\t\t\tawait tokenizer.ignore(8); // ignore PNG signature\n\n\t\t\tasync function readChunkHeader() {\n\t\t\t\treturn {\n\t\t\t\t\tlength: await tokenizer.readToken(Token.INT32_BE),\n\t\t\t\t\ttype: await tokenizer.readToken(new Token.StringType(4, 'latin1')),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tdo {\n\t\t\t\tconst chunk = await readChunkHeader();\n\t\t\t\tif (chunk.length < 0) {\n\t\t\t\t\treturn; // Invalid chunk length\n\t\t\t\t}\n\n\t\t\t\tswitch (chunk.type) {\n\t\t\t\t\tcase 'IDAT':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'png',\n\t\t\t\t\t\t\tmime: 'image/png',\n\t\t\t\t\t\t};\n\t\t\t\t\tcase 'acTL':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'apng',\n\t\t\t\t\t\t\tmime: 'image/apng',\n\t\t\t\t\t\t};\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tawait tokenizer.ignore(chunk.length + 4); // Ignore chunk-data + CRC\n\t\t\t\t}\n\t\t\t} while (tokenizer.position + 8 < tokenizer.fileInfo.size);\n\n\t\t\treturn {\n\t\t\t\text: 'png',\n\t\t\t\tmime: 'image/png',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x41, 0x52, 0x52, 0x4F, 0x57, 0x31, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'arrow',\n\t\t\t\tmime: 'application/vnd.apache.arrow.file',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x67, 0x6C, 0x54, 0x46, 0x02, 0x00, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'glb',\n\t\t\t\tmime: 'model/gltf-binary',\n\t\t\t};\n\t\t}\n\n\t\t// `mov` format variants\n\t\tif (\n\t\t\tthis.check([0x66, 0x72, 0x65, 0x65], {offset: 4}) // `free`\n\t\t\t|| this.check([0x6D, 0x64, 0x61, 0x74], {offset: 4}) // `mdat` MJPEG\n\t\t\t|| this.check([0x6D, 0x6F, 0x6F, 0x76], {offset: 4}) // `moov`\n\t\t\t|| this.check([0x77, 0x69, 0x64, 0x65], {offset: 4}) // `wide`\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'mov',\n\t\t\t\tmime: 'video/quicktime',\n\t\t\t};\n\t\t}\n\n\t\t// -- 9-byte signatures --\n\n\t\tif (this.check([0x49, 0x49, 0x52, 0x4F, 0x08, 0x00, 0x00, 0x00, 0x18])) {\n\t\t\treturn {\n\t\t\t\text: 'orf',\n\t\t\t\tmime: 'image/x-olympus-orf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('gimp xcf ')) {\n\t\t\treturn {\n\t\t\t\text: 'xcf',\n\t\t\t\tmime: 'image/x-xcf',\n\t\t\t};\n\t\t}\n\n\t\t// File Type Box (https://en.wikipedia.org/wiki/ISO_base_media_file_format)\n\t\t// It's not required to be first, but it's recommended to be. Almost all ISO base media files start with `ftyp` box.\n\t\t// `ftyp` box must contain a brand major identifier, which must consist of ISO 8859-1 printable characters.\n\t\t// Here we check for 8859-1 printable characters (for simplicity, it's a mask which also catches one non-printable character).\n\t\tif (\n\t\t\tthis.checkString('ftyp', {offset: 4})\n\t\t\t&& (this.buffer[8] & 0x60) !== 0x00 // Brand major, first character ASCII?\n\t\t) {\n\t\t\t// They all can have MIME `video/mp4` except `application/mp4` special-case which is hard to detect.\n\t\t\t// For some cases, we're specific, everything else falls to `video/mp4` with `mp4` extension.\n\t\t\tconst brandMajor = new Token.StringType(4, 'latin1').get(this.buffer, 8).replace('\\0', ' ').trim();\n\t\t\tswitch (brandMajor) {\n\t\t\t\tcase 'avif':\n\t\t\t\tcase 'avis':\n\t\t\t\t\treturn {ext: 'avif', mime: 'image/avif'};\n\t\t\t\tcase 'mif1':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heif'};\n\t\t\t\tcase 'msf1':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heif-sequence'};\n\t\t\t\tcase 'heic':\n\t\t\t\tcase 'heix':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heic'};\n\t\t\t\tcase 'hevc':\n\t\t\t\tcase 'hevx':\n\t\t\t\t\treturn {ext: 'heic', mime: 'image/heic-sequence'};\n\t\t\t\tcase 'qt':\n\t\t\t\t\treturn {ext: 'mov', mime: 'video/quicktime'};\n\t\t\t\tcase 'M4V':\n\t\t\t\tcase 'M4VH':\n\t\t\t\tcase 'M4VP':\n\t\t\t\t\treturn {ext: 'm4v', mime: 'video/x-m4v'};\n\t\t\t\tcase 'M4P':\n\t\t\t\t\treturn {ext: 'm4p', mime: 'video/mp4'};\n\t\t\t\tcase 'M4B':\n\t\t\t\t\treturn {ext: 'm4b', mime: 'audio/mp4'};\n\t\t\t\tcase 'M4A':\n\t\t\t\t\treturn {ext: 'm4a', mime: 'audio/x-m4a'};\n\t\t\t\tcase 'F4V':\n\t\t\t\t\treturn {ext: 'f4v', mime: 'video/mp4'};\n\t\t\t\tcase 'F4P':\n\t\t\t\t\treturn {ext: 'f4p', mime: 'video/mp4'};\n\t\t\t\tcase 'F4A':\n\t\t\t\t\treturn {ext: 'f4a', mime: 'audio/mp4'};\n\t\t\t\tcase 'F4B':\n\t\t\t\t\treturn {ext: 'f4b', mime: 'audio/mp4'};\n\t\t\t\tcase 'crx':\n\t\t\t\t\treturn {ext: 'cr3', mime: 'image/x-canon-cr3'};\n\t\t\t\tdefault:\n\t\t\t\t\tif (brandMajor.startsWith('3g')) {\n\t\t\t\t\t\tif (brandMajor.startsWith('3g2')) {\n\t\t\t\t\t\t\treturn {ext: '3g2', mime: 'video/3gpp2'};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {ext: '3gp', mime: 'video/3gpp'};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {ext: 'mp4', mime: 'video/mp4'};\n\t\t\t}\n\t\t}\n\n\t\t// -- 10-byte signatures --\n\n\t\tif (this.checkString('REGEDIT4\\r\\n')) {\n\t\t\treturn {\n\t\t\t\text: 'reg',\n\t\t\t\tmime: 'application/x-ms-regedit',\n\t\t\t};\n\t\t}\n\n\t\t// -- 12-byte signatures --\n\n\t\t// RIFF file format which might be AVI, WAV, QCP, etc\n\t\tif (this.check([0x52, 0x49, 0x46, 0x46])) {\n\t\t\tif (this.checkString('WEBP', {offset: 8})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'webp',\n\t\t\t\t\tmime: 'image/webp',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.check([0x41, 0x56, 0x49], {offset: 8})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'avi',\n\t\t\t\t\tmime: 'video/vnd.avi',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.check([0x57, 0x41, 0x56, 0x45], {offset: 8})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'wav',\n\t\t\t\t\tmime: 'audio/wav',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// QLCM, QCP file\n\t\t\tif (this.check([0x51, 0x4C, 0x43, 0x4D], {offset: 8})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'qcp',\n\t\t\t\t\tmime: 'audio/qcelp',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (this.check([0x49, 0x49, 0x55, 0x00, 0x18, 0x00, 0x00, 0x00, 0x88, 0xE7, 0x74, 0xD8])) {\n\t\t\treturn {\n\t\t\t\text: 'rw2',\n\t\t\t\tmime: 'image/x-panasonic-rw2',\n\t\t\t};\n\t\t}\n\n\t\t// ASF_Header_Object first 80 bytes\n\t\tif (this.check([0x30, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, 0xA6, 0xD9])) {\n\t\t\tasync function readHeader() {\n\t\t\t\tconst guid = new Uint8Array(16);\n\t\t\t\tawait tokenizer.readBuffer(guid);\n\t\t\t\treturn {\n\t\t\t\t\tid: guid,\n\t\t\t\t\tsize: Number(await tokenizer.readToken(Token.UINT64_LE)),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tawait tokenizer.ignore(30);\n\t\t\t// Search for header should be in first 1KB of file.\n\t\t\twhile (tokenizer.position + 24 < tokenizer.fileInfo.size) {\n\t\t\t\tconst header = await readHeader();\n\t\t\t\tlet payload = header.size - 24;\n\t\t\t\tif (_check(header.id, [0x91, 0x07, 0xDC, 0xB7, 0xB7, 0xA9, 0xCF, 0x11, 0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65])) {\n\t\t\t\t\t// Sync on Stream-Properties-Object (B7DC0791-A9B7-11CF-8EE6-00C00C205365)\n\t\t\t\t\tconst typeId = new Uint8Array(16);\n\t\t\t\t\tpayload -= await tokenizer.readBuffer(typeId);\n\n\t\t\t\t\tif (_check(typeId, [0x40, 0x9E, 0x69, 0xF8, 0x4D, 0x5B, 0xCF, 0x11, 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B])) {\n\t\t\t\t\t\t// Found audio:\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'asf',\n\t\t\t\t\t\t\tmime: 'audio/x-ms-asf',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (_check(typeId, [0xC0, 0xEF, 0x19, 0xBC, 0x4D, 0x5B, 0xCF, 0x11, 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B])) {\n\t\t\t\t\t\t// Found video:\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'asf',\n\t\t\t\t\t\t\tmime: 'video/x-ms-asf',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tawait tokenizer.ignore(payload);\n\t\t\t}\n\n\t\t\t// Default to ASF generic extension\n\t\t\treturn {\n\t\t\t\text: 'asf',\n\t\t\t\tmime: 'application/vnd.ms-asf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A])) {\n\t\t\treturn {\n\t\t\t\text: 'ktx',\n\t\t\t\tmime: 'image/ktx',\n\t\t\t};\n\t\t}\n\n\t\tif ((this.check([0x7E, 0x10, 0x04]) || this.check([0x7E, 0x18, 0x04])) && this.check([0x30, 0x4D, 0x49, 0x45], {offset: 4})) {\n\t\t\treturn {\n\t\t\t\text: 'mie',\n\t\t\t\tmime: 'application/x-mie',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x27, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], {offset: 2})) {\n\t\t\treturn {\n\t\t\t\text: 'shp',\n\t\t\t\tmime: 'application/x-esri-shape',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xFF, 0x4F, 0xFF, 0x51])) {\n\t\t\treturn {\n\t\t\t\text: 'j2c',\n\t\t\t\tmime: 'image/j2c',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50, 0x20, 0x20, 0x0D, 0x0A, 0x87, 0x0A])) {\n\t\t\t// JPEG-2000 family\n\n\t\t\tawait tokenizer.ignore(20);\n\t\t\tconst type = await tokenizer.readToken(new Token.StringType(4, 'ascii'));\n\t\t\tswitch (type) {\n\t\t\t\tcase 'jp2 ':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'jp2',\n\t\t\t\t\t\tmime: 'image/jp2',\n\t\t\t\t\t};\n\t\t\t\tcase 'jpx ':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'jpx',\n\t\t\t\t\t\tmime: 'image/jpx',\n\t\t\t\t\t};\n\t\t\t\tcase 'jpm ':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'jpm',\n\t\t\t\t\t\tmime: 'image/jpm',\n\t\t\t\t\t};\n\t\t\t\tcase 'mjp2':\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'mj2',\n\t\t\t\t\t\tmime: 'image/mj2',\n\t\t\t\t\t};\n\t\t\t\tdefault:\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0xFF, 0x0A])\n\t\t\t|| this.check([0x00, 0x00, 0x00, 0x0C, 0x4A, 0x58, 0x4C, 0x20, 0x0D, 0x0A, 0x87, 0x0A])\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'jxl',\n\t\t\t\tmime: 'image/jxl',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xFE, 0xFF])) { // UTF-16-BOM-BE\n\t\t\tif (this.checkString('<?xml ', {offset: 2, encoding: 'utf-16be'})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'xml',\n\t\t\t\t\tmime: 'application/xml',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn undefined; // Some unknown text based format\n\t\t}\n\n\t\tif (this.check([0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1])) {\n\t\t\t// Detected Microsoft Compound File Binary File (MS-CFB) Format.\n\t\t\treturn {\n\t\t\t\text: 'cfb',\n\t\t\t\tmime: 'application/x-cfb',\n\t\t\t};\n\t\t}\n\n\t\t// Increase sample size from 32 to 256.\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: Math.min(256, tokenizer.fileInfo.size), mayBeLess: true});\n\n\t\tif (this.check([0x61, 0x63, 0x73, 0x70], {offset: 36})) {\n\t\t\treturn {\n\t\t\t\text: 'icc',\n\t\t\t\tmime: 'application/vnd.iccprofile',\n\t\t\t};\n\t\t}\n\n\t\t// ACE: requires 14 bytes in the buffer\n\t\tif (this.checkString('**ACE', {offset: 7}) && this.checkString('**', {offset: 12})) {\n\t\t\treturn {\n\t\t\t\text: 'ace',\n\t\t\t\tmime: 'application/x-ace-compressed',\n\t\t\t};\n\t\t}\n\n\t\t// -- 15-byte signatures --\n\n\t\tif (this.checkString('BEGIN:')) {\n\t\t\tif (this.checkString('VCARD', {offset: 6})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'vcf',\n\t\t\t\t\tmime: 'text/vcard',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.checkString('VCALENDAR', {offset: 6})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'ics',\n\t\t\t\t\tmime: 'text/calendar',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// `raf` is here just to keep all the raw image detectors together.\n\t\tif (this.checkString('FUJIFILMCCD-RAW')) {\n\t\t\treturn {\n\t\t\t\text: 'raf',\n\t\t\t\tmime: 'image/x-fujifilm-raf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Extended Module:')) {\n\t\t\treturn {\n\t\t\t\text: 'xm',\n\t\t\t\tmime: 'audio/x-xm',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Creative Voice File')) {\n\t\t\treturn {\n\t\t\t\text: 'voc',\n\t\t\t\tmime: 'audio/x-voc',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x04, 0x00, 0x00, 0x00]) && this.buffer.length >= 16) { // Rough & quick check Pickle/ASAR\n\t\t\tconst jsonSize = new DataView(this.buffer.buffer).getUint32(12, true);\n\n\t\t\tif (jsonSize > 12 && this.buffer.length >= jsonSize + 16) {\n\t\t\t\ttry {\n\t\t\t\t\tconst header = new TextDecoder().decode(this.buffer.subarray(16, jsonSize + 16));\n\t\t\t\t\tconst json = JSON.parse(header);\n\t\t\t\t\t// Check if Pickle is ASAR\n\t\t\t\t\tif (json.files) { // Final check, assuring Pickle/ASAR format\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'asar',\n\t\t\t\t\t\t\tmime: 'application/x-asar',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t}\n\n\t\tif (this.check([0x06, 0x0E, 0x2B, 0x34, 0x02, 0x05, 0x01, 0x01, 0x0D, 0x01, 0x02, 0x01, 0x01, 0x02])) {\n\t\t\treturn {\n\t\t\t\text: 'mxf',\n\t\t\t\tmime: 'application/mxf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('SCRM', {offset: 44})) {\n\t\t\treturn {\n\t\t\t\text: 's3m',\n\t\t\t\tmime: 'audio/x-s3m',\n\t\t\t};\n\t\t}\n\n\t\t// Raw MPEG-2 transport stream (188-byte packets)\n\t\tif (this.check([0x47]) && this.check([0x47], {offset: 188})) {\n\t\t\treturn {\n\t\t\t\text: 'mts',\n\t\t\t\tmime: 'video/mp2t',\n\t\t\t};\n\t\t}\n\n\t\t// Blu-ray Disc Audio-Video (BDAV) MPEG-2 transport stream has 4-byte TP_extra_header before each 188-byte packet\n\t\tif (this.check([0x47], {offset: 4}) && this.check([0x47], {offset: 196})) {\n\t\t\treturn {\n\t\t\t\text: 'mts',\n\t\t\t\tmime: 'video/mp2t',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x42, 0x4F, 0x4F, 0x4B, 0x4D, 0x4F, 0x42, 0x49], {offset: 60})) {\n\t\t\treturn {\n\t\t\t\text: 'mobi',\n\t\t\t\tmime: 'application/x-mobipocket-ebook',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x44, 0x49, 0x43, 0x4D], {offset: 128})) {\n\t\t\treturn {\n\t\t\t\text: 'dcm',\n\t\t\t\tmime: 'application/dicom',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x4C, 0x00, 0x00, 0x00, 0x01, 0x14, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46])) {\n\t\t\treturn {\n\t\t\t\text: 'lnk',\n\t\t\t\tmime: 'application/x.ms.shortcut', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x62, 0x6F, 0x6F, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x61, 0x72, 0x6B, 0x00, 0x00, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'alias',\n\t\t\t\tmime: 'application/x.apple.alias', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\tif (this.checkString('Kaydara FBX Binary \\u0000')) {\n\t\t\treturn {\n\t\t\t\text: 'fbx',\n\t\t\t\tmime: 'application/x.autodesk.fbx', // Invented by us\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tthis.check([0x4C, 0x50], {offset: 34})\n\t\t\t&& (\n\t\t\t\tthis.check([0x00, 0x00, 0x01], {offset: 8})\n\t\t\t\t|| this.check([0x01, 0x00, 0x02], {offset: 8})\n\t\t\t\t|| this.check([0x02, 0x00, 0x02], {offset: 8})\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'eot',\n\t\t\t\tmime: 'application/vnd.ms-fontobject',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x06, 0x06, 0xED, 0xF5, 0xD8, 0x1D, 0x46, 0xE5, 0xBD, 0x31, 0xEF, 0xE7, 0xFE, 0x74, 0xB7, 0x1D])) {\n\t\t\treturn {\n\t\t\t\text: 'indd',\n\t\t\t\tmime: 'application/x-indesign',\n\t\t\t};\n\t\t}\n\n\t\t// -- 16-byte signatures --\n\n\t\t// JMP files - check for both Little Endian and Big Endian signatures\n\t\tif (this.check([0xFF, 0xFF, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00])\n\t\t\t|| this.check([0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01])) {\n\t\t\treturn {\n\t\t\t\text: 'jmp',\n\t\t\t\tmime: 'application/x-jmp-data',\n\t\t\t};\n\t\t}\n\n\t\t// Increase sample size from 256 to 512\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: Math.min(512, tokenizer.fileInfo.size), mayBeLess: true});\n\n\t\t// Requires a buffer size of 512 bytes\n\t\tif ((this.checkString('ustar', {offset: 257}) && (this.checkString('\\0', {offset: 262}) || this.checkString(' ', {offset: 262})))\n\t\t\t|| (this.check([0, 0, 0, 0, 0, 0], {offset: 257}) && tarHeaderChecksumMatches(this.buffer))) {\n\t\t\treturn {\n\t\t\t\text: 'tar',\n\t\t\t\tmime: 'application/x-tar',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0xFF, 0xFE])) { // UTF-16-BOM-LE\n\t\t\tconst encoding = 'utf-16le';\n\t\t\tif (this.checkString('<?xml ', {offset: 2, encoding})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'xml',\n\t\t\t\t\tmime: 'application/xml',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.check([0xFF, 0x0E], {offset: 2}) && this.checkString('SketchUp Model', {offset: 4, encoding})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'skp',\n\t\t\t\t\tmime: 'application/vnd.sketchup.skp',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (this.checkString('Windows Registry Editor Version 5.00\\r\\n', {offset: 2, encoding})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'reg',\n\t\t\t\t\tmime: 'application/x-ms-regedit',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn undefined; // Some text based format\n\t\t}\n\n\t\tif (this.checkString('-----BEGIN PGP MESSAGE-----')) {\n\t\t\treturn {\n\t\t\t\text: 'pgp',\n\t\t\t\tmime: 'application/pgp-encrypted',\n\t\t\t};\n\t\t}\n\t};\n\t// Detections with limited supporting data, resulting in a higher likelihood of false positives\n\tdetectImprecise = async tokenizer => {\n\t\tthis.buffer = new Uint8Array(reasonableDetectionSizeInBytes);\n\n\t\t// Read initial sample size of 8 bytes\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: Math.min(8, tokenizer.fileInfo.size), mayBeLess: true});\n\n\t\tif (\n\t\t\tthis.check([0x0, 0x0, 0x1, 0xBA])\n\t\t\t|| this.check([0x0, 0x0, 0x1, 0xB3])\n\t\t) {\n\t\t\treturn {\n\t\t\t\text: 'mpg',\n\t\t\t\tmime: 'video/mpeg',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x01, 0x00, 0x00, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'ttf',\n\t\t\t\tmime: 'font/ttf',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x00, 0x01, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'ico',\n\t\t\t\tmime: 'image/x-icon',\n\t\t\t};\n\t\t}\n\n\t\tif (this.check([0x00, 0x00, 0x02, 0x00])) {\n\t\t\treturn {\n\t\t\t\text: 'cur',\n\t\t\t\tmime: 'image/x-icon',\n\t\t\t};\n\t\t}\n\n\t\t// Adjust buffer to `mpegOffsetTolerance`\n\t\tawait tokenizer.peekBuffer(this.buffer, {length: Math.min(2 + this.options.mpegOffsetTolerance, tokenizer.fileInfo.size), mayBeLess: true});\n\n\t\t// Check MPEG 1 or 2 Layer 3 header, or 'layer 0' for ADTS (MPEG sync-word 0xFFE)\n\t\tif (this.buffer.length >= (2 + this.options.mpegOffsetTolerance)) {\n\t\t\tfor (let depth = 0; depth <= this.options.mpegOffsetTolerance; ++depth) {\n\t\t\t\tconst type = this.scanMpeg(depth);\n\t\t\t\tif (type) {\n\t\t\t\t\treturn type;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tasync readTiffTag(bigEndian) {\n\t\tconst tagId = await this.tokenizer.readToken(bigEndian ? Token.UINT16_BE : Token.UINT16_LE);\n\t\tthis.tokenizer.ignore(10);\n\t\tswitch (tagId) {\n\t\t\tcase 50_341:\n\t\t\t\treturn {\n\t\t\t\t\text: 'arw',\n\t\t\t\t\tmime: 'image/x-sony-arw',\n\t\t\t\t};\n\t\t\tcase 50_706:\n\t\t\t\treturn {\n\t\t\t\t\text: 'dng',\n\t\t\t\t\tmime: 'image/x-adobe-dng',\n\t\t\t\t};\n\t\t\tdefault:\n\t\t}\n\t}\n\n\tasync readTiffIFD(bigEndian) {\n\t\tconst numberOfTags = await this.tokenizer.readToken(bigEndian ? Token.UINT16_BE : Token.UINT16_LE);\n\t\tfor (let n = 0; n < numberOfTags; ++n) {\n\t\t\tconst fileType = await this.readTiffTag(bigEndian);\n\t\t\tif (fileType) {\n\t\t\t\treturn fileType;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync readTiffHeader(bigEndian) {\n\t\tconst version = (bigEndian ? Token.UINT16_BE : Token.UINT16_LE).get(this.buffer, 2);\n\t\tconst ifdOffset = (bigEndian ? Token.UINT32_BE : Token.UINT32_LE).get(this.buffer, 4);\n\n\t\tif (version === 42) {\n\t\t\t// TIFF file header\n\t\t\tif (ifdOffset >= 6) {\n\t\t\t\tif (this.checkString('CR', {offset: 8})) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'cr2',\n\t\t\t\t\t\tmime: 'image/x-canon-cr2',\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (ifdOffset >= 8) {\n\t\t\t\t\tconst someId1 = (bigEndian ? Token.UINT16_BE : Token.UINT16_LE).get(this.buffer, 8);\n\t\t\t\t\tconst someId2 = (bigEndian ? Token.UINT16_BE : Token.UINT16_LE).get(this.buffer, 10);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\t(someId1 === 0x1C && someId2 === 0xFE)\n\t\t\t\t\t\t|| (someId1 === 0x1F && someId2 === 0x0B)) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\text: 'nef',\n\t\t\t\t\t\t\tmime: 'image/x-nikon-nef',\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait this.tokenizer.ignore(ifdOffset);\n\t\t\tconst fileType = await this.readTiffIFD(bigEndian);\n\t\t\treturn fileType ?? {\n\t\t\t\text: 'tif',\n\t\t\t\tmime: 'image/tiff',\n\t\t\t};\n\t\t}\n\n\t\tif (version === 43) {\t// Big TIFF file header\n\t\t\treturn {\n\t\t\t\text: 'tif',\n\t\t\t\tmime: 'image/tiff',\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\tScan check MPEG 1 or 2 Layer 3 header, or 'layer 0' for ADTS (MPEG sync-word 0xFFE).\n\n\t@param offset - Offset to scan for sync-preamble.\n\t@returns {{ext: string, mime: string}}\n\t*/\n\tscanMpeg(offset) {\n\t\tif (this.check([0xFF, 0xE0], {offset, mask: [0xFF, 0xE0]})) {\n\t\t\tif (this.check([0x10], {offset: offset + 1, mask: [0x16]})) {\n\t\t\t\t// Check for (ADTS) MPEG-2\n\t\t\t\tif (this.check([0x08], {offset: offset + 1, mask: [0x08]})) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\text: 'aac',\n\t\t\t\t\t\tmime: 'audio/aac',\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Must be (ADTS) MPEG-4\n\t\t\t\treturn {\n\t\t\t\t\text: 'aac',\n\t\t\t\t\tmime: 'audio/aac',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// MPEG 1 or 2 Layer 3 header\n\t\t\t// Check for MPEG layer 3\n\t\t\tif (this.check([0x02], {offset: offset + 1, mask: [0x06]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp3',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Check for MPEG layer 2\n\t\t\tif (this.check([0x04], {offset: offset + 1, mask: [0x06]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp2',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Check for MPEG layer 1\n\t\t\tif (this.check([0x06], {offset: offset + 1, mask: [0x06]})) {\n\t\t\t\treturn {\n\t\t\t\t\text: 'mp1',\n\t\t\t\t\tmime: 'audio/mpeg',\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport const supportedExtensions = new Set(extensions);\nexport const supportedMimeTypes = new Set(mimeTypes);\n","export { ZipHandler } from './ZipHandler.js';\nexport { GzipHandler } from './GzipHandler.js';\n","import { StringType, UINT32_LE } from 'token-types';\nimport initDebug from 'debug';\nimport { DataDescriptor, EndOfCentralDirectoryRecordToken, FileHeader, LocalFileHeaderToken, Signature } from \"./ZipToken.js\";\nfunction signatureToArray(signature) {\n const signatureBytes = new Uint8Array(UINT32_LE.len);\n UINT32_LE.put(signatureBytes, 0, signature);\n return signatureBytes;\n}\nconst debug = initDebug('tokenizer:inflate');\nconst syncBufferSize = 256 * 1024;\nconst ddSignatureArray = signatureToArray(Signature.DataDescriptor);\nconst eocdSignatureBytes = signatureToArray(Signature.EndOfCentralDirectory);\nexport class ZipHandler {\n constructor(tokenizer) {\n this.tokenizer = tokenizer;\n this.syncBuffer = new Uint8Array(syncBufferSize);\n }\n async isZip() {\n return await this.peekSignature() === Signature.LocalFileHeader;\n }\n peekSignature() {\n return this.tokenizer.peekToken(UINT32_LE);\n }\n async findEndOfCentralDirectoryLocator() {\n const randomReadTokenizer = this.tokenizer;\n const chunkLength = Math.min(16 * 1024, randomReadTokenizer.fileInfo.size);\n const buffer = this.syncBuffer.subarray(0, chunkLength);\n await this.tokenizer.readBuffer(buffer, { position: randomReadTokenizer.fileInfo.size - chunkLength });\n // Search the buffer from end to beginning for EOCD signature\n // const signature = 0x06054b50;\n for (let i = buffer.length - 4; i >= 0; i--) {\n // Compare 4 bytes directly without calling readUInt32LE\n if (buffer[i] === eocdSignatureBytes[0] &&\n buffer[i + 1] === eocdSignatureBytes[1] &&\n buffer[i + 2] === eocdSignatureBytes[2] &&\n buffer[i + 3] === eocdSignatureBytes[3]) {\n return randomReadTokenizer.fileInfo.size - chunkLength + i;\n }\n }\n return -1;\n }\n async readCentralDirectory() {\n if (!this.tokenizer.supportsRandomAccess()) {\n debug('Cannot reading central-directory without random-read support');\n return;\n }\n debug('Reading central-directory...');\n const pos = this.tokenizer.position;\n const offset = await this.findEndOfCentralDirectoryLocator();\n if (offset > 0) {\n debug('Central-directory 32-bit signature found');\n const eocdHeader = await this.tokenizer.readToken(EndOfCentralDirectoryRecordToken, offset);\n const files = [];\n this.tokenizer.setPosition(eocdHeader.offsetOfStartOfCd);\n for (let n = 0; n < eocdHeader.nrOfEntriesOfSize; ++n) {\n const entry = await this.tokenizer.readToken(FileHeader);\n if (entry.signature !== Signature.CentralFileHeader) {\n throw new Error('Expected Central-File-Header signature');\n }\n entry.filename = await this.tokenizer.readToken(new StringType(entry.filenameLength, 'utf-8'));\n await this.tokenizer.ignore(entry.extraFieldLength);\n await this.tokenizer.ignore(entry.fileCommentLength);\n files.push(entry);\n debug(`Add central-directory file-entry: n=${n + 1}/${files.length}: filename=${files[n].filename}`);\n }\n this.tokenizer.setPosition(pos);\n return files;\n }\n this.tokenizer.setPosition(pos);\n }\n async unzip(fileCb) {\n const entries = await this.readCentralDirectory();\n if (entries) {\n // Use Central Directory to iterate over files\n return this.iterateOverCentralDirectory(entries, fileCb);\n }\n // Scan Zip files for local-file-header\n let stop = false;\n do {\n const zipHeader = await this.readLocalFileHeader();\n if (!zipHeader)\n break;\n const next = fileCb(zipHeader);\n stop = !!next.stop;\n let fileData;\n await this.tokenizer.ignore(zipHeader.extraFieldLength);\n if (zipHeader.dataDescriptor && zipHeader.compressedSize === 0) {\n const chunks = [];\n let len = syncBufferSize;\n debug('Compressed-file-size unknown, scanning for next data-descriptor-signature....');\n let nextHeaderIndex = -1;\n while (nextHeaderIndex < 0 && len === syncBufferSize) {\n len = await this.tokenizer.peekBuffer(this.syncBuffer, { mayBeLess: true });\n nextHeaderIndex = indexOf(this.syncBuffer.subarray(0, len), ddSignatureArray);\n const size = nextHeaderIndex >= 0 ? nextHeaderIndex : len;\n if (next.handler) {\n const data = new Uint8Array(size);\n await this.tokenizer.readBuffer(data);\n chunks.push(data);\n }\n else {\n // Move position to the next header if found, skip the whole buffer otherwise\n await this.tokenizer.ignore(size);\n }\n }\n debug(`Found data-descriptor-signature at pos=${this.tokenizer.position}`);\n if (next.handler) {\n await this.inflate(zipHeader, mergeArrays(chunks), next.handler);\n }\n }\n else {\n if (next.handler) {\n debug(`Reading compressed-file-data: ${zipHeader.compressedSize} bytes`);\n fileData = new Uint8Array(zipHeader.compressedSize);\n await this.tokenizer.readBuffer(fileData);\n await this.inflate(zipHeader, fileData, next.handler);\n }\n else {\n debug(`Ignoring compressed-file-data: ${zipHeader.compressedSize} bytes`);\n await this.tokenizer.ignore(zipHeader.compressedSize);\n }\n }\n debug(`Reading data-descriptor at pos=${this.tokenizer.position}`);\n if (zipHeader.dataDescriptor) {\n // await this.tokenizer.ignore(DataDescriptor.len);\n const dataDescriptor = await this.tokenizer.readToken(DataDescriptor);\n if (dataDescriptor.signature !== 0x08074b50) {\n throw new Error(`Expected data-descriptor-signature at position ${this.tokenizer.position - DataDescriptor.len}`);\n }\n }\n } while (!stop);\n }\n async iterateOverCentralDirectory(entries, fileCb) {\n for (const fileHeader of entries) {\n const next = fileCb(fileHeader);\n if (next.handler) {\n this.tokenizer.setPosition(fileHeader.relativeOffsetOfLocalHeader);\n const zipHeader = await this.readLocalFileHeader();\n if (zipHeader) {\n await this.tokenizer.ignore(zipHeader.extraFieldLength);\n const fileData = new Uint8Array(fileHeader.compressedSize);\n await this.tokenizer.readBuffer(fileData);\n await this.inflate(zipHeader, fileData, next.handler);\n }\n }\n if (next.stop)\n break;\n }\n }\n async inflate(zipHeader, fileData, cb) {\n if (zipHeader.compressedMethod === 0) {\n // Stored (uncompressed)\n return cb(fileData);\n }\n if (zipHeader.compressedMethod !== 8) {\n throw new Error(`Unsupported ZIP compression method: ${zipHeader.compressedMethod}`);\n }\n debug(`Decompress filename=${zipHeader.filename}, compressed-size=${fileData.length}`);\n const uncompressedData = await ZipHandler.decompressDeflateRaw(fileData);\n return cb(uncompressedData);\n }\n static async decompressDeflateRaw(data) {\n // Wrap Uint8Array in a ReadableStream without copying\n const input = new ReadableStream({\n start(controller) {\n controller.enqueue(data);\n controller.close();\n }\n });\n const ds = new DecompressionStream(\"deflate-raw\");\n const output = input.pipeThrough(ds);\n try {\n // Collect decompressed bytes from the output stream\n const response = new Response(output);\n const buffer = await response.arrayBuffer();\n return new Uint8Array(buffer);\n }\n catch (err) {\n // Provide ZIP-specific error context\n const message = err instanceof Error\n ? `Failed to deflate ZIP entry: ${err.message}`\n : \"Unknown decompression error in ZIP entry\";\n throw new TypeError(message);\n }\n }\n async readLocalFileHeader() {\n const signature = await this.tokenizer.peekToken(UINT32_LE);\n if (signature === Signature.LocalFileHeader) {\n const header = await this.tokenizer.readToken(LocalFileHeaderToken);\n header.filename = await this.tokenizer.readToken(new StringType(header.filenameLength, 'utf-8'));\n return header;\n }\n if (signature === Signature.CentralFileHeader) {\n return false;\n }\n if (signature === 0xE011CFD0) {\n throw new Error('Encrypted ZIP');\n }\n throw new Error('Unexpected signature');\n }\n}\nfunction indexOf(buffer, portion) {\n const bufferLength = buffer.length;\n const portionLength = portion.length;\n // Return -1 if the portion is longer than the buffer\n if (portionLength > bufferLength)\n return -1;\n // Search for the portion in the buffer\n for (let i = 0; i <= bufferLength - portionLength; i++) {\n let found = true;\n for (let j = 0; j < portionLength; j++) {\n if (buffer[i + j] !== portion[j]) {\n found = false;\n break;\n }\n }\n if (found) {\n return i; // Return the starting offset\n }\n }\n return -1; // Not found\n}\nfunction mergeArrays(chunks) {\n // Concatenate chunks into a single Uint8Array\n const totalLength = chunks.reduce((acc, curr) => acc + curr.length, 0);\n const mergedArray = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n mergedArray.set(chunk, offset);\n offset += chunk.length;\n }\n return mergedArray;\n}\n","/**\n * Ref https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT\n */\nimport { UINT16_LE, UINT32_LE } from \"token-types\";\nexport const Signature = {\n LocalFileHeader: 0x04034b50,\n DataDescriptor: 0x08074b50,\n CentralFileHeader: 0x02014b50,\n EndOfCentralDirectory: 0x06054b50\n};\nexport const DataDescriptor = {\n get(array) {\n return {\n signature: UINT32_LE.get(array, 0),\n compressedSize: UINT32_LE.get(array, 8),\n uncompressedSize: UINT32_LE.get(array, 12),\n };\n }, len: 16\n};\n/**\n * First part of the ZIP Local File Header\n * Offset | Bytes| Description\n * -------|------+-------------------------------------------------------------------\n * 0 | 4 | Signature (0x04034b50)\n * 4 | 2 | Minimum version needed to extract\n * 6 | 2 | Bit flag\n * 8 | 2 | Compression method\n * 10 | 2 | File last modification time (MS-DOS format)\n * 12 | 2 | File last modification date (MS-DOS format)\n * 14 | 4 | CRC-32 of uncompressed data\n * 18 | 4 | Compressed size\n * 22 | 4 | Uncompressed size\n * 26 | 2 | File name length (n)\n * 28 | 2 | Extra field length (m)\n * 30 | n | File name\n * 30 + n | m | Extra field\n */\nexport const LocalFileHeaderToken = {\n get(array) {\n const flags = UINT16_LE.get(array, 6);\n return {\n signature: UINT32_LE.get(array, 0),\n minVersion: UINT16_LE.get(array, 4),\n dataDescriptor: !!(flags & 0x0008),\n compressedMethod: UINT16_LE.get(array, 8),\n compressedSize: UINT32_LE.get(array, 18),\n uncompressedSize: UINT32_LE.get(array, 22),\n filenameLength: UINT16_LE.get(array, 26),\n extraFieldLength: UINT16_LE.get(array, 28),\n filename: null\n };\n }, len: 30\n};\n/**\n * 4.3.16 End of central directory record:\n * end of central dir signature (0x06064b50) 4 bytes\n * number of this disk 2 bytes\n * number of the disk with the start of the central directory 2 bytes\n * total number of entries in the central directory on this disk 2 bytes\n * total number of entries in the size of the central directory 2 bytes\n * sizeOfTheCentralDirectory 4 bytes\n * offset of start of central directory with respect to the starting disk number 4 bytes\n * .ZIP file comment length 2 bytes\n * .ZIP file comment (variable size)\n */\nexport const EndOfCentralDirectoryRecordToken = {\n get(array) {\n return {\n signature: UINT32_LE.get(array, 0),\n nrOfThisDisk: UINT16_LE.get(array, 4),\n nrOfThisDiskWithTheStart: UINT16_LE.get(array, 6),\n nrOfEntriesOnThisDisk: UINT16_LE.get(array, 8),\n nrOfEntriesOfSize: UINT16_LE.get(array, 10),\n sizeOfCd: UINT32_LE.get(array, 12),\n offsetOfStartOfCd: UINT32_LE.get(array, 16),\n zipFileCommentLength: UINT16_LE.get(array, 20),\n };\n }, len: 22\n};\n/**\n * File header:\n * central file header signature 4 bytes 0 (0x02014b50)\n * version made by 2 bytes 4\n * version needed to extract 2 bytes 6\n * general purpose bit flag 2 bytes 8\n * compression method 2 bytes 10\n * last mod file time 2 bytes 12\n * last mod file date 2 bytes 14\n * crc-32 4 bytes 16\n * compressed size 4 bytes 20\n * uncompressed size 4 bytes 24\n * file name length 2 bytes 28\n * extra field length 2 bytes 30\n * file comment length 2 bytes 32\n * disk number start 2 bytes 34\n * internal file attributes 2 bytes 36\n * external file attributes 4 bytes 38\n * relative offset of local header 4 bytes 42\n */\nexport const FileHeader = {\n get(array) {\n const flags = UINT16_LE.get(array, 8);\n return {\n signature: UINT32_LE.get(array, 0),\n minVersion: UINT16_LE.get(array, 6),\n dataDescriptor: !!(flags & 0x0008),\n compressedMethod: UINT16_LE.get(array, 10),\n compressedSize: UINT32_LE.get(array, 20),\n uncompressedSize: UINT32_LE.get(array, 24),\n filenameLength: UINT16_LE.get(array, 28),\n extraFieldLength: UINT16_LE.get(array, 30),\n fileCommentLength: UINT16_LE.get(array, 32),\n relativeOffsetOfLocalHeader: UINT32_LE.get(array, 42),\n filename: null\n };\n }, len: 46\n};\n","export class GzipHandler {\n constructor(tokenizer) {\n this.tokenizer = tokenizer;\n }\n inflate() {\n const tokenizer = this.tokenizer;\n return new ReadableStream({\n async pull(controller) {\n const buffer = new Uint8Array(1024);\n const size = await tokenizer.readBuffer(buffer, { mayBeLess: true });\n if (size === 0) {\n controller.close();\n return;\n }\n controller.enqueue(buffer.subarray(0, size));\n }\n }).pipeThrough(new DecompressionStream(\"gzip\"));\n }\n}\n","import {StringType} from 'token-types';\n\nexport function stringToBytes(string, encoding) {\n\tif (encoding === 'utf-16le') {\n\t\tconst bytes = [];\n\t\tfor (let index = 0; index < string.length; index++) {\n\t\t\tconst code = string.charCodeAt(index); // eslint-disable-line unicorn/prefer-code-point\n\t\t\tbytes.push(code & 0xFF, (code >> 8) & 0xFF); // High byte\n\t\t}\n\n\t\treturn bytes;\n\t}\n\n\tif (encoding === 'utf-16be') {\n\t\tconst bytes = [];\n\t\tfor (let index = 0; index < string.length; index++) {\n\t\t\tconst code = string.charCodeAt(index); // eslint-disable-line unicorn/prefer-code-point\n\t\t\tbytes.push((code >> 8) & 0xFF, code & 0xFF); // Low byte\n\t\t}\n\n\t\treturn bytes;\n\t}\n\n\treturn [...string].map(character => character.charCodeAt(0)); // eslint-disable-line unicorn/prefer-code-point\n}\n\n/**\nChecks whether the TAR checksum is valid.\n\n@param {Uint8Array} arrayBuffer - The TAR header `[offset ... offset + 512]`.\n@param {number} offset - TAR header offset.\n@returns {boolean} `true` if the TAR checksum is valid, otherwise `false`.\n*/\nexport function tarHeaderChecksumMatches(arrayBuffer, offset = 0) {\n\tconst readSum = Number.parseInt(new StringType(6).get(arrayBuffer, 148).replace(/\\0.*$/, '').trim(), 8); // Read sum in header\n\tif (Number.isNaN(readSum)) {\n\t\treturn false;\n\t}\n\n\tlet sum = 8 * 0x20; // Initialize signed bit sum\n\n\tfor (let index = offset; index < offset + 148; index++) {\n\t\tsum += arrayBuffer[index];\n\t}\n\n\tfor (let index = offset + 156; index < offset + 512; index++) {\n\t\tsum += arrayBuffer[index];\n\t}\n\n\treturn readSum === sum;\n}\n\n/**\nID3 UINT32 sync-safe tokenizer token.\n28 bits (representing up to 256MB) integer, the msb is 0 to avoid \"false syncsignals\".\n*/\nexport const uint32SyncSafeToken = {\n\tget: (buffer, offset) => (buffer[offset + 3] & 0x7F) | ((buffer[offset + 2]) << 7) | ((buffer[offset + 1]) << 14) | ((buffer[offset]) << 21),\n\tlen: 4,\n};\n","export const extensions = [\n\t'jpg',\n\t'png',\n\t'apng',\n\t'gif',\n\t'webp',\n\t'flif',\n\t'xcf',\n\t'cr2',\n\t'cr3',\n\t'orf',\n\t'arw',\n\t'dng',\n\t'nef',\n\t'rw2',\n\t'raf',\n\t'tif',\n\t'bmp',\n\t'icns',\n\t'jxr',\n\t'psd',\n\t'indd',\n\t'zip',\n\t'tar',\n\t'rar',\n\t'gz',\n\t'bz2',\n\t'7z',\n\t'dmg',\n\t'mp4',\n\t'mid',\n\t'mkv',\n\t'webm',\n\t'mov',\n\t'avi',\n\t'mpg',\n\t'mp2',\n\t'mp3',\n\t'm4a',\n\t'oga',\n\t'ogg',\n\t'ogv',\n\t'opus',\n\t'flac',\n\t'wav',\n\t'spx',\n\t'amr',\n\t'pdf',\n\t'epub',\n\t'elf',\n\t'macho',\n\t'exe',\n\t'swf',\n\t'rtf',\n\t'wasm',\n\t'woff',\n\t'woff2',\n\t'eot',\n\t'ttf',\n\t'otf',\n\t'ttc',\n\t'ico',\n\t'flv',\n\t'ps',\n\t'xz',\n\t'sqlite',\n\t'nes',\n\t'crx',\n\t'xpi',\n\t'cab',\n\t'deb',\n\t'ar',\n\t'rpm',\n\t'Z',\n\t'lz',\n\t'cfb',\n\t'mxf',\n\t'mts',\n\t'blend',\n\t'bpg',\n\t'docx',\n\t'pptx',\n\t'xlsx',\n\t'3gp',\n\t'3g2',\n\t'j2c',\n\t'jp2',\n\t'jpm',\n\t'jpx',\n\t'mj2',\n\t'aif',\n\t'qcp',\n\t'odt',\n\t'ods',\n\t'odp',\n\t'xml',\n\t'mobi',\n\t'heic',\n\t'cur',\n\t'ktx',\n\t'ape',\n\t'wv',\n\t'dcm',\n\t'ics',\n\t'glb',\n\t'pcap',\n\t'dsf',\n\t'lnk',\n\t'alias',\n\t'voc',\n\t'ac3',\n\t'm4v',\n\t'm4p',\n\t'm4b',\n\t'f4v',\n\t'f4p',\n\t'f4b',\n\t'f4a',\n\t'mie',\n\t'asf',\n\t'ogm',\n\t'ogx',\n\t'mpc',\n\t'arrow',\n\t'shp',\n\t'aac',\n\t'mp1',\n\t'it',\n\t's3m',\n\t'xm',\n\t'skp',\n\t'avif',\n\t'eps',\n\t'lzh',\n\t'pgp',\n\t'asar',\n\t'stl',\n\t'chm',\n\t'3mf',\n\t'zst',\n\t'jxl',\n\t'vcf',\n\t'jls',\n\t'pst',\n\t'dwg',\n\t'parquet',\n\t'class',\n\t'arj',\n\t'cpio',\n\t'ace',\n\t'avro',\n\t'icc',\n\t'fbx',\n\t'vsdx',\n\t'vtt',\n\t'apk',\n\t'drc',\n\t'lz4',\n\t'potx',\n\t'xltx',\n\t'dotx',\n\t'xltm',\n\t'ott',\n\t'ots',\n\t'otp',\n\t'odg',\n\t'otg',\n\t'xlsm',\n\t'docm',\n\t'dotm',\n\t'potm',\n\t'pptm',\n\t'jar',\n\t'jmp',\n\t'rm',\n\t'sav',\n\t'ppsm',\n\t'ppsx',\n\t'tar.gz',\n\t'reg',\n\t'dat',\n];\n\nexport const mimeTypes = [\n\t'image/jpeg',\n\t'image/png',\n\t'image/gif',\n\t'image/webp',\n\t'image/flif',\n\t'image/x-xcf',\n\t'image/x-canon-cr2',\n\t'image/x-canon-cr3',\n\t'image/tiff',\n\t'image/bmp',\n\t'image/vnd.ms-photo',\n\t'image/vnd.adobe.photoshop',\n\t'application/x-indesign',\n\t'application/epub+zip',\n\t'application/x-xpinstall',\n\t'application/vnd.ms-powerpoint.slideshow.macroenabled.12',\n\t'application/vnd.oasis.opendocument.text',\n\t'application/vnd.oasis.opendocument.spreadsheet',\n\t'application/vnd.oasis.opendocument.presentation',\n\t'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n\t'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n\t'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n\t'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\n\t'application/zip',\n\t'application/x-tar',\n\t'application/x-rar-compressed',\n\t'application/gzip',\n\t'application/x-bzip2',\n\t'application/x-7z-compressed',\n\t'application/x-apple-diskimage',\n\t'application/vnd.apache.arrow.file',\n\t'video/mp4',\n\t'audio/midi',\n\t'video/matroska',\n\t'video/webm',\n\t'video/quicktime',\n\t'video/vnd.avi',\n\t'audio/wav',\n\t'audio/qcelp',\n\t'audio/x-ms-asf',\n\t'video/x-ms-asf',\n\t'application/vnd.ms-asf',\n\t'video/mpeg',\n\t'video/3gpp',\n\t'audio/mpeg',\n\t'audio/mp4', // RFC 4337\n\t'video/ogg',\n\t'audio/ogg',\n\t'audio/ogg; codecs=opus',\n\t'application/ogg',\n\t'audio/flac',\n\t'audio/ape',\n\t'audio/wavpack',\n\t'audio/amr',\n\t'application/pdf',\n\t'application/x-elf',\n\t'application/x-mach-binary',\n\t'application/x-msdownload',\n\t'application/x-shockwave-flash',\n\t'application/rtf',\n\t'application/wasm',\n\t'font/woff',\n\t'font/woff2',\n\t'application/vnd.ms-fontobject',\n\t'font/ttf',\n\t'font/otf',\n\t'font/collection',\n\t'image/x-icon',\n\t'video/x-flv',\n\t'application/postscript',\n\t'application/eps',\n\t'application/x-xz',\n\t'application/x-sqlite3',\n\t'application/x-nintendo-nes-rom',\n\t'application/x-google-chrome-extension',\n\t'application/vnd.ms-cab-compressed',\n\t'application/x-deb',\n\t'application/x-unix-archive',\n\t'application/x-rpm',\n\t'application/x-compress',\n\t'application/x-lzip',\n\t'application/x-cfb',\n\t'application/x-mie',\n\t'application/mxf',\n\t'video/mp2t',\n\t'application/x-blender',\n\t'image/bpg',\n\t'image/j2c',\n\t'image/jp2',\n\t'image/jpx',\n\t'image/jpm',\n\t'image/mj2',\n\t'audio/aiff',\n\t'application/xml',\n\t'application/x-mobipocket-ebook',\n\t'image/heif',\n\t'image/heif-sequence',\n\t'image/heic',\n\t'image/heic-sequence',\n\t'image/icns',\n\t'image/ktx',\n\t'application/dicom',\n\t'audio/x-musepack',\n\t'text/calendar',\n\t'text/vcard',\n\t'text/vtt',\n\t'model/gltf-binary',\n\t'application/vnd.tcpdump.pcap',\n\t'audio/x-dsf', // Non-standard\n\t'application/x.ms.shortcut', // Invented by us\n\t'application/x.apple.alias', // Invented by us\n\t'audio/x-voc',\n\t'audio/vnd.dolby.dd-raw',\n\t'audio/x-m4a',\n\t'image/apng',\n\t'image/x-olympus-orf',\n\t'image/x-sony-arw',\n\t'image/x-adobe-dng',\n\t'image/x-nikon-nef',\n\t'image/x-panasonic-rw2',\n\t'image/x-fujifilm-raf',\n\t'video/x-m4v',\n\t'video/3gpp2',\n\t'application/x-esri-shape',\n\t'audio/aac',\n\t'audio/x-it',\n\t'audio/x-s3m',\n\t'audio/x-xm',\n\t'video/MP1S',\n\t'video/MP2P',\n\t'application/vnd.sketchup.skp',\n\t'image/avif',\n\t'application/x-lzh-compressed',\n\t'application/pgp-encrypted',\n\t'application/x-asar',\n\t'model/stl',\n\t'application/vnd.ms-htmlhelp',\n\t'model/3mf',\n\t'image/jxl',\n\t'application/zstd',\n\t'image/jls',\n\t'application/vnd.ms-outlook',\n\t'image/vnd.dwg',\n\t'application/vnd.apache.parquet',\n\t'application/java-vm',\n\t'application/x-arj',\n\t'application/x-cpio',\n\t'application/x-ace-compressed',\n\t'application/avro',\n\t'application/vnd.iccprofile',\n\t'application/x.autodesk.fbx', // Invented by us\n\t'application/vnd.visio',\n\t'application/vnd.android.package-archive',\n\t'application/vnd.google.draco', // Invented by us\n\t'application/x-lz4', // Invented by us\n\t'application/vnd.openxmlformats-officedocument.presentationml.template',\n\t'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\n\t'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\n\t'application/vnd.ms-excel.template.macroenabled.12',\n\t'application/vnd.oasis.opendocument.text-template',\n\t'application/vnd.oasis.opendocument.spreadsheet-template',\n\t'application/vnd.oasis.opendocument.presentation-template',\n\t'application/vnd.oasis.opendocument.graphics',\n\t'application/vnd.oasis.opendocument.graphics-template',\n\t'application/vnd.ms-excel.sheet.macroenabled.12',\n\t'application/vnd.ms-word.document.macroenabled.12',\n\t'application/vnd.ms-word.template.macroenabled.12',\n\t'application/vnd.ms-powerpoint.template.macroenabled.12',\n\t'application/vnd.ms-powerpoint.presentation.macroenabled.12',\n\t'application/java-archive',\n\t'application/vnd.rn-realmedia',\n\t'application/x-spss-sav',\n\t'application/x-ms-regedit',\n\t'application/x-ft-windows-registry-hive',\n\t'application/x-jmp-data',\n];\n","import { TrackTypeValueToKeyMap, } from '../type.js';\nimport initDebug from 'debug';\nimport { isSingleton, isUnique } from './GenericTagTypes.js';\nimport { CombinedTagMapper } from './CombinedTagMapper.js';\nimport { CommonTagMapper } from './GenericTagMapper.js';\nimport { toRatio } from './Util.js';\nimport { fileTypeFromBuffer } from 'file-type';\nimport { parseLyrics } from '../lrc/LyricsParser.js';\nconst debug = initDebug('music-metadata:collector');\nconst TagPriority = ['matroska', 'APEv2', 'vorbis', 'ID3v2.4', 'ID3v2.3', 'ID3v2.2', 'exif', 'asf', 'iTunes', 'AIFF', 'ID3v1'];\n/**\n * Provided to the parser to uodate the metadata result.\n * Responsible for triggering async updates\n */\nexport class MetadataCollector {\n constructor(opts) {\n this.format = {\n tagTypes: [],\n trackInfo: []\n };\n this.native = {};\n this.common = {\n track: { no: null, of: null },\n disk: { no: null, of: null },\n movementIndex: { no: null, of: null }\n };\n this.quality = {\n warnings: []\n };\n /**\n * Keeps track of origin priority for each mapped id\n */\n this.commonOrigin = {};\n /**\n * Maps a tag type to a priority\n */\n this.originPriority = {};\n this.tagMapper = new CombinedTagMapper();\n this.opts = opts;\n let priority = 1;\n for (const tagType of TagPriority) {\n this.originPriority[tagType] = priority++;\n }\n this.originPriority.artificial = 500; // Filled using alternative tags\n this.originPriority.id3v1 = 600; // Consider as the worst because of the field length limit\n }\n /**\n * @returns {boolean} true if one or more tags have been found\n */\n hasAny() {\n return Object.keys(this.native).length > 0;\n }\n addStreamInfo(streamInfo) {\n debug(`streamInfo: type=${streamInfo.type ? TrackTypeValueToKeyMap[streamInfo.type] : '?'}, codec=${streamInfo.codecName}`);\n this.format.trackInfo.push(streamInfo);\n }\n setFormat(key, value) {\n debug(`format: ${key} = ${value}`);\n this.format[key] = value; // as any to override readonly\n if (this.opts?.observer) {\n this.opts.observer({ metadata: this, tag: { type: 'format', id: key, value } });\n }\n }\n setAudioOnly() {\n this.setFormat('hasAudio', true);\n this.setFormat('hasVideo', false);\n }\n async addTag(tagType, tagId, value) {\n debug(`tag ${tagType}.${tagId} = ${value}`);\n if (!this.native[tagType]) {\n this.format.tagTypes.push(tagType);\n this.native[tagType] = [];\n }\n this.native[tagType].push({ id: tagId, value });\n await this.toCommon(tagType, tagId, value);\n }\n addWarning(warning) {\n this.quality.warnings.push({ message: warning });\n }\n async postMap(tagType, tag) {\n // Common tag (alias) found\n // check if we need to do something special with common tag\n // if the event has been aliased then we need to clean it before\n // it is emitted to the user. e.g. genre (20) -> Electronic\n switch (tag.id) {\n case 'artist':\n return this.handleSingularArtistTag(tagType, tag, 'artist', 'artists');\n case 'albumartist':\n return this.handleSingularArtistTag(tagType, tag, 'albumartist', 'albumartists');\n case 'artists':\n return this.handlePluralArtistTag(tagType, tag, 'artist', 'artists');\n case 'albumartists':\n return this.handlePluralArtistTag(tagType, tag, 'albumartist', 'albumartists');\n case 'picture':\n return this.postFixPicture(tag.value).then(picture => {\n if (picture !== null) {\n tag.value = picture;\n this.setGenericTag(tagType, tag);\n }\n });\n case 'totaltracks':\n this.common.track.of = CommonTagMapper.toIntOrNull(tag.value);\n return;\n case 'totaldiscs':\n this.common.disk.of = CommonTagMapper.toIntOrNull(tag.value);\n return;\n case 'movementTotal':\n this.common.movementIndex.of = CommonTagMapper.toIntOrNull(tag.value);\n return;\n case 'track':\n case 'disk':\n case 'movementIndex': {\n const of = this.common[tag.id].of; // store of value, maybe maybe overwritten\n this.common[tag.id] = CommonTagMapper.normalizeTrack(tag.value);\n this.common[tag.id].of = of != null ? of : this.common[tag.id].of;\n return;\n }\n case 'bpm':\n case 'year':\n case 'originalyear':\n tag.value = Number.parseInt(tag.value, 10);\n break;\n case 'date': {\n // ToDo: be more strict on 'YYYY...'\n const year = Number.parseInt(tag.value.substr(0, 4), 10);\n if (!Number.isNaN(year)) {\n this.common.year = year;\n }\n break;\n }\n case 'discogs_label_id':\n case 'discogs_release_id':\n case 'discogs_master_release_id':\n case 'discogs_artist_id':\n case 'discogs_votes':\n tag.value = typeof tag.value === 'string' ? Number.parseInt(tag.value, 10) : tag.value;\n break;\n case 'replaygain_track_gain':\n case 'replaygain_track_peak':\n case 'replaygain_album_gain':\n case 'replaygain_album_peak':\n tag.value = toRatio(tag.value);\n break;\n case 'replaygain_track_minmax':\n tag.value = tag.value.split(',').map(v => Number.parseInt(v, 10));\n break;\n case 'replaygain_undo': {\n const minMix = tag.value.split(',').map(v => Number.parseInt(v, 10));\n tag.value = {\n leftChannel: minMix[0],\n rightChannel: minMix[1]\n };\n break;\n }\n case 'gapless': // iTunes gap-less flag\n case 'compilation':\n case 'podcast':\n case 'showMovement':\n tag.value = tag.value === '1' || tag.value === 1; // boolean\n break;\n case 'isrc': { // Only keep unique values\n const commonTag = this.common[tag.id];\n if (commonTag && commonTag.indexOf(tag.value) !== -1)\n return;\n break;\n }\n case 'comment':\n if (typeof tag.value === 'string') {\n tag.value = { text: tag.value };\n }\n if (tag.value.descriptor === 'iTunPGAP') {\n this.setGenericTag(tagType, { id: 'gapless', value: tag.value.text === '1' });\n }\n break;\n case 'lyrics':\n if (typeof tag.value === 'string') {\n tag.value = parseLyrics(tag.value);\n }\n break;\n default:\n // nothing to do\n }\n if (tag.value !== null) {\n this.setGenericTag(tagType, tag);\n }\n }\n /**\n * Convert native tags to common tags\n * @returns {IAudioMetadata} Native + common tags\n */\n toCommonMetadata() {\n return {\n format: this.format,\n native: this.native,\n quality: this.quality,\n common: this.common\n };\n }\n /**\n * Handle singular artist tags (artist, albumartist) and cross-populate to plural form\n */\n handleSingularArtistTag(tagType, tag, singularId, pluralId) {\n if (this.commonOrigin[singularId] === this.originPriority[tagType]) {\n // Assume the singular field is used as plural (multiple values from same source)\n return this.postMap('artificial', { id: pluralId, value: tag.value });\n }\n if (!this.common[pluralId]) {\n // Fill plural using singular source\n this.setGenericTag('artificial', { id: pluralId, value: tag.value });\n }\n this.setGenericTag(tagType, tag);\n }\n /**\n * Handle plural artist tags (artists, albumartists) and cross-populate to singular form\n */\n handlePluralArtistTag(tagType, tag, singularId, pluralId) {\n if (!this.common[singularId] || this.commonOrigin[singularId] === this.originPriority.artificial) {\n if (!this.common[pluralId] || this.common[pluralId].indexOf(tag.value) === -1) {\n // Fill singular using plural source\n const values = (this.common[pluralId] || []).concat([tag.value]);\n const value = joinArtists(values);\n this.setGenericTag('artificial', { id: singularId, value });\n }\n }\n this.setGenericTag(tagType, tag);\n }\n /**\n * Fix some common issues with picture object\n * @param picture Picture\n */\n async postFixPicture(picture) {\n if (picture.data && picture.data.length > 0) {\n if (!picture.format) {\n const fileType = await fileTypeFromBuffer(Uint8Array.from(picture.data)); // ToDO: remove Buffer\n if (fileType) {\n picture.format = fileType.mime;\n }\n else {\n return null;\n }\n }\n picture.format = picture.format.toLocaleLowerCase();\n switch (picture.format) {\n case 'image/jpg':\n picture.format = 'image/jpeg'; // ToDo: register warning\n }\n return picture;\n }\n this.addWarning(\"Empty picture tag found\");\n return null;\n }\n /**\n * Convert native tag to common tags\n */\n async toCommon(tagType, tagId, value) {\n const tag = { id: tagId, value };\n const genericTag = this.tagMapper.mapTag(tagType, tag, this);\n if (genericTag) {\n await this.postMap(tagType, genericTag);\n }\n }\n /**\n * Set generic tag\n */\n setGenericTag(tagType, tag) {\n debug(`common.${tag.id} = ${tag.value}`);\n const prio0 = this.commonOrigin[tag.id] || 1000;\n const prio1 = this.originPriority[tagType];\n if (isSingleton(tag.id)) {\n if (prio1 <= prio0) {\n this.common[tag.id] = tag.value;\n this.commonOrigin[tag.id] = prio1;\n }\n else {\n return debug(`Ignore native tag (singleton): ${tagType}.${tag.id} = ${tag.value}`);\n }\n }\n else {\n if (prio1 === prio0) {\n if (!isUnique(tag.id) || this.common[tag.id].indexOf(tag.value) === -1) {\n this.common[tag.id].push(tag.value);\n }\n else {\n debug(`Ignore duplicate value: ${tagType}.${tag.id} = ${tag.value}`);\n }\n // no effect? this.commonOrigin[tag.id] = prio1;\n }\n else if (prio1 < prio0) {\n this.common[tag.id] = [tag.value];\n this.commonOrigin[tag.id] = prio1;\n }\n else {\n return debug(`Ignore native tag (list): ${tagType}.${tag.id} = ${tag.value}`);\n }\n }\n if (this.opts?.observer) {\n this.opts.observer({ metadata: this, tag: { type: 'common', id: tag.id, value: tag.value } });\n }\n // ToDo: trigger metadata event\n }\n}\nexport function joinArtists(artists) {\n if (artists.length > 2) {\n return `${artists.slice(0, artists.length - 1).join(', ')} & ${artists[artists.length - 1]}`;\n }\n return artists.join(' & ');\n}\n","const defaultTagInfo = {\n multiple: false,\n};\nconst commonTags = {\n year: defaultTagInfo,\n track: defaultTagInfo,\n disk: defaultTagInfo,\n title: defaultTagInfo,\n artist: defaultTagInfo,\n artists: { multiple: true, unique: true },\n albumartist: defaultTagInfo,\n albumartists: { multiple: true, unique: true },\n album: defaultTagInfo,\n date: defaultTagInfo,\n originaldate: defaultTagInfo,\n originalyear: defaultTagInfo,\n releasedate: defaultTagInfo,\n comment: { multiple: true, unique: false },\n genre: { multiple: true, unique: true },\n picture: { multiple: true, unique: true },\n composer: { multiple: true, unique: true },\n lyrics: { multiple: true, unique: false },\n albumsort: { multiple: false, unique: true },\n titlesort: { multiple: false, unique: true },\n work: { multiple: false, unique: true },\n artistsort: { multiple: false, unique: true },\n albumartistsort: { multiple: false, unique: true },\n composersort: { multiple: false, unique: true },\n lyricist: { multiple: true, unique: true },\n writer: { multiple: true, unique: true },\n conductor: { multiple: true, unique: true },\n remixer: { multiple: true, unique: true },\n arranger: { multiple: true, unique: true },\n engineer: { multiple: true, unique: true },\n producer: { multiple: true, unique: true },\n technician: { multiple: true, unique: true },\n djmixer: { multiple: true, unique: true },\n mixer: { multiple: true, unique: true },\n label: { multiple: true, unique: true },\n grouping: defaultTagInfo,\n subtitle: { multiple: true },\n discsubtitle: defaultTagInfo,\n totaltracks: defaultTagInfo,\n totaldiscs: defaultTagInfo,\n compilation: defaultTagInfo,\n rating: { multiple: true },\n bpm: defaultTagInfo,\n mood: defaultTagInfo,\n media: defaultTagInfo,\n catalognumber: { multiple: true, unique: true },\n tvShow: defaultTagInfo,\n tvShowSort: defaultTagInfo,\n tvSeason: defaultTagInfo,\n tvEpisode: defaultTagInfo,\n tvEpisodeId: defaultTagInfo,\n tvNetwork: defaultTagInfo,\n podcast: defaultTagInfo,\n podcasturl: defaultTagInfo,\n releasestatus: defaultTagInfo,\n releasetype: { multiple: true },\n releasecountry: defaultTagInfo,\n script: defaultTagInfo,\n language: defaultTagInfo,\n copyright: defaultTagInfo,\n license: defaultTagInfo,\n encodedby: defaultTagInfo,\n encodersettings: defaultTagInfo,\n gapless: defaultTagInfo,\n barcode: defaultTagInfo,\n isrc: { multiple: true },\n asin: defaultTagInfo,\n musicbrainz_recordingid: defaultTagInfo,\n musicbrainz_trackid: defaultTagInfo,\n musicbrainz_albumid: defaultTagInfo,\n musicbrainz_artistid: { multiple: true },\n musicbrainz_albumartistid: { multiple: true },\n musicbrainz_releasegroupid: defaultTagInfo,\n musicbrainz_workid: defaultTagInfo,\n musicbrainz_trmid: defaultTagInfo,\n musicbrainz_discid: defaultTagInfo,\n acoustid_id: defaultTagInfo,\n acoustid_fingerprint: defaultTagInfo,\n musicip_puid: defaultTagInfo,\n musicip_fingerprint: defaultTagInfo,\n website: defaultTagInfo,\n 'performer:instrument': { multiple: true, unique: true },\n averageLevel: defaultTagInfo,\n peakLevel: defaultTagInfo,\n notes: { multiple: true, unique: false },\n key: defaultTagInfo,\n originalalbum: defaultTagInfo,\n originalartist: defaultTagInfo,\n discogs_artist_id: { multiple: true, unique: true },\n discogs_release_id: defaultTagInfo,\n discogs_label_id: defaultTagInfo,\n discogs_master_release_id: defaultTagInfo,\n discogs_votes: defaultTagInfo,\n discogs_rating: defaultTagInfo,\n replaygain_track_peak: defaultTagInfo,\n replaygain_track_gain: defaultTagInfo,\n replaygain_album_peak: defaultTagInfo,\n replaygain_album_gain: defaultTagInfo,\n replaygain_track_minmax: defaultTagInfo,\n replaygain_album_minmax: defaultTagInfo,\n replaygain_undo: defaultTagInfo,\n description: { multiple: true },\n longDescription: defaultTagInfo,\n category: { multiple: true },\n hdVideo: defaultTagInfo,\n keywords: { multiple: true },\n movement: defaultTagInfo,\n movementIndex: defaultTagInfo,\n movementTotal: defaultTagInfo,\n podcastId: defaultTagInfo,\n showMovement: defaultTagInfo,\n stik: defaultTagInfo,\n playCounter: defaultTagInfo\n};\nexport const commonTagsKeys = /* @__PURE__ */ Object.keys(commonTags);\n/**\n * @param alias Name of common tag\n * @returns {boolean|*} true if given alias is mapped as a singleton', otherwise false\n */\nexport function isSingleton(alias) {\n return commonTags[alias] && !commonTags[alias].multiple;\n}\n/**\n * @param alias Common (generic) tag\n * @returns {boolean|*} true if given alias is a singleton or explicitly marked as unique\n */\nexport function isUnique(alias) {\n return !commonTags[alias].multiple || commonTags[alias].unique || false;\n}\n","import { ID3v1TagMapper } from '../id3v1/ID3v1TagMap.js';\nimport { ID3v24TagMapper } from '../id3v2/ID3v24TagMapper.js';\nimport { AsfTagMapper } from '../asf/AsfTagMapper.js';\nimport { ID3v22TagMapper } from '../id3v2/ID3v22TagMapper.js';\nimport { APEv2TagMapper } from '../apev2/APEv2TagMapper.js';\nimport { MP4TagMapper } from '../mp4/MP4TagMapper.js';\nimport { VorbisTagMapper } from '../ogg/vorbis/VorbisTagMapper.js';\nimport { RiffInfoTagMapper } from '../riff/RiffInfoTagMap.js';\nimport { MatroskaTagMapper } from '../matroska/MatroskaTagMapper.js';\nimport { AiffTagMapper } from '../aiff/AiffTagMap.js';\nimport { InternalParserError } from '../ParseError.js';\nexport class CombinedTagMapper {\n constructor() {\n this.tagMappers = {};\n [\n new ID3v1TagMapper(),\n new ID3v22TagMapper(),\n new ID3v24TagMapper(),\n new MP4TagMapper(),\n new MP4TagMapper(),\n new VorbisTagMapper(),\n new APEv2TagMapper(),\n new AsfTagMapper(),\n new RiffInfoTagMapper(),\n new MatroskaTagMapper(),\n new AiffTagMapper()\n ].forEach(mapper => {\n this.registerTagMapper(mapper);\n });\n }\n /**\n * Convert native to generic (common) tags\n * @param tagType Originating tag format\n * @param tag Native tag to map to a generic tag id\n * @param warnings\n * @return Generic tag result (output of this function)\n */\n mapTag(tagType, tag, warnings) {\n const tagMapper = this.tagMappers[tagType];\n if (tagMapper) {\n return this.tagMappers[tagType].mapGenericTag(tag, warnings);\n }\n throw new InternalParserError(`No generic tag mapper defined for tag-format: ${tagType}`);\n }\n registerTagMapper(genericTagMapper) {\n for (const tagType of genericTagMapper.tagTypes) {\n this.tagMappers[tagType] = genericTagMapper;\n }\n }\n}\n","import { CommonTagMapper } from '../common/GenericTagMapper.js';\n/**\n * ID3v1 tag mappings\n */\nconst id3v1TagMap = {\n title: 'title',\n artist: 'artist',\n album: 'album',\n year: 'year',\n comment: 'comment',\n track: 'track',\n genre: 'genre'\n};\nexport class ID3v1TagMapper extends CommonTagMapper {\n constructor() {\n super(['ID3v1'], id3v1TagMap);\n }\n}\n","export class CommonTagMapper {\n static toIntOrNull(str) {\n const cleaned = Number.parseInt(str, 10);\n return Number.isNaN(cleaned) ? null : cleaned;\n }\n // TODO: a string of 1of1 would fail to be converted\n // converts 1/10 to no : 1, of : 10\n // or 1 to no : 1, of : 0\n static normalizeTrack(origVal) {\n const split = origVal.toString().split('/');\n return {\n no: Number.parseInt(split[0], 10) || null,\n of: Number.parseInt(split[1], 10) || null\n };\n }\n constructor(tagTypes, tagMap) {\n this.tagTypes = tagTypes;\n this.tagMap = tagMap;\n }\n /**\n * Process and set common tags\n * write common tags to\n * @param tag Native tag\n * @param warnings Register warnings\n * @return common name\n */\n mapGenericTag(tag, warnings) {\n tag = { id: tag.id, value: tag.value }; // clone object\n this.postMap(tag, warnings);\n // Convert native tag event to generic 'alias' tag\n const id = this.getCommonName(tag.id);\n return id ? { id, value: tag.value } : null;\n }\n /**\n * Convert native tag key to common tag key\n * @param tag Native header tag\n * @return common tag name (alias)\n */\n getCommonName(tag) {\n return this.tagMap[tag];\n }\n /**\n * Handle post mapping exceptions / correction\n * @param tag Tag e.g. {\"©alb\", \"Buena Vista Social Club\")\n * @param warnings Used to register warnings\n */\n postMap(_tag, _warnings) {\n return;\n }\n}\nCommonTagMapper.maxRatingScore = 1;\n","import { UINT32_LE } from 'token-types';\nimport { CommonTagMapper } from '../common/GenericTagMapper.js';\nimport { CaseInsensitiveTagMap } from '../common/CaseInsensitiveTagMap.js';\nimport { decodeString } from '../common/Util.js';\n/**\n * ID3v2.3/ID3v2.4 tag mappings\n */\nconst id3v24TagMap = {\n // id3v2.3\n TIT2: 'title',\n TPE1: 'artist',\n 'TXXX:Artists': 'artists',\n TPE2: 'albumartist',\n TALB: 'album',\n TDRV: 'date', // [ 'date', 'year' ] ToDo: improve 'year' mapping\n /**\n * Original release year\n */\n TORY: 'originalyear',\n TPOS: 'disk',\n TCON: 'genre',\n APIC: 'picture',\n TCOM: 'composer',\n USLT: 'lyrics',\n TSOA: 'albumsort',\n TSOT: 'titlesort',\n TOAL: 'originalalbum',\n TSOP: 'artistsort',\n TSO2: 'albumartistsort',\n TSOC: 'composersort',\n TEXT: 'lyricist',\n 'TXXX:Writer': 'writer',\n TPE3: 'conductor',\n // 'IPLS:instrument': 'performer:instrument', // ToDo\n TPE4: 'remixer',\n 'IPLS:arranger': 'arranger',\n 'IPLS:engineer': 'engineer',\n 'IPLS:producer': 'producer',\n 'IPLS:DJ-mix': 'djmixer',\n 'IPLS:mix': 'mixer',\n TPUB: 'label',\n TIT1: 'grouping',\n TIT3: 'subtitle',\n TRCK: 'track',\n TCMP: 'compilation',\n POPM: 'rating',\n TBPM: 'bpm',\n TMED: 'media',\n 'TXXX:CATALOGNUMBER': 'catalognumber',\n 'TXXX:MusicBrainz Album Status': 'releasestatus',\n 'TXXX:MusicBrainz Album Type': 'releasetype',\n /**\n * Release country as documented: https://picard.musicbrainz.org/docs/mappings/#cite_note-0\n */\n 'TXXX:MusicBrainz Album Release Country': 'releasecountry',\n /**\n * Release country as implemented // ToDo: report\n */\n 'TXXX:RELEASECOUNTRY': 'releasecountry',\n 'TXXX:SCRIPT': 'script',\n TLAN: 'language',\n TCOP: 'copyright',\n WCOP: 'license',\n TENC: 'encodedby',\n TSSE: 'encodersettings',\n 'TXXX:BARCODE': 'barcode',\n 'TXXX:ISRC': 'isrc',\n TSRC: 'isrc',\n 'TXXX:ASIN': 'asin',\n 'TXXX:originalyear': 'originalyear',\n 'UFID:http://musicbrainz.org': 'musicbrainz_recordingid',\n 'TXXX:MusicBrainz Release Track Id': 'musicbrainz_trackid',\n 'TXXX:MusicBrainz Album Id': 'musicbrainz_albumid',\n 'TXXX:MusicBrainz Artist Id': 'musicbrainz_artistid',\n 'TXXX:MusicBrainz Album Artist Id': 'musicbrainz_albumartistid',\n 'TXXX:MusicBrainz Release Group Id': 'musicbrainz_releasegroupid',\n 'TXXX:MusicBrainz Work Id': 'musicbrainz_workid',\n 'TXXX:MusicBrainz TRM Id': 'musicbrainz_trmid',\n 'TXXX:MusicBrainz Disc Id': 'musicbrainz_discid',\n 'TXXX:ACOUSTID_ID': 'acoustid_id',\n 'TXXX:Acoustid Id': 'acoustid_id',\n 'TXXX:Acoustid Fingerprint': 'acoustid_fingerprint',\n 'TXXX:MusicIP PUID': 'musicip_puid',\n 'TXXX:MusicMagic Fingerprint': 'musicip_fingerprint',\n WOAR: 'website',\n // id3v2.4\n // ToDo: In same sequence as defined at http://id3.org/id3v2.4.0-frames\n TDRC: 'date', // date YYYY-MM-DD\n TYER: 'year',\n TDOR: 'originaldate',\n // 'TMCL:instrument': 'performer:instrument',\n 'TIPL:arranger': 'arranger',\n 'TIPL:engineer': 'engineer',\n 'TIPL:producer': 'producer',\n 'TIPL:DJ-mix': 'djmixer',\n 'TIPL:mix': 'mixer',\n TMOO: 'mood',\n // additional mappings:\n SYLT: 'lyrics',\n TSST: 'discsubtitle',\n TKEY: 'key',\n COMM: 'comment',\n TOPE: 'originalartist',\n // Windows Media Player\n 'PRIV:AverageLevel': 'averageLevel',\n 'PRIV:PeakLevel': 'peakLevel',\n // Discogs\n 'TXXX:DISCOGS_ARTIST_ID': 'discogs_artist_id',\n 'TXXX:DISCOGS_ARTISTS': 'artists',\n 'TXXX:DISCOGS_ARTIST_NAME': 'artists',\n 'TXXX:DISCOGS_ALBUM_ARTISTS': 'albumartist',\n 'TXXX:DISCOGS_CATALOG': 'catalognumber',\n 'TXXX:DISCOGS_COUNTRY': 'releasecountry',\n 'TXXX:DISCOGS_DATE': 'originaldate',\n 'TXXX:DISCOGS_LABEL': 'label',\n 'TXXX:DISCOGS_LABEL_ID': 'discogs_label_id',\n 'TXXX:DISCOGS_MASTER_RELEASE_ID': 'discogs_master_release_id',\n 'TXXX:DISCOGS_RATING': 'discogs_rating',\n 'TXXX:DISCOGS_RELEASED': 'date',\n 'TXXX:DISCOGS_RELEASE_ID': 'discogs_release_id',\n 'TXXX:DISCOGS_VOTES': 'discogs_votes',\n 'TXXX:CATALOGID': 'catalognumber',\n 'TXXX:STYLE': 'genre',\n 'TXXX:REPLAYGAIN_TRACK_PEAK': 'replaygain_track_peak',\n 'TXXX:REPLAYGAIN_TRACK_GAIN': 'replaygain_track_gain',\n 'TXXX:REPLAYGAIN_ALBUM_PEAK': 'replaygain_album_peak',\n 'TXXX:REPLAYGAIN_ALBUM_GAIN': 'replaygain_album_gain',\n 'TXXX:MP3GAIN_MINMAX': 'replaygain_track_minmax',\n 'TXXX:MP3GAIN_ALBUM_MINMAX': 'replaygain_album_minmax',\n 'TXXX:MP3GAIN_UNDO': 'replaygain_undo',\n MVNM: 'movement',\n MVIN: 'movementIndex',\n PCST: 'podcast',\n TCAT: 'category',\n TDES: 'description',\n TDRL: 'releasedate',\n TGID: 'podcastId',\n TKWD: 'keywords',\n WFED: 'podcasturl',\n GRP1: 'grouping',\n PCNT: 'playCounter',\n};\nexport class ID3v24TagMapper extends CaseInsensitiveTagMap {\n static toRating(popm) {\n return {\n source: popm.email,\n rating: popm.rating > 0 ? (popm.rating - 1) / 254 * CommonTagMapper.maxRatingScore : undefined\n };\n }\n constructor() {\n super(['ID3v2.3', 'ID3v2.4'], id3v24TagMap);\n }\n /**\n * Handle post mapping exceptions / correction\n * @param tag to post map\n * @param warnings Wil be used to register (collect) warnings\n */\n postMap(tag, warnings) {\n switch (tag.id) {\n case 'UFID':\n {\n // decode MusicBrainz Recording Id\n const idTag = tag.value;\n if (idTag.owner_identifier === 'http://musicbrainz.org') {\n tag.id += `:${idTag.owner_identifier}`;\n tag.value = decodeString(idTag.identifier, 'latin1'); // latin1 == iso-8859-1\n }\n }\n break;\n case 'PRIV':\n {\n const customTag = tag.value;\n switch (customTag.owner_identifier) {\n // decode Windows Media Player\n case 'AverageLevel':\n case 'PeakValue':\n tag.id += `:${customTag.owner_identifier}`;\n tag.value = customTag.data.length === 4 ? UINT32_LE.get(customTag.data, 0) : null;\n if (tag.value === null) {\n warnings.addWarning('Failed to parse PRIV:PeakValue');\n }\n break;\n default:\n warnings.addWarning(`Unknown PRIV owner-identifier: ${customTag.data}`);\n }\n }\n break;\n case 'POPM':\n tag.value = ID3v24TagMapper.toRating(tag.value);\n break;\n default:\n break;\n }\n }\n}\n","import { CommonTagMapper } from './GenericTagMapper.js';\nexport class CaseInsensitiveTagMap extends CommonTagMapper {\n constructor(tagTypes, tagMap) {\n const upperCaseMap = {};\n for (const tag of Object.keys(tagMap)) {\n upperCaseMap[tag.toUpperCase()] = tagMap[tag];\n }\n super(tagTypes, upperCaseMap);\n }\n /**\n * @tag Native header tag\n * @return common tag name (alias)\n */\n getCommonName(tag) {\n return this.tagMap[tag.toUpperCase()];\n }\n}\n","import { CommonTagMapper } from '../common/GenericTagMapper.js';\n/**\n * ASF Metadata tag mappings.\n * See http://msdn.microsoft.com/en-us/library/ms867702.aspx\n */\nconst asfTagMap = {\n Title: 'title',\n Author: 'artist',\n 'WM/AlbumArtist': 'albumartist',\n 'WM/AlbumTitle': 'album',\n 'WM/Year': 'date', // changed to 'year' to 'date' based on Picard mappings; ToDo: check me\n 'WM/OriginalReleaseTime': 'originaldate',\n 'WM/OriginalReleaseYear': 'originalyear',\n Description: 'comment',\n 'WM/TrackNumber': 'track',\n 'WM/PartOfSet': 'disk',\n 'WM/Genre': 'genre',\n 'WM/Composer': 'composer',\n 'WM/Lyrics': 'lyrics',\n 'WM/AlbumSortOrder': 'albumsort',\n 'WM/TitleSortOrder': 'titlesort',\n 'WM/ArtistSortOrder': 'artistsort',\n 'WM/AlbumArtistSortOrder': 'albumartistsort',\n 'WM/ComposerSortOrder': 'composersort',\n 'WM/Writer': 'lyricist',\n 'WM/Conductor': 'conductor',\n 'WM/ModifiedBy': 'remixer',\n 'WM/Engineer': 'engineer',\n 'WM/Producer': 'producer',\n 'WM/DJMixer': 'djmixer',\n 'WM/Mixer': 'mixer',\n 'WM/Publisher': 'label',\n 'WM/ContentGroupDescription': 'grouping',\n 'WM/SubTitle': 'subtitle',\n 'WM/SetSubTitle': 'discsubtitle',\n // 'WM/PartOfSet': 'totaldiscs',\n 'WM/IsCompilation': 'compilation',\n 'WM/SharedUserRating': 'rating',\n 'WM/BeatsPerMinute': 'bpm',\n 'WM/Mood': 'mood',\n 'WM/Media': 'media',\n 'WM/CatalogNo': 'catalognumber',\n 'MusicBrainz/Album Status': 'releasestatus',\n 'MusicBrainz/Album Type': 'releasetype',\n 'MusicBrainz/Album Release Country': 'releasecountry',\n 'WM/Script': 'script',\n 'WM/Language': 'language',\n Copyright: 'copyright',\n LICENSE: 'license',\n 'WM/EncodedBy': 'encodedby',\n 'WM/EncodingSettings': 'encodersettings',\n 'WM/Barcode': 'barcode',\n 'WM/ISRC': 'isrc',\n 'MusicBrainz/Track Id': 'musicbrainz_recordingid',\n 'MusicBrainz/Release Track Id': 'musicbrainz_trackid',\n 'MusicBrainz/Album Id': 'musicbrainz_albumid',\n 'MusicBrainz/Artist Id': 'musicbrainz_artistid',\n 'MusicBrainz/Album Artist Id': 'musicbrainz_albumartistid',\n 'MusicBrainz/Release Group Id': 'musicbrainz_releasegroupid',\n 'MusicBrainz/Work Id': 'musicbrainz_workid',\n 'MusicBrainz/TRM Id': 'musicbrainz_trmid',\n 'MusicBrainz/Disc Id': 'musicbrainz_discid',\n 'Acoustid/Id': 'acoustid_id',\n 'Acoustid/Fingerprint': 'acoustid_fingerprint',\n 'MusicIP/PUID': 'musicip_puid',\n 'WM/ARTISTS': 'artists',\n 'WM/InitialKey': 'key',\n ASIN: 'asin',\n 'WM/Work': 'work',\n 'WM/AuthorURL': 'website',\n 'WM/Picture': 'picture'\n};\nexport class AsfTagMapper extends CommonTagMapper {\n static toRating(rating) {\n return {\n rating: Number.parseFloat(rating + 1) / 5\n };\n }\n constructor() {\n super(['asf'], asfTagMap);\n }\n postMap(tag) {\n switch (tag.id) {\n case 'WM/SharedUserRating': {\n const keys = tag.id.split(':');\n tag.value = AsfTagMapper.toRating(tag.value);\n tag.id = keys[0];\n break;\n }\n }\n }\n}\n","import { CaseInsensitiveTagMap } from '../common/CaseInsensitiveTagMap.js';\n/**\n * ID3v2.2 tag mappings\n */\nexport const id3v22TagMap = {\n TT2: 'title',\n TP1: 'artist',\n TP2: 'albumartist',\n TAL: 'album',\n TYE: 'year',\n COM: 'comment',\n TRK: 'track',\n TPA: 'disk',\n TCO: 'genre',\n PIC: 'picture',\n TCM: 'composer',\n TOR: 'originaldate',\n TOT: 'originalalbum',\n TXT: 'lyricist',\n TP3: 'conductor',\n TPB: 'label',\n TT1: 'grouping',\n TT3: 'subtitle',\n TLA: 'language',\n TCR: 'copyright',\n WCP: 'license',\n TEN: 'encodedby',\n TSS: 'encodersettings',\n WAR: 'website',\n PCS: 'podcast',\n TCP: \"compilation\",\n TDR: 'date',\n TS2: 'albumartistsort',\n TSA: 'albumsort',\n TSC: 'composersort',\n TSP: 'artistsort',\n TST: 'titlesort',\n WFD: 'podcasturl',\n TBP: 'bpm',\n GP1: 'grouping'\n};\nexport class ID3v22TagMapper extends CaseInsensitiveTagMap {\n constructor() {\n super(['ID3v2.2'], id3v22TagMap);\n }\n}\n","import { CaseInsensitiveTagMap } from '../common/CaseInsensitiveTagMap.js';\n/**\n * ID3v2.2 tag mappings\n */\nconst apev2TagMap = {\n Title: 'title',\n Artist: 'artist',\n Artists: 'artists',\n 'Album Artist': 'albumartist',\n Album: 'album',\n Year: 'date',\n Originalyear: 'originalyear',\n Originaldate: 'originaldate',\n Releasedate: 'releasedate',\n Comment: 'comment',\n Track: 'track',\n Disc: 'disk',\n DISCNUMBER: 'disk', // ToDo: backwards compatibility', valid tag?\n Genre: 'genre',\n 'Cover Art (Front)': 'picture',\n 'Cover Art (Back)': 'picture',\n Composer: 'composer',\n Lyrics: 'lyrics',\n ALBUMSORT: 'albumsort',\n TITLESORT: 'titlesort',\n WORK: 'work',\n ARTISTSORT: 'artistsort',\n ALBUMARTISTSORT: 'albumartistsort',\n COMPOSERSORT: 'composersort',\n Lyricist: 'lyricist',\n Writer: 'writer',\n Conductor: 'conductor',\n // 'Performer=artist (instrument)': 'performer:instrument',\n MixArtist: 'remixer',\n Arranger: 'arranger',\n Engineer: 'engineer',\n Producer: 'producer',\n DJMixer: 'djmixer',\n Mixer: 'mixer',\n Label: 'label',\n Grouping: 'grouping',\n Subtitle: 'subtitle',\n DiscSubtitle: 'discsubtitle',\n Compilation: 'compilation',\n BPM: 'bpm',\n Mood: 'mood',\n Media: 'media',\n CatalogNumber: 'catalognumber',\n MUSICBRAINZ_ALBUMSTATUS: 'releasestatus',\n MUSICBRAINZ_ALBUMTYPE: 'releasetype',\n RELEASECOUNTRY: 'releasecountry',\n Script: 'script',\n Language: 'language',\n Copyright: 'copyright',\n LICENSE: 'license',\n EncodedBy: 'encodedby',\n EncoderSettings: 'encodersettings',\n Barcode: 'barcode',\n ISRC: 'isrc',\n ASIN: 'asin',\n musicbrainz_trackid: 'musicbrainz_recordingid',\n musicbrainz_releasetrackid: 'musicbrainz_trackid',\n MUSICBRAINZ_ALBUMID: 'musicbrainz_albumid',\n MUSICBRAINZ_ARTISTID: 'musicbrainz_artistid',\n MUSICBRAINZ_ALBUMARTISTID: 'musicbrainz_albumartistid',\n MUSICBRAINZ_RELEASEGROUPID: 'musicbrainz_releasegroupid',\n MUSICBRAINZ_WORKID: 'musicbrainz_workid',\n MUSICBRAINZ_TRMID: 'musicbrainz_trmid',\n MUSICBRAINZ_DISCID: 'musicbrainz_discid',\n Acoustid_Id: 'acoustid_id',\n ACOUSTID_FINGERPRINT: 'acoustid_fingerprint',\n MUSICIP_PUID: 'musicip_puid',\n Weblink: 'website',\n REPLAYGAIN_TRACK_GAIN: 'replaygain_track_gain',\n REPLAYGAIN_TRACK_PEAK: 'replaygain_track_peak',\n MP3GAIN_MINMAX: 'replaygain_track_minmax',\n MP3GAIN_UNDO: 'replaygain_undo'\n};\nexport class APEv2TagMapper extends CaseInsensitiveTagMap {\n constructor() {\n super(['APEv2'], apev2TagMap);\n }\n}\n","import { CaseInsensitiveTagMap } from '../common/CaseInsensitiveTagMap.js';\n/**\n * Ref: https://github.com/sergiomb2/libmp4v2/wiki/iTunesMetadata\n */\nconst mp4TagMap = {\n '©nam': 'title',\n '©ART': 'artist',\n aART: 'albumartist',\n /**\n * ToDo: Album artist seems to be stored here while Picard documentation says: aART\n */\n '----:com.apple.iTunes:Band': 'albumartist',\n '©alb': 'album',\n '©day': 'date',\n '©cmt': 'comment',\n '©com': 'comment',\n trkn: 'track',\n disk: 'disk',\n '©gen': 'genre',\n covr: 'picture',\n '©wrt': 'composer',\n '©lyr': 'lyrics',\n soal: 'albumsort',\n sonm: 'titlesort',\n soar: 'artistsort',\n soaa: 'albumartistsort',\n soco: 'composersort',\n '----:com.apple.iTunes:LYRICIST': 'lyricist',\n '----:com.apple.iTunes:CONDUCTOR': 'conductor',\n '----:com.apple.iTunes:REMIXER': 'remixer',\n '----:com.apple.iTunes:ENGINEER': 'engineer',\n '----:com.apple.iTunes:PRODUCER': 'producer',\n '----:com.apple.iTunes:DJMIXER': 'djmixer',\n '----:com.apple.iTunes:MIXER': 'mixer',\n '----:com.apple.iTunes:LABEL': 'label',\n '©grp': 'grouping',\n '----:com.apple.iTunes:SUBTITLE': 'subtitle',\n '----:com.apple.iTunes:DISCSUBTITLE': 'discsubtitle',\n cpil: 'compilation',\n tmpo: 'bpm',\n '----:com.apple.iTunes:MOOD': 'mood',\n '----:com.apple.iTunes:MEDIA': 'media',\n '----:com.apple.iTunes:CATALOGNUMBER': 'catalognumber',\n tvsh: 'tvShow',\n tvsn: 'tvSeason',\n tves: 'tvEpisode',\n sosn: 'tvShowSort',\n tven: 'tvEpisodeId',\n tvnn: 'tvNetwork',\n pcst: 'podcast',\n purl: 'podcasturl',\n '----:com.apple.iTunes:MusicBrainz Album Status': 'releasestatus',\n '----:com.apple.iTunes:MusicBrainz Album Type': 'releasetype',\n '----:com.apple.iTunes:MusicBrainz Album Release Country': 'releasecountry',\n '----:com.apple.iTunes:SCRIPT': 'script',\n '----:com.apple.iTunes:LANGUAGE': 'language',\n cprt: 'copyright',\n '©cpy': 'copyright',\n '----:com.apple.iTunes:LICENSE': 'license',\n '©too': 'encodedby',\n pgap: 'gapless',\n '----:com.apple.iTunes:BARCODE': 'barcode',\n '----:com.apple.iTunes:ISRC': 'isrc',\n '----:com.apple.iTunes:ASIN': 'asin',\n '----:com.apple.iTunes:NOTES': 'comment',\n '----:com.apple.iTunes:MusicBrainz Track Id': 'musicbrainz_recordingid',\n '----:com.apple.iTunes:MusicBrainz Release Track Id': 'musicbrainz_trackid',\n '----:com.apple.iTunes:MusicBrainz Album Id': 'musicbrainz_albumid',\n '----:com.apple.iTunes:MusicBrainz Artist Id': 'musicbrainz_artistid',\n '----:com.apple.iTunes:MusicBrainz Album Artist Id': 'musicbrainz_albumartistid',\n '----:com.apple.iTunes:MusicBrainz Release Group Id': 'musicbrainz_releasegroupid',\n '----:com.apple.iTunes:MusicBrainz Work Id': 'musicbrainz_workid',\n '----:com.apple.iTunes:MusicBrainz TRM Id': 'musicbrainz_trmid',\n '----:com.apple.iTunes:MusicBrainz Disc Id': 'musicbrainz_discid',\n '----:com.apple.iTunes:Acoustid Id': 'acoustid_id',\n '----:com.apple.iTunes:Acoustid Fingerprint': 'acoustid_fingerprint',\n '----:com.apple.iTunes:MusicIP PUID': 'musicip_puid',\n '----:com.apple.iTunes:fingerprint': 'musicip_fingerprint',\n '----:com.apple.iTunes:replaygain_track_gain': 'replaygain_track_gain',\n '----:com.apple.iTunes:replaygain_track_peak': 'replaygain_track_peak',\n '----:com.apple.iTunes:replaygain_album_gain': 'replaygain_album_gain',\n '----:com.apple.iTunes:replaygain_album_peak': 'replaygain_album_peak',\n '----:com.apple.iTunes:replaygain_track_minmax': 'replaygain_track_minmax',\n '----:com.apple.iTunes:replaygain_album_minmax': 'replaygain_album_minmax',\n '----:com.apple.iTunes:replaygain_undo': 'replaygain_undo',\n // Additional mappings:\n gnre: 'genre', // ToDo: check mapping\n '----:com.apple.iTunes:ALBUMARTISTSORT': 'albumartistsort',\n '----:com.apple.iTunes:ARTISTS': 'artists',\n '----:com.apple.iTunes:ORIGINALDATE': 'originaldate',\n '----:com.apple.iTunes:ORIGINALYEAR': 'originalyear',\n '----:com.apple.iTunes:RELEASEDATE': 'releasedate',\n // '----:com.apple.iTunes:PERFORMER': 'performer'\n desc: 'description',\n ldes: 'longDescription',\n '©mvn': 'movement',\n '©mvi': 'movementIndex',\n '©mvc': 'movementTotal',\n '©wrk': 'work',\n catg: 'category',\n egid: 'podcastId',\n hdvd: 'hdVideo',\n keyw: 'keywords',\n shwm: 'showMovement',\n stik: 'stik',\n rate: 'rating'\n};\nexport const tagType = 'iTunes';\nexport class MP4TagMapper extends CaseInsensitiveTagMap {\n constructor() {\n super([tagType], mp4TagMap);\n }\n postMap(tag, _warnings) {\n switch (tag.id) {\n case 'rate':\n tag.value = {\n source: undefined,\n rating: Number.parseFloat(tag.value) / 100\n };\n break;\n }\n }\n}\n","import { CommonTagMapper } from '../../common/GenericTagMapper.js';\n/**\n * Vorbis tag mappings\n *\n * Mapping from native header format to one or possibly more 'common' entries\n * The common entries aim to read the same information from different media files\n * independent of the underlying format\n */\nconst vorbisTagMap = {\n TITLE: 'title',\n ARTIST: 'artist',\n ARTISTS: 'artists',\n ALBUMARTIST: 'albumartist',\n 'ALBUM ARTIST': 'albumartist',\n ALBUM: 'album',\n DATE: 'date',\n ORIGINALDATE: 'originaldate',\n ORIGINALYEAR: 'originalyear',\n RELEASEDATE: 'releasedate',\n COMMENT: 'comment',\n TRACKNUMBER: 'track',\n DISCNUMBER: 'disk',\n GENRE: 'genre',\n METADATA_BLOCK_PICTURE: 'picture',\n COMPOSER: 'composer',\n LYRICS: 'lyrics',\n ALBUMSORT: 'albumsort',\n TITLESORT: 'titlesort',\n WORK: 'work',\n ARTISTSORT: 'artistsort',\n ALBUMARTISTSORT: 'albumartistsort',\n COMPOSERSORT: 'composersort',\n LYRICIST: 'lyricist',\n WRITER: 'writer',\n CONDUCTOR: 'conductor',\n // 'PERFORMER=artist (instrument)': 'performer:instrument', // ToDo\n REMIXER: 'remixer',\n ARRANGER: 'arranger',\n ENGINEER: 'engineer',\n PRODUCER: 'producer',\n DJMIXER: 'djmixer',\n MIXER: 'mixer',\n LABEL: 'label',\n GROUPING: 'grouping',\n SUBTITLE: 'subtitle',\n DISCSUBTITLE: 'discsubtitle',\n TRACKTOTAL: 'totaltracks',\n DISCTOTAL: 'totaldiscs',\n COMPILATION: 'compilation',\n RATING: 'rating',\n BPM: 'bpm',\n KEY: 'key',\n MOOD: 'mood',\n MEDIA: 'media',\n CATALOGNUMBER: 'catalognumber',\n RELEASESTATUS: 'releasestatus',\n RELEASETYPE: 'releasetype',\n RELEASECOUNTRY: 'releasecountry',\n SCRIPT: 'script',\n LANGUAGE: 'language',\n COPYRIGHT: 'copyright',\n LICENSE: 'license',\n ENCODEDBY: 'encodedby',\n ENCODERSETTINGS: 'encodersettings',\n BARCODE: 'barcode',\n ISRC: 'isrc',\n ASIN: 'asin',\n MUSICBRAINZ_TRACKID: 'musicbrainz_recordingid',\n MUSICBRAINZ_RELEASETRACKID: 'musicbrainz_trackid',\n MUSICBRAINZ_ALBUMID: 'musicbrainz_albumid',\n MUSICBRAINZ_ARTISTID: 'musicbrainz_artistid',\n MUSICBRAINZ_ALBUMARTISTID: 'musicbrainz_albumartistid',\n MUSICBRAINZ_RELEASEGROUPID: 'musicbrainz_releasegroupid',\n MUSICBRAINZ_WORKID: 'musicbrainz_workid',\n MUSICBRAINZ_TRMID: 'musicbrainz_trmid',\n MUSICBRAINZ_DISCID: 'musicbrainz_discid',\n ACOUSTID_ID: 'acoustid_id',\n ACOUSTID_ID_FINGERPRINT: 'acoustid_fingerprint',\n MUSICIP_PUID: 'musicip_puid',\n // 'FINGERPRINT=MusicMagic Fingerprint {fingerprint}': 'musicip_fingerprint', // ToDo\n WEBSITE: 'website',\n NOTES: 'notes',\n TOTALTRACKS: 'totaltracks',\n TOTALDISCS: 'totaldiscs',\n // Discogs\n DISCOGS_ARTIST_ID: 'discogs_artist_id',\n DISCOGS_ARTISTS: 'artists',\n DISCOGS_ARTIST_NAME: 'artists',\n DISCOGS_ALBUM_ARTISTS: 'albumartist',\n DISCOGS_CATALOG: 'catalognumber',\n DISCOGS_COUNTRY: 'releasecountry',\n DISCOGS_DATE: 'originaldate',\n DISCOGS_LABEL: 'label',\n DISCOGS_LABEL_ID: 'discogs_label_id',\n DISCOGS_MASTER_RELEASE_ID: 'discogs_master_release_id',\n DISCOGS_RATING: 'discogs_rating',\n DISCOGS_RELEASED: 'date',\n DISCOGS_RELEASE_ID: 'discogs_release_id',\n DISCOGS_VOTES: 'discogs_votes',\n CATALOGID: 'catalognumber',\n STYLE: 'genre',\n //\n REPLAYGAIN_TRACK_GAIN: 'replaygain_track_gain',\n REPLAYGAIN_TRACK_PEAK: 'replaygain_track_peak',\n REPLAYGAIN_ALBUM_GAIN: 'replaygain_album_gain',\n REPLAYGAIN_ALBUM_PEAK: 'replaygain_album_peak',\n // To Sure if these (REPLAYGAIN_MINMAX, REPLAYGAIN_ALBUM_MINMAX & REPLAYGAIN_UNDO) are used for Vorbis:\n REPLAYGAIN_MINMAX: 'replaygain_track_minmax',\n REPLAYGAIN_ALBUM_MINMAX: 'replaygain_album_minmax',\n REPLAYGAIN_UNDO: 'replaygain_undo'\n};\nexport class VorbisTagMapper extends CommonTagMapper {\n static toRating(email, rating, maxScore) {\n return {\n source: email ? email.toLowerCase() : undefined,\n rating: (Number.parseFloat(rating) / maxScore) * CommonTagMapper.maxRatingScore\n };\n }\n constructor() {\n super(['vorbis'], vorbisTagMap);\n }\n postMap(tag) {\n if (tag.id === 'RATING') {\n // The way Winamp 5.666 assigns rating\n tag.value = VorbisTagMapper.toRating(undefined, tag.value, 100);\n }\n else if (tag.id.indexOf('RATING:') === 0) {\n const keys = tag.id.split(':');\n tag.value = VorbisTagMapper.toRating(keys[1], tag.value, 1);\n tag.id = keys[0];\n }\n }\n}\n","import { CommonTagMapper } from '../common/GenericTagMapper.js';\n/**\n * RIFF Info Tags; part of the EXIF 2.3\n * Ref: http://owl.phy.queensu.ca/~phil/exiftool/TagNames/RIFF.html#Info\n */\nexport const riffInfoTagMap = {\n IART: 'artist', // Artist\n ICRD: 'date', // DateCreated\n INAM: 'title', // Title\n TITL: 'title',\n IPRD: 'album', // Product\n ITRK: 'track',\n IPRT: 'track', // Additional tag for track index\n COMM: 'comment', // Comments\n ICMT: 'comment', // Country\n ICNT: 'releasecountry',\n GNRE: 'genre', // Genre\n IWRI: 'writer', // WrittenBy\n RATE: 'rating',\n YEAR: 'year',\n ISFT: 'encodedby', // Software\n CODE: 'encodedby', // EncodedBy\n TURL: 'website', // URL,\n IGNR: 'genre', // Genre\n IENG: 'engineer', // Engineer\n ITCH: 'technician', // Technician\n IMED: 'media', // Original Media\n IRPD: 'album' // Product, where the file was intended for\n};\nexport class RiffInfoTagMapper extends CommonTagMapper {\n constructor() {\n super(['exif'], riffInfoTagMap);\n }\n}\n","import { CaseInsensitiveTagMap } from '../common/CaseInsensitiveTagMap.js';\n/**\n * EBML Tag map\n */\nconst ebmlTagMap = {\n 'segment:title': 'title',\n 'album:ARTIST': 'albumartist',\n 'album:ARTISTSORT': 'albumartistsort',\n 'album:TITLE': 'album',\n 'album:DATE_RECORDED': 'originaldate',\n 'album:DATE_RELEASED': 'releasedate',\n 'album:PART_NUMBER': 'disk',\n 'album:TOTAL_PARTS': 'totaltracks',\n 'track:ARTIST': 'artist',\n 'track:ARTISTSORT': 'artistsort',\n 'track:TITLE': 'title',\n 'track:PART_NUMBER': 'track',\n 'track:MUSICBRAINZ_TRACKID': 'musicbrainz_recordingid',\n 'track:MUSICBRAINZ_ALBUMID': 'musicbrainz_albumid',\n 'track:MUSICBRAINZ_ARTISTID': 'musicbrainz_artistid',\n 'track:PUBLISHER': 'label',\n 'track:GENRE': 'genre',\n 'track:ENCODER': 'encodedby',\n 'track:ENCODER_OPTIONS': 'encodersettings',\n 'edition:TOTAL_PARTS': 'totaldiscs',\n picture: 'picture'\n};\nexport class MatroskaTagMapper extends CaseInsensitiveTagMap {\n constructor() {\n super(['matroska'], ebmlTagMap);\n }\n}\n","import { CommonTagMapper } from '../common/GenericTagMapper.js';\n/**\n * ID3v1 tag mappings\n */\nconst tagMap = {\n NAME: 'title',\n AUTH: 'artist',\n '(c) ': 'copyright',\n ANNO: 'comment'\n};\nexport class AiffTagMapper extends CommonTagMapper {\n constructor() {\n super(['AIFF'], tagMap);\n }\n}\n","import { LyricsContentType, TimestampFormat } from '../type.js';\n// Shared timestamp regex for LRC format\nconst TIMESTAMP_REGEX = /\\[(\\d{2}):(\\d{2})\\.(\\d{2,3})]/;\nexport function parseLyrics(input) {\n if (TIMESTAMP_REGEX.test(input)) {\n return parseLrc(input);\n }\n return toUnsyncedLyrics(input);\n}\nexport function toUnsyncedLyrics(lyrics) {\n return {\n contentType: LyricsContentType.lyrics,\n timeStampFormat: TimestampFormat.notSynchronized,\n text: lyrics.trim(),\n syncText: [],\n };\n}\n/**\n * Parse LRC (Lyrics) formatted text\n * Ref: https://en.wikipedia.org/wiki/LRC_(file_format)\n * @param lrcString\n */\nexport function parseLrc(lrcString) {\n const lines = lrcString.split('\\n');\n const syncText = [];\n for (const line of lines) {\n const match = line.match(TIMESTAMP_REGEX);\n if (match) {\n const minutes = Number.parseInt(match[1], 10);\n const seconds = Number.parseInt(match[2], 10);\n const ms = match[3].length === 3\n ? Number.parseInt(match[3], 10)\n : Number.parseInt(match[3], 10) * 10;\n const timestamp = (minutes * 60 + seconds) * 1000 + ms;\n const text = line.replace(TIMESTAMP_REGEX, '').trim();\n syncText.push({ timestamp, text });\n }\n }\n return {\n contentType: LyricsContentType.lyrics,\n timeStampFormat: TimestampFormat.milliseconds,\n text: syncText.map(line => line.text).join('\\n'),\n syncText,\n };\n}\n","export const mpegParserLoader = {\n parserType: 'mpeg',\n extensions: ['.mp2', '.mp3', '.m2a', '.aac', 'aacp'],\n mimeTypes: ['audio/mpeg', 'audio/mp3', 'audio/aacs', 'audio/aacp'],\n async load() {\n return (await import('./MpegParser.js')).MpegParser;\n }\n};\n","export const apeParserLoader = {\n parserType: 'apev2',\n extensions: ['.ape'],\n mimeTypes: ['audio/ape', 'audio/monkeys-audio'],\n async load() {\n return (await import('./APEv2Parser.js')).APEv2Parser;\n }\n};\n","export const asfParserLoader = {\n parserType: 'asf',\n extensions: ['.asf'],\n mimeTypes: ['audio/ms-wma', 'video/ms-wmv', 'audio/ms-asf', 'video/ms-asf', 'application/vnd.ms-asf'],\n async load() {\n return (await import('./AsfParser.js')).AsfParser;\n }\n};\n","export const dsdiffParserLoader = {\n parserType: 'dsdiff',\n extensions: ['.dff'],\n mimeTypes: ['audio/dsf', 'audio/dsd'],\n async load() {\n return (await import('./DsdiffParser.js')).DsdiffParser;\n }\n};\n","export const aiffParserLoader = {\n parserType: 'aiff',\n extensions: ['.aif', 'aiff', 'aifc'],\n mimeTypes: ['audio/aiff', 'audio/aif', 'audio/aifc', 'application/aiff'],\n async load() {\n return (await import('./AiffParser.js')).AIFFParser;\n }\n};\n","export const dsfParserLoader = {\n parserType: 'dsf',\n extensions: ['.dsf'],\n mimeTypes: ['audio/dsf'],\n async load() {\n return (await import('./DsfParser.js')).DsfParser;\n }\n};\n","export const flacParserLoader = {\n parserType: 'flac',\n extensions: ['.flac'],\n mimeTypes: ['audio/flac'],\n async load() {\n return (await import('./FlacParser.js')).FlacParser;\n }\n};\n","export const matroskaParserLoader = {\n parserType: 'matroska',\n extensions: ['.mka', '.mkv', '.mk3d', '.mks', 'webm'],\n mimeTypes: ['audio/matroska', 'video/matroska', 'audio/webm', 'video/webm'],\n async load() {\n return (await import('./MatroskaParser.js')).MatroskaParser;\n }\n};\n","export const mp4ParserLoader = {\n parserType: 'mp4',\n extensions: ['.mp4', '.m4a', '.m4b', '.m4pa', 'm4v', 'm4r', '3gp', '.mov', '.movie', '.qt'],\n mimeTypes: ['audio/mp4', 'audio/m4a', 'video/m4v', 'video/mp4', 'video/quicktime'],\n async load() {\n return (await import('./MP4Parser.js')).MP4Parser;\n }\n};\n","export const musepackParserLoader = {\n parserType: 'musepack',\n extensions: ['.mpc'],\n mimeTypes: ['audio/musepack'],\n async load() {\n return (await import('./MusepackParser.js')).MusepackParser;\n }\n};\n","export const oggParserLoader = {\n parserType: 'ogg',\n extensions: ['.ogg', '.ogv', '.oga', '.ogm', '.ogx', '.opus', '.spx'],\n mimeTypes: ['audio/ogg', 'audio/opus', 'audio/speex', 'video/ogg'], // RFC 7845, RFC 6716, RFC 5574\n async load() {\n return (await import('./OggParser.js')).OggParser;\n }\n};\n","export const wavpackParserLoader = {\n parserType: 'wavpack',\n extensions: ['.wv', '.wvp'],\n mimeTypes: ['audio/wavpack'],\n async load() {\n return (await import('./WavPackParser.js')).WavPackParser;\n }\n};\n","export const riffParserLoader = {\n parserType: 'riff',\n extensions: ['.wav', 'wave', '.bwf'],\n mimeTypes: ['audio/vnd.wave', 'audio/wav', 'audio/wave'],\n async load() {\n return (await import('./WaveParser.js')).WaveParser;\n }\n};\n","import { textDecode } from '@borewit/text-codec';\nexport const endTag2 = 'LYRICS200';\nexport async function getLyricsHeaderLength(tokenizer) {\n const fileSize = tokenizer.fileInfo.size;\n if (fileSize >= 143) {\n const buf = new Uint8Array(15);\n const position = tokenizer.position;\n await tokenizer.readBuffer(buf, { position: fileSize - 143 });\n tokenizer.setPosition(position); // Restore position\n const txt = textDecode(buf, 'latin1');\n const tag = txt.substring(6);\n if (tag === endTag2) {\n return Number.parseInt(txt.substring(0, 6), 10) + 15;\n }\n }\n return 0;\n}\n","import { HttpClient } from './http-client.js';\nimport * as rangeTokenizer from '@tokenizer/range';\nexport { HttpClient } from './http-client.js';\n/**\n * Create and initialize the HTTP tokenizer\n * @param url URL to resource to stream with tokenizer\n * @param tokenizerConfig Tokenizer configuration options\n * @param httpClientConfig HTTP client configuration options\n * @return Tokenizer\n */\nexport function makeTokenizer(url, tokenizerConfig, httpClientConfig) {\n const httpClient = new HttpClient(url, httpClientConfig);\n return rangeTokenizer.tokenizer(httpClient, tokenizerConfig);\n}\n//# sourceMappingURL=index.js.map","import initDebug from 'debug';\nimport { ResponseInfo } from './response-info.js'; // Add 'fetch' API for node.js\nconst debug = initDebug('streaming-http-token-reader:http-client');\nconst DEFAULT_CONFIG = {\n resolveUrl: false\n};\n/**\n * Simple HTTP-client, which works both in node.js and browser\n */\nexport class HttpClient {\n constructor(url, config) {\n this.url = url;\n this.abortController = new AbortController();\n this.config = DEFAULT_CONFIG;\n Object.assign(this.config, config);\n }\n async getHeadInfo() {\n const response = new ResponseInfo(await fetch(this.url, { method: 'HEAD', signal: this.abortController.signal }));\n if (this.config.resolveUrl)\n this.resolvedUrl = response.response.url;\n return response.toRangeRequestResponse();\n }\n async getResponse(method, range) {\n const headers = new Headers();\n if (range) {\n debug(`_getResponse ${method} ${range[0]}..${range[1]}`);\n headers.set('Range', `bytes=${range[0]}-${range[1]}`);\n }\n else {\n debug(`_getResponse ${method} (range not provided)`);\n }\n const response = new ResponseInfo(await fetch(this.resolvedUrl || this.url, { method, headers, signal: this.abortController.signal }));\n if (response.response.ok) {\n if (this.config.resolveUrl)\n this.resolvedUrl = response.response.url;\n return response.toRangeRequestResponse();\n }\n throw new Error(`Unexpected HTTP response status=${response.response.status}`);\n }\n abort() {\n debug('abort');\n this.abortController.abort();\n }\n}\n//# sourceMappingURL=http-client.js.map","import { parseContentRange as rangeParseContentRange } from '@tokenizer/range';\nexport class ResponseInfo {\n constructor(response) {\n this.response = response;\n }\n getContentLength() {\n const contentLength = this.response.headers.get('Content-Length');\n return contentLength ? Number.parseInt(contentLength, 10) : undefined;\n }\n getAcceptRangesHeaderValue() {\n return this.response.headers.get('Accept-Ranges');\n }\n getContentType() {\n return this.response.headers.get('Content-Type');\n }\n acceptRanges() {\n const value = this.getAcceptRangesHeaderValue();\n return value !== null && value.trim().toLowerCase() === 'bytes';\n }\n getContentRange() {\n const contentRange = this.response.headers.get('Content-Range');\n if (!contentRange) {\n return;\n }\n return rangeParseContentRange(contentRange);\n }\n toRangeRequestResponse() {\n const contentRange = this.getContentRange();\n const size = contentRange ? contentRange.instanceLength : this.getContentLength();\n if (typeof size !== 'number') {\n throw new Error('Could not determine file-size from HTTP response');\n }\n return {\n url: this.response.url,\n size,\n mimeType: this.getContentType() ?? undefined,\n acceptPartialRequests: this.acceptRanges(),\n contentRange,\n arrayBuffer: () => this.response.arrayBuffer().then(res => new Uint8Array(res))\n };\n }\n}\n//# sourceMappingURL=response-info.js.map","import { RangeRequestFactory } from './range-request-factory.js';\nexport { parseContentRange } from './range-request-tokenizer.js';\n/**\n * Construct range-tokenizer from range-request-client and config\n * @param rangeRequestClient - HTTP range request client\n * @param abortController - AbortController\n * @param config - Configuration\n * @return Tokenizer\n */\nexport function tokenizer(rangeRequestClient, config) {\n const factory = new RangeRequestFactory(rangeRequestClient);\n return factory.initTokenizer(config);\n}\n//# sourceMappingURL=index.js.map","import { RangeRequestTokenizer, roundRange } from './range-request-tokenizer.js';\nimport initDebug from 'debug';\nconst debug = initDebug('range-request-reader');\nexport class RangeRequestFactory {\n constructor(rangeRequestClient) {\n this.rangeRequestClient = rangeRequestClient;\n this.config = {\n avoidHeadRequests: false,\n initialChunkSize: 4 * 1024,\n minimumChunkSize: 1024\n };\n }\n async initTokenizer(config) {\n if (config) {\n this.config = { ...this.config, ...config };\n }\n const headRequestInfo = await this.getHeadRequestInfo();\n if (!headRequestInfo.acceptPartialRequests) {\n throw new Error('Server does not accept partial requests');\n }\n return new RangeRequestTokenizer(this.rangeRequestClient, {\n fileInfo: headRequestInfo,\n minimumChunkSize: this.config.minimumChunkSize,\n abortSignal: config?.abortSignal\n });\n }\n /**\n * Get file information, an HTTP-client may implement this doing a HEAD request\n * @return Promise with head-request-info, extending tokenizer file-info.\n */\n getHeadRequestInfo() {\n return this.config.avoidHeadRequests ?\n this.fetchFileInfoWithGetRequest() :\n this.fetchFileInfoWithHeadRequest();\n }\n async fetchFileInfoWithHeadRequest() {\n debug('_fetchSizeWithHeadRequest()');\n if (this.rangeRequestClient.getHeadInfo) {\n const info = await this.rangeRequestClient.getHeadInfo();\n if (info.size) {\n debug(`MIME-type=${info.mimeType}, content-length=${info.size}, accept-partial-requests=${info.acceptPartialRequests}`);\n return info;\n }\n }\n // Content-Length not provided by the server, fallback to\n // GET requests.\n debug('Content-Length not provided by the server, fallback to GET requests');\n return this.fetchFileInfoWithGetRequest();\n }\n async fetchFileInfoWithGetRequest() {\n const range = roundRange([0, this.config.initialChunkSize], this.config.minimumChunkSize);\n const response = await this.rangeRequestClient.getResponse('GET', range);\n debug(`_fetchSizeWithGetRequest response: contentRange=[${response.contentRange?.firstBytePosition}-${response.contentRange?.lastBytePosition}/${response.contentRange?.instanceLength}]`);\n if (!response.contentRange) {\n throw new Error('Failed to resolve content range (file size)');\n }\n return response;\n }\n}\n//# sourceMappingURL=range-request-factory.js.map","import { AbstractTokenizer } from 'strtok3';\nimport { ChunkedFileData } from './chunked-file-data.js';\nimport initDebug from 'debug';\nconst debug = initDebug('range-request-reader');\n/**\n * RangeRequestTokenizer is tokenizer which is an adapter for range-request clients.\n * Typically, HTTP clients implementing the HTTP Range Requests (https://tools.ietf.org/html/rfc7233)\n *\n * Inspired by \"XHR Reader\" written by António Afonso\n * https://github.com/aadsm/jsmediatags/blob/master/src/XhrFileReader.js\n */\nexport class RangeRequestTokenizer extends AbstractTokenizer {\n constructor(rangeRequestClient, options) {\n super({ fileInfo: options.fileInfo });\n this.rangeRequestClient = rangeRequestClient;\n this.options = options;\n this.fileInfo = options.fileInfo;\n if (Number.isNaN(options.minimumChunkSize)) {\n throw new Error('minimumChunkSize must be a number');\n }\n this._fileData = new ChunkedFileData();\n this.options.abortSignal?.addEventListener('abort', () => {\n this.abort();\n });\n }\n setPosition(position) {\n this.position = position;\n }\n /**\n * Read portion from stream\n * @param uint8array - Target `Uint8Array`\n * @param options - Additional read options\n * @returns Promise with number of bytes read\n */\n async readBuffer(uint8array, options) {\n if (options?.position) {\n this.position = options.position;\n }\n const length = await this.peekBuffer(uint8array, options);\n this.position += length;\n return length;\n }\n /**\n * Peek (read ahead) buffer from tokenizer\n * @param uint8array - Target `Uint8Array` to fill with data peek from the tokenizer-stream\n * @param options - Additional read options\n * @returns Promise with number of bytes read\n */\n async peekBuffer(uint8array, options) {\n let length = uint8array.length;\n let offset = 0;\n let position = this.position;\n if (options) {\n if (options.position) {\n position = options.position;\n }\n if (Number.isInteger(options.offset)) {\n offset = options.offset;\n }\n if (options.length) {\n length = options.length;\n }\n else {\n length -= offset;\n }\n }\n if (length === 0) {\n return 0;\n }\n debug(`peekBuffer position=${position} length=${length}`);\n if (!this.fileInfo)\n throw new Error('File-info missing');\n const lastPos = Math.min(this.fileInfo.size - 1, position + length - 1);\n return this.loadRange([position, lastPos]).then(() => {\n this._fileData.readToBuffer(uint8array, offset, position, Math.min(this.fileInfo.size, length));\n return length;\n });\n }\n /**\n * Ignore number of bytes, advances the pointer in under tokenizer-stream.\n * @param length - Number of bytes to skip (ignore)\n * @return actual number of bytes ignored\n */\n async ignore(length) {\n const bytesLeft = this.fileInfo.size - this.position;\n if (length <= bytesLeft) {\n this.position += length;\n return length;\n }\n this.position += bytesLeft;\n return bytesLeft;\n }\n async abort() {\n this.rangeRequestClient.abort();\n }\n supportsRandomAccess() {\n return true;\n }\n async loadRange(range) {\n if (range[0] > (this.fileInfo.size - 1)) {\n throw new Error('End-Of-File');\n }\n debug(`request range ${range[0]}..${range[1]}`);\n debug(`adjusted range ${range[0]}..${range[1]}`);\n if (this._fileData.hasDataRange(range[0], range[1])) {\n debug('Read from cache');\n return;\n }\n // Always download in multiples of CHUNK_SIZE. If we're going to make a\n // request might as well get a chunk that makes sense. The big cost is\n // establishing the connection so getting 10bytes or 1K doesn't really\n // make a difference.\n range = roundRange(range, this.options.minimumChunkSize);\n // Upper range should not be greater than max file size\n range[1] = Math.min(this.fileInfo.size - 1, range[1]);\n debug(`blocked range: ${range[0]}..${range[1]}`);\n return this.rangeRequestClient.getResponse('GET', range).then(response => {\n return response.arrayBuffer().then(data => {\n this._fileData.addData(range[0], data);\n });\n });\n }\n}\nexport function roundRange(range, minimumChunkSize) {\n const length = range[1] - range[0] + 1;\n // const newLength = Math.ceil(length / minimum_chunk_size) * minimum_chunk_size;\n const newLength = Math.max(minimumChunkSize, length);\n return [range[0], range[0] + newLength - 1];\n}\n/**\n * Convert HTTP range header value to IContentRangeType\n * @param contentRange - content range\n */\nexport function parseContentRange(contentRange) {\n if (!contentRange) {\n throw new Error('Content range must be provided');\n }\n debug(`parseContentRange response: contentRange=${contentRange}`);\n const parsedContentRange = contentRange.match(/bytes (\\d+)-(\\d+)\\/(?:(\\d+)|\\*)/i);\n if (!parsedContentRange) {\n throw new Error(`FIXME: Unknown Content-Range syntax: ${contentRange}`);\n }\n return {\n firstBytePosition: Number.parseInt(parsedContentRange[1], 10),\n lastBytePosition: Number.parseInt(parsedContentRange[2], 10),\n instanceLength: parsedContentRange[3] ? Number.parseInt(parsedContentRange[3], 10) : undefined\n };\n}\n//# sourceMappingURL=range-request-tokenizer.js.map","import { stat as fsStat } from 'node:fs/promises';\nimport { fromStream as coreFromStream } from './core.js';\nimport { FileTokenizer } from \"./FileTokenizer.js\";\nexport { FileTokenizer } from './FileTokenizer.js';\nexport * from './core.js';\n/**\n * Construct ReadStreamTokenizer from given Stream.\n * Will set fileSize, if provided given Stream has set the .path property.\n * @param stream - Node.js Stream.Readable\n * @param options - Pass additional file information to the tokenizer\n * @returns Tokenizer\n */\nexport async function fromStream(stream, options) {\n const rst = coreFromStream(stream, options);\n if (stream.path) {\n const stat = await fsStat(stream.path);\n rst.fileInfo.path = stream.path;\n rst.fileInfo.size = stat.size;\n }\n return rst;\n}\nexport const fromFile = FileTokenizer.fromFile;\n","import { StreamReader, WebStreamReader } from 'peek-readable';\nimport { ReadStreamTokenizer } from './ReadStreamTokenizer.js';\nimport { BufferTokenizer } from './BufferTokenizer.js';\nexport { EndOfStreamError } from 'peek-readable';\nexport { AbstractTokenizer } from './AbstractTokenizer.js';\n/**\n * Construct ReadStreamTokenizer from given Stream.\n * Will set fileSize, if provided given Stream has set the .path property/\n * @param stream - Read from Node.js Stream.Readable\n * @param options - Tokenizer options\n * @returns ReadStreamTokenizer\n */\nexport function fromStream(stream, options) {\n return new ReadStreamTokenizer(new StreamReader(stream), options);\n}\n/**\n * Construct ReadStreamTokenizer from given ReadableStream (WebStream API).\n * Will set fileSize, if provided given Stream has set the .path property/\n * @param webStream - Read from Node.js Stream.Readable (must be a byte stream)\n * @param options - Tokenizer options\n * @returns ReadStreamTokenizer\n */\nexport function fromWebStream(webStream, options) {\n return new ReadStreamTokenizer(new WebStreamReader(webStream), options);\n}\n/**\n * Construct ReadStreamTokenizer from given Buffer.\n * @param uint8Array - Uint8Array to tokenize\n * @param options - Tokenizer options\n * @returns BufferTokenizer\n */\nexport function fromBuffer(uint8Array, options) {\n return new BufferTokenizer(uint8Array, options);\n}\n","export { EndOfStreamError } from './EndOfStreamError.js';\nexport { StreamReader } from './StreamReader.js';\nexport { WebStreamReader } from './WebStreamReader.js';\n","export const defaultMessages = 'End-Of-Stream';\n/**\n * Thrown on read operation of the end of file or stream has been reached\n */\nexport class EndOfStreamError extends Error {\n constructor() {\n super(defaultMessages);\n }\n}\n","import { EndOfStreamError } from './EndOfStreamError.js';\nimport { Deferred } from './Deferred.js';\nimport { AbstractStreamReader } from \"./AbstractStreamReader.js\";\nexport { EndOfStreamError } from './EndOfStreamError.js';\n/**\n * Node.js Readable Stream Reader\n * Ref: https://nodejs.org/api/stream.html#readable-streams\n */\nexport class StreamReader extends AbstractStreamReader {\n constructor(s) {\n super();\n this.s = s;\n /**\n * Deferred used for postponed read request (as not data is yet available to read)\n */\n this.deferred = null;\n if (!s.read || !s.once) {\n throw new Error('Expected an instance of stream.Readable');\n }\n this.s.once('end', () => this.reject(new EndOfStreamError()));\n this.s.once('error', err => this.reject(err));\n this.s.once('close', () => this.reject(new Error('Stream closed')));\n }\n /**\n * Read chunk from stream\n * @param buffer Target Uint8Array (or Buffer) to store data read from stream in\n * @param offset Offset target\n * @param length Number of bytes to read\n * @returns Number of bytes read\n */\n async readFromStream(buffer, offset, length) {\n if (this.endOfStream) {\n return 0;\n }\n const readBuffer = this.s.read(length);\n if (readBuffer) {\n buffer.set(readBuffer, offset);\n return readBuffer.length;\n }\n const request = {\n buffer,\n offset,\n length,\n deferred: new Deferred()\n };\n this.deferred = request.deferred;\n this.s.once('readable', () => {\n this.readDeferred(request);\n });\n return request.deferred.promise;\n }\n /**\n * Process deferred read request\n * @param request Deferred read request\n */\n readDeferred(request) {\n const readBuffer = this.s.read(request.length);\n if (readBuffer) {\n request.buffer.set(readBuffer, request.offset);\n request.deferred.resolve(readBuffer.length);\n this.deferred = null;\n }\n else {\n this.s.once('readable', () => {\n this.readDeferred(request);\n });\n }\n }\n reject(err) {\n this.endOfStream = true;\n if (this.deferred) {\n this.deferred.reject(err);\n this.deferred = null;\n }\n }\n async abort() {\n this.reject(new Error('abort'));\n }\n async close() {\n return this.abort();\n }\n}\n","export class Deferred {\n constructor() {\n this.resolve = () => null;\n this.reject = () => null;\n this.promise = new Promise((resolve, reject) => {\n this.reject = reject;\n this.resolve = resolve;\n });\n }\n}\n","import { EndOfStreamError } from \"./EndOfStreamError.js\";\nexport class AbstractStreamReader {\n constructor() {\n /**\n * Maximum request length on read-stream operation\n */\n this.maxStreamReadSize = 1 * 1024 * 1024;\n this.endOfStream = false;\n /**\n * Store peeked data\n * @type {Array}\n */\n this.peekQueue = [];\n }\n async peek(uint8Array, offset, length) {\n const bytesRead = await this.read(uint8Array, offset, length);\n this.peekQueue.push(uint8Array.subarray(offset, offset + bytesRead)); // Put read data back to peek buffer\n return bytesRead;\n }\n async read(buffer, offset, length) {\n if (length === 0) {\n return 0;\n }\n let bytesRead = this.readFromPeekBuffer(buffer, offset, length);\n bytesRead += await this.readRemainderFromStream(buffer, offset + bytesRead, length - bytesRead);\n if (bytesRead === 0) {\n throw new EndOfStreamError();\n }\n return bytesRead;\n }\n /**\n * Read chunk from stream\n * @param buffer - Target Uint8Array (or Buffer) to store data read from stream in\n * @param offset - Offset target\n * @param length - Number of bytes to read\n * @returns Number of bytes read\n */\n readFromPeekBuffer(buffer, offset, length) {\n let remaining = length;\n let bytesRead = 0;\n // consume peeked data first\n while (this.peekQueue.length > 0 && remaining > 0) {\n const peekData = this.peekQueue.pop(); // Front of queue\n if (!peekData)\n throw new Error('peekData should be defined');\n const lenCopy = Math.min(peekData.length, remaining);\n buffer.set(peekData.subarray(0, lenCopy), offset + bytesRead);\n bytesRead += lenCopy;\n remaining -= lenCopy;\n if (lenCopy < peekData.length) {\n // remainder back to queue\n this.peekQueue.push(peekData.subarray(lenCopy));\n }\n }\n return bytesRead;\n }\n async readRemainderFromStream(buffer, offset, initialRemaining) {\n let remaining = initialRemaining;\n let bytesRead = 0;\n // Continue reading from stream if required\n while (remaining > 0 && !this.endOfStream) {\n const reqLen = Math.min(remaining, this.maxStreamReadSize);\n const chunkLen = await this.readFromStream(buffer, offset + bytesRead, reqLen);\n if (chunkLen === 0)\n break;\n bytesRead += chunkLen;\n remaining -= chunkLen;\n }\n return bytesRead;\n }\n}\n","import { EndOfStreamError } from './EndOfStreamError.js';\nexport { EndOfStreamError } from './EndOfStreamError.js';\nimport { AbstractStreamReader } from \"./AbstractStreamReader.js\";\n/**\n * Read from a WebStream\n * Reference: https://nodejs.org/api/webstreams.html#class-readablestreambyobreader\n */\nexport class WebStreamReader extends AbstractStreamReader {\n constructor(stream) {\n super();\n this.reader = stream.getReader({ mode: 'byob' });\n }\n async readFromStream(buffer, offset, length) {\n if (this.endOfStream) {\n throw new EndOfStreamError();\n }\n const result = await this.reader.read(new Uint8Array(length));\n if (result.done) {\n this.endOfStream = result.done;\n }\n if (result.value) {\n buffer.set(result.value, offset);\n return result.value.byteLength;\n }\n return 0;\n }\n abort() {\n return this.reader.cancel(); // Signals a loss of interest in the stream by a consumer\n }\n async close() {\n await this.abort();\n this.reader.releaseLock();\n }\n}\n","import { AbstractTokenizer } from './AbstractTokenizer.js';\nimport { EndOfStreamError } from 'peek-readable';\nconst maxBufferSize = 256000;\nexport class ReadStreamTokenizer extends AbstractTokenizer {\n /**\n * Constructor\n * @param streamReader stream-reader to read from\n * @param options Tokenizer options\n */\n constructor(streamReader, options) {\n super(options);\n this.streamReader = streamReader;\n this.fileInfo = options?.fileInfo ?? {};\n }\n /**\n * Read buffer from tokenizer\n * @param uint8Array - Target Uint8Array to fill with data read from the tokenizer-stream\n * @param options - Read behaviour options\n * @returns Promise with number of bytes read\n */\n async readBuffer(uint8Array, options) {\n const normOptions = this.normalizeOptions(uint8Array, options);\n const skipBytes = normOptions.position - this.position;\n if (skipBytes > 0) {\n await this.ignore(skipBytes);\n return this.readBuffer(uint8Array, options);\n }\n if (skipBytes < 0) {\n throw new Error('`options.position` must be equal or greater than `tokenizer.position`');\n }\n if (normOptions.length === 0) {\n return 0;\n }\n const bytesRead = await this.streamReader.read(uint8Array, normOptions.offset, normOptions.length);\n this.position += bytesRead;\n if ((!options || !options.mayBeLess) && bytesRead < normOptions.length) {\n throw new EndOfStreamError();\n }\n return bytesRead;\n }\n /**\n * Peek (read ahead) buffer from tokenizer\n * @param uint8Array - Uint8Array (or Buffer) to write data to\n * @param options - Read behaviour options\n * @returns Promise with number of bytes peeked\n */\n async peekBuffer(uint8Array, options) {\n const normOptions = this.normalizeOptions(uint8Array, options);\n let bytesRead = 0;\n if (normOptions.position) {\n const skipBytes = normOptions.position - this.position;\n if (skipBytes > 0) {\n const skipBuffer = new Uint8Array(normOptions.length + skipBytes);\n bytesRead = await this.peekBuffer(skipBuffer, { mayBeLess: normOptions.mayBeLess });\n uint8Array.set(skipBuffer.subarray(skipBytes), normOptions.offset);\n return bytesRead - skipBytes;\n }\n if (skipBytes < 0) {\n throw new Error('Cannot peek from a negative offset in a stream');\n }\n }\n if (normOptions.length > 0) {\n try {\n bytesRead = await this.streamReader.peek(uint8Array, normOptions.offset, normOptions.length);\n }\n catch (err) {\n if (options?.mayBeLess && err instanceof EndOfStreamError) {\n return 0;\n }\n throw err;\n }\n if ((!normOptions.mayBeLess) && bytesRead < normOptions.length) {\n throw new EndOfStreamError();\n }\n }\n return bytesRead;\n }\n async ignore(length) {\n // debug(`ignore ${this.position}...${this.position + length - 1}`);\n const bufSize = Math.min(maxBufferSize, length);\n const buf = new Uint8Array(bufSize);\n let totBytesRead = 0;\n while (totBytesRead < length) {\n const remaining = length - totBytesRead;\n const bytesRead = await this.readBuffer(buf, { length: Math.min(bufSize, remaining) });\n if (bytesRead < 0) {\n return bytesRead;\n }\n totBytesRead += bytesRead;\n }\n return totBytesRead;\n }\n abort() {\n return this.streamReader.abort();\n }\n supportsRandomAccess() {\n return false;\n }\n}\n","import { EndOfStreamError } from 'peek-readable';\n/**\n * Core tokenizer\n */\nexport class AbstractTokenizer {\n /**\n * Constructor\n * @param options Tokenizer options\n * @protected\n */\n constructor(options) {\n this.numBuffer = new Uint8Array(8);\n /**\n * Tokenizer-stream position\n */\n this.position = 0;\n this.onClose = options?.onClose;\n if (options?.abortSignal) {\n options.abortSignal.addEventListener('abort', () => {\n this.abort();\n });\n }\n }\n /**\n * Read a token from the tokenizer-stream\n * @param token - The token to read\n * @param position - If provided, the desired position in the tokenizer-stream\n * @returns Promise with token data\n */\n async readToken(token, position = this.position) {\n const uint8Array = new Uint8Array(token.len);\n const len = await this.readBuffer(uint8Array, { position });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(uint8Array, 0);\n }\n /**\n * Peek a token from the tokenizer-stream.\n * @param token - Token to peek from the tokenizer-stream.\n * @param position - Offset where to begin reading within the file. If position is null, data will be read from the current file position.\n * @returns Promise with token data\n */\n async peekToken(token, position = this.position) {\n const uint8Array = new Uint8Array(token.len);\n const len = await this.peekBuffer(uint8Array, { position });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(uint8Array, 0);\n }\n /**\n * Read a numeric token from the stream\n * @param token - Numeric token\n * @returns Promise with number\n */\n async readNumber(token) {\n const len = await this.readBuffer(this.numBuffer, { length: token.len });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(this.numBuffer, 0);\n }\n /**\n * Read a numeric token from the stream\n * @param token - Numeric token\n * @returns Promise with number\n */\n async peekNumber(token) {\n const len = await this.peekBuffer(this.numBuffer, { length: token.len });\n if (len < token.len)\n throw new EndOfStreamError();\n return token.get(this.numBuffer, 0);\n }\n /**\n * Ignore number of bytes, advances the pointer in under tokenizer-stream.\n * @param length - Number of bytes to ignore\n * @return resolves the number of bytes ignored, equals length if this available, otherwise the number of bytes available\n */\n async ignore(length) {\n if (this.fileInfo.size !== undefined) {\n const bytesLeft = this.fileInfo.size - this.position;\n if (length > bytesLeft) {\n this.position += bytesLeft;\n return bytesLeft;\n }\n }\n this.position += length;\n return length;\n }\n async close() {\n await this.abort();\n await this.onClose?.();\n }\n normalizeOptions(uint8Array, options) {\n if (options && options.position !== undefined && options.position < this.position) {\n throw new Error('`options.position` must be equal or greater than `tokenizer.position`');\n }\n if (options) {\n return {\n mayBeLess: options.mayBeLess === true,\n offset: options.offset ? options.offset : 0,\n length: options.length ? options.length : (uint8Array.length - (options.offset ? options.offset : 0)),\n position: options.position ? options.position : this.position\n };\n }\n return {\n mayBeLess: false,\n offset: 0,\n length: uint8Array.length,\n position: this.position\n };\n }\n abort() {\n return Promise.resolve(); // Ignore abort signal\n }\n}\n","import { EndOfStreamError } from 'peek-readable';\nimport { AbstractTokenizer } from './AbstractTokenizer.js';\nexport class BufferTokenizer extends AbstractTokenizer {\n /**\n * Construct BufferTokenizer\n * @param uint8Array - Uint8Array to tokenize\n * @param options Tokenizer options\n */\n constructor(uint8Array, options) {\n super(options);\n this.uint8Array = uint8Array;\n this.fileInfo = { ...options?.fileInfo ?? {}, ...{ size: uint8Array.length } };\n }\n /**\n * Read buffer from tokenizer\n * @param uint8Array - Uint8Array to tokenize\n * @param options - Read behaviour options\n * @returns {Promise<number>}\n */\n async readBuffer(uint8Array, options) {\n if (options?.position) {\n if (options.position < this.position) {\n throw new Error('`options.position` must be equal or greater than `tokenizer.position`');\n }\n this.position = options.position;\n }\n const bytesRead = await this.peekBuffer(uint8Array, options);\n this.position += bytesRead;\n return bytesRead;\n }\n /**\n * Peek (read ahead) buffer from tokenizer\n * @param uint8Array\n * @param options - Read behaviour options\n * @returns {Promise<number>}\n */\n async peekBuffer(uint8Array, options) {\n const normOptions = this.normalizeOptions(uint8Array, options);\n const bytes2read = Math.min(this.uint8Array.length - normOptions.position, normOptions.length);\n if ((!normOptions.mayBeLess) && bytes2read < normOptions.length) {\n throw new EndOfStreamError();\n }\n uint8Array.set(this.uint8Array.subarray(normOptions.position, normOptions.position + bytes2read), normOptions.offset);\n return bytes2read;\n }\n close() {\n return super.close();\n }\n supportsRandomAccess() {\n return true;\n }\n setPosition(position) {\n this.position = position;\n }\n}\n","import { AbstractTokenizer } from './AbstractTokenizer.js';\nimport { EndOfStreamError } from 'peek-readable';\nimport { open as fsOpen } from 'node:fs/promises';\nexport class FileTokenizer extends AbstractTokenizer {\n /**\n * Create tokenizer from provided file path\n * @param sourceFilePath File path\n */\n static async fromFile(sourceFilePath) {\n const fileHandle = await fsOpen(sourceFilePath, 'r');\n const stat = await fileHandle.stat();\n return new FileTokenizer(fileHandle, { fileInfo: { path: sourceFilePath, size: stat.size } });\n }\n constructor(fileHandle, options) {\n super(options);\n this.fileHandle = fileHandle;\n this.fileInfo = options.fileInfo;\n }\n /**\n * Read buffer from file\n * @param uint8Array - Uint8Array to write result to\n * @param options - Read behaviour options\n * @returns Promise number of bytes read\n */\n async readBuffer(uint8Array, options) {\n const normOptions = this.normalizeOptions(uint8Array, options);\n this.position = normOptions.position;\n if (normOptions.length === 0)\n return 0;\n const res = await this.fileHandle.read(uint8Array, normOptions.offset, normOptions.length, normOptions.position);\n this.position += res.bytesRead;\n if (res.bytesRead < normOptions.length && (!options || !options.mayBeLess)) {\n throw new EndOfStreamError();\n }\n return res.bytesRead;\n }\n /**\n * Peek buffer from file\n * @param uint8Array - Uint8Array (or Buffer) to write data to\n * @param options - Read behaviour options\n * @returns Promise number of bytes read\n */\n async peekBuffer(uint8Array, options) {\n const normOptions = this.normalizeOptions(uint8Array, options);\n const res = await this.fileHandle.read(uint8Array, normOptions.offset, normOptions.length, normOptions.position);\n if ((!normOptions.mayBeLess) && res.bytesRead < normOptions.length) {\n throw new EndOfStreamError();\n }\n return res.bytesRead;\n }\n async close() {\n await this.fileHandle.close();\n return super.close();\n }\n setPosition(position) {\n this.position = position;\n }\n supportsRandomAccess() {\n return true;\n }\n}\n","const NOT_FOUND = -1;\n/**\n * Keeps track of data chunks (partial downloaded file fragments).\n *\n * Based on \"ChunkedFileData\" written by António Afonso\n * https://github.com/aadsm/jsmediatags/blob/master/src/ChunkedFileData.js\n */\nexport class ChunkedFileData {\n constructor() {\n this._fileData = [];\n }\n /**\n * Adds data to the file storage at a specific offset.\n */\n addData(offset, data) {\n const offsetEnd = offset + data.byteLength - 1;\n const chunkRange = this._getChunkRange(offset, offsetEnd);\n if (chunkRange.startIx === NOT_FOUND) {\n this._fileData.splice(chunkRange.insertIx || 0, 0, {\n offset,\n data\n });\n }\n else {\n // If the data to add collides with existing chunks we prepend and\n // append data from the half colliding chunks to make the collision at\n // 100%. The new data can then replace all the colliding chunkes.\n const firstChunk = this._fileData[chunkRange.startIx];\n const lastChunk = this._fileData[chunkRange.endIx];\n const needsPrepend = offset > firstChunk.offset;\n const needsAppend = offsetEnd < lastChunk.offset + lastChunk.data.byteLength - 1;\n const chunk = {\n offset: Math.min(offset, firstChunk.offset),\n data\n };\n if (needsPrepend) {\n const slicedData = firstChunk.data.slice(0, offset - firstChunk.offset);\n chunk.data = this._concatData(slicedData, data);\n }\n if (needsAppend) {\n // Use the lastChunk because the slice logic is easier to handle.\n const slicedData = chunk.data.slice(0, lastChunk.offset - chunk.offset);\n chunk.data = this._concatData(slicedData, lastChunk.data);\n }\n this._fileData.splice(chunkRange.startIx, chunkRange.endIx - chunkRange.startIx + 1, chunk);\n }\n }\n hasDataRange(offsetStart, offsetEnd) {\n for (let i = 0; i < this._fileData.length; i++) {\n const chunk = this._fileData[i];\n if (offsetEnd < chunk.offset) {\n return false;\n }\n if (offsetStart >= chunk.offset && offsetEnd < chunk.offset + chunk.data.byteLength) {\n return true;\n }\n }\n return false;\n }\n readToBuffer(buffer, offset, position, length) {\n const _pos_offset = position;\n let dataChunk;\n for (let i = 0; i < this._fileData.length; i++) {\n const dataChunkStart = this._fileData[i].offset;\n const dataChunkEnd = dataChunkStart + this._fileData[i].data.byteLength;\n if (_pos_offset >= dataChunkStart && _pos_offset < dataChunkEnd) {\n dataChunk = this._fileData[i];\n const chunkOffset = _pos_offset - dataChunkStart;\n let chunkLength = Math.min(length, dataChunk.data.byteLength - chunkOffset);\n buffer.set(dataChunk.data.subarray(chunkOffset, chunkOffset + chunkLength), offset);\n if (chunkLength < length) {\n chunkLength += this.readToBuffer(buffer, offset + chunkLength, position + chunkLength, length - chunkLength);\n }\n return chunkLength;\n }\n }\n return 0;\n }\n _concatData(buffer1, buffer2) {\n const tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);\n tmp.set(new Uint8Array(buffer1), 0);\n tmp.set(new Uint8Array(buffer2), buffer1.byteLength);\n return tmp;\n }\n /**\n * Finds the chunk range that overlaps the [offsetStart-1,offsetEnd+1] range.\n * When a chunk is adjacent to the offset we still consider it part of the\n * range (this is the situation of offsetStart-1 or offsetEnd+1).\n * When no chunks are found `insertIx` denotes the index where the data\n * should be inserted in the data list (startIx == NOT_FOUND and endIX ==\n * NOT_FOUND).\n */\n _getChunkRange(offsetStart, offsetEnd) {\n let startChunkIx = NOT_FOUND;\n let endChunkIx = NOT_FOUND;\n let insertIx = 0;\n // Could use binary search but not expecting that many blocks to exist.\n for (let i = 0; i < this._fileData.length; i++, insertIx = i) {\n const chunkOffsetStart = this._fileData[i].offset;\n const chunkOffsetEnd = chunkOffsetStart + this._fileData[i].data.byteLength;\n if (offsetEnd < chunkOffsetStart - 1) {\n // This offset range doesn't overlap with any chunks.\n break;\n }\n // If it is adjacent we still consider it part of the range because\n // we're going end up with a single block with all contiguous data.\n if (offsetStart <= chunkOffsetEnd + 1 &&\n offsetEnd >= chunkOffsetStart - 1) {\n startChunkIx = i;\n break;\n }\n }\n // No starting chunk was found, meaning that the offset is either before\n // or after the current stored chunks.\n if (startChunkIx === NOT_FOUND) {\n return {\n startIx: NOT_FOUND,\n endIx: NOT_FOUND,\n insertIx\n };\n }\n // Find the ending chunk.\n for (let i = startChunkIx; i < this._fileData.length; i++) {\n const chunkOffsetStart = this._fileData[i].offset;\n const chunkOffsetEnd = chunkOffsetStart + this._fileData[i].data.byteLength;\n if (offsetEnd >= chunkOffsetStart - 1) {\n // Candidate for the end chunk, it doesn't mean it is yet.\n endChunkIx = i;\n }\n if (offsetEnd <= chunkOffsetEnd + 1) {\n break;\n }\n }\n if (endChunkIx === NOT_FOUND) {\n endChunkIx = startChunkIx;\n }\n return {\n startIx: startChunkIx,\n endIx: endChunkIx\n };\n }\n}\n//# sourceMappingURL=chunked-file-data.js.map","import { RangeRequestFactory } from './range-request-factory.js';\nexport { parseContentRange } from './range-request-tokenizer.js';\n/**\n * Construct range-tokenizer from range-request-client and config\n * @param rangeRequestClient - HTTP range request client\n * @param abortController - AbortController\n * @param config - Configuration\n * @return Tokenizer\n */\nexport function tokenizer(rangeRequestClient, config) {\n const factory = new RangeRequestFactory(rangeRequestClient);\n return factory.initTokenizer(config);\n}\n//# sourceMappingURL=index.js.map","import { RangeRequestTokenizer, roundRange } from './range-request-tokenizer.js';\nimport initDebug from 'debug';\nconst debug = initDebug('range-request-reader');\nexport class RangeRequestFactory {\n constructor(rangeRequestClient) {\n this.rangeRequestClient = rangeRequestClient;\n this.config = {\n avoidHeadRequests: false,\n initialChunkSize: 4 * 1024,\n minimumChunkSize: 1024\n };\n }\n async initTokenizer(config) {\n if (config) {\n this.config = { ...this.config, ...config };\n }\n const headRequestInfo = await this.getHeadRequestInfo();\n if (!headRequestInfo.acceptPartialRequests) {\n throw new Error('Server does not accept partial requests');\n }\n return new RangeRequestTokenizer(this.rangeRequestClient, {\n fileInfo: headRequestInfo,\n minimumChunkSize: this.config.minimumChunkSize,\n abortSignal: config?.abortSignal\n });\n }\n /**\n * Get file information, an HTTP-client may implement this doing a HEAD request\n * @return Promise with head-request-info, extending tokenizer file-info.\n */\n getHeadRequestInfo() {\n return this.config.avoidHeadRequests ?\n this.fetchFileInfoWithGetRequest() :\n this.fetchFileInfoWithHeadRequest();\n }\n async fetchFileInfoWithHeadRequest() {\n debug('_fetchSizeWithHeadRequest()');\n if (this.rangeRequestClient.getHeadInfo) {\n const info = await this.rangeRequestClient.getHeadInfo();\n if (info.size) {\n debug(`MIME-type=${info.mimeType}, content-length=${info.size}, accept-partial-requests=${info.acceptPartialRequests}`);\n return info;\n }\n }\n // Content-Length not provided by the server, fallback to\n // GET requests.\n debug('Content-Length not provided by the server, fallback to GET requests');\n return this.fetchFileInfoWithGetRequest();\n }\n async fetchFileInfoWithGetRequest() {\n const range = roundRange([0, this.config.initialChunkSize], this.config.minimumChunkSize);\n const response = await this.rangeRequestClient.getResponse('GET', range);\n debug(`_fetchSizeWithGetRequest response: contentRange=[${response.contentRange?.firstBytePosition}-${response.contentRange?.lastBytePosition}/${response.contentRange?.instanceLength}]`);\n if (!response.contentRange) {\n throw new Error('Failed to resolve content range (file size)');\n }\n return response;\n }\n}\n//# sourceMappingURL=range-request-factory.js.map","import { AbstractTokenizer } from 'strtok3';\nimport { ChunkedFileData } from './chunked-file-data.js';\nimport initDebug from 'debug';\nconst debug = initDebug('range-request-reader');\n/**\n * RangeRequestTokenizer is tokenizer which is an adapter for range-request clients.\n * Typically, HTTP clients implementing the HTTP Range Requests (https://tools.ietf.org/html/rfc7233)\n *\n * Inspired by \"XHR Reader\" written by António Afonso\n * https://github.com/aadsm/jsmediatags/blob/master/src/XhrFileReader.js\n */\nexport class RangeRequestTokenizer extends AbstractTokenizer {\n constructor(rangeRequestClient, options) {\n super({ fileInfo: options.fileInfo });\n this.rangeRequestClient = rangeRequestClient;\n this.options = options;\n this.fileInfo = options.fileInfo;\n if (Number.isNaN(options.minimumChunkSize)) {\n throw new Error('minimumChunkSize must be a number');\n }\n this._fileData = new ChunkedFileData();\n this.options.abortSignal?.addEventListener('abort', () => {\n this.abort();\n });\n }\n setPosition(position) {\n this.position = position;\n }\n /**\n * Read portion from stream\n * @param uint8array - Target `Uint8Array`\n * @param options - Additional read options\n * @returns Promise with number of bytes read\n */\n async readBuffer(uint8array, options) {\n if (options?.position) {\n this.position = options.position;\n }\n const length = await this.peekBuffer(uint8array, options);\n this.position += length;\n return length;\n }\n /**\n * Peek (read ahead) buffer from tokenizer\n * @param uint8array - Target `Uint8Array` to fill with data peek from the tokenizer-stream\n * @param options - Additional read options\n * @returns Promise with number of bytes read\n */\n async peekBuffer(uint8array, options) {\n const offset = 0;\n if (!this.fileInfo)\n throw new Error('File-info missing');\n const size = this.fileInfo.size;\n const position = options?.position !== undefined ? options.position : this.position;\n // requested length\n const requested = options?.length !== undefined ? options.length : (uint8array.length - offset);\n if (requested <= 0)\n return 0;\n const available = size - position;\n // Past EOF\n if (available <= 0) {\n if (options?.mayBeLess)\n return 0;\n throw new RangeError(`peekBuffer position ${position} is beyond EOF ${size}`);\n }\n const length = options?.mayBeLess ? Math.min(requested, available) : requested;\n if (!options?.mayBeLess && length > available) {\n throw new RangeError(`peekBuffer length ${length} exceeds remaining ${available} at position ${position}`);\n }\n const lastPos = position + length - 1;\n await this.loadRange([position, lastPos]);\n this._fileData.readToBuffer(uint8array, offset, position, length);\n return length;\n }\n /**\n * Ignore number of bytes, advances the pointer in under tokenizer-stream.\n * @param length - Number of bytes to skip (ignore)\n * @return actual number of bytes ignored\n */\n async ignore(length) {\n const bytesLeft = this.fileInfo.size - this.position;\n if (length <= bytesLeft) {\n this.position += length;\n return length;\n }\n this.position += bytesLeft;\n return bytesLeft;\n }\n async abort() {\n this.rangeRequestClient.abort();\n }\n supportsRandomAccess() {\n return true;\n }\n async loadRange(range) {\n debug(`request range ${range[0]}..${range[1]}`);\n if (range[0] > (this.fileInfo.size - 1)) {\n throw new Error('End-Of-File');\n }\n debug(`adjusted range ${range[0]}..${range[1]}`);\n if (this._fileData.hasDataRange(range[0], range[1])) {\n debug('Read from cache');\n return;\n }\n // Always download in multiples of CHUNK_SIZE. If we're going to make a\n // request might as well get a chunk that makes sense. The big cost is\n // establishing the connection so getting 10bytes or 1K doesn't really\n // make a difference.\n range = roundRange(range, this.options.minimumChunkSize);\n // Upper range should not be greater than max file size\n range[1] = Math.min(this.fileInfo.size - 1, range[1]);\n debug(`blocked range: ${range[0]}..${range[1]}`);\n return this.rangeRequestClient.getResponse('GET', range).then(response => {\n return response.arrayBuffer().then(data => {\n this._fileData.addData(range[0], data);\n });\n });\n }\n}\nexport function roundRange(range, minimumChunkSize) {\n const length = range[1] - range[0] + 1;\n // const newLength = Math.ceil(length / minimum_chunk_size) * minimum_chunk_size;\n const newLength = Math.max(minimumChunkSize, length);\n return [range[0], range[0] + newLength - 1];\n}\n/**\n * Convert HTTP range header value to IContentRangeType\n * @param contentRange - content range\n */\nexport function parseContentRange(contentRange) {\n if (!contentRange) {\n throw new Error('Content range must be provided');\n }\n debug(`parseContentRange response: contentRange=${contentRange}`);\n const parsedContentRange = contentRange.match(/bytes (\\d+)-(\\d+)\\/(?:(\\d+)|\\*)/i);\n if (!parsedContentRange) {\n throw new Error(`FIXME: Unknown Content-Range syntax: ${contentRange}`);\n }\n return {\n firstBytePosition: Number.parseInt(parsedContentRange[1], 10),\n lastBytePosition: Number.parseInt(parsedContentRange[2], 10),\n instanceLength: parsedContentRange[3] ? Number.parseInt(parsedContentRange[3], 10) : undefined\n };\n}\n//# sourceMappingURL=range-request-tokenizer.js.map","const NOT_FOUND = -1;\n/**\n * Keeps track of data chunks (partial downloaded file fragments).\n *\n * Based on \"ChunkedFileData\" written by António Afonso\n * https://github.com/aadsm/jsmediatags/blob/master/src/ChunkedFileData.js\n */\nexport class ChunkedFileData {\n constructor() {\n this._fileData = [];\n }\n /**\n * Adds data to the file storage at a specific offset.\n */\n addData(offset, data) {\n const offsetEnd = offset + data.byteLength - 1;\n const chunkRange = this._getChunkRange(offset, offsetEnd);\n if (chunkRange.startIx === NOT_FOUND) {\n this._fileData.splice(chunkRange.insertIx || 0, 0, {\n offset,\n data\n });\n }\n else {\n // If the data to add collides with existing chunks we prepend and\n // append data from the half colliding chunks to make the collision at\n // 100%. The new data can then replace all the colliding chunkes.\n const firstChunk = this._fileData[chunkRange.startIx];\n const lastChunk = this._fileData[chunkRange.endIx];\n const needsPrepend = offset > firstChunk.offset;\n const needsAppend = offsetEnd < lastChunk.offset + lastChunk.data.byteLength - 1;\n const chunk = {\n offset: Math.min(offset, firstChunk.offset),\n data\n };\n if (needsPrepend) {\n const slicedData = firstChunk.data.slice(0, offset - firstChunk.offset);\n chunk.data = this._concatData(slicedData, data);\n }\n if (needsAppend) {\n // Use the lastChunk because the slice logic is easier to handle.\n const slicedData = chunk.data.slice(0, lastChunk.offset - chunk.offset);\n chunk.data = this._concatData(slicedData, lastChunk.data);\n }\n this._fileData.splice(chunkRange.startIx, chunkRange.endIx - chunkRange.startIx + 1, chunk);\n }\n }\n hasDataRange(offsetStart, offsetEnd) {\n for (let i = 0; i < this._fileData.length; i++) {\n const chunk = this._fileData[i];\n if (offsetEnd < chunk.offset) {\n return false;\n }\n if (offsetStart >= chunk.offset && offsetEnd < chunk.offset + chunk.data.byteLength) {\n return true;\n }\n }\n return false;\n }\n readToBuffer(buffer, offset, position, length) {\n const _pos_offset = position;\n let dataChunk;\n for (let i = 0; i < this._fileData.length; i++) {\n const dataChunkStart = this._fileData[i].offset;\n const dataChunkEnd = dataChunkStart + this._fileData[i].data.byteLength;\n if (_pos_offset >= dataChunkStart && _pos_offset < dataChunkEnd) {\n dataChunk = this._fileData[i];\n const chunkOffset = _pos_offset - dataChunkStart;\n let chunkLength = Math.min(length, dataChunk.data.byteLength - chunkOffset);\n buffer.set(dataChunk.data.subarray(chunkOffset, chunkOffset + chunkLength), offset);\n if (chunkLength < length) {\n chunkLength += this.readToBuffer(buffer, offset + chunkLength, position + chunkLength, length - chunkLength);\n }\n return chunkLength;\n }\n }\n return 0;\n }\n _concatData(buffer1, buffer2) {\n const tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);\n tmp.set(new Uint8Array(buffer1), 0);\n tmp.set(new Uint8Array(buffer2), buffer1.byteLength);\n return tmp;\n }\n /**\n * Finds the chunk range that overlaps the [offsetStart-1,offsetEnd+1] range.\n * When a chunk is adjacent to the offset we still consider it part of the\n * range (this is the situation of offsetStart-1 or offsetEnd+1).\n * When no chunks are found `insertIx` denotes the index where the data\n * should be inserted in the data list (startIx == NOT_FOUND and endIX ==\n * NOT_FOUND).\n */\n _getChunkRange(offsetStart, offsetEnd) {\n let startChunkIx = NOT_FOUND;\n let endChunkIx = NOT_FOUND;\n let insertIx = 0;\n // Could use binary search but not expecting that many blocks to exist.\n for (let i = 0; i < this._fileData.length; i++, insertIx = i) {\n const chunkOffsetStart = this._fileData[i].offset;\n const chunkOffsetEnd = chunkOffsetStart + this._fileData[i].data.byteLength;\n if (offsetEnd < chunkOffsetStart - 1) {\n // This offset range doesn't overlap with any chunks.\n break;\n }\n // If it is adjacent we still consider it part of the range because\n // we're going end up with a single block with all contiguous data.\n if (offsetStart <= chunkOffsetEnd + 1 &&\n offsetEnd >= chunkOffsetStart - 1) {\n startChunkIx = i;\n break;\n }\n }\n // No starting chunk was found, meaning that the offset is either before\n // or after the current stored chunks.\n if (startChunkIx === NOT_FOUND) {\n return {\n startIx: NOT_FOUND,\n endIx: NOT_FOUND,\n insertIx\n };\n }\n // Find the ending chunk.\n for (let i = startChunkIx; i < this._fileData.length; i++) {\n const chunkOffsetStart = this._fileData[i].offset;\n const chunkOffsetEnd = chunkOffsetStart + this._fileData[i].data.byteLength;\n if (offsetEnd >= chunkOffsetStart - 1) {\n // Candidate for the end chunk, it doesn't mean it is yet.\n endChunkIx = i;\n }\n if (offsetEnd <= chunkOffsetEnd + 1) {\n break;\n }\n }\n if (endChunkIx === NOT_FOUND) {\n endChunkIx = startChunkIx;\n }\n return {\n startIx: startChunkIx,\n endIx: endChunkIx\n };\n }\n}\n//# sourceMappingURL=chunked-file-data.js.map"],"mappings":"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EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAEO,IAAM,YAAY;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA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","names":["parse","ContentType","parse","import_debug","initDebug","tokenizer","tokenizer","tokenizer","import_debug","import_debug","tagMap","tagMap","tagType","debug","initDebug","tagType","debug","initDebug","ContentType","mimeTypeParse","tokenizer","tokenizer","tokenizer","tokenizer","tokenizer","debug","initDebug","import_debug","EndOfStreamError","AbstractTokenizer","EndOfStreamError","AbstractTokenizer","EndOfStreamError","fromFile","import_debug","debug","initDebug","debug","import_debug","debug","initDebug","debug","initDebug","ChunkedFileData","import_debug","debug","initDebug","RangeRequestTokenizer","ChunkedFileData","roundRange","import_debug","debug","initDebug","RangeRequestFactory","RangeRequestTokenizer","roundRange","tokenizer","RangeRequestFactory","tokenizer"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-FPOQLPK4.js.map"}
+722
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-FRIHFBDQ.js
··· 1 + import { 2 + highlightTableEntry 3 + } from "./chunk-3CXPPL5Z.js"; 4 + import { 5 + SCHEME as SCHEME2 6 + } from "./chunk-I3VKG3ZJ.js"; 7 + import { 8 + buildURI as buildURI2 9 + } from "./chunk-3AO35WC3.js"; 10 + import { 11 + SCHEME as SCHEME4 12 + } from "./chunk-GX3WPNEX.js"; 13 + import { 14 + SCHEME 15 + } from "./chunk-HN4F5JEZ.js"; 16 + import { 17 + buildURI 18 + } from "./chunk-GQIBEDKG.js"; 19 + import { 20 + SCHEME as SCHEME3 21 + } from "./chunk-EEUCFWD4.js"; 22 + import { 23 + A, 24 + DiffuseElement, 25 + query, 26 + queryOptional 27 + } from "./chunk-V7EQPFPD.js"; 28 + import { 29 + now 30 + } from "./chunk-BKRD2ZIW.js"; 31 + import { 32 + signal 33 + } from "./chunk-HNJPKCUJ.js"; 34 + import { 35 + __name, 36 + init_Buffer, 37 + init_process 38 + } from "./chunk-FZQXS3RE.js"; 39 + 40 + // themes/webamp/configurators/input/element.js 41 + init_Buffer(); 42 + init_process(); 43 + var InputConfig = class extends DiffuseElement { 44 + static { 45 + __name(this, "InputConfig"); 46 + } 47 + constructor() { 48 + super(); 49 + this.attachShadow({ mode: "open" }); 50 + } 51 + // SIGNALS 52 + $input = signal( 53 + /** @type {InputElement | undefined} */ 54 + void 0 55 + ); 56 + $output = signal( 57 + /** @type {OutputElement | undefined} */ 58 + void 0 59 + ); 60 + $sourcesOrchestrator = signal( 61 + /** @type {import("@components/orchestrator/sources/element.js").CLASS | undefined} */ 62 + void 0 63 + ); 64 + $processTracksOrchestrator = signal( 65 + /** @type {import("@components/orchestrator/process-tracks/element.js").CLASS | undefined} */ 66 + void 0 67 + ); 68 + $tab = signal("overview"); 69 + // LIFECYCLE 70 + /** 71 + * @override 72 + */ 73 + async connectedCallback() { 74 + super.connectedCallback(); 75 + const input = query(this, "input-selector"); 76 + const output = query(this, "output-selector"); 77 + const sourcesOrchestrator = query(this, "sources-orchestrator-selector"); 78 + const processTracksOrchestrator = queryOptional( 79 + this, 80 + "process-tracks-orchestrator-selector" 81 + ); 82 + await customElements.whenDefined(input.localName); 83 + await customElements.whenDefined(output.localName); 84 + await customElements.whenDefined(sourcesOrchestrator.localName); 85 + if (processTracksOrchestrator) { 86 + await customElements.whenDefined(processTracksOrchestrator.localName); 87 + } 88 + this.$input.value = input; 89 + this.$output.value = output; 90 + this.$sourcesOrchestrator.value = sourcesOrchestrator; 91 + if (processTracksOrchestrator) { 92 + this.$processTracksOrchestrator.value = processTracksOrchestrator; 93 + } 94 + let skip = true; 95 + this.effect(() => { 96 + if (skip) { 97 + skip = false; 98 + return; 99 + } 100 + const _trigger = sourcesOrchestrator.sources(); 101 + if (output.tracks.state() !== "loaded") return; 102 + processTracksOrchestrator?.process(); 103 + }); 104 + } 105 + // EVENTS 106 + #processSources = /* @__PURE__ */ __name(() => { 107 + this.$processTracksOrchestrator.value?.process(); 108 + }, "#processSources"); 109 + /** 110 + * @param {Event} event 111 + */ 112 + #addOpenSubsonicServer = /* @__PURE__ */ __name(async (event) => { 113 + event.preventDefault(); 114 + const button = this.root().querySelector("#opensubsonic-submit"); 115 + if (button) button.disabled = true; 116 + const host = this.formElement("opensubsonic-host")?.value; 117 + const tls = this.formElement("opensubsonic-tls")?.value === "true"; 118 + const username = this.formElement("opensubsonic-username")?.value; 119 + const password = this.formElement("opensubsonic-password")?.value; 120 + const apiKey = this.formElement("opensubsonic-apikey")?.value; 121 + if (!host) { 122 + throw new Error("Missing required `host` input value"); 123 + } 124 + const server = { 125 + host, 126 + tls, 127 + username, 128 + password, 129 + apiKey 130 + }; 131 + const uri = buildURI(server); 132 + await this.addSource(uri); 133 + if (button) button.disabled = false; 134 + }, "#addOpenSubsonicServer"); 135 + /** 136 + * @param {Event} event 137 + */ 138 + #addS3Bucket = /* @__PURE__ */ __name(async (event) => { 139 + event.preventDefault(); 140 + const button = this.root().querySelector("s3-submit"); 141 + if (button) button.disabled = true; 142 + const accessKey = this.formElement("s3-access-key")?.value; 143 + const bucketName = this.formElement("s3-bucket-name")?.value; 144 + const host = this.formElement("s3-host")?.value; 145 + const path = this.formElement("s3-path")?.value; 146 + const region = this.formElement("s3-region")?.value; 147 + const secretKey = this.formElement("s3-secret-key")?.value; 148 + if (!accessKey) { 149 + throw new Error("Missing required `accessKey` input value"); 150 + } 151 + if (!bucketName) { 152 + throw new Error("Missing required `bucketName` input value"); 153 + } 154 + if (!secretKey) { 155 + throw new Error("Missing required `secretKey` input value"); 156 + } 157 + const bucket = { 158 + accessKey, 159 + bucketName, 160 + host: host?.length ? host : "s3.amazonaws.com", 161 + path: path?.length ? path : "/", 162 + region: region?.length ? region : "us-east-1", 163 + secretKey 164 + }; 165 + const uri = buildURI2(bucket); 166 + await this.addSource(uri); 167 + if (button) button.disabled = false; 168 + }, "#addS3Bucket"); 169 + #addLocalDirectory = /* @__PURE__ */ __name(async () => { 170 + const localInput = ( 171 + /** @type {any} */ 172 + this.$input.value?.input?.inputs?.()[SCHEME2] 173 + ); 174 + if (!localInput) return; 175 + const uri = await localInput.addDirectory(); 176 + await this.addSource(uri); 177 + }, "#addLocalDirectory"); 178 + #addLocalFiles = /* @__PURE__ */ __name(async () => { 179 + const localInput = ( 180 + /** @type {any} */ 181 + this.$input.value?.input?.inputs?.()[SCHEME2] 182 + ); 183 + if (!localInput) return; 184 + const uris = await localInput.addFiles(); 185 + for (const uri of uris) { 186 + await this.addSource(uri); 187 + } 188 + }, "#addLocalFiles"); 189 + /** 190 + * @param {Event} event 191 + */ 192 + #addHttpsUrl = /* @__PURE__ */ __name(async (event) => { 193 + event.preventDefault(); 194 + const button = this.root().querySelector("#https-submit"); 195 + if (button) button.disabled = true; 196 + const url = this.formElement("https-url")?.value; 197 + if (!url) { 198 + throw new Error("Missing required `url` input value"); 199 + } 200 + await this.addSource(url); 201 + if (button) button.disabled = false; 202 + }, "#addHttpsUrl"); 203 + /** 204 + * @param {Event} event 205 + */ 206 + #deleteSelected = /* @__PURE__ */ __name(async (event) => { 207 + const button = ( 208 + /** @type {HTMLElement} */ 209 + event.target 210 + ); 211 + const fieldset = event.target ? button.closest("fieldset") : null; 212 + if (!fieldset) return; 213 + const selected = fieldset.querySelector( 214 + "table tr.highlighted" 215 + ); 216 + if (!selected) return; 217 + const uri = selected.getAttribute("data-uri"); 218 + if (!uri) throw new Error("Missing `uri` attribute"); 219 + const detachedTracks = await this.$input.value?.detach({ 220 + fileUriOrScheme: uri, 221 + tracks: this.$output.value?.tracks.collection() ?? [] 222 + }); 223 + if (detachedTracks) this.$output.value?.tracks.save(detachedTracks); 224 + }, "#deleteSelected"); 225 + /** @param {MouseEvent} event */ 226 + #highlightTableEntry(event) { 227 + highlightTableEntry(event); 228 + const fieldset = event.target ? ( 229 + /** @type {HTMLElement} */ 230 + event.target.closest("fieldset") 231 + ) : null; 232 + if (!fieldset) return; 233 + fieldset.querySelector('button[role="delete"]')?.removeAttribute( 234 + "disabled" 235 + ); 236 + } 237 + // 🛠️ 238 + /** 239 + * @param {string} uri 240 + */ 241 + async addSource(uri) { 242 + const now2 = (/* @__PURE__ */ new Date()).toISOString(); 243 + const track = { 244 + $type: "sh.diffuse.output.track", 245 + id: now(), 246 + createdAt: now2, 247 + updatedAt: now2, 248 + kind: "placeholder", 249 + uri 250 + }; 251 + await this.$output.value?.tracks.save( 252 + [...this.$output.value?.tracks.collection() ?? [], track] 253 + ); 254 + this.$tab.value = "overview"; 255 + } 256 + /** 257 + * @param {string} id 258 + * @returns {HTMLInputElement | null} 259 + */ 260 + formElement(id) { 261 + return this.root().querySelector(`#${id}`); 262 + } 263 + // RENDER 264 + /** 265 + * @param {RenderArg} _ 266 + */ 267 + render({ html }) { 268 + return html` 269 + <link rel="stylesheet" href="styles/vendor/98.css" /> 270 + <link rel="stylesheet" href="themes/webamp/98-extra.css" /> 271 + 272 + <style> 273 + @import "./themes/webamp/98-vars.css"; 274 + 275 + .button-row { 276 + display: inline-flex; 277 + gap: var(--grouped-button-spacing); 278 + } 279 + 280 + #tabbed { 281 + display: flex; 282 + flex-direction: column; 283 + height: 100%; 284 + } 285 + 286 + fieldset { 287 + margin-bottom: var(--element-spacing); 288 + } 289 + 290 + .window { 291 + flex: 1; 292 + overflow-y: auto; 293 + } 294 + 295 + /* TABS */ 296 + 297 + menu[role="tablist"] { 298 + padding-top: 2px; 299 + 300 + li > label { 301 + cursor: pointer; 302 + display: block; 303 + padding: var(--radio-label-spacing); 304 + } 305 + 306 + li[aria-selected="true"] { 307 + padding-bottom: 2px; 308 + margin-top: -2px; 309 + background-color: var(--surface); 310 + position: relative; 311 + z-index: 8; 312 + margin-left: -3px; 313 + } 314 + } 315 + 316 + /* LIST */ 317 + 318 + table { 319 + color: black; 320 + table-layout: fixed; 321 + } 322 + 323 + table td { 324 + overflow: hidden; 325 + text-overflow: ellipsis; 326 + } 327 + 328 + table tbody tr { 329 + cursor: pointer; 330 + } 331 + 332 + /* FORMS */ 333 + 334 + input, select, textarea { 335 + flex: 1; 336 + } 337 + </style> 338 + 339 + <div id="tabbed"> 340 + <menu role="tablist" class="multirows"> 341 + <li role="tab" aria-selected="${this.$tab.value === "overview"}"> 342 + <label @click="${() => this.$tab.value = "overview"}"> 343 + <span>Overview</span> 344 + </label> 345 + </li> 346 + <li role="tab" aria-selected="${this.$tab.value === "https"}"> 347 + <label @click="${() => this.$tab.value = "https"}"> 348 + <span>HTTPS</span> 349 + </label> 350 + </li> 351 + <li role="tab" aria-selected="${this.$tab.value === "local"}"> 352 + <label @click="${() => this.$tab.value = "local"}"> 353 + <span>Local</span> 354 + </label> 355 + </li> 356 + <li role="tab" aria-selected="${this.$tab.value === "opensubsonic"}"> 357 + <label @click="${() => this.$tab.value = "opensubsonic"}"> 358 + <span>OpenSubsonic</span> 359 + </label> 360 + </li> 361 + <li role="tab" aria-selected="${this.$tab.value === "s3"}"> 362 + <label @click="${() => this.$tab.value = "s3"}"> 363 + <span>S3</span> 364 + </label> 365 + </li> 366 + </menu> 367 + 368 + <div class="window" role="tabpanel"> 369 + ${this.#renderTab(html)} 370 + </div> 371 + </div> 372 + `; 373 + } 374 + /** 375 + * @param {RenderArg["html"]} html 376 + */ 377 + #renderTab(html) { 378 + switch (this.$tab.value) { 379 + case "overview": 380 + return this.#renderOverviewTab(html); 381 + case "https": 382 + return this.#renderHttpsTab(html); 383 + case "local": 384 + return this.#renderLocalTab(html); 385 + case "opensubsonic": 386 + return this.#renderOpenSubsonicTab(html); 387 + case "s3": 388 + return this.#renderS3Tab(html); 389 + default: 390 + return A; 391 + } 392 + } 393 + /** 394 + * @param {RenderArg["html"]} html 395 + */ 396 + #renderOverviewTab(html) { 397 + return html` 398 + <div class="window-body"> 399 + <fieldset> 400 + <span class="with-icon with-icon--large"> 401 + <img 402 + src="images/icons/windows_98/cd_audio_cd_a-0.png" 403 + width="24" 404 + /> 405 + <span>Here you can configure where your audio comes from.<br />Add sources 406 + using the tabs above, then tracks will be processed automatically. 407 + </span> 408 + </span> 409 + </fieldset> 410 + 411 + ${this.#renderProcessingProgress(html)} 412 + </div> 413 + `; 414 + } 415 + /** 416 + * @param {RenderArg["html"]} html 417 + */ 418 + #renderHttpsTab(html) { 419 + const sources = this.$sourcesOrchestrator.value?.sources(); 420 + return html` 421 + <div class="window-body"> 422 + <fieldset> 423 + ${this.#renderList( 424 + html, 425 + sources?.[SCHEME] ?? [], 426 + "Added URLs" 427 + )} 428 + 429 + <p> 430 + <button disabled role="delete" @click="${this.#deleteSelected}"> 431 + Delete selected 432 + </button> 433 + </p> 434 + </fieldset> 435 + 436 + <form @submit="${this.#addHttpsUrl}"> 437 + <fieldset> 438 + <div class="field-row"> 439 + <label for="https-url">URL:</label> 440 + <input 441 + id="https-url" 442 + type="url" 443 + required 444 + placeholder="https://example.com/audio.mp3" 445 + /> 446 + </div> 447 + </fieldset> 448 + 449 + <p> 450 + <button type="submit" id="https-submit">Add URL</button> 451 + </p> 452 + </form> 453 + </div> 454 + `; 455 + } 456 + /** 457 + * @param {RenderArg["html"]} html 458 + */ 459 + #renderLocalTab(html) { 460 + const sources = this.$sourcesOrchestrator.value?.sources(); 461 + return html` 462 + <div class="window-body"> 463 + <fieldset> 464 + ${this.#renderList( 465 + html, 466 + sources?.[SCHEME2] ?? [], 467 + "Added directories & files" 468 + )} 469 + 470 + <p> 471 + <button disabled role="delete" @click="${this.#deleteSelected}"> 472 + Delete selected 473 + </button> 474 + </p> 475 + </fieldset> 476 + 477 + <fieldset> 478 + <p class="button-row"> 479 + <button @click="${this.#addLocalDirectory}">Add directory</button> 480 + <button @click="${this.#addLocalFiles}">Add files</button> 481 + </p> 482 + </fieldset> 483 + </div> 484 + `; 485 + } 486 + /** 487 + * @param {RenderArg["html"]} html 488 + */ 489 + #renderOpenSubsonicTab(html) { 490 + const sources = this.$sourcesOrchestrator.value?.sources(); 491 + return html` 492 + <div class="window-body"> 493 + <fieldset> 494 + ${this.#renderList( 495 + html, 496 + sources?.[SCHEME3] ?? [], 497 + "Added servers" 498 + )} 499 + 500 + <p> 501 + <button disabled role="delete" @click="${this.#deleteSelected}"> 502 + Delete selected 503 + </button> 504 + </p> 505 + </fieldset> 506 + 507 + <form @submit="${this.#addOpenSubsonicServer}"> 508 + <fieldset> 509 + <legend>Server details</legend> 510 + 511 + <div class="field-row"> 512 + <label for="opensubsonic-host">Host domain:*</label> 513 + <input id="opensubsonic-host" type="text" required /> 514 + </div> 515 + 516 + <div class="field-row"> 517 + <label for="opensubsonic-tls">Use HTTPS/TLS:</label> 518 + <select id="opensubsonic-tls"> 519 + <option value="true" selected>Yes</option> 520 + <option value="false">No</option> 521 + </select> 522 + </div> 523 + 524 + <p> 525 + Either provide a username & password combination: 526 + </p> 527 + 528 + <div class="field-row"> 529 + <label for="opensubsonic-username">Username:</label> 530 + <input id="opensubsonic-username" type="text" /> 531 + </div> 532 + 533 + <div class="field-row"> 534 + <label for="opensubsonic-password">Password:</label> 535 + <input id="opensubsonic-password" type="password" /> 536 + </div> 537 + 538 + <p> 539 + Or an API key: 540 + </p> 541 + 542 + <div class="field-row"> 543 + <label for="opensubsonic-apikey">API key:</label> 544 + <input id="opensubsonic-apikey" type="text" /> 545 + </div> 546 + 547 + <p> 548 + * are required fields. 549 + </p> 550 + </fieldset> 551 + 552 + <p> 553 + <button type="submit" id="opensubsonic-submit">Add server</button> 554 + </p> 555 + </form> 556 + </div> 557 + `; 558 + } 559 + /** 560 + * @param {RenderArg["html"]} html 561 + */ 562 + #renderS3Tab(html) { 563 + const sources = this.$sourcesOrchestrator.value?.sources(); 564 + return html` 565 + <div class="window-body"> 566 + <fieldset> 567 + ${this.#renderList( 568 + html, 569 + sources?.[SCHEME4] ?? [], 570 + "Added buckets" 571 + )} 572 + 573 + <p> 574 + <button disabled role="delete" @click="${this.#deleteSelected}"> 575 + Delete selected 576 + </button> 577 + </p> 578 + </fieldset> 579 + 580 + <form @submit="${this.#addS3Bucket}"> 581 + <fieldset> 582 + <legend>Bucket details</legend> 583 + 584 + <div class="field-row"> 585 + <label for="s3-access-key">Access Key:*</label> 586 + <input type="text" id="s3-access-key" required /> 587 + </div> 588 + 589 + <div class="field-row"> 590 + <label for="s3-secret-key">Secret Key:*</label> 591 + <input type="password" id="s3-secret-key" required /> 592 + </div> 593 + 594 + <div class="field-row"> 595 + <label for="s3-bucket-name">Bucket Name:*</label> 596 + <input type="text" id="s3-bucket-name" required /> 597 + </div> 598 + 599 + <div class="field-row"> 600 + <label for="s3-host">Host:</label> 601 + <input 602 + type="text" 603 + id="s3-host" 604 + placeholder="s3.amazonaws.com" 605 + /> 606 + </div> 607 + 608 + <div class="field-row"> 609 + <label for="s3-region">Region:</label> 610 + <input 611 + type="text" 612 + id="s3-region" 613 + placeholder="us-east-1" 614 + /> 615 + </div> 616 + 617 + <div class="field-row"> 618 + <label for="s3-path">Path:</label> 619 + <input type="text" id="s3-path" /> 620 + </div> 621 + 622 + <p> 623 + * are required fields. 624 + </p> 625 + </fieldset> 626 + 627 + <p> 628 + <button type="submit" id="s3-submit">Add bucket</button> 629 + </p> 630 + </form> 631 + </div> 632 + `; 633 + } 634 + /** 635 + * @param {RenderArg["html"]} html 636 + */ 637 + #renderProcessingProgress(html) { 638 + const orchestrator = this.$processTracksOrchestrator.value; 639 + if (!orchestrator?.isProcessing()) { 640 + return html` 641 + <fieldset> 642 + <div class="with-icon with-icon--large"> 643 + <img 644 + src="images/icons/windows_98/gears-0.png" 645 + width="24" 646 + /> 647 + <div> 648 + <p> 649 + Go through all the inputs you've added and get the last audio files and 650 + their metadata. 651 + </p> 652 + <p> 653 + <button @click="${this.#processSources}">Process sources</button> 654 + </p> 655 + </div> 656 + </div> 657 + </fieldset> 658 + `; 659 + } 660 + const { processed, total } = orchestrator.progress(); 661 + const percentage = total > 0 ? Math.round(processed / total * 100) : 0; 662 + return html` 663 + <fieldset> 664 + <legend>Processing tracks</legend> 665 + <div class="with-icon with-icon--large"> 666 + <img 667 + src="images/icons/windows_98/gears-0.png" 668 + width="24" 669 + /> 670 + <span> 671 + ${total === 0 ? `Going through all the inputs and gathering the tracks ...` : `Making sure each track has metadata & statistics (${processed} / ${total}) ...`} 672 + </span> 673 + </div> 674 + <div 675 + class="progress-indicator" 676 + style="margin-top: var(--grouped-element-spacing);" 677 + > 678 + <div class="progress-indicator-bar" style="width: ${percentage}%"></div> 679 + </div> 680 + </fieldset> 681 + `; 682 + } 683 + /** 684 + * @param {RenderArg["html"]} html 685 + * @param {Array<{label: string, uri: string}>} list 686 + * @param {string} title 687 + */ 688 + #renderList(html, list, title) { 689 + return html` 690 + <div class="sunken-panel"> 691 + <table style="width: 100%;" @click="${this.#highlightTableEntry}"> 692 + <thead> 693 + <tr> 694 + <th>${title}</th> 695 + </tr> 696 + </thead> 697 + <tbody> 698 + ${list.map( 699 + (item) => html` 700 + <tr data-uri="${item.uri}"> 701 + <td>${item.label}</td> 702 + </tr> 703 + ` 704 + )} 705 + </tbody> 706 + </table> 707 + </div> 708 + `; 709 + } 710 + }; 711 + var element_default = InputConfig; 712 + var CLASS = InputConfig; 713 + var NAME = "dtw-input-config"; 714 + customElements.define(NAME, CLASS); 715 + 716 + export { 717 + element_default, 718 + CLASS, 719 + NAME 720 + }; 721 + 722 + //# sourceMappingURL=./chunk-FRIHFBDQ.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-FRIHFBDQ.js.map
··· 1 + {"version":3,"sources":["/themes/webamp/configurators/input/element.js"],"sourcesContent":["import * as TID from \"@atcute/tid\";\n\nimport {\n DiffuseElement,\n nothing,\n query,\n queryOptional,\n} from \"@common/element.js\";\nimport { signal } from \"@common/signal.js\";\n\nimport { buildURI as buildOpenSubsonicURI } from \"@components/input/opensubsonic/common.js\";\nimport { buildURI as buildS3URI } from \"@components/input/s3/common.js\";\n\nimport { SCHEME as HTTPS_SCHEME } from \"@components/input/https/constants.js\";\nimport { SCHEME as LOCAL_SCHEME } from \"@components/input/local/constants.js\";\nimport { SCHEME as OPENSUBSONIC_SCHEME } from \"@components/input/opensubsonic/constants.js\";\nimport { SCHEME as S3_SCHEME } from \"@components/input/s3/constants.js\";\n\nimport { highlightTableEntry } from \"../../common/ui.js\";\n\n/**\n * @import {RenderArg} from \"@common/element.d.ts\"\n * @import {Track} from \"@definitions/types.d.ts\"\n * @import {InputElement} from \"@components/input/types.d.ts\"\n * @import {OutputElement} from \"@components/output/types.d.ts\"\n *\n * @import {Server as OpenSubsonicServer} from \"@components/input/opensubsonic/types.d.ts\"\n * @import {Bucket as S3Bucket} from \"@components/input/s3/types.d.ts\"\n */\n\nclass InputConfig extends DiffuseElement {\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n }\n\n // SIGNALS\n\n $input = signal(\n /** @type {InputElement | undefined} */ (undefined),\n );\n\n $output = signal(\n /** @type {OutputElement | undefined} */ (undefined),\n );\n\n $sourcesOrchestrator = signal(\n /** @type {import(\"@components/orchestrator/sources/element.js\").CLASS | undefined} */ (undefined),\n );\n\n $processTracksOrchestrator = signal(\n /** @type {import(\"@components/orchestrator/process-tracks/element.js\").CLASS | undefined} */ (undefined),\n );\n\n $tab = signal(\"overview\");\n\n // LIFECYCLE\n\n /**\n * @override\n */\n async connectedCallback() {\n super.connectedCallback();\n\n /** @type {InputElement} */\n const input = query(this, \"input-selector\");\n\n /** @type {OutputElement} */\n const output = query(this, \"output-selector\");\n\n /** @type {import(\"@components/orchestrator/sources/element.js\").CLASS} */\n const sourcesOrchestrator = query(this, \"sources-orchestrator-selector\");\n\n /** @type {import(\"@components/orchestrator/process-tracks/element.js\").CLASS | null} */\n const processTracksOrchestrator = queryOptional(\n this,\n \"process-tracks-orchestrator-selector\",\n );\n\n await customElements.whenDefined(input.localName);\n await customElements.whenDefined(output.localName);\n await customElements.whenDefined(sourcesOrchestrator.localName);\n\n if (processTracksOrchestrator) {\n await customElements.whenDefined(processTracksOrchestrator.localName);\n }\n\n this.$input.value = input;\n this.$output.value = output;\n this.$sourcesOrchestrator.value = sourcesOrchestrator;\n\n if (processTracksOrchestrator) {\n this.$processTracksOrchestrator.value = processTracksOrchestrator;\n }\n\n // EFFECTS\n\n let skip = true;\n\n this.effect(() => {\n if (skip) {\n skip = false;\n return;\n }\n\n const _trigger = sourcesOrchestrator.sources();\n if (output.tracks.state() !== \"loaded\") return;\n processTracksOrchestrator?.process();\n });\n }\n\n // EVENTS\n\n #processSources = () => {\n this.$processTracksOrchestrator.value?.process();\n };\n\n /**\n * @param {Event} event\n */\n #addOpenSubsonicServer = async (event) => {\n event.preventDefault();\n\n /** @type {HTMLButtonElement | null} */\n const button = this.root().querySelector(\"#opensubsonic-submit\");\n if (button) button.disabled = true;\n\n const host = this.formElement(\"opensubsonic-host\")?.value;\n const tls = this.formElement(\"opensubsonic-tls\")?.value === \"true\";\n const username = this.formElement(\"opensubsonic-username\")?.value;\n const password = this.formElement(\"opensubsonic-password\")?.value;\n const apiKey = this.formElement(\"opensubsonic-apikey\")?.value;\n\n if (!host) {\n throw new Error(\"Missing required `host` input value\");\n }\n\n /** @type {OpenSubsonicServer} */\n const server = {\n host,\n tls,\n username,\n password,\n apiKey,\n };\n\n const uri = buildOpenSubsonicURI(server);\n await this.addSource(uri);\n\n if (button) button.disabled = false;\n };\n\n /**\n * @param {Event} event\n */\n #addS3Bucket = async (event) => {\n event.preventDefault();\n\n /** @type {HTMLButtonElement | null} */\n const button = this.root().querySelector(\"s3-submit\");\n if (button) button.disabled = true;\n\n const accessKey = this.formElement(\"s3-access-key\")?.value;\n const bucketName = this.formElement(\"s3-bucket-name\")?.value;\n const host = this.formElement(\"s3-host\")?.value;\n const path = this.formElement(\"s3-path\")?.value;\n const region = this.formElement(\"s3-region\")?.value;\n const secretKey = this.formElement(\"s3-secret-key\")?.value;\n\n if (!accessKey) {\n throw new Error(\"Missing required `accessKey` input value\");\n }\n\n if (!bucketName) {\n throw new Error(\"Missing required `bucketName` input value\");\n }\n\n if (!secretKey) {\n throw new Error(\"Missing required `secretKey` input value\");\n }\n\n /** @type {S3Bucket} */\n const bucket = {\n accessKey,\n bucketName,\n host: host?.length ? host : \"s3.amazonaws.com\",\n path: path?.length ? path : \"/\",\n region: region?.length ? region : \"us-east-1\",\n secretKey,\n };\n\n const uri = buildS3URI(bucket);\n await this.addSource(uri);\n\n if (button) button.disabled = false;\n };\n\n #addLocalDirectory = async () => {\n const localInput = /** @type {any} */ (this.$input.value)?.input\n ?.inputs?.()[LOCAL_SCHEME];\n if (!localInput) return;\n\n const uri = await localInput.addDirectory();\n await this.addSource(uri);\n };\n\n #addLocalFiles = async () => {\n const localInput = /** @type {any} */ (this.$input.value)?.input\n ?.inputs?.()[LOCAL_SCHEME];\n if (!localInput) return;\n\n const uris = await localInput.addFiles();\n for (const uri of uris) {\n await this.addSource(uri);\n }\n };\n\n /**\n * @param {Event} event\n */\n #addHttpsUrl = async (event) => {\n event.preventDefault();\n\n /** @type {HTMLButtonElement | null} */\n const button = this.root().querySelector(\"#https-submit\");\n if (button) button.disabled = true;\n\n const url = this.formElement(\"https-url\")?.value;\n\n if (!url) {\n throw new Error(\"Missing required `url` input value\");\n }\n\n await this.addSource(url);\n\n if (button) button.disabled = false;\n };\n\n /**\n * @param {Event} event\n */\n #deleteSelected = async (event) => {\n const button = /** @type {HTMLElement} */ (event.target);\n const fieldset = event.target ? button.closest(\"fieldset\") : null;\n if (!fieldset) return;\n\n const selected = fieldset.querySelector(\n \"table tr.highlighted\",\n );\n if (!selected) return;\n\n const uri = selected.getAttribute(\"data-uri\");\n if (!uri) throw new Error(\"Missing `uri` attribute\");\n\n const detachedTracks = await this.$input.value?.detach({\n fileUriOrScheme: uri,\n tracks: this.$output.value?.tracks.collection() ?? [],\n });\n\n if (detachedTracks) this.$output.value?.tracks.save(detachedTracks);\n };\n\n /** @param {MouseEvent} event */\n #highlightTableEntry(event) {\n highlightTableEntry(event);\n\n const fieldset = event.target\n ? /** @type {HTMLElement} */ (event.target).closest(\"fieldset\")\n : null;\n if (!fieldset) return;\n\n fieldset.querySelector('button[role=\"delete\"]')?.removeAttribute(\n \"disabled\",\n );\n }\n\n // 🛠️\n\n /**\n * @param {string} uri\n */\n async addSource(uri) {\n const now = new Date().toISOString();\n\n /** @type {Track} */\n const track = {\n $type: \"sh.diffuse.output.track\",\n id: TID.now(),\n createdAt: now,\n updatedAt: now,\n kind: \"placeholder\",\n uri,\n };\n\n await this.$output.value?.tracks.save(\n [...(this.$output.value?.tracks.collection() ?? []), track],\n );\n\n this.$tab.value = \"overview\";\n }\n\n /**\n * @param {string} id\n * @returns {HTMLInputElement | null}\n */\n formElement(id) {\n return this.root().querySelector(`#${id}`);\n }\n\n // RENDER\n\n /**\n * @param {RenderArg} _\n */\n render({ html }) {\n return html`\n <link rel=\"stylesheet\" href=\"styles/vendor/98.css\" />\n <link rel=\"stylesheet\" href=\"themes/webamp/98-extra.css\" />\n\n <style>\n @import \"./themes/webamp/98-vars.css\";\n\n .button-row {\n display: inline-flex;\n gap: var(--grouped-button-spacing);\n }\n\n #tabbed {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n fieldset {\n margin-bottom: var(--element-spacing);\n }\n\n .window {\n flex: 1;\n overflow-y: auto;\n }\n\n /* TABS */\n\n menu[role=\"tablist\"] {\n padding-top: 2px;\n\n li > label {\n cursor: pointer;\n display: block;\n padding: var(--radio-label-spacing);\n }\n\n li[aria-selected=\"true\"] {\n padding-bottom: 2px;\n margin-top: -2px;\n background-color: var(--surface);\n position: relative;\n z-index: 8;\n margin-left: -3px;\n }\n }\n\n /* LIST */\n\n table {\n color: black;\n table-layout: fixed;\n }\n\n table td {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n table tbody tr {\n cursor: pointer;\n }\n\n /* FORMS */\n\n input, select, textarea {\n flex: 1;\n }\n </style>\n\n <div id=\"tabbed\">\n <menu role=\"tablist\" class=\"multirows\">\n <li role=\"tab\" aria-selected=\"${this.$tab.value === \"overview\"}\">\n <label @click=\"${() => this.$tab.value = \"overview\"}\">\n <span>Overview</span>\n </label>\n </li>\n <li role=\"tab\" aria-selected=\"${this.$tab.value === \"https\"}\">\n <label @click=\"${() => this.$tab.value = \"https\"}\">\n <span>HTTPS</span>\n </label>\n </li>\n <li role=\"tab\" aria-selected=\"${this.$tab.value === \"local\"}\">\n <label @click=\"${() => this.$tab.value = \"local\"}\">\n <span>Local</span>\n </label>\n </li>\n <li role=\"tab\" aria-selected=\"${this.$tab.value === \"opensubsonic\"}\">\n <label @click=\"${() => this.$tab.value = \"opensubsonic\"}\">\n <span>OpenSubsonic</span>\n </label>\n </li>\n <li role=\"tab\" aria-selected=\"${this.$tab.value === \"s3\"}\">\n <label @click=\"${() => this.$tab.value = \"s3\"}\">\n <span>S3</span>\n </label>\n </li>\n </menu>\n\n <div class=\"window\" role=\"tabpanel\">\n ${this.#renderTab(html)}\n </div>\n </div>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderTab(html) {\n switch (this.$tab.value) {\n case \"overview\":\n return this.#renderOverviewTab(html);\n case \"https\":\n return this.#renderHttpsTab(html);\n case \"local\":\n return this.#renderLocalTab(html);\n case \"opensubsonic\":\n return this.#renderOpenSubsonicTab(html);\n case \"s3\":\n return this.#renderS3Tab(html);\n default:\n return nothing;\n }\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderOverviewTab(html) {\n return html`\n <div class=\"window-body\">\n <fieldset>\n <span class=\"with-icon with-icon--large\">\n <img\n src=\"images/icons/windows_98/cd_audio_cd_a-0.png\"\n width=\"24\"\n />\n <span>Here you can configure where your audio comes from.<br />Add sources\n using the tabs above, then tracks will be processed automatically.\n </span>\n </span>\n </fieldset>\n\n ${this.#renderProcessingProgress(html)}\n </div>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderHttpsTab(html) {\n const sources = this.$sourcesOrchestrator.value?.sources();\n\n return html`\n <div class=\"window-body\">\n <fieldset>\n ${this.#renderList(\n html,\n sources?.[HTTPS_SCHEME] ?? [],\n \"Added URLs\",\n )}\n\n <p>\n <button disabled role=\"delete\" @click=\"${this.#deleteSelected}\">\n Delete selected\n </button>\n </p>\n </fieldset>\n\n <form @submit=\"${this.#addHttpsUrl}\">\n <fieldset>\n <div class=\"field-row\">\n <label for=\"https-url\">URL:</label>\n <input\n id=\"https-url\"\n type=\"url\"\n required\n placeholder=\"https://example.com/audio.mp3\"\n />\n </div>\n </fieldset>\n\n <p>\n <button type=\"submit\" id=\"https-submit\">Add URL</button>\n </p>\n </form>\n </div>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderLocalTab(html) {\n const sources = this.$sourcesOrchestrator.value?.sources();\n\n return html`\n <div class=\"window-body\">\n <fieldset>\n ${this.#renderList(\n html,\n sources?.[LOCAL_SCHEME] ?? [],\n \"Added directories & files\",\n )}\n\n <p>\n <button disabled role=\"delete\" @click=\"${this.#deleteSelected}\">\n Delete selected\n </button>\n </p>\n </fieldset>\n\n <fieldset>\n <p class=\"button-row\">\n <button @click=\"${this.#addLocalDirectory}\">Add directory</button>\n <button @click=\"${this.#addLocalFiles}\">Add files</button>\n </p>\n </fieldset>\n </div>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderOpenSubsonicTab(html) {\n const sources = this.$sourcesOrchestrator.value?.sources();\n\n return html`\n <div class=\"window-body\">\n <fieldset>\n ${this.#renderList(\n html,\n sources?.[OPENSUBSONIC_SCHEME] ?? [],\n \"Added servers\",\n )}\n\n <p>\n <button disabled role=\"delete\" @click=\"${this.#deleteSelected}\">\n Delete selected\n </button>\n </p>\n </fieldset>\n\n <form @submit=\"${this.#addOpenSubsonicServer}\">\n <fieldset>\n <legend>Server details</legend>\n\n <div class=\"field-row\">\n <label for=\"opensubsonic-host\">Host domain:*</label>\n <input id=\"opensubsonic-host\" type=\"text\" required />\n </div>\n\n <div class=\"field-row\">\n <label for=\"opensubsonic-tls\">Use HTTPS/TLS:</label>\n <select id=\"opensubsonic-tls\">\n <option value=\"true\" selected>Yes</option>\n <option value=\"false\">No</option>\n </select>\n </div>\n\n <p>\n Either provide a username & password combination:\n </p>\n\n <div class=\"field-row\">\n <label for=\"opensubsonic-username\">Username:</label>\n <input id=\"opensubsonic-username\" type=\"text\" />\n </div>\n\n <div class=\"field-row\">\n <label for=\"opensubsonic-password\">Password:</label>\n <input id=\"opensubsonic-password\" type=\"password\" />\n </div>\n\n <p>\n Or an API key:\n </p>\n\n <div class=\"field-row\">\n <label for=\"opensubsonic-apikey\">API key:</label>\n <input id=\"opensubsonic-apikey\" type=\"text\" />\n </div>\n\n <p>\n * are required fields.\n </p>\n </fieldset>\n\n <p>\n <button type=\"submit\" id=\"opensubsonic-submit\">Add server</button>\n </p>\n </form>\n </div>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderS3Tab(html) {\n const sources = this.$sourcesOrchestrator.value?.sources();\n\n return html`\n <div class=\"window-body\">\n <fieldset>\n ${this.#renderList(\n html,\n sources?.[S3_SCHEME] ?? [],\n \"Added buckets\",\n )}\n\n <p>\n <button disabled role=\"delete\" @click=\"${this.#deleteSelected}\">\n Delete selected\n </button>\n </p>\n </fieldset>\n\n <form @submit=\"${this.#addS3Bucket}\">\n <fieldset>\n <legend>Bucket details</legend>\n\n <div class=\"field-row\">\n <label for=\"s3-access-key\">Access Key:*</label>\n <input type=\"text\" id=\"s3-access-key\" required />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-secret-key\">Secret Key:*</label>\n <input type=\"password\" id=\"s3-secret-key\" required />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-bucket-name\">Bucket Name:*</label>\n <input type=\"text\" id=\"s3-bucket-name\" required />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-host\">Host:</label>\n <input\n type=\"text\"\n id=\"s3-host\"\n placeholder=\"s3.amazonaws.com\"\n />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-region\">Region:</label>\n <input\n type=\"text\"\n id=\"s3-region\"\n placeholder=\"us-east-1\"\n />\n </div>\n\n <div class=\"field-row\">\n <label for=\"s3-path\">Path:</label>\n <input type=\"text\" id=\"s3-path\" />\n </div>\n\n <p>\n * are required fields.\n </p>\n </fieldset>\n\n <p>\n <button type=\"submit\" id=\"s3-submit\">Add bucket</button>\n </p>\n </form>\n </div>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n */\n #renderProcessingProgress(html) {\n const orchestrator = this.$processTracksOrchestrator.value;\n if (!orchestrator?.isProcessing()) {\n return html`\n <fieldset>\n <div class=\"with-icon with-icon--large\">\n <img\n src=\"images/icons/windows_98/gears-0.png\"\n width=\"24\"\n />\n <div>\n <p>\n Go through all the inputs you've added and get the last audio files and\n their metadata.\n </p>\n <p>\n <button @click=\"${this\n .#processSources}\">Process sources</button>\n </p>\n </div>\n </div>\n </fieldset>\n `;\n }\n\n const { processed, total } = orchestrator.progress();\n const percentage = total > 0 ? Math.round((processed / total) * 100) : 0;\n\n return html`\n <fieldset>\n <legend>Processing tracks</legend>\n <div class=\"with-icon with-icon--large\">\n <img\n src=\"images/icons/windows_98/gears-0.png\"\n width=\"24\"\n />\n <span>\n ${total === 0\n ? `Going through all the inputs and gathering the tracks ...`\n : `Making sure each track has metadata & statistics (${processed} / ${total}) ...`}\n </span>\n </div>\n <div\n class=\"progress-indicator\"\n style=\"margin-top: var(--grouped-element-spacing);\"\n >\n <div class=\"progress-indicator-bar\" style=\"width: ${percentage}%\"></div>\n </div>\n </fieldset>\n `;\n }\n\n /**\n * @param {RenderArg[\"html\"]} html\n * @param {Array<{label: string, uri: string}>} list\n * @param {string} title\n */\n #renderList(html, list, title) {\n return html`\n <div class=\"sunken-panel\">\n <table style=\"width: 100%;\" @click=\"${this.#highlightTableEntry}\">\n <thead>\n <tr>\n <th>${title}</th>\n </tr>\n </thead>\n <tbody>\n ${list.map((item) =>\n html`\n <tr data-uri=\"${item.uri}\">\n <td>${item.label}</td>\n </tr>\n `\n )}\n </tbody>\n </table>\n </div>\n `;\n }\n}\n\nexport default InputConfig;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = InputConfig;\nexport const NAME = \"dtw-input-config\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":"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","names":["buildURI","SCHEME","now"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-FRIHFBDQ.js.map"}
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-FVLUJBZP.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-FVLUJBZP.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-FVLUJBZP.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-FVLUJBZP.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-FZQXS3RE.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-FZQXS3RE.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-FZQXS3RE.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-FZQXS3RE.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-G4P4YFWD.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-G4P4YFWD.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-G4P4YFWD.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-G4P4YFWD.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-G56PUJUJ.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-G56PUJUJ.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-G56PUJUJ.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-G56PUJUJ.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-GCLDJKYV.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-GCLDJKYV.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-GCLDJKYV.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-GCLDJKYV.js.map
+79
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-GKE6NGNQ.js
··· 1 + import { 2 + DiffuseElement 3 + } from "./chunk-V7EQPFPD.js"; 4 + import { 5 + __name, 6 + init_Buffer, 7 + init_process 8 + } from "./chunk-FZQXS3RE.js"; 9 + 10 + // components/orchestrator/input/element.js 11 + init_Buffer(); 12 + init_process(); 13 + var InputOrchestrator = class extends DiffuseElement { 14 + static { 15 + __name(this, "InputOrchestrator"); 16 + } 17 + static NAME = "diffuse/orchestrator/input"; 18 + static WORKER_URL = "components/configurator/input/worker.js"; 19 + /** 20 + * @returns {InputElement} 21 + */ 22 + get input() { 23 + const input = this.querySelector("dc-input"); 24 + if (!input) throw new Error("Input orchestrator did not render yet."); 25 + return input; 26 + } 27 + // PROXY INPUT ACTIONS 28 + consult = ( 29 + /** @type {InputActions["consult"]} */ 30 + /* @__PURE__ */ __name((...args) => this.input.consult(...args), "consult") 31 + ); 32 + detach = ( 33 + /** @type {InputActions["detach"]} */ 34 + /* @__PURE__ */ __name((...args) => this.input.detach(...args), "detach") 35 + ); 36 + groupConsult = ( 37 + /** @type {InputActions["groupConsult"]} */ 38 + /* @__PURE__ */ __name((...args) => this.input.groupConsult(...args), "groupConsult") 39 + ); 40 + list = ( 41 + /** @type {InputActions["list"]} */ 42 + /* @__PURE__ */ __name((...args) => this.input.list(...args), "list") 43 + ); 44 + resolve = ( 45 + /** @type {InputActions["resolve"]} */ 46 + /* @__PURE__ */ __name((...args) => this.input.resolve(...args), "resolve") 47 + ); 48 + // PROXY OTHER FUNCTIONS 49 + /** @override */ 50 + dependencies() { 51 + return this.input.dependencies(); 52 + } 53 + // RENDER 54 + /** 55 + * @param {RenderArg} _ 56 + */ 57 + render({ html }) { 58 + return html` 59 + <dc-input> 60 + <di-https></di-https> 61 + <di-local></di-local> 62 + <di-opensubsonic></di-opensubsonic> 63 + <di-s3></di-s3> 64 + </dc-input> 65 + `; 66 + } 67 + }; 68 + var element_default = InputOrchestrator; 69 + var CLASS = InputOrchestrator; 70 + var NAME = "do-input"; 71 + customElements.define(NAME, CLASS); 72 + 73 + export { 74 + element_default, 75 + CLASS, 76 + NAME 77 + }; 78 + 79 + //# sourceMappingURL=./chunk-GKE6NGNQ.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-GKE6NGNQ.js.map
··· 1 + {"version":3,"sources":["/components/orchestrator/input/element.js"],"sourcesContent":["import { DiffuseElement } from \"@common/element.js\";\n\nimport \"@components/configurator/input/element.js\";\nimport \"@components/input/https/element.js\";\nimport \"@components/input/local/element.js\";\nimport \"@components/input/opensubsonic/element.js\";\nimport \"@components/input/s3/element.js\";\n\n/**\n * @import {RenderArg} from \"@common/element.d.ts\"\n * @import {InputActions, InputElement} from \"@components/input/types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\nclass InputOrchestrator extends DiffuseElement {\n static NAME = \"diffuse/orchestrator/input\";\n static WORKER_URL = \"components/configurator/input/worker.js\";\n\n /**\n * @returns {InputElement}\n */\n get input() {\n /** @type {InputElement | null} */\n const input = this.querySelector(\"dc-input\");\n\n if (!input) throw new Error(\"Input orchestrator did not render yet.\");\n return input;\n }\n\n // PROXY INPUT ACTIONS\n\n consult = /** @type {InputActions[\"consult\"]} */ (...args) =>\n this.input.consult(...args);\n\n detach = /** @type {InputActions[\"detach\"]} */ (...args) =>\n this.input.detach(...args);\n\n groupConsult = /** @type {InputActions[\"groupConsult\"]} */ (...args) =>\n this.input.groupConsult(...args);\n\n list = /** @type {InputActions[\"list\"]} */ (...args) =>\n this.input.list(...args);\n\n resolve = /** @type {InputActions[\"resolve\"]} */ (...args) =>\n this.input.resolve(...args);\n\n // PROXY OTHER FUNCTIONS\n\n /** @override */\n dependencies() {\n return this.input.dependencies();\n }\n\n // RENDER\n\n /**\n * @param {RenderArg} _\n */\n render({ html }) {\n return html`\n <dc-input>\n <di-https></di-https>\n <di-local></di-local>\n <di-opensubsonic></di-opensubsonic>\n <di-s3></di-s3>\n </dc-input>\n `;\n }\n}\n\nexport default InputOrchestrator;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = InputOrchestrator;\nexport const NAME = \"do-input\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":";;;;;;;;;;AAAA;AAAA;AAiBA,IAAM,oBAAN,cAAgC,eAAe;AAAA,EAjB/C,OAiB+C;AAAA;AAAA;AAAA,EAC7C,OAAO,OAAO;AAAA,EACd,OAAO,aAAa;AAAA;AAAA;AAAA;AAAA,EAKpB,IAAI,QAAQ;AAEV,UAAM,QAAQ,KAAK,cAAc,UAAU;AAE3C,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,wCAAwC;AACpE,WAAO;AAAA,EACT;AAAA;AAAA,EAIA;AAAA;AAAA,IAAiD,2BAAI,SACnD,KAAK,MAAM,QAAQ,GAAG,IAAI,GADqB;AAAA;AAAA,EAGjD;AAAA;AAAA,IAA+C,2BAAI,SACjD,KAAK,MAAM,OAAO,GAAG,IAAI,GADoB;AAAA;AAAA,EAG/C;AAAA;AAAA,IAA2D,2BAAI,SAC7D,KAAK,MAAM,aAAa,GAAG,IAAI,GAD0B;AAAA;AAAA,EAG3D;AAAA;AAAA,IAA2C,2BAAI,SAC7C,KAAK,MAAM,KAAK,GAAG,IAAI,GADkB;AAAA;AAAA,EAG3C;AAAA;AAAA,IAAiD,2BAAI,SACnD,KAAK,MAAM,QAAQ,GAAG,IAAI,GADqB;AAAA;AAAA;AAAA;AAAA,EAMjD,eAAe;AACb,WAAO,KAAK,MAAM,aAAa;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,EAAE,KAAK,GAAG;AACf,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQT;AACF;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,KAAK;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-GKE6NGNQ.js.map"}
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-GQIBEDKG.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-GQIBEDKG.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-GQIBEDKG.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-GQIBEDKG.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-GX3WPNEX.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-GX3WPNEX.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-GX3WPNEX.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-GX3WPNEX.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-H3WG7GN4.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-H3WG7GN4.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-H3WG7GN4.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-H3WG7GN4.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-HMBZONBJ.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-HMBZONBJ.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-HMBZONBJ.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-HMBZONBJ.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-HN4F5JEZ.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-HN4F5JEZ.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-HN4F5JEZ.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-HN4F5JEZ.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-HNJPKCUJ.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-HNJPKCUJ.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-HNJPKCUJ.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-HNJPKCUJ.js.map
+17
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-I3VKG3ZJ.js
··· 1 + import { 2 + init_Buffer, 3 + init_process 4 + } from "./chunk-FZQXS3RE.js"; 5 + 6 + // components/input/local/constants.js 7 + init_Buffer(); 8 + init_process(); 9 + var SCHEME = "local"; 10 + var IDB_HANDLES = "local-input/handles"; 11 + 12 + export { 13 + SCHEME, 14 + IDB_HANDLES 15 + }; 16 + 17 + //# sourceMappingURL=./chunk-I3VKG3ZJ.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-I3VKG3ZJ.js.map
··· 1 + {"version":3,"sources":["/components/input/local/constants.js"],"sourcesContent":["export const SCHEME = \"local\";\nexport const IDB_HANDLES = \"local-input/handles\";\n"],"mappings":";;;;;;AAAA;AAAA;AAAO,IAAM,SAAS;AACf,IAAM,cAAc;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-I3VKG3ZJ.js.map"}
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-IGKYDHDK.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-IGKYDHDK.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-IGKYDHDK.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-IGKYDHDK.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-J67JY2AB.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-J67JY2AB.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-J67JY2AB.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-J67JY2AB.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-JBHW662S.js
··· 1 + ../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-JBHW662S.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-JBHW662S.js.map
··· 1 + ../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-JBHW662S.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-JZMTETBD.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-JZMTETBD.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-JZMTETBD.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-JZMTETBD.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-KJFA7KRK.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-KJFA7KRK.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-KJFA7KRK.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-KJFA7KRK.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-M2MAFKPM.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-M2MAFKPM.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-M2MAFKPM.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-M2MAFKPM.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-MVUUUQRL.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-MVUUUQRL.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-MVUUUQRL.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-MVUUUQRL.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-NBQPHQFP.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-NBQPHQFP.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-NBQPHQFP.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-NBQPHQFP.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-NP7LZHKR.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-NP7LZHKR.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-NP7LZHKR.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-NP7LZHKR.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-NZ7ODGIJ.js
··· 1 + ../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/chunk-NZ7ODGIJ.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-NZ7ODGIJ.js.map
··· 1 + ../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/chunk-NZ7ODGIJ.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-OBWEBS4T.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-OBWEBS4T.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-OBWEBS4T.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-OBWEBS4T.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-OIRYE7B4.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-OIRYE7B4.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-OIRYE7B4.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-OIRYE7B4.js.map
+189
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-OSKZBJ24.js
··· 1 + import { 2 + o 3 + } from "./chunk-XGM6M423.js"; 4 + import { 5 + DEFAULT_GROUP, 6 + DiffuseElement 7 + } from "./chunk-V7EQPFPD.js"; 8 + import { 9 + __name, 10 + init_Buffer, 11 + init_process 12 + } from "./chunk-FZQXS3RE.js"; 13 + 14 + // components/orchestrator/output/element.js 15 + init_Buffer(); 16 + init_process(); 17 + var OutputOrchestrator = class extends DiffuseElement { 18 + static { 19 + __name(this, "OutputOrchestrator"); 20 + } 21 + static NAME = "diffuse/orchestrator/output"; 22 + // LIFECYCLE 23 + /** 24 + * @override 25 + */ 26 + async connectedCallback() { 27 + super.connectedCallback(); 28 + let previouslyActivated = /* @__PURE__ */ new Set(); 29 + this.effect(() => { 30 + const set = this.outputConfigurator.activated(); 31 + const newlyActicated = set.difference(previouslyActivated); 32 + newlyActicated.forEach((id) => { 33 + switch (id) { 34 + case "do-output__dc-output__local": { 35 + import("./components/output/polymorphic/indexed-db/element.js"); 36 + import("./components/transformer/output/string/json/element.js"); 37 + break; 38 + } 39 + case "do-output__dc-output__atproto": { 40 + import("./components/output/raw/atproto/element.js"); 41 + import("./components/transformer/output/raw/atproto-sync/element.js"); 42 + import("./components/transformer/output/refiner/track-uri-passkey/element.js"); 43 + break; 44 + } 45 + case "do-output__dc-output__s3": { 46 + import("./components/output/bytes/s3/element.js"); 47 + import("./components/transformer/output/bytes/dasl-sync/element.js"); 48 + break; 49 + } 50 + } 51 + }); 52 + previouslyActivated = set; 53 + }); 54 + } 55 + // ELEMENT GETTERS 56 + /** 57 + * @returns {OutputElement} 58 + */ 59 + get output() { 60 + const output = this.root().querySelector("#do-output__output"); 61 + if (!output) throw new Error("Output orchestrator did not render yet."); 62 + return output; 63 + } 64 + /** 65 + * @returns {OutputConfiguratorElement} 66 + */ 67 + get outputConfigurator() { 68 + const outputConfigurator = this.root().querySelector( 69 + "#do-output__dc-output" 70 + ); 71 + if (!outputConfigurator) { 72 + throw new Error("Output orchestrator did not render yet."); 73 + } 74 + return outputConfigurator; 75 + } 76 + // PROXY OUTPUT ACTIONS 77 + get facets() { 78 + return this.output.facets; 79 + } 80 + get playlistItems() { 81 + return this.output.playlistItems; 82 + } 83 + get themes() { 84 + return this.output.themes; 85 + } 86 + get tracks() { 87 + return this.output.tracks; 88 + } 89 + get ready() { 90 + return this.output.ready; 91 + } 92 + // PROXY ADDITIONAL OUTPUT CONFIGURATOR ACTIONS 93 + get activated() { 94 + return this.outputConfigurator.activated; 95 + } 96 + get deselect() { 97 + return this.outputConfigurator.deselect; 98 + } 99 + get options() { 100 + return this.outputConfigurator.options; 101 + } 102 + get select() { 103 + return this.outputConfigurator.select; 104 + } 105 + get selected() { 106 + return this.outputConfigurator.selected; 107 + } 108 + // RENDER 109 + /** 110 + * @param {RenderArg} _ 111 + */ 112 + render({ html }) { 113 + const group = this.group === DEFAULT_GROUP ? void 0 : this.group; 114 + return html` 115 + <dop-indexed-db 116 + id="do-output__dop-indexed-db__json" 117 + namespace="json" 118 + group="${o(group)}" 119 + ></dop-indexed-db> 120 + 121 + <!-- ⚙️ S3 --> 122 + <dob-s3 id="do-output__dob-s3" group="${o(group)}"></dob-s3> 123 + 124 + <!-- ⚙️ ATPROTO --> 125 + <dtor-atproto-sync 126 + id="do-output__dtor-atproto-sync" 127 + namespace="atproto" 128 + output-selector="#do-output__dor-atproto" 129 + group="${o(group)}" 130 + ></dtor-atproto-sync> 131 + 132 + <dor-atproto 133 + id="do-output__dor-atproto" 134 + group="${o(group)}" 135 + ></dor-atproto> 136 + 137 + <!-- OUTPUT CONFIGURATOR --> 138 + <dc-output 139 + id="do-output__dc-output" 140 + default="do-output__dc-output__local" 141 + group="${o(group)}" 142 + > 143 + <!-- local --> 144 + <dtos-json 145 + id="do-output__dc-output__local" 146 + output-selector="#do-output__dop-indexed-db__json" 147 + label="Local" 148 + ></dtos-json> 149 + 150 + <!-- atproto --> 151 + <dtor-track-uri-passkey 152 + id="do-output__dc-output__atproto" 153 + namespace="atproto" 154 + output-selector="#do-output__dtor-atproto-sync" 155 + group="${o(group)}" 156 + label="AT Protocol" 157 + > 158 + </dtor-track-uri-passkey> 159 + 160 + <!-- s3 --> 161 + <dtob-dasl-sync 162 + id="do-output__dc-output__s3" 163 + namespace="s3" 164 + output-selector="#do-output__dob-s3" 165 + group="${o(group)}" 166 + label="S3" 167 + ></dtob-dasl-sync> 168 + </dc-output> 169 + 170 + <!-- ENTRY ⬆️ --> 171 + <dtor-default 172 + id="do-output__output" 173 + output-selector="#do-output__dc-output" 174 + ></dtor-default> 175 + `; 176 + } 177 + }; 178 + var element_default = OutputOrchestrator; 179 + var CLASS = OutputOrchestrator; 180 + var NAME = "do-output"; 181 + customElements.define(NAME, CLASS); 182 + 183 + export { 184 + element_default, 185 + CLASS, 186 + NAME 187 + }; 188 + 189 + //# sourceMappingURL=./chunk-OSKZBJ24.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-OSKZBJ24.js.map
··· 1 + {"version":3,"sources":["/components/orchestrator/output/element.js"],"sourcesContent":["import { ifDefined } from \"lit-html/directives/if-defined.js\";\nimport { DEFAULT_GROUP, DiffuseElement } from \"@common/element.js\";\n\nimport \"@components/configurator/output/element.js\";\nimport \"@components/transformer/output/refiner/default/element.js\";\n\n/**\n * @import {RenderArg} from \"@common/element.d.ts\"\n * @import {OutputElement} from \"@components/output/types.d.ts\"\n * @import {OutputConfiguratorElement} from \"@components/configurator/output/types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * A default setup for managing output.\n *\n * @implements {OutputConfiguratorElement}\n */\nclass OutputOrchestrator extends DiffuseElement {\n static NAME = \"diffuse/orchestrator/output\";\n\n // LIFECYCLE\n\n /**\n * @override\n */\n async connectedCallback() {\n super.connectedCallback();\n\n /** @type {Set<string>} */\n let previouslyActivated = new Set();\n\n this.effect(() => {\n const set = this.outputConfigurator.activated();\n const newlyActicated = set.difference(previouslyActivated);\n\n newlyActicated.forEach((id) => {\n switch (id) {\n case \"do-output__dc-output__local\": {\n import(\"@components/output/polymorphic/indexed-db/element.js\");\n import(\"@components/transformer/output/string/json/element.js\");\n break;\n }\n case \"do-output__dc-output__atproto\": {\n import(\"@components/output/raw/atproto/element.js\");\n import(\n \"@components/transformer/output/raw/atproto-sync/element.js\"\n );\n import(\n \"@components/transformer/output/refiner/track-uri-passkey/element.js\"\n );\n break;\n }\n case \"do-output__dc-output__s3\": {\n import(\"@components/output/bytes/s3/element.js\");\n import(\"@components/transformer/output/bytes/dasl-sync/element.js\");\n break;\n }\n }\n });\n\n previouslyActivated = set;\n });\n }\n\n // ELEMENT GETTERS\n\n /**\n * @returns {OutputElement}\n */\n get output() {\n /** @type {OutputElement | null} */\n const output = this.root().querySelector(\"#do-output__output\");\n\n if (!output) throw new Error(\"Output orchestrator did not render yet.\");\n return output;\n }\n\n /**\n * @returns {OutputConfiguratorElement}\n */\n get outputConfigurator() {\n /** @type {OutputConfiguratorElement | null} */\n const outputConfigurator = this.root().querySelector(\n \"#do-output__dc-output\",\n );\n\n if (!outputConfigurator) {\n throw new Error(\"Output orchestrator did not render yet.\");\n }\n\n return outputConfigurator;\n }\n\n // PROXY OUTPUT ACTIONS\n\n get facets() {\n return this.output.facets;\n }\n\n get playlistItems() {\n return this.output.playlistItems;\n }\n\n get themes() {\n return this.output.themes;\n }\n\n get tracks() {\n return this.output.tracks;\n }\n\n get ready() {\n return this.output.ready;\n }\n\n // PROXY ADDITIONAL OUTPUT CONFIGURATOR ACTIONS\n\n get activated() {\n return this.outputConfigurator.activated;\n }\n\n get deselect() {\n return this.outputConfigurator.deselect;\n }\n\n get options() {\n return this.outputConfigurator.options;\n }\n\n get select() {\n return this.outputConfigurator.select;\n }\n\n get selected() {\n return this.outputConfigurator.selected;\n }\n\n // RENDER\n\n /**\n * @param {RenderArg} _\n */\n render({ html }) {\n const group = this.group === DEFAULT_GROUP ? undefined : this.group;\n\n return html`\n <dop-indexed-db\n id=\"do-output__dop-indexed-db__json\"\n namespace=\"json\"\n group=\"${ifDefined(group)}\"\n ></dop-indexed-db>\n\n <!-- ⚙️ S3 -->\n <dob-s3 id=\"do-output__dob-s3\" group=\"${ifDefined(group)}\"></dob-s3>\n\n <!-- ⚙️ ATPROTO -->\n <dtor-atproto-sync\n id=\"do-output__dtor-atproto-sync\"\n namespace=\"atproto\"\n output-selector=\"#do-output__dor-atproto\"\n group=\"${ifDefined(group)}\"\n ></dtor-atproto-sync>\n\n <dor-atproto\n id=\"do-output__dor-atproto\"\n group=\"${ifDefined(group)}\"\n ></dor-atproto>\n\n <!-- OUTPUT CONFIGURATOR -->\n <dc-output\n id=\"do-output__dc-output\"\n default=\"do-output__dc-output__local\"\n group=\"${ifDefined(group)}\"\n >\n <!-- local -->\n <dtos-json\n id=\"do-output__dc-output__local\"\n output-selector=\"#do-output__dop-indexed-db__json\"\n label=\"Local\"\n ></dtos-json>\n\n <!-- atproto -->\n <dtor-track-uri-passkey\n id=\"do-output__dc-output__atproto\"\n namespace=\"atproto\"\n output-selector=\"#do-output__dtor-atproto-sync\"\n group=\"${ifDefined(group)}\"\n label=\"AT Protocol\"\n >\n </dtor-track-uri-passkey>\n\n <!-- s3 -->\n <dtob-dasl-sync\n id=\"do-output__dc-output__s3\"\n namespace=\"s3\"\n output-selector=\"#do-output__dob-s3\"\n group=\"${ifDefined(group)}\"\n label=\"S3\"\n ></dtob-dasl-sync>\n </dc-output>\n\n <!-- ENTRY ⬆️ -->\n <dtor-default\n id=\"do-output__output\"\n output-selector=\"#do-output__dc-output\"\n ></dtor-default>\n `;\n }\n}\n\nexport default OutputOrchestrator;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = OutputOrchestrator;\nexport const NAME = \"do-output\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":"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","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-OSKZBJ24.js.map"}
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-PJWFBDSG.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-PJWFBDSG.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-PJWFBDSG.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-PJWFBDSG.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-PKN6FN7E.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-PKN6FN7E.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-PKN6FN7E.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-PKN6FN7E.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-PTVB4Y37.js
··· 1 + ../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/chunk-PTVB4Y37.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-PTVB4Y37.js.map
··· 1 + ../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/chunk-PTVB4Y37.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-QBVAW255.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-QBVAW255.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-QBVAW255.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-QBVAW255.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-QERJLR3Q.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-QERJLR3Q.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-QERJLR3Q.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-QERJLR3Q.js.map
+156
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-QSPAYUAI.js
··· 1 + import { 2 + IDB_HANDLES, 3 + SCHEME 4 + } from "./chunk-I3VKG3ZJ.js"; 5 + import { 6 + get, 7 + set 8 + } from "./chunk-JBHW662S.js"; 9 + import { 10 + isAudioFile 11 + } from "./chunk-DDF5P57I.js"; 12 + import { 13 + safeDecodeURIComponent 14 + } from "./chunk-KJFA7KRK.js"; 15 + import { 16 + require_fast_uri 17 + } from "./chunk-SGR5ST3A.js"; 18 + import { 19 + __name, 20 + __toESM, 21 + init_Buffer, 22 + init_process 23 + } from "./chunk-FZQXS3RE.js"; 24 + 25 + // components/input/local/common.js 26 + init_Buffer(); 27 + init_process(); 28 + var URI = __toESM(require_fast_uri()); 29 + function parseURI(uriString) { 30 + try { 31 + const url = new URL(uriString); 32 + if (url.protocol !== `${SCHEME}:`) return void 0; 33 + if (!url.host) return void 0; 34 + return { 35 + tid: url.host, 36 + path: safeDecodeURIComponent(url.pathname) 37 + }; 38 + } catch { 39 + return void 0; 40 + } 41 + } 42 + __name(parseURI, "parseURI"); 43 + function buildURI(tid, path = "/") { 44 + return URI.serialize({ 45 + scheme: SCHEME, 46 + host: tid, 47 + path 48 + }); 49 + } 50 + __name(buildURI, "buildURI"); 51 + function groupTracksByTid(tracks) { 52 + const acc = {}; 53 + tracks.forEach((track) => { 54 + const parsed = parseURI(track.uri); 55 + if (!parsed) return; 56 + const { tid } = parsed; 57 + if (acc[tid]) { 58 + acc[tid].tracks.push(track); 59 + } else { 60 + acc[tid] = { tid, tracks: [track] }; 61 + } 62 + }); 63 + return acc; 64 + } 65 + __name(groupTracksByTid, "groupTracksByTid"); 66 + function groupUrisByTid(uris) { 67 + const acc = {}; 68 + uris.forEach((uri) => { 69 + const parsed = parseURI(uri); 70 + if (!parsed) return; 71 + const { tid } = parsed; 72 + if (acc[tid]) { 73 + acc[tid].uris.push(uri); 74 + } else { 75 + acc[tid] = { tid, uris: [uri] }; 76 + } 77 + }); 78 + return acc; 79 + } 80 + __name(groupUrisByTid, "groupUrisByTid"); 81 + function tidsFromTracks(tracks) { 82 + const acc = {}; 83 + tracks.forEach((track) => { 84 + const parsed = parseURI(track.uri); 85 + if (!parsed) return; 86 + acc[parsed.tid] = parsed.tid; 87 + }); 88 + return acc; 89 + } 90 + __name(tidsFromTracks, "tidsFromTracks"); 91 + async function loadHandles() { 92 + const i = await get(IDB_HANDLES); 93 + return i ?? {}; 94 + } 95 + __name(loadHandles, "loadHandles"); 96 + async function saveHandles(handles) { 97 + await set(IDB_HANDLES, handles); 98 + } 99 + __name(saveHandles, "saveHandles"); 100 + async function getHandleFile(handle, path) { 101 + if (handle.kind === "file") { 102 + return ( 103 + /** @type {FileSystemFileHandle} */ 104 + handle 105 + ); 106 + } 107 + const parts = path.replace(/^\//, "").split("/").filter(Boolean); 108 + let current = ( 109 + /** @type {FileSystemDirectoryHandle} */ 110 + handle 111 + ); 112 + for (const part of parts.slice(0, -1)) { 113 + current = await current.getDirectoryHandle(part); 114 + } 115 + return current.getFileHandle( 116 + /** @type {string} */ 117 + parts.at(-1) 118 + ); 119 + } 120 + __name(getHandleFile, "getHandleFile"); 121 + async function enumerateAudioFiles(dirHandle, basePath = "/") { 122 + const results = []; 123 + for await ( 124 + const [name, handle] of 125 + /** @type {any} */ 126 + dirHandle.entries() 127 + ) { 128 + const entryPath = basePath + name; 129 + if (handle.kind === "directory") { 130 + const sub = await enumerateAudioFiles( 131 + /** @type {FileSystemDirectoryHandle} */ 132 + handle, 133 + entryPath + "/" 134 + ); 135 + results.push(...sub); 136 + } else if (isAudioFile(name)) { 137 + results.push(entryPath); 138 + } 139 + } 140 + return results; 141 + } 142 + __name(enumerateAudioFiles, "enumerateAudioFiles"); 143 + 144 + export { 145 + parseURI, 146 + buildURI, 147 + groupTracksByTid, 148 + groupUrisByTid, 149 + tidsFromTracks, 150 + loadHandles, 151 + saveHandles, 152 + getHandleFile, 153 + enumerateAudioFiles 154 + }; 155 + 156 + //# sourceMappingURL=./chunk-QSPAYUAI.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-QSPAYUAI.js.map
··· 1 + {"version":3,"sources":["/components/input/local/common.js"],"sourcesContent":["import * as IDB from \"idb-keyval\";\nimport * as URI from \"fast-uri\";\n\nimport { isAudioFile } from \"@components/input/common.js\";\nimport { safeDecodeURIComponent } from \"@common/utils.js\";\nimport { IDB_HANDLES, SCHEME } from \"./constants.js\";\n\n/**\n * @import { Track } from \"@definitions/types.d.ts\"\n */\n\n////////////////////////////////////////////\n// 🛠️\n////////////////////////////////////////////\n\n/**\n * @param {string} uriString\n * @returns {{ tid: string; path: string } | undefined}\n */\nexport function parseURI(uriString) {\n try {\n const url = new URL(uriString);\n if (url.protocol !== `${SCHEME}:`) return undefined;\n if (!url.host) return undefined;\n\n return {\n tid: url.host,\n path: safeDecodeURIComponent(url.pathname),\n };\n } catch {\n return undefined;\n }\n}\n\n/**\n * @param {string} tid\n * @param {string} [path]\n */\nexport function buildURI(tid, path = \"/\") {\n return URI.serialize({\n scheme: SCHEME,\n host: tid,\n path,\n });\n}\n\n/**\n * @param {Track[]} tracks\n * @returns {Record<string, { tid: string; tracks: Track[] }>}\n */\nexport function groupTracksByTid(tracks) {\n /** @type {Record<string, { tid: string; tracks: Track[] }>} */\n const acc = {};\n\n tracks.forEach((track) => {\n const parsed = parseURI(track.uri);\n if (!parsed) return;\n\n const { tid } = parsed;\n if (acc[tid]) {\n acc[tid].tracks.push(track);\n } else {\n acc[tid] = { tid, tracks: [track] };\n }\n });\n\n return acc;\n}\n\n/**\n * @param {string[]} uris\n * @returns {Record<string, { tid: string; uris: string[] }>}\n */\nexport function groupUrisByTid(uris) {\n /** @type {Record<string, { tid: string; uris: string[] }>} */\n const acc = {};\n\n uris.forEach((uri) => {\n const parsed = parseURI(uri);\n if (!parsed) return;\n\n const { tid } = parsed;\n if (acc[tid]) {\n acc[tid].uris.push(uri);\n } else {\n acc[tid] = { tid, uris: [uri] };\n }\n });\n\n return acc;\n}\n\n/**\n * @param {Track[]} tracks\n * @returns {Record<string, string>}\n */\nexport function tidsFromTracks(tracks) {\n /** @type {Record<string, string>} */\n const acc = {};\n\n tracks.forEach((track) => {\n const parsed = parseURI(track.uri);\n if (!parsed) return;\n acc[parsed.tid] = parsed.tid;\n });\n\n return acc;\n}\n\n/**\n * @returns {Promise<Record<string, FileSystemHandle>>}\n */\nexport async function loadHandles() {\n const i = await IDB.get(IDB_HANDLES);\n return i ?? {};\n}\n\n/**\n * @param {Record<string, FileSystemHandle>} handles\n */\nexport async function saveHandles(handles) {\n await IDB.set(IDB_HANDLES, handles);\n}\n\n/**\n * @param {FileSystemHandle} handle\n * @param {string} path\n * @returns {Promise<FileSystemFileHandle>}\n */\nexport async function getHandleFile(handle, path) {\n if (handle.kind === \"file\") {\n return /** @type {FileSystemFileHandle} */ (handle);\n }\n\n const parts = path.replace(/^\\//, \"\").split(\"/\").filter(Boolean);\n let current = /** @type {FileSystemDirectoryHandle} */ (handle);\n\n for (const part of parts.slice(0, -1)) {\n current = await current.getDirectoryHandle(part);\n }\n\n return current.getFileHandle(/** @type {string} */ (parts.at(-1)));\n}\n\n/**\n * @param {FileSystemDirectoryHandle} dirHandle\n * @param {string} [basePath]\n * @returns {Promise<string[]>}\n */\nexport async function enumerateAudioFiles(dirHandle, basePath = \"/\") {\n const results = [];\n\n for await (const [name, handle] of /** @type {any} */ (dirHandle).entries()) {\n const entryPath = basePath + name;\n\n if (handle.kind === \"directory\") {\n const sub = await enumerateAudioFiles(\n /** @type {FileSystemDirectoryHandle} */ (handle),\n entryPath + \"/\",\n );\n results.push(...sub);\n } else if (isAudioFile(name)) {\n results.push(entryPath);\n }\n }\n\n return results;\n}\n"],"mappings":"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","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-QSPAYUAI.js.map"}
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-QXBWZVFE.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-QXBWZVFE.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-QXBWZVFE.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-QXBWZVFE.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-R3EQQDW5.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-R3EQQDW5.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-R3EQQDW5.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-R3EQQDW5.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-S6SMX4HA.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-S6SMX4HA.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-S6SMX4HA.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-S6SMX4HA.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-SGR5ST3A.js
··· 1 + ../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/chunk-SGR5ST3A.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-SGR5ST3A.js.map
··· 1 + ../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/chunk-SGR5ST3A.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-TP5GZFTO.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-TP5GZFTO.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-TP5GZFTO.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-TP5GZFTO.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-TSYF7OPM.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-TSYF7OPM.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-TSYF7OPM.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-TSYF7OPM.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-TXU4RB3O.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-TXU4RB3O.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-TXU4RB3O.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-TXU4RB3O.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-UMMPFCLQ.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-UMMPFCLQ.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-UMMPFCLQ.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-UMMPFCLQ.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-V7EQPFPD.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-V7EQPFPD.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-V7EQPFPD.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-V7EQPFPD.js.map
+108
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-VWO2GNWZ.js
··· 1 + import { 2 + buildURI, 3 + loadHandles, 4 + saveHandles, 5 + tidsFromTracks 6 + } from "./chunk-QSPAYUAI.js"; 7 + import { 8 + SCHEME 9 + } from "./chunk-I3VKG3ZJ.js"; 10 + import { 11 + DiffuseElement 12 + } from "./chunk-V7EQPFPD.js"; 13 + import { 14 + now 15 + } from "./chunk-BKRD2ZIW.js"; 16 + import { 17 + __name, 18 + init_Buffer, 19 + init_process 20 + } from "./chunk-FZQXS3RE.js"; 21 + 22 + // components/input/local/element.js 23 + init_Buffer(); 24 + init_process(); 25 + var LocalInput = class extends DiffuseElement { 26 + static { 27 + __name(this, "LocalInput"); 28 + } 29 + static NAME = "diffuse/input/local"; 30 + static WORKER_URL = "components/input/local/worker.js"; 31 + SCHEME = SCHEME; 32 + /** @type {Map<string, string>} tid → handle name */ 33 + #names = /* @__PURE__ */ new Map(); 34 + constructor() { 35 + super(); 36 + this.proxy = this.workerProxy(); 37 + this.consult = this.proxy.consult; 38 + this.detach = this.proxy.detach; 39 + this.groupConsult = this.proxy.groupConsult; 40 + this.list = this.proxy.list; 41 + this.resolve = this.proxy.resolve; 42 + } 43 + // LIFECYCLE 44 + /** @override */ 45 + async connectedCallback() { 46 + super.connectedCallback(); 47 + const handles = await loadHandles(); 48 + for (const [tid, handle] of Object.entries(handles)) { 49 + this.#names.set(tid, handle.name); 50 + } 51 + } 52 + // 🛠️ 53 + /** 54 + * Prompts the user to pick a directory. 55 + * Stores handle in IDB. 56 + * Returns the URI for the track placeholder. 57 + */ 58 + async addDirectory() { 59 + const dirHandle = await /** @type {any} */ 60 + globalThis.showDirectoryPicker( 61 + { mode: "read" } 62 + ); 63 + const tid = now(); 64 + const handles = await loadHandles(); 65 + handles[tid] = dirHandle; 66 + await saveHandles(handles); 67 + this.#names.set(tid, dirHandle.name); 68 + return buildURI(tid); 69 + } 70 + /** 71 + * Prompts the user to pick one or more files. 72 + * Stores handles in IDB. 73 + * Returns the URIs for the track placeholders. 74 + */ 75 + async addFiles() { 76 + const fileHandles = await /** @type {any} */ 77 + globalThis.showOpenFilePicker({ multiple: true }); 78 + const handles = await loadHandles(); 79 + const uris = []; 80 + for (const fileHandle of fileHandles) { 81 + const tid = now(); 82 + handles[tid] = fileHandle; 83 + this.#names.set(tid, fileHandle.name); 84 + uris.push(buildURI(tid)); 85 + } 86 + await saveHandles(handles); 87 + return uris; 88 + } 89 + /** @param {Track[]} tracks */ 90 + sources(tracks) { 91 + return Object.values(tidsFromTracks(tracks)).map((tid) => ({ 92 + label: this.#names.get(tid) ?? tid, 93 + uri: buildURI(tid) 94 + })); 95 + } 96 + }; 97 + var element_default = LocalInput; 98 + var CLASS = LocalInput; 99 + var NAME = "di-local"; 100 + customElements.define(NAME, CLASS); 101 + 102 + export { 103 + element_default, 104 + CLASS, 105 + NAME 106 + }; 107 + 108 + //# sourceMappingURL=./chunk-VWO2GNWZ.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-VWO2GNWZ.js.map
··· 1 + {"version":3,"sources":["/components/input/local/element.js"],"sourcesContent":["import * as TID from \"@atcute/tid\";\nimport { DiffuseElement } from \"@common/element.js\";\nimport { SCHEME } from \"./constants.js\";\nimport {\n buildURI,\n loadHandles,\n saveHandles,\n tidsFromTracks,\n} from \"./common.js\";\n\n/**\n * @import {InputActions, InputSchemeProvider} from \"@components/input/types.d.ts\"\n * @import {ProxiedActions} from \"@common/worker.d.ts\"\n * @import {Track} from \"@definitions/types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {ProxiedActions<InputActions>}\n * @implements {InputSchemeProvider}\n */\nclass LocalInput extends DiffuseElement {\n static NAME = \"diffuse/input/local\";\n static WORKER_URL = \"components/input/local/worker.js\";\n\n SCHEME = SCHEME;\n\n /** @type {Map<string, string>} tid → handle name */\n #names = new Map();\n\n constructor() {\n super();\n\n /** @type {ProxiedActions<InputActions>} */\n this.proxy = this.workerProxy();\n\n this.consult = this.proxy.consult;\n this.detach = this.proxy.detach;\n this.groupConsult = this.proxy.groupConsult;\n this.list = this.proxy.list;\n this.resolve = this.proxy.resolve;\n }\n\n // LIFECYCLE\n\n /** @override */\n async connectedCallback() {\n super.connectedCallback();\n const handles = await loadHandles();\n for (const [tid, handle] of Object.entries(handles)) {\n this.#names.set(tid, handle.name);\n }\n }\n\n // 🛠️\n\n /**\n * Prompts the user to pick a directory.\n * Stores handle in IDB.\n * Returns the URI for the track placeholder.\n */\n async addDirectory() {\n const dirHandle = await /** @type {any} */ (globalThis).showDirectoryPicker(\n { mode: \"read\" },\n );\n\n const tid = TID.now();\n const handles = await loadHandles();\n\n handles[tid] = dirHandle;\n await saveHandles(handles);\n this.#names.set(tid, dirHandle.name);\n\n return buildURI(tid);\n }\n\n /**\n * Prompts the user to pick one or more files.\n * Stores handles in IDB.\n * Returns the URIs for the track placeholders.\n */\n async addFiles() {\n const fileHandles = await /** @type {any} */ (globalThis)\n .showOpenFilePicker({ multiple: true });\n const handles = await loadHandles();\n const uris = [];\n\n for (const fileHandle of fileHandles) {\n const tid = TID.now();\n handles[tid] = fileHandle;\n this.#names.set(tid, fileHandle.name);\n uris.push(buildURI(tid));\n }\n\n await saveHandles(handles);\n return uris;\n }\n\n /** @param {Track[]} tracks */\n sources(tracks) {\n return Object.values(tidsFromTracks(tracks)).map((tid) => ({\n label: this.#names.get(tid) ?? tid,\n uri: buildURI(tid),\n }));\n }\n}\n\nexport default LocalInput;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = LocalInput;\nexport const NAME = \"di-local\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAwBA,IAAM,aAAN,cAAyB,eAAe;AAAA,EAxBxC,OAwBwC;AAAA;AAAA;AAAA,EACtC,OAAO,OAAO;AAAA,EACd,OAAO,aAAa;AAAA,EAEpB,SAAS;AAAA;AAAA,EAGT,SAAS,oBAAI,IAAI;AAAA,EAEjB,cAAc;AACZ,UAAM;AAGN,SAAK,QAAQ,KAAK,YAAY;AAE9B,SAAK,UAAU,KAAK,MAAM;AAC1B,SAAK,SAAS,KAAK,MAAM;AACzB,SAAK,eAAe,KAAK,MAAM;AAC/B,SAAK,OAAO,KAAK,MAAM;AACvB,SAAK,UAAU,KAAK,MAAM;AAAA,EAC5B;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB;AACxB,UAAM,kBAAkB;AACxB,UAAM,UAAU,MAAM,YAAY;AAClC,eAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG;AACnD,WAAK,OAAO,IAAI,KAAK,OAAO,IAAI;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAe;AACnB,UAAM,YAAY;AAAA,IAA0B,WAAY;AAAA,MACtD,EAAE,MAAM,OAAO;AAAA,IACjB;AAEA,UAAM,MAAU,IAAI;AACpB,UAAM,UAAU,MAAM,YAAY;AAElC,YAAQ,GAAG,IAAI;AACf,UAAM,YAAY,OAAO;AACzB,SAAK,OAAO,IAAI,KAAK,UAAU,IAAI;AAEnC,WAAO,SAAS,GAAG;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAW;AACf,UAAM,cAAc;AAAA,IAA0B,WAC3C,mBAAmB,EAAE,UAAU,KAAK,CAAC;AACxC,UAAM,UAAU,MAAM,YAAY;AAClC,UAAM,OAAO,CAAC;AAEd,eAAW,cAAc,aAAa;AACpC,YAAM,MAAU,IAAI;AACpB,cAAQ,GAAG,IAAI;AACf,WAAK,OAAO,IAAI,KAAK,WAAW,IAAI;AACpC,WAAK,KAAK,SAAS,GAAG,CAAC;AAAA,IACzB;AAEA,UAAM,YAAY,OAAO;AACzB,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,QAAQ,QAAQ;AACd,WAAO,OAAO,OAAO,eAAe,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS;AAAA,MACzD,OAAO,KAAK,OAAO,IAAI,GAAG,KAAK;AAAA,MAC/B,KAAK,SAAS,GAAG;AAAA,IACnB,EAAE;AAAA,EACJ;AACF;AAEA,IAAO,kBAAQ;AAMR,IAAM,QAAQ;AACd,IAAM,OAAO;AAEpB,eAAe,OAAO,MAAM,KAAK;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-VWO2GNWZ.js.map"}
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-WN6GL63Q.js
··· 1 + ../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/chunk-WN6GL63Q.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-WN6GL63Q.js.map
··· 1 + ../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/chunk-WN6GL63Q.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-X6J7NMRW.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-X6J7NMRW.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-X6J7NMRW.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-X6J7NMRW.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-XCWUJTYE.js
··· 1 + ../bafybeicp5hi5rw4vffqlbmyqqaxhmxzx4ilejru3cq4esycpeyuuhen5ha/chunk-XCWUJTYE.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-XCWUJTYE.js.map
··· 1 + ../bafybeicp5hi5rw4vffqlbmyqqaxhmxzx4ilejru3cq4esycpeyuuhen5ha/chunk-XCWUJTYE.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-XGM6M423.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-XGM6M423.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-XGM6M423.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-XGM6M423.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-XRGLBUX4.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-XRGLBUX4.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-XRGLBUX4.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-XRGLBUX4.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-YCKIJVMK.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-YCKIJVMK.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-YCKIJVMK.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-YCKIJVMK.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-YEYOLW6N.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-YEYOLW6N.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-YEYOLW6N.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-YEYOLW6N.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-YV3SRJQF.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-YV3SRJQF.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-YV3SRJQF.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-YV3SRJQF.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-Z2SJTSR2.js
··· 1 + ../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/chunk-Z2SJTSR2.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-Z2SJTSR2.js.map
··· 1 + ../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/chunk-Z2SJTSR2.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-ZQZJJU3T.js
··· 1 + ../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/chunk-ZQZJJU3T.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-ZQZJJU3T.js.map
··· 1 + ../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/chunk-ZQZJJU3T.js.map
+312
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-ZUHY7USF.js
··· 1 + import { 2 + element_default as element_default11 3 + } from "./chunk-UMMPFCLQ.js"; 4 + import { 5 + element_default 6 + } from "./chunk-G4P4YFWD.js"; 7 + import { 8 + element_default as element_default7 9 + } from "./chunk-6JNRNMZQ.js"; 10 + import { 11 + element_default as element_default14 12 + } from "./chunk-YV3SRJQF.js"; 13 + import { 14 + element_default as element_default15 15 + } from "./chunk-ESYALJPH.js"; 16 + import { 17 + element_default as element_default6 18 + } from "./chunk-OSKZBJ24.js"; 19 + import { 20 + element_default as element_default8 21 + } from "./chunk-TXU4RB3O.js"; 22 + import { 23 + element_default as element_default9 24 + } from "./chunk-3ENCKNXO.js"; 25 + import { 26 + element_default as element_default16 27 + } from "./chunk-PKN6FN7E.js"; 28 + import { 29 + element_default as element_default3 30 + } from "./chunk-NP7LZHKR.js"; 31 + import { 32 + element_default as element_default13 33 + } from "./chunk-M2MAFKPM.js"; 34 + import { 35 + element_default as element_default5 36 + } from "./chunk-GKE6NGNQ.js"; 37 + import { 38 + element_default as element_default2 39 + } from "./chunk-NBQPHQFP.js"; 40 + import { 41 + element_default as element_default4 42 + } from "./chunk-OBWEBS4T.js"; 43 + import { 44 + element_default as element_default10 45 + } from "./chunk-S6SMX4HA.js"; 46 + import { 47 + element_default as element_default12 48 + } from "./chunk-XRGLBUX4.js"; 49 + import { 50 + __name, 51 + init_Buffer, 52 + init_process 53 + } from "./chunk-FZQXS3RE.js"; 54 + 55 + // common/facets/foundation.js 56 + init_Buffer(); 57 + init_process(); 58 + var url = new URL(document.location.href); 59 + var GROUP = url.searchParams.get("group") ?? "facets"; 60 + var config = { 61 + GROUP, 62 + features: { 63 + fillQueueAutomatically, 64 + playAudioFromQueue, 65 + processInputs, 66 + searchThroughCollection 67 + }, 68 + // Elements 69 + engine: { 70 + audio, 71 + queue, 72 + repeatShuffle, 73 + scope 74 + }, 75 + orchestrator: { 76 + autoQueue, 77 + favourites, 78 + input, 79 + mediaSession, 80 + output, 81 + queueAudio, 82 + processTracks, 83 + scopedTracks, 84 + sources 85 + }, 86 + processor: { 87 + artwork, 88 + metadata, 89 + search 90 + } 91 + }; 92 + var foundation_default = config; 93 + function fillQueueAutomatically() { 94 + return { 95 + engine: { 96 + queue: queue(), 97 + repeatShuffle: repeatShuffle(), 98 + scope: scope() 99 + }, 100 + orchestrator: { 101 + autoQueue: autoQueue(), 102 + input: input(), 103 + output: output(), 104 + scopedTracks: scopedTracks() 105 + } 106 + }; 107 + } 108 + __name(fillQueueAutomatically, "fillQueueAutomatically"); 109 + function playAudioFromQueue() { 110 + return { 111 + engine: { 112 + audio: audio(), 113 + queue: queue() 114 + }, 115 + orchestrator: { 116 + mediaSession: mediaSession(), 117 + queueAudio: queueAudio() 118 + } 119 + }; 120 + } 121 + __name(playAudioFromQueue, "playAudioFromQueue"); 122 + function processInputs() { 123 + return { 124 + orchestrator: { 125 + input: input(), 126 + output: output(), 127 + processTracks: processTracks() 128 + }, 129 + processor: { 130 + metadata: metadata() 131 + } 132 + }; 133 + } 134 + __name(processInputs, "processInputs"); 135 + function searchThroughCollection() { 136 + return { 137 + engine: { 138 + scope: scope() 139 + }, 140 + orchestrator: { 141 + output: output(), 142 + scopedTracks: scopedTracks() 143 + }, 144 + processor: { 145 + search: search() 146 + } 147 + }; 148 + } 149 + __name(searchThroughCollection, "searchThroughCollection"); 150 + function audio() { 151 + const a = new element_default2(); 152 + a.setAttribute("group", GROUP); 153 + return findExistingOrAdd(a); 154 + } 155 + __name(audio, "audio"); 156 + function queue() { 157 + const q = new element_default4(); 158 + q.setAttribute("group", GROUP); 159 + return findExistingOrAdd(q); 160 + } 161 + __name(queue, "queue"); 162 + function repeatShuffle() { 163 + const r = new element_default10(); 164 + r.setAttribute("group", GROUP); 165 + return findExistingOrAdd(r); 166 + } 167 + __name(repeatShuffle, "repeatShuffle"); 168 + function scope() { 169 + const s = new element_default12(); 170 + s.setAttribute("group", GROUP); 171 + return findExistingOrAdd(s); 172 + } 173 + __name(scope, "scope"); 174 + function artwork() { 175 + const a = new element_default(); 176 + a.setAttribute("group", GROUP); 177 + return findExistingOrAdd(a); 178 + } 179 + __name(artwork, "artwork"); 180 + function metadata() { 181 + const m = new element_default7(); 182 + m.setAttribute("group", GROUP); 183 + return findExistingOrAdd(m); 184 + } 185 + __name(metadata, "metadata"); 186 + function search() { 187 + const s = new element_default11(); 188 + s.setAttribute("group", GROUP); 189 + return findExistingOrAdd(s); 190 + } 191 + __name(search, "search"); 192 + function autoQueue() { 193 + const q = queue(); 194 + const r = repeatShuffle(); 195 + const t = scopedTracks(); 196 + const aqo = new element_default3(); 197 + aqo.setAttribute("group", GROUP); 198 + aqo.setAttribute("queue-engine-selector", q.selector); 199 + aqo.setAttribute("repeat-shuffle-engine-selector", r.selector); 200 + aqo.setAttribute("tracks-selector", t.selector); 201 + return findExistingOrAdd(aqo); 202 + } 203 + __name(autoQueue, "autoQueue"); 204 + function favourites() { 205 + const o = output(); 206 + const fo = new element_default14(); 207 + fo.setAttribute("group", GROUP); 208 + fo.setAttribute("output-selector", o.selector); 209 + return findExistingOrAdd(fo); 210 + } 211 + __name(favourites, "favourites"); 212 + function input() { 213 + const i = new element_default5(); 214 + i.setAttribute("group", GROUP); 215 + i.setAttribute("id", "input"); 216 + return findExistingOrAdd(i); 217 + } 218 + __name(input, "input"); 219 + function mediaSession() { 220 + const a = audio(); 221 + const aw = artwork(); 222 + const o = output(); 223 + const q = queue(); 224 + const mso = new element_default15(); 225 + mso.setAttribute("group", GROUP); 226 + mso.setAttribute("audio-engine-selector", a.selector); 227 + mso.setAttribute("artwork-processor-selector", aw.selector); 228 + mso.setAttribute("output-selector", o.selector); 229 + mso.setAttribute("queue-engine-selector", q.selector); 230 + return findExistingOrAdd(mso); 231 + } 232 + __name(mediaSession, "mediaSession"); 233 + function output() { 234 + const o = new element_default6(); 235 + o.setAttribute("group", GROUP); 236 + o.setAttribute("id", "output"); 237 + return findExistingOrAdd(o); 238 + } 239 + __name(output, "output"); 240 + function processTracks(opts = { disableWhenReady: false }) { 241 + const i = input(); 242 + const o = output(); 243 + const m = metadata(); 244 + const opt = new element_default8(); 245 + opt.setAttribute("group", GROUP); 246 + opt.setAttribute("input-selector", i.selector); 247 + opt.setAttribute("output-selector", o.selector); 248 + opt.setAttribute("metadata-processor-selector", m.selector); 249 + if (!opts.disableWhenReady) { 250 + opt.toggleAttribute("process-when-ready"); 251 + } 252 + return findExistingOrAdd(opt); 253 + } 254 + __name(processTracks, "processTracks"); 255 + function queueAudio() { 256 + const a = audio(); 257 + const i = input(); 258 + const o = output(); 259 + const q = queue(); 260 + const r = repeatShuffle(); 261 + const oqa = new element_default9(); 262 + oqa.setAttribute("group", GROUP); 263 + oqa.setAttribute("audio-engine-selector", a.selector); 264 + oqa.setAttribute("input-selector", i.selector); 265 + oqa.setAttribute("output-selector", o.selector); 266 + oqa.setAttribute("queue-engine-selector", q.selector); 267 + oqa.setAttribute("repeat-shuffle-engine-selector", r.selector); 268 + return findExistingOrAdd(oqa); 269 + } 270 + __name(queueAudio, "queueAudio"); 271 + function scopedTracks() { 272 + const i = input(); 273 + const o = output(); 274 + const e = scope(); 275 + const s = search(); 276 + const sto = new element_default13(); 277 + sto.setAttribute("group", GROUP); 278 + sto.setAttribute("input-selector", i.selector); 279 + sto.setAttribute("output-selector", o.selector); 280 + sto.setAttribute("scope-engine-selector", e.selector); 281 + sto.setAttribute("search-processor-selector", s.selector); 282 + return findExistingOrAdd(sto); 283 + } 284 + __name(scopedTracks, "scopedTracks"); 285 + function sources() { 286 + const i = input(); 287 + const o = output(); 288 + const so = new element_default16(); 289 + so.setAttribute("group", GROUP); 290 + so.setAttribute("input-selector", i.selector); 291 + so.setAttribute("output-selector", o.selector); 292 + return findExistingOrAdd(so); 293 + } 294 + __name(sources, "sources"); 295 + function findExistingOrAdd(element) { 296 + const alreadyAdded = document.body.querySelector(element.selector); 297 + if (!alreadyAdded) { 298 + document.body.append(element); 299 + return element; 300 + } 301 + return alreadyAdded; 302 + } 303 + __name(findExistingOrAdd, "findExistingOrAdd"); 304 + 305 + export { 306 + GROUP, 307 + config, 308 + foundation_default, 309 + findExistingOrAdd 310 + }; 311 + 312 + //# sourceMappingURL=./chunk-ZUHY7USF.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-ZUHY7USF.js.map
··· 1 + {"version":3,"sources":["/common/facets/foundation.js"],"sourcesContent":["import ArtworkProcessor from \"@components/processor/artwork/element.js\";\nimport AudioEngine from \"@components/engine/audio/element.js\";\nimport AutoQueueOrchestrator from \"@components/orchestrator/auto-queue/element.js\";\nimport Queue from \"@components/engine/queue/element.js\";\nimport InputOrchestrator from \"@components/orchestrator/input/element.js\";\nimport OutputOrchestrator from \"@components/orchestrator/output/element.js\";\nimport MetadataProcessor from \"@components/processor/metadata/element.js\";\nimport ProcessTracksOrchestrator from \"@components/orchestrator/process-tracks/element.js\";\nimport QueueAudioOrchestrator from \"@components/orchestrator/queue-audio/element.js\";\nimport RepeatShuffleEngine from \"@components/engine/repeat-shuffle/element.js\";\nimport SearchProcessor from \"@components/processor/search/element.js\";\nimport ScopeEngine from \"@components/engine/scope/element.js\";\nimport ScopedTracksOrchestrator from \"@components/orchestrator/scoped-tracks/element.js\";\nimport FavouritesOrchestrator from \"@components/orchestrator/favourites/element.js\";\nimport MediaSessionOrchestrator from \"@components/orchestrator/media-session/element.js\";\nimport SourcesOrchestrator from \"@components/orchestrator/sources/element.js\";\n\n/**\n * @import { DiffuseElement } from \"@toko/diffuse/common/element.js\";\n */\n\nconst url = new URL(document.location.href);\nexport const GROUP = url.searchParams.get(\"group\") ?? \"facets\";\n\n/**\n * Default config for facets.\n */\nexport const config = {\n GROUP,\n\n features: {\n fillQueueAutomatically,\n playAudioFromQueue,\n processInputs,\n searchThroughCollection,\n },\n\n // Elements\n engine: {\n audio,\n queue,\n repeatShuffle,\n scope,\n },\n orchestrator: {\n autoQueue,\n favourites,\n input,\n mediaSession,\n output,\n queueAudio,\n processTracks,\n scopedTracks,\n sources,\n },\n processor: {\n artwork,\n metadata,\n search,\n },\n};\n\nexport default config;\n\n// 📦️\n\nfunction fillQueueAutomatically() {\n return {\n engine: {\n queue: queue(),\n repeatShuffle: repeatShuffle(),\n scope: scope(),\n },\n orchestrator: {\n autoQueue: autoQueue(),\n input: input(),\n output: output(),\n scopedTracks: scopedTracks(),\n },\n };\n}\n\nfunction playAudioFromQueue() {\n return {\n engine: {\n audio: audio(),\n queue: queue(),\n },\n orchestrator: {\n mediaSession: mediaSession(),\n queueAudio: queueAudio(),\n },\n };\n}\n\nfunction processInputs() {\n return {\n orchestrator: {\n input: input(),\n output: output(),\n processTracks: processTracks(),\n },\n processor: {\n metadata: metadata(),\n },\n };\n}\n\nfunction searchThroughCollection() {\n return {\n engine: {\n scope: scope(),\n },\n orchestrator: {\n output: output(),\n scopedTracks: scopedTracks(),\n },\n processor: {\n search: search(),\n },\n };\n}\n\n// 🥡\n\n// Engines\nfunction audio() {\n const a = new AudioEngine();\n a.setAttribute(\"group\", GROUP);\n\n return findExistingOrAdd(a);\n}\n\nfunction queue() {\n const q = new Queue();\n q.setAttribute(\"group\", GROUP);\n\n return findExistingOrAdd(q);\n}\n\nfunction repeatShuffle() {\n const r = new RepeatShuffleEngine();\n r.setAttribute(\"group\", GROUP);\n\n return findExistingOrAdd(r);\n}\n\nfunction scope() {\n const s = new ScopeEngine();\n s.setAttribute(\"group\", GROUP);\n\n return findExistingOrAdd(s);\n}\n\n// Processors\nfunction artwork() {\n const a = new ArtworkProcessor();\n a.setAttribute(\"group\", GROUP);\n\n return findExistingOrAdd(a);\n}\n\nfunction metadata() {\n const m = new MetadataProcessor();\n m.setAttribute(\"group\", GROUP);\n\n return findExistingOrAdd(m);\n}\n\nfunction search() {\n const s = new SearchProcessor();\n s.setAttribute(\"group\", GROUP);\n\n return findExistingOrAdd(s);\n}\n\n// Orchestrators\nfunction autoQueue() {\n const q = queue();\n const r = repeatShuffle();\n const t = scopedTracks();\n\n const aqo = new AutoQueueOrchestrator();\n aqo.setAttribute(\"group\", GROUP);\n aqo.setAttribute(\"queue-engine-selector\", q.selector);\n aqo.setAttribute(\"repeat-shuffle-engine-selector\", r.selector);\n aqo.setAttribute(\"tracks-selector\", t.selector);\n\n return findExistingOrAdd(aqo);\n}\n\nfunction favourites() {\n const o = output();\n\n const fo = new FavouritesOrchestrator();\n fo.setAttribute(\"group\", GROUP);\n fo.setAttribute(\"output-selector\", o.selector);\n\n return findExistingOrAdd(fo);\n}\n\nfunction input() {\n const i = new InputOrchestrator();\n i.setAttribute(\"group\", GROUP);\n i.setAttribute(\"id\", \"input\");\n\n return findExistingOrAdd(i);\n}\n\nfunction mediaSession() {\n const a = audio();\n const aw = artwork();\n const o = output();\n const q = queue();\n\n const mso = new MediaSessionOrchestrator();\n mso.setAttribute(\"group\", GROUP);\n mso.setAttribute(\"audio-engine-selector\", a.selector);\n mso.setAttribute(\"artwork-processor-selector\", aw.selector);\n mso.setAttribute(\"output-selector\", o.selector);\n mso.setAttribute(\"queue-engine-selector\", q.selector);\n\n return findExistingOrAdd(mso);\n}\n\nfunction output() {\n const o = new OutputOrchestrator();\n o.setAttribute(\"group\", GROUP);\n o.setAttribute(\"id\", \"output\");\n\n return findExistingOrAdd(o);\n}\n\n/**\n * @param {Object} opts - Options\n * @param {boolean} [opts.disableWhenReady] - Whether to disable processing when ready.\n */\nfunction processTracks(opts = { disableWhenReady: false }) {\n const i = input();\n const o = output();\n const m = metadata();\n\n const opt = new ProcessTracksOrchestrator();\n opt.setAttribute(\"group\", GROUP);\n opt.setAttribute(\"input-selector\", i.selector);\n opt.setAttribute(\"output-selector\", o.selector);\n opt.setAttribute(\"metadata-processor-selector\", m.selector);\n\n if (!opts.disableWhenReady) {\n opt.toggleAttribute(\"process-when-ready\");\n }\n\n return findExistingOrAdd(opt);\n}\n\nfunction queueAudio() {\n const a = audio();\n const i = input();\n const o = output();\n const q = queue();\n const r = repeatShuffle();\n\n const oqa = new QueueAudioOrchestrator();\n oqa.setAttribute(\"group\", GROUP);\n oqa.setAttribute(\"audio-engine-selector\", a.selector);\n oqa.setAttribute(\"input-selector\", i.selector);\n oqa.setAttribute(\"output-selector\", o.selector);\n oqa.setAttribute(\"queue-engine-selector\", q.selector);\n oqa.setAttribute(\"repeat-shuffle-engine-selector\", r.selector);\n\n return findExistingOrAdd(oqa);\n}\n\nfunction scopedTracks() {\n const i = input();\n const o = output();\n const e = scope();\n const s = search();\n\n const sto = new ScopedTracksOrchestrator();\n sto.setAttribute(\"group\", GROUP);\n sto.setAttribute(\"input-selector\", i.selector);\n sto.setAttribute(\"output-selector\", o.selector);\n sto.setAttribute(\"scope-engine-selector\", e.selector);\n sto.setAttribute(\"search-processor-selector\", s.selector);\n\n return findExistingOrAdd(sto);\n}\n\nfunction sources() {\n const i = input();\n const o = output();\n const so = new SourcesOrchestrator();\n so.setAttribute(\"group\", GROUP);\n so.setAttribute(\"input-selector\", i.selector);\n so.setAttribute(\"output-selector\", o.selector);\n\n return findExistingOrAdd(so);\n}\n\n// 🛠️\n\n/**\n * @template {DiffuseElement} T\n * @param {T} element\n * @returns {T}\n */\nexport function findExistingOrAdd(element) {\n /** @type {T | null} */\n const alreadyAdded = document.body.querySelector(element.selector);\n if (!alreadyAdded) {\n document.body.append(element);\n return element;\n }\n\n return alreadyAdded;\n}\n"],"mappings":"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","names":["element_default"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-ZUHY7USF.js.map"}
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-ZW7YO2UU.js
··· 1 + ../bafybeicp5hi5rw4vffqlbmyqqaxhmxzx4ilejru3cq4esycpeyuuhen5ha/chunk-ZW7YO2UU.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/chunk-ZW7YO2UU.js.map
··· 1 + ../bafybeicp5hi5rw4vffqlbmyqqaxhmxzx4ilejru3cq4esycpeyuuhen5ha/chunk-ZW7YO2UU.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/cid.js
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/cid.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/cid.js.map
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/cid.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/compare.js
··· 1 + ../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/common/compare.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/compare.js.map
··· 1 + ../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/common/compare.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/element.js
··· 1 + ../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/common/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/element.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/element.js.map
+64
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/facets/foundation.js
··· 1 + import { 2 + GROUP, 3 + config, 4 + findExistingOrAdd, 5 + foundation_default 6 + } from "../../chunk-ZUHY7USF.js"; 7 + import "../../chunk-UMMPFCLQ.js"; 8 + import "../../chunk-G4P4YFWD.js"; 9 + import "../../chunk-6JNRNMZQ.js"; 10 + import "../../chunk-YV3SRJQF.js"; 11 + import "../../chunk-ESYALJPH.js"; 12 + import "../../chunk-OSKZBJ24.js"; 13 + import "../../chunk-XGM6M423.js"; 14 + import "../../chunk-6KMZB5IA.js"; 15 + import "../../chunk-B63ZUKFI.js"; 16 + import "../../chunk-TXU4RB3O.js"; 17 + import "../../chunk-3ENCKNXO.js"; 18 + import "../../chunk-PKN6FN7E.js"; 19 + import "../../chunk-NP7LZHKR.js"; 20 + import "../../chunk-M2MAFKPM.js"; 21 + import "../../chunk-MVUUUQRL.js"; 22 + import "../../chunk-GKE6NGNQ.js"; 23 + import "../../chunk-VWO2GNWZ.js"; 24 + import "../../chunk-QSPAYUAI.js"; 25 + import "../../chunk-I3VKG3ZJ.js"; 26 + import "../../chunk-OIRYE7B4.js"; 27 + import "../../chunk-3AO35WC3.js"; 28 + import "../../chunk-JBHW662S.js"; 29 + import "../../chunk-GX3WPNEX.js"; 30 + import "../../chunk-FJBTJV3K.js"; 31 + import "../../chunk-PTVB4Y37.js"; 32 + import "../../chunk-HN4F5JEZ.js"; 33 + import "../../chunk-NBQPHQFP.js"; 34 + import "../../chunk-QERJLR3Q.js"; 35 + import "../../chunk-OBWEBS4T.js"; 36 + import "../../chunk-S6SMX4HA.js"; 37 + import "../../chunk-XRGLBUX4.js"; 38 + import "../../chunk-R3EQQDW5.js"; 39 + import "../../chunk-GQIBEDKG.js"; 40 + import "../../chunk-DDF5P57I.js"; 41 + import "../../chunk-EEUCFWD4.js"; 42 + import "../../chunk-6DRHTH2U.js"; 43 + import "../../chunk-TSYF7OPM.js"; 44 + import "../../chunk-GCLDJKYV.js"; 45 + import "../../chunk-KJFA7KRK.js"; 46 + import "../../chunk-HMBZONBJ.js"; 47 + import "../../chunk-6CB2LXND.js"; 48 + import "../../chunk-V7EQPFPD.js"; 49 + import "../../chunk-G56PUJUJ.js"; 50 + import "../../chunk-6DKPDMFE.js"; 51 + import "../../chunk-TP5GZFTO.js"; 52 + import "../../chunk-ZQZJJU3T.js"; 53 + import "../../chunk-BKRD2ZIW.js"; 54 + import "../../chunk-HNJPKCUJ.js"; 55 + import "../../chunk-SGR5ST3A.js"; 56 + import "../../chunk-FZQXS3RE.js"; 57 + export { 58 + GROUP, 59 + config, 60 + foundation_default as default, 61 + findExistingOrAdd 62 + }; 63 + 64 + //# sourceMappingURL=./foundation.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/facets/foundation.js.map
··· 1 + ../../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/common/facets/foundation.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/facets/utils.js
··· 1 + ../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/common/facets/utils.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/facets/utils.js.map
··· 1 + ../../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/common/facets/utils.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/loader.js
··· 1 + ../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/common/loader.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/loader.js.map
··· 1 + ../../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/common/loader.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/playlist.js
··· 1 + ../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/common/playlist.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/playlist.js.map
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/playlist.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/signal.js
··· 1 + ../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/common/signal.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/signal.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/signal.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/themes/utils.js
··· 1 + ../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/common/themes/utils.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/themes/utils.js.map
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/themes/utils.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/track.js
··· 1 + ../../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/common/track.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/track.js.map
··· 1 + ../../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/common/track.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/utils.js
··· 1 + ../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/common/utils.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/utils.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/utils.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/worker.js
··· 1 + ../../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/common/worker.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/worker.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/worker.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/worker/rpc-channel.js
··· 1 + ../../../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/common/worker/rpc-channel.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/common/worker/rpc-channel.js.map
··· 1 + ../../../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/common/worker/rpc-channel.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/configurator/input/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/configurator/input/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/configurator/input/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/configurator/input/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/configurator/input/worker.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/configurator/input/worker.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/configurator/input/worker.js.map
··· 1 + ../../../../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/components/configurator/input/worker.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/configurator/output/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/configurator/output/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/configurator/output/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/configurator/output/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/engine/audio/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/engine/audio/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/engine/audio/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/engine/audio/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/engine/queue/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/engine/queue/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/engine/queue/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/engine/queue/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/engine/queue/worker.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/engine/queue/worker.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/engine/queue/worker.js.map
··· 1 + ../../../../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/components/engine/queue/worker.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/engine/repeat-shuffle/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/engine/repeat-shuffle/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/engine/repeat-shuffle/element.js.map
··· 1 + ../../../../bafybeia4lo67fqia3emjf54vzbrvfyao6fwndoc4rnqpav4yezowfg4j6e/components/engine/repeat-shuffle/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/engine/scope/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/engine/scope/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/engine/scope/element.js.map
··· 1 + ../../../../bafybeihr4brahqptxmxcdksktdfgs4hyl64odwx524vqmmitjvmn57sklq/components/engine/scope/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/common.js
··· 1 + ../../../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/components/input/common.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/common.js.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/common.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/https/common.js
··· 1 + ../../../../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/components/input/https/common.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/https/common.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/https/common.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/https/constants.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/https/constants.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/https/constants.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/https/constants.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/https/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/input/https/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/https/element.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/https/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/https/worker.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/input/https/worker.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/https/worker.js.map
··· 1 + ../../../../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/components/input/https/worker.js.map
+31
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/local/common.js
··· 1 + import { 2 + buildURI, 3 + enumerateAudioFiles, 4 + getHandleFile, 5 + groupTracksByTid, 6 + groupUrisByTid, 7 + loadHandles, 8 + parseURI, 9 + saveHandles, 10 + tidsFromTracks 11 + } from "../../../chunk-QSPAYUAI.js"; 12 + import "../../../chunk-I3VKG3ZJ.js"; 13 + import "../../../chunk-JBHW662S.js"; 14 + import "../../../chunk-DDF5P57I.js"; 15 + import "../../../chunk-KJFA7KRK.js"; 16 + import "../../../chunk-HMBZONBJ.js"; 17 + import "../../../chunk-SGR5ST3A.js"; 18 + import "../../../chunk-FZQXS3RE.js"; 19 + export { 20 + buildURI, 21 + enumerateAudioFiles, 22 + getHandleFile, 23 + groupTracksByTid, 24 + groupUrisByTid, 25 + loadHandles, 26 + parseURI, 27 + saveHandles, 28 + tidsFromTracks 29 + }; 30 + 31 + //# sourceMappingURL=./common.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/local/common.js.map
··· 1 + {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/components/input/local/common.js.map"}
+11
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/local/constants.js
··· 1 + import { 2 + IDB_HANDLES, 3 + SCHEME 4 + } from "../../../chunk-I3VKG3ZJ.js"; 5 + import "../../../chunk-FZQXS3RE.js"; 6 + export { 7 + IDB_HANDLES, 8 + SCHEME 9 + }; 10 + 11 + //# sourceMappingURL=./constants.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/local/constants.js.map
··· 1 + {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/components/input/local/constants.js.map"}
+27
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/local/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-VWO2GNWZ.js"; 6 + import "../../../chunk-QSPAYUAI.js"; 7 + import "../../../chunk-I3VKG3ZJ.js"; 8 + import "../../../chunk-JBHW662S.js"; 9 + import "../../../chunk-DDF5P57I.js"; 10 + import "../../../chunk-KJFA7KRK.js"; 11 + import "../../../chunk-HMBZONBJ.js"; 12 + import "../../../chunk-V7EQPFPD.js"; 13 + import "../../../chunk-G56PUJUJ.js"; 14 + import "../../../chunk-6DKPDMFE.js"; 15 + import "../../../chunk-TP5GZFTO.js"; 16 + import "../../../chunk-ZQZJJU3T.js"; 17 + import "../../../chunk-BKRD2ZIW.js"; 18 + import "../../../chunk-HNJPKCUJ.js"; 19 + import "../../../chunk-SGR5ST3A.js"; 20 + import "../../../chunk-FZQXS3RE.js"; 21 + export { 22 + CLASS, 23 + NAME, 24 + element_default as default 25 + }; 26 + 27 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/local/element.js.map
··· 1 + {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/components/input/local/element.js.map"}
+202
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/local/worker.js
··· 1 + import { 2 + buildURI, 3 + enumerateAudioFiles, 4 + getHandleFile, 5 + groupTracksByTid, 6 + groupUrisByTid, 7 + loadHandles, 8 + parseURI, 9 + saveHandles 10 + } from "../../../chunk-QSPAYUAI.js"; 11 + import { 12 + SCHEME 13 + } from "../../../chunk-I3VKG3ZJ.js"; 14 + import "../../../chunk-JBHW662S.js"; 15 + import { 16 + groupKey 17 + } from "../../../chunk-DDF5P57I.js"; 18 + import "../../../chunk-KJFA7KRK.js"; 19 + import "../../../chunk-HMBZONBJ.js"; 20 + import { 21 + ostiary, 22 + rpc 23 + } from "../../../chunk-6DKPDMFE.js"; 24 + import "../../../chunk-TP5GZFTO.js"; 25 + import "../../../chunk-ZQZJJU3T.js"; 26 + import { 27 + now 28 + } from "../../../chunk-BKRD2ZIW.js"; 29 + import "../../../chunk-SGR5ST3A.js"; 30 + import { 31 + __name, 32 + init_Buffer, 33 + init_process 34 + } from "../../../chunk-FZQXS3RE.js"; 35 + 36 + // components/input/local/worker.js 37 + init_Buffer(); 38 + init_process(); 39 + async function consult(fileUriOrScheme) { 40 + if (typeof FileSystemHandle === "undefined") { 41 + return { supported: false, reason: "No browser support" }; 42 + } 43 + if (!fileUriOrScheme.includes(":")) { 44 + return { supported: true, consult: "undetermined" }; 45 + } 46 + const parsed = parseURI(fileUriOrScheme); 47 + if (!parsed) return { supported: false, reason: "Unknown handle" }; 48 + const handles = await loadHandles(); 49 + const handle = handles[parsed.tid]; 50 + if (!handle) return { supported: false, reason: "Unknown handle" }; 51 + const permission = await /** @type {any} */ 52 + handle.queryPermission({ 53 + mode: "read" 54 + }); 55 + return { supported: true, consult: permission === "granted" }; 56 + } 57 + __name(consult, "consult"); 58 + async function detach({ fileUriOrScheme, tracks }) { 59 + if (!fileUriOrScheme.includes("://")) { 60 + if (fileUriOrScheme === SCHEME) return []; 61 + return tracks; 62 + } 63 + const parsed = parseURI(fileUriOrScheme); 64 + if (!parsed) return tracks; 65 + const { tid } = parsed; 66 + const groups = groupTracksByTid(tracks); 67 + delete groups[tid]; 68 + const handles = await loadHandles(); 69 + delete handles[tid]; 70 + await saveHandles(handles); 71 + return Object.values(groups).map((g) => g.tracks).flat(1); 72 + } 73 + __name(detach, "detach"); 74 + async function groupConsult(uris) { 75 + const groups = groupUrisByTid(uris); 76 + const handles = await loadHandles(); 77 + const promises = Object.entries(groups).flatMap(async ([tid, { uris: uris2 }]) => { 78 + const handle = handles[tid]; 79 + if (!handle) return []; 80 + const available = await /** @type {any} */ 81 + handle.queryPermission({ mode: "read" }) === "granted"; 82 + const grouping = available ? { available, scheme: SCHEME, uris: uris2 } : { 83 + available: false, 84 + reason: "Permission not granted", 85 + scheme: SCHEME, 86 + uris: uris2 87 + }; 88 + return [{ key: groupKey(SCHEME, tid), grouping }]; 89 + }); 90 + const results = (await Promise.all(promises)).flat(1); 91 + return Object.fromEntries(results.map((e) => [e.key, e.grouping])); 92 + } 93 + __name(groupConsult, "groupConsult"); 94 + async function list(cachedTracks = []) { 95 + const handles = await loadHandles(); 96 + const now2 = (/* @__PURE__ */ new Date()).toISOString(); 97 + const cacheByUri = {}; 98 + cachedTracks.forEach((t) => { 99 + cacheByUri[t.uri] = t; 100 + }); 101 + const trackGroups = groupTracksByTid(cachedTracks); 102 + const allTids = new Set(Object.keys(trackGroups)); 103 + const promises = [...allTids].map(async (tid) => { 104 + const handle = handles[tid]; 105 + if (!handle) return trackGroups[tid]?.tracks ?? /** @type {Track[]} */ 106 + []; 107 + const perm = await /** @type {any} */ 108 + handle.queryPermission({ 109 + mode: "read" 110 + }); 111 + if (perm !== "granted") { 112 + const cached = trackGroups[tid]?.tracks[0]; 113 + const placeholder = { 114 + $type: "sh.diffuse.output.track", 115 + id: cached?.id ?? now(), 116 + createdAt: cached?.createdAt ?? now2, 117 + updatedAt: now2, 118 + kind: "placeholder", 119 + uri: buildURI(tid) 120 + }; 121 + return [placeholder]; 122 + } 123 + if (handle.kind === "file") { 124 + const uri = buildURI(tid); 125 + const cached = cacheByUri[uri]; 126 + const track = { 127 + $type: "sh.diffuse.output.track", 128 + id: cached?.id ?? now(), 129 + createdAt: cached?.createdAt ?? now2, 130 + updatedAt: cached?.updatedAt ?? now2, 131 + stats: cached?.stats, 132 + tags: cached?.tags, 133 + uri 134 + }; 135 + return [track]; 136 + } 137 + const paths = await enumerateAudioFiles( 138 + /** @type {FileSystemDirectoryHandle} */ 139 + handle 140 + ); 141 + if (!paths.length) { 142 + const placeholder = { 143 + $type: "sh.diffuse.output.track", 144 + id: now(), 145 + createdAt: now2, 146 + updatedAt: now2, 147 + kind: "placeholder", 148 + uri: buildURI(tid) 149 + }; 150 + return [placeholder]; 151 + } 152 + return paths.map((path) => { 153 + const uri = buildURI(tid, path); 154 + const cached = cacheByUri[uri]; 155 + const track = { 156 + $type: "sh.diffuse.output.track", 157 + id: cached?.id ?? now(), 158 + createdAt: cached?.createdAt ?? now2, 159 + updatedAt: cached?.updatedAt ?? now2, 160 + stats: cached?.stats, 161 + tags: cached?.tags, 162 + uri 163 + }; 164 + return track; 165 + }); 166 + }); 167 + const tracks = (await Promise.all(promises)).flat(1); 168 + return tracks; 169 + } 170 + __name(list, "list"); 171 + async function resolve({ uri }) { 172 + const parsed = parseURI(uri); 173 + if (!parsed) return void 0; 174 + const handles = await loadHandles(); 175 + const handle = handles[parsed.tid]; 176 + const path = parsed.path.replace(/^\//, ""); 177 + if (!handle) return void 0; 178 + if (handle.kind === "directory" && path === "") return void 0; 179 + const fileHandle = await getHandleFile(handle, path); 180 + const file = await fileHandle.getFile(); 181 + const url = URL.createObjectURL(file); 182 + return { url, expiresAt: Infinity }; 183 + } 184 + __name(resolve, "resolve"); 185 + ostiary((context) => { 186 + rpc(context, { 187 + consult, 188 + detach, 189 + groupConsult, 190 + list, 191 + resolve 192 + }); 193 + }); 194 + export { 195 + consult, 196 + detach, 197 + groupConsult, 198 + list, 199 + resolve 200 + }; 201 + 202 + //# sourceMappingURL=./worker.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/local/worker.js.map
··· 1 + {"version":3,"sources":["/worker.js"],"sourcesContent":["import * as TID from \"@atcute/tid\";\nimport { ostiary, rpc } from \"@common/worker.js\";\nimport { groupKey } from \"@components/input/common.js\";\nimport {\n buildURI,\n enumerateAudioFiles,\n getHandleFile,\n groupTracksByTid,\n groupUrisByTid,\n loadHandles,\n parseURI,\n saveHandles,\n} from \"./common.js\";\nimport { SCHEME } from \"./constants.js\";\n\n/**\n * @import { InputActions as Actions, ConsultGrouping } from \"@components/input/types.d.ts\";\n * @import { Track } from \"@definitions/types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ACTIONS\n////////////////////////////////////////////\n\n/**\n * @type {Actions['consult']}\n */\nexport async function consult(fileUriOrScheme) {\n if (typeof FileSystemHandle === \"undefined\") {\n return { supported: false, reason: \"No browser support\" };\n }\n\n if (!fileUriOrScheme.includes(\":\")) {\n return { supported: true, consult: \"undetermined\" };\n }\n\n const parsed = parseURI(fileUriOrScheme);\n if (!parsed) return { supported: false, reason: \"Unknown handle\" };\n\n const handles = await loadHandles();\n const handle = handles[parsed.tid];\n\n if (!handle) return { supported: false, reason: \"Unknown handle\" };\n\n const permission = await /** @type {any} */ (handle).queryPermission({\n mode: \"read\",\n });\n\n return { supported: true, consult: permission === \"granted\" };\n}\n\n/**\n * @type {Actions['detach']}\n */\nexport async function detach({ fileUriOrScheme, tracks }) {\n if (!fileUriOrScheme.includes(\"://\")) {\n if (fileUriOrScheme === SCHEME) return [];\n return tracks;\n }\n\n const parsed = parseURI(fileUriOrScheme);\n if (!parsed) return tracks;\n\n const { tid } = parsed;\n const groups = groupTracksByTid(tracks);\n delete groups[tid];\n\n const handles = await loadHandles();\n delete handles[tid];\n await saveHandles(handles);\n\n return Object.values(groups).map((g) => g.tracks).flat(1);\n}\n\n/**\n * @type {Actions['groupConsult']}\n */\nexport async function groupConsult(uris) {\n const groups = groupUrisByTid(uris);\n const handles = await loadHandles();\n\n const promises = Object.entries(groups).flatMap(async ([tid, { uris }]) => {\n const handle = handles[tid];\n if (!handle) return [];\n\n const available =\n (await /** @type {any} */ (handle).queryPermission({ mode: \"read\" })) ===\n \"granted\";\n\n /** @type {ConsultGrouping} */\n const grouping = available ? { available, scheme: SCHEME, uris } : {\n available: false,\n reason: \"Permission not granted\",\n scheme: SCHEME,\n uris,\n };\n\n return [{ key: groupKey(SCHEME, tid), grouping }];\n });\n\n const results = (await Promise.all(promises)).flat(1);\n return Object.fromEntries(results.map((e) => [e.key, e.grouping]));\n}\n\n/**\n * @type {Actions['list']}\n */\nexport async function list(cachedTracks = []) {\n const handles = await loadHandles();\n const now = new Date().toISOString();\n\n /** @type {Record<string, Track>} */\n const cacheByUri = {};\n\n cachedTracks.forEach((t) => {\n cacheByUri[t.uri] = t;\n });\n\n const trackGroups = groupTracksByTid(cachedTracks);\n\n const allTids = new Set(Object.keys(trackGroups));\n\n const promises = [...allTids].map(async (tid) => {\n const handle = handles[tid];\n if (!handle) return trackGroups[tid]?.tracks ?? /** @type {Track[]} */ ([]);\n\n const perm = await /** @type {any} */ (handle).queryPermission({\n mode: \"read\",\n });\n\n if (perm !== \"granted\") {\n const cached = trackGroups[tid]?.tracks[0];\n\n /** @type {Track} */\n const placeholder = {\n $type: \"sh.diffuse.output.track\",\n id: cached?.id ?? TID.now(),\n createdAt: cached?.createdAt ?? now,\n updatedAt: now,\n kind: \"placeholder\",\n uri: buildURI(tid),\n };\n\n return [placeholder];\n }\n\n if (handle.kind === \"file\") {\n const uri = buildURI(tid);\n const cached = cacheByUri[uri];\n\n /** @type {Track} */\n const track = {\n $type: \"sh.diffuse.output.track\",\n id: cached?.id ?? TID.now(),\n createdAt: cached?.createdAt ?? now,\n updatedAt: cached?.updatedAt ?? now,\n stats: cached?.stats,\n tags: cached?.tags,\n uri,\n };\n\n return [track];\n }\n\n const paths = await enumerateAudioFiles(\n /** @type {FileSystemDirectoryHandle} */ (handle),\n );\n\n if (!paths.length) {\n /** @type {Track} */\n const placeholder = {\n $type: \"sh.diffuse.output.track\",\n id: TID.now(),\n createdAt: now,\n updatedAt: now,\n kind: \"placeholder\",\n uri: buildURI(tid),\n };\n\n return [placeholder];\n }\n\n return paths.map((path) => {\n const uri = buildURI(tid, path);\n const cached = cacheByUri[uri];\n\n /** @type {Track} */\n const track = {\n $type: \"sh.diffuse.output.track\",\n id: cached?.id ?? TID.now(),\n createdAt: cached?.createdAt ?? now,\n updatedAt: cached?.updatedAt ?? now,\n stats: cached?.stats,\n tags: cached?.tags,\n uri,\n };\n\n return track;\n });\n });\n\n const tracks = (await Promise.all(promises)).flat(1);\n return tracks;\n}\n\n/**\n * @type {Actions['resolve']}\n */\nexport async function resolve({ uri }) {\n const parsed = parseURI(uri);\n if (!parsed) return undefined;\n\n const handles = await loadHandles();\n const handle = handles[parsed.tid];\n const path = parsed.path.replace(/^\\//, \"\");\n\n if (!handle) return undefined;\n if (handle.kind === \"directory\" && path === \"\") return undefined;\n\n const fileHandle = await getHandleFile(handle, path);\n const file = await fileHandle.getFile();\n\n const url = URL.createObjectURL(file);\n return { url, expiresAt: Infinity };\n}\n\n////////////////////////////////////////////\n// ⚡️\n////////////////////////////////////////////\n\nostiary((context) => {\n rpc(context, {\n consult,\n detach,\n groupConsult,\n list,\n resolve,\n });\n});\n"],"mappings":"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","names":["uris","now"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/components/input/local/worker.js.map"}
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/opensubsonic/class.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/opensubsonic/class.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/opensubsonic/class.js.map
··· 1 + ../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/components/input/opensubsonic/class.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/opensubsonic/common.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/input/opensubsonic/common.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/opensubsonic/common.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/opensubsonic/common.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/opensubsonic/constants.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/opensubsonic/constants.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/opensubsonic/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/opensubsonic/constants.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/opensubsonic/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/input/opensubsonic/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/opensubsonic/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/opensubsonic/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/opensubsonic/worker.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/input/opensubsonic/worker.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/opensubsonic/worker.js.map
··· 1 + ../../../../bafybeih26nbu4qfpdxtsnmdgp64bgrwdzhk5imx6nqiqsdut6nf4bhcuve/components/input/opensubsonic/worker.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/s3/common.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/input/s3/common.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/s3/common.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/s3/common.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/s3/constants.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/s3/constants.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/s3/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/s3/constants.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/s3/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/input/s3/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/s3/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/s3/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/s3/worker.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/input/s3/worker.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/input/s3/worker.js.map
··· 1 + ../../../../bafybeih26nbu4qfpdxtsnmdgp64bgrwdzhk5imx6nqiqsdut6nf4bhcuve/components/input/s3/worker.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/auto-queue/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/auto-queue/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/auto-queue/element.js.map
··· 1 + ../../../../bafybeia4lo67fqia3emjf54vzbrvfyao6fwndoc4rnqpav4yezowfg4j6e/components/orchestrator/auto-queue/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/favourites/common.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/favourites/common.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/favourites/common.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/orchestrator/favourites/common.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/favourites/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/favourites/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/favourites/element.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/orchestrator/favourites/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/favourites/worker.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/favourites/worker.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/favourites/worker.js.map
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/favourites/worker.js.map
+39
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/input/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-GKE6NGNQ.js"; 6 + import "../../../chunk-VWO2GNWZ.js"; 7 + import "../../../chunk-QSPAYUAI.js"; 8 + import "../../../chunk-I3VKG3ZJ.js"; 9 + import "../../../chunk-OIRYE7B4.js"; 10 + import "../../../chunk-3AO35WC3.js"; 11 + import "../../../chunk-JBHW662S.js"; 12 + import "../../../chunk-GX3WPNEX.js"; 13 + import "../../../chunk-FJBTJV3K.js"; 14 + import "../../../chunk-PTVB4Y37.js"; 15 + import "../../../chunk-HN4F5JEZ.js"; 16 + import "../../../chunk-R3EQQDW5.js"; 17 + import "../../../chunk-GQIBEDKG.js"; 18 + import "../../../chunk-DDF5P57I.js"; 19 + import "../../../chunk-EEUCFWD4.js"; 20 + import "../../../chunk-6DRHTH2U.js"; 21 + import "../../../chunk-GCLDJKYV.js"; 22 + import "../../../chunk-KJFA7KRK.js"; 23 + import "../../../chunk-HMBZONBJ.js"; 24 + import "../../../chunk-V7EQPFPD.js"; 25 + import "../../../chunk-G56PUJUJ.js"; 26 + import "../../../chunk-6DKPDMFE.js"; 27 + import "../../../chunk-TP5GZFTO.js"; 28 + import "../../../chunk-ZQZJJU3T.js"; 29 + import "../../../chunk-BKRD2ZIW.js"; 30 + import "../../../chunk-HNJPKCUJ.js"; 31 + import "../../../chunk-SGR5ST3A.js"; 32 + import "../../../chunk-FZQXS3RE.js"; 33 + export { 34 + CLASS, 35 + NAME, 36 + element_default as default 37 + }; 38 + 39 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/input/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/input/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/media-session/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/media-session/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/media-session/element.js.map
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/media-session/element.js.map
+23
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/output/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-OSKZBJ24.js"; 6 + import "../../../chunk-XGM6M423.js"; 7 + import "../../../chunk-6KMZB5IA.js"; 8 + import "../../../chunk-B63ZUKFI.js"; 9 + import "../../../chunk-6CB2LXND.js"; 10 + import "../../../chunk-V7EQPFPD.js"; 11 + import "../../../chunk-G56PUJUJ.js"; 12 + import "../../../chunk-6DKPDMFE.js"; 13 + import "../../../chunk-TP5GZFTO.js"; 14 + import "../../../chunk-ZQZJJU3T.js"; 15 + import "../../../chunk-HNJPKCUJ.js"; 16 + import "../../../chunk-FZQXS3RE.js"; 17 + export { 18 + CLASS, 19 + NAME, 20 + element_default as default 21 + }; 22 + 23 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/output/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/output/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/process-tracks/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/process-tracks/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/process-tracks/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/process-tracks/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/process-tracks/worker.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/process-tracks/worker.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/process-tracks/worker.js.map
··· 1 + ../../../../bafybeidi3kcddz5dkh3zvsszshh4pe37cf4zjgco3xgydj77g7v3ksd2ya/components/orchestrator/process-tracks/worker.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/queue-audio/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/queue-audio/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/queue-audio/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/queue-audio/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/scoped-tracks/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/scoped-tracks/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/scoped-tracks/element.js.map
··· 1 + ../../../../bafybeihr4brahqptxmxcdksktdfgs4hyl64odwx524vqmmitjvmn57sklq/components/orchestrator/scoped-tracks/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/sources/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/sources/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/orchestrator/sources/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/sources/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/output/bytes/s3/constants.js
··· 1 + ../../../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/bytes/s3/constants.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/output/bytes/s3/constants.js.map
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/output/bytes/s3/constants.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/output/bytes/s3/element.js
··· 1 + ../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/output/bytes/s3/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/output/bytes/s3/element.js.map
··· 1 + ../../../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/bytes/s3/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/output/bytes/s3/worker.js
··· 1 + ../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/output/bytes/s3/worker.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/output/bytes/s3/worker.js.map
··· 1 + ../../../../../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/components/output/bytes/s3/worker.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/output/common.js
··· 1 + ../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/output/common.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/output/common.js.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/output/common.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/output/polymorphic/indexed-db/constants.js
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/output/polymorphic/indexed-db/constants.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/output/polymorphic/indexed-db/constants.js.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/output/polymorphic/indexed-db/constants.js.map
+24
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/output/polymorphic/indexed-db/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../../chunk-4IGBJYF3.js"; 6 + import "../../../../chunk-FAW4EB7G.js"; 7 + import "../../../../chunk-YCKIJVMK.js"; 8 + import "../../../../chunk-JZMTETBD.js"; 9 + import "../../../../chunk-H3WG7GN4.js"; 10 + import "../../../../chunk-JBHW662S.js"; 11 + import "../../../../chunk-V7EQPFPD.js"; 12 + import "../../../../chunk-G56PUJUJ.js"; 13 + import "../../../../chunk-6DKPDMFE.js"; 14 + import "../../../../chunk-TP5GZFTO.js"; 15 + import "../../../../chunk-ZQZJJU3T.js"; 16 + import "../../../../chunk-HNJPKCUJ.js"; 17 + import "../../../../chunk-FZQXS3RE.js"; 18 + export { 19 + CLASS, 20 + NAME, 21 + element_default as default 22 + }; 23 + 24 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/output/polymorphic/indexed-db/element.js.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/output/polymorphic/indexed-db/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/output/raw/atproto/element.js
··· 1 + ../../../../../bafybeicp5hi5rw4vffqlbmyqqaxhmxzx4ilejru3cq4esycpeyuuhen5ha/components/output/raw/atproto/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/output/raw/atproto/element.js.map
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/output/raw/atproto/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/output/raw/atproto/oauth.js
··· 1 + ../../../../../bafybeicp5hi5rw4vffqlbmyqqaxhmxzx4ilejru3cq4esycpeyuuhen5ha/components/output/raw/atproto/oauth.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/output/raw/atproto/oauth.js.map
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/output/raw/atproto/oauth.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/processor/artwork/constants.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/processor/artwork/constants.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/processor/artwork/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/artwork/constants.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/processor/artwork/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/processor/artwork/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/processor/artwork/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/artwork/element.js.map
+178
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/processor/artwork/worker.js
··· 1 + import { 2 + IDB_ARTWORK_PREFIX 3 + } from "../../../chunk-PJWFBDSG.js"; 4 + import { 5 + musicMetadataTags 6 + } from "../../../chunk-FPOQLPK4.js"; 7 + import "../../../chunk-7SBFGDAO.js"; 8 + import "../../../chunk-YEYOLW6N.js"; 9 + import "../../../chunk-77XZB4M3.js"; 10 + import "../../../chunk-E4JXX72S.js"; 11 + import "../../../chunk-CMU4QLMC.js"; 12 + import "../../../chunk-3IXJYTB6.js"; 13 + import "../../../chunk-J67JY2AB.js"; 14 + import "../../../chunk-F27JDJI2.js"; 15 + import { 16 + get, 17 + set 18 + } from "../../../chunk-JBHW662S.js"; 19 + import "../../../chunk-KJFA7KRK.js"; 20 + import "../../../chunk-HMBZONBJ.js"; 21 + import { 22 + ostiary, 23 + rpc 24 + } from "../../../chunk-6DKPDMFE.js"; 25 + import "../../../chunk-TP5GZFTO.js"; 26 + import "../../../chunk-ZQZJJU3T.js"; 27 + import "../../../chunk-SGR5ST3A.js"; 28 + import { 29 + __name, 30 + init_Buffer, 31 + init_process 32 + } from "../../../chunk-FZQXS3RE.js"; 33 + 34 + // components/processor/artwork/worker.js 35 + init_Buffer(); 36 + init_process(); 37 + var queue = []; 38 + async function artwork(request) { 39 + const art = await processRequest(request); 40 + return art; 41 + } 42 + __name(artwork, "artwork"); 43 + function supply(items) { 44 + const exe = !queue[0]; 45 + queue = [...queue, ...items]; 46 + if (exe) shiftQueue(); 47 + } 48 + __name(supply, "supply"); 49 + ostiary((context) => { 50 + rpc(context, { 51 + artwork, 52 + supply 53 + }); 54 + }); 55 + function escapeLucene(str) { 56 + return [].map.call(str, (char) => { 57 + if (char === "+" || char === "-" || char === "&" || char === "|" || char === "!" || char === "(" || char === ")" || char === "{" || char === "}" || char === "[" || char === "]" || char === "^" || char === '"' || char === "~" || char === "*" || char === "?" || char === ":" || char === "\\" || char === "/") { 58 + return "\\" + char; 59 + } else return char; 60 + }).join(""); 61 + } 62 + __name(escapeLucene, "escapeLucene"); 63 + async function lastFm(req) { 64 + if (!navigator.onLine) return []; 65 + const query = req.tags?.artist; 66 + return await fetch( 67 + `https://ws.audioscrobbler.com/2.0/?method=album.search&album=${query}&api_key=4f0fe85b67baef8bb7d008a8754a95e5&format=json` 68 + ).then((r) => r.json()).then((r) => lastFmCover(r.results.albummatches.album)).catch((err) => { 69 + console.error(err); 70 + return []; 71 + }); 72 + } 73 + __name(lastFm, "lastFm"); 74 + async function lastFmCover(remainingMatches) { 75 + const album = remainingMatches[0]; 76 + const url = album ? album.image[album.image.length - 1]["#text"] : null; 77 + return url && url !== "" ? await fetch(url).then((r) => r.blob()).then(async (b) => [ 78 + { 79 + bytes: await b.arrayBuffer().then((buf) => new Uint8Array(buf)), 80 + mime: b.type 81 + } 82 + ]).catch((err) => { 83 + return lastFmCover(remainingMatches.slice(1)); 84 + }) : album ? lastFmCover(remainingMatches.slice(1)) : []; 85 + } 86 + __name(lastFmCover, "lastFmCover"); 87 + async function musicBrainz(req) { 88 + const artist = req.tags?.artist; 89 + const album = req.tags?.album; 90 + if (!navigator.onLine) return []; 91 + if (!album && !artist) return []; 92 + const query = `release:"${escapeLucene(album || "")}"` + (req.variousArtists ? `` : ` AND artistname:"${escapeLucene(artist || "")}"`); 93 + const encodedQuery = encodeURIComponent(query); 94 + return await fetch( 95 + `https://musicbrainz.org/ws/2/release/?query=${encodedQuery}&fmt=json` 96 + ).then((r) => r.json()).then((r) => { 97 + if (r.releases.length === 0 && !req.variousArtists) { 98 + return musicBrainz({ ...req, variousArtists: true }); 99 + } else { 100 + return musicBrainzCover(r.releases, req); 101 + } 102 + }).catch((err) => { 103 + return []; 104 + }); 105 + } 106 + __name(musicBrainz, "musicBrainz"); 107 + async function musicBrainzCover(remainingReleases, req) { 108 + const release = remainingReleases[0]; 109 + if (!release) return []; 110 + const credit = release?.["artist-credit"]?.[0]?.name; 111 + if (req.variousArtists && credit !== "Various Artists" && credit !== req.tags?.artist) return []; 112 + return await fetch( 113 + `https://coverartarchive.org/release/${release.id}/front-1200` 114 + ).then((r) => r.blob()).then(async (b) => { 115 + if (b.type.startsWith("image/")) { 116 + return [{ 117 + bytes: await b.arrayBuffer().then((buf) => new Uint8Array(buf)), 118 + mime: b.type 119 + }]; 120 + } else { 121 + return musicBrainzCover(remainingReleases.slice(1), req); 122 + } 123 + }).catch((err) => { 124 + console.error(err); 125 + return musicBrainzCover(remainingReleases.slice(1), req); 126 + }); 127 + } 128 + __name(musicBrainzCover, "musicBrainzCover"); 129 + async function processRequest(req) { 130 + const cache = await get(`${IDB_ARTWORK_PREFIX}/${req.cacheId}`); 131 + if (cache && Array.isArray(cache) && cache.length) return cache; 132 + if (req.tags?.artist?.toUpperCase() === "VA") { 133 + req.variousArtists = true; 134 + } 135 + let art = []; 136 + const meta = await musicMetadataTags({ ...req, includeArtwork: true }).catch( 137 + /** @param {Error} err */ 138 + (err) => { 139 + console.error("music-metadata error", err); 140 + const extraction = {}; 141 + return extraction; 142 + } 143 + ); 144 + if (!req.tags && meta.tags) req.tags = meta.tags; 145 + const fromMeta = meta.artwork?.map( 146 + /** 147 + * @param {IPicture} a 148 + */ 149 + (a) => { 150 + return { bytes: a.data, mime: a.format }; 151 + } 152 + ) || []; 153 + art.push(...fromMeta); 154 + if (art.length === 0) { 155 + const fromMusicBrainz = await musicBrainz(req); 156 + art.push(...fromMusicBrainz); 157 + } 158 + if (art.length === 0) { 159 + const fromLastFm = await lastFm(req); 160 + art.push(...fromLastFm); 161 + } 162 + await set(`${IDB_ARTWORK_PREFIX}/${req.cacheId}`, art); 163 + return art; 164 + } 165 + __name(processRequest, "processRequest"); 166 + async function shiftQueue() { 167 + const next = queue.shift(); 168 + if (!next) return; 169 + await processRequest(next); 170 + await shiftQueue(); 171 + } 172 + __name(shiftQueue, "shiftQueue"); 173 + export { 174 + artwork, 175 + supply 176 + }; 177 + 178 + //# sourceMappingURL=./worker.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/processor/artwork/worker.js.map
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/processor/artwork/worker.js.map
+20
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/processor/metadata/common.js
··· 1 + import { 2 + musicMetadataTags 3 + } from "../../../chunk-FPOQLPK4.js"; 4 + import "../../../chunk-7SBFGDAO.js"; 5 + import "../../../chunk-YEYOLW6N.js"; 6 + import "../../../chunk-77XZB4M3.js"; 7 + import "../../../chunk-E4JXX72S.js"; 8 + import "../../../chunk-CMU4QLMC.js"; 9 + import "../../../chunk-3IXJYTB6.js"; 10 + import "../../../chunk-J67JY2AB.js"; 11 + import "../../../chunk-F27JDJI2.js"; 12 + import "../../../chunk-KJFA7KRK.js"; 13 + import "../../../chunk-HMBZONBJ.js"; 14 + import "../../../chunk-SGR5ST3A.js"; 15 + import "../../../chunk-FZQXS3RE.js"; 16 + export { 17 + musicMetadataTags 18 + }; 19 + 20 + //# sourceMappingURL=./common.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/processor/metadata/common.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/metadata/common.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/processor/metadata/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/processor/metadata/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/processor/metadata/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/metadata/element.js.map
+52
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/processor/metadata/worker.js
··· 1 + import { 2 + musicMetadataTags 3 + } from "../../../chunk-FPOQLPK4.js"; 4 + import "../../../chunk-7SBFGDAO.js"; 5 + import "../../../chunk-YEYOLW6N.js"; 6 + import "../../../chunk-77XZB4M3.js"; 7 + import "../../../chunk-E4JXX72S.js"; 8 + import "../../../chunk-CMU4QLMC.js"; 9 + import "../../../chunk-3IXJYTB6.js"; 10 + import "../../../chunk-J67JY2AB.js"; 11 + import "../../../chunk-F27JDJI2.js"; 12 + import "../../../chunk-KJFA7KRK.js"; 13 + import "../../../chunk-HMBZONBJ.js"; 14 + import { 15 + ostiary, 16 + rpc 17 + } from "../../../chunk-6DKPDMFE.js"; 18 + import "../../../chunk-TP5GZFTO.js"; 19 + import "../../../chunk-ZQZJJU3T.js"; 20 + import "../../../chunk-SGR5ST3A.js"; 21 + import { 22 + __name, 23 + init_Buffer, 24 + init_process 25 + } from "../../../chunk-FZQXS3RE.js"; 26 + 27 + // components/processor/metadata/worker.js 28 + init_Buffer(); 29 + init_process(); 30 + async function supply(args) { 31 + return await musicMetadataTags(args).catch( 32 + /** 33 + * @param {Error} err 34 + * @returns {Extraction} 35 + */ 36 + (err) => { 37 + console.warn("Metadata processor error:", err, args); 38 + return {}; 39 + } 40 + ); 41 + } 42 + __name(supply, "supply"); 43 + ostiary((context) => { 44 + rpc(context, { 45 + supply 46 + }); 47 + }); 48 + export { 49 + supply 50 + }; 51 + 52 + //# sourceMappingURL=./worker.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/processor/metadata/worker.js.map
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/processor/metadata/worker.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/processor/search/constants.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/processor/search/constants.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/processor/search/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/search/constants.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/processor/search/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/processor/search/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/processor/search/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/search/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/processor/search/worker.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/processor/search/worker.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/processor/search/worker.js.map
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/processor/search/worker.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/base.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/base.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/base.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/transformer/output/base.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/bytes/automerge/constants.js
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/bytes/automerge/constants.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/bytes/automerge/constants.js.map
··· 1 + ../../../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/transformer/output/bytes/automerge/constants.js.map
+237
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/bytes/automerge/element.js
··· 1 + import { 2 + INITIAL_FACETS_DOCUMENT, 3 + INITIAL_PLAYLIST_ITEMS_DOCUMENT, 4 + INITIAL_THEMES_DOCUMENT, 5 + INITIAL_TRACKS_DOCUMENT 6 + } from "../../../../../chunk-AHN37DQ6.js"; 7 + import { 8 + et, 9 + he, 10 + it, 11 + rt, 12 + st, 13 + ut, 14 + vt 15 + } from "../../../../../chunk-Z2SJTSR2.js"; 16 + import "../../../../../chunk-4IGBJYF3.js"; 17 + import "../../../../../chunk-FAW4EB7G.js"; 18 + import "../../../../../chunk-YCKIJVMK.js"; 19 + import "../../../../../chunk-JZMTETBD.js"; 20 + import "../../../../../chunk-H3WG7GN4.js"; 21 + import { 22 + o 23 + } from "../../../../../chunk-XGM6M423.js"; 24 + import { 25 + OutputTransformer 26 + } from "../../../../../chunk-B63ZUKFI.js"; 27 + import "../../../../../chunk-JBHW662S.js"; 28 + import { 29 + recursivelyCloneRecords, 30 + removeUndefinedValuesFromRecord 31 + } from "../../../../../chunk-KJFA7KRK.js"; 32 + import { 33 + isUint8Array 34 + } from "../../../../../chunk-HMBZONBJ.js"; 35 + import "../../../../../chunk-V7EQPFPD.js"; 36 + import "../../../../../chunk-G56PUJUJ.js"; 37 + import "../../../../../chunk-6DKPDMFE.js"; 38 + import "../../../../../chunk-TP5GZFTO.js"; 39 + import "../../../../../chunk-ZQZJJU3T.js"; 40 + import { 41 + computed, 42 + signal 43 + } from "../../../../../chunk-HNJPKCUJ.js"; 44 + import { 45 + __name, 46 + init_Buffer, 47 + init_process 48 + } from "../../../../../chunk-FZQXS3RE.js"; 49 + 50 + // components/transformer/output/bytes/automerge/element.js 51 + init_Buffer(); 52 + init_process(); 53 + var AutomergeBytesOutputTransformer = class extends OutputTransformer { 54 + static { 55 + __name(this, "AutomergeBytesOutputTransformer"); 56 + } 57 + constructor() { 58 + super(); 59 + const remote = this.base(); 60 + const local = this.#localOutput.get; 61 + const state = /* @__PURE__ */ __name((localCollection, remoteCollection, initial) => computed(() => { 62 + const l = loadDocument(localCollection); 63 + const r = remote.ready() ? loadDocument(remoteCollection) : void 0; 64 + if (!r) { 65 + return l ? { doc: l, diverged: true, local: false, remote: true } : { doc: initial, diverged: false, local: false, remote: false }; 66 + } else if (!l) { 67 + return { doc: r, diverged: true, local: true, remote: false }; 68 + } 69 + const lh = he(l)[0]; 70 + const rh = he(r)[0]; 71 + const diverged = lh !== rh; 72 + return { 73 + doc: diverged ? ut(et(l), et(r)) : r, 74 + diverged, 75 + local: vt(r, [lh]), 76 + remote: vt(l, [rh]) 77 + }; 78 + }), "state"); 79 + const facets = state( 80 + computed(() => local()?.facets?.collection()), 81 + remote.facets.collection, 82 + INITIAL_FACETS_DOCUMENT 83 + ); 84 + const playlistItems = state( 85 + computed(() => local()?.playlistItems?.collection()), 86 + remote.playlistItems.collection, 87 + INITIAL_PLAYLIST_ITEMS_DOCUMENT 88 + ); 89 + const themes = state( 90 + computed(() => local()?.themes?.collection()), 91 + remote.themes.collection, 92 + INITIAL_THEMES_DOCUMENT 93 + ); 94 + const tracks = state( 95 + computed(() => local()?.tracks?.collection()), 96 + remote.tracks.collection, 97 + INITIAL_TRACKS_DOCUMENT 98 + ); 99 + this.facets = automergeEntry( 100 + computed(() => local()?.facets), 101 + remote.facets, 102 + computed(() => facets().doc), 103 + { 104 + stripUndefined: true 105 + } 106 + ); 107 + this.playlistItems = automergeEntry( 108 + computed(() => local()?.playlistItems), 109 + remote.playlistItems, 110 + computed(() => playlistItems().doc) 111 + ); 112 + this.themes = automergeEntry( 113 + computed(() => local()?.themes), 114 + remote.themes, 115 + computed(() => themes().doc), 116 + { 117 + stripUndefined: true 118 + } 119 + ); 120 + this.tracks = automergeEntry( 121 + computed(() => local()?.tracks), 122 + remote.tracks, 123 + computed(() => tracks().doc) 124 + ); 125 + this.ready = () => true; 126 + this.effect(() => { 127 + const l = local(); 128 + if (!l) return; 129 + this.effect(() => { 130 + if (remote.facets.state() !== "loaded") return; 131 + const s = facets(); 132 + if (s.diverged) { 133 + const bytes = it(s.doc); 134 + if (l && s.local) l.facets.save(bytes); 135 + if (s.remote) remote.facets.save(bytes); 136 + } 137 + }); 138 + this.effect(() => { 139 + if (remote.playlistItems.state() !== "loaded") return; 140 + const s = playlistItems(); 141 + if (s.diverged) { 142 + const bytes = it(s.doc); 143 + if (l && s.local) l.playlistItems.save(bytes); 144 + if (s.remote) remote.playlistItems.save(bytes); 145 + } 146 + }); 147 + this.effect(() => { 148 + if (remote.themes.state() !== "loaded") return; 149 + const s = themes(); 150 + if (s.diverged) { 151 + const bytes = it(s.doc); 152 + if (l && s.local) l.themes.save(bytes); 153 + if (s.remote) remote.themes.save(bytes); 154 + } 155 + }); 156 + this.effect(() => { 157 + if (remote.tracks.state() !== "loaded") return; 158 + const s = tracks(); 159 + if (s.diverged) { 160 + const bytes = it(s.doc); 161 + if (l && s.local) l.tracks.save(bytes); 162 + if (s.remote) remote.tracks.save(bytes); 163 + } 164 + }); 165 + }); 166 + } 167 + // SIGNALS 168 + #localOutput = signal( 169 + /** @type {OutputElement<Uint8Array | undefined> | undefined} */ 170 + void 0 171 + ); 172 + // LIFECYCLE 173 + /** 174 + * @override 175 + */ 176 + connectedCallback() { 177 + super.connectedCallback(); 178 + const local = this.root().querySelector("dop-indexed-db"); 179 + if (!local) throw new Error("Can't find local output"); 180 + customElements.whenDefined(local.localName).then(() => { 181 + this.#localOutput.value = local; 182 + }); 183 + } 184 + // RENDER 185 + /** 186 + * @param {RenderArg} _ 187 + */ 188 + render({ html }) { 189 + return html` 190 + <dop-indexed-db 191 + namespace="${o(this.getAttribute(`namespace`))}" 192 + ></dop-indexed-db> 193 + `; 194 + } 195 + }; 196 + var element_default = AutomergeBytesOutputTransformer; 197 + function loadDocument(source) { 198 + const value = source(); 199 + if (isUint8Array(value)) { 200 + return st(value); 201 + } else if (value == void 0) { 202 + return void 0; 203 + } else { 204 + throw new Error("Invalid data type"); 205 + } 206 + } 207 + __name(loadDocument, "loadDocument"); 208 + function automergeEntry(local, remote, document, opts) { 209 + return { 210 + collection: computed(() => document().collection), 211 + reload: remote.reload, 212 + save: /* @__PURE__ */ __name(async (newItems) => { 213 + const doc = rt(document(), (d) => { 214 + d.collection = newItems.map((item) => { 215 + const cloned = recursivelyCloneRecords(item); 216 + return opts?.stripUndefined ? removeUndefinedValuesFromRecord(cloned) : cloned; 217 + }); 218 + }); 219 + const bytes = it(doc); 220 + await local()?.save(bytes); 221 + }, "save"), 222 + state: computed(() => local()?.state() ?? "sleeping") 223 + }; 224 + } 225 + __name(automergeEntry, "automergeEntry"); 226 + var CLASS = AutomergeBytesOutputTransformer; 227 + var NAME = "dtob-automerge"; 228 + customElements.define(NAME, CLASS); 229 + export { 230 + CLASS, 231 + NAME, 232 + automergeEntry, 233 + element_default as default, 234 + loadDocument 235 + }; 236 + 237 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/bytes/automerge/element.js.map
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/bytes/automerge/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/bytes/automerge/utils.js
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/bytes/automerge/utils.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/bytes/automerge/utils.js.map
··· 1 + ../../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/transformer/output/bytes/automerge/utils.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/bytes/dasl-sync/constants.js
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/bytes/dasl-sync/constants.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/bytes/dasl-sync/constants.js.map
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/bytes/dasl-sync/constants.js.map
+1050
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/bytes/dasl-sync/element.js
··· 1 + import { 2 + fromBase32, 3 + fromBase64, 4 + toBase32, 5 + toBase64 6 + } from "../../../../../chunk-NZ7ODGIJ.js"; 7 + import "../../../../../chunk-4IGBJYF3.js"; 8 + import "../../../../../chunk-FAW4EB7G.js"; 9 + import { 10 + promiseLoadedState 11 + } from "../../../../../chunk-YCKIJVMK.js"; 12 + import { 13 + diff, 14 + strictEquality 15 + } from "../../../../../chunk-JZMTETBD.js"; 16 + import { 17 + deep_diff_default 18 + } from "../../../../../chunk-H3WG7GN4.js"; 19 + import { 20 + o 21 + } from "../../../../../chunk-XGM6M423.js"; 22 + import { 23 + OutputTransformer 24 + } from "../../../../../chunk-B63ZUKFI.js"; 25 + import "../../../../../chunk-JBHW662S.js"; 26 + import { 27 + compareTimestamps 28 + } from "../../../../../chunk-KJFA7KRK.js"; 29 + import "../../../../../chunk-HMBZONBJ.js"; 30 + import "../../../../../chunk-V7EQPFPD.js"; 31 + import "../../../../../chunk-G56PUJUJ.js"; 32 + import "../../../../../chunk-6DKPDMFE.js"; 33 + import "../../../../../chunk-TP5GZFTO.js"; 34 + import "../../../../../chunk-ZQZJJU3T.js"; 35 + import { 36 + allocUnsafe, 37 + concat, 38 + decodeUtf8From, 39 + encodeUtf8Into 40 + } from "../../../../../chunk-242LG3VP.js"; 41 + import { 42 + computed, 43 + signal 44 + } from "../../../../../chunk-HNJPKCUJ.js"; 45 + import { 46 + create 47 + } from "../../../../../chunk-4YB6QUPN.js"; 48 + import { 49 + __name, 50 + init_Buffer, 51 + init_process 52 + } from "../../../../../chunk-FZQXS3RE.js"; 53 + 54 + // components/transformer/output/bytes/dasl-sync/element.js 55 + init_Buffer(); 56 + init_process(); 57 + 58 + // ../node_modules/.deno/@atcute+cbor@2.3.2/node_modules/@atcute/cbor/dist/index.js 59 + init_Buffer(); 60 + init_process(); 61 + 62 + // ../node_modules/.deno/@atcute+cid@2.4.1/node_modules/@atcute/cid/dist/index.js 63 + init_Buffer(); 64 + init_process(); 65 + 66 + // ../node_modules/.deno/@atcute+cid@2.4.1/node_modules/@atcute/cid/dist/cid-link.js 67 + init_Buffer(); 68 + init_process(); 69 + 70 + // ../node_modules/.deno/@atcute+cid@2.4.1/node_modules/@atcute/cid/dist/codec.js 71 + init_Buffer(); 72 + init_process(); 73 + var CID_VERSION = 1; 74 + var HASH_SHA256 = 18; 75 + var CODEC_RAW = 85; 76 + var CODEC_DCBOR = 113; 77 + var decodeFirst = /* @__PURE__ */ __name((bytes) => { 78 + if (bytes.length < 36) { 79 + throw new RangeError(`cid too short`); 80 + } 81 + const version = bytes[0]; 82 + const codec = bytes[1]; 83 + const digestType = bytes[2]; 84 + const digestSize = bytes[3]; 85 + if (version !== CID_VERSION) { 86 + throw new RangeError(`incorrect cid version (got v${version})`); 87 + } 88 + if (codec !== CODEC_DCBOR && codec !== CODEC_RAW) { 89 + throw new RangeError(`incorrect cid codec (got 0x${codec.toString(16)})`); 90 + } 91 + if (digestType !== HASH_SHA256) { 92 + throw new RangeError(`incorrect cid digest codec (got 0x${digestType.toString(16)})`); 93 + } 94 + if (digestSize !== 32) { 95 + throw new RangeError(`incorrect cid digest size (got ${digestSize})`); 96 + } 97 + const cid = { 98 + version: CID_VERSION, 99 + codec, 100 + digest: { 101 + codec: digestType, 102 + contents: bytes.subarray(4, 36) 103 + }, 104 + bytes: bytes.subarray(0, 36) 105 + }; 106 + return [cid, bytes.subarray(36)]; 107 + }, "decodeFirst"); 108 + var decode = /* @__PURE__ */ __name((bytes) => { 109 + const [cid, remainder] = decodeFirst(bytes); 110 + if (remainder.length !== 0) { 111 + throw new RangeError(`cid bytes includes remainder`); 112 + } 113 + return cid; 114 + }, "decode"); 115 + var fromString = /* @__PURE__ */ __name((input) => { 116 + if (input.length !== 59 || input[0] !== "b") { 117 + throw new SyntaxError(`not a valid cid string`); 118 + } 119 + const bytes = fromBase32(input.slice(1)); 120 + return decode(bytes); 121 + }, "fromString"); 122 + var fromBinary = /* @__PURE__ */ __name((input) => { 123 + if (input.length !== 37 || input[0] !== 0) { 124 + throw new SyntaxError(`invalid binary cid`); 125 + } 126 + return decode(input.subarray(1)); 127 + }, "fromBinary"); 128 + 129 + // ../node_modules/.deno/@atcute+cid@2.4.1/node_modules/@atcute/cid/dist/cid-link.js 130 + var CID_LINK_SYMBOL = /* @__PURE__ */ Symbol.for("@atcute/cid-link-wrapper"); 131 + var CidLinkWrapper = class { 132 + static { 133 + __name(this, "CidLinkWrapper"); 134 + } 135 + /** @internal */ 136 + [CID_LINK_SYMBOL] = true; 137 + bytes; 138 + constructor(bytes) { 139 + this.bytes = bytes; 140 + } 141 + get $link() { 142 + const link = `b${toBase32(this.bytes)}`; 143 + Object.defineProperty(this, "$link", { 144 + value: link, 145 + enumerable: true 146 + }); 147 + return link; 148 + } 149 + toJSON() { 150 + return { $link: this.$link }; 151 + } 152 + }; 153 + 154 + // ../node_modules/.deno/@atcute+cbor@2.3.2/node_modules/@atcute/cbor/dist/bytes.js 155 + init_Buffer(); 156 + init_process(); 157 + var BYTES_SYMBOL = /* @__PURE__ */ Symbol.for("@atcute/bytes-wrapper"); 158 + var BytesWrapper = class { 159 + static { 160 + __name(this, "BytesWrapper"); 161 + } 162 + buf; 163 + /** @internal */ 164 + [BYTES_SYMBOL] = true; 165 + constructor(buf) { 166 + this.buf = buf; 167 + } 168 + get $bytes() { 169 + return toBase64(this.buf); 170 + } 171 + toJSON() { 172 + return { $bytes: this.$bytes }; 173 + } 174 + }; 175 + var toBytes = /* @__PURE__ */ __name((buf) => { 176 + return new BytesWrapper(buf); 177 + }, "toBytes"); 178 + var fromBytes = /* @__PURE__ */ __name((bytes) => { 179 + if (bytes instanceof BytesWrapper) { 180 + return bytes.buf; 181 + } 182 + return fromBase64(bytes.$bytes); 183 + }, "fromBytes"); 184 + 185 + // ../node_modules/.deno/@atcute+cbor@2.3.2/node_modules/@atcute/cbor/dist/decode.js 186 + init_Buffer(); 187 + init_process(); 188 + var readArgument = /* @__PURE__ */ __name((state, info) => { 189 + if (info < 24) { 190 + return info; 191 + } 192 + let arg; 193 + switch (info) { 194 + case 24: { 195 + arg = readUint8(state); 196 + if (arg < 24) { 197 + throw new TypeError(`non-canonical argument encoding`); 198 + } 199 + break; 200 + } 201 + case 25: { 202 + arg = readUint16(state); 203 + if (arg < 256) { 204 + throw new TypeError(`non-canonical argument encoding`); 205 + } 206 + break; 207 + } 208 + case 26: { 209 + arg = readUint32(state); 210 + if (arg < 65536) { 211 + throw new TypeError(`non-canonical argument encoding`); 212 + } 213 + break; 214 + } 215 + case 27: { 216 + arg = readUint53(state); 217 + if (arg < 4294967296) { 218 + throw new TypeError(`non-canonical argument encoding`); 219 + } 220 + break; 221 + } 222 + default: { 223 + throw new Error(`invalid argument encoding; got ${info}`); 224 + } 225 + } 226 + return arg; 227 + }, "readArgument"); 228 + var readFloat64 = /* @__PURE__ */ __name((state) => { 229 + const view = state.v ??= new DataView(state.b.buffer, state.b.byteOffset, state.b.byteLength); 230 + const value = view.getFloat64(state.p); 231 + state.p += 8; 232 + return value; 233 + }, "readFloat64"); 234 + var readUint8 = /* @__PURE__ */ __name((state) => { 235 + return state.b[state.p++]; 236 + }, "readUint8"); 237 + var readUint16 = /* @__PURE__ */ __name((state) => { 238 + let pos = state.p; 239 + const buf = state.b; 240 + const value = buf[pos++] << 8 | buf[pos++]; 241 + state.p = pos; 242 + return value; 243 + }, "readUint16"); 244 + var readUint32 = /* @__PURE__ */ __name((state) => { 245 + let pos = state.p; 246 + const buf = state.b; 247 + const value = (buf[pos++] << 24 | buf[pos++] << 16 | buf[pos++] << 8 | buf[pos++]) >>> 0; 248 + state.p = pos; 249 + return value; 250 + }, "readUint32"); 251 + var readUint53 = /* @__PURE__ */ __name((state) => { 252 + const hi = readUint32(state); 253 + const lo = readUint32(state); 254 + if (hi > 2097151) { 255 + throw new RangeError(`can't decode integers beyond safe integer range`); 256 + } 257 + return hi * 2 ** 32 + lo; 258 + }, "readUint53"); 259 + var readString = /* @__PURE__ */ __name((state, length) => { 260 + const string = decodeUtf8From(state.b, state.p, length); 261 + state.p += length; 262 + return string; 263 + }, "readString"); 264 + var readBytes = /* @__PURE__ */ __name((state, length) => { 265 + const slice = state.b.subarray(state.p, state.p += length); 266 + return toBytes(slice); 267 + }, "readBytes"); 268 + var readCid = /* @__PURE__ */ __name((state, length) => { 269 + const cid = fromBinary(state.b.subarray(state.p, state.p += length)); 270 + return new CidLinkWrapper(cid.bytes); 271 + }, "readCid"); 272 + var decodeStringKey = /* @__PURE__ */ __name((state) => { 273 + const prelude = readUint8(state); 274 + const type = prelude >> 5; 275 + if (type !== 3) { 276 + throw new TypeError(`expected map to only have string keys; got type ${type}`); 277 + } 278 + const info = prelude & 31; 279 + const length = info < 24 ? info : readArgument(state, info); 280 + return readString(state, length); 281 + }, "decodeStringKey"); 282 + var decodeFirst2 = /* @__PURE__ */ __name((buf) => { 283 + const len = buf.length; 284 + const state = { 285 + b: buf, 286 + v: null, 287 + p: 0 288 + }; 289 + let stack = null; 290 + let value; 291 + jump: while (state.p < len) { 292 + const prelude = readUint8(state); 293 + const type = prelude >> 5; 294 + const info = prelude & 31; 295 + const arg = type === 7 ? 0 : info < 24 ? info : readArgument(state, info); 296 + switch (type) { 297 + case 0: { 298 + value = arg; 299 + break; 300 + } 301 + case 1: { 302 + value = -1 - arg; 303 + break; 304 + } 305 + case 2: { 306 + value = readBytes(state, arg); 307 + break; 308 + } 309 + case 3: { 310 + value = readString(state, arg); 311 + break; 312 + } 313 + case 4: { 314 + if (arg > 0) { 315 + stack = { t: 1, c: value = new Array(arg), k: null, r: arg, n: stack }; 316 + continue jump; 317 + } 318 + value = []; 319 + break; 320 + } 321 + case 5: { 322 + value = {}; 323 + if (arg > 0) { 324 + const first = decodeStringKey(state); 325 + stack = { t: 0, c: value, k: first, r: arg, n: stack }; 326 + continue jump; 327 + } 328 + break; 329 + } 330 + case 6: { 331 + switch (arg) { 332 + case 42: { 333 + const prelude2 = readUint8(state); 334 + const type2 = prelude2 >> 5; 335 + const info2 = prelude2 & 31; 336 + if (type2 !== 2) { 337 + throw new TypeError(`expected cid-link to be type 2 (bytes); got type ${type2}`); 338 + } 339 + const len2 = readArgument(state, info2); 340 + value = readCid(state, len2); 341 + break; 342 + } 343 + default: { 344 + throw new TypeError(`unsupported tag; got ${arg}`); 345 + } 346 + } 347 + break; 348 + } 349 + case 7: { 350 + switch (info) { 351 + case 20: 352 + case 21: { 353 + value = info === 21; 354 + break; 355 + } 356 + case 22: { 357 + value = null; 358 + break; 359 + } 360 + case 27: { 361 + value = readFloat64(state); 362 + break; 363 + } 364 + default: { 365 + throw new Error(`invalid simple value; got ${info}`); 366 + } 367 + } 368 + break; 369 + } 370 + default: { 371 + throw new TypeError(`invalid type; got ${type}`); 372 + } 373 + } 374 + while (stack !== null) { 375 + switch (stack.t) { 376 + case 0: { 377 + const obj = stack.c; 378 + const key = stack.k; 379 + if (key === "__proto__") { 380 + Object.defineProperty(obj, key, { enumerable: true, configurable: true, writable: true }); 381 + } 382 + obj[key] = value; 383 + break; 384 + } 385 + case 1: { 386 + const arr = stack.c; 387 + const index = arr.length - stack.r; 388 + arr[index] = value; 389 + break; 390 + } 391 + } 392 + if (--stack.r) { 393 + if (!stack.t) { 394 + const prevKey = stack.k; 395 + const key = decodeStringKey(state); 396 + stack.k = key; 397 + const cmp = key.length - prevKey.length || (key > prevKey ? 1 : key < prevKey ? -1 : 0); 398 + if (cmp <= 0) { 399 + throw new TypeError(`map keys are not in canonical order or contain duplicates`); 400 + } 401 + } 402 + continue jump; 403 + } 404 + value = stack.c; 405 + stack = stack.n; 406 + } 407 + break; 408 + } 409 + return [value, buf.subarray(state.p)]; 410 + }, "decodeFirst"); 411 + var decode2 = /* @__PURE__ */ __name((buf) => { 412 + const [value, remainder] = decodeFirst2(buf); 413 + if (remainder.length !== 0) { 414 + throw new Error(`decoded value contains remainder`); 415 + } 416 + return value; 417 + }, "decode"); 418 + 419 + // ../node_modules/.deno/@atcute+cbor@2.3.2/node_modules/@atcute/cbor/dist/encode.js 420 + init_Buffer(); 421 + init_process(); 422 + 423 + // ../node_modules/.deno/@atcute+cbor@2.3.2/node_modules/@atcute/cbor/dist/runtime.node.js 424 + init_Buffer(); 425 + init_process(); 426 + var IS_NODE_RUNTIME = true; 427 + 428 + // ../node_modules/.deno/@atcute+cbor@2.3.2/node_modules/@atcute/cbor/dist/encode.js 429 + var MAX_TYPE_ARG_LEN = 9; 430 + var CHUNK_SIZE = 1024; 431 + var _max = Math.max; 432 + var _isInteger = Number.isInteger; 433 + var _isFinite = Number.isFinite; 434 + var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER; 435 + var MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER; 436 + var resizeIfNeeded = /* @__PURE__ */ __name((state, needed) => { 437 + const buf = state.b; 438 + const pos = state.p; 439 + if (buf.byteLength < pos + needed) { 440 + state.c.push(buf.subarray(0, pos)); 441 + state.l += pos; 442 + state.b = allocUnsafe(_max(CHUNK_SIZE, needed)); 443 + state.v = null; 444 + state.p = 0; 445 + } 446 + }, "resizeIfNeeded"); 447 + var getTypeInfoLength = /* @__PURE__ */ __name((arg) => { 448 + return arg < 24 ? 1 : arg < 256 ? 2 : arg < 65536 ? 3 : arg < 4294967296 ? 5 : 9; 449 + }, "getTypeInfoLength"); 450 + var writeFloat64 = /* @__PURE__ */ __name((state, val) => { 451 + const buf = state.b; 452 + const view = state.v ??= new DataView(buf.buffer, buf.byteOffset, buf.byteLength); 453 + view.setFloat64(state.p, val); 454 + state.p += 8; 455 + }, "writeFloat64"); 456 + var writeUint8 = /* @__PURE__ */ __name((state, val) => { 457 + state.b[state.p++] = val; 458 + }, "writeUint8"); 459 + var writeUint16 = /* @__PURE__ */ __name((state, val) => { 460 + let pos = state.p; 461 + const buf = state.b; 462 + buf[pos++] = val >>> 8; 463 + buf[pos++] = val & 255; 464 + state.p = pos; 465 + }, "writeUint16"); 466 + var writeUint32 = /* @__PURE__ */ __name((state, val) => { 467 + let pos = state.p; 468 + const buf = state.b; 469 + buf[pos++] = val >>> 24; 470 + buf[pos++] = val >>> 16 & 255; 471 + buf[pos++] = val >>> 8 & 255; 472 + buf[pos++] = val & 255; 473 + state.p = pos; 474 + }, "writeUint32"); 475 + var writeUint53 = /* @__PURE__ */ __name((state, val) => { 476 + let pos = state.p; 477 + const buf = state.b; 478 + const hi = val / 2 ** 32 | 0; 479 + const lo = val >>> 0; 480 + buf[pos++] = hi >>> 24; 481 + buf[pos++] = hi >>> 16 & 255; 482 + buf[pos++] = hi >>> 8 & 255; 483 + buf[pos++] = hi & 255; 484 + buf[pos++] = lo >>> 24; 485 + buf[pos++] = lo >>> 16 & 255; 486 + buf[pos++] = lo >>> 8 & 255; 487 + buf[pos++] = lo & 255; 488 + state.p = pos; 489 + }, "writeUint53"); 490 + var writeTypeAndArgument = /* @__PURE__ */ __name((state, type, arg) => { 491 + if (arg < 24) { 492 + writeUint8(state, type << 5 | arg); 493 + } else if (arg < 256) { 494 + writeUint8(state, type << 5 | 24); 495 + writeUint8(state, arg); 496 + } else if (arg < 65536) { 497 + writeUint8(state, type << 5 | 25); 498 + writeUint16(state, arg); 499 + } else if (arg < 4294967296) { 500 + writeUint8(state, type << 5 | 26); 501 + writeUint32(state, arg); 502 + } else { 503 + writeUint8(state, type << 5 | 27); 504 + writeUint53(state, arg); 505 + } 506 + }, "writeTypeAndArgument"); 507 + var writeInteger = /* @__PURE__ */ __name((state, val) => { 508 + resizeIfNeeded(state, MAX_TYPE_ARG_LEN); 509 + if (val < 0) { 510 + writeTypeAndArgument(state, 1, -val - 1); 511 + } else { 512 + writeTypeAndArgument(state, 0, val); 513 + } 514 + }, "writeInteger"); 515 + var writeFloat = /* @__PURE__ */ __name((state, val) => { 516 + resizeIfNeeded(state, 9); 517 + writeUint8(state, 224 | 27); 518 + writeFloat64(state, val); 519 + }, "writeFloat"); 520 + var writeNumber = /* @__PURE__ */ __name((state, val) => { 521 + if (!_isFinite(val)) { 522 + throw new RangeError(`NaN and Infinity values not supported`); 523 + } 524 + if (val > MAX_SAFE_INTEGER || val < MIN_SAFE_INTEGER) { 525 + throw new RangeError(`can't encode numbers beyond safe integer range`); 526 + } 527 + if (_isInteger(val)) { 528 + writeInteger(state, val); 529 + } else { 530 + writeFloat(state, val); 531 + } 532 + }, "writeNumber"); 533 + var writeString = /* @__PURE__ */ __name((state, val) => { 534 + const strLength = val.length; 535 + if (strLength === 0) { 536 + resizeIfNeeded(state, 1); 537 + writeUint8(state, 96); 538 + return; 539 + } 540 + resizeIfNeeded(state, strLength * 3 + MAX_TYPE_ARG_LEN); 541 + ascii: if (!IS_NODE_RUNTIME || strLength < 24) { 542 + const ptr = state.p + getTypeInfoLength(strLength); 543 + const first = val.charCodeAt(0); 544 + if (first > 127) { 545 + break ascii; 546 + } 547 + state.b[ptr] = first; 548 + let i = 1; 549 + for (; i + 3 < strLength; i += 4) { 550 + const a = val.charCodeAt(i); 551 + const b = val.charCodeAt(i + 1); 552 + const c = val.charCodeAt(i + 2); 553 + const d = val.charCodeAt(i + 3); 554 + if ((a | b | c | d) & 128) { 555 + break ascii; 556 + } 557 + state.b[ptr + i] = a; 558 + state.b[ptr + i + 1] = b; 559 + state.b[ptr + i + 2] = c; 560 + state.b[ptr + i + 3] = d; 561 + } 562 + for (; i < strLength; i++) { 563 + const code = val.charCodeAt(i); 564 + if (code > 127) { 565 + break ascii; 566 + } 567 + state.b[ptr + i] = code; 568 + } 569 + writeTypeAndArgument(state, 3, strLength); 570 + state.p += strLength; 571 + return; 572 + } 573 + const estimatedHeaderSize = getTypeInfoLength(strLength * 2); 574 + const estimatedPosition = state.p + estimatedHeaderSize; 575 + const len = encodeUtf8Into(state.b, val, estimatedPosition); 576 + const headerSize = getTypeInfoLength(len); 577 + if (estimatedHeaderSize !== headerSize) { 578 + state.b.copyWithin(state.p + headerSize, estimatedPosition, estimatedPosition + len); 579 + } 580 + writeTypeAndArgument(state, 3, len); 581 + state.p += len; 582 + }, "writeString"); 583 + var writeBytes = /* @__PURE__ */ __name((state, val) => { 584 + const buf = fromBytes(val); 585 + const len = buf.byteLength; 586 + resizeIfNeeded(state, len + MAX_TYPE_ARG_LEN); 587 + writeTypeAndArgument(state, 2, len); 588 + state.b.set(buf, state.p); 589 + state.p += len; 590 + }, "writeBytes"); 591 + var writeCid = /* @__PURE__ */ __name((state, val) => { 592 + const buf = val instanceof CidLinkWrapper ? val.bytes : fromString(val.$link).bytes; 593 + const len = buf.byteLength + 1; 594 + resizeIfNeeded(state, len + 2 * MAX_TYPE_ARG_LEN); 595 + writeTypeAndArgument(state, 6, 42); 596 + writeTypeAndArgument(state, 2, len); 597 + state.b[state.p] = 0; 598 + state.b.set(buf, state.p + 1); 599 + state.p += len; 600 + }, "writeCid"); 601 + var writeValue = /* @__PURE__ */ __name((state, val) => { 602 + switch (typeof val) { 603 + case "boolean": { 604 + resizeIfNeeded(state, 1); 605 + return writeUint8(state, 244 + +val); 606 + } 607 + case "number": { 608 + return writeNumber(state, val); 609 + } 610 + case "string": { 611 + return writeString(state, val); 612 + } 613 + case "object": { 614 + if (val === null) { 615 + resizeIfNeeded(state, 1); 616 + return writeUint8(state, 246); 617 + } 618 + if (Array.isArray(val)) { 619 + const len = val.length; 620 + resizeIfNeeded(state, MAX_TYPE_ARG_LEN); 621 + writeTypeAndArgument(state, 4, len); 622 + for (let idx = 0; idx < len; idx++) { 623 + writeValue(state, val[idx]); 624 + } 625 + return; 626 + } 627 + if (val.constructor === Object) { 628 + const keys = getOrderedObjectKeys(val); 629 + const len = keys.length; 630 + if (len === 1) { 631 + const key = keys[0]; 632 + if (key === "$link") { 633 + if (typeof val.$link === "string") { 634 + writeCid(state, val); 635 + return; 636 + } 637 + throw new TypeError(`unexpected cid-link value`); 638 + } 639 + if (key === "$bytes") { 640 + if (typeof val.$bytes === "string") { 641 + writeBytes(state, val); 642 + return; 643 + } 644 + throw new TypeError(`unexpected bytes value`); 645 + } 646 + } 647 + resizeIfNeeded(state, MAX_TYPE_ARG_LEN); 648 + writeTypeAndArgument(state, 5, len); 649 + for (let idx = 0; idx < len; idx++) { 650 + const key = keys[idx]; 651 + writeString(state, key); 652 + writeValue(state, val[key]); 653 + } 654 + return; 655 + } 656 + if ("$link" in val) { 657 + if (val instanceof CidLinkWrapper || typeof val.$link === "string") { 658 + writeCid(state, val); 659 + return; 660 + } 661 + throw new TypeError(`unexpected cid-link value`); 662 + } 663 + if ("$bytes" in val) { 664 + if (val instanceof BytesWrapper || typeof val.$bytes === "string") { 665 + writeBytes(state, val); 666 + return; 667 + } 668 + throw new TypeError(`unexpected bytes value`); 669 + } 670 + } 671 + } 672 + throw new TypeError(`unsupported type: ${val}`); 673 + }, "writeValue"); 674 + var createState = /* @__PURE__ */ __name(() => { 675 + return { 676 + c: [], 677 + b: allocUnsafe(CHUNK_SIZE), 678 + v: null, 679 + p: 0, 680 + l: 0 681 + }; 682 + }, "createState"); 683 + var encode = /* @__PURE__ */ __name((value) => { 684 + const state = createState(); 685 + writeValue(state, value); 686 + const final = state.b.subarray(0, state.p); 687 + if (!state.c.length) 688 + return final; 689 + state.c.push(final); 690 + return concat(state.c, state.l + state.p); 691 + }, "encode"); 692 + var getOrderedObjectKeys = /* @__PURE__ */ __name((obj) => { 693 + const keys = Object.keys(obj); 694 + let len = 0; 695 + for (let i = 0; i < keys.length; i++) { 696 + const valA = keys[i]; 697 + if (obj[valA] === void 0) { 698 + continue; 699 + } 700 + const lenA = valA.length; 701 + let j = len - 1; 702 + for (; j >= 0; j--) { 703 + const valB = keys[j]; 704 + if (lenA > valB.length || lenA === valB.length && valA > valB) { 705 + break; 706 + } 707 + keys[j + 1] = valB; 708 + } 709 + keys[j + 1] = valA; 710 + len++; 711 + } 712 + keys.length = len; 713 + return keys; 714 + }, "getOrderedObjectKeys"); 715 + 716 + // components/transformer/output/bytes/dasl-sync/element.js 717 + var EMPTY = { 718 + cid: void 0, 719 + data: [], 720 + inventory: { current: {}, removed: [] } 721 + }; 722 + var DaslBytesSyncOutputTransformer = class extends OutputTransformer { 723 + static { 724 + __name(this, "DaslBytesSyncOutputTransformer"); 725 + } 726 + static NAME = "diffuse/transformer/output/bytes/dasl-sync"; 727 + constructor() { 728 + super(); 729 + const remote = this.base(); 730 + const local = this.#localOutput.get; 731 + const state = /* @__PURE__ */ __name((kind, localCollection, remoteCollection, remoteState, { saveLocal, saveRemote }) => { 732 + const container = signal( 733 + /** @type {Container<T>} */ 734 + EMPTY, 735 + { compare: strictEquality } 736 + ); 737 + const isReady = signal(false); 738 + const merging = signal({ isBusy: false, lastCID: "" }, { 739 + compare: diff 740 + }); 741 + this.effect(() => { 742 + if (!isReady.value) return; 743 + if (merging.value.isBusy) return; 744 + const lb = localCollection(); 745 + const rb = remote.ready() ? remoteCollection() : void 0; 746 + const rs = remoteState(); 747 + const l = lb ? decode2(lb) : void 0; 748 + const r = rb && rs === "loaded" ? decode2(rb) : void 0; 749 + if (!r) { 750 + if (l) { 751 + container.value = l; 752 + if (remote.ready() && rs === "loaded") { 753 + this.isLeader().then((isLeader) => { 754 + if (!isLeader) return; 755 + const bytes = this.save(l); 756 + saveRemote(bytes); 757 + }); 758 + } 759 + } 760 + } else if (!l) { 761 + container.value = r; 762 + this.isLeader().then((isLeader) => { 763 + if (!isLeader) return; 764 + const bytes = this.save(r); 765 + saveLocal(bytes); 766 + }); 767 + } else if (rs === "loaded" && this.hasDiverged({ local: l, remote: r })) { 768 + this.isLeader().then((isLeader) => { 769 + if (!isLeader) return; 770 + merging.value = { isBusy: true, lastCID: merging.value.lastCID }; 771 + this.merge(l, r).then(async (c) => { 772 + container.value = c; 773 + if (c.cid === merging.value.lastCID) return; 774 + const bytes = this.save(c); 775 + if (c.cid !== l.cid) { 776 + await saveLocal(bytes); 777 + } 778 + if (remote.ready() && rs === "loaded" && c.cid !== r.cid) { 779 + await saveRemote(bytes); 780 + } 781 + merging.value = { isBusy: false, lastCID: c.cid ?? "" }; 782 + }); 783 + }); 784 + } else { 785 + container.value = l; 786 + } 787 + }); 788 + return computed(() => { 789 + if (!isReady.get()) isReady.value = true; 790 + return container.get(); 791 + }); 792 + }, "state"); 793 + const facets = state( 794 + "facets", 795 + computed(() => local()?.facets.collection()), 796 + remote.facets.collection, 797 + remote.facets.state, 798 + { 799 + saveLocal: /* @__PURE__ */ __name(async (v) => local()?.facets.save(v), "saveLocal"), 800 + saveRemote: remote.facets.save 801 + } 802 + ); 803 + const playlistItems = state( 804 + "playlistItems", 805 + computed(() => local()?.playlistItems.collection()), 806 + remote.playlistItems.collection, 807 + remote.playlistItems.state, 808 + { 809 + saveLocal: /* @__PURE__ */ __name(async (v) => local()?.playlistItems.save(v), "saveLocal"), 810 + saveRemote: remote.playlistItems.save 811 + } 812 + ); 813 + const themes = state( 814 + "themes", 815 + computed(() => local()?.themes.collection()), 816 + remote.themes.collection, 817 + remote.themes.state, 818 + { 819 + saveLocal: /* @__PURE__ */ __name(async (v) => local()?.themes.save(v), "saveLocal"), 820 + saveRemote: remote.themes.save 821 + } 822 + ); 823 + const tracks = state( 824 + "tracks", 825 + computed(() => local()?.tracks.collection()), 826 + remote.tracks.collection, 827 + remote.tracks.state, 828 + { 829 + saveLocal: /* @__PURE__ */ __name(async (v) => local()?.tracks.save(v), "saveLocal"), 830 + saveRemote: remote.tracks.save 831 + } 832 + ); 833 + this.facets = this.managerProp( 834 + { save: /* @__PURE__ */ __name(async (v) => local()?.facets.save(v), "save") }, 835 + remote.facets, 836 + facets 837 + ); 838 + this.playlistItems = this.managerProp( 839 + { save: /* @__PURE__ */ __name(async (v) => local()?.playlistItems.save(v), "save") }, 840 + remote.playlistItems, 841 + playlistItems 842 + ); 843 + this.themes = this.managerProp( 844 + { save: /* @__PURE__ */ __name(async (v) => local()?.themes.save(v), "save") }, 845 + remote.themes, 846 + themes 847 + ); 848 + this.tracks = this.managerProp( 849 + { save: /* @__PURE__ */ __name(async (v) => local()?.tracks.save(v), "save") }, 850 + remote.tracks, 851 + tracks 852 + ); 853 + this.ready = () => true; 854 + } 855 + // SIGNALS 856 + #localOutput = signal( 857 + /** @type {OutputElement<any> | undefined} */ 858 + void 0 859 + ); 860 + // LIFECYCLE 861 + /** 862 + * @override 863 + */ 864 + async connectedCallback() { 865 + if (this.hasAttribute("group")) { 866 + this.broadcast(this.identifier, {}); 867 + } 868 + super.connectedCallback(); 869 + const local = this.root().querySelector("dop-indexed-db"); 870 + if (!local) throw new Error("Can't find local output"); 871 + customElements.whenDefined(local.localName).then(() => { 872 + this.#localOutput.value = local; 873 + }); 874 + } 875 + // DATA FUNCTIONS 876 + /** 877 + * @template {{ id: string; updatedAt: string }} T 878 + * @param {{ previous: Container<T>, collection: T[] }} _ 879 + * @returns {Promise<Container<T>>} 880 + */ 881 + async updateContainer({ previous, collection }) { 882 + const inventory = previous.inventory; 883 + const collIds = collection.map(({ id }) => id); 884 + const currSet = new Set(Object.keys(inventory.current)); 885 + const collSet = new Set(collIds); 886 + const newSet = collSet.difference(currSet); 887 + const remSet = currSet.difference(collSet); 888 + const alreadyRemoved = new Set(inventory.removed); 889 + const allRemoved = alreadyRemoved.union(remSet); 890 + const current = { ...inventory.current }; 891 + remSet.forEach((id) => { 892 + delete current[id]; 893 + }); 894 + const promises = []; 895 + collection.forEach((a) => { 896 + if (!newSet.has(a.id)) return; 897 + const encoded = encode(a); 898 + promises.push((async () => { 899 + const cid = await create(113, encoded); 900 + current[a.id] = cid; 901 + })()); 902 + }); 903 + await Promise.all(promises); 904 + const newInventory = { 905 + current, 906 + removed: Array.from(allRemoved) 907 + }; 908 + return { 909 + // TODO: Do we need this? Too big of a perf penalty? 910 + cid: await create(113, encode(newInventory)), 911 + data: collection, 912 + inventory: newInventory 913 + }; 914 + } 915 + /** 916 + * @template {{ id: string; updatedAt: string }} T 917 + * @param {{ local: Container<T>, remote: Container<T> }} _ 918 + */ 919 + hasDiverged({ local, remote }) { 920 + return local.cid !== remote.cid; 921 + } 922 + /** 923 + * @template {{ id: string; updatedAt: string }} T 924 + * @param {Container<T>} a 925 + * @param {Container<T>} b 926 + * @returns {Promise<Container<T>>} 927 + */ 928 + async merge(a, b) { 929 + const removedA = new Set(a.inventory.removed); 930 + const removedB = new Set(b.inventory.removed); 931 + const allRemoved = removedA.union(removedB); 932 + const currentA = a.inventory.current; 933 + const currentB = b.inventory.current; 934 + const mapA = new Map(a.data.map((item) => [item.id, item])); 935 + const mapB = new Map(b.data.map((item) => [item.id, item])); 936 + const allIds = /* @__PURE__ */ new Set([ 937 + ...Object.keys(currentA), 938 + ...Object.keys(currentB) 939 + ]); 940 + const current = {}; 941 + const data = []; 942 + const cidPromises = []; 943 + for (const id of allIds) { 944 + if (allRemoved.has(id)) continue; 945 + if (id in currentA && id in currentB) { 946 + const itemA = mapA.get(id); 947 + const itemB = mapB.get(id); 948 + if (!itemA || !itemB) { 949 + console.warn("Should have found both items but didn't!"); 950 + continue; 951 + } 952 + if (currentA[id] === currentB[id]) { 953 + data.push(itemA); 954 + current[id] = currentA[id]; 955 + continue; 956 + } 957 + const isANewerThanB = itemA.updatedAt && itemB.updatedAt ? compareTimestamps(itemA.updatedAt, itemB.updatedAt) > 0 : false; 958 + const newestItem = isANewerThanB ? itemA : itemB; 959 + const oldItem = isANewerThanB ? itemB : itemA; 960 + const mergedItem = { ...oldItem }; 961 + deep_diff_default.applyDiff(newestItem, mergedItem); 962 + data.push(mergedItem); 963 + cidPromises.push( 964 + create(113, encode(mergedItem)).then((cid) => { 965 + current[id] = cid; 966 + }) 967 + ); 968 + } else { 969 + const item = mapA.get(id) ?? mapB.get(id); 970 + if (item) { 971 + data.push(item); 972 + current[id] = currentA[id] ?? currentB[id]; 973 + } 974 + } 975 + } 976 + await Promise.all(cidPromises); 977 + const updatedInventory = { current, removed: Array.from(allRemoved) }; 978 + return { 979 + cid: await create(113, encode(updatedInventory)), 980 + data, 981 + inventory: updatedInventory 982 + }; 983 + } 984 + /** 985 + * @template {{ id: string; updatedAt: string }} T 986 + * @param {Container<T>} container 987 + * @returns {Uint8Array} 988 + */ 989 + save(container) { 990 + return encode(container); 991 + } 992 + // OUTPUT MANAGER FUNCTIONS 993 + /** 994 + * @template {{ id: string; updatedAt: string }} T 995 + * @param {{ save: (bytes: Uint8Array) => Promise<void> | void }} local 996 + * @param {{ collection: SignalReader<Uint8Array | undefined>, reload: () => Promise<void>, save: (bytes: Uint8Array) => Promise<void>, state: SignalReader<"loading" | "loaded" | "sleeping"> }} remote 997 + * @param {SignalReader<Container<T>>} container 998 + * @returns {{ collection: SignalReader<T[]>, loaded: () => Promise<void>; reload: () => Promise<void>, save: (items: T[]) => Promise<void>, state: SignalReader<"loading" | "loaded" | "sleeping"> }} 999 + */ 1000 + managerProp(local, remote, container) { 1001 + return { 1002 + collection: computed(() => { 1003 + return container().data; 1004 + }), 1005 + loaded: promiseLoadedState( 1006 + computed(() => container()), 1007 + computed(() => { 1008 + if (container().cid) return "loaded"; 1009 + return "loading"; 1010 + }) 1011 + ), 1012 + reload: remote.reload, 1013 + save: /* @__PURE__ */ __name(async (newItems) => { 1014 + const adjustedContainer = await this.updateContainer({ 1015 + collection: newItems, 1016 + previous: container() 1017 + }); 1018 + const bytes = this.save(adjustedContainer); 1019 + await local.save(bytes); 1020 + }, "save"), 1021 + state: computed(() => { 1022 + if (container().cid) return "loaded"; 1023 + return "loading"; 1024 + }) 1025 + }; 1026 + } 1027 + // RENDER 1028 + /** 1029 + * @param {RenderArg} _ 1030 + */ 1031 + render({ html }) { 1032 + return html` 1033 + <dop-indexed-db 1034 + group="${o(this.getAttribute(`group`))}" 1035 + namespace="${o(this.getAttribute(`namespace`))}" 1036 + ></dop-indexed-db> 1037 + `; 1038 + } 1039 + }; 1040 + var element_default = DaslBytesSyncOutputTransformer; 1041 + var CLASS = DaslBytesSyncOutputTransformer; 1042 + var NAME = "dtob-dasl-sync"; 1043 + customElements.define(NAME, CLASS); 1044 + export { 1045 + CLASS, 1046 + NAME, 1047 + element_default as default 1048 + }; 1049 + 1050 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/bytes/dasl-sync/element.js.map
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/bytes/dasl-sync/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/bytes/json/element.js
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/bytes/json/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/bytes/json/element.js.map
··· 1 + ../../../../../../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/components/transformer/output/bytes/json/element.js.map
+319
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/raw/atproto-sync/element.js
··· 1 + import "../../../../../chunk-4IGBJYF3.js"; 2 + import "../../../../../chunk-FAW4EB7G.js"; 3 + import { 4 + promiseLoadedState 5 + } from "../../../../../chunk-YCKIJVMK.js"; 6 + import "../../../../../chunk-JZMTETBD.js"; 7 + import "../../../../../chunk-H3WG7GN4.js"; 8 + import { 9 + o 10 + } from "../../../../../chunk-XGM6M423.js"; 11 + import { 12 + OutputTransformer 13 + } from "../../../../../chunk-B63ZUKFI.js"; 14 + import "../../../../../chunk-JBHW662S.js"; 15 + import "../../../../../chunk-V7EQPFPD.js"; 16 + import "../../../../../chunk-G56PUJUJ.js"; 17 + import "../../../../../chunk-6DKPDMFE.js"; 18 + import "../../../../../chunk-TP5GZFTO.js"; 19 + import "../../../../../chunk-ZQZJJU3T.js"; 20 + import { 21 + computed, 22 + signal 23 + } from "../../../../../chunk-HNJPKCUJ.js"; 24 + import { 25 + __name, 26 + init_Buffer, 27 + init_process 28 + } from "../../../../../chunk-FZQXS3RE.js"; 29 + 30 + // components/transformer/output/raw/atproto-sync/element.js 31 + init_Buffer(); 32 + init_process(); 33 + var COLLECTIONS = ( 34 + /** @type {const} */ 35 + [ 36 + "facets", 37 + "playlistItems", 38 + "themes", 39 + "tracks" 40 + ] 41 + ); 42 + var STORAGE_PREFIX = "diffuse/transformer/output/atproto-sync"; 43 + var ATProtoOutputSyncTransformer = class extends OutputTransformer { 44 + static { 45 + __name(this, "ATProtoOutputSyncTransformer"); 46 + } 47 + static NAME = "diffuse/transformer/output/raw/atproto-sync"; 48 + constructor() { 49 + super(); 50 + const remote = this.base(); 51 + const local = this.#localOutput.get; 52 + for (const name of COLLECTIONS) { 53 + this[name] = { 54 + collection: computed(() => { 55 + const l = local(); 56 + if (!l) return []; 57 + const data = l[name].collection(); 58 + return Array.isArray(data) ? data : []; 59 + }), 60 + loaded: promiseLoadedState( 61 + computed(() => { 62 + const l = local(); 63 + if (!l) return []; 64 + l[name].collection(); 65 + }), 66 + computed(() => { 67 + return local()?.[name]?.state() ?? "sleeping"; 68 + }) 69 + ), 70 + reload: /* @__PURE__ */ __name(async () => { 71 + await this.#sync(); 72 + }, "reload"), 73 + save: /* @__PURE__ */ __name(async (newData) => { 74 + const l = local(); 75 + if (!l) return; 76 + const oldData = l[name].collection(); 77 + if (Array.isArray(oldData)) { 78 + const newIds = new Set(newData.map((r) => r.id)); 79 + for (const record of oldData) { 80 + if (!newIds.has(record.id)) { 81 + this.#addTombstone(name, record.id); 82 + } 83 + } 84 + } 85 + this.#trackIds(name, newData); 86 + await l[name].save(newData); 87 + if (remote.ready()) { 88 + await remote[name].save(newData); 89 + const rev = this.#atproto()?.rev(); 90 + if (rev) this.#storeRev(rev); 91 + this.#clearDirty(); 92 + } else { 93 + this.#markDirty(); 94 + } 95 + }, "save"), 96 + state: computed(() => local()?.[name].state() ?? "sleeping") 97 + }; 98 + } 99 + this.ready = () => true; 100 + this.effect(() => { 101 + const l = local(); 102 + if (!l) return; 103 + this.effect(async () => { 104 + if (!remote.ready()) return; 105 + if (!await this.isLeader()) return; 106 + this.#sync(); 107 + }); 108 + }); 109 + } 110 + // SIGNALS 111 + #localOutput = signal( 112 + /** @type {OutputElement<any> | undefined} */ 113 + void 0 114 + ); 115 + #syncing = false; 116 + /** 117 + * @returns {ATProtoOutputElement | undefined} 118 + */ 119 + #atproto() { 120 + return ( 121 + /** @type {any} */ 122 + this.output.signal() 123 + ); 124 + } 125 + // SYNC 126 + async #sync() { 127 + if (this.#syncing) return; 128 + this.#syncing = true; 129 + try { 130 + const l = this.#localOutput.get(); 131 + const remote = this.base(); 132 + const atproto = this.#atproto(); 133 + if (!l || !atproto || !remote.ready()) return; 134 + const remoteRev = await atproto.getLatestCommit(); 135 + if (!remoteRev) return; 136 + const localRev = this.#getStoredRev(); 137 + const dirty = this.#isDirty(); 138 + if (localRev === remoteRev && !dirty) { 139 + return; 140 + } 141 + for (const name of COLLECTIONS) { 142 + await remote[name].reload(); 143 + } 144 + const localHasData = COLLECTIONS.some((name) => { 145 + const data = l[name].collection(); 146 + return Array.isArray(data) && data.length > 0; 147 + }); 148 + if (!localHasData && !dirty) { 149 + for (const name of COLLECTIONS) { 150 + const remoteData = remote[name].collection(); 151 + if (Array.isArray(remoteData) && remoteData.length > 0) { 152 + this.#trackIds(name, remoteData); 153 + await l[name].save(remoteData); 154 + } 155 + } 156 + } else { 157 + for (const name of COLLECTIONS) { 158 + const localData = l[name].collection(); 159 + const remoteData = remote[name].collection(); 160 + const localArr = Array.isArray(localData) ? localData : []; 161 + const remoteArr = Array.isArray(remoteData) ? remoteData : []; 162 + const merged = this.#mergeRecords(name, localArr, remoteArr); 163 + this.#trackIds(name, merged); 164 + await l[name].save(merged); 165 + await remote[name].save(merged); 166 + } 167 + } 168 + this.#storeRev(atproto.rev()); 169 + this.#clearDirty(); 170 + } catch (err) { 171 + console.warn("Sync failed:", err); 172 + this.#syncing = false; 173 + } 174 + } 175 + /** 176 + * Union merge two record arrays by `id`. 177 + * 178 + * - Records only in local → keep (unless tombstoned) 179 + * - Records only in remote → keep (unless tombstoned) 180 + * - Records in both → pick the one with the later `updatedAt`, 181 + * falling back to local wins 182 + * - Records whose id is in the tombstone set are excluded 183 + * 184 + * @template {Record<string, any> & { id: string }} T 185 + * @param {string} collection 186 + * @param {T[]} localArr 187 + * @param {T[]} remoteArr 188 + * @returns {T[]} 189 + */ 190 + #mergeRecords(collection, localArr, remoteArr) { 191 + const tombstones = this.#getTombstones(collection); 192 + const knownIds = this.#getKnownIds(collection); 193 + const merged = /* @__PURE__ */ new Map(); 194 + for (const record of localArr) { 195 + if (!tombstones.has(record.id)) { 196 + merged.set(record.id, record); 197 + } 198 + } 199 + for (const record of remoteArr) { 200 + if (tombstones.has(record.id)) continue; 201 + if (knownIds.has(record.id) && !merged.has(record.id)) continue; 202 + const existing = merged.get(record.id); 203 + if (!existing) { 204 + merged.set(record.id, record); 205 + } else { 206 + const lt = existing.updatedAt; 207 + const rt = record.updatedAt; 208 + if (lt && rt && rt > lt) { 209 + merged.set(record.id, record); 210 + } 211 + } 212 + } 213 + return [...merged.values()]; 214 + } 215 + // TOMBSTONES & KNOWN IDS 216 + /** 217 + * @param {string} collection 218 + * @returns {Set<string>} 219 + */ 220 + #getTombstones(collection) { 221 + const raw = localStorage.getItem( 222 + `${STORAGE_PREFIX}/tombstones/${collection}` 223 + ); 224 + return raw ? new Set(JSON.parse(raw)) : /* @__PURE__ */ new Set(); 225 + } 226 + /** 227 + * @param {string} collection 228 + * @param {string} id 229 + */ 230 + #addTombstone(collection, id) { 231 + const tombstones = this.#getTombstones(collection); 232 + tombstones.add(id); 233 + localStorage.setItem( 234 + `${STORAGE_PREFIX}/tombstones/${collection}`, 235 + JSON.stringify([...tombstones]) 236 + ); 237 + } 238 + /** 239 + * @param {string} collection 240 + * @returns {Set<string>} 241 + */ 242 + #getKnownIds(collection) { 243 + const raw = localStorage.getItem(`${STORAGE_PREFIX}/known/${collection}`); 244 + return raw ? new Set(JSON.parse(raw)) : /* @__PURE__ */ new Set(); 245 + } 246 + /** 247 + * Record all ids from a data array as known. 248 + * 249 + * @param {string} collection 250 + * @param {Array<{ id: string }>} data 251 + */ 252 + #trackIds(collection, data) { 253 + const known = this.#getKnownIds(collection); 254 + for (const record of data) { 255 + known.add(record.id); 256 + } 257 + localStorage.setItem( 258 + `${STORAGE_PREFIX}/known/${collection}`, 259 + JSON.stringify([...known]) 260 + ); 261 + } 262 + // REV & DIRTY FLAG 263 + /** @returns {string | null} */ 264 + #getStoredRev() { 265 + return localStorage.getItem(`${STORAGE_PREFIX}/rev`); 266 + } 267 + /** @param {string | null} rev */ 268 + #storeRev(rev) { 269 + if (rev) { 270 + localStorage.setItem(`${STORAGE_PREFIX}/rev`, rev); 271 + } 272 + } 273 + #markDirty() { 274 + localStorage.setItem(`${STORAGE_PREFIX}/dirty`, "1"); 275 + } 276 + #clearDirty() { 277 + localStorage.removeItem(`${STORAGE_PREFIX}/dirty`); 278 + } 279 + /** @returns {boolean} */ 280 + #isDirty() { 281 + return localStorage.getItem(`${STORAGE_PREFIX}/dirty`) === "1"; 282 + } 283 + // LIFECYCLE 284 + /** @override */ 285 + connectedCallback() { 286 + if (this.hasAttribute("group")) { 287 + this.broadcast(this.identifier, {}); 288 + } 289 + super.connectedCallback(); 290 + const local = this.root().querySelector("dop-indexed-db"); 291 + if (!local) throw new Error("Can't find local output"); 292 + customElements.whenDefined(local.localName).then(() => { 293 + this.#localOutput.value = local; 294 + }); 295 + } 296 + // RENDER 297 + /** 298 + * @param {RenderArg} _ 299 + */ 300 + render({ html }) { 301 + return html` 302 + <dop-indexed-db 303 + group="${o(this.getAttribute(`group`))}" 304 + namespace="${o(this.getAttribute(`namespace`))}" 305 + ></dop-indexed-db> 306 + `; 307 + } 308 + }; 309 + var element_default = ATProtoOutputSyncTransformer; 310 + var CLASS = ATProtoOutputSyncTransformer; 311 + var NAME = "dtor-atproto-sync"; 312 + customElements.define(NAME, CLASS); 313 + export { 314 + CLASS, 315 + NAME, 316 + element_default as default 317 + }; 318 + 319 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/raw/atproto-sync/element.js.map
··· 1 + ../../../../../../bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/raw/atproto-sync/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/refiner/default/element.js
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/refiner/default/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/refiner/default/element.js.map
··· 1 + ../../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/transformer/output/refiner/default/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/refiner/track-uri-passkey/element.js
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/refiner/track-uri-passkey/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/refiner/track-uri-passkey/element.js.map
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/refiner/track-uri-passkey/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/refiner/track-uri-passkey/passkey.js
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/refiner/track-uri-passkey/passkey.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/refiner/track-uri-passkey/passkey.js.map
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/refiner/track-uri-passkey/passkey.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/string/json/element.js
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/string/json/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/components/transformer/output/string/json/element.js.map
··· 1 + ../../../../../../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/components/transformer/output/string/json/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/definitions/index.ts
··· 1 + ../../bafybeicp5hi5rw4vffqlbmyqqaxhmxzx4ilejru3cq4esycpeyuuhen5ha/definitions/index.ts
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/definitions/output/collaboration.json
··· 1 + ../../../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/definitions/output/collaboration.json
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/definitions/output/facet.json
··· 1 + ../../../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/definitions/output/facet.json
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/definitions/output/playlistItem.json
··· 1 + ../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/definitions/output/playlistItem.json
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/definitions/output/playlistItemBundle.json
··· 1 + ../../../bafybeibq4aqaavbn3syjebgs5wopycz56xxk2lchx5cpxxrr244i2n2ray/definitions/output/playlistItemBundle.json
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/definitions/output/theme.json
··· 1 + ../../../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/definitions/output/theme.json
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/definitions/output/track.json
··· 1 + ../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/definitions/output/track.json
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/definitions/output/trackBundle.json
··· 1 + ../../../bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/definitions/output/trackBundle.json
+49
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/facets/examples/generate-playlist.html
··· 1 + <main> 2 + <p>Generate a playlist based on playback history:</p> 3 + <button>Create</button> 4 + <ol></ol> 5 + </main> 6 + 7 + <style> 8 + @import "./styles/base.css"; 9 + @import "./styles/diffuse/page.css"; 10 + </style> 11 + 12 + <script type="module"> 13 + import foundation from "@diffuse/foundation"; 14 + 15 + const queue = foundation.engine.queue(); 16 + const output = foundation.orchestrator.output(); 17 + 18 + /** 19 + * Playlist generator 20 + */ 21 + function generatePlaylist() { 22 + const queueItems = [ 23 + ...queue.past(), 24 + ...(queue.now() ? [queue.now()] : []), 25 + ...queue.future().filter((i) => i.manualEntry), 26 + ]; 27 + 28 + const playlist = queueItems 29 + .map((item) => output.tracks.collection().find((t) => t.id === item?.id)) 30 + .filter((t) => t); 31 + 32 + const element = document.querySelector("main ol"); 33 + if (!element) return; 34 + 35 + element.innerHTML = playlist 36 + .map((track) => 37 + `<li> 38 + ${track?.tags?.artist ?? "Unknown artist"} - 39 + ${track?.tags?.title ?? "Unknown title"} 40 + </li>` 41 + ) 42 + .join(""); 43 + } 44 + 45 + /** @type {HTMLButtonElement} */ (document.body.querySelector("button")) 46 + .onclick = () => { 47 + generatePlaylist(); 48 + }; 49 + </script>
+51
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/facets/examples/now-playing.html
··· 1 + <main> 2 + <p id="now-playing">Loading tracks ...</p> 3 + <button>⏭</button> 4 + </main> 5 + 6 + <style> 7 + @import "./styles/base.css"; 8 + @import "./styles/diffuse/page.css"; 9 + </style> 10 + 11 + <script type="module"> 12 + import foundation from "@diffuse/foundation"; 13 + import { computed, effect } from "@diffuse/common/signal.js"; 14 + 15 + foundation.features.processInputs(); 16 + foundation.features.fillQueueAutomatically(); 17 + 18 + const output = foundation.orchestrator.output(); 19 + const queue = foundation.engine.queue(); 20 + 21 + const isLoadingTracks = computed(() => { 22 + return output.tracks.state() !== "loaded"; 23 + }); 24 + 25 + effect(() => { 26 + const now = queue.now(); 27 + const currentlyPlaying = now 28 + ? output.tracks.collection().find((t) => t.id === now.id) 29 + : undefined; 30 + const tags = currentlyPlaying?.tags; 31 + 32 + const element = 33 + /** @type {HTMLElement | null} */ (document.querySelector("#now-playing")); 34 + if (!element) return; 35 + 36 + if (currentlyPlaying) { 37 + element.innerText = `${tags?.artist ?? "Unknown artist"} - ${ 38 + tags?.title ?? "Unknown title" 39 + }`; 40 + } else if (isLoadingTracks()) { 41 + // Keep original text 42 + } else { 43 + element.innerText = "Nothing is playing yet"; 44 + } 45 + }); 46 + 47 + /** @type {HTMLButtonElement} */ (document.body.querySelector("button")) 48 + .onclick = () => { 49 + queue.shift(); 50 + }; 51 + </script>
+607
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/facets/index.html
··· 1 + <html lang="en"> 2 + <head> 3 + <meta charset="UTF-8" /> 4 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 5 + 6 + <title>Diffuse</title> 7 + 8 + <!-- Base --> 9 + <base href="../" /> 10 + 11 + <!-- Favicons & Mobile --> 12 + <link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png" /> 13 + <link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png" /> 14 + <link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png" /> 15 + <!-- TODO: <link rel="manifest" href="site.webmanifest" />--> 16 + <link rel="mask-icon" href="safari-pinned-tab.svg" color="#8a90a9" /> 17 + <meta name="msapplication-TileColor" content="#8a90a9" /> 18 + <meta name="theme-color" content="#8a90a9" /> 19 + 20 + <!-- Styles --> 21 + <link rel="stylesheet" href="styles/base.css" /> 22 + <link rel="stylesheet" href="styles/diffuse/page.css" /> 23 + <link rel="stylesheet" href="styles/vendor/phosphor/bold/style.css" /> 24 + <link rel="stylesheet" href="styles/vendor/phosphor/fill/style.css" /> 25 + 26 + <!-- Scripts --> 27 + <script src="facets/index.js" type="module"></script> 28 + </head> 29 + <body> 30 + <header> 31 + <div> 32 + <div> 33 + <a class="diffuse-logo" href="./" style="display: inline-block;"> 34 + <svg viewBox="0 0 902 134" width="160"> 35 + <title>Diffuse</title> 36 + <use 37 + xlink:href="images/diffuse-current.svg#diffuse" 38 + href="images/diffuse-current.svg#diffuse"></use> 39 + </svg> 40 + 41 + </a> 42 + </div> 43 + <p class="construct dither-mask" style="margin-top: 0; max-width: none;"> 44 + Facets 45 + </p> 46 + <p> 47 + Facets are various interface components each loaded in their own web page. Every used component is configured so that it operates in broadcast mode, making all the pages communicate with each other. 48 + </p> 49 + 50 + <ul class="table-of-contents"> 51 + <li><a href="facets/#collection">Your collection</a></li> 52 + <li><a href="facets/#featured">Featured</a></li> 53 + <li><a href="facets/#usage">Usage</a></li> 54 + <li><a href="facets/#built-in">Built-in</a></li> 55 + <li><a href="facets/#community">Community</a></li> 56 + <li><a href="facets/#build">Build</a></li> 57 + <li><a href="facets/#foundation">Foundation</a></li> 58 + <li><a href="facets/#examples">Examples</a></li> 59 + <li><a href="facets/#notes">Notes</a></li> 60 + </ul> 61 + </div> 62 + <div class="dither-mask filler"></div> 63 + </header> 64 + <main> 65 + <!-- YOUR COLLECTION --> 66 + <section> 67 + <h2 id="collection">Your collection</h2> 68 + <div id="list"> 69 + <div class="with-icon" style="font-size: var(--fs-sm);"> 70 + <i class="ph-bold ph-spinner-gap"></i> 71 + Loading items 72 + </div> 73 + </div> 74 + </section> 75 + 76 + <!-- FEATURED + USAGE --> 77 + <div class="columns"> 78 + <section class="flex"> 79 + <h2 id="featured">Featured</h2> 80 + 81 + <ol style="list-style: none; padding-left: 0;"> 82 + <li> 83 + <p> 84 + <i class="ph-fill ph-plus"></i> 85 + <strong><a href="facets/l/?path=themes%2Fwebamp%2Fconfigurators%2Finput%2Ffacet.html">Add</a></strong> audio from various places on the web and your device. 86 + </p> 87 + </li> 88 + <li> 89 + <p> 90 + <i class="ph-fill ph-queue"></i> 91 + <strong><a href="facets/l/?path=themes%2Fwebamp%2Fbrowser%2Ffacet.html">Browse</a></strong> your collection to put something into the queue. 92 + </p> 93 + </li> 94 + <li> 95 + <p> 96 + <i class="ph-fill ph-queue"></i> 97 + <strong><a href="facets/l/?path=facets%2Ftools%2Fauto-queue.html">Automate</a></strong> adding items to the queue, for infinite playback or listening to a playlist. 98 + </p> 99 + </li> 100 + <li> 101 + <p> 102 + <i class="ph-fill ph-music-note"></i> 103 + <strong><a href="facets/l/?path=themes%2Fblur%2Fartwork-controller%2Ffacet.html">Play</a></strong> queued songs. 104 + </p> 105 + </li> 106 + <li> 107 + <p> 108 + <i class="ph-fill ph-person"></i> 109 + <strong><a href="facets/l/?path=themes%2Fwebamp%2Fconfigurators%2Foutput%2Ffacet.html">Manage</a></strong> your user data, sync with your other devices or other people. 110 + </p> 111 + </li> 112 + </ol> 113 + </section> 114 + 115 + <section class="flex"> 116 + <h2 id="usage">Usage</h2> 117 + <p> 118 + To use these facets, simply open whichever ones provide the functionality that you're looking for at a given moment. You can browse existing ones here and create one below. 119 + </p> 120 + <p> 121 + For example, say you want to play music; two options would be: (1) <a href="facets/l/?path=themes%2Fwebamp%2Fbrowser%2Ffacet.html">browse</a> for a specific song and add it to the queue, or (2) <a href="facets/l/?path=facets%2Ftools%2Fauto-queue.html">automatically</a> add a bunch of shuffled songs to the queue. Next, you need a way to play the items you added to the queue. That's where a <a href="facets/l/?path=themes%2Fblur%2Fartwork-controller%2Ffacet.html">controller</a> could be used. 122 + </p> 123 + <p> 124 + <em>You might ask, why can't I do all of this in just one window? That's what <a href="themes/">themes</a> are for, if you need something more streamlined. If you however want a customised experience, or prefer certain interfaces for certain things, that's what facets are for.</em> 125 + </p> 126 + <p> 127 + <small><i class="ph-fill ph-info"></i> Every facet has access to your audio collection and your user data, along with any other shared state.</small> 128 + </p> 129 + </section> 130 + </div> 131 + 132 + <!-- BUILT-IN + COMMUNITY --> 133 + <div class="columns"> 134 + <section class="flex"> 135 + <h2 id="built-in">Built-in</h2> 136 + 137 + <ul> 138 + <li data-uri="diffuse://themes/blur/artwork-controller/facet.html" data-name="Blur / Artwork controller"> 139 + <div style="position: relative;"> 140 + <a href="facets/l/?path=themes%2Fblur%2Fartwork-controller%2Ffacet.html"> 141 + Blur / Artwork controller 142 + </a> 143 + <button 144 + class="button--fixed button--transparent" 145 + popovertarget="facet-menu-builtin-0" 146 + style="anchor-name: --facet-anchor-builtin-0; position: absolute; right: 0; top: 50%; transform: translateY(-50%);" 147 + > 148 + <i class="ph-fill ph-dots-three-circle"></i> 149 + </button> 150 + </div> 151 + <div class="list-description"> 152 + Audio playback controller with an artwork display. 153 + </div> 154 + 155 + <!-- Dropdown Menu --> 156 + <div 157 + id="facet-menu-builtin-0" 158 + class="dropdown" 159 + style="position-anchor: --facet-anchor-builtin-0" 160 + popover 161 + > 162 + <a href="facets/l/?path=themes%2Fblur%2Fartwork-controller%2Ffacet.html"> 163 + <span class="with-icon"> 164 + <i class="ph-fill ph-globe"></i> Open 165 + </span> 166 + </a> 167 + <a rel="save"> 168 + <span class="with-icon"> 169 + <i class="ph-fill ph-download"></i> Save 170 + </span> 171 + </a> 172 + <a rel="fork"> 173 + <span class="with-icon"> 174 + <i class="ph-fill ph-cursor-text"></i> Edit 175 + </span> 176 + </a> 177 + </div> 178 + </li> 179 + <li data-uri="diffuse://facets/tools/auto-queue.html" data-name="Tools / Automatic Queue"> 180 + <div style="position: relative;"> 181 + <a href="facets/l/?path=facets%2Ftools%2Fauto-queue.html"> 182 + Tools / Automatic Queue 183 + </a> 184 + <button 185 + class="button--fixed button--transparent" 186 + popovertarget="facet-menu-builtin-1" 187 + style="anchor-name: --facet-anchor-builtin-1; position: absolute; right: 0; top: 50%; transform: translateY(-50%);" 188 + > 189 + <i class="ph-fill ph-dots-three-circle"></i> 190 + </button> 191 + </div> 192 + <div class="list-description"> 193 + Everything you need to automatically put tracks into the queue. 194 + </div> 195 + 196 + <!-- Dropdown Menu --> 197 + <div 198 + id="facet-menu-builtin-1" 199 + class="dropdown" 200 + style="position-anchor: --facet-anchor-builtin-1" 201 + popover 202 + > 203 + <a href="facets/l/?path=facets%2Ftools%2Fauto-queue.html"> 204 + <span class="with-icon"> 205 + <i class="ph-fill ph-globe"></i> Open 206 + </span> 207 + </a> 208 + <a rel="save"> 209 + <span class="with-icon"> 210 + <i class="ph-fill ph-download"></i> Save 211 + </span> 212 + </a> 213 + <a rel="fork"> 214 + <span class="with-icon"> 215 + <i class="ph-fill ph-cursor-text"></i> Edit 216 + </span> 217 + </a> 218 + </div> 219 + </li> 220 + <li data-uri="diffuse://facets/tools/v3-import.html" data-name="Tools / V3.x Import"> 221 + <div style="position: relative;"> 222 + <a href="facets/l/?path=facets%2Ftools%2Fv3-import.html"> 223 + Tools / V3.x Import 224 + </a> 225 + <button 226 + class="button--fixed button--transparent" 227 + popovertarget="facet-menu-builtin-2" 228 + style="anchor-name: --facet-anchor-builtin-2; position: absolute; right: 0; top: 50%; transform: translateY(-50%);" 229 + > 230 + <i class="ph-fill ph-dots-three-circle"></i> 231 + </button> 232 + </div> 233 + <div class="list-description"> 234 + Import data from Diffuse v3. 235 + </div> 236 + 237 + <!-- Dropdown Menu --> 238 + <div 239 + id="facet-menu-builtin-2" 240 + class="dropdown" 241 + style="position-anchor: --facet-anchor-builtin-2" 242 + popover 243 + > 244 + <a href="facets/l/?path=facets%2Ftools%2Fv3-import.html"> 245 + <span class="with-icon"> 246 + <i class="ph-fill ph-globe"></i> Open 247 + </span> 248 + </a> 249 + <a rel="save"> 250 + <span class="with-icon"> 251 + <i class="ph-fill ph-download"></i> Save 252 + </span> 253 + </a> 254 + <a rel="fork"> 255 + <span class="with-icon"> 256 + <i class="ph-fill ph-cursor-text"></i> Edit 257 + </span> 258 + </a> 259 + </div> 260 + </li> 261 + <li data-uri="diffuse://themes/webamp/browser/facet.html" data-name="Webamp / Browser"> 262 + <div style="position: relative;"> 263 + <a href="facets/l/?path=themes%2Fwebamp%2Fbrowser%2Ffacet.html"> 264 + Webamp / Browser 265 + </a> 266 + <button 267 + class="button--fixed button--transparent" 268 + popovertarget="facet-menu-builtin-3" 269 + style="anchor-name: --facet-anchor-builtin-3; position: absolute; right: 0; top: 50%; transform: translateY(-50%);" 270 + > 271 + <i class="ph-fill ph-dots-three-circle"></i> 272 + </button> 273 + </div> 274 + <div class="list-description"> 275 + Collection browser + search in a retro, win98, look. 276 + </div> 277 + 278 + <!-- Dropdown Menu --> 279 + <div 280 + id="facet-menu-builtin-3" 281 + class="dropdown" 282 + style="position-anchor: --facet-anchor-builtin-3" 283 + popover 284 + > 285 + <a href="facets/l/?path=themes%2Fwebamp%2Fbrowser%2Ffacet.html"> 286 + <span class="with-icon"> 287 + <i class="ph-fill ph-globe"></i> Open 288 + </span> 289 + </a> 290 + <a rel="save"> 291 + <span class="with-icon"> 292 + <i class="ph-fill ph-download"></i> Save 293 + </span> 294 + </a> 295 + <a rel="fork"> 296 + <span class="with-icon"> 297 + <i class="ph-fill ph-cursor-text"></i> Edit 298 + </span> 299 + </a> 300 + </div> 301 + </li> 302 + <li data-uri="diffuse://themes/webamp/configurators/input/facet.html" data-name="Webamp / Input Configurator"> 303 + <div style="position: relative;"> 304 + <a href="facets/l/?path=themes%2Fwebamp%2Fconfigurators%2Finput%2Ffacet.html"> 305 + Webamp / Input Configurator 306 + </a> 307 + <button 308 + class="button--fixed button--transparent" 309 + popovertarget="facet-menu-builtin-4" 310 + style="anchor-name: --facet-anchor-builtin-4; position: absolute; right: 0; top: 50%; transform: translateY(-50%);" 311 + > 312 + <i class="ph-fill ph-dots-three-circle"></i> 313 + </button> 314 + </div> 315 + <div class="list-description"> 316 + Windows 98 styled input configurator where you can add music sources. 317 + </div> 318 + 319 + <!-- Dropdown Menu --> 320 + <div 321 + id="facet-menu-builtin-4" 322 + class="dropdown" 323 + style="position-anchor: --facet-anchor-builtin-4" 324 + popover 325 + > 326 + <a href="facets/l/?path=themes%2Fwebamp%2Fconfigurators%2Finput%2Ffacet.html"> 327 + <span class="with-icon"> 328 + <i class="ph-fill ph-globe"></i> Open 329 + </span> 330 + </a> 331 + <a rel="save"> 332 + <span class="with-icon"> 333 + <i class="ph-fill ph-download"></i> Save 334 + </span> 335 + </a> 336 + <a rel="fork"> 337 + <span class="with-icon"> 338 + <i class="ph-fill ph-cursor-text"></i> Edit 339 + </span> 340 + </a> 341 + </div> 342 + </li> 343 + <li data-uri="diffuse://themes/webamp/configurators/output/facet.html" data-name="Webamp / Output Configurator"> 344 + <div style="position: relative;"> 345 + <a href="facets/l/?path=themes%2Fwebamp%2Fconfigurators%2Foutput%2Ffacet.html"> 346 + Webamp / Output Configurator 347 + </a> 348 + <button 349 + class="button--fixed button--transparent" 350 + popovertarget="facet-menu-builtin-5" 351 + style="anchor-name: --facet-anchor-builtin-5; position: absolute; right: 0; top: 50%; transform: translateY(-50%);" 352 + > 353 + <i class="ph-fill ph-dots-three-circle"></i> 354 + </button> 355 + </div> 356 + <div class="list-description"> 357 + Windows 98 styled output configurator where you can manage your data storage. 358 + </div> 359 + 360 + <!-- Dropdown Menu --> 361 + <div 362 + id="facet-menu-builtin-5" 363 + class="dropdown" 364 + style="position-anchor: --facet-anchor-builtin-5" 365 + popover 366 + > 367 + <a href="facets/l/?path=themes%2Fwebamp%2Fconfigurators%2Foutput%2Ffacet.html"> 368 + <span class="with-icon"> 369 + <i class="ph-fill ph-globe"></i> Open 370 + </span> 371 + </a> 372 + <a rel="save"> 373 + <span class="with-icon"> 374 + <i class="ph-fill ph-download"></i> Save 375 + </span> 376 + </a> 377 + <a rel="fork"> 378 + <span class="with-icon"> 379 + <i class="ph-fill ph-cursor-text"></i> Edit 380 + </span> 381 + </a> 382 + </div> 383 + </li> 384 + </ul> 385 + 386 + </section> 387 + 388 + <section class="flex"> 389 + <h2 id="community">Community</h2> 390 + <p> 391 + Check out some facets from the community and load them here. 392 + </p> 393 + <p> 394 + <small><i class="ph-fill ph-info"></i> Nothing here yet, too early.</small> 395 + </p> 396 + </section> 397 + </div> 398 + 399 + <!-- / --> 400 + <div class="dither-mask filler" style="height: var(--space-2xl); margin-top: var(--space-2xl);"></div> 401 + 402 + <!-- BUILD --> 403 + <section> 404 + <h2 id="build">Build</h2> 405 + 406 + <form id="build-form" class="columns"> 407 + <div class="flex"> 408 + <p style="margin-top: 0"> 409 + If you know a bit of HTML & Javascript, you can write your own or plug in some code you found elsewhere: 410 + </p> 411 + 412 + <div id="html-input-container" class="code-editor monospace-font"> 413 + </div> 414 + </div> 415 + 416 + <div class="flex"> 417 + <p style="margin-top: 0"> 418 + Your code here builds on the <a href="facets/#foundation">foundation</a> listed below, it'll be injected into a <code>&lt;div id="container"&gt;</code> element in the body. 419 + </p> 420 + <p> 421 + <input id="name-input" type="text" placeholder="Name" name="name" required /> 422 + </p> 423 + <p> 424 + <textarea id="description-input" placeholder="Description" name="description" rows="2"></textarea> 425 + </p> 426 + <p> 427 + <span class="button-row"> 428 + <button name="save">Save</button> 429 + <button name="save+open">Save &amp; Open</button> 430 + </span> 431 + </p> 432 + </div> 433 + </form> 434 + </section> 435 + 436 + <!-- FOUNDATION --> 437 + <div class="columns"> 438 + <section class="flex"> 439 + <h2 id="foundation">Foundation</h2> 440 + 441 + <p> 442 + Diffuse comes with a foundation that preconfigures all elements so you don't have to set them up yourself, along with a combination of elements for certain features. It internally tracks the DOM addition of the custom elements, so no need to worry about setting up an element multiple times. 443 + </p> 444 + <p> 445 + <small><i class="ph-fill ph-info"></i> Refer to the <a href="#elements">elements index</a> to find out what each element does.</small> 446 + </p> 447 + <div class="code-block"> 448 + <code>import foundation from "common/facets/foundation.js" 449 + 450 + foundation.engine.audio() 451 + foundation.engine.queue() 452 + foundation.engine.repeatShuffle() 453 + foundation.engine.scope() 454 + 455 + foundation.orchestrator.autoQueue() 456 + foundation.orchestrator.favourites() 457 + foundation.orchestrator.input() 458 + foundation.orchestrator.output() 459 + foundation.orchestrator.queueAudio() 460 + foundation.orchestrator.processTracks() 461 + foundation.orchestrator.scopedTracks() 462 + foundation.orchestrator.sources() 463 + 464 + foundation.processor.artwork() 465 + foundation.processor.metadata() 466 + foundation.processor.search()</code> 467 + </div> 468 + 469 + <p> 470 + <small>Features:</small> 471 + </p> 472 + <ul style="margin-bottom: 0;"> 473 + <li> 474 + <span>Fill the queue automatically <small>(infinite play)</small></span> 475 + <div class="list-description"> 476 + <code>foundation.features.fillQueueAutomatically()</code> 477 + </div> 478 + </li> 479 + <li> 480 + <span>Play audio from the queue</span> 481 + <div class="list-description"> 482 + <code>foundation.features.playAudioFromQueue()</code> 483 + </div> 484 + </li> 485 + <li> 486 + <span>Process inputs <small>(into tracks, etc)</small></span> 487 + <div class="list-description"> 488 + <code>foundation.features.processInputs()</code> 489 + </div> 490 + </li> 491 + <li> 492 + <span>Search through your collection</span> 493 + <div class="list-description" style="margin-bottom: 0;"> 494 + <code>foundation.features.searchThroughCollection()</code> 495 + </div> 496 + </li> 497 + </ul> 498 + </section> 499 + 500 + <section class="flex"> 501 + <h2 id="examples">Examples</h2> 502 + 503 + <p> 504 + Some simple examples to help you understand how to build your own facet. Fork them to load them into the code editor below (or save → edit). 505 + </p> 506 + 507 + <ul> 508 + <li data-uri="diffuse://facets/examples/now-playing.html" data-name="Now playing"> 509 + <div style="position: relative;"> 510 + <a href="facets/l/?path=facets%2Fexamples%2Fnow-playing.html"> 511 + Now playing 512 + </a> 513 + <button 514 + class="button--fixed button--transparent" 515 + popovertarget="facet-menu-examples-0" 516 + style="anchor-name: --facet-anchor-examples-0; position: absolute; right: 0; top: 50%; transform: translateY(-50%);" 517 + > 518 + <i class="ph-fill ph-dots-three-circle"></i> 519 + </button> 520 + </div> 521 + <div class="list-description"> 522 + Shows what's currently set to &quot;now playing&quot; in the queue, along with a button to shift the queue to the next track. 523 + </div> 524 + 525 + <!-- Dropdown Menu --> 526 + <div 527 + id="facet-menu-examples-0" 528 + class="dropdown" 529 + style="position-anchor: --facet-anchor-examples-0" 530 + popover 531 + > 532 + <a href="facets/l/?path=facets%2Fexamples%2Fnow-playing.html"> 533 + <span class="with-icon"> 534 + <i class="ph-fill ph-globe"></i> Open 535 + </span> 536 + </a> 537 + <a rel="save"> 538 + <span class="with-icon"> 539 + <i class="ph-fill ph-download"></i> Save 540 + </span> 541 + </a> 542 + <a rel="fork"> 543 + <span class="with-icon"> 544 + <i class="ph-fill ph-cursor-text"></i> Edit 545 + </span> 546 + </a> 547 + </div> 548 + </li> 549 + <li data-uri="diffuse://facets/examples/generate-playlist.html" data-name="Generate playlist"> 550 + <div style="position: relative;"> 551 + <a href="facets/l/?path=facets%2Fexamples%2Fgenerate-playlist.html"> 552 + Generate playlist 553 + </a> 554 + <button 555 + class="button--fixed button--transparent" 556 + popovertarget="facet-menu-examples-1" 557 + style="anchor-name: --facet-anchor-examples-1; position: absolute; right: 0; top: 50%; transform: translateY(-50%);" 558 + > 559 + <i class="ph-fill ph-dots-three-circle"></i> 560 + </button> 561 + </div> 562 + <div class="list-description"> 563 + Make a list of what previously played in the queue. 564 + </div> 565 + 566 + <!-- Dropdown Menu --> 567 + <div 568 + id="facet-menu-examples-1" 569 + class="dropdown" 570 + style="position-anchor: --facet-anchor-examples-1" 571 + popover 572 + > 573 + <a href="facets/l/?path=facets%2Fexamples%2Fgenerate-playlist.html"> 574 + <span class="with-icon"> 575 + <i class="ph-fill ph-globe"></i> Open 576 + </span> 577 + </a> 578 + <a rel="save"> 579 + <span class="with-icon"> 580 + <i class="ph-fill ph-download"></i> Save 581 + </span> 582 + </a> 583 + <a rel="fork"> 584 + <span class="with-icon"> 585 + <i class="ph-fill ph-cursor-text"></i> Edit 586 + </span> 587 + </a> 588 + </div> 589 + </li> 590 + </ul> 591 + 592 + 593 + <h2 id="notes">Notes</h2> 594 + <p> 595 + While you have the ability to do whatever you want in a custom facet, the existing facets are designed to work a certain way; so here's some things to keep in mind: 596 + </p> 597 + <ul> 598 + <li><span>In most cases you'll want to call <code>foundation.features.processInputs()</code> so that your audio files and streams actually show up.</span></li> 599 + <li><span>Most elements are configured in broadcast mode so they communicate across tabs. There are a few exceptions such as inputs, where we prefer parallelisation.</span></li> 600 + <li><span>You can use facets in combination with themes by adding the elements used in the theme to a group and then passing in the group name as a URL query parameter (eg. <code>group=facets</code>)</span></li> 601 + </ul> 602 + </section> 603 + </div> 604 + </main> 605 + 606 + </body> 607 + </html>
+1639
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/facets/index.js
··· 1 + import { 2 + EditorView, 3 + autocompletion, 4 + basicSetup, 5 + css, 6 + html, 7 + javascript 8 + } from "../chunk-ZW7YO2UU.js"; 9 + import { 10 + facetFromURI 11 + } from "../chunk-7XAKBJEU.js"; 12 + import { 13 + foundation_default 14 + } from "../chunk-ZUHY7USF.js"; 15 + import "../chunk-UMMPFCLQ.js"; 16 + import "../chunk-G4P4YFWD.js"; 17 + import "../chunk-6JNRNMZQ.js"; 18 + import "../chunk-YV3SRJQF.js"; 19 + import "../chunk-ESYALJPH.js"; 20 + import "../chunk-OSKZBJ24.js"; 21 + import "../chunk-XGM6M423.js"; 22 + import "../chunk-6KMZB5IA.js"; 23 + import "../chunk-B63ZUKFI.js"; 24 + import "../chunk-TXU4RB3O.js"; 25 + import "../chunk-3ENCKNXO.js"; 26 + import "../chunk-PKN6FN7E.js"; 27 + import "../chunk-NP7LZHKR.js"; 28 + import "../chunk-M2MAFKPM.js"; 29 + import "../chunk-MVUUUQRL.js"; 30 + import "../chunk-GKE6NGNQ.js"; 31 + import "../chunk-VWO2GNWZ.js"; 32 + import "../chunk-QSPAYUAI.js"; 33 + import "../chunk-I3VKG3ZJ.js"; 34 + import "../chunk-OIRYE7B4.js"; 35 + import "../chunk-3AO35WC3.js"; 36 + import "../chunk-JBHW662S.js"; 37 + import "../chunk-GX3WPNEX.js"; 38 + import "../chunk-FJBTJV3K.js"; 39 + import "../chunk-PTVB4Y37.js"; 40 + import "../chunk-HN4F5JEZ.js"; 41 + import { 42 + i as i2 43 + } from "../chunk-NBQPHQFP.js"; 44 + import { 45 + e, 46 + i, 47 + t 48 + } from "../chunk-QERJLR3Q.js"; 49 + import "../chunk-OBWEBS4T.js"; 50 + import "../chunk-S6SMX4HA.js"; 51 + import "../chunk-XRGLBUX4.js"; 52 + import "../chunk-R3EQQDW5.js"; 53 + import "../chunk-GQIBEDKG.js"; 54 + import "../chunk-DDF5P57I.js"; 55 + import "../chunk-EEUCFWD4.js"; 56 + import "../chunk-6DRHTH2U.js"; 57 + import "../chunk-TSYF7OPM.js"; 58 + import "../chunk-GCLDJKYV.js"; 59 + import "../chunk-KJFA7KRK.js"; 60 + import "../chunk-HMBZONBJ.js"; 61 + import "../chunk-6CB2LXND.js"; 62 + import { 63 + A, 64 + B, 65 + E, 66 + T 67 + } from "../chunk-V7EQPFPD.js"; 68 + import "../chunk-G56PUJUJ.js"; 69 + import "../chunk-6DKPDMFE.js"; 70 + import "../chunk-TP5GZFTO.js"; 71 + import "../chunk-ZQZJJU3T.js"; 72 + import { 73 + loadURI 74 + } from "../chunk-X6J7NMRW.js"; 75 + import "../chunk-WN6GL63Q.js"; 76 + import "../chunk-CRZ7HJJ4.js"; 77 + import "../chunk-242LG3VP.js"; 78 + import { 79 + now 80 + } from "../chunk-BKRD2ZIW.js"; 81 + import { 82 + effect, 83 + signal 84 + } from "../chunk-HNJPKCUJ.js"; 85 + import { 86 + create 87 + } from "../chunk-4YB6QUPN.js"; 88 + import "../chunk-SGR5ST3A.js"; 89 + import { 90 + __name, 91 + init_Buffer, 92 + init_process 93 + } from "../chunk-FZQXS3RE.js"; 94 + 95 + // facets/index.js 96 + init_Buffer(); 97 + init_process(); 98 + 99 + // ../node_modules/.deno/marked@17.0.3/node_modules/marked/lib/marked.esm.js 100 + init_Buffer(); 101 + init_process(); 102 + function M() { 103 + return { async: false, breaks: false, extensions: null, gfm: true, hooks: null, pedantic: false, renderer: null, silent: false, tokenizer: null, walkTokens: null }; 104 + } 105 + __name(M, "M"); 106 + var T2 = M(); 107 + function H(u3) { 108 + T2 = u3; 109 + } 110 + __name(H, "H"); 111 + var _ = { exec: /* @__PURE__ */ __name(() => null, "exec") }; 112 + function k(u3, e3 = "") { 113 + let t2 = typeof u3 == "string" ? u3 : u3.source, n = { replace: /* @__PURE__ */ __name((r, i3) => { 114 + let s = typeof i3 == "string" ? i3 : i3.source; 115 + return s = s.replace(m.caret, "$1"), t2 = t2.replace(r, s), n; 116 + }, "replace"), getRegex: /* @__PURE__ */ __name(() => new RegExp(t2, e3), "getRegex") }; 117 + return n; 118 + } 119 + __name(k, "k"); 120 + var Re = (() => { 121 + try { 122 + return !!new RegExp("(?<=1)(?<!1)"); 123 + } catch { 124 + return false; 125 + } 126 + })(); 127 + var m = { codeRemoveIndent: /^(?: {1,4}| {0,3}\t)/gm, outputLinkReplace: /\\([\[\]])/g, indentCodeCompensation: /^(\s+)(?:```)/, beginningSpace: /^\s+/, endingHash: /#$/, startingSpaceChar: /^ /, endingSpaceChar: / $/, nonSpaceChar: /[^ ]/, newLineCharGlobal: /\n/g, tabCharGlobal: /\t/g, multipleSpaceGlobal: /\s+/g, blankLine: /^[ \t]*$/, doubleBlankLine: /\n[ \t]*\n[ \t]*$/, blockquoteStart: /^ {0,3}>/, blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, listIsTask: /^\[[ xX]\] +\S/, listReplaceTask: /^\[[ xX]\] +/, listTaskCheckbox: /\[[ xX]\]/, anyLine: /\n.*\n/, hrefBrackets: /^<(.*)>$/, tableDelimiter: /[:|]/, tableAlignChars: /^\||\| *$/g, tableRowBlankLine: /\n[ \t]*$/, tableAlignRight: /^ *-+: *$/, tableAlignCenter: /^ *:-+: *$/, tableAlignLeft: /^ *:-+ *$/, startATag: /^<a /i, endATag: /^<\/a>/i, startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, startAngleBracket: /^</, endAngleBracket: />$/, pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, unicodeAlphaNumeric: /[\p{L}\p{N}]/u, escapeTest: /[&<>"']/, escapeReplace: /[&<>"']/g, escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, caret: /(^|[^\[])\^/g, percentDecode: /%25/g, findPipe: /\|/g, splitPipe: / \|/, slashPipe: /\\\|/g, carriageReturn: /\r\n|\r/g, spaceLine: /^ +$/gm, notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: /* @__PURE__ */ __name((u3) => new RegExp(`^( {0,3}${u3})((?:[ ][^\\n]*)?(?:\\n|$))`), "listItemRegex"), nextBulletRegex: /* @__PURE__ */ __name((u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), "nextBulletRegex"), hrRegex: /* @__PURE__ */ __name((u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), "hrRegex"), fencesBeginRegex: /* @__PURE__ */ __name((u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}(?:\`\`\`|~~~)`), "fencesBeginRegex"), headingBeginRegex: /* @__PURE__ */ __name((u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}#`), "headingBeginRegex"), htmlBeginRegex: /* @__PURE__ */ __name((u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}<(?:[a-z].*>|!--)`, "i"), "htmlBeginRegex"), blockquoteBeginRegex: /* @__PURE__ */ __name((u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}>`), "blockquoteBeginRegex") }; 128 + var Te = /^(?:[ \t]*(?:\n|$))+/; 129 + var Oe = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/; 130 + var we = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/; 131 + var I = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/; 132 + var ye = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/; 133 + var N = / {0,3}(?:[*+-]|\d{1,9}[.)])/; 134 + var re = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/; 135 + var se = k(re).replace(/bull/g, N).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(); 136 + var Pe = k(re).replace(/bull/g, N).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(); 137 + var Q = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/; 138 + var Se = /^[^\n]+/; 139 + var F = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/; 140 + var $e = k(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", F).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(); 141 + var _e = k(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, N).getRegex(); 142 + var q = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul"; 143 + var j = /<!--(?:-?>|[\s\S]*?(?:-->|$))/; 144 + var Le = k("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", j).replace("tag", q).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); 145 + var ie = k(Q).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", q).getRegex(); 146 + var Me = k(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", ie).getRegex(); 147 + var U = { blockquote: Me, code: Oe, def: $e, fences: we, heading: ye, hr: I, html: Le, lheading: se, list: _e, newline: Te, paragraph: ie, table: _, text: Se }; 148 + var te = k("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", q).getRegex(); 149 + var ze = { ...U, lheading: Pe, table: te, paragraph: k(Q).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", te).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", q).getRegex() }; 150 + var Ce = { ...U, html: k(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", j).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: _, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, paragraph: k(Q).replace("hr", I).replace("heading", ` *#{1,6} *[^ 151 + ]`).replace("lheading", se).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() }; 152 + var Ae = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/; 153 + var Ie = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/; 154 + var oe = /^( {2,}|\\)\n(?!\s*$)/; 155 + var Ee = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/; 156 + var v = /[\p{P}\p{S}]/u; 157 + var K = /[\s\p{P}\p{S}]/u; 158 + var ae = /[^\s\p{P}\p{S}]/u; 159 + var Be = k(/^((?![*_])punctSpace)/, "u").replace(/punctSpace/g, K).getRegex(); 160 + var le = /(?!~)[\p{P}\p{S}]/u; 161 + var De = /(?!~)[\s\p{P}\p{S}]/u; 162 + var qe = /(?:[^\s\p{P}\p{S}]|~)/u; 163 + var ue = /(?![*_])[\p{P}\p{S}]/u; 164 + var ve = /(?![*_])[\s\p{P}\p{S}]/u; 165 + var Ge = /(?:[^\s\p{P}\p{S}]|[*_])/u; 166 + var He = k(/link|precode-code|html/, "g").replace("link", /\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-", Re ? "(?<!`)()" : "(^^|[^`])").replace("code", /(?<b>`+)[^`]+\k<b>(?!`)/).replace("html", /<(?! )[^<>]*?>/).getRegex(); 167 + var pe = /^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/; 168 + var Ze = k(pe, "u").replace(/punct/g, v).getRegex(); 169 + var Ne = k(pe, "u").replace(/punct/g, le).getRegex(); 170 + var ce = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)"; 171 + var Qe = k(ce, "gu").replace(/notPunctSpace/g, ae).replace(/punctSpace/g, K).replace(/punct/g, v).getRegex(); 172 + var Fe = k(ce, "gu").replace(/notPunctSpace/g, qe).replace(/punctSpace/g, De).replace(/punct/g, le).getRegex(); 173 + var je = k("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, ae).replace(/punctSpace/g, K).replace(/punct/g, v).getRegex(); 174 + var Ue = k(/^~~?(?:((?!~)punct)|[^\s~])/, "u").replace(/punct/g, ue).getRegex(); 175 + var Ke = "^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)"; 176 + var We = k(Ke, "gu").replace(/notPunctSpace/g, Ge).replace(/punctSpace/g, ve).replace(/punct/g, ue).getRegex(); 177 + var Xe = k(/\\(punct)/, "gu").replace(/punct/g, v).getRegex(); 178 + var Je = k(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(); 179 + var Ve = k(j).replace("(?:-->|$)", "-->").getRegex(); 180 + var Ye = k("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment", Ve).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(); 181 + var D = /(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/; 182 + var et = k(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", D).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(); 183 + var he = k(/^!?\[(label)\]\[(ref)\]/).replace("label", D).replace("ref", F).getRegex(); 184 + var ke = k(/^!?\[(ref)\](?:\[\])?/).replace("ref", F).getRegex(); 185 + var tt = k("reflink|nolink(?!\\()", "g").replace("reflink", he).replace("nolink", ke).getRegex(); 186 + var ne = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/; 187 + var W = { _backpedal: _, anyPunctuation: Xe, autolink: Je, blockSkip: He, br: oe, code: Ie, del: _, delLDelim: _, delRDelim: _, emStrongLDelim: Ze, emStrongRDelimAst: Qe, emStrongRDelimUnd: je, escape: Ae, link: et, nolink: ke, punctuation: Be, reflink: he, reflinkSearch: tt, tag: Ye, text: Ee, url: _ }; 188 + var nt = { ...W, link: k(/^!?\[(label)\]\((.*?)\)/).replace("label", D).getRegex(), reflink: k(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", D).getRegex() }; 189 + var Z = { ...W, emStrongRDelimAst: Fe, emStrongLDelim: Ne, delLDelim: Ue, delRDelim: We, url: k(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", ne).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, text: k(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol", ne).getRegex() }; 190 + var rt = { ...Z, br: k(oe).replace("{2,}", "*").getRegex(), text: k(Z.text).replace("\\b_", "\\b_| {2,}\\n").replace(/\{2,\}/g, "*").getRegex() }; 191 + var E2 = { normal: U, gfm: ze, pedantic: Ce }; 192 + var z = { normal: W, gfm: Z, breaks: rt, pedantic: nt }; 193 + var st = { "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" }; 194 + var de = /* @__PURE__ */ __name((u3) => st[u3], "de"); 195 + function O(u3, e3) { 196 + if (e3) { 197 + if (m.escapeTest.test(u3)) return u3.replace(m.escapeReplace, de); 198 + } else if (m.escapeTestNoEncode.test(u3)) return u3.replace(m.escapeReplaceNoEncode, de); 199 + return u3; 200 + } 201 + __name(O, "O"); 202 + function X(u3) { 203 + try { 204 + u3 = encodeURI(u3).replace(m.percentDecode, "%"); 205 + } catch { 206 + return null; 207 + } 208 + return u3; 209 + } 210 + __name(X, "X"); 211 + function J(u3, e3) { 212 + let t2 = u3.replace(m.findPipe, (i3, s, a) => { 213 + let o2 = false, l = s; 214 + for (; --l >= 0 && a[l] === "\\"; ) o2 = !o2; 215 + return o2 ? "|" : " |"; 216 + }), n = t2.split(m.splitPipe), r = 0; 217 + if (n[0].trim() || n.shift(), n.length > 0 && !n.at(-1)?.trim() && n.pop(), e3) if (n.length > e3) n.splice(e3); 218 + else for (; n.length < e3; ) n.push(""); 219 + for (; r < n.length; r++) n[r] = n[r].trim().replace(m.slashPipe, "|"); 220 + return n; 221 + } 222 + __name(J, "J"); 223 + function C(u3, e3, t2) { 224 + let n = u3.length; 225 + if (n === 0) return ""; 226 + let r = 0; 227 + for (; r < n; ) { 228 + let i3 = u3.charAt(n - r - 1); 229 + if (i3 === e3 && !t2) r++; 230 + else if (i3 !== e3 && t2) r++; 231 + else break; 232 + } 233 + return u3.slice(0, n - r); 234 + } 235 + __name(C, "C"); 236 + function ge(u3, e3) { 237 + if (u3.indexOf(e3[1]) === -1) return -1; 238 + let t2 = 0; 239 + for (let n = 0; n < u3.length; n++) if (u3[n] === "\\") n++; 240 + else if (u3[n] === e3[0]) t2++; 241 + else if (u3[n] === e3[1] && (t2--, t2 < 0)) return n; 242 + return t2 > 0 ? -2 : -1; 243 + } 244 + __name(ge, "ge"); 245 + function fe(u3, e3 = 0) { 246 + let t2 = e3, n = ""; 247 + for (let r of u3) if (r === " ") { 248 + let i3 = 4 - t2 % 4; 249 + n += " ".repeat(i3), t2 += i3; 250 + } else n += r, t2++; 251 + return n; 252 + } 253 + __name(fe, "fe"); 254 + function me(u3, e3, t2, n, r) { 255 + let i3 = e3.href, s = e3.title || null, a = u3[1].replace(r.other.outputLinkReplace, "$1"); 256 + n.state.inLink = true; 257 + let o2 = { type: u3[0].charAt(0) === "!" ? "image" : "link", raw: t2, href: i3, title: s, text: a, tokens: n.inlineTokens(a) }; 258 + return n.state.inLink = false, o2; 259 + } 260 + __name(me, "me"); 261 + function it(u3, e3, t2) { 262 + let n = u3.match(t2.other.indentCodeCompensation); 263 + if (n === null) return e3; 264 + let r = n[1]; 265 + return e3.split(` 266 + `).map((i3) => { 267 + let s = i3.match(t2.other.beginningSpace); 268 + if (s === null) return i3; 269 + let [a] = s; 270 + return a.length >= r.length ? i3.slice(r.length) : i3; 271 + }).join(` 272 + `); 273 + } 274 + __name(it, "it"); 275 + var w = class { 276 + static { 277 + __name(this, "w"); 278 + } 279 + options; 280 + rules; 281 + lexer; 282 + constructor(e3) { 283 + this.options = e3 || T2; 284 + } 285 + space(e3) { 286 + let t2 = this.rules.block.newline.exec(e3); 287 + if (t2 && t2[0].length > 0) return { type: "space", raw: t2[0] }; 288 + } 289 + code(e3) { 290 + let t2 = this.rules.block.code.exec(e3); 291 + if (t2) { 292 + let n = t2[0].replace(this.rules.other.codeRemoveIndent, ""); 293 + return { type: "code", raw: t2[0], codeBlockStyle: "indented", text: this.options.pedantic ? n : C(n, ` 294 + `) }; 295 + } 296 + } 297 + fences(e3) { 298 + let t2 = this.rules.block.fences.exec(e3); 299 + if (t2) { 300 + let n = t2[0], r = it(n, t2[3] || "", this.rules); 301 + return { type: "code", raw: n, lang: t2[2] ? t2[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : t2[2], text: r }; 302 + } 303 + } 304 + heading(e3) { 305 + let t2 = this.rules.block.heading.exec(e3); 306 + if (t2) { 307 + let n = t2[2].trim(); 308 + if (this.rules.other.endingHash.test(n)) { 309 + let r = C(n, "#"); 310 + (this.options.pedantic || !r || this.rules.other.endingSpaceChar.test(r)) && (n = r.trim()); 311 + } 312 + return { type: "heading", raw: t2[0], depth: t2[1].length, text: n, tokens: this.lexer.inline(n) }; 313 + } 314 + } 315 + hr(e3) { 316 + let t2 = this.rules.block.hr.exec(e3); 317 + if (t2) return { type: "hr", raw: C(t2[0], ` 318 + `) }; 319 + } 320 + blockquote(e3) { 321 + let t2 = this.rules.block.blockquote.exec(e3); 322 + if (t2) { 323 + let n = C(t2[0], ` 324 + `).split(` 325 + `), r = "", i3 = "", s = []; 326 + for (; n.length > 0; ) { 327 + let a = false, o2 = [], l; 328 + for (l = 0; l < n.length; l++) if (this.rules.other.blockquoteStart.test(n[l])) o2.push(n[l]), a = true; 329 + else if (!a) o2.push(n[l]); 330 + else break; 331 + n = n.slice(l); 332 + let p = o2.join(` 333 + `), c = p.replace(this.rules.other.blockquoteSetextReplace, ` 334 + $1`).replace(this.rules.other.blockquoteSetextReplace2, ""); 335 + r = r ? `${r} 336 + ${p}` : p, i3 = i3 ? `${i3} 337 + ${c}` : c; 338 + let d = this.lexer.state.top; 339 + if (this.lexer.state.top = true, this.lexer.blockTokens(c, s, true), this.lexer.state.top = d, n.length === 0) break; 340 + let h = s.at(-1); 341 + if (h?.type === "code") break; 342 + if (h?.type === "blockquote") { 343 + let R = h, f = R.raw + ` 344 + ` + n.join(` 345 + `), S = this.blockquote(f); 346 + s[s.length - 1] = S, r = r.substring(0, r.length - R.raw.length) + S.raw, i3 = i3.substring(0, i3.length - R.text.length) + S.text; 347 + break; 348 + } else if (h?.type === "list") { 349 + let R = h, f = R.raw + ` 350 + ` + n.join(` 351 + `), S = this.list(f); 352 + s[s.length - 1] = S, r = r.substring(0, r.length - h.raw.length) + S.raw, i3 = i3.substring(0, i3.length - R.raw.length) + S.raw, n = f.substring(s.at(-1).raw.length).split(` 353 + `); 354 + continue; 355 + } 356 + } 357 + return { type: "blockquote", raw: r, tokens: s, text: i3 }; 358 + } 359 + } 360 + list(e3) { 361 + let t2 = this.rules.block.list.exec(e3); 362 + if (t2) { 363 + let n = t2[1].trim(), r = n.length > 1, i3 = { type: "list", raw: "", ordered: r, start: r ? +n.slice(0, -1) : "", loose: false, items: [] }; 364 + n = r ? `\\d{1,9}\\${n.slice(-1)}` : `\\${n}`, this.options.pedantic && (n = r ? n : "[*+-]"); 365 + let s = this.rules.other.listItemRegex(n), a = false; 366 + for (; e3; ) { 367 + let l = false, p = "", c = ""; 368 + if (!(t2 = s.exec(e3)) || this.rules.block.hr.test(e3)) break; 369 + p = t2[0], e3 = e3.substring(p.length); 370 + let d = fe(t2[2].split(` 371 + `, 1)[0], t2[1].length), h = e3.split(` 372 + `, 1)[0], R = !d.trim(), f = 0; 373 + if (this.options.pedantic ? (f = 2, c = d.trimStart()) : R ? f = t2[1].length + 1 : (f = d.search(this.rules.other.nonSpaceChar), f = f > 4 ? 1 : f, c = d.slice(f), f += t2[1].length), R && this.rules.other.blankLine.test(h) && (p += h + ` 374 + `, e3 = e3.substring(h.length + 1), l = true), !l) { 375 + let S = this.rules.other.nextBulletRegex(f), V = this.rules.other.hrRegex(f), Y = this.rules.other.fencesBeginRegex(f), ee = this.rules.other.headingBeginRegex(f), xe = this.rules.other.htmlBeginRegex(f), be = this.rules.other.blockquoteBeginRegex(f); 376 + for (; e3; ) { 377 + let G = e3.split(` 378 + `, 1)[0], A2; 379 + if (h = G, this.options.pedantic ? (h = h.replace(this.rules.other.listReplaceNesting, " "), A2 = h) : A2 = h.replace(this.rules.other.tabCharGlobal, " "), Y.test(h) || ee.test(h) || xe.test(h) || be.test(h) || S.test(h) || V.test(h)) break; 380 + if (A2.search(this.rules.other.nonSpaceChar) >= f || !h.trim()) c += ` 381 + ` + A2.slice(f); 382 + else { 383 + if (R || d.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4 || Y.test(d) || ee.test(d) || V.test(d)) break; 384 + c += ` 385 + ` + h; 386 + } 387 + R = !h.trim(), p += G + ` 388 + `, e3 = e3.substring(G.length + 1), d = A2.slice(f); 389 + } 390 + } 391 + i3.loose || (a ? i3.loose = true : this.rules.other.doubleBlankLine.test(p) && (a = true)), i3.items.push({ type: "list_item", raw: p, task: !!this.options.gfm && this.rules.other.listIsTask.test(c), loose: false, text: c, tokens: [] }), i3.raw += p; 392 + } 393 + let o2 = i3.items.at(-1); 394 + if (o2) o2.raw = o2.raw.trimEnd(), o2.text = o2.text.trimEnd(); 395 + else return; 396 + i3.raw = i3.raw.trimEnd(); 397 + for (let l of i3.items) { 398 + if (this.lexer.state.top = false, l.tokens = this.lexer.blockTokens(l.text, []), l.task) { 399 + if (l.text = l.text.replace(this.rules.other.listReplaceTask, ""), l.tokens[0]?.type === "text" || l.tokens[0]?.type === "paragraph") { 400 + l.tokens[0].raw = l.tokens[0].raw.replace(this.rules.other.listReplaceTask, ""), l.tokens[0].text = l.tokens[0].text.replace(this.rules.other.listReplaceTask, ""); 401 + for (let c = this.lexer.inlineQueue.length - 1; c >= 0; c--) if (this.rules.other.listIsTask.test(this.lexer.inlineQueue[c].src)) { 402 + this.lexer.inlineQueue[c].src = this.lexer.inlineQueue[c].src.replace(this.rules.other.listReplaceTask, ""); 403 + break; 404 + } 405 + } 406 + let p = this.rules.other.listTaskCheckbox.exec(l.raw); 407 + if (p) { 408 + let c = { type: "checkbox", raw: p[0] + " ", checked: p[0] !== "[ ]" }; 409 + l.checked = c.checked, i3.loose ? l.tokens[0] && ["paragraph", "text"].includes(l.tokens[0].type) && "tokens" in l.tokens[0] && l.tokens[0].tokens ? (l.tokens[0].raw = c.raw + l.tokens[0].raw, l.tokens[0].text = c.raw + l.tokens[0].text, l.tokens[0].tokens.unshift(c)) : l.tokens.unshift({ type: "paragraph", raw: c.raw, text: c.raw, tokens: [c] }) : l.tokens.unshift(c); 410 + } 411 + } 412 + if (!i3.loose) { 413 + let p = l.tokens.filter((d) => d.type === "space"), c = p.length > 0 && p.some((d) => this.rules.other.anyLine.test(d.raw)); 414 + i3.loose = c; 415 + } 416 + } 417 + if (i3.loose) for (let l of i3.items) { 418 + l.loose = true; 419 + for (let p of l.tokens) p.type === "text" && (p.type = "paragraph"); 420 + } 421 + return i3; 422 + } 423 + } 424 + html(e3) { 425 + let t2 = this.rules.block.html.exec(e3); 426 + if (t2) return { type: "html", block: true, raw: t2[0], pre: t2[1] === "pre" || t2[1] === "script" || t2[1] === "style", text: t2[0] }; 427 + } 428 + def(e3) { 429 + let t2 = this.rules.block.def.exec(e3); 430 + if (t2) { 431 + let n = t2[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, " "), r = t2[2] ? t2[2].replace(this.rules.other.hrefBrackets, "$1").replace(this.rules.inline.anyPunctuation, "$1") : "", i3 = t2[3] ? t2[3].substring(1, t2[3].length - 1).replace(this.rules.inline.anyPunctuation, "$1") : t2[3]; 432 + return { type: "def", tag: n, raw: t2[0], href: r, title: i3 }; 433 + } 434 + } 435 + table(e3) { 436 + let t2 = this.rules.block.table.exec(e3); 437 + if (!t2 || !this.rules.other.tableDelimiter.test(t2[2])) return; 438 + let n = J(t2[1]), r = t2[2].replace(this.rules.other.tableAlignChars, "").split("|"), i3 = t2[3]?.trim() ? t2[3].replace(this.rules.other.tableRowBlankLine, "").split(` 439 + `) : [], s = { type: "table", raw: t2[0], header: [], align: [], rows: [] }; 440 + if (n.length === r.length) { 441 + for (let a of r) this.rules.other.tableAlignRight.test(a) ? s.align.push("right") : this.rules.other.tableAlignCenter.test(a) ? s.align.push("center") : this.rules.other.tableAlignLeft.test(a) ? s.align.push("left") : s.align.push(null); 442 + for (let a = 0; a < n.length; a++) s.header.push({ text: n[a], tokens: this.lexer.inline(n[a]), header: true, align: s.align[a] }); 443 + for (let a of i3) s.rows.push(J(a, s.header.length).map((o2, l) => ({ text: o2, tokens: this.lexer.inline(o2), header: false, align: s.align[l] }))); 444 + return s; 445 + } 446 + } 447 + lheading(e3) { 448 + let t2 = this.rules.block.lheading.exec(e3); 449 + if (t2) return { type: "heading", raw: t2[0], depth: t2[2].charAt(0) === "=" ? 1 : 2, text: t2[1], tokens: this.lexer.inline(t2[1]) }; 450 + } 451 + paragraph(e3) { 452 + let t2 = this.rules.block.paragraph.exec(e3); 453 + if (t2) { 454 + let n = t2[1].charAt(t2[1].length - 1) === ` 455 + ` ? t2[1].slice(0, -1) : t2[1]; 456 + return { type: "paragraph", raw: t2[0], text: n, tokens: this.lexer.inline(n) }; 457 + } 458 + } 459 + text(e3) { 460 + let t2 = this.rules.block.text.exec(e3); 461 + if (t2) return { type: "text", raw: t2[0], text: t2[0], tokens: this.lexer.inline(t2[0]) }; 462 + } 463 + escape(e3) { 464 + let t2 = this.rules.inline.escape.exec(e3); 465 + if (t2) return { type: "escape", raw: t2[0], text: t2[1] }; 466 + } 467 + tag(e3) { 468 + let t2 = this.rules.inline.tag.exec(e3); 469 + if (t2) return !this.lexer.state.inLink && this.rules.other.startATag.test(t2[0]) ? this.lexer.state.inLink = true : this.lexer.state.inLink && this.rules.other.endATag.test(t2[0]) && (this.lexer.state.inLink = false), !this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(t2[0]) ? this.lexer.state.inRawBlock = true : this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(t2[0]) && (this.lexer.state.inRawBlock = false), { type: "html", raw: t2[0], inLink: this.lexer.state.inLink, inRawBlock: this.lexer.state.inRawBlock, block: false, text: t2[0] }; 470 + } 471 + link(e3) { 472 + let t2 = this.rules.inline.link.exec(e3); 473 + if (t2) { 474 + let n = t2[2].trim(); 475 + if (!this.options.pedantic && this.rules.other.startAngleBracket.test(n)) { 476 + if (!this.rules.other.endAngleBracket.test(n)) return; 477 + let s = C(n.slice(0, -1), "\\"); 478 + if ((n.length - s.length) % 2 === 0) return; 479 + } else { 480 + let s = ge(t2[2], "()"); 481 + if (s === -2) return; 482 + if (s > -1) { 483 + let o2 = (t2[0].indexOf("!") === 0 ? 5 : 4) + t2[1].length + s; 484 + t2[2] = t2[2].substring(0, s), t2[0] = t2[0].substring(0, o2).trim(), t2[3] = ""; 485 + } 486 + } 487 + let r = t2[2], i3 = ""; 488 + if (this.options.pedantic) { 489 + let s = this.rules.other.pedanticHrefTitle.exec(r); 490 + s && (r = s[1], i3 = s[3]); 491 + } else i3 = t2[3] ? t2[3].slice(1, -1) : ""; 492 + return r = r.trim(), this.rules.other.startAngleBracket.test(r) && (this.options.pedantic && !this.rules.other.endAngleBracket.test(n) ? r = r.slice(1) : r = r.slice(1, -1)), me(t2, { href: r && r.replace(this.rules.inline.anyPunctuation, "$1"), title: i3 && i3.replace(this.rules.inline.anyPunctuation, "$1") }, t2[0], this.lexer, this.rules); 493 + } 494 + } 495 + reflink(e3, t2) { 496 + let n; 497 + if ((n = this.rules.inline.reflink.exec(e3)) || (n = this.rules.inline.nolink.exec(e3))) { 498 + let r = (n[2] || n[1]).replace(this.rules.other.multipleSpaceGlobal, " "), i3 = t2[r.toLowerCase()]; 499 + if (!i3) { 500 + let s = n[0].charAt(0); 501 + return { type: "text", raw: s, text: s }; 502 + } 503 + return me(n, i3, n[0], this.lexer, this.rules); 504 + } 505 + } 506 + emStrong(e3, t2, n = "") { 507 + let r = this.rules.inline.emStrongLDelim.exec(e3); 508 + if (!r || r[3] && n.match(this.rules.other.unicodeAlphaNumeric)) return; 509 + if (!(r[1] || r[2] || "") || !n || this.rules.inline.punctuation.exec(n)) { 510 + let s = [...r[0]].length - 1, a, o2, l = s, p = 0, c = r[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; 511 + for (c.lastIndex = 0, t2 = t2.slice(-1 * e3.length + s); (r = c.exec(t2)) != null; ) { 512 + if (a = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !a) continue; 513 + if (o2 = [...a].length, r[3] || r[4]) { 514 + l += o2; 515 + continue; 516 + } else if ((r[5] || r[6]) && s % 3 && !((s + o2) % 3)) { 517 + p += o2; 518 + continue; 519 + } 520 + if (l -= o2, l > 0) continue; 521 + o2 = Math.min(o2, o2 + l + p); 522 + let d = [...r[0]][0].length, h = e3.slice(0, s + r.index + d + o2); 523 + if (Math.min(s, o2) % 2) { 524 + let f = h.slice(1, -1); 525 + return { type: "em", raw: h, text: f, tokens: this.lexer.inlineTokens(f) }; 526 + } 527 + let R = h.slice(2, -2); 528 + return { type: "strong", raw: h, text: R, tokens: this.lexer.inlineTokens(R) }; 529 + } 530 + } 531 + } 532 + codespan(e3) { 533 + let t2 = this.rules.inline.code.exec(e3); 534 + if (t2) { 535 + let n = t2[2].replace(this.rules.other.newLineCharGlobal, " "), r = this.rules.other.nonSpaceChar.test(n), i3 = this.rules.other.startingSpaceChar.test(n) && this.rules.other.endingSpaceChar.test(n); 536 + return r && i3 && (n = n.substring(1, n.length - 1)), { type: "codespan", raw: t2[0], text: n }; 537 + } 538 + } 539 + br(e3) { 540 + let t2 = this.rules.inline.br.exec(e3); 541 + if (t2) return { type: "br", raw: t2[0] }; 542 + } 543 + del(e3, t2, n = "") { 544 + let r = this.rules.inline.delLDelim.exec(e3); 545 + if (!r) return; 546 + if (!(r[1] || "") || !n || this.rules.inline.punctuation.exec(n)) { 547 + let s = [...r[0]].length - 1, a, o2, l = s, p = this.rules.inline.delRDelim; 548 + for (p.lastIndex = 0, t2 = t2.slice(-1 * e3.length + s); (r = p.exec(t2)) != null; ) { 549 + if (a = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !a || (o2 = [...a].length, o2 !== s)) continue; 550 + if (r[3] || r[4]) { 551 + l += o2; 552 + continue; 553 + } 554 + if (l -= o2, l > 0) continue; 555 + o2 = Math.min(o2, o2 + l); 556 + let c = [...r[0]][0].length, d = e3.slice(0, s + r.index + c + o2), h = d.slice(s, -s); 557 + return { type: "del", raw: d, text: h, tokens: this.lexer.inlineTokens(h) }; 558 + } 559 + } 560 + } 561 + autolink(e3) { 562 + let t2 = this.rules.inline.autolink.exec(e3); 563 + if (t2) { 564 + let n, r; 565 + return t2[2] === "@" ? (n = t2[1], r = "mailto:" + n) : (n = t2[1], r = n), { type: "link", raw: t2[0], text: n, href: r, tokens: [{ type: "text", raw: n, text: n }] }; 566 + } 567 + } 568 + url(e3) { 569 + let t2; 570 + if (t2 = this.rules.inline.url.exec(e3)) { 571 + let n, r; 572 + if (t2[2] === "@") n = t2[0], r = "mailto:" + n; 573 + else { 574 + let i3; 575 + do 576 + i3 = t2[0], t2[0] = this.rules.inline._backpedal.exec(t2[0])?.[0] ?? ""; 577 + while (i3 !== t2[0]); 578 + n = t2[0], t2[1] === "www." ? r = "http://" + t2[0] : r = t2[0]; 579 + } 580 + return { type: "link", raw: t2[0], text: n, href: r, tokens: [{ type: "text", raw: n, text: n }] }; 581 + } 582 + } 583 + inlineText(e3) { 584 + let t2 = this.rules.inline.text.exec(e3); 585 + if (t2) { 586 + let n = this.lexer.state.inRawBlock; 587 + return { type: "text", raw: t2[0], text: t2[0], escaped: n }; 588 + } 589 + } 590 + }; 591 + var x = class u { 592 + static { 593 + __name(this, "u"); 594 + } 595 + tokens; 596 + options; 597 + state; 598 + inlineQueue; 599 + tokenizer; 600 + constructor(e3) { 601 + this.tokens = [], this.tokens.links = /* @__PURE__ */ Object.create(null), this.options = e3 || T2, this.options.tokenizer = this.options.tokenizer || new w(), this.tokenizer = this.options.tokenizer, this.tokenizer.options = this.options, this.tokenizer.lexer = this, this.inlineQueue = [], this.state = { inLink: false, inRawBlock: false, top: true }; 602 + let t2 = { other: m, block: E2.normal, inline: z.normal }; 603 + this.options.pedantic ? (t2.block = E2.pedantic, t2.inline = z.pedantic) : this.options.gfm && (t2.block = E2.gfm, this.options.breaks ? t2.inline = z.breaks : t2.inline = z.gfm), this.tokenizer.rules = t2; 604 + } 605 + static get rules() { 606 + return { block: E2, inline: z }; 607 + } 608 + static lex(e3, t2) { 609 + return new u(t2).lex(e3); 610 + } 611 + static lexInline(e3, t2) { 612 + return new u(t2).inlineTokens(e3); 613 + } 614 + lex(e3) { 615 + e3 = e3.replace(m.carriageReturn, ` 616 + `), this.blockTokens(e3, this.tokens); 617 + for (let t2 = 0; t2 < this.inlineQueue.length; t2++) { 618 + let n = this.inlineQueue[t2]; 619 + this.inlineTokens(n.src, n.tokens); 620 + } 621 + return this.inlineQueue = [], this.tokens; 622 + } 623 + blockTokens(e3, t2 = [], n = false) { 624 + for (this.options.pedantic && (e3 = e3.replace(m.tabCharGlobal, " ").replace(m.spaceLine, "")); e3; ) { 625 + let r; 626 + if (this.options.extensions?.block?.some((s) => (r = s.call({ lexer: this }, e3, t2)) ? (e3 = e3.substring(r.raw.length), t2.push(r), true) : false)) continue; 627 + if (r = this.tokenizer.space(e3)) { 628 + e3 = e3.substring(r.raw.length); 629 + let s = t2.at(-1); 630 + r.raw.length === 1 && s !== void 0 ? s.raw += ` 631 + ` : t2.push(r); 632 + continue; 633 + } 634 + if (r = this.tokenizer.code(e3)) { 635 + e3 = e3.substring(r.raw.length); 636 + let s = t2.at(-1); 637 + s?.type === "paragraph" || s?.type === "text" ? (s.raw += (s.raw.endsWith(` 638 + `) ? "" : ` 639 + `) + r.raw, s.text += ` 640 + ` + r.text, this.inlineQueue.at(-1).src = s.text) : t2.push(r); 641 + continue; 642 + } 643 + if (r = this.tokenizer.fences(e3)) { 644 + e3 = e3.substring(r.raw.length), t2.push(r); 645 + continue; 646 + } 647 + if (r = this.tokenizer.heading(e3)) { 648 + e3 = e3.substring(r.raw.length), t2.push(r); 649 + continue; 650 + } 651 + if (r = this.tokenizer.hr(e3)) { 652 + e3 = e3.substring(r.raw.length), t2.push(r); 653 + continue; 654 + } 655 + if (r = this.tokenizer.blockquote(e3)) { 656 + e3 = e3.substring(r.raw.length), t2.push(r); 657 + continue; 658 + } 659 + if (r = this.tokenizer.list(e3)) { 660 + e3 = e3.substring(r.raw.length), t2.push(r); 661 + continue; 662 + } 663 + if (r = this.tokenizer.html(e3)) { 664 + e3 = e3.substring(r.raw.length), t2.push(r); 665 + continue; 666 + } 667 + if (r = this.tokenizer.def(e3)) { 668 + e3 = e3.substring(r.raw.length); 669 + let s = t2.at(-1); 670 + s?.type === "paragraph" || s?.type === "text" ? (s.raw += (s.raw.endsWith(` 671 + `) ? "" : ` 672 + `) + r.raw, s.text += ` 673 + ` + r.raw, this.inlineQueue.at(-1).src = s.text) : this.tokens.links[r.tag] || (this.tokens.links[r.tag] = { href: r.href, title: r.title }, t2.push(r)); 674 + continue; 675 + } 676 + if (r = this.tokenizer.table(e3)) { 677 + e3 = e3.substring(r.raw.length), t2.push(r); 678 + continue; 679 + } 680 + if (r = this.tokenizer.lheading(e3)) { 681 + e3 = e3.substring(r.raw.length), t2.push(r); 682 + continue; 683 + } 684 + let i3 = e3; 685 + if (this.options.extensions?.startBlock) { 686 + let s = 1 / 0, a = e3.slice(1), o2; 687 + this.options.extensions.startBlock.forEach((l) => { 688 + o2 = l.call({ lexer: this }, a), typeof o2 == "number" && o2 >= 0 && (s = Math.min(s, o2)); 689 + }), s < 1 / 0 && s >= 0 && (i3 = e3.substring(0, s + 1)); 690 + } 691 + if (this.state.top && (r = this.tokenizer.paragraph(i3))) { 692 + let s = t2.at(-1); 693 + n && s?.type === "paragraph" ? (s.raw += (s.raw.endsWith(` 694 + `) ? "" : ` 695 + `) + r.raw, s.text += ` 696 + ` + r.text, this.inlineQueue.pop(), this.inlineQueue.at(-1).src = s.text) : t2.push(r), n = i3.length !== e3.length, e3 = e3.substring(r.raw.length); 697 + continue; 698 + } 699 + if (r = this.tokenizer.text(e3)) { 700 + e3 = e3.substring(r.raw.length); 701 + let s = t2.at(-1); 702 + s?.type === "text" ? (s.raw += (s.raw.endsWith(` 703 + `) ? "" : ` 704 + `) + r.raw, s.text += ` 705 + ` + r.text, this.inlineQueue.pop(), this.inlineQueue.at(-1).src = s.text) : t2.push(r); 706 + continue; 707 + } 708 + if (e3) { 709 + let s = "Infinite loop on byte: " + e3.charCodeAt(0); 710 + if (this.options.silent) { 711 + console.error(s); 712 + break; 713 + } else throw new Error(s); 714 + } 715 + } 716 + return this.state.top = true, t2; 717 + } 718 + inline(e3, t2 = []) { 719 + return this.inlineQueue.push({ src: e3, tokens: t2 }), t2; 720 + } 721 + inlineTokens(e3, t2 = []) { 722 + let n = e3, r = null; 723 + if (this.tokens.links) { 724 + let o2 = Object.keys(this.tokens.links); 725 + if (o2.length > 0) for (; (r = this.tokenizer.rules.inline.reflinkSearch.exec(n)) != null; ) o2.includes(r[0].slice(r[0].lastIndexOf("[") + 1, -1)) && (n = n.slice(0, r.index) + "[" + "a".repeat(r[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex)); 726 + } 727 + for (; (r = this.tokenizer.rules.inline.anyPunctuation.exec(n)) != null; ) n = n.slice(0, r.index) + "++" + n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex); 728 + let i3; 729 + for (; (r = this.tokenizer.rules.inline.blockSkip.exec(n)) != null; ) i3 = r[2] ? r[2].length : 0, n = n.slice(0, r.index + i3) + "[" + "a".repeat(r[0].length - i3 - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); 730 + n = this.options.hooks?.emStrongMask?.call({ lexer: this }, n) ?? n; 731 + let s = false, a = ""; 732 + for (; e3; ) { 733 + s || (a = ""), s = false; 734 + let o2; 735 + if (this.options.extensions?.inline?.some((p) => (o2 = p.call({ lexer: this }, e3, t2)) ? (e3 = e3.substring(o2.raw.length), t2.push(o2), true) : false)) continue; 736 + if (o2 = this.tokenizer.escape(e3)) { 737 + e3 = e3.substring(o2.raw.length), t2.push(o2); 738 + continue; 739 + } 740 + if (o2 = this.tokenizer.tag(e3)) { 741 + e3 = e3.substring(o2.raw.length), t2.push(o2); 742 + continue; 743 + } 744 + if (o2 = this.tokenizer.link(e3)) { 745 + e3 = e3.substring(o2.raw.length), t2.push(o2); 746 + continue; 747 + } 748 + if (o2 = this.tokenizer.reflink(e3, this.tokens.links)) { 749 + e3 = e3.substring(o2.raw.length); 750 + let p = t2.at(-1); 751 + o2.type === "text" && p?.type === "text" ? (p.raw += o2.raw, p.text += o2.text) : t2.push(o2); 752 + continue; 753 + } 754 + if (o2 = this.tokenizer.emStrong(e3, n, a)) { 755 + e3 = e3.substring(o2.raw.length), t2.push(o2); 756 + continue; 757 + } 758 + if (o2 = this.tokenizer.codespan(e3)) { 759 + e3 = e3.substring(o2.raw.length), t2.push(o2); 760 + continue; 761 + } 762 + if (o2 = this.tokenizer.br(e3)) { 763 + e3 = e3.substring(o2.raw.length), t2.push(o2); 764 + continue; 765 + } 766 + if (o2 = this.tokenizer.del(e3, n, a)) { 767 + e3 = e3.substring(o2.raw.length), t2.push(o2); 768 + continue; 769 + } 770 + if (o2 = this.tokenizer.autolink(e3)) { 771 + e3 = e3.substring(o2.raw.length), t2.push(o2); 772 + continue; 773 + } 774 + if (!this.state.inLink && (o2 = this.tokenizer.url(e3))) { 775 + e3 = e3.substring(o2.raw.length), t2.push(o2); 776 + continue; 777 + } 778 + let l = e3; 779 + if (this.options.extensions?.startInline) { 780 + let p = 1 / 0, c = e3.slice(1), d; 781 + this.options.extensions.startInline.forEach((h) => { 782 + d = h.call({ lexer: this }, c), typeof d == "number" && d >= 0 && (p = Math.min(p, d)); 783 + }), p < 1 / 0 && p >= 0 && (l = e3.substring(0, p + 1)); 784 + } 785 + if (o2 = this.tokenizer.inlineText(l)) { 786 + e3 = e3.substring(o2.raw.length), o2.raw.slice(-1) !== "_" && (a = o2.raw.slice(-1)), s = true; 787 + let p = t2.at(-1); 788 + p?.type === "text" ? (p.raw += o2.raw, p.text += o2.text) : t2.push(o2); 789 + continue; 790 + } 791 + if (e3) { 792 + let p = "Infinite loop on byte: " + e3.charCodeAt(0); 793 + if (this.options.silent) { 794 + console.error(p); 795 + break; 796 + } else throw new Error(p); 797 + } 798 + } 799 + return t2; 800 + } 801 + }; 802 + var y = class { 803 + static { 804 + __name(this, "y"); 805 + } 806 + options; 807 + parser; 808 + constructor(e3) { 809 + this.options = e3 || T2; 810 + } 811 + space(e3) { 812 + return ""; 813 + } 814 + code({ text: e3, lang: t2, escaped: n }) { 815 + let r = (t2 || "").match(m.notSpaceStart)?.[0], i3 = e3.replace(m.endingNewline, "") + ` 816 + `; 817 + return r ? '<pre><code class="language-' + O(r) + '">' + (n ? i3 : O(i3, true)) + `</code></pre> 818 + ` : "<pre><code>" + (n ? i3 : O(i3, true)) + `</code></pre> 819 + `; 820 + } 821 + blockquote({ tokens: e3 }) { 822 + return `<blockquote> 823 + ${this.parser.parse(e3)}</blockquote> 824 + `; 825 + } 826 + html({ text: e3 }) { 827 + return e3; 828 + } 829 + def(e3) { 830 + return ""; 831 + } 832 + heading({ tokens: e3, depth: t2 }) { 833 + return `<h${t2}>${this.parser.parseInline(e3)}</h${t2}> 834 + `; 835 + } 836 + hr(e3) { 837 + return `<hr> 838 + `; 839 + } 840 + list(e3) { 841 + let t2 = e3.ordered, n = e3.start, r = ""; 842 + for (let a = 0; a < e3.items.length; a++) { 843 + let o2 = e3.items[a]; 844 + r += this.listitem(o2); 845 + } 846 + let i3 = t2 ? "ol" : "ul", s = t2 && n !== 1 ? ' start="' + n + '"' : ""; 847 + return "<" + i3 + s + `> 848 + ` + r + "</" + i3 + `> 849 + `; 850 + } 851 + listitem(e3) { 852 + return `<li>${this.parser.parse(e3.tokens)}</li> 853 + `; 854 + } 855 + checkbox({ checked: e3 }) { 856 + return "<input " + (e3 ? 'checked="" ' : "") + 'disabled="" type="checkbox"> '; 857 + } 858 + paragraph({ tokens: e3 }) { 859 + return `<p>${this.parser.parseInline(e3)}</p> 860 + `; 861 + } 862 + table(e3) { 863 + let t2 = "", n = ""; 864 + for (let i3 = 0; i3 < e3.header.length; i3++) n += this.tablecell(e3.header[i3]); 865 + t2 += this.tablerow({ text: n }); 866 + let r = ""; 867 + for (let i3 = 0; i3 < e3.rows.length; i3++) { 868 + let s = e3.rows[i3]; 869 + n = ""; 870 + for (let a = 0; a < s.length; a++) n += this.tablecell(s[a]); 871 + r += this.tablerow({ text: n }); 872 + } 873 + return r && (r = `<tbody>${r}</tbody>`), `<table> 874 + <thead> 875 + ` + t2 + `</thead> 876 + ` + r + `</table> 877 + `; 878 + } 879 + tablerow({ text: e3 }) { 880 + return `<tr> 881 + ${e3}</tr> 882 + `; 883 + } 884 + tablecell(e3) { 885 + let t2 = this.parser.parseInline(e3.tokens), n = e3.header ? "th" : "td"; 886 + return (e3.align ? `<${n} align="${e3.align}">` : `<${n}>`) + t2 + `</${n}> 887 + `; 888 + } 889 + strong({ tokens: e3 }) { 890 + return `<strong>${this.parser.parseInline(e3)}</strong>`; 891 + } 892 + em({ tokens: e3 }) { 893 + return `<em>${this.parser.parseInline(e3)}</em>`; 894 + } 895 + codespan({ text: e3 }) { 896 + return `<code>${O(e3, true)}</code>`; 897 + } 898 + br(e3) { 899 + return "<br>"; 900 + } 901 + del({ tokens: e3 }) { 902 + return `<del>${this.parser.parseInline(e3)}</del>`; 903 + } 904 + link({ href: e3, title: t2, tokens: n }) { 905 + let r = this.parser.parseInline(n), i3 = X(e3); 906 + if (i3 === null) return r; 907 + e3 = i3; 908 + let s = '<a href="' + e3 + '"'; 909 + return t2 && (s += ' title="' + O(t2) + '"'), s += ">" + r + "</a>", s; 910 + } 911 + image({ href: e3, title: t2, text: n, tokens: r }) { 912 + r && (n = this.parser.parseInline(r, this.parser.textRenderer)); 913 + let i3 = X(e3); 914 + if (i3 === null) return O(n); 915 + e3 = i3; 916 + let s = `<img src="${e3}" alt="${O(n)}"`; 917 + return t2 && (s += ` title="${O(t2)}"`), s += ">", s; 918 + } 919 + text(e3) { 920 + return "tokens" in e3 && e3.tokens ? this.parser.parseInline(e3.tokens) : "escaped" in e3 && e3.escaped ? e3.text : O(e3.text); 921 + } 922 + }; 923 + var $ = class { 924 + static { 925 + __name(this, "$"); 926 + } 927 + strong({ text: e3 }) { 928 + return e3; 929 + } 930 + em({ text: e3 }) { 931 + return e3; 932 + } 933 + codespan({ text: e3 }) { 934 + return e3; 935 + } 936 + del({ text: e3 }) { 937 + return e3; 938 + } 939 + html({ text: e3 }) { 940 + return e3; 941 + } 942 + text({ text: e3 }) { 943 + return e3; 944 + } 945 + link({ text: e3 }) { 946 + return "" + e3; 947 + } 948 + image({ text: e3 }) { 949 + return "" + e3; 950 + } 951 + br() { 952 + return ""; 953 + } 954 + checkbox({ raw: e3 }) { 955 + return e3; 956 + } 957 + }; 958 + var b = class u2 { 959 + static { 960 + __name(this, "u"); 961 + } 962 + options; 963 + renderer; 964 + textRenderer; 965 + constructor(e3) { 966 + this.options = e3 || T2, this.options.renderer = this.options.renderer || new y(), this.renderer = this.options.renderer, this.renderer.options = this.options, this.renderer.parser = this, this.textRenderer = new $(); 967 + } 968 + static parse(e3, t2) { 969 + return new u2(t2).parse(e3); 970 + } 971 + static parseInline(e3, t2) { 972 + return new u2(t2).parseInline(e3); 973 + } 974 + parse(e3) { 975 + let t2 = ""; 976 + for (let n = 0; n < e3.length; n++) { 977 + let r = e3[n]; 978 + if (this.options.extensions?.renderers?.[r.type]) { 979 + let s = r, a = this.options.extensions.renderers[s.type].call({ parser: this }, s); 980 + if (a !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "def", "paragraph", "text"].includes(s.type)) { 981 + t2 += a || ""; 982 + continue; 983 + } 984 + } 985 + let i3 = r; 986 + switch (i3.type) { 987 + case "space": { 988 + t2 += this.renderer.space(i3); 989 + break; 990 + } 991 + case "hr": { 992 + t2 += this.renderer.hr(i3); 993 + break; 994 + } 995 + case "heading": { 996 + t2 += this.renderer.heading(i3); 997 + break; 998 + } 999 + case "code": { 1000 + t2 += this.renderer.code(i3); 1001 + break; 1002 + } 1003 + case "table": { 1004 + t2 += this.renderer.table(i3); 1005 + break; 1006 + } 1007 + case "blockquote": { 1008 + t2 += this.renderer.blockquote(i3); 1009 + break; 1010 + } 1011 + case "list": { 1012 + t2 += this.renderer.list(i3); 1013 + break; 1014 + } 1015 + case "checkbox": { 1016 + t2 += this.renderer.checkbox(i3); 1017 + break; 1018 + } 1019 + case "html": { 1020 + t2 += this.renderer.html(i3); 1021 + break; 1022 + } 1023 + case "def": { 1024 + t2 += this.renderer.def(i3); 1025 + break; 1026 + } 1027 + case "paragraph": { 1028 + t2 += this.renderer.paragraph(i3); 1029 + break; 1030 + } 1031 + case "text": { 1032 + t2 += this.renderer.text(i3); 1033 + break; 1034 + } 1035 + default: { 1036 + let s = 'Token with "' + i3.type + '" type was not found.'; 1037 + if (this.options.silent) return console.error(s), ""; 1038 + throw new Error(s); 1039 + } 1040 + } 1041 + } 1042 + return t2; 1043 + } 1044 + parseInline(e3, t2 = this.renderer) { 1045 + let n = ""; 1046 + for (let r = 0; r < e3.length; r++) { 1047 + let i3 = e3[r]; 1048 + if (this.options.extensions?.renderers?.[i3.type]) { 1049 + let a = this.options.extensions.renderers[i3.type].call({ parser: this }, i3); 1050 + if (a !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(i3.type)) { 1051 + n += a || ""; 1052 + continue; 1053 + } 1054 + } 1055 + let s = i3; 1056 + switch (s.type) { 1057 + case "escape": { 1058 + n += t2.text(s); 1059 + break; 1060 + } 1061 + case "html": { 1062 + n += t2.html(s); 1063 + break; 1064 + } 1065 + case "link": { 1066 + n += t2.link(s); 1067 + break; 1068 + } 1069 + case "image": { 1070 + n += t2.image(s); 1071 + break; 1072 + } 1073 + case "checkbox": { 1074 + n += t2.checkbox(s); 1075 + break; 1076 + } 1077 + case "strong": { 1078 + n += t2.strong(s); 1079 + break; 1080 + } 1081 + case "em": { 1082 + n += t2.em(s); 1083 + break; 1084 + } 1085 + case "codespan": { 1086 + n += t2.codespan(s); 1087 + break; 1088 + } 1089 + case "br": { 1090 + n += t2.br(s); 1091 + break; 1092 + } 1093 + case "del": { 1094 + n += t2.del(s); 1095 + break; 1096 + } 1097 + case "text": { 1098 + n += t2.text(s); 1099 + break; 1100 + } 1101 + default: { 1102 + let a = 'Token with "' + s.type + '" type was not found.'; 1103 + if (this.options.silent) return console.error(a), ""; 1104 + throw new Error(a); 1105 + } 1106 + } 1107 + } 1108 + return n; 1109 + } 1110 + }; 1111 + var P = class { 1112 + static { 1113 + __name(this, "P"); 1114 + } 1115 + options; 1116 + block; 1117 + constructor(e3) { 1118 + this.options = e3 || T2; 1119 + } 1120 + static passThroughHooks = /* @__PURE__ */ new Set(["preprocess", "postprocess", "processAllTokens", "emStrongMask"]); 1121 + static passThroughHooksRespectAsync = /* @__PURE__ */ new Set(["preprocess", "postprocess", "processAllTokens"]); 1122 + preprocess(e3) { 1123 + return e3; 1124 + } 1125 + postprocess(e3) { 1126 + return e3; 1127 + } 1128 + processAllTokens(e3) { 1129 + return e3; 1130 + } 1131 + emStrongMask(e3) { 1132 + return e3; 1133 + } 1134 + provideLexer() { 1135 + return this.block ? x.lex : x.lexInline; 1136 + } 1137 + provideParser() { 1138 + return this.block ? b.parse : b.parseInline; 1139 + } 1140 + }; 1141 + var B2 = class { 1142 + static { 1143 + __name(this, "B"); 1144 + } 1145 + defaults = M(); 1146 + options = this.setOptions; 1147 + parse = this.parseMarkdown(true); 1148 + parseInline = this.parseMarkdown(false); 1149 + Parser = b; 1150 + Renderer = y; 1151 + TextRenderer = $; 1152 + Lexer = x; 1153 + Tokenizer = w; 1154 + Hooks = P; 1155 + constructor(...e3) { 1156 + this.use(...e3); 1157 + } 1158 + walkTokens(e3, t2) { 1159 + let n = []; 1160 + for (let r of e3) switch (n = n.concat(t2.call(this, r)), r.type) { 1161 + case "table": { 1162 + let i3 = r; 1163 + for (let s of i3.header) n = n.concat(this.walkTokens(s.tokens, t2)); 1164 + for (let s of i3.rows) for (let a of s) n = n.concat(this.walkTokens(a.tokens, t2)); 1165 + break; 1166 + } 1167 + case "list": { 1168 + let i3 = r; 1169 + n = n.concat(this.walkTokens(i3.items, t2)); 1170 + break; 1171 + } 1172 + default: { 1173 + let i3 = r; 1174 + this.defaults.extensions?.childTokens?.[i3.type] ? this.defaults.extensions.childTokens[i3.type].forEach((s) => { 1175 + let a = i3[s].flat(1 / 0); 1176 + n = n.concat(this.walkTokens(a, t2)); 1177 + }) : i3.tokens && (n = n.concat(this.walkTokens(i3.tokens, t2))); 1178 + } 1179 + } 1180 + return n; 1181 + } 1182 + use(...e3) { 1183 + let t2 = this.defaults.extensions || { renderers: {}, childTokens: {} }; 1184 + return e3.forEach((n) => { 1185 + let r = { ...n }; 1186 + if (r.async = this.defaults.async || r.async || false, n.extensions && (n.extensions.forEach((i3) => { 1187 + if (!i3.name) throw new Error("extension name required"); 1188 + if ("renderer" in i3) { 1189 + let s = t2.renderers[i3.name]; 1190 + s ? t2.renderers[i3.name] = function(...a) { 1191 + let o2 = i3.renderer.apply(this, a); 1192 + return o2 === false && (o2 = s.apply(this, a)), o2; 1193 + } : t2.renderers[i3.name] = i3.renderer; 1194 + } 1195 + if ("tokenizer" in i3) { 1196 + if (!i3.level || i3.level !== "block" && i3.level !== "inline") throw new Error("extension level must be 'block' or 'inline'"); 1197 + let s = t2[i3.level]; 1198 + s ? s.unshift(i3.tokenizer) : t2[i3.level] = [i3.tokenizer], i3.start && (i3.level === "block" ? t2.startBlock ? t2.startBlock.push(i3.start) : t2.startBlock = [i3.start] : i3.level === "inline" && (t2.startInline ? t2.startInline.push(i3.start) : t2.startInline = [i3.start])); 1199 + } 1200 + "childTokens" in i3 && i3.childTokens && (t2.childTokens[i3.name] = i3.childTokens); 1201 + }), r.extensions = t2), n.renderer) { 1202 + let i3 = this.defaults.renderer || new y(this.defaults); 1203 + for (let s in n.renderer) { 1204 + if (!(s in i3)) throw new Error(`renderer '${s}' does not exist`); 1205 + if (["options", "parser"].includes(s)) continue; 1206 + let a = s, o2 = n.renderer[a], l = i3[a]; 1207 + i3[a] = (...p) => { 1208 + let c = o2.apply(i3, p); 1209 + return c === false && (c = l.apply(i3, p)), c || ""; 1210 + }; 1211 + } 1212 + r.renderer = i3; 1213 + } 1214 + if (n.tokenizer) { 1215 + let i3 = this.defaults.tokenizer || new w(this.defaults); 1216 + for (let s in n.tokenizer) { 1217 + if (!(s in i3)) throw new Error(`tokenizer '${s}' does not exist`); 1218 + if (["options", "rules", "lexer"].includes(s)) continue; 1219 + let a = s, o2 = n.tokenizer[a], l = i3[a]; 1220 + i3[a] = (...p) => { 1221 + let c = o2.apply(i3, p); 1222 + return c === false && (c = l.apply(i3, p)), c; 1223 + }; 1224 + } 1225 + r.tokenizer = i3; 1226 + } 1227 + if (n.hooks) { 1228 + let i3 = this.defaults.hooks || new P(); 1229 + for (let s in n.hooks) { 1230 + if (!(s in i3)) throw new Error(`hook '${s}' does not exist`); 1231 + if (["options", "block"].includes(s)) continue; 1232 + let a = s, o2 = n.hooks[a], l = i3[a]; 1233 + P.passThroughHooks.has(s) ? i3[a] = (p) => { 1234 + if (this.defaults.async && P.passThroughHooksRespectAsync.has(s)) return (async () => { 1235 + let d = await o2.call(i3, p); 1236 + return l.call(i3, d); 1237 + })(); 1238 + let c = o2.call(i3, p); 1239 + return l.call(i3, c); 1240 + } : i3[a] = (...p) => { 1241 + if (this.defaults.async) return (async () => { 1242 + let d = await o2.apply(i3, p); 1243 + return d === false && (d = await l.apply(i3, p)), d; 1244 + })(); 1245 + let c = o2.apply(i3, p); 1246 + return c === false && (c = l.apply(i3, p)), c; 1247 + }; 1248 + } 1249 + r.hooks = i3; 1250 + } 1251 + if (n.walkTokens) { 1252 + let i3 = this.defaults.walkTokens, s = n.walkTokens; 1253 + r.walkTokens = function(a) { 1254 + let o2 = []; 1255 + return o2.push(s.call(this, a)), i3 && (o2 = o2.concat(i3.call(this, a))), o2; 1256 + }; 1257 + } 1258 + this.defaults = { ...this.defaults, ...r }; 1259 + }), this; 1260 + } 1261 + setOptions(e3) { 1262 + return this.defaults = { ...this.defaults, ...e3 }, this; 1263 + } 1264 + lexer(e3, t2) { 1265 + return x.lex(e3, t2 ?? this.defaults); 1266 + } 1267 + parser(e3, t2) { 1268 + return b.parse(e3, t2 ?? this.defaults); 1269 + } 1270 + parseMarkdown(e3) { 1271 + return (n, r) => { 1272 + let i3 = { ...r }, s = { ...this.defaults, ...i3 }, a = this.onError(!!s.silent, !!s.async); 1273 + if (this.defaults.async === true && i3.async === false) return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); 1274 + if (typeof n > "u" || n === null) return a(new Error("marked(): input parameter is undefined or null")); 1275 + if (typeof n != "string") return a(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n) + ", string expected")); 1276 + if (s.hooks && (s.hooks.options = s, s.hooks.block = e3), s.async) return (async () => { 1277 + let o2 = s.hooks ? await s.hooks.preprocess(n) : n, p = await (s.hooks ? await s.hooks.provideLexer() : e3 ? x.lex : x.lexInline)(o2, s), c = s.hooks ? await s.hooks.processAllTokens(p) : p; 1278 + s.walkTokens && await Promise.all(this.walkTokens(c, s.walkTokens)); 1279 + let h = await (s.hooks ? await s.hooks.provideParser() : e3 ? b.parse : b.parseInline)(c, s); 1280 + return s.hooks ? await s.hooks.postprocess(h) : h; 1281 + })().catch(a); 1282 + try { 1283 + s.hooks && (n = s.hooks.preprocess(n)); 1284 + let l = (s.hooks ? s.hooks.provideLexer() : e3 ? x.lex : x.lexInline)(n, s); 1285 + s.hooks && (l = s.hooks.processAllTokens(l)), s.walkTokens && this.walkTokens(l, s.walkTokens); 1286 + let c = (s.hooks ? s.hooks.provideParser() : e3 ? b.parse : b.parseInline)(l, s); 1287 + return s.hooks && (c = s.hooks.postprocess(c)), c; 1288 + } catch (o2) { 1289 + return a(o2); 1290 + } 1291 + }; 1292 + } 1293 + onError(e3, t2) { 1294 + return (n) => { 1295 + if (n.message += ` 1296 + Please report this to https://github.com/markedjs/marked.`, e3) { 1297 + let r = "<p>An error occurred:</p><pre>" + O(n.message + "", true) + "</pre>"; 1298 + return t2 ? Promise.resolve(r) : r; 1299 + } 1300 + if (t2) return Promise.reject(n); 1301 + throw n; 1302 + }; 1303 + } 1304 + }; 1305 + var L = new B2(); 1306 + function g(u3, e3) { 1307 + return L.parse(u3, e3); 1308 + } 1309 + __name(g, "g"); 1310 + g.options = g.setOptions = function(u3) { 1311 + return L.setOptions(u3), g.defaults = L.defaults, H(g.defaults), g; 1312 + }; 1313 + g.getDefaults = M; 1314 + g.defaults = T2; 1315 + g.use = function(...u3) { 1316 + return L.use(...u3), g.defaults = L.defaults, H(g.defaults), g; 1317 + }; 1318 + g.walkTokens = function(u3, e3) { 1319 + return L.walkTokens(u3, e3); 1320 + }; 1321 + g.parseInline = L.parseInline; 1322 + g.Parser = b; 1323 + g.parser = b.parse; 1324 + g.Renderer = y; 1325 + g.TextRenderer = $; 1326 + g.Lexer = x; 1327 + g.lexer = x.lex; 1328 + g.Tokenizer = w; 1329 + g.Hooks = P; 1330 + g.parse = g; 1331 + var Ut = g.options; 1332 + var Kt = g.setOptions; 1333 + var Wt = g.use; 1334 + var Xt = g.walkTokens; 1335 + var Jt = g.parseInline; 1336 + var Yt = b.parse; 1337 + var en = x.lex; 1338 + 1339 + // ../node_modules/.deno/lit-html@3.3.2/node_modules/lit-html/node/directives/unsafe-html.js 1340 + init_Buffer(); 1341 + init_process(); 1342 + var e2 = class extends i { 1343 + static { 1344 + __name(this, "e"); 1345 + } 1346 + constructor(i3) { 1347 + if (super(i3), this.it = A, i3.type !== t.CHILD) throw Error(this.constructor.directiveName + "() can only be used in child bindings"); 1348 + } 1349 + render(r) { 1350 + if (r === A || null == r) return this._t = void 0, this.it = r; 1351 + if (r === E) return r; 1352 + if ("string" != typeof r) throw Error(this.constructor.directiveName + "() called with a non-string value"); 1353 + if (r === this.it) return this._t; 1354 + this.it = r; 1355 + const s = [r]; 1356 + return s.raw = s, this._t = { _$litType$: this.constructor.resultType, strings: s, values: [] }; 1357 + } 1358 + }; 1359 + e2.directiveName = "unsafeHTML", e2.resultType = 1; 1360 + var o = e(e2); 1361 + 1362 + // facets/index.js 1363 + document.body.addEventListener( 1364 + "click", 1365 + /** 1366 + * @param {MouseEvent} event 1367 + */ 1368 + async (event) => { 1369 + const target = ( 1370 + /** @type {HTMLElement} */ 1371 + event.target 1372 + ); 1373 + const rel = target.getAttribute("rel"); 1374 + if (!rel) return; 1375 + const uri = target.closest("li")?.getAttribute("data-uri"); 1376 + if (!uri) return; 1377 + const name = target.closest("li")?.getAttribute("data-name"); 1378 + if (!name) return; 1379 + switch (rel) { 1380 + case "fork": { 1381 + const facet = await facetFromURI({ name, uri }, { fetchHTML: true }); 1382 + editFacet(facet); 1383 + document.querySelector("#build")?.scrollIntoView(); 1384 + break; 1385 + } 1386 + case "save": { 1387 + const facet = await facetFromURI({ name, uri }, { fetchHTML: false }); 1388 + const out = foundation_default.orchestrator.output(); 1389 + out.facets.save([ 1390 + ...out.facets.collection(), 1391 + facet 1392 + ]); 1393 + break; 1394 + } 1395 + } 1396 + } 1397 + ); 1398 + var listEl = document.querySelector("#list"); 1399 + if (!listEl) throw new Error("List element not found"); 1400 + var output = foundation_default.orchestrator.output(); 1401 + listEl.innerHTML = ""; 1402 + effect(() => { 1403 + const col = output.facets.collection().sort((a, b2) => { 1404 + return a.name.toLocaleLowerCase().localeCompare(b2.name.toLocaleLowerCase()); 1405 + }); 1406 + const state = output.facets.state(); 1407 + const h = col.length && state === "loaded" ? T` 1408 + <ul> 1409 + ${col.map( 1410 + (c) => i2( 1411 + c.id, 1412 + T` 1413 + <li> 1414 + <div style="position: relative;"> 1415 + <a href="facets/l/?id=${c.id}"> 1416 + ${c.name} 1417 + </a> 1418 + <button 1419 + class="button--fixed button--transparent" 1420 + popovertarget="facet-menu-col-${c.id}" 1421 + style="anchor-name: --facet-anchor-col-${c.id}; position: absolute; right: 0; top: 50%; transform: translateY(-50%);" 1422 + > 1423 + <i class="ph-fill ph-dots-three-circle"></i> 1424 + </button> 1425 + </div> 1426 + <div class="list-description"> 1427 + <div> 1428 + ${c.description?.trim().length ? o( 1429 + g.parse(c.description, { async: false }) 1430 + ) : A} 1431 + </div> 1432 + <div> 1433 + ${c.uri && !c.html ? T` 1434 + <span class="with-icon"> 1435 + <i class="ph-fill ph-binoculars"></i> 1436 + <span>Tracking the original <a href="${c.uri}">URI</a></span> 1437 + </span> 1438 + ` : T` 1439 + <span class="with-icon"> 1440 + <i class="ph-fill ph-code"></i> 1441 + <span>Custom code</span> 1442 + </span> 1443 + `} 1444 + </div> 1445 + </div> 1446 + 1447 + <!-- Dropdown Menu --> 1448 + <div 1449 + id="facet-menu-col-${c.id}" 1450 + class="dropdown" 1451 + style="position-anchor: --facet-anchor-col-${c.id}" 1452 + popover 1453 + > 1454 + <a href="facets/l/?id=${c.id}"> 1455 + <span class="with-icon"> 1456 + <i class="ph-fill ph-globe"></i> Open 1457 + </span> 1458 + </a> 1459 + <a @click="${() => editFacet(c)}"> 1460 + <span class="with-icon"> 1461 + <i class="ph-fill ph-cursor-text"></i> Edit 1462 + </span> 1463 + </a> 1464 + <a @click="${deleteFacet({ id: c.id })}"> 1465 + <span class="with-icon"> 1466 + <i class="ph-fill ph-eraser"></i> Delete 1467 + </span> 1468 + </a> 1469 + </div> 1470 + </li> 1471 + ` 1472 + ) 1473 + )} 1474 + </ul> 1475 + ` : state === "loaded" ? emptyFacetsList : T` 1476 + <div class="with-icon" style="font-size: var(--fs-sm);"> 1477 + <i class="ph-bold ph-spinner-gap"></i> 1478 + Loading items 1479 + </div> 1480 + `; 1481 + B(h, listEl); 1482 + }); 1483 + var emptyFacetsList = T` 1484 + <p style="margin-bottom: 0;"> 1485 + <i class="ph-fill ph-info"></i> You have not saved any facets yet. 1486 + </p> 1487 + `; 1488 + function deleteFacet({ id }) { 1489 + return () => { 1490 + const c = confirm("Are you sure you want to delete this facet?"); 1491 + if (!c) return; 1492 + output.facets.save( 1493 + output.facets.collection().filter((c2) => !(c2.id === id)) 1494 + ); 1495 + }; 1496 + } 1497 + __name(deleteFacet, "deleteFacet"); 1498 + var $editingFacet = signal( 1499 + /** @type {Facet | null} */ 1500 + null 1501 + ); 1502 + var editorContainer = document.body.querySelector("#html-input-container"); 1503 + if (!editorContainer) throw new Error("Editor container not found"); 1504 + var editor = new EditorView({ 1505 + parent: editorContainer, 1506 + doc: ` 1507 + <main> 1508 + <h1 id="now-playing"> 1509 + Waiting on tracks &amp; queue to load ... 1510 + </h1> 1511 + </main> 1512 + 1513 + <style> 1514 + @import "./styles/base.css"; 1515 + @import "./styles/diffuse/page.css"; 1516 + </style> 1517 + 1518 + <script type="module"> 1519 + import foundation from "@diffuse/foundation"; 1520 + import { effect } from "./common/signal.js"; 1521 + 1522 + const components = foundation.features.fillQueueAutomatically(); 1523 + const myHtmlElement = document.querySelector("#now-playing"); 1524 + 1525 + effect(() => { 1526 + const now = components.engine.queue.now(); 1527 + const currentlyPlaying = now ? components.orchestrator.output.tracks.collection().find(t => t.id === now.id) : undefined; 1528 + if (currentlyPlaying && myHtmlElement) { 1529 + myHtmlElement.innerText = \`\${currentlyPlaying.tags.artist} - \${currentlyPlaying.tags.title}\`; 1530 + } 1531 + }) 1532 + <\/script> 1533 + `.trim(), 1534 + extensions: [ 1535 + basicSetup, 1536 + html(), 1537 + css(), 1538 + javascript(), 1539 + autocompletion() 1540 + ] 1541 + }); 1542 + document.querySelector("#build-form")?.addEventListener( 1543 + "submit", 1544 + onBuildSubmit 1545 + ); 1546 + async function onBuildSubmit(event) { 1547 + event.preventDefault(); 1548 + const nameEl = ( 1549 + /** @type {HTMLInputElement | null} */ 1550 + document.querySelector( 1551 + "#name-input" 1552 + ) 1553 + ); 1554 + const descriptionEl = ( 1555 + /** @type {HTMLTextAreaElement | null} */ 1556 + document.querySelector("#description-input") 1557 + ); 1558 + const html2 = editor.state.doc.toString(); 1559 + const cid = await create(85, new TextEncoder().encode(html2)); 1560 + const name = nameEl?.value ?? "nameless"; 1561 + const description = descriptionEl?.value ?? ""; 1562 + const facet = $editingFacet.value ? { 1563 + ...$editingFacet.value, 1564 + cid, 1565 + description, 1566 + html: html2, 1567 + name 1568 + } : { 1569 + $type: "sh.diffuse.output.facet", 1570 + id: now(), 1571 + cid, 1572 + description, 1573 + html: html2, 1574 + name 1575 + }; 1576 + switch ( 1577 + /** @type {any} */ 1578 + event.submitter.name 1579 + ) { 1580 + case "save": 1581 + await saveFacet(facet); 1582 + break; 1583 + case "save+open": 1584 + await saveFacet(facet); 1585 + globalThis.open(`./facets/l/?id=${facet.id}`, "blank"); 1586 + break; 1587 + } 1588 + } 1589 + __name(onBuildSubmit, "onBuildSubmit"); 1590 + async function editFacet(ogFacet) { 1591 + const facet = { ...ogFacet }; 1592 + const nameEl = ( 1593 + /** @type {HTMLInputElement | null} */ 1594 + document.querySelector( 1595 + "#name-input" 1596 + ) 1597 + ); 1598 + const descriptionEl = ( 1599 + /** @type {HTMLTextAreaElement | null} */ 1600 + document.querySelector("#description-input") 1601 + ); 1602 + if (!nameEl) return; 1603 + document.querySelector("#build")?.scrollIntoView(); 1604 + if (!facet.html && facet.uri) { 1605 + const html2 = await loadURI(facet.uri); 1606 + const cid = await create(85, new TextEncoder().encode(html2)); 1607 + facet.html = html2; 1608 + facet.cid = cid; 1609 + } 1610 + $editingFacet.value = facet; 1611 + nameEl.value = facet.name; 1612 + if (descriptionEl) { 1613 + descriptionEl.value = facet.description ?? ""; 1614 + } 1615 + editor.dispatch({ 1616 + changes: { from: 0, to: editor.state.doc.length, insert: facet.html } 1617 + }); 1618 + } 1619 + __name(editFacet, "editFacet"); 1620 + async function saveFacet(facet) { 1621 + const col = output.facets.collection(); 1622 + const colWithoutId = col.filter((c) => c.id !== facet.id); 1623 + await output.facets.save([...colWithoutId, { 1624 + ...facet, 1625 + updatedAt: (/* @__PURE__ */ new Date()).toISOString() 1626 + }]); 1627 + } 1628 + __name(saveFacet, "saveFacet"); 1629 + /*! Bundled license information: 1630 + 1631 + lit-html/node/directives/unsafe-html.js: 1632 + (** 1633 + * @license 1634 + * Copyright 2017 Google LLC 1635 + * SPDX-License-Identifier: BSD-3-Clause 1636 + *) 1637 + */ 1638 + 1639 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/facets/index.js.map
··· 1 + {"version":3,"sources":["/index.js","/node_modules/.deno/marked@17.0.3/node_modules/marked/src/defaults.ts","/node_modules/.deno/marked@17.0.3/node_modules/marked/src/rules.ts","/node_modules/.deno/marked@17.0.3/node_modules/marked/src/helpers.ts","/node_modules/.deno/marked@17.0.3/node_modules/marked/src/Tokenizer.ts","/node_modules/.deno/marked@17.0.3/node_modules/marked/src/Lexer.ts","/node_modules/.deno/marked@17.0.3/node_modules/marked/src/Renderer.ts","/node_modules/.deno/marked@17.0.3/node_modules/marked/src/TextRenderer.ts","/node_modules/.deno/marked@17.0.3/node_modules/marked/src/Parser.ts","/node_modules/.deno/marked@17.0.3/node_modules/marked/src/Hooks.ts","/node_modules/.deno/marked@17.0.3/node_modules/marked/src/Instance.ts","/node_modules/.deno/marked@17.0.3/node_modules/marked/src/marked.ts","/node_modules/.deno/lit-html@3.3.2/node_modules/lit-html/src/directives/unsafe-html.ts"],"sourcesContent":["import { html, render } from \"lit-html\";\nimport { keyed } from \"lit-html/directives/keyed.js\";\nimport { marked } from \"marked\";\nimport { unsafeHTML } from \"lit-html/directives/unsafe-html.js\";\n\nimport { basicSetup, EditorView } from \"codemirror\";\nimport { css as langCss } from \"@codemirror/lang-css\";\nimport { html as langHtml } from \"@codemirror/lang-html\";\nimport { javascript as langJs } from \"@codemirror/lang-javascript\";\nimport { autocompletion } from \"@codemirror/autocomplete\";\n\nimport * as TID from \"@atcute/tid\";\n\nimport * as CID from \"@common/cid.js\";\nimport foundation from \"@common/facets/foundation.js\";\nimport { effect, signal } from \"@common/signal.js\";\nimport { facetFromURI } from \"@common/facets/utils.js\";\nimport { nothing } from \"@common/element.js\";\nimport { loadURI } from \"@common/loader.js\";\n\n/**\n * @import {Facet} from \"@definitions/types.d.ts\"\n */\n\n////////////////////////////////////////////\n// SAVE & FORK\n////////////////////////////////////////////\n\ndocument.body.addEventListener(\n \"click\",\n /**\n * @param {MouseEvent} event\n */\n async (event) => {\n const target = /** @type {HTMLElement} */ (event.target);\n const rel = target.getAttribute(\"rel\");\n if (!rel) return;\n\n const uri = target.closest(\"li\")?.getAttribute(\"data-uri\");\n if (!uri) return;\n\n const name = target.closest(\"li\")?.getAttribute(\"data-name\");\n if (!name) return;\n\n switch (rel) {\n case \"fork\": {\n const facet = await facetFromURI({ name, uri }, { fetchHTML: true });\n editFacet(facet);\n document.querySelector(\"#build\")?.scrollIntoView();\n break;\n }\n case \"save\": {\n const facet = await facetFromURI({ name, uri }, { fetchHTML: false });\n const out = foundation.orchestrator.output();\n\n out.facets.save([\n ...out.facets.collection(),\n facet,\n ]);\n break;\n }\n }\n },\n);\n\n////////////////////////////////////////////\n// YOUR COLLECTION\n////////////////////////////////////////////\n\n/** @type {HTMLElement | null} */\nconst listEl = document.querySelector(\"#list\");\nif (!listEl) throw new Error(\"List element not found\");\n\nconst output = foundation.orchestrator.output();\n\nlistEl.innerHTML = \"\";\n\neffect(() => {\n const col = output.facets.collection().sort((a, b) => {\n return a.name.toLocaleLowerCase().localeCompare(b.name.toLocaleLowerCase());\n });\n\n const state = output.facets.state();\n\n const h = col.length && state === \"loaded\"\n ? html`\n <ul>\n ${col.map((c) =>\n keyed(\n c.id,\n html`\n <li>\n <div style=\"position: relative;\">\n <a href=\"facets/l/?id=${c.id}\">\n ${c.name}\n </a>\n <button\n class=\"button--fixed button--transparent\"\n popovertarget=\"facet-menu-col-${c.id}\"\n style=\"anchor-name: --facet-anchor-col-${c\n .id}; position: absolute; right: 0; top: 50%; transform: translateY(-50%);\"\n >\n <i class=\"ph-fill ph-dots-three-circle\"></i>\n </button>\n </div>\n <div class=\"list-description\">\n <div>\n ${c.description?.trim().length\n ? unsafeHTML(\n marked.parse(c.description, { async: false }),\n )\n : nothing}\n </div>\n <div>\n ${c.uri && !c.html\n ? html`\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-binoculars\"></i>\n <span>Tracking the original <a href=\"${c\n .uri}\">URI</a></span>\n </span>\n `\n : html`\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-code\"></i>\n <span>Custom code</span>\n </span>\n `}\n </div>\n </div>\n\n <!-- Dropdown Menu -->\n <div\n id=\"facet-menu-col-${c.id}\"\n class=\"dropdown\"\n style=\"position-anchor: --facet-anchor-col-${c.id}\"\n popover\n >\n <a href=\"facets/l/?id=${c.id}\">\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-globe\"></i> Open\n </span>\n </a>\n <a @click=\"${() => editFacet(c)}\">\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-cursor-text\"></i> Edit\n </span>\n </a>\n <a @click=\"${deleteFacet({ id: c.id })}\">\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-eraser\"></i> Delete\n </span>\n </a>\n </div>\n </li>\n `,\n )\n )}\n </ul>\n `\n : state === \"loaded\"\n ? emptyFacetsList\n : html`\n <div class=\"with-icon\" style=\"font-size: var(--fs-sm);\">\n <i class=\"ph-bold ph-spinner-gap\"></i>\n Loading items\n </div>\n `;\n\n render(h, listEl);\n});\n\nconst emptyFacetsList = html`\n <p style=\"margin-bottom: 0;\">\n <i class=\"ph-fill ph-info\"></i> You have not saved any facets yet.\n </p>\n`;\n\n/**\n * @param {{ id: string }} _\n */\nfunction deleteFacet({ id }) {\n return () => {\n const c = confirm(\"Are you sure you want to delete this facet?\");\n if (!c) return;\n\n output.facets.save(\n output.facets.collection().filter((c) => !(c.id === id)),\n );\n };\n}\n\n////////////////////////////////////////////\n// BUILD\n////////////////////////////////////////////\n\nconst $editingFacet = signal(/** @type {Facet | null} */ (null));\n\n// Code editor\nconst editorContainer = document.body.querySelector(\"#html-input-container\");\nif (!editorContainer) throw new Error(\"Editor container not found\");\n\nconst editor = new EditorView({\n parent: editorContainer,\n doc: `\n<main>\n <h1 id=\"now-playing\">\n Waiting on tracks &amp; queue to load ...\n </h1>\n</main>\n\n<style>\n @import \"./styles/base.css\";\n @import \"./styles/diffuse/page.css\";\n</style>\n\n<script type=\"module\">\n import foundation from \"@diffuse/foundation\";\n import { effect } from \"./common/signal.js\";\n\n const components = foundation.features.fillQueueAutomatically();\n const myHtmlElement = document.querySelector(\"#now-playing\");\n\n effect(() => {\n const now = components.engine.queue.now();\n const currentlyPlaying = now ? components.orchestrator.output.tracks.collection().find(t => t.id === now.id) : undefined;\n if (currentlyPlaying && myHtmlElement) {\n myHtmlElement.innerText = \\`\\$\\{currentlyPlaying.tags.artist} - \\$\\{currentlyPlaying.tags.title}\\`;\n }\n })\n</script>\n `.trim(),\n extensions: [\n basicSetup,\n langHtml(),\n langCss(),\n langJs(),\n autocompletion(),\n ],\n});\n\n// Form submit\ndocument.querySelector(\"#build-form\")?.addEventListener(\n \"submit\",\n onBuildSubmit,\n);\n\n/**\n * @param {Event} event\n */\nasync function onBuildSubmit(event) {\n event.preventDefault();\n\n const nameEl = /** @type {HTMLInputElement | null} */ (document.querySelector(\n \"#name-input\",\n ));\n\n const descriptionEl = /** @type {HTMLTextAreaElement | null} */ (\n document.querySelector(\"#description-input\")\n );\n\n const html = editor.state.doc.toString();\n const cid = await CID.create(0x55, new TextEncoder().encode(html));\n const name = nameEl?.value ?? \"nameless\";\n const description = descriptionEl?.value ?? \"\";\n\n /** @type {Facet} */\n const facet = $editingFacet.value\n ? {\n ...$editingFacet.value,\n cid,\n description,\n html,\n name,\n }\n : {\n $type: \"sh.diffuse.output.facet\",\n id: TID.now(),\n cid,\n description,\n html,\n name,\n };\n\n switch (/** @type {any} */ (event).submitter.name) {\n case \"save\":\n await saveFacet(facet);\n break;\n case \"save+open\":\n await saveFacet(facet);\n globalThis.open(`./facets/l/?id=${facet.id}`, \"blank\");\n break;\n }\n}\n\n/**\n * @param {Facet} ogFacet\n */\nasync function editFacet(ogFacet) {\n const facet = { ...ogFacet };\n const nameEl = /** @type {HTMLInputElement | null} */ (document.querySelector(\n \"#name-input\",\n ));\n\n const descriptionEl = /** @type {HTMLTextAreaElement | null} */ (\n document.querySelector(\"#description-input\")\n );\n\n if (!nameEl) return;\n\n // Scroll to builder\n document.querySelector(\"#build\")?.scrollIntoView();\n\n // Make sure HTML is loaded\n if (!facet.html && facet.uri) {\n const html = await loadURI(facet.uri);\n const cid = await CID.create(0x55, new TextEncoder().encode(html));\n\n facet.html = html;\n facet.cid = cid;\n }\n\n $editingFacet.value = facet;\n nameEl.value = facet.name;\n\n if (descriptionEl) {\n descriptionEl.value = facet.description ?? \"\";\n }\n\n editor.dispatch({\n changes: { from: 0, to: editor.state.doc.length, insert: facet.html },\n });\n}\n\n/**\n * @param {Facet} facet\n */\nasync function saveFacet(facet) {\n const col = output.facets.collection();\n const colWithoutId = col.filter((c) => c.id !== facet.id);\n await output.facets.save([...colWithoutId, {\n ...facet,\n updatedAt: new Date().toISOString(),\n }]);\n}\n","import type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Gets the original marked default options.\n */\nexport function _getDefaults<ParserOutput = string, RendererOutput = string>(): MarkedOptions<ParserOutput, RendererOutput> {\n return {\n async: false,\n breaks: false,\n extensions: null,\n gfm: true,\n hooks: null,\n pedantic: false,\n renderer: null,\n silent: false,\n tokenizer: null,\n walkTokens: null,\n };\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport let _defaults: MarkedOptions<any, any> = _getDefaults();\n\nexport function changeDefaults<ParserOutput = string, RendererOutput = string>(newDefaults: MarkedOptions<ParserOutput, RendererOutput>) {\n _defaults = newDefaults;\n}\n","const noopTest = { exec: () => null } as unknown as RegExp;\n\nfunction edit(regex: string | RegExp, opt = '') {\n let source = typeof regex === 'string' ? regex : regex.source;\n const obj = {\n replace: (name: string | RegExp, val: string | RegExp) => {\n let valSource = typeof val === 'string' ? val : val.source;\n valSource = valSource.replace(other.caret, '$1');\n source = source.replace(name, valSource);\n return obj;\n },\n getRegex: () => {\n return new RegExp(source, opt);\n },\n };\n return obj;\n}\n\nconst supportsLookbehind = (() => {\ntry {\n // eslint-disable-next-line prefer-regex-literals\n return !!new RegExp('(?<=1)(?<!1)');\n} catch {\n // See browser support here:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Lookbehind_assertion\n return false;\n}\n})();\n\nexport const other = {\n codeRemoveIndent: /^(?: {1,4}| {0,3}\\t)/gm,\n outputLinkReplace: /\\\\([\\[\\]])/g,\n indentCodeCompensation: /^(\\s+)(?:```)/,\n beginningSpace: /^\\s+/,\n endingHash: /#$/,\n startingSpaceChar: /^ /,\n endingSpaceChar: / $/,\n nonSpaceChar: /[^ ]/,\n newLineCharGlobal: /\\n/g,\n tabCharGlobal: /\\t/g,\n multipleSpaceGlobal: /\\s+/g,\n blankLine: /^[ \\t]*$/,\n doubleBlankLine: /\\n[ \\t]*\\n[ \\t]*$/,\n blockquoteStart: /^ {0,3}>/,\n blockquoteSetextReplace: /\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,\n blockquoteSetextReplace2: /^ {0,3}>[ \\t]?/gm,\n listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g,\n listIsTask: /^\\[[ xX]\\] +\\S/,\n listReplaceTask: /^\\[[ xX]\\] +/,\n listTaskCheckbox: /\\[[ xX]\\]/,\n anyLine: /\\n.*\\n/,\n hrefBrackets: /^<(.*)>$/,\n tableDelimiter: /[:|]/,\n tableAlignChars: /^\\||\\| *$/g,\n tableRowBlankLine: /\\n[ \\t]*$/,\n tableAlignRight: /^ *-+: *$/,\n tableAlignCenter: /^ *:-+: *$/,\n tableAlignLeft: /^ *:-+ *$/,\n startATag: /^<a /i,\n endATag: /^<\\/a>/i,\n startPreScriptTag: /^<(pre|code|kbd|script)(\\s|>)/i,\n endPreScriptTag: /^<\\/(pre|code|kbd|script)(\\s|>)/i,\n startAngleBracket: /^</,\n endAngleBracket: />$/,\n pedanticHrefTitle: /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,\n unicodeAlphaNumeric: /[\\p{L}\\p{N}]/u,\n escapeTest: /[&<>\"']/,\n escapeReplace: /[&<>\"']/g,\n escapeTestNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,\n escapeReplaceNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,\n unescapeTest: /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig,\n caret: /(^|[^\\[])\\^/g,\n percentDecode: /%25/g,\n findPipe: /\\|/g,\n splitPipe: / \\|/,\n slashPipe: /\\\\\\|/g,\n carriageReturn: /\\r\\n|\\r/g,\n spaceLine: /^ +$/gm,\n notSpaceStart: /^\\S*/,\n endingNewline: /\\n$/,\n listItemRegex: (bull: string) => new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`),\n nextBulletRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`),\n hrRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`),\n fencesBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\\`\\`\\`|~~~)`),\n headingBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`),\n htmlBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}<(?:[a-z].*>|!--)`, 'i'),\n blockquoteBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}>`),\n};\n\n/**\n * Block-Level Grammar\n */\n\nconst newline = /^(?:[ \\t]*(?:\\n|$))+/;\nconst blockCode = /^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/;\nconst fences = /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/;\nconst hr = /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/;\nconst heading = /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/;\nconst bullet = / {0,3}(?:[*+-]|\\d{1,9}[.)])/;\nconst lheadingCore = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/;\nconst lheading = edit(lheadingCore)\n .replace(/bull/g, bullet) // lists can interrupt\n .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code blocks can interrupt\n .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n .replace(/heading/g, / {0,3}#{1,6}/) // ATX heading can interrupt\n .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n .replace(/\\|table/g, '') // table not in commonmark\n .getRegex();\nconst lheadingGfm = edit(lheadingCore)\n .replace(/bull/g, bullet) // lists can interrupt\n .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code blocks can interrupt\n .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n .replace(/heading/g, / {0,3}#{1,6}/) // ATX heading can interrupt\n .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n .replace(/table/g, / {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/) // table can interrupt\n .getRegex();\nconst _paragraph = /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/;\nconst blockText = /^[^\\n]+/;\nconst _blockLabel = /(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/;\nconst def = edit(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/)\n .replace('label', _blockLabel)\n .replace('title', /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/)\n .getRegex();\n\nconst list = edit(/^(bull)([ \\t][^\\n]+?)?(?:\\n|$)/)\n .replace(/bull/g, bullet)\n .getRegex();\n\nconst _tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n + '|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title'\n + '|tr|track|ul';\nconst _comment = /<!--(?:-?>|[\\s\\S]*?(?:-->|$))/;\nconst html = edit(\n '^ {0,3}(?:' // optional indentation\n+ '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)' // (1)\n+ '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n+ '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n+ '|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)' // (4)\n+ '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)' // (5)\n+ '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (6)\n+ '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) open tag\n+ '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) closing tag\n+ ')', 'i')\n .replace('comment', _comment)\n .replace('tag', _tag)\n .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n .getRegex();\n\nconst paragraph = edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)])[ \\\\t]') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n .getRegex();\n\nconst blockquote = edit(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/)\n .replace('paragraph', paragraph)\n .getRegex();\n\n/**\n * Normal Block Grammar\n */\n\nconst blockNormal = {\n blockquote,\n code: blockCode,\n def,\n fences,\n heading,\n hr,\n html,\n lheading,\n list,\n newline,\n paragraph,\n table: noopTest,\n text: blockText,\n};\n\ntype BlockKeys = keyof typeof blockNormal;\n\n/**\n * GFM Block Grammar\n */\n\nconst gfmTable = edit(\n '^ *([^\\\\n ].*)\\\\n' // Header\n+ ' {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)' // Align\n+ '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)') // Cells\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('blockquote', ' {0,3}>')\n .replace('code', '(?: {4}| {0,3}\\t)[^\\\\n]')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)])[ \\\\t]') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // tables can be interrupted by type (6) html blocks\n .getRegex();\n\nconst blockGfm: Record<BlockKeys, RegExp> = {\n ...blockNormal,\n lheading: lheadingGfm,\n table: gfmTable,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n .replace('table', gfmTable) // interrupt paragraphs with table\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)])[ \\\\t]') // only lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n .getRegex(),\n};\n\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\n\nconst blockPedantic: Record<BlockKeys, RegExp> = {\n ...blockNormal,\n html: edit(\n '^ *(?:comment *(?:\\\\n|\\\\s*$)'\n + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n .replace('comment', _comment)\n .replace(/tag/g, '(?!(?:'\n + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n .getRegex(),\n def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n fences: noopTest, // fences not supported\n lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' *#{1,6} *[^\\n]')\n .replace('lheading', lheading)\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('|fences', '')\n .replace('|list', '')\n .replace('|html', '')\n .replace('|tag', '')\n .getRegex(),\n};\n\n/**\n * Inline-Level Grammar\n */\n\nconst escape = /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/;\nconst inlineCode = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nconst br = /^( {2,}|\\\\)\\n(?!\\s*$)/;\nconst inlineText = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\n\n// list of unicode punctuation marks, plus any missing characters from CommonMark spec\nconst _punctuation = /[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpace = /[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpace = /[^\\s\\p{P}\\p{S}]/u;\nconst punctuation = edit(/^((?![*_])punctSpace)/, 'u')\n .replace(/punctSpace/g, _punctuationOrSpace).getRegex();\n\n// GFM allows ~ inside strong and em for strikethrough\nconst _punctuationGfmStrongEm = /(?!~)[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpaceGfmStrongEm = /(?!~)[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpaceGfmStrongEm = /(?:[^\\s\\p{P}\\p{S}]|~)/u;\n\n// GFM allows * and _ inside strikethrough\nconst _punctuationGfmDel = /(?![*_])[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpaceGfmDel = /(?![*_])[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpaceGfmDel = /(?:[^\\s\\p{P}\\p{S}]|[*_])/u;\n\n// sequences em should skip over [title](link), `code`, <html>\nconst blockSkip = edit(/link|precode-code|html/, 'g')\n .replace('link', /\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/)\n .replace('precode-', supportsLookbehind ? '(?<!`)()' : '(^^|[^`])')\n .replace('code', /(?<b>`+)[^`]+\\k<b>(?!`)/)\n .replace('html', /<(?! )[^<>]*?>/)\n .getRegex();\n\nconst emStrongLDelimCore = /^(?:\\*+(?:((?!\\*)punct)|[^\\s*]))|^_+(?:((?!_)punct)|([^\\s_]))/;\n\nconst emStrongLDelim = edit(emStrongLDelimCore, 'u')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst emStrongLDelimGfm = edit(emStrongLDelimCore, 'u')\n .replace(/punct/g, _punctuationGfmStrongEm)\n .getRegex();\n\nconst emStrongRDelimAstCore =\n '^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)' // Skip orphan inside strong\n+ '|[^*]+(?=[^*])' // Consume to delim\n+ '|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)' // (1) #*** can only be a Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)' // (2) a***#, a*** can only be a Right Delimiter\n+ '|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)' // (3) #***a, ***a can only be Left Delimiter\n+ '|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)' // (4) ***# can only be Left Delimiter\n+ '|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)' // (5) #***# can be either Left or Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?=notPunctSpace)'; // (6) a***a can be either Left or Right Delimiter\n\nconst emStrongRDelimAst = edit(emStrongRDelimAstCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst emStrongRDelimAstGfm = edit(emStrongRDelimAstCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpaceGfmStrongEm)\n .replace(/punctSpace/g, _punctuationOrSpaceGfmStrongEm)\n .replace(/punct/g, _punctuationGfmStrongEm)\n .getRegex();\n\n// (6) Not allowed for _\nconst emStrongRDelimUnd = edit(\n '^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)' // Skip orphan inside strong\n+ '|[^_]+(?=[^_])' // Consume to delim\n+ '|(?!_)punct(_+)(?=[\\\\s]|$)' // (1) #___ can only be a Right Delimiter\n+ '|notPunctSpace(_+)(?!_)(?=punctSpace|$)' // (2) a___#, a___ can only be a Right Delimiter\n+ '|(?!_)punctSpace(_+)(?=notPunctSpace)' // (3) #___a, ___a can only be Left Delimiter\n+ '|[\\\\s](_+)(?!_)(?=punct)' // (4) ___# can only be Left Delimiter\n+ '|(?!_)punct(_+)(?!_)(?=punct)', 'gu') // (5) #___# can be either Left or Right Delimiter\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\n// Tilde left delimiter for strikethrough (similar to emStrongLDelim for asterisk)\nconst delLDelim = edit(/^~~?(?:((?!~)punct)|[^\\s~])/, 'u')\n .replace(/punct/g, _punctuationGfmDel)\n .getRegex();\n\n// Tilde delimiter patterns for strikethrough (similar to asterisk)\nconst delRDelimCore =\n '^[^~]+(?=[^~])' // Consume to delim\n+ '|(?!~)punct(~~?)(?=[\\\\s]|$)' // (1) #~~ can only be a Right Delimiter\n+ '|notPunctSpace(~~?)(?!~)(?=punctSpace|$)' // (2) a~~#, a~~ can only be a Right Delimiter\n+ '|(?!~)punctSpace(~~?)(?=notPunctSpace)' // (3) #~~a, ~~a can only be Left Delimiter\n+ '|[\\\\s](~~?)(?!~)(?=punct)' // (4) ~~# can only be Left Delimiter\n+ '|(?!~)punct(~~?)(?!~)(?=punct)' // (5) #~~# can be either Left or Right Delimiter\n+ '|notPunctSpace(~~?)(?=notPunctSpace)'; // (6) a~~a can be either Left or Right Delimiter\n\nconst delRDelim = edit(delRDelimCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpaceGfmDel)\n .replace(/punctSpace/g, _punctuationOrSpaceGfmDel)\n .replace(/punct/g, _punctuationGfmDel)\n .getRegex();\n\nconst anyPunctuation = edit(/\\\\(punct)/, 'gu')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst autolink = edit(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/)\n .replace('scheme', /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/)\n .replace('email', /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/)\n .getRegex();\n\nconst _inlineComment = edit(_comment).replace('(?:-->|$)', '-->').getRegex();\nconst tag = edit(\n '^comment'\n + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>') // CDATA section\n .replace('comment', _inlineComment)\n .replace('attribute', /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/)\n .getRegex();\n\nconst _inlineLabel = /(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+[^`]*?`+(?!`)|[^\\[\\]\\\\`])*?/;\n\nconst link = edit(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]*(?:\\n[ \\t]*)?)(title))?\\s*\\)/)\n .replace('label', _inlineLabel)\n .replace('href', /<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]*/)\n .replace('title', /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/)\n .getRegex();\n\nconst reflink = edit(/^!?\\[(label)\\]\\[(ref)\\]/)\n .replace('label', _inlineLabel)\n .replace('ref', _blockLabel)\n .getRegex();\n\nconst nolink = edit(/^!?\\[(ref)\\](?:\\[\\])?/)\n .replace('ref', _blockLabel)\n .getRegex();\n\nconst reflinkSearch = edit('reflink|nolink(?!\\\\()', 'g')\n .replace('reflink', reflink)\n .replace('nolink', nolink)\n .getRegex();\n\nconst _caseInsensitiveProtocol = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/;\n\n/**\n * Normal Inline Grammar\n */\n\nconst inlineNormal = {\n _backpedal: noopTest, // only used for GFM url\n anyPunctuation,\n autolink,\n blockSkip,\n br,\n code: inlineCode,\n del: noopTest,\n delLDelim: noopTest,\n delRDelim: noopTest,\n emStrongLDelim,\n emStrongRDelimAst,\n emStrongRDelimUnd,\n escape,\n link,\n nolink,\n punctuation,\n reflink,\n reflinkSearch,\n tag,\n text: inlineText,\n url: noopTest,\n};\n\ntype InlineKeys = keyof typeof inlineNormal;\n\n/**\n * Pedantic Inline Grammar\n */\n\nconst inlinePedantic: Record<InlineKeys, RegExp> = {\n ...inlineNormal,\n link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n .replace('label', _inlineLabel)\n .getRegex(),\n reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n .replace('label', _inlineLabel)\n .getRegex(),\n};\n\n/**\n * GFM Inline Grammar\n */\n\nconst inlineGfm: Record<InlineKeys, RegExp> = {\n ...inlineNormal,\n emStrongRDelimAst: emStrongRDelimAstGfm,\n emStrongLDelim: emStrongLDelimGfm,\n delLDelim,\n delRDelim,\n url: edit(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/)\n .replace('protocol', _caseInsensitiveProtocol)\n .replace('email', /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/)\n .getRegex(),\n _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n del: /^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,\n text: edit(/^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/)\n .replace('protocol', _caseInsensitiveProtocol)\n .getRegex(),\n};\n\n/**\n * GFM + Line Breaks Inline Grammar\n */\n\nconst inlineBreaks: Record<InlineKeys, RegExp> = {\n ...inlineGfm,\n br: edit(br).replace('{2,}', '*').getRegex(),\n text: edit(inlineGfm.text)\n .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n .replace(/\\{2,\\}/g, '*')\n .getRegex(),\n};\n\n/**\n * exports\n */\n\nexport const block = {\n normal: blockNormal,\n gfm: blockGfm,\n pedantic: blockPedantic,\n};\n\nexport const inline = {\n normal: inlineNormal,\n gfm: inlineGfm,\n breaks: inlineBreaks,\n pedantic: inlinePedantic,\n};\n\nexport interface Rules {\n other: typeof other\n block: Record<BlockKeys, RegExp>\n inline: Record<InlineKeys, RegExp>\n}\n","import { other } from './rules.ts';\n\n/**\n * Helpers\n */\nconst escapeReplacements: { [index: string]: string } = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n};\nconst getEscapeReplacement = (ch: string) => escapeReplacements[ch];\n\nexport function escape(html: string, encode?: boolean) {\n if (encode) {\n if (other.escapeTest.test(html)) {\n return html.replace(other.escapeReplace, getEscapeReplacement);\n }\n } else {\n if (other.escapeTestNoEncode.test(html)) {\n return html.replace(other.escapeReplaceNoEncode, getEscapeReplacement);\n }\n }\n\n return html;\n}\n\nexport function unescape(html: string) {\n // explicitly match decimal, hex, and named HTML entities\n return html.replace(other.unescapeTest, (_, n) => {\n n = n.toLowerCase();\n if (n === 'colon') return ':';\n if (n.charAt(0) === '#') {\n return n.charAt(1) === 'x'\n ? String.fromCharCode(parseInt(n.substring(2), 16))\n : String.fromCharCode(+n.substring(1));\n }\n return '';\n });\n}\n\nexport function cleanUrl(href: string) {\n try {\n href = encodeURI(href).replace(other.percentDecode, '%');\n } catch {\n return null;\n }\n return href;\n}\n\nexport function splitCells(tableRow: string, count?: number) {\n // ensure that every cell-delimiting pipe has a space\n // before it to distinguish it from an escaped pipe\n const row = tableRow.replace(other.findPipe, (match, offset, str) => {\n let escaped = false;\n let curr = offset;\n while (--curr >= 0 && str[curr] === '\\\\') escaped = !escaped;\n if (escaped) {\n // odd number of slashes means | is escaped\n // so we leave it alone\n return '|';\n } else {\n // add space before unescaped |\n return ' |';\n }\n }),\n cells = row.split(other.splitPipe);\n let i = 0;\n\n // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n if (!cells[0].trim()) {\n cells.shift();\n }\n if (cells.length > 0 && !cells.at(-1)?.trim()) {\n cells.pop();\n }\n\n if (count) {\n if (cells.length > count) {\n cells.splice(count);\n } else {\n while (cells.length < count) cells.push('');\n }\n }\n\n for (; i < cells.length; i++) {\n // leading or trailing whitespace is ignored per the gfm spec\n cells[i] = cells[i].trim().replace(other.slashPipe, '|');\n }\n return cells;\n}\n\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param str\n * @param c\n * @param invert Remove suffix of non-c chars instead. Default falsey.\n */\nexport function rtrim(str: string, c: string, invert?: boolean) {\n const l = str.length;\n if (l === 0) {\n return '';\n }\n\n // Length of suffix matching the invert condition.\n let suffLen = 0;\n\n // Step left until we fail to match the invert condition.\n while (suffLen < l) {\n const currChar = str.charAt(l - suffLen - 1);\n if (currChar === c && !invert) {\n suffLen++;\n } else if (currChar !== c && invert) {\n suffLen++;\n } else {\n break;\n }\n }\n\n return str.slice(0, l - suffLen);\n}\n\nexport function findClosingBracket(str: string, b: string) {\n if (str.indexOf(b[1]) === -1) {\n return -1;\n }\n\n let level = 0;\n for (let i = 0; i < str.length; i++) {\n if (str[i] === '\\\\') {\n i++;\n } else if (str[i] === b[0]) {\n level++;\n } else if (str[i] === b[1]) {\n level--;\n if (level < 0) {\n return i;\n }\n }\n }\n if (level > 0) {\n return -2;\n }\n\n return -1;\n}\n\nexport function expandTabs(line: string, indent = 0) {\n let col = indent;\n let expanded = '';\n for (const char of line) {\n if (char === '\\t') {\n const added = 4 - (col % 4);\n expanded += ' '.repeat(added);\n col += added;\n } else {\n expanded += char;\n col++;\n }\n }\n\n return expanded;\n}\n","import { _defaults } from './defaults.ts';\nimport {\n rtrim,\n splitCells,\n findClosingBracket,\n expandTabs,\n} from './helpers.ts';\nimport type { Rules } from './rules.ts';\nimport type { _Lexer } from './Lexer.ts';\nimport type { Links, Tokens, Token } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\nfunction outputLink(cap: string[], link: Pick<Tokens.Link, 'href' | 'title'>, raw: string, lexer: _Lexer, rules: Rules): Tokens.Link | Tokens.Image {\n const href = link.href;\n const title = link.title || null;\n const text = cap[1].replace(rules.other.outputLinkReplace, '$1');\n\n lexer.state.inLink = true;\n const token: Tokens.Link | Tokens.Image = {\n type: cap[0].charAt(0) === '!' ? 'image' : 'link',\n raw,\n href,\n title,\n text,\n tokens: lexer.inlineTokens(text),\n };\n lexer.state.inLink = false;\n return token;\n}\n\nfunction indentCodeCompensation(raw: string, text: string, rules: Rules) {\n const matchIndentToCode = raw.match(rules.other.indentCodeCompensation);\n\n if (matchIndentToCode === null) {\n return text;\n }\n\n const indentToCode = matchIndentToCode[1];\n\n return text\n .split('\\n')\n .map(node => {\n const matchIndentInNode = node.match(rules.other.beginningSpace);\n if (matchIndentInNode === null) {\n return node;\n }\n\n const [indentInNode] = matchIndentInNode;\n\n if (indentInNode.length >= indentToCode.length) {\n return node.slice(indentToCode.length);\n }\n\n return node;\n })\n .join('\\n');\n}\n\n/**\n * Tokenizer\n */\nexport class _Tokenizer<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n rules!: Rules; // set by the lexer\n lexer!: _Lexer<ParserOutput, RendererOutput>; // set by the lexer\n\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n }\n\n space(src: string): Tokens.Space | undefined {\n const cap = this.rules.block.newline.exec(src);\n if (cap && cap[0].length > 0) {\n return {\n type: 'space',\n raw: cap[0],\n };\n }\n }\n\n code(src: string): Tokens.Code | undefined {\n const cap = this.rules.block.code.exec(src);\n if (cap) {\n const text = cap[0].replace(this.rules.other.codeRemoveIndent, '');\n return {\n type: 'code',\n raw: cap[0],\n codeBlockStyle: 'indented',\n text: !this.options.pedantic\n ? rtrim(text, '\\n')\n : text,\n };\n }\n }\n\n fences(src: string): Tokens.Code | undefined {\n const cap = this.rules.block.fences.exec(src);\n if (cap) {\n const raw = cap[0];\n const text = indentCodeCompensation(raw, cap[3] || '', this.rules);\n\n return {\n type: 'code',\n raw,\n lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, '$1') : cap[2],\n text,\n };\n }\n }\n\n heading(src: string): Tokens.Heading | undefined {\n const cap = this.rules.block.heading.exec(src);\n if (cap) {\n let text = cap[2].trim();\n\n // remove trailing #s\n if (this.rules.other.endingHash.test(text)) {\n const trimmed = rtrim(text, '#');\n if (this.options.pedantic) {\n text = trimmed.trim();\n } else if (!trimmed || this.rules.other.endingSpaceChar.test(trimmed)) {\n // CommonMark requires space before trailing #s\n text = trimmed.trim();\n }\n }\n\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[1].length,\n text,\n tokens: this.lexer.inline(text),\n };\n }\n }\n\n hr(src: string): Tokens.Hr | undefined {\n const cap = this.rules.block.hr.exec(src);\n if (cap) {\n return {\n type: 'hr',\n raw: rtrim(cap[0], '\\n'),\n };\n }\n }\n\n blockquote(src: string): Tokens.Blockquote | undefined {\n const cap = this.rules.block.blockquote.exec(src);\n if (cap) {\n let lines = rtrim(cap[0], '\\n').split('\\n');\n let raw = '';\n let text = '';\n const tokens: Token[] = [];\n\n while (lines.length > 0) {\n let inBlockquote = false;\n const currentLines = [];\n\n let i;\n for (i = 0; i < lines.length; i++) {\n // get lines up to a continuation\n if (this.rules.other.blockquoteStart.test(lines[i])) {\n currentLines.push(lines[i]);\n inBlockquote = true;\n } else if (!inBlockquote) {\n currentLines.push(lines[i]);\n } else {\n break;\n }\n }\n lines = lines.slice(i);\n\n const currentRaw = currentLines.join('\\n');\n const currentText = currentRaw\n // precede setext continuation with 4 spaces so it isn't a setext\n .replace(this.rules.other.blockquoteSetextReplace, '\\n $1')\n .replace(this.rules.other.blockquoteSetextReplace2, '');\n raw = raw ? `${raw}\\n${currentRaw}` : currentRaw;\n text = text ? `${text}\\n${currentText}` : currentText;\n\n // parse blockquote lines as top level tokens\n // merge paragraphs if this is a continuation\n const top = this.lexer.state.top;\n this.lexer.state.top = true;\n this.lexer.blockTokens(currentText, tokens, true);\n this.lexer.state.top = top;\n\n // if there is no continuation then we are done\n if (lines.length === 0) {\n break;\n }\n\n const lastToken = tokens.at(-1);\n\n if (lastToken?.type === 'code') {\n // blockquote continuation cannot be preceded by a code block\n break;\n } else if (lastToken?.type === 'blockquote') {\n // include continuation in nested blockquote\n const oldToken = lastToken as Tokens.Blockquote;\n const newText = oldToken.raw + '\\n' + lines.join('\\n');\n const newToken = this.blockquote(newText)!;\n tokens[tokens.length - 1] = newToken;\n\n raw = raw.substring(0, raw.length - oldToken.raw.length) + newToken.raw;\n text = text.substring(0, text.length - oldToken.text.length) + newToken.text;\n break;\n } else if (lastToken?.type === 'list') {\n // include continuation in nested list\n const oldToken = lastToken as Tokens.List;\n const newText = oldToken.raw + '\\n' + lines.join('\\n');\n const newToken = this.list(newText)!;\n tokens[tokens.length - 1] = newToken;\n\n raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw;\n text = text.substring(0, text.length - oldToken.raw.length) + newToken.raw;\n lines = newText.substring(tokens.at(-1)!.raw.length).split('\\n');\n continue;\n }\n }\n\n return {\n type: 'blockquote',\n raw,\n tokens,\n text,\n };\n }\n }\n\n list(src: string): Tokens.List | undefined {\n let cap = this.rules.block.list.exec(src);\n if (cap) {\n let bull = cap[1].trim();\n const isordered = bull.length > 1;\n\n const list: Tokens.List = {\n type: 'list',\n raw: '',\n ordered: isordered,\n start: isordered ? +bull.slice(0, -1) : '',\n loose: false,\n items: [],\n };\n\n bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n\n if (this.options.pedantic) {\n bull = isordered ? bull : '[*+-]';\n }\n\n // Get next list item\n const itemRegex = this.rules.other.listItemRegex(bull);\n let endsWithBlankLine = false;\n // Check if current bullet point can start a new List Item\n while (src) {\n let endEarly = false;\n let raw = '';\n let itemContents = '';\n if (!(cap = itemRegex.exec(src))) {\n break;\n }\n\n if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n break;\n }\n\n raw = cap[0];\n src = src.substring(raw.length);\n\n let line = expandTabs(cap[2].split('\\n', 1)[0], cap[1].length);\n let nextLine = src.split('\\n', 1)[0];\n let blankLine = !line.trim();\n\n let indent = 0;\n if (this.options.pedantic) {\n indent = 2;\n itemContents = line.trimStart();\n } else if (blankLine) {\n indent = cap[1].length + 1;\n } else {\n indent = line.search(this.rules.other.nonSpaceChar); // Find first non-space char\n indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n itemContents = line.slice(indent);\n indent += cap[1].length;\n }\n\n if (blankLine && this.rules.other.blankLine.test(nextLine)) { // Items begin with at most one blank line\n raw += nextLine + '\\n';\n src = src.substring(nextLine.length + 1);\n endEarly = true;\n }\n\n if (!endEarly) {\n const nextBulletRegex = this.rules.other.nextBulletRegex(indent);\n const hrRegex = this.rules.other.hrRegex(indent);\n const fencesBeginRegex = this.rules.other.fencesBeginRegex(indent);\n const headingBeginRegex = this.rules.other.headingBeginRegex(indent);\n const htmlBeginRegex = this.rules.other.htmlBeginRegex(indent);\n const blockquoteBeginRegex = this.rules.other.blockquoteBeginRegex(indent);\n\n // Check if following lines should be included in List Item\n while (src) {\n const rawLine = src.split('\\n', 1)[0];\n let nextLineWithoutTabs;\n nextLine = rawLine;\n\n // Re-align to follow commonmark nesting rules\n if (this.options.pedantic) {\n nextLine = nextLine.replace(this.rules.other.listReplaceNesting, ' ');\n nextLineWithoutTabs = nextLine;\n } else {\n nextLineWithoutTabs = nextLine.replace(this.rules.other.tabCharGlobal, ' ');\n }\n\n // End list item if found code fences\n if (fencesBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new heading\n if (headingBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of html block\n if (htmlBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of blockquote\n if (blockquoteBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new bullet\n if (nextBulletRegex.test(nextLine)) {\n break;\n }\n\n // Horizontal rule found\n if (hrRegex.test(nextLine)) {\n break;\n }\n\n if (nextLineWithoutTabs.search(this.rules.other.nonSpaceChar) >= indent || !nextLine.trim()) { // Dedent if possible\n itemContents += '\\n' + nextLineWithoutTabs.slice(indent);\n } else {\n // not enough indentation\n if (blankLine) {\n break;\n }\n\n // paragraph continuation unless last line was a different block level element\n if (line.replace(this.rules.other.tabCharGlobal, ' ').search(this.rules.other.nonSpaceChar) >= 4) { // indented code block\n break;\n }\n if (fencesBeginRegex.test(line)) {\n break;\n }\n if (headingBeginRegex.test(line)) {\n break;\n }\n if (hrRegex.test(line)) {\n break;\n }\n\n itemContents += '\\n' + nextLine;\n }\n\n blankLine = !nextLine.trim();\n\n raw += rawLine + '\\n';\n src = src.substring(rawLine.length + 1);\n line = nextLineWithoutTabs.slice(indent);\n }\n }\n\n if (!list.loose) {\n // If the previous item ended with a blank line, the list is loose\n if (endsWithBlankLine) {\n list.loose = true;\n } else if (this.rules.other.doubleBlankLine.test(raw)) {\n endsWithBlankLine = true;\n }\n }\n\n list.items.push({\n type: 'list_item',\n raw,\n task: !!this.options.gfm && this.rules.other.listIsTask.test(itemContents),\n loose: false,\n text: itemContents,\n tokens: [],\n });\n\n list.raw += raw;\n }\n\n // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n const lastItem = list.items.at(-1);\n if (lastItem) {\n lastItem.raw = lastItem.raw.trimEnd();\n lastItem.text = lastItem.text.trimEnd();\n } else {\n // not a list since there were no items\n return;\n }\n list.raw = list.raw.trimEnd();\n\n // Item child tokens handled here at end because we needed to have the final item to trim it first\n for (const item of list.items) {\n this.lexer.state.top = false;\n item.tokens = this.lexer.blockTokens(item.text, []);\n if (item.task) {\n // Remove checkbox markdown from item tokens\n item.text = item.text.replace(this.rules.other.listReplaceTask, '');\n if (item.tokens[0]?.type === 'text' || item.tokens[0]?.type === 'paragraph') {\n item.tokens[0].raw = item.tokens[0].raw.replace(this.rules.other.listReplaceTask, '');\n item.tokens[0].text = item.tokens[0].text.replace(this.rules.other.listReplaceTask, '');\n for (let i = this.lexer.inlineQueue.length - 1; i >= 0; i--) {\n if (this.rules.other.listIsTask.test(this.lexer.inlineQueue[i].src)) {\n this.lexer.inlineQueue[i].src = this.lexer.inlineQueue[i].src.replace(this.rules.other.listReplaceTask, '');\n break;\n }\n }\n }\n\n const taskRaw = this.rules.other.listTaskCheckbox.exec(item.raw);\n if (taskRaw) {\n const checkboxToken: Tokens.Checkbox = {\n type: 'checkbox',\n raw: taskRaw[0] + ' ',\n checked: taskRaw[0] !== '[ ]',\n };\n item.checked = checkboxToken.checked;\n if (list.loose) {\n if (item.tokens[0] && ['paragraph', 'text'].includes(item.tokens[0].type) && 'tokens' in item.tokens[0] && item.tokens[0].tokens) {\n item.tokens[0].raw = checkboxToken.raw + item.tokens[0].raw;\n item.tokens[0].text = checkboxToken.raw + item.tokens[0].text;\n item.tokens[0].tokens.unshift(checkboxToken);\n } else {\n item.tokens.unshift({\n type: 'paragraph',\n raw: checkboxToken.raw,\n text: checkboxToken.raw,\n tokens: [checkboxToken],\n });\n }\n } else {\n item.tokens.unshift(checkboxToken);\n }\n }\n }\n\n if (!list.loose) {\n // Check if list should be loose\n const spacers = item.tokens.filter(t => t.type === 'space');\n const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => this.rules.other.anyLine.test(t.raw));\n\n list.loose = hasMultipleLineBreaks;\n }\n }\n\n // Set all items to loose if list is loose\n if (list.loose) {\n for (const item of list.items) {\n item.loose = true;\n for (const token of item.tokens) {\n if (token.type === 'text') {\n token.type = 'paragraph';\n }\n }\n }\n }\n\n return list;\n }\n }\n\n html(src: string): Tokens.HTML | undefined {\n const cap = this.rules.block.html.exec(src);\n if (cap) {\n const token: Tokens.HTML = {\n type: 'html',\n block: true,\n raw: cap[0],\n pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',\n text: cap[0],\n };\n return token;\n }\n }\n\n def(src: string): Tokens.Def | undefined {\n const cap = this.rules.block.def.exec(src);\n if (cap) {\n const tag = cap[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, ' ');\n const href = cap[2] ? cap[2].replace(this.rules.other.hrefBrackets, '$1').replace(this.rules.inline.anyPunctuation, '$1') : '';\n const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, '$1') : cap[3];\n return {\n type: 'def',\n tag,\n raw: cap[0],\n href,\n title,\n };\n }\n }\n\n table(src: string): Tokens.Table | undefined {\n const cap = this.rules.block.table.exec(src);\n if (!cap) {\n return;\n }\n\n if (!this.rules.other.tableDelimiter.test(cap[2])) {\n // delimiter row must have a pipe (|) or colon (:) otherwise it is a setext heading\n return;\n }\n\n const headers = splitCells(cap[1]);\n const aligns = cap[2].replace(this.rules.other.tableAlignChars, '').split('|');\n const rows = cap[3]?.trim() ? cap[3].replace(this.rules.other.tableRowBlankLine, '').split('\\n') : [];\n\n const item: Tokens.Table = {\n type: 'table',\n raw: cap[0],\n header: [],\n align: [],\n rows: [],\n };\n\n if (headers.length !== aligns.length) {\n // header and align columns must be equal, rows can be different.\n return;\n }\n\n for (const align of aligns) {\n if (this.rules.other.tableAlignRight.test(align)) {\n item.align.push('right');\n } else if (this.rules.other.tableAlignCenter.test(align)) {\n item.align.push('center');\n } else if (this.rules.other.tableAlignLeft.test(align)) {\n item.align.push('left');\n } else {\n item.align.push(null);\n }\n }\n\n for (let i = 0; i < headers.length; i++) {\n item.header.push({\n text: headers[i],\n tokens: this.lexer.inline(headers[i]),\n header: true,\n align: item.align[i],\n });\n }\n\n for (const row of rows) {\n item.rows.push(splitCells(row, item.header.length).map((cell, i) => {\n return {\n text: cell,\n tokens: this.lexer.inline(cell),\n header: false,\n align: item.align[i],\n };\n }));\n }\n\n return item;\n }\n\n lheading(src: string): Tokens.Heading | undefined {\n const cap = this.rules.block.lheading.exec(src);\n if (cap) {\n return {\n type: 'heading',\n raw: cap[0],\n depth: cap[2].charAt(0) === '=' ? 1 : 2,\n text: cap[1],\n tokens: this.lexer.inline(cap[1]),\n };\n }\n }\n\n paragraph(src: string): Tokens.Paragraph | undefined {\n const cap = this.rules.block.paragraph.exec(src);\n if (cap) {\n const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n ? cap[1].slice(0, -1)\n : cap[1];\n return {\n type: 'paragraph',\n raw: cap[0],\n text,\n tokens: this.lexer.inline(text),\n };\n }\n }\n\n text(src: string): Tokens.Text | undefined {\n const cap = this.rules.block.text.exec(src);\n if (cap) {\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n tokens: this.lexer.inline(cap[0]),\n };\n }\n }\n\n escape(src: string): Tokens.Escape | undefined {\n const cap = this.rules.inline.escape.exec(src);\n if (cap) {\n return {\n type: 'escape',\n raw: cap[0],\n text: cap[1],\n };\n }\n }\n\n tag(src: string): Tokens.Tag | undefined {\n const cap = this.rules.inline.tag.exec(src);\n if (cap) {\n if (!this.lexer.state.inLink && this.rules.other.startATag.test(cap[0])) {\n this.lexer.state.inLink = true;\n } else if (this.lexer.state.inLink && this.rules.other.endATag.test(cap[0])) {\n this.lexer.state.inLink = false;\n }\n if (!this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(cap[0])) {\n this.lexer.state.inRawBlock = true;\n } else if (this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(cap[0])) {\n this.lexer.state.inRawBlock = false;\n }\n\n return {\n type: 'html',\n raw: cap[0],\n inLink: this.lexer.state.inLink,\n inRawBlock: this.lexer.state.inRawBlock,\n block: false,\n text: cap[0],\n };\n }\n }\n\n link(src: string): Tokens.Link | Tokens.Image | undefined {\n const cap = this.rules.inline.link.exec(src);\n if (cap) {\n const trimmedUrl = cap[2].trim();\n if (!this.options.pedantic && this.rules.other.startAngleBracket.test(trimmedUrl)) {\n // commonmark requires matching angle brackets\n if (!(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n return;\n }\n\n // ending angle bracket cannot be escaped\n const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n return;\n }\n } else {\n // find closing parenthesis\n const lastParenIndex = findClosingBracket(cap[2], '()');\n if (lastParenIndex === -2) {\n // more open parens than closed\n return;\n }\n\n if (lastParenIndex > -1) {\n const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n const linkLen = start + cap[1].length + lastParenIndex;\n cap[2] = cap[2].substring(0, lastParenIndex);\n cap[0] = cap[0].substring(0, linkLen).trim();\n cap[3] = '';\n }\n }\n let href = cap[2];\n let title = '';\n if (this.options.pedantic) {\n // split pedantic href and title\n const link = this.rules.other.pedanticHrefTitle.exec(href);\n\n if (link) {\n href = link[1];\n title = link[3];\n }\n } else {\n title = cap[3] ? cap[3].slice(1, -1) : '';\n }\n\n href = href.trim();\n if (this.rules.other.startAngleBracket.test(href)) {\n if (this.options.pedantic && !(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n // pedantic allows starting angle bracket without ending angle bracket\n href = href.slice(1);\n } else {\n href = href.slice(1, -1);\n }\n }\n return outputLink(cap, {\n href: href ? href.replace(this.rules.inline.anyPunctuation, '$1') : href,\n title: title ? title.replace(this.rules.inline.anyPunctuation, '$1') : title,\n }, cap[0], this.lexer, this.rules);\n }\n }\n\n reflink(src: string, links: Links): Tokens.Link | Tokens.Image | Tokens.Text | undefined {\n let cap;\n if ((cap = this.rules.inline.reflink.exec(src))\n || (cap = this.rules.inline.nolink.exec(src))) {\n const linkString = (cap[2] || cap[1]).replace(this.rules.other.multipleSpaceGlobal, ' ');\n const link = links[linkString.toLowerCase()];\n if (!link) {\n const text = cap[0].charAt(0);\n return {\n type: 'text',\n raw: text,\n text,\n };\n }\n return outputLink(cap, link, cap[0], this.lexer, this.rules);\n }\n }\n\n emStrong(src: string, maskedSrc: string, prevChar = ''): Tokens.Em | Tokens.Strong | undefined {\n let match = this.rules.inline.emStrongLDelim.exec(src);\n if (!match) return;\n\n // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n if (match[3] && prevChar.match(this.rules.other.unicodeAlphaNumeric)) return;\n\n const nextChar = match[1] || match[2] || '';\n\n if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below)\n const lLength = [...match[0]].length - 1;\n let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n\n const endReg = match[0][0] === '*' ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;\n endReg.lastIndex = 0;\n\n // Clip maskedSrc to same section of string as src (move to lexer?)\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n while ((match = endReg.exec(maskedSrc)) != null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n if (!rDelim) continue; // skip single * in __abc*abc__\n\n rLength = [...rDelim].length;\n\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\n } else if (match[5] || match[6]) { // either Left or Right Delim\n if (lLength % 3 && !((lLength + rLength) % 3)) {\n midDelimTotal += rLength;\n continue; // CommonMark Emphasis Rules 9-10\n }\n }\n\n delimTotal -= rLength;\n\n if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n // Remove extra characters. *a*** -> *a*\n rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n // char length can be >1 for unicode characters;\n const lastCharLength = [...match[0]][0].length;\n const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n\n // Create `em` if smallest delimiter has odd char count. *a***\n if (Math.min(lLength, rLength) % 2) {\n const text = raw.slice(1, -1);\n return {\n type: 'em',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n\n // Create 'strong' if smallest delimiter has even char count. **a***\n const text = raw.slice(2, -2);\n return {\n type: 'strong',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n }\n }\n\n codespan(src: string): Tokens.Codespan | undefined {\n const cap = this.rules.inline.code.exec(src);\n if (cap) {\n let text = cap[2].replace(this.rules.other.newLineCharGlobal, ' ');\n const hasNonSpaceChars = this.rules.other.nonSpaceChar.test(text);\n const hasSpaceCharsOnBothEnds = this.rules.other.startingSpaceChar.test(text) && this.rules.other.endingSpaceChar.test(text);\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n return {\n type: 'codespan',\n raw: cap[0],\n text,\n };\n }\n }\n\n br(src: string): Tokens.Br | undefined {\n const cap = this.rules.inline.br.exec(src);\n if (cap) {\n return {\n type: 'br',\n raw: cap[0],\n };\n }\n }\n\n del(src: string, maskedSrc: string, prevChar = ''): Tokens.Del | undefined {\n let match = this.rules.inline.delLDelim.exec(src);\n if (!match) return;\n\n const nextChar = match[1] || '';\n\n if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n // unicode Regex counts emoji as 1 char; spread into array for proper count\n const lLength = [...match[0]].length - 1;\n let rDelim, rLength, delimTotal = lLength;\n\n const endReg = this.rules.inline.delRDelim;\n endReg.lastIndex = 0;\n\n // Clip maskedSrc to same section of string as src\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n while ((match = endReg.exec(maskedSrc)) != null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n if (!rDelim) continue;\n\n rLength = [...rDelim].length;\n\n if (rLength !== lLength) continue;\n\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\n }\n\n delimTotal -= rLength;\n\n if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n // Remove extra characters\n rLength = Math.min(rLength, rLength + delimTotal);\n // char length can be >1 for unicode characters\n const lastCharLength = [...match[0]][0].length;\n const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n\n // Create del token - only single ~ or double ~~ supported\n const text = raw.slice(lLength, -lLength);\n return {\n type: 'del',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n }\n }\n\n autolink(src: string): Tokens.Link | undefined {\n const cap = this.rules.inline.autolink.exec(src);\n if (cap) {\n let text, href;\n if (cap[2] === '@') {\n text = cap[1];\n href = 'mailto:' + text;\n } else {\n text = cap[1];\n href = text;\n }\n\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text,\n },\n ],\n };\n }\n }\n\n url(src: string): Tokens.Link | undefined {\n let cap;\n if (cap = this.rules.inline.url.exec(src)) {\n let text, href;\n if (cap[2] === '@') {\n text = cap[0];\n href = 'mailto:' + text;\n } else {\n // do extended autolink path validation\n let prevCapZero;\n do {\n prevCapZero = cap[0];\n cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? '';\n } while (prevCapZero !== cap[0]);\n text = cap[0];\n if (cap[1] === 'www.') {\n href = 'http://' + cap[0];\n } else {\n href = cap[0];\n }\n }\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text,\n },\n ],\n };\n }\n }\n\n inlineText(src: string): Tokens.Text | undefined {\n const cap = this.rules.inline.text.exec(src);\n if (cap) {\n const escaped = this.lexer.state.inRawBlock;\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n escaped,\n };\n }\n }\n}\n","import { _Tokenizer } from './Tokenizer.ts';\nimport { _defaults } from './defaults.ts';\nimport { other, block, inline } from './rules.ts';\nimport type { Token, TokensList, Tokens } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Block Lexer\n */\nexport class _Lexer<ParserOutput = string, RendererOutput = string> {\n tokens: TokensList;\n options: MarkedOptions<ParserOutput, RendererOutput>;\n state: {\n inLink: boolean;\n inRawBlock: boolean;\n top: boolean;\n };\n\n public inlineQueue: { src: string, tokens: Token[] }[];\n\n private tokenizer: _Tokenizer<ParserOutput, RendererOutput>;\n\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n // TokenList cannot be created in one go\n this.tokens = [] as unknown as TokensList;\n this.tokens.links = Object.create(null);\n this.options = options || _defaults;\n this.options.tokenizer = this.options.tokenizer || new _Tokenizer<ParserOutput, RendererOutput>();\n this.tokenizer = this.options.tokenizer;\n this.tokenizer.options = this.options;\n this.tokenizer.lexer = this;\n this.inlineQueue = [];\n this.state = {\n inLink: false,\n inRawBlock: false,\n top: true,\n };\n\n const rules = {\n other,\n block: block.normal,\n inline: inline.normal,\n };\n\n if (this.options.pedantic) {\n rules.block = block.pedantic;\n rules.inline = inline.pedantic;\n } else if (this.options.gfm) {\n rules.block = block.gfm;\n if (this.options.breaks) {\n rules.inline = inline.breaks;\n } else {\n rules.inline = inline.gfm;\n }\n }\n this.tokenizer.rules = rules;\n }\n\n /**\n * Expose Rules\n */\n static get rules() {\n return {\n block,\n inline,\n };\n }\n\n /**\n * Static Lex Method\n */\n static lex<ParserOutput = string, RendererOutput = string>(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const lexer = new _Lexer<ParserOutput, RendererOutput>(options);\n return lexer.lex(src);\n }\n\n /**\n * Static Lex Inline Method\n */\n static lexInline<ParserOutput = string, RendererOutput = string>(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const lexer = new _Lexer<ParserOutput, RendererOutput>(options);\n return lexer.inlineTokens(src);\n }\n\n /**\n * Preprocessing\n */\n lex(src: string) {\n src = src.replace(other.carriageReturn, '\\n');\n\n this.blockTokens(src, this.tokens);\n\n for (let i = 0; i < this.inlineQueue.length; i++) {\n const next = this.inlineQueue[i];\n this.inlineTokens(next.src, next.tokens);\n }\n this.inlineQueue = [];\n\n return this.tokens;\n }\n\n /**\n * Lexing\n */\n blockTokens(src: string, tokens?: Token[], lastParagraphClipped?: boolean): Token[];\n blockTokens(src: string, tokens?: TokensList, lastParagraphClipped?: boolean): TokensList;\n blockTokens(src: string, tokens: Token[] = [], lastParagraphClipped = false) {\n if (this.options.pedantic) {\n src = src.replace(other.tabCharGlobal, ' ').replace(other.spaceLine, '');\n }\n\n while (src) {\n let token: Tokens.Generic | undefined;\n\n if (this.options.extensions?.block?.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // newline\n if (token = this.tokenizer.space(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (token.raw.length === 1 && lastToken !== undefined) {\n // if there's a single \\n as a spacer, it's terminating the last line,\n // so move it there so that we don't get unnecessary paragraph tags\n lastToken.raw += '\\n';\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // code\n if (token = this.tokenizer.code(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n // An indented code block cannot interrupt a paragraph.\n if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // fences\n if (token = this.tokenizer.fences(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // heading\n if (token = this.tokenizer.heading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // hr\n if (token = this.tokenizer.hr(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // blockquote\n if (token = this.tokenizer.blockquote(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // list\n if (token = this.tokenizer.list(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // html\n if (token = this.tokenizer.html(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // def\n if (token = this.tokenizer.def(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.raw;\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else if (!this.tokens.links[token.tag]) {\n this.tokens.links[token.tag] = {\n href: token.href,\n title: token.title,\n };\n tokens.push(token);\n }\n continue;\n }\n\n // table (gfm)\n if (token = this.tokenizer.table(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // lheading\n if (token = this.tokenizer.lheading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // top-level paragraph\n // prevent paragraph consuming extensions by clipping 'src' to extension start\n let cutSrc = src;\n if (this.options.extensions?.startBlock) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startBlock.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n const lastToken = tokens.at(-1);\n if (lastParagraphClipped && lastToken?.type === 'paragraph') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n lastParagraphClipped = cutSrc.length !== src.length;\n src = src.substring(token.raw.length);\n continue;\n }\n\n // text\n if (token = this.tokenizer.text(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'text') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n\n this.state.top = true;\n return tokens;\n }\n\n inline(src: string, tokens: Token[] = []) {\n this.inlineQueue.push({ src, tokens });\n return tokens;\n }\n\n /**\n * Lexing/Compiling\n */\n inlineTokens(src: string, tokens: Token[] = []): Token[] {\n // String with links masked to avoid interference with em and strong\n let maskedSrc = src;\n let match: RegExpExecArray | null = null;\n\n // Mask out reflinks\n if (this.tokens.links) {\n const links = Object.keys(this.tokens.links);\n if (links.length > 0) {\n while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n maskedSrc = maskedSrc.slice(0, match.index)\n + '[' + 'a'.repeat(match[0].length - 2) + ']'\n + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n }\n }\n }\n }\n\n // Mask out escaped characters\n while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {\n maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);\n }\n\n // Mask out other blocks\n let offset;\n while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n offset = match[2] ? match[2].length : 0;\n maskedSrc = maskedSrc.slice(0, match.index + offset) + '[' + 'a'.repeat(match[0].length - offset - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n }\n\n // Mask out blocks from extensions\n maskedSrc = this.options.hooks?.emStrongMask?.call({ lexer: this }, maskedSrc) ?? maskedSrc;\n\n let keepPrevChar = false;\n let prevChar = '';\n while (src) {\n if (!keepPrevChar) {\n prevChar = '';\n }\n keepPrevChar = false;\n\n let token: Tokens.Generic | undefined;\n\n // extensions\n if (this.options.extensions?.inline?.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // escape\n if (token = this.tokenizer.escape(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // tag\n if (token = this.tokenizer.tag(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // link\n if (token = this.tokenizer.link(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // reflink, nolink\n if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (token.type === 'text' && lastToken?.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // em & strong\n if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // code\n if (token = this.tokenizer.codespan(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // br\n if (token = this.tokenizer.br(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // del (gfm)\n if (token = this.tokenizer.del(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // autolink\n if (token = this.tokenizer.autolink(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // url (gfm)\n if (!this.state.inLink && (token = this.tokenizer.url(src))) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // text\n // prevent inlineText consuming extensions by clipping 'src' to extension start\n let cutSrc = src;\n if (this.options.extensions?.startInline) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startInline.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (token = this.tokenizer.inlineText(cutSrc)) {\n src = src.substring(token.raw.length);\n if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n prevChar = token.raw.slice(-1);\n }\n keepPrevChar = true;\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n if (src) {\n const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n if (this.options.silent) {\n console.error(errMsg);\n break;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n\n return tokens;\n }\n}\n","import { _defaults } from './defaults.ts';\nimport {\n cleanUrl,\n escape,\n} from './helpers.ts';\nimport { other } from './rules.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\nimport type { Tokens } from './Tokens.ts';\nimport type { _Parser } from './Parser.ts';\n\n/**\n * Renderer\n */\nexport class _Renderer<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n parser!: _Parser<ParserOutput, RendererOutput>; // set by the parser\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n }\n\n space(token: Tokens.Space): RendererOutput {\n return '' as RendererOutput;\n }\n\n code({ text, lang, escaped }: Tokens.Code): RendererOutput {\n const langString = (lang || '').match(other.notSpaceStart)?.[0];\n\n const code = text.replace(other.endingNewline, '') + '\\n';\n\n if (!langString) {\n return '<pre><code>'\n + (escaped ? code : escape(code, true))\n + '</code></pre>\\n' as RendererOutput;\n }\n\n return '<pre><code class=\"language-'\n + escape(langString)\n + '\">'\n + (escaped ? code : escape(code, true))\n + '</code></pre>\\n' as RendererOutput;\n }\n\n blockquote({ tokens }: Tokens.Blockquote): RendererOutput {\n const body = this.parser.parse(tokens);\n return `<blockquote>\\n${body}</blockquote>\\n` as RendererOutput;\n }\n\n html({ text }: Tokens.HTML | Tokens.Tag): RendererOutput {\n return text as RendererOutput;\n }\n\n def(token: Tokens.Def): RendererOutput {\n return '' as RendererOutput;\n }\n\n heading({ tokens, depth }: Tokens.Heading): RendererOutput {\n return `<h${depth}>${this.parser.parseInline(tokens)}</h${depth}>\\n` as RendererOutput;\n }\n\n hr(token: Tokens.Hr): RendererOutput {\n return '<hr>\\n' as RendererOutput;\n }\n\n list(token: Tokens.List): RendererOutput {\n const ordered = token.ordered;\n const start = token.start;\n\n let body = '';\n for (let j = 0; j < token.items.length; j++) {\n const item = token.items[j];\n body += this.listitem(item);\n }\n\n const type = ordered ? 'ol' : 'ul';\n const startAttr = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n return '<' + type + startAttr + '>\\n' + body + '</' + type + '>\\n' as RendererOutput;\n }\n\n listitem(item: Tokens.ListItem): RendererOutput {\n return `<li>${this.parser.parse(item.tokens)}</li>\\n` as RendererOutput;\n }\n\n checkbox({ checked }: Tokens.Checkbox): RendererOutput {\n return '<input '\n + (checked ? 'checked=\"\" ' : '')\n + 'disabled=\"\" type=\"checkbox\"> ' as RendererOutput;\n }\n\n paragraph({ tokens }: Tokens.Paragraph): RendererOutput {\n return `<p>${this.parser.parseInline(tokens)}</p>\\n` as RendererOutput;\n }\n\n table(token: Tokens.Table): RendererOutput {\n let header = '';\n\n // header\n let cell = '';\n for (let j = 0; j < token.header.length; j++) {\n cell += this.tablecell(token.header[j]);\n }\n header += this.tablerow({ text: cell as ParserOutput });\n\n let body = '';\n for (let j = 0; j < token.rows.length; j++) {\n const row = token.rows[j];\n\n cell = '';\n for (let k = 0; k < row.length; k++) {\n cell += this.tablecell(row[k]);\n }\n\n body += this.tablerow({ text: cell as ParserOutput });\n }\n if (body) body = `<tbody>${body}</tbody>`;\n\n return '<table>\\n'\n + '<thead>\\n'\n + header\n + '</thead>\\n'\n + body\n + '</table>\\n' as RendererOutput;\n }\n\n tablerow({ text }: Tokens.TableRow<ParserOutput>): RendererOutput {\n return `<tr>\\n${text}</tr>\\n` as RendererOutput;\n }\n\n tablecell(token: Tokens.TableCell): RendererOutput {\n const content = this.parser.parseInline(token.tokens);\n const type = token.header ? 'th' : 'td';\n const tag = token.align\n ? `<${type} align=\"${token.align}\">`\n : `<${type}>`;\n return tag + content + `</${type}>\\n` as RendererOutput;\n }\n\n /**\n * span level renderer\n */\n strong({ tokens }: Tokens.Strong): RendererOutput {\n return `<strong>${this.parser.parseInline(tokens)}</strong>` as RendererOutput;\n }\n\n em({ tokens }: Tokens.Em): RendererOutput {\n return `<em>${this.parser.parseInline(tokens)}</em>` as RendererOutput;\n }\n\n codespan({ text }: Tokens.Codespan): RendererOutput {\n return `<code>${escape(text, true)}</code>` as RendererOutput;\n }\n\n br(token: Tokens.Br): RendererOutput {\n return '<br>' as RendererOutput;\n }\n\n del({ tokens }: Tokens.Del): RendererOutput {\n return `<del>${this.parser.parseInline(tokens)}</del>` as RendererOutput;\n }\n\n link({ href, title, tokens }: Tokens.Link): RendererOutput {\n const text = this.parser.parseInline(tokens) as string;\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return text as RendererOutput;\n }\n href = cleanHref;\n let out = '<a href=\"' + href + '\"';\n if (title) {\n out += ' title=\"' + (escape(title)) + '\"';\n }\n out += '>' + text + '</a>';\n return out as RendererOutput;\n }\n\n image({ href, title, text, tokens }: Tokens.Image): RendererOutput {\n if (tokens) {\n text = this.parser.parseInline(tokens, this.parser.textRenderer) as string;\n }\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return escape(text) as RendererOutput;\n }\n href = cleanHref;\n\n let out = `<img src=\"${href}\" alt=\"${escape(text)}\"`;\n if (title) {\n out += ` title=\"${escape(title)}\"`;\n }\n out += '>';\n return out as RendererOutput;\n }\n\n text(token: Tokens.Text | Tokens.Escape): RendererOutput {\n return 'tokens' in token && token.tokens\n ? this.parser.parseInline(token.tokens) as unknown as RendererOutput\n : ('escaped' in token && token.escaped ? token.text as RendererOutput : escape(token.text) as RendererOutput);\n }\n}\n","import type { Tokens } from './Tokens.ts';\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nexport class _TextRenderer<RendererOutput = string> {\n // no need for block level renderers\n strong({ text }: Tokens.Strong): RendererOutput {\n return text as RendererOutput;\n }\n\n em({ text }: Tokens.Em): RendererOutput {\n return text as RendererOutput;\n }\n\n codespan({ text }: Tokens.Codespan): RendererOutput {\n return text as RendererOutput;\n }\n\n del({ text }: Tokens.Del): RendererOutput {\n return text as RendererOutput;\n }\n\n html({ text }: Tokens.HTML | Tokens.Tag): RendererOutput {\n return text as RendererOutput;\n }\n\n text({ text }: Tokens.Text | Tokens.Escape | Tokens.Tag): RendererOutput {\n return text as RendererOutput;\n }\n\n link({ text }: Tokens.Link): RendererOutput {\n return '' + text as RendererOutput;\n }\n\n image({ text }: Tokens.Image): RendererOutput {\n return '' + text as RendererOutput;\n }\n\n br(): RendererOutput {\n return '' as RendererOutput;\n }\n\n checkbox({ raw }: Tokens.Checkbox): RendererOutput {\n return raw as RendererOutput;\n }\n}\n","import { _Renderer } from './Renderer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { _defaults } from './defaults.ts';\nimport type { MarkedToken, Token, Tokens } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Parsing & Compiling\n */\nexport class _Parser<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n renderer: _Renderer<ParserOutput, RendererOutput>;\n textRenderer: _TextRenderer<RendererOutput>;\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n this.options.renderer = this.options.renderer || new _Renderer<ParserOutput, RendererOutput>();\n this.renderer = this.options.renderer;\n this.renderer.options = this.options;\n this.renderer.parser = this;\n this.textRenderer = new _TextRenderer<RendererOutput>();\n }\n\n /**\n * Static Parse Method\n */\n static parse<ParserOutput = string, RendererOutput = string>(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const parser = new _Parser<ParserOutput, RendererOutput>(options);\n return parser.parse(tokens);\n }\n\n /**\n * Static Parse Inline Method\n */\n static parseInline<ParserOutput = string, RendererOutput = string>(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const parser = new _Parser<ParserOutput, RendererOutput>(options);\n return parser.parseInline(tokens);\n }\n\n /**\n * Parse Loop\n */\n parse(tokens: Token[]): ParserOutput {\n let out = '';\n\n for (let i = 0; i < tokens.length; i++) {\n const anyToken = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions?.renderers?.[anyToken.type]) {\n const genericToken = anyToken as Tokens.Generic;\n const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);\n if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'def', 'paragraph', 'text'].includes(genericToken.type)) {\n out += ret || '';\n continue;\n }\n }\n\n const token = anyToken as MarkedToken;\n\n switch (token.type) {\n case 'space': {\n out += this.renderer.space(token);\n break;\n }\n case 'hr': {\n out += this.renderer.hr(token);\n break;\n }\n case 'heading': {\n out += this.renderer.heading(token);\n break;\n }\n case 'code': {\n out += this.renderer.code(token);\n break;\n }\n case 'table': {\n out += this.renderer.table(token);\n break;\n }\n case 'blockquote': {\n out += this.renderer.blockquote(token);\n break;\n }\n case 'list': {\n out += this.renderer.list(token);\n break;\n }\n case 'checkbox': {\n out += this.renderer.checkbox(token);\n break;\n }\n case 'html': {\n out += this.renderer.html(token);\n break;\n }\n case 'def': {\n out += this.renderer.def(token);\n break;\n }\n case 'paragraph': {\n out += this.renderer.paragraph(token);\n break;\n }\n case 'text': {\n out += this.renderer.text(token);\n break;\n }\n\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '' as ParserOutput;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n\n return out as ParserOutput;\n }\n\n /**\n * Parse Inline Tokens\n */\n parseInline(tokens: Token[], renderer: _Renderer<ParserOutput, RendererOutput> | _TextRenderer<RendererOutput> = this.renderer): ParserOutput {\n let out = '';\n\n for (let i = 0; i < tokens.length; i++) {\n const anyToken = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions?.renderers?.[anyToken.type]) {\n const ret = this.options.extensions.renderers[anyToken.type].call({ parser: this }, anyToken);\n if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(anyToken.type)) {\n out += ret || '';\n continue;\n }\n }\n\n const token = anyToken as MarkedToken;\n\n switch (token.type) {\n case 'escape': {\n out += renderer.text(token);\n break;\n }\n case 'html': {\n out += renderer.html(token);\n break;\n }\n case 'link': {\n out += renderer.link(token);\n break;\n }\n case 'image': {\n out += renderer.image(token);\n break;\n }\n case 'checkbox': {\n out += renderer.checkbox(token);\n break;\n }\n case 'strong': {\n out += renderer.strong(token);\n break;\n }\n case 'em': {\n out += renderer.em(token);\n break;\n }\n case 'codespan': {\n out += renderer.codespan(token);\n break;\n }\n case 'br': {\n out += renderer.br(token);\n break;\n }\n case 'del': {\n out += renderer.del(token);\n break;\n }\n case 'text': {\n out += renderer.text(token);\n break;\n }\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '' as ParserOutput;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out as ParserOutput;\n }\n}\n","import { _defaults } from './defaults.ts';\nimport { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, TokensList } from './Tokens.ts';\n\nexport class _Hooks<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n block?: boolean;\n\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n }\n\n static passThroughHooks = new Set([\n 'preprocess',\n 'postprocess',\n 'processAllTokens',\n 'emStrongMask',\n ]);\n\n static passThroughHooksRespectAsync = new Set([\n 'preprocess',\n 'postprocess',\n 'processAllTokens',\n ]);\n\n /**\n * Process markdown before marked\n */\n preprocess(markdown: string) {\n return markdown;\n }\n\n /**\n * Process HTML after marked is finished\n */\n postprocess(html: ParserOutput) {\n return html;\n }\n\n /**\n * Process all tokens before walk tokens\n */\n processAllTokens(tokens: Token[] | TokensList) {\n return tokens;\n }\n\n /**\n * Mask contents that should not be interpreted as em/strong delimiters\n */\n emStrongMask(src: string) {\n return src;\n }\n\n /**\n * Provide function to tokenize markdown\n */\n provideLexer() {\n return this.block ? _Lexer.lex : _Lexer.lexInline;\n }\n\n /**\n * Provide function to parse tokens\n */\n provideParser() {\n return this.block ? _Parser.parse<ParserOutput, RendererOutput> : _Parser.parseInline<ParserOutput, RendererOutput>;\n }\n}\n","import { _getDefaults } from './defaults.ts';\nimport { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport { _Hooks } from './Hooks.ts';\nimport { _Renderer } from './Renderer.ts';\nimport { _Tokenizer } from './Tokenizer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { escape } from './helpers.ts';\nimport type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, Tokens, TokensList } from './Tokens.ts';\n\nexport type MaybePromise = void | Promise<void>;\n\ntype UnknownFunction = (...args: unknown[]) => unknown;\ntype GenericRendererFunction = (...args: unknown[]) => string | false;\n\nexport class Marked<ParserOutput = string, RendererOutput = string> {\n defaults = _getDefaults<ParserOutput, RendererOutput>();\n options = this.setOptions;\n\n parse = this.parseMarkdown(true);\n parseInline = this.parseMarkdown(false);\n\n Parser = _Parser<ParserOutput, RendererOutput>;\n Renderer = _Renderer<ParserOutput, RendererOutput>;\n TextRenderer = _TextRenderer<RendererOutput>;\n Lexer = _Lexer;\n Tokenizer = _Tokenizer<ParserOutput, RendererOutput>;\n Hooks = _Hooks<ParserOutput, RendererOutput>;\n\n constructor(...args: MarkedExtension<ParserOutput, RendererOutput>[]) {\n this.use(...args);\n }\n\n /**\n * Run callback for every token\n */\n walkTokens(tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) {\n let values: MaybePromise[] = [];\n for (const token of tokens) {\n values = values.concat(callback.call(this, token));\n switch (token.type) {\n case 'table': {\n const tableToken = token as Tokens.Table;\n for (const cell of tableToken.header) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n for (const row of tableToken.rows) {\n for (const cell of row) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n }\n break;\n }\n case 'list': {\n const listToken = token as Tokens.List;\n values = values.concat(this.walkTokens(listToken.items, callback));\n break;\n }\n default: {\n const genericToken = token as Tokens.Generic;\n if (this.defaults.extensions?.childTokens?.[genericToken.type]) {\n this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {\n const tokens = genericToken[childTokens].flat(Infinity) as Token[] | TokensList;\n values = values.concat(this.walkTokens(tokens, callback));\n });\n } else if (genericToken.tokens) {\n values = values.concat(this.walkTokens(genericToken.tokens, callback));\n }\n }\n }\n }\n return values;\n }\n\n use(...args: MarkedExtension<ParserOutput, RendererOutput>[]) {\n const extensions: MarkedOptions<ParserOutput, RendererOutput>['extensions'] = this.defaults.extensions || { renderers: {}, childTokens: {} };\n\n args.forEach((pack) => {\n // copy options to new object\n const opts = { ...pack } as MarkedOptions<ParserOutput, RendererOutput>;\n\n // set async to true if it was set to true before\n opts.async = this.defaults.async || opts.async || false;\n\n // ==-- Parse \"addon\" extensions --== //\n if (pack.extensions) {\n pack.extensions.forEach((ext) => {\n if (!ext.name) {\n throw new Error('extension name required');\n }\n if ('renderer' in ext) { // Renderer extensions\n const prevRenderer = extensions.renderers[ext.name];\n if (prevRenderer) {\n // Replace extension with func to run new extension but fall back if false\n extensions.renderers[ext.name] = function(...args) {\n let ret = ext.renderer.apply(this, args);\n if (ret === false) {\n ret = prevRenderer.apply(this, args);\n }\n return ret;\n };\n } else {\n extensions.renderers[ext.name] = ext.renderer;\n }\n }\n if ('tokenizer' in ext) { // Tokenizer Extensions\n if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n throw new Error(\"extension level must be 'block' or 'inline'\");\n }\n const extLevel = extensions[ext.level];\n if (extLevel) {\n extLevel.unshift(ext.tokenizer);\n } else {\n extensions[ext.level] = [ext.tokenizer];\n }\n if (ext.start) { // Function to check for start of token\n if (ext.level === 'block') {\n if (extensions.startBlock) {\n extensions.startBlock.push(ext.start);\n } else {\n extensions.startBlock = [ext.start];\n }\n } else if (ext.level === 'inline') {\n if (extensions.startInline) {\n extensions.startInline.push(ext.start);\n } else {\n extensions.startInline = [ext.start];\n }\n }\n }\n }\n if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens\n extensions.childTokens[ext.name] = ext.childTokens;\n }\n });\n opts.extensions = extensions;\n }\n\n // ==-- Parse \"overwrite\" extensions --== //\n if (pack.renderer) {\n const renderer = this.defaults.renderer || new _Renderer<ParserOutput, RendererOutput>(this.defaults);\n for (const prop in pack.renderer) {\n if (!(prop in renderer)) {\n throw new Error(`renderer '${prop}' does not exist`);\n }\n if (['options', 'parser'].includes(prop)) {\n // ignore options property\n continue;\n }\n const rendererProp = prop as Exclude<keyof _Renderer<ParserOutput, RendererOutput>, 'options' | 'parser'>;\n const rendererFunc = pack.renderer[rendererProp] as GenericRendererFunction;\n const prevRenderer = renderer[rendererProp] as GenericRendererFunction;\n // Replace renderer with func to run extension, but fall back if false\n renderer[rendererProp] = (...args: unknown[]) => {\n let ret = rendererFunc.apply(renderer, args);\n if (ret === false) {\n ret = prevRenderer.apply(renderer, args);\n }\n return (ret || '') as RendererOutput;\n };\n }\n opts.renderer = renderer;\n }\n if (pack.tokenizer) {\n const tokenizer = this.defaults.tokenizer || new _Tokenizer<ParserOutput, RendererOutput>(this.defaults);\n for (const prop in pack.tokenizer) {\n if (!(prop in tokenizer)) {\n throw new Error(`tokenizer '${prop}' does not exist`);\n }\n if (['options', 'rules', 'lexer'].includes(prop)) {\n // ignore options, rules, and lexer properties\n continue;\n }\n const tokenizerProp = prop as Exclude<keyof _Tokenizer<ParserOutput, RendererOutput>, 'options' | 'rules' | 'lexer'>;\n const tokenizerFunc = pack.tokenizer[tokenizerProp] as UnknownFunction;\n const prevTokenizer = tokenizer[tokenizerProp] as UnknownFunction;\n // Replace tokenizer with func to run extension, but fall back if false\n // @ts-expect-error cannot type tokenizer function dynamically\n tokenizer[tokenizerProp] = (...args: unknown[]) => {\n let ret = tokenizerFunc.apply(tokenizer, args);\n if (ret === false) {\n ret = prevTokenizer.apply(tokenizer, args);\n }\n return ret;\n };\n }\n opts.tokenizer = tokenizer;\n }\n\n // ==-- Parse Hooks extensions --== //\n if (pack.hooks) {\n const hooks = this.defaults.hooks || new _Hooks<ParserOutput, RendererOutput>();\n for (const prop in pack.hooks) {\n if (!(prop in hooks)) {\n throw new Error(`hook '${prop}' does not exist`);\n }\n if (['options', 'block'].includes(prop)) {\n // ignore options and block properties\n continue;\n }\n const hooksProp = prop as Exclude<keyof _Hooks<ParserOutput, RendererOutput>, 'options' | 'block'>;\n const hooksFunc = pack.hooks[hooksProp] as UnknownFunction;\n const prevHook = hooks[hooksProp] as UnknownFunction;\n if (_Hooks.passThroughHooks.has(prop)) {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (arg: unknown) => {\n if (this.defaults.async && _Hooks.passThroughHooksRespectAsync.has(prop)) {\n return (async() => {\n const ret = await hooksFunc.call(hooks, arg);\n return prevHook.call(hooks, ret);\n })();\n }\n\n const ret = hooksFunc.call(hooks, arg);\n return prevHook.call(hooks, ret);\n };\n } else {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (...args: unknown[]) => {\n if (this.defaults.async) {\n return (async() => {\n let ret = await hooksFunc.apply(hooks, args);\n if (ret === false) {\n ret = await prevHook.apply(hooks, args);\n }\n return ret;\n })();\n }\n\n let ret = hooksFunc.apply(hooks, args);\n if (ret === false) {\n ret = prevHook.apply(hooks, args);\n }\n return ret;\n };\n }\n }\n opts.hooks = hooks;\n }\n\n // ==-- Parse WalkTokens extensions --== //\n if (pack.walkTokens) {\n const walkTokens = this.defaults.walkTokens;\n const packWalktokens = pack.walkTokens;\n opts.walkTokens = function(token) {\n let values: MaybePromise[] = [];\n values.push(packWalktokens.call(this, token));\n if (walkTokens) {\n values = values.concat(walkTokens.call(this, token));\n }\n return values;\n };\n }\n\n this.defaults = { ...this.defaults, ...opts };\n });\n\n return this;\n }\n\n setOptions(opt: MarkedOptions<ParserOutput, RendererOutput>) {\n this.defaults = { ...this.defaults, ...opt };\n return this;\n }\n\n lexer(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n return _Lexer.lex(src, options ?? this.defaults);\n }\n\n parser(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n return _Parser.parse<ParserOutput, RendererOutput>(tokens, options ?? this.defaults);\n }\n\n private parseMarkdown(blockType: boolean) {\n type overloadedParse = {\n (src: string, options: MarkedOptions<ParserOutput, RendererOutput> & { async: true }): Promise<ParserOutput>;\n (src: string, options: MarkedOptions<ParserOutput, RendererOutput> & { async: false }): ParserOutput;\n (src: string, options?: MarkedOptions<ParserOutput, RendererOutput> | null): ParserOutput | Promise<ParserOutput>;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const parse: overloadedParse = (src: string, options?: MarkedOptions<ParserOutput, RendererOutput> | null): any => {\n const origOpt = { ...options };\n const opt = { ...this.defaults, ...origOpt };\n\n const throwError = this.onError(!!opt.silent, !!opt.async);\n\n // throw error if an extension set async to true but parse was called with async: false\n if (this.defaults.async === true && origOpt.async === false) {\n return throwError(new Error('marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.'));\n }\n\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n return throwError(new Error('marked(): input parameter is undefined or null'));\n }\n if (typeof src !== 'string') {\n return throwError(new Error('marked(): input parameter is of type '\n + Object.prototype.toString.call(src) + ', string expected'));\n }\n\n if (opt.hooks) {\n opt.hooks.options = opt;\n opt.hooks.block = blockType;\n }\n\n if (opt.async) {\n return (async() => {\n const processedSrc = opt.hooks ? await opt.hooks.preprocess(src) : src;\n const lexer = opt.hooks ? await opt.hooks.provideLexer() : (blockType ? _Lexer.lex : _Lexer.lexInline);\n const tokens = await lexer(processedSrc, opt);\n const processedTokens = opt.hooks ? await opt.hooks.processAllTokens(tokens) : tokens;\n if (opt.walkTokens) {\n await Promise.all(this.walkTokens(processedTokens, opt.walkTokens));\n }\n const parser = opt.hooks ? await opt.hooks.provideParser() : (blockType ? _Parser.parse : _Parser.parseInline);\n const html = await parser(processedTokens, opt);\n return opt.hooks ? await opt.hooks.postprocess(html) : html;\n })().catch(throwError);\n }\n\n try {\n if (opt.hooks) {\n src = opt.hooks.preprocess(src) as string;\n }\n const lexer = opt.hooks ? opt.hooks.provideLexer() : (blockType ? _Lexer.lex : _Lexer.lexInline);\n let tokens = lexer(src, opt);\n if (opt.hooks) {\n tokens = opt.hooks.processAllTokens(tokens);\n }\n if (opt.walkTokens) {\n this.walkTokens(tokens, opt.walkTokens);\n }\n const parser = opt.hooks ? opt.hooks.provideParser() : (blockType ? _Parser.parse : _Parser.parseInline);\n let html = parser(tokens, opt);\n if (opt.hooks) {\n html = opt.hooks.postprocess(html);\n }\n return html;\n } catch(e) {\n return throwError(e as Error);\n }\n };\n\n return parse;\n }\n\n private onError(silent: boolean, async: boolean) {\n return (e: Error): string | Promise<string> => {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n\n if (silent) {\n const msg = '<p>An error occurred:</p><pre>'\n + escape(e.message + '', true)\n + '</pre>';\n if (async) {\n return Promise.resolve(msg);\n }\n return msg;\n }\n\n if (async) {\n return Promise.reject(e);\n }\n throw e;\n };\n }\n}\n","import { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport { _Tokenizer } from './Tokenizer.ts';\nimport { _Renderer } from './Renderer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { _Hooks } from './Hooks.ts';\nimport { Marked } from './Instance.ts';\nimport {\n _getDefaults,\n changeDefaults,\n _defaults,\n} from './defaults.ts';\nimport type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, TokensList } from './Tokens.ts';\nimport type { MaybePromise } from './Instance.ts';\n\nconst markedInstance = new Marked();\n\n/**\n * Compiles markdown to HTML asynchronously.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options, having async: true\n * @return Promise of string of compiled HTML\n */\nexport function marked(src: string, options: MarkedOptions & { async: true }): Promise<string>;\n\n/**\n * Compiles markdown to HTML.\n *\n * @param src String of markdown source to be compiled\n * @param options Optional hash of options\n * @return String of compiled HTML. Will be a Promise of string if async is set to true by any extensions.\n */\nexport function marked(src: string, options: MarkedOptions & { async: false }): string;\nexport function marked(src: string, options: MarkedOptions & { async: true }): Promise<string>;\nexport function marked(src: string, options?: MarkedOptions | null): string | Promise<string>;\nexport function marked(src: string, opt?: MarkedOptions | null): string | Promise<string> {\n return markedInstance.parse(src, opt);\n}\n\n/**\n * Sets the default options.\n *\n * @param options Hash of options\n */\nmarked.options =\n marked.setOptions = function(options: MarkedOptions) {\n markedInstance.setOptions(options);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n };\n\n/**\n * Gets the original marked default options.\n */\nmarked.getDefaults = _getDefaults;\n\nmarked.defaults = _defaults;\n\n/**\n * Use Extension\n */\n\nmarked.use = function(...args: MarkedExtension[]) {\n markedInstance.use(...args);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n};\n\n/**\n * Run callback for every token\n */\n\nmarked.walkTokens = function(tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) {\n return markedInstance.walkTokens(tokens, callback);\n};\n\n/**\n * Compiles markdown to HTML without enclosing `p` tag.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options\n * @return String of compiled HTML\n */\nmarked.parseInline = markedInstance.parseInline;\n\n/**\n * Expose\n */\nmarked.Parser = _Parser;\nmarked.parser = _Parser.parse;\nmarked.Renderer = _Renderer;\nmarked.TextRenderer = _TextRenderer;\nmarked.Lexer = _Lexer;\nmarked.lexer = _Lexer.lex;\nmarked.Tokenizer = _Tokenizer;\nmarked.Hooks = _Hooks;\nmarked.parse = marked;\n\nexport const options = marked.options;\nexport const setOptions = marked.setOptions;\nexport const use = marked.use;\nexport const walkTokens = marked.walkTokens;\nexport const parseInline = marked.parseInline;\nexport const parse = marked;\nexport const parser = _Parser.parse;\nexport const lexer = _Lexer.lex;\nexport { _defaults as defaults, _getDefaults as getDefaults } from './defaults.ts';\nexport { _Lexer as Lexer } from './Lexer.ts';\nexport { _Parser as Parser } from './Parser.ts';\nexport { _Tokenizer as Tokenizer } from './Tokenizer.ts';\nexport { _Renderer as Renderer } from './Renderer.ts';\nexport { _TextRenderer as TextRenderer } from './TextRenderer.ts';\nexport { _Hooks as Hooks } from './Hooks.ts';\nexport { Marked } from './Instance.ts';\nexport type * from './MarkedOptions.ts';\nexport type * from './Tokens.ts';\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\nimport {nothing, TemplateResult, noChange} from '../lit-html.js';\nimport {directive, Directive, PartInfo, PartType} from '../directive.js';\n\nconst HTML_RESULT = 1;\n\nexport class UnsafeHTMLDirective extends Directive {\n static directiveName = 'unsafeHTML';\n static resultType = HTML_RESULT;\n\n private _value: unknown = nothing;\n private _templateResult?: TemplateResult;\n\n constructor(partInfo: PartInfo) {\n super(partInfo);\n if (partInfo.type !== PartType.CHILD) {\n throw new Error(\n `${\n (this.constructor as typeof UnsafeHTMLDirective).directiveName\n }() can only be used in child bindings`\n );\n }\n }\n\n render(value: string | typeof nothing | typeof noChange | undefined | null) {\n if (value === nothing || value == null) {\n this._templateResult = undefined;\n return (this._value = value);\n }\n if (value === noChange) {\n return value;\n }\n if (typeof value != 'string') {\n throw new Error(\n `${\n (this.constructor as typeof UnsafeHTMLDirective).directiveName\n }() called with a non-string value`\n );\n }\n if (value === this._value) {\n return this._templateResult;\n }\n this._value = value;\n const strings = [value] as unknown as TemplateStringsArray;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (strings as any).raw = strings;\n // WARNING: impersonating a TemplateResult like this is extremely\n // dangerous. Third-party directives should not do this.\n return (this._templateResult = {\n // Cast to a known set of integers that satisfy ResultType so that we\n // don't have to export ResultType and possibly encourage this pattern.\n // This property needs to remain unminified.\n ['_$litType$']: (this.constructor as typeof UnsafeHTMLDirective)\n .resultType as 1 | 2,\n strings,\n values: [],\n });\n }\n}\n\n/**\n * Renders the result as HTML, rather than text.\n *\n * The values `undefined`, `null`, and `nothing`, will all result in no content\n * (empty string) being rendered.\n *\n * Note, this is unsafe to use with any user-provided input that hasn't been\n * sanitized or escaped, as it may lead to cross-site-scripting\n * vulnerabilities.\n */\nexport const unsafeHTML = directive(UnsafeHTMLDirective);\n"],"mappings":"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","names":["_getDefaults","_defaults","changeDefaults","newDefaults","noopTest","edit","regex","opt","source","obj","name","val","valSource","other","supportsLookbehind","bull","indent","newline","blockCode","fences","hr","heading","bullet","lheadingCore","lheading","lheadingGfm","_paragraph","blockText","_blockLabel","def","list","_tag","_comment","html","paragraph","blockquote","blockNormal","gfmTable","blockGfm","blockPedantic","escape","inlineCode","br","inlineText","_punctuation","_punctuationOrSpace","_notPunctuationOrSpace","punctuation","_punctuationGfmStrongEm","_punctuationOrSpaceGfmStrongEm","_notPunctuationOrSpaceGfmStrongEm","_punctuationGfmDel","_punctuationOrSpaceGfmDel","_notPunctuationOrSpaceGfmDel","blockSkip","emStrongLDelimCore","emStrongLDelim","emStrongLDelimGfm","emStrongRDelimAstCore","emStrongRDelimAst","emStrongRDelimAstGfm","emStrongRDelimUnd","delLDelim","delRDelimCore","delRDelim","anyPunctuation","autolink","_inlineComment","tag","_inlineLabel","link","reflink","nolink","reflinkSearch","_caseInsensitiveProtocol","inlineNormal","inlinePedantic","inlineGfm","inlineBreaks","block","inline","escapeReplacements","getEscapeReplacement","ch","encode","cleanUrl","href","splitCells","tableRow","count","row","match","offset","str","escaped","curr","cells","i","rtrim","c","invert","l","suffLen","currChar","findClosingBracket","b","level","expandTabs","line","col","expanded","char","added","outputLink","cap","raw","lexer","rules","title","text","token","indentCodeCompensation","matchIndentToCode","indentToCode","node","matchIndentInNode","indentInNode","_Tokenizer","options","src","trimmed","lines","tokens","inBlockquote","currentLines","currentRaw","currentText","top","lastToken","oldToken","newText","newToken","isordered","itemRegex","endsWithBlankLine","endEarly","itemContents","nextLine","blankLine","nextBulletRegex","hrRegex","fencesBeginRegex","headingBeginRegex","htmlBeginRegex","blockquoteBeginRegex","rawLine","nextLineWithoutTabs","lastItem","item","taskRaw","checkboxToken","spacers","t","hasMultipleLineBreaks","headers","aligns","rows","align","cell","trimmedUrl","rtrimSlash","lastParenIndex","linkLen","links","linkString","maskedSrc","prevChar","lLength","rDelim","rLength","delimTotal","midDelimTotal","endReg","lastCharLength","hasNonSpaceChars","hasSpaceCharsOnBothEnds","prevCapZero","_Lexer","__Lexer","next","lastParagraphClipped","extTokenizer","cutSrc","startIndex","tempSrc","tempStart","getStartIndex","errMsg","keepPrevChar","_Renderer","lang","langString","code","depth","ordered","start","body","j","type","startAttr","checked","header","k","content","cleanHref","out","_TextRenderer","_Parser","__Parser","anyToken","genericToken","ret","renderer","_Hooks","markdown","Marked","args","callback","values","tableToken","listToken","childTokens","extensions","pack","opts","ext","prevRenderer","extLevel","prop","rendererProp","rendererFunc","tokenizer","tokenizerProp","tokenizerFunc","prevTokenizer","hooks","hooksProp","hooksFunc","prevHook","arg","walkTokens","packWalktokens","blockType","origOpt","throwError","processedSrc","processedTokens","e","silent","async","msg","markedInstance","marked","setOptions","use","parseInline","parser","_Parser","lexer","_Lexer","UnsafeHTMLDirective","Directive","partInfo","super","this","_value","nothing","type","PartType","CHILD","Error","constructor","directiveName","value","_templateResult","noChange","strings","raw","_$litType$","resultType","values","unsafeHTML","directive","b","i","c","html"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/facets/index.js.map"}
+57
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/facets/l/index.html
··· 1 + <html lang="en"> 2 + <head> 3 + <meta charset="UTF-8" /> 4 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 5 + 6 + <meta name="media-controllable" /> 7 + <meta name="mobile-web-app-capable" content="yes" /> 8 + 9 + <title>Diffuse</title> 10 + 11 + <!-- Base --> 12 + <base href="../../" /> 13 + 14 + <!-- Favicons & Mobile --> 15 + <link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png" /> 16 + <link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png" /> 17 + <link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png" /> 18 + <!-- TODO: <link rel="manifest" href="site.webmanifest" />--> 19 + <link rel="mask-icon" href="safari-pinned-tab.svg" color="#8a90a9" /> 20 + <meta name="msapplication-TileColor" content="#8a90a9" /> 21 + <meta name="theme-color" content="#8a90a9" /> 22 + 23 + <!-- Styles --> 24 + <link rel="stylesheet" href="styles/vendor/phosphor/fill/style.css" /> 25 + <link rel="stylesheet" href="styles/base.css" /> 26 + <link rel="stylesheet" href="styles/loader.css" /> 27 + </head> 28 + <body> 29 + <div id="container"> 30 + <div class="diffuse"> 31 + <div id="diffuse-loader" class="flex"> 32 + <i class="ph-fill ph-music-notes animate-bounce"></i> 33 + </div> 34 + </div> 35 + </div> 36 + 37 + <script type="importmap"> 38 + { 39 + "imports": { 40 + "@diffuse/foundation": "./common/facets/foundation.js", 41 + 42 + "@diffuse/common/": "./common/", 43 + "@diffuse/components/": "./components/", 44 + "@diffuse/definitions/": "./definitions/", 45 + "@diffuse/styles/": "./styles/", 46 + "@diffuse/themes/": "./themes/", 47 + 48 + "@atcute/tid": "./vendor/@atcute/tid/index.js" 49 + } 50 + } 51 + </script> 52 + 53 + 54 + <!-- Scripts --> 55 + <script src="facets/l/index.js" type="module"></script> 56 + </body> 57 + </html>
+89
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/facets/l/index.js
··· 1 + import { 2 + foundation_default 3 + } from "../../chunk-ZUHY7USF.js"; 4 + import "../../chunk-UMMPFCLQ.js"; 5 + import "../../chunk-G4P4YFWD.js"; 6 + import "../../chunk-6JNRNMZQ.js"; 7 + import "../../chunk-YV3SRJQF.js"; 8 + import "../../chunk-ESYALJPH.js"; 9 + import "../../chunk-OSKZBJ24.js"; 10 + import "../../chunk-XGM6M423.js"; 11 + import "../../chunk-6KMZB5IA.js"; 12 + import "../../chunk-B63ZUKFI.js"; 13 + import "../../chunk-TXU4RB3O.js"; 14 + import "../../chunk-3ENCKNXO.js"; 15 + import "../../chunk-PKN6FN7E.js"; 16 + import "../../chunk-NP7LZHKR.js"; 17 + import "../../chunk-M2MAFKPM.js"; 18 + import "../../chunk-MVUUUQRL.js"; 19 + import "../../chunk-GKE6NGNQ.js"; 20 + import "../../chunk-VWO2GNWZ.js"; 21 + import "../../chunk-QSPAYUAI.js"; 22 + import "../../chunk-I3VKG3ZJ.js"; 23 + import "../../chunk-OIRYE7B4.js"; 24 + import "../../chunk-3AO35WC3.js"; 25 + import "../../chunk-JBHW662S.js"; 26 + import "../../chunk-GX3WPNEX.js"; 27 + import "../../chunk-FJBTJV3K.js"; 28 + import "../../chunk-PTVB4Y37.js"; 29 + import "../../chunk-HN4F5JEZ.js"; 30 + import "../../chunk-NBQPHQFP.js"; 31 + import "../../chunk-QERJLR3Q.js"; 32 + import "../../chunk-OBWEBS4T.js"; 33 + import "../../chunk-S6SMX4HA.js"; 34 + import "../../chunk-XRGLBUX4.js"; 35 + import "../../chunk-R3EQQDW5.js"; 36 + import "../../chunk-GQIBEDKG.js"; 37 + import "../../chunk-DDF5P57I.js"; 38 + import "../../chunk-EEUCFWD4.js"; 39 + import "../../chunk-6DRHTH2U.js"; 40 + import "../../chunk-TSYF7OPM.js"; 41 + import "../../chunk-GCLDJKYV.js"; 42 + import "../../chunk-KJFA7KRK.js"; 43 + import "../../chunk-HMBZONBJ.js"; 44 + import "../../chunk-6CB2LXND.js"; 45 + import "../../chunk-V7EQPFPD.js"; 46 + import "../../chunk-G56PUJUJ.js"; 47 + import "../../chunk-6DKPDMFE.js"; 48 + import "../../chunk-TP5GZFTO.js"; 49 + import "../../chunk-ZQZJJU3T.js"; 50 + import { 51 + createLoader 52 + } from "../../chunk-X6J7NMRW.js"; 53 + import "../../chunk-WN6GL63Q.js"; 54 + import "../../chunk-CRZ7HJJ4.js"; 55 + import "../../chunk-242LG3VP.js"; 56 + import "../../chunk-BKRD2ZIW.js"; 57 + import "../../chunk-HNJPKCUJ.js"; 58 + import "../../chunk-4YB6QUPN.js"; 59 + import "../../chunk-SGR5ST3A.js"; 60 + import { 61 + __name, 62 + init_Buffer, 63 + init_process 64 + } from "../../chunk-FZQXS3RE.js"; 65 + 66 + // facets/l/index.js 67 + init_Buffer(); 68 + init_process(); 69 + createLoader({ 70 + $type: "sh.diffuse.output.facet", 71 + label: "Facet", 72 + source: /* @__PURE__ */ __name(() => { 73 + const output = foundation_default.orchestrator.output(); 74 + return output.facets; 75 + }, "source"), 76 + render(facet) { 77 + const container = ( 78 + /** @type {HTMLDivElement} */ 79 + document.querySelector("#container") 80 + ); 81 + const range = document.createRange(); 82 + range.selectNode(container); 83 + const documentFragment = range.createContextualFragment(facet.html ?? ""); 84 + container.innerHTML = ""; 85 + container.append(documentFragment); 86 + } 87 + }); 88 + 89 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/facets/l/index.js.map
··· 1 + {"version":3,"sources":["/index.js"],"sourcesContent":["import foundation from \"@common/facets/foundation.js\";\nimport { createLoader } from \"@common/loader.js\";\n\ncreateLoader({\n $type: \"sh.diffuse.output.facet\",\n label: \"Facet\",\n source: () => {\n const output = foundation.orchestrator.output();\n return output.facets;\n },\n render(facet) {\n // TODO: Validate if CID matches HTML\n const container = /** @type {HTMLDivElement} */ (\n document.querySelector(\"#container\")\n );\n\n const range = document.createRange();\n range.selectNode(container);\n const documentFragment = range.createContextualFragment(facet.html ?? \"\");\n\n container.innerHTML = \"\";\n container.append(documentFragment);\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAGA,aAAa;AAAA,EACX,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ,6BAAM;AACZ,UAAM,SAAS,mBAAW,aAAa,OAAO;AAC9C,WAAO,OAAO;AAAA,EAChB,GAHQ;AAAA,EAIR,OAAO,OAAO;AAEZ,UAAM;AAAA;AAAA,MACJ,SAAS,cAAc,YAAY;AAAA;AAGrC,UAAM,QAAQ,SAAS,YAAY;AACnC,UAAM,WAAW,SAAS;AAC1B,UAAM,mBAAmB,MAAM,yBAAyB,MAAM,QAAQ,EAAE;AAExE,cAAU,YAAY;AACtB,cAAU,OAAO,gBAAgB;AAAA,EACnC;AACF,CAAC;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/facets/l/index.js.map"}
+160
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/facets/tools/auto-queue.html
··· 1 + <main> 2 + <div class="panel"> 3 + <div class="row"> 4 + <button id="repeat" title="Toggle repeat"> 5 + <span class="with-icon"><i class="ph-bold ph-repeat"></i> Repeat</span> 6 + </button> 7 + <button id="shuffle" title="Toggle shuffle"> 8 + <span class="with-icon"><i class="ph-bold ph-shuffle"></i> Shuffle</span> 9 + </button> 10 + </div> 11 + <hr /> 12 + <div class="row"> 13 + <label class="with-icon" for="playlist"> 14 + <i class="ph-bold ph-playlist"></i> 15 + <select id="playlist"> 16 + <option value="">All tracks</option> 17 + </select> 18 + </label> 19 + </div> 20 + <div class="row"> 21 + <label class="with-icon" for="search"> 22 + <i class="ph-bold ph-magnifying-glass"></i> 23 + <input id="search" type="search" placeholder="Search" /> 24 + </label> 25 + </div> 26 + </div> 27 + </main> 28 + 29 + <style> 30 + @import "./styles/base.css"; 31 + @import "./styles/vendor/phosphor/bold/style.css"; 32 + @import "./styles/wireframe/ui.css"; 33 + 34 + body { 35 + display: flex; 36 + align-items: center; 37 + justify-content: center; 38 + height: 100dvh; 39 + } 40 + 41 + main { 42 + padding: var(--space-md); 43 + } 44 + 45 + label { 46 + flex: 1; 47 + letter-spacing: var(--leading-relaxed); 48 + text-transform: uppercase; 49 + } 50 + 51 + label input, 52 + label select { 53 + flex: 1; 54 + } 55 + 56 + .row button { 57 + flex: 1; 58 + } 59 + </style> 60 + 61 + <script type="module"> 62 + import foundation from "@diffuse/foundation"; 63 + import { effect } from "@diffuse/common/signal.js"; 64 + import * as Playlist from "@diffuse/common/playlist.js"; 65 + 66 + const ACTIVE_CLASS = "button--active"; 67 + 68 + // Setup 69 + foundation.features.fillQueueAutomatically(); 70 + foundation.features.processInputs(); 71 + 72 + const repeatShuffle = foundation.engine.repeatShuffle(); 73 + const scope = foundation.engine.scope(); 74 + const output = foundation.orchestrator.output(); 75 + 76 + // Elements 77 + const repeatBtn = 78 + /** @type {HTMLButtonElement} */ (document.querySelector("#repeat")); 79 + const shuffleBtn = 80 + /** @type {HTMLButtonElement} */ (document.querySelector("#shuffle")); 81 + const searchInput = 82 + /** @type {HTMLInputElement} */ (document.querySelector("#search")); 83 + const playlistSelect = 84 + /** @type {HTMLSelectElement} */ (document.querySelector("#playlist")); 85 + 86 + // Repeat & Shuffle state 87 + effect(() => { 88 + repeatBtn.classList.toggle(ACTIVE_CLASS, repeatShuffle.repeat()); 89 + }); 90 + 91 + effect(() => { 92 + shuffleBtn.classList.toggle(ACTIVE_CLASS, repeatShuffle.shuffle()); 93 + }); 94 + 95 + // Actions 96 + repeatBtn.onclick = () => { 97 + repeatShuffle.setRepeat(!repeatShuffle.repeat()); 98 + }; 99 + 100 + shuffleBtn.onclick = () => { 101 + repeatShuffle.setShuffle(!repeatShuffle.shuffle()); 102 + }; 103 + 104 + // Search state 105 + effect(() => { 106 + searchInput.value = scope.searchTerm() ?? ""; 107 + }); 108 + 109 + searchInput.oninput = () => { 110 + scope.setSearchTerm(searchInput.value.trim() || undefined); 111 + }; 112 + 113 + // Playlist state 114 + effect(() => { 115 + const items = output.playlistItems.collection(); 116 + const currentPlaylist = scope.playlist(); 117 + 118 + // Group items by playlist name 119 + const playlistMap = Playlist.gather(items); 120 + const all = [...playlistMap.values()].sort((a, b) => 121 + a.name.localeCompare(b.name) 122 + ); 123 + 124 + const ordered = all.filter((p) => !p.unordered); 125 + const unordered = all.filter((p) => p.unordered); 126 + 127 + playlistSelect.innerHTML = `<option value="">All tracks</option>`; 128 + 129 + for ( 130 + const [label, group] of [ 131 + ["Ordered", ordered], 132 + ["Unordered", unordered], 133 + ] 134 + ) { 135 + if (group.length === 0) continue; 136 + 137 + const optgroup = document.createElement("optgroup"); 138 + optgroup.label = /** @type {string} */ (label); 139 + 140 + for (const playlist of group) { 141 + if (typeof playlist === "string") continue; 142 + const option = document.createElement("option"); 143 + 144 + option.value = playlist.name; 145 + option.textContent = playlist.name; 146 + option.selected = playlist.name === currentPlaylist; 147 + 148 + optgroup.appendChild(option); 149 + } 150 + 151 + playlistSelect.appendChild(optgroup); 152 + } 153 + }); 154 + 155 + playlistSelect.onchange = () => { 156 + scope.setPlaylist( 157 + playlistSelect.value.length ? playlistSelect.value : undefined, 158 + ); 159 + }; 160 + </script>
+242
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/facets/tools/v3-import.html
··· 1 + <main> 2 + <div class="panel"> 3 + <p> 4 + Import data from the previous version of Diffuse (v3). Upload the snapshot JSON file you 5 + exported. 6 + </p> 7 + <hr /> 8 + <div class="row"> 9 + <label class="with-icon" for="file"> 10 + <i class="ph-bold ph-upload"></i> 11 + <input id="file" type="file" accept=".json,application/json" /> 12 + </label> 13 + </div> 14 + <hr /> 15 + <div class="row"> 16 + <button id="import-favourites" disabled> 17 + <span class="with-icon"><i class="ph-fill ph-star"></i> Import favourites</span> 18 + </button> 19 + </div> 20 + <div class="row"> 21 + <button id="import-playlists" disabled> 22 + <span class="with-icon"><i class="ph-bold ph-playlist"></i> Import playlists</span> 23 + </button> 24 + </div> 25 + <div id="status" class="status" hidden></div> 26 + </div> 27 + </main> 28 + 29 + <style> 30 + @import "./styles/base.css"; 31 + @import "./styles/vendor/phosphor/bold/style.css"; 32 + @import "./styles/vendor/phosphor/fill/style.css"; 33 + @import "./styles/wireframe/ui.css"; 34 + 35 + body { 36 + display: flex; 37 + align-items: center; 38 + justify-content: center; 39 + height: 100dvh; 40 + } 41 + 42 + main { 43 + padding: var(--space-md); 44 + } 45 + 46 + p { 47 + line-height: var(--leading-relaxed); 48 + max-width: 42ch; 49 + } 50 + 51 + label { 52 + flex: 1; 53 + } 54 + 55 + input[type="file"] { 56 + flex: 1; 57 + } 58 + 59 + .status { 60 + margin-top: var(--space-sm); 61 + font-size: var(--text-sm); 62 + } 63 + 64 + .status--success { 65 + color: var(--accent); 66 + 67 + @media (prefers-color-scheme: dark) { 68 + color: var(--accent-twist-4); 69 + } 70 + } 71 + 72 + .status--error { 73 + color: var(--accent-twist-5); 74 + 75 + @media (prefers-color-scheme: dark) { 76 + color: var(--accent-twist-3); 77 + } 78 + } 79 + </style> 80 + 81 + <script type="module"> 82 + import * as TID from "@atcute/tid"; 83 + import foundation from "@diffuse/foundation"; 84 + 85 + /** 86 + * @import {PlaylistItem, Track} from "@diffuse/definitions/types.d.ts" 87 + */ 88 + 89 + // Setup 90 + foundation.features.processInputs(); 91 + 92 + const favourites = foundation.orchestrator.favourites(); 93 + const output = foundation.orchestrator.output(); 94 + 95 + // Elements 96 + const fileInput = 97 + /** @type {HTMLInputElement} */ (document.querySelector("#file")); 98 + const importFavouritesBtn = 99 + /** @type {HTMLButtonElement} */ (document.querySelector( 100 + "#import-favourites", 101 + )); 102 + const importPlaylistsBtn = 103 + /** @type {HTMLButtonElement} */ (document.querySelector( 104 + "#import-playlists", 105 + )); 106 + const statusEl = /** @type {HTMLElement} */ (document.querySelector("#status")); 107 + 108 + /** @type {Record<string, any> | null} */ 109 + let json = null; 110 + 111 + /** 112 + * Show a status message. 113 + * @param {string} message 114 + * @param {"success" | "error"} type 115 + */ 116 + function showStatus(message, type) { 117 + statusEl.textContent = message; 118 + statusEl.className = `status status--${type}`; 119 + statusEl.hidden = false; 120 + } 121 + 122 + // Parse file on selection 123 + fileInput.onchange = async () => { 124 + const file = fileInput.files?.[0]; 125 + 126 + json = null; 127 + statusEl.hidden = true; 128 + importFavouritesBtn.disabled = true; 129 + importPlaylistsBtn.disabled = true; 130 + 131 + if (!file) return; 132 + 133 + try { 134 + json = JSON.parse(await file.text()); 135 + } catch (err) { 136 + console.error("Failed to parse JSON:", err); 137 + showStatus( 138 + `Failed to parse JSON: ${/** @type {Error} */ (err).message}`, 139 + "error", 140 + ); 141 + return; 142 + } 143 + 144 + if (json?.favourites?.data?.length > 0) { 145 + importFavouritesBtn.disabled = false; 146 + } 147 + 148 + if (json?.playlists?.data?.length > 0) { 149 + importPlaylistsBtn.disabled = false; 150 + } 151 + }; 152 + 153 + // Import favourites on button click 154 + importFavouritesBtn.onclick = async () => { 155 + /** @type {any[]} */ 156 + const items = json?.favourites?.data; 157 + if (!items || items.length === 0) return; 158 + 159 + try { 160 + /** @type {Track[]} */ 161 + const tracks = items.map((item) => ({ 162 + $type: "sh.diffuse.output.track", 163 + id: "", 164 + uri: "", 165 + tags: { 166 + artist: item.artist ?? "", 167 + title: item.title ?? "", 168 + }, 169 + })); 170 + 171 + await favourites.include(tracks); 172 + showStatus(`Imported ${tracks.length} favourite(s).`, "success"); 173 + } catch (err) { 174 + console.error("Import failed:", err); 175 + showStatus(`Import failed: ${/** @type {Error} */ (err).message}`, "error"); 176 + } 177 + }; 178 + 179 + // Import playlists on button click 180 + importPlaylistsBtn.onclick = async () => { 181 + /** @type {any[]} */ 182 + const items = json?.playlists?.data; 183 + if (!items || items.length === 0) return; 184 + 185 + try { 186 + const now = new Date().toISOString(); 187 + const existing = output.playlistItems.collection() ?? []; 188 + const existingPlaylistNames = new Set(existing.map((p) => p.playlist)); 189 + 190 + const newPlaylistItems = items 191 + .filter((item) => !existingPlaylistNames.has(item.name ?? "Untitled")) 192 + .flatMap((item) => { 193 + const playlistName = item.name ?? "Untitled"; 194 + const isUnordered = !!item.collection; 195 + 196 + /** @type {PlaylistItem[]} */ 197 + const playlistItems = []; 198 + 199 + /** @type {any[]} */ (item.tracks ?? []).forEach((track, index) => { 200 + playlistItems.push({ 201 + $type: "sh.diffuse.output.playlistItem", 202 + id: TID.now(), 203 + playlist: playlistName, 204 + positionedAfter: isUnordered 205 + ? undefined 206 + : index > 0 207 + ? playlistItems[index - 1].id 208 + : undefined, 209 + criteria: [ 210 + { 211 + field: "tags.album", 212 + value: track.album ?? "", 213 + transformations: ["toLowerCase"], 214 + }, 215 + { 216 + field: "tags.artist", 217 + value: track.artist ?? "", 218 + transformations: ["toLowerCase"], 219 + }, 220 + { 221 + field: "tags.title", 222 + value: track.title ?? "", 223 + transformations: ["toLowerCase"], 224 + }, 225 + ], 226 + createdAt: now, 227 + updatedAt: now, 228 + }); 229 + }); 230 + 231 + return playlistItems; 232 + }); 233 + 234 + await output.playlistItems.save([...existing, ...newPlaylistItems]); 235 + const playlistCount = new Set(newPlaylistItems.map((p) => p.playlist)).size; 236 + showStatus(`Imported ${playlistCount} playlist(s).`, "success"); 237 + } catch (err) { 238 + console.error("Import failed:", err); 239 + showStatus(`Import failed: ${/** @type {Error} */ (err).message}`, "error"); 240 + } 241 + }; 242 + </script>
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/favicon-16x16.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/favicon-16x16.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/favicon-32x32.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/favicon-32x32.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/favicon.ico
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/favicon.ico
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/fonts/CommitMonoVariable.woff2
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/fonts/CommitMonoVariable.woff2
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/fonts/InterVariable-Italic.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/fonts/InterVariable-Italic.woff2
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/fonts/InterVariable.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/fonts/InterVariable.woff2
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/fonts/ms_sans_serif.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif.woff2
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/fonts/ms_sans_serif_bold.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif_bold.woff2
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/1.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/1.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/10.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/10.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/11.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/11.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/12.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/12.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/13.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/13.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/14.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/14.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/15.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/15.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/16.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/16.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/17.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/17.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/18.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/18.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/19.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/19.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/2.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/2.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/20.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/20.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/21.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/21.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/22.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/22.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/23.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/23.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/24.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/24.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/25.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/25.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/26.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/26.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/27.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/27.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/28.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/28.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/29.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/29.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/3.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/3.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/30.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/30.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/4.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/4.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/5.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/5.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/6.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/6.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/7.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/7.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/8.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/8.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/9.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/9.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/1.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/1.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/10.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/10.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/11.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/11.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/12.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/12.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/13.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/13.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/14.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/14.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/15.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/15.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/16.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/16.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/17.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/17.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/18.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/18.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/19.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/19.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/2.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/2.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/20.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/20.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/21.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/21.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/22.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/22.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/23.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/23.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/24.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/24.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/25.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/25.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/26.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/26.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/27.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/27.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/28.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/28.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/29.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/29.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/3.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/3.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/30.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/30.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/4.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/4.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/5.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/5.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/6.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/6.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/7.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/7.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/8.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/8.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/background/thumbnails/9.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/9.jpg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/diffuse-current.svg
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/diffuse-current.svg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/diffuse-dark.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse-dark.svg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/diffuse-grey.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse-grey.svg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/diffuse-light.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse-light.svg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/diffuse__icon-dark.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse__icon-dark.svg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/diffuse__icon-grey.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse__icon-grey.svg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/diffuse__icon-light.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse__icon-light.svg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icon-square-ws.png
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/icon-square-ws.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icon-square.png
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/icon-square.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icon.png
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/icon.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/catalog-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/catalog-1.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/cd_audio_cd_a-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/cd_audio_cd_a-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-2.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/cd_audio_cd_a-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-3.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/cd_audio_cd_a-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-4.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/cd_drive-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_drive-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/cd_drive_purple-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_drive_purple-3.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/channels-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/channels-2.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/check-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/check-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/computer_sound-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/computer_sound-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/computer_user_pencil-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/computer_user_pencil-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/connected_world-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/connected_world-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/directory_admin_tools-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_admin_tools-3.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/directory_admin_tools-5.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_admin_tools-5.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/directory_channels-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_channels-2.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/directory_channels-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_channels-3.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/directory_closed-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_closed-3.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/directory_closed-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_closed-4.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/directory_control_panel-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_control_panel-2.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/directory_control_panel-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_control_panel-3.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/directory_explorer-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_explorer-4.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/directory_explorer-5.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_explorer-5.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/directory_favorites-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_favorites-2.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/directory_favorites-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_favorites-4.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/directory_net_web-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_net_web-3.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/directory_net_web-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_net_web-4.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/directory_network_conn-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_network_conn-3.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/directory_network_conn-5.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_network_conn-5.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/directory_open_file_mydocs_2k-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_open_file_mydocs_2k-3.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/directory_open_file_mydocs_2k-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_open_file_mydocs_2k-4.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/gears-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/gears-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/globe_map-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/globe_map-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/help_book_big-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/help_book_big-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/installer-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/installer-3.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/installer_generic_old-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/installer_generic_old-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/keys-5.png
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/images/icons/windows_98/keys-5.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/loudspeaker_wave-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/loudspeaker_wave-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/magnifying_glass-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/magnifying_glass-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/magnifying_glass_4-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/magnifying_glass_4-1.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/media_player-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/media_player-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/media_player_stream_no.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/media_player_stream_no.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/ms_dos-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/ms_dos-1.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/msg_error-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_error-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/msg_information-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_information-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/msg_question-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_question-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/msg_warning-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_warning-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/multimedia-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/multimedia-4.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/network_drive_world-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/network_drive_world-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/no-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/no-1.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/restrict-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/restrict-1.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/search_computer-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/search_computer-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/search_server-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/search_server-1.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/search_web-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/search_web-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/settings_gear-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/settings_gear-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/settings_gear-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/settings_gear-2.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/tip.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/tip.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/utopia_smiley.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/utopia_smiley.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/winamp2-32x32.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/winamp2-32x32.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/windows-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/windows-0.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/world-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/world-2.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/world-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/world-4.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/images/icons/windows_98/world_network_directories-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/world_network_directories-3.png
+556
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/index.html
··· 1 + <html lang="en"> 2 + <head> 3 + <meta charset="UTF-8" /> 4 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 5 + 6 + <title>Diffuse</title> 7 + 8 + <!-- Base --> 9 + <base href="./" /> 10 + 11 + <!-- Favicons & Mobile --> 12 + <link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png" /> 13 + <link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png" /> 14 + <link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png" /> 15 + <!-- TODO: <link rel="manifest" href="site.webmanifest" />--> 16 + <link rel="mask-icon" href="safari-pinned-tab.svg" color="#8a90a9" /> 17 + <meta name="msapplication-TileColor" content="#8a90a9" /> 18 + <meta name="theme-color" content="#8a90a9" /> 19 + 20 + <!-- Styles --> 21 + <link rel="stylesheet" href="styles/base.css" /> 22 + <link rel="stylesheet" href="styles/diffuse/page.css" /> 23 + <link rel="stylesheet" href="styles/vendor/phosphor/bold/style.css" /> 24 + <link rel="stylesheet" href="styles/vendor/phosphor/fill/style.css" /> 25 + 26 + <!-- Scripts --> 27 + <script src="index.js" type="module"></script> 28 + </head> 29 + <body> 30 + <header> 31 + <div> 32 + <h1 class="diffuse-logo"> 33 + <svg viewBox="0 0 902 134" width="160"> 34 + <title>Diffuse</title> 35 + <use 36 + xlink:href="images/diffuse-current.svg#diffuse" 37 + href="images/diffuse-current.svg#diffuse"></use> 38 + </svg> 39 + 40 + <span id="status"> 41 + <a href="/latest/" title="Upgrade to latest" class="animate-spin"> 42 + <i class="ph-bold ph-spinner"></i> 43 + </a> 44 + <a href="/chronicle/" title="Browse versions of Diffuse"> 45 + <i class="ph-fill ph-star-four"></i> 46 + </a> 47 + </span> 48 + </h1> 49 + <p class="construct dither-mask"> 50 + Your audio<br />your data<br />your rules 51 + </p> 52 + <p> 53 + Diffuse is a collection of components and software that make it possible to listen to audio from various sources on your devices and the web, and to create the ideal digital audio listening experience for you. 54 + </p> 55 + <p style="align-items: center; display: flex; gap: var(--space-2xs); opacity: 0.55;"> 56 + <i class="ph-fill ph-crane"></i> 57 + <strong style="font-weight: 700;">WORK IN PROGRESS</strong> 58 + </p> 59 + <ul class="table-of-contents"> 60 + <li><a href="#usage">Usage</a></li> 61 + <li><a href="#themes">Themes</a></li> 62 + <li><a href="#facets">Facets</a></li> 63 + <li><a href="#agency">Agency</a></li> 64 + <li><a href="#elements">Elements</a></li> 65 + <li><a href="#definitions">Definitions</a></li> 66 + </ul> 67 + <p> 68 + <small>Built by <a href="https://tokono.ma">tokono.ma</a></small> 69 + </p> 70 + </div> 71 + <div class="dither-mask filler"></div> 72 + </header> 73 + <main> 74 + <!-- USAGE --> 75 + <section> 76 + <h2 id="usage">Usage</h2> 77 + 78 + <div class="columns"> 79 + <div class="element"> 80 + <p> 81 + The easiest way to start is by exploring the software. If you prefer a traditional pre&shy;packaged application approach, you can check out <a href="themes/">themes</a>. Themes can look and function entirely different from each other, so make sure to explore! 82 + </p> 83 + 84 + <p> 85 + Alternatively, there's <a href="facets/">facets</a> which allows you to use any component from any theme interchange&shy;ably, among pieces that are not in themes; each in a separate browser tab. Each tab talks to each other, so you can for example browse audio in one tab and play it in another. 86 + </p> 87 + </div> 88 + 89 + <div class="element"> 90 + <p> 91 + <strong style="color: var(--accent); font-weight: 700;">Diffuse is not your typical streaming service though, you have to add sources of audio.</strong> To start you can try out the demo by clicking the button below, or, go to a <a href="themes/">theme</a> or <a href="facets/">facet</a> that lets you add your audio input. 92 + </p> 93 + 94 + <p> 95 + <button id="add-sample-content"> 96 + <span>Add sample content</span> 97 + </button> 98 + </p> 99 + </div> 100 + </div> 101 + </section> 102 + 103 + <!-- THEMES & FACETS --> 104 + <div class="columns"> 105 + <section> 106 + <h2 id="themes">Themes</h2> 107 + 108 + <p> 109 + Themes are element compositions and provide a traditional browser web application way of 110 + using them. In other words, pretty much the whole thing, besides your data, lives inside a single browser tab. 111 + </p> 112 + 113 + <p> 114 + <a class="button button--alt" href="themes/">Explore</a> 115 + </p> 116 + </section> 117 + 118 + <section> 119 + <h2 id="facets">Facets</h2> 120 + 121 + <p> 122 + Facets are various interface components each loaded in their own web page. Every used component is configured so that it operates in broadcast mode, making all the pages communicate with each other. 123 + </p> 124 + 125 + <p> 126 + <a class="button button--alt" href="facets/">Explore</a> 127 + </p> 128 + </section> 129 + </div> 130 + 131 + <!-- AGENCY --> 132 + <section> 133 + <h2 id="agency">Agency</h2> 134 + 135 + <p> 136 + The goal is for every user, no matter their experience, to have agency over their data and their software. One can start with making small changes and gradually progress to making big changes. 137 + </p> 138 + 139 + <p> 140 + You can store your user-data in various places, and easily export, import and sync it. 141 + </p> 142 + 143 + <h3>Take control</h3> 144 + 145 + <ul class="columns"> 146 + <div class="element"> 147 + <!-- 1 --> 148 + <li> 149 + <p> 150 + <i class="ph-fill ph-storefront"></i> <strong>Level 1</strong>: Pick your restaurant, food comes in all shapes and sizes. The equivalent of choosing a Diffuse <a href="themes/">theme</a>. 151 + </p> 152 + </li> 153 + <!-- 2 --> 154 + <li> 155 + <p> 156 + <i class="ph-fill ph-basket"></i> <strong>Level 2</strong>: Take out food from various places, eg. cheese shop + bakery. You choose how you combine the foods and from where you order them. That's <a href="facets/">facets</a>. 157 + </p> 158 + </li> 159 + <!-- 3 --> 160 + <li> 161 + <p> 162 + <i class="ph-fill ph-pepper"></i> <strong>Level 3</strong>: Now that you know which food is good and how to make combinations, you might make a slight customization, add a little something of your own (eg. add some spice). However, you're not quite confident enough which spice to pick, so you hire some help. 163 + </p> 164 + <p> 165 + This can be done using the <a href="facets/#builder">facets builder</a> which allows you to build on top of a familiar preconfigured foundation and load custom facets. People might share their own, or maybe you use an LLM to generate something for you (eg. an album art gallery). 166 + </p> 167 + </li> 168 + <!-- 4 --> 169 + <li> 170 + <p> 171 + <i class="ph-fill ph-knife"></i> <strong>Level 4</strong>: You learned a bit from watching and talking to the help you hired, so you decide to take things in your own hands. 172 + </p> 173 + <p> 174 + You continue to use the <a href="facets/#builder">facets builder</a> but learn a bit of <a href="https://htmlforpeople.com">HTML</a>, <a href="https://javascript.info">Javascript</a> and <a href="https://htmlforpeople.com/css-basics/">CSS</a>; so you're able to write your own facet. 175 + </p> 176 + </li> 177 + </div> 178 + <div class="element"> 179 + <!-- 5 --> 180 + <li> 181 + <p> 182 + <i class="ph-fill ph-cooking-pot"></i> <strong>Level 5</strong>: At this point you're confident enough to make a meal from scratch. You can start very simple, eg. just throwing a steak in the pan with some butter and some salt to it. Then later add some baked potatoes and go from there. 183 + </p> 184 + <p> 185 + A similar tool comes into play here, the <a href="themes/#builder">themes builder</a>. Same concept as the facets builder, but now you need to specify the foundation yourself. You can use the <a href="#elements">elements</a> listed below to do so. The code for these is available from this website or through the <a href="https://jsr.io/@toko/diffuse">Javascript package</a>. 186 + </p> 187 + </li> 188 + <!-- 6 --> 189 + <li> 190 + <p> 191 + <i class="ph-fill ph-storefront"></i> <strong>Level 6</strong>: You open your own restaurant. 192 + </p> 193 + <p> 194 + You can host the theme you made on any web server, it's only HTML after all. Only difference is that you'll have to create the entire HTML tree, not just the body element, as is the case with the theme builder. 195 + </p> 196 + </li> 197 + <!-- 7 --> 198 + <li> 199 + <p> 200 + <i class="ph-fill ph-chef-hat"></i> <strong>Level 7</strong>: You got promoted to master chef. Time to open your own restaurant chain. 201 + </p> 202 + <p> 203 + You can self-host Diffuse, it's <a href="https://tangled.org/tokono.ma/diffuse/blob/v4/">open-source</a>! Or you present your own collection of elements. 204 + </p> 205 + </li> 206 + </div> 207 + </ul> 208 + </section> 209 + 210 + <!-- ELEMENTS --> 211 + <section> 212 + <h2 id="elements">Elements</h2> 213 + 214 + <p> 215 + The (web) components of the system. These custom elements are then recombined into an entire music player experience, or whatever you want to build. 216 + </p> 217 + 218 + <p> 219 + Consume these using the facets <a href="facets/#builder">builder</a>, the Javascript <a href="https://jsr.io/@toko/diffuse">package</a>, or the linked Javascript files down below. 220 + </p> 221 + 222 + <div class="columns"> 223 + <div class="element"> 224 + <h3>Configurators</h3> 225 + 226 + <p> 227 + <em> 228 + Elements that serve as an intermediate in order to make a particular kind of element configurable. In other words, these allow for an element to be swapped out with another that takes the same set of the actions and data output. 229 + </em> 230 + </p> 231 + 232 + <ul> 233 + <li> 234 + <a href="components/configurator/input/element.js">Input</a> 235 + <div class="list-description">Allows for multiple inputs to be used at once.</div> 236 + </li> 237 + <li> 238 + <a href="components/configurator/output/element.js">Output</a> 239 + <div class="list-description">Enables the user to configure a specific output. If no default output is set, it creates a temporary session by storing everything in memory.</div> 240 + </li> 241 + <li> 242 + <span class="todo">[todo]</span> 243 + <span>Scrobbles</span> 244 + <div class="list-description">Configure multiple scrobblers (music trackers).</div> 245 + </li> 246 + </ul> 247 + 248 + </div> 249 + 250 + 251 + <div class="element"> 252 + <h3>Engines</h3> 253 + 254 + <p> 255 + <em> 256 + Elements with each a singular purpose and don't have any UI. There are specialised UI and orchestrator elements that control these. 257 + </em> 258 + </p> 259 + 260 + <ul> 261 + <li> 262 + <a href="components/engine/audio/element.js">Audio</a> 263 + <div class="list-description">Plays audio through audio elements.</div> 264 + </li> 265 + <li> 266 + <a href="components/engine/queue/element.js">Queue</a> 267 + <div class="list-description">A queue for tracks.</div> 268 + </li> 269 + <li> 270 + <a href="components/engine/repeat-shuffle/element.js">Repeat & Shuffle</a> 271 + <div class="list-description">Signals synced with local storage (classified by group) that decide if audio should be repeated and if the queue should be shuffled when filling it.</div> 272 + </li> 273 + <li> 274 + <a href="components/engine/scope/element.js">Scope</a> 275 + <div class="list-description">Signals that could influence the scope of a set of tracks.</div> 276 + </li> 277 + </ul> 278 + 279 + </div> 280 + 281 + 282 + <div class="element"> 283 + <h3>Input</h3> 284 + 285 + <p> 286 + <em> 287 + Inputs are sources of audio tracks. Each track is an entry in the list of possible items to play. These can be files or streams, static or dynamic. 288 + </em> 289 + </p> 290 + 291 + <ul> 292 + <li> 293 + <a href="components/input/https/element.js">HTTPS</a> 294 + <div class="list-description">HTTPS URLs to audio files or streams.</div> 295 + </li> 296 + <li> 297 + <span class="todo">[todo]</span> 298 + <span>HTTPS (JSON)</span> 299 + <div class="list-description">Generate tracks based on HTTPS servers that provide JSON (directory) listings.</div> 300 + </li> 301 + <li> 302 + <a href="components/input/local/element.js">Local</a> 303 + <div class="list-description">Audio files or directories from your local device, using the browser's File System Access API.</div> 304 + </li> 305 + <li> 306 + <a href="components/input/opensubsonic/element.js">Opensubsonic</a> 307 + <div class="list-description">Add any (open)subsonic server.</div> 308 + </li> 309 + <li> 310 + <a href="components/input/s3/element.js">S3</a> 311 + <div class="list-description">AWS S3 and services that provide the same surface API such as Cloudflare R2.</div> 312 + </li> 313 + <li> 314 + <span class="todo">[todo]</span> 315 + <span>WebDAV</span> 316 + <div class="list-description">Add any WebDAV server.</div> 317 + </li> 318 + </ul> 319 + 320 + </div> 321 + 322 + 323 + <div class="element"> 324 + <h3>Orchestrators</h3> 325 + 326 + <p> 327 + <em> 328 + These too are element compositions. However, unlike themes, these are purely logical. Mostly exist in order to construct sensible defaults to use across themes and other compositions. 329 + </em> 330 + </p> 331 + 332 + <ul> 333 + <li> 334 + <a href="components/orchestrator/auto-queue/element.js">Automatic queue</a> 335 + <div class="list-description">Fill the queue automatically with non-manual items (shuffled or regular, based on repeat-shuffle engine).</div> 336 + </li> 337 + <li> 338 + <a href="components/orchestrator/favourites/element.js">Favourites</a> 339 + <div class="list-description">Mark tracks as favourites. Automatically creates an unordered 'Favourites' playlist.</div> 340 + </li> 341 + <li> 342 + <a href="components/orchestrator/input/element.js">Input</a> 343 + <div class="list-description"><strong>A default input configuration.</strong> Contains all the inputs provided here.</div> 344 + </li> 345 + <li> 346 + <a href="components/orchestrator/media-session/element.js">Media Session</a> 347 + <div class="list-description">Keeps the browser/os media session in sync with queue and audio state. Adds handlers for previous, next, seek to, etc.</div> 348 + </li> 349 + <li> 350 + <a href="components/orchestrator/output/element.js">Output</a> 351 + <div class="list-description"><strong>A default output configuration.</strong> Contains all the outputs provided here along with the relevant transformers.</div> 352 + </li> 353 + <li> 354 + <a href="components/orchestrator/process-tracks/element.js">Process inputs into tracks</a> 355 + <div class="list-description">Whenever the cached tracks are initially loaded through the passed output element it will list tracks by using the passed input element. Afterwards it loops over all tracks and checks if metadata needs to be fetched. If anything has changed, it'll pass the results to the output element.</div> 356 + </li> 357 + <li> 358 + <a href="components/orchestrator/queue-audio/element.js">Queue ⭤ Audio</a> 359 + <div class="list-description">Connects the given queue engine to the given audio engine.</div> 360 + </li> 361 + <li> 362 + <a href="components/orchestrator/sources/element.js">Sources</a> 363 + <div class="list-description">Monitor tracks from the given output to form a list of sources based on the input's sources return value.</div> 364 + </li> 365 + <li> 366 + <a href="components/orchestrator/scoped-tracks/element.js">Scoped Tracks</a> 367 + <div class="list-description">Supplies the tracks from the given output to the given search processor whenever the tracks collection changes. Additionally it can perform a search and other ways to reduce the scope of tracks based on the given scope engine. Provides a <code>tracks</code> signal similar to <code>output.tracks.collection</code></div> 368 + </li> 369 + </ul> 370 + 371 + </div> 372 + 373 + 374 + <div class="element"> 375 + <h3>Output</h3> 376 + 377 + <p> 378 + <em> 379 + Output is application-derived data such as playlists. These elements can receive such data and keep it around. These are categorised by the type of data they ingest, or many types in the case of polymorphic. Optionally use transformers to convert output into the expected format. 380 + </em> 381 + </p> 382 + 383 + <ul> 384 + <li> 385 + <a href="components/output/polymorphic/indexed-db/element.js">Polymorphic / IndexedDB</a> 386 + <div class="list-description">Stores output into the local indexedDB. Supports any type of data that indexedDB supports.</div> 387 + </li> 388 + <li> 389 + <a href="components/output/bytes/s3/element.js">Bytes / S3</a> 390 + <div class="list-description">Store output data on AWS S3 or compatible services such as Cloudflare R2.</div> 391 + </li> 392 + <li> 393 + <a href="components/output/raw/atproto/element.js">Raw / AT Protocol</a> 394 + <div class="list-description">Store your user data on the storage associated with your ATProtocol identity. Data is lexicon shaped by default so this element takes in that data directly without any transformations.</div> 395 + </li> 396 + </ul> 397 + 398 + </div> 399 + 400 + 401 + <div class="element"> 402 + <h3>Processors</h3> 403 + 404 + <p> 405 + <em> 406 + These elements work with the output generated by the input elements to add more data to them, or process them in some other way. 407 + </em> 408 + </p> 409 + 410 + <ul> 411 + <li> 412 + <a href="components/processor/artwork/element.js">Artwork</a> 413 + <div class="list-description">Fetches cover art for a given set of tracks, stored locally in indexedDB. Checks the audio metadata first, then MusicBrainz and uses Last.fm as the fallback.</div> 414 + </li> 415 + <li> 416 + <a href="components/processor/metadata/element.js">Metadata</a> 417 + <div class="list-description">Fetch audio metadata for a given set of tracks, adding to the <code>Track</code> object.</div> 418 + </li> 419 + <li> 420 + <a href="components/processor/search/element.js">Search</a> 421 + <div class="list-description">Provides a way to search through a collection of tracks, powered by orama.js</div> 422 + </li> 423 + </ul> 424 + 425 + </div> 426 + 427 + 428 + <div class="element"> 429 + <h3>Supplements</h3> 430 + 431 + <p> 432 + <em> 433 + Additional elements, such as scrobblers. 434 + </em> 435 + </p> 436 + 437 + <ul> 438 + <li> 439 + <span class="todo">[todo]</span> 440 + <span>Last.fm scrobbler</span> 441 + </li> 442 + <li> 443 + <span class="todo">[todo]</span> 444 + <span>ListenBrainz scrobbler</span> 445 + </li> 446 + <li> 447 + <span class="todo">[todo]</span> 448 + <span>Rocksky scrobbler</span> 449 + </li> 450 + <li> 451 + <span class="todo">[todo]</span> 452 + <span>Teal.fm scrobbler</span> 453 + </li> 454 + </ul> 455 + 456 + </div> 457 + 458 + 459 + <div class="element"> 460 + <h3>Transformers</h3> 461 + 462 + <p> 463 + <em> 464 + Transform data from one format or schema into another. See schema section below for more information. Just as configurators, these are intermediates and require to have the same set of actions as the element it targets. 465 + </em> 466 + </p> 467 + 468 + <ul> 469 + <li> 470 + <span class="todo">[todo]</span> 471 + <span>Output / Bytes / Automerge</span> 472 + <div class="list-description">Translate data to and from an Automerge CRDT.</div> 473 + </li> 474 + <li> 475 + <span class="todo">[todo]</span> 476 + <span>Output / Bytes / Cambria lenses</span> 477 + <div class="list-description">Uses the Cambria library to seamlessly translate between data schemas so that no data migration is needed.</div> 478 + </li> 479 + <li> 480 + <a href="components/transformer/output/bytes/dasl-sync/element.js">Output / Bytes / DASL Sync</a> 481 + <div class="list-description">Syncs data between local and remote using CID-based diffing and performs union merges with tombstone tracking when both sides have diverged.</div> 482 + </li> 483 + <li> 484 + <a href="components/transformer/output/bytes/json/element.js">Output / Bytes / JSON</a> 485 + <div class="list-description">Raw data schema output ⇄ JSON Uint8Array.</div> 486 + </li> 487 + <li> 488 + <a href="components/transformer/output/raw/atproto-sync/element.js">Output / Raw / AT Protocol Sync</a> 489 + <div class="list-description">Wraps an AT Protocol output with a local IndexedDB cache. Uses the repo revision to skip unnecessary fetches and performs union merges with tombstone tracking when both local and remote have diverged.</div> 490 + </li> 491 + <li> 492 + <a href="components/transformer/output/refiner/default/element.js">Output / Refiner / Default</a> 493 + <div class="list-description">The task of a refiner transformer is to remove the output state that is not meant to be saved to storage. For example, ephemeral tracks; this transformer will keep them in memory, but they will not be present in the output. <strong>Ideally this is part of every theme, but you may swap it out with another transformer that might provide better defaults.</strong></div> 494 + </li> 495 + <li> 496 + <a href="components/transformer/output/refiner/track-uri-passkey/element.js">Output / Refiner / Track URI Passkey</a> 497 + <div class="list-description">Encrypts track URIs using a passkey-derived PRF key. On read, decrypts <code>encrypted://</code> URIs transparently; on write, re-encrypts all URIs before passing downstream. Tracks that cannot be decrypted are held separately and excluded from the visible collection.</div> 498 + </li> 499 + <li> 500 + <a href="components/transformer/output/string/json/element.js">Output / String / JSON</a> 501 + <div class="list-description">Raw data schema output ⇄ JSON UTF8 string.</div> 502 + </li> 503 + </ul> 504 + 505 + </div> 506 + 507 + </div> 508 + </section> 509 + 510 + <!-- DEFINITIONS --> 511 + <section> 512 + <h2 id="definitions">Definitions</h2> 513 + 514 + <p>All of the elements here are built with these data definitions in mind. That said, you can mix elements that use different definitions; you just have to put a transformer between them in order to translate between them, if needed.</p> 515 + 516 + <ul> 517 + <li> 518 + <a href="definitions/output/collaboration.json">Output / Collaboration</a> 519 + <div class="list-description">Represents a collaboration between multiple collaborators on a subject, such as a playlist.</div> 520 + </li> 521 + <li> 522 + <a href="definitions/output/facet.json">Output / Facet</a> 523 + <div class="list-description">Facet pointer or HTML snippet.</div> 524 + </li> 525 + <li> 526 + <a href="definitions/output/playlistItem.json">Output / Playlist Item</a> 527 + <div class="list-description">Represents a single item in a playlist. Tracks are matched based on the given criteria. A playlist is formed by grouping items by their playlist property.</div> 528 + </li> 529 + <li> 530 + <a href="definitions/output/playlistItemBundle.json">Output / Playlist Item Bundle</a> 531 + <div class="list-description">A bundle of playlist items.</div> 532 + </li> 533 + <li> 534 + <span class="todo">[todo]</span> 535 + <span>Output / Progress</span> 536 + <div class="list-description">Used to track progress of (long) audio playback.</div> 537 + </li> 538 + <li> 539 + <a href="definitions/output/theme.json">Output / Theme</a> 540 + <div class="list-description">Theme pointer or HTML snippet.</div> 541 + </li> 542 + <li> 543 + <a href="definitions/output/track.json">Output / Track</a> 544 + <div class="list-description">Represents audio that can be played, or a placeholder for a source of tracks. Contains a URI that will resolve to the audio.</div> 545 + </li> 546 + <li> 547 + <a href="definitions/output/trackBundle.json">Output / Track Bundle</a> 548 + <div class="list-description">A bundle of tracks.</div> 549 + </li> 550 + </ul> 551 + 552 + </section> 553 + </main> 554 + 555 + </body> 556 + </html>
+139
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/index.js
··· 1 + import { 2 + GROUP 3 + } from "./chunk-ZUHY7USF.js"; 4 + import "./chunk-UMMPFCLQ.js"; 5 + import "./chunk-G4P4YFWD.js"; 6 + import { 7 + element_default as element_default4 8 + } from "./chunk-6JNRNMZQ.js"; 9 + import "./chunk-YV3SRJQF.js"; 10 + import "./chunk-ESYALJPH.js"; 11 + import { 12 + element_default as element_default3 13 + } from "./chunk-OSKZBJ24.js"; 14 + import "./chunk-XGM6M423.js"; 15 + import "./chunk-6KMZB5IA.js"; 16 + import "./chunk-B63ZUKFI.js"; 17 + import { 18 + element_default as element_default5 19 + } from "./chunk-TXU4RB3O.js"; 20 + import "./chunk-3ENCKNXO.js"; 21 + import "./chunk-PKN6FN7E.js"; 22 + import "./chunk-NP7LZHKR.js"; 23 + import "./chunk-M2MAFKPM.js"; 24 + import "./chunk-MVUUUQRL.js"; 25 + import "./chunk-GKE6NGNQ.js"; 26 + import "./chunk-VWO2GNWZ.js"; 27 + import "./chunk-QSPAYUAI.js"; 28 + import "./chunk-I3VKG3ZJ.js"; 29 + import { 30 + element_default as element_default2 31 + } from "./chunk-OIRYE7B4.js"; 32 + import "./chunk-3AO35WC3.js"; 33 + import "./chunk-JBHW662S.js"; 34 + import "./chunk-GX3WPNEX.js"; 35 + import "./chunk-FJBTJV3K.js"; 36 + import "./chunk-PTVB4Y37.js"; 37 + import "./chunk-HN4F5JEZ.js"; 38 + import "./chunk-NBQPHQFP.js"; 39 + import "./chunk-QERJLR3Q.js"; 40 + import "./chunk-OBWEBS4T.js"; 41 + import "./chunk-S6SMX4HA.js"; 42 + import "./chunk-XRGLBUX4.js"; 43 + import "./chunk-R3EQQDW5.js"; 44 + import "./chunk-GQIBEDKG.js"; 45 + import "./chunk-DDF5P57I.js"; 46 + import "./chunk-EEUCFWD4.js"; 47 + import "./chunk-6DRHTH2U.js"; 48 + import "./chunk-TSYF7OPM.js"; 49 + import { 50 + element_default 51 + } from "./chunk-GCLDJKYV.js"; 52 + import "./chunk-KJFA7KRK.js"; 53 + import "./chunk-HMBZONBJ.js"; 54 + import "./chunk-6CB2LXND.js"; 55 + import "./chunk-V7EQPFPD.js"; 56 + import "./chunk-G56PUJUJ.js"; 57 + import "./chunk-6DKPDMFE.js"; 58 + import "./chunk-TP5GZFTO.js"; 59 + import "./chunk-ZQZJJU3T.js"; 60 + import "./chunk-BKRD2ZIW.js"; 61 + import "./chunk-HNJPKCUJ.js"; 62 + import "./chunk-SGR5ST3A.js"; 63 + import { 64 + __name, 65 + init_Buffer, 66 + init_process 67 + } from "./chunk-FZQXS3RE.js"; 68 + 69 + // index.js 70 + init_Buffer(); 71 + init_process(); 72 + var s3 = new element_default2(); 73 + var input = new element_default(); 74 + input.setAttribute("group", GROUP); 75 + input.append(s3); 76 + var output = new element_default3(); 77 + output.setAttribute("group", GROUP); 78 + var metadataProcessor = new element_default4(); 79 + metadataProcessor.setAttribute("group", GROUP); 80 + document.body.append(input, output, metadataProcessor); 81 + var pto = new element_default5(); 82 + pto.setAttribute("group", GROUP); 83 + pto.setAttribute("input-selector", input.selector); 84 + pto.setAttribute("output-selector", output.selector); 85 + pto.setAttribute("metadata-processor-selector", metadataProcessor.selector); 86 + document.body.append(pto); 87 + var addDemoBtn = document.querySelector("#add-sample-content"); 88 + async function addSampleContent() { 89 + if (!addDemoBtn) return; 90 + addDemoBtn.setAttribute("disabled", ""); 91 + addDemoBtn.innerHTML = `<span> 92 + <i class="ph-fill ph-hourglass-medium"></i> 93 + Adding source 94 + </span>`; 95 + const demo = await s3.demo(); 96 + await output.tracks.loaded(); 97 + addDemoBtn.innerHTML = `<span> 98 + <i class="ph-fill ph-hourglass-medium"></i> 99 + Processing source 100 + </span>`; 101 + await output.tracks.save([...output.tracks.collection(), demo.track]); 102 + await pto.process(); 103 + addDemoBtn.innerHTML = `<span> 104 + <i class="ph-fill ph-check-fat"></i> Added 105 + </span>`; 106 + } 107 + __name(addSampleContent, "addSampleContent"); 108 + addDemoBtn?.addEventListener("click", addSampleContent); 109 + if (document.location.hostname.endsWith("diffuse.sh")) { 110 + document.querySelectorAll("#status").forEach(async (status) => { 111 + const versionOrCid = document.location.pathname.slice(1).split("/")[0]?.toLowerCase() ?? ""; 112 + const usesCid = versionOrCid.startsWith("bafy"); 113 + const { default: artifacts } = await import(`${document.location.origin}/artifacts.json`, { with: { type: "json" } }); 114 + const lastArtifact = Object.values(artifacts).reverse()[0]; 115 + const isLatest = usesCid ? versionOrCid === lastArtifact.cid : versionOrCid === lastArtifact.version; 116 + status.querySelectorAll(".ph-spinner").forEach((icon) => { 117 + icon.parentElement?.classList.add("hidden"); 118 + setTimeout(() => { 119 + icon.parentElement?.classList.remove("animate-spin"); 120 + icon.classList.remove("ph-spinner"); 121 + icon.classList.add("ph-arrow-fat-lines-up"); 122 + }, 500); 123 + }); 124 + status.querySelectorAll(`[href="/latest/"]`).forEach((a) => { 125 + if (usesCid) a.setAttribute("href", "/latest/hash/"); 126 + if (!isLatest) { 127 + setTimeout(() => { 128 + a.classList.remove("hidden"); 129 + }, 750); 130 + } 131 + }); 132 + }); 133 + } else { 134 + document.querySelectorAll("#status").forEach((status) => { 135 + status.remove(); 136 + }); 137 + } 138 + 139 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/index.js.map
··· 1 + {"version":3,"sources":["/index.js"],"sourcesContent":["import { GROUP } from \"@common/facets/foundation.js\";\n\nimport { effect } from \"@common/signal.js\";\n\nimport InputConfigurator from \"@components/configurator/input/element.js\";\nimport MetadataProcessor from \"@components/processor/metadata/element.js\";\nimport OutputOrchestrator from \"@components/orchestrator/output/element.js\";\nimport ProcessTracksOrchestrator from \"@components/orchestrator/process-tracks/element.js\";\nimport S3Input from \"@components/input/s3/element.js\";\n\n// Add components to DOM\nconst s3 = new S3Input();\nconst input = new InputConfigurator();\ninput.setAttribute(\"group\", GROUP);\ninput.append(s3);\n\nconst output = new OutputOrchestrator();\noutput.setAttribute(\"group\", GROUP);\n\nconst metadataProcessor = new MetadataProcessor();\nmetadataProcessor.setAttribute(\"group\", GROUP);\n\ndocument.body.append(input, output, metadataProcessor);\n\nconst pto = new ProcessTracksOrchestrator();\npto.setAttribute(\"group\", GROUP);\npto.setAttribute(\"input-selector\", input.selector);\npto.setAttribute(\"output-selector\", output.selector);\npto.setAttribute(\"metadata-processor-selector\", metadataProcessor.selector);\n\ndocument.body.append(pto);\n\n// Demo\nconst addDemoBtn = document.querySelector(\"#add-sample-content\");\n\nasync function addSampleContent() {\n if (!addDemoBtn) return;\n\n addDemoBtn.setAttribute(\"disabled\", \"\");\n addDemoBtn.innerHTML = `<span>\n <i class=\"ph-fill ph-hourglass-medium\"></i>\n Adding source\n </span>`;\n\n const demo = await s3.demo();\n await output.tracks.loaded();\n\n addDemoBtn.innerHTML = `<span>\n <i class=\"ph-fill ph-hourglass-medium\"></i>\n Processing source\n </span>`;\n\n await output.tracks.save([...output.tracks.collection(), demo.track]);\n\n await pto.process();\n\n addDemoBtn.innerHTML = `<span>\n <i class=\"ph-fill ph-check-fat\"></i> Added\n </span>`;\n}\n\naddDemoBtn?.addEventListener(\"click\", addSampleContent);\n\n// Version upgrade (only works with `diffuse-artifacts` deployments)\nif (document.location.hostname.endsWith(\"diffuse.sh\")) {\n document.querySelectorAll(\"#status\").forEach(async (status) => {\n const versionOrCid =\n document.location.pathname.slice(1).split(\"/\")[0]?.toLowerCase() ?? \"\";\n const usesCid = versionOrCid.startsWith(\"bafy\");\n const { default: artifacts } = await import(\n `${document.location.origin}/artifacts.json`,\n { with: { type: \"json\" } }\n );\n\n // Latest is located at the end\n const lastArtifact = Object.values(artifacts).reverse()[0];\n\n // Check if using latest\n const isLatest = usesCid\n ? versionOrCid === lastArtifact.cid\n : versionOrCid === lastArtifact.version;\n\n // Remove loading animation\n status.querySelectorAll(\".ph-spinner\").forEach((icon) => {\n icon.parentElement?.classList.add(\"hidden\");\n\n setTimeout(() => {\n icon.parentElement?.classList.remove(\"animate-spin\");\n icon.classList.remove(\"ph-spinner\");\n icon.classList.add(\"ph-arrow-fat-lines-up\");\n }, 500);\n });\n\n // If using CID, append `/hash/` to href\n status.querySelectorAll(`[href=\"/latest/\"]`).forEach((a) => {\n if (usesCid) a.setAttribute(\"href\", \"/latest/hash/\");\n if (!isLatest) {\n setTimeout(() => {\n a.classList.remove(\"hidden\");\n }, 750);\n }\n });\n });\n} else {\n document.querySelectorAll(\"#status\").forEach((status) => {\n status.remove();\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAWA,IAAM,KAAK,IAAIA,iBAAQ;AACvB,IAAM,QAAQ,IAAI,gBAAkB;AACpC,MAAM,aAAa,SAAS,KAAK;AACjC,MAAM,OAAO,EAAE;AAEf,IAAM,SAAS,IAAIA,iBAAmB;AACtC,OAAO,aAAa,SAAS,KAAK;AAElC,IAAM,oBAAoB,IAAIA,iBAAkB;AAChD,kBAAkB,aAAa,SAAS,KAAK;AAE7C,SAAS,KAAK,OAAO,OAAO,QAAQ,iBAAiB;AAErD,IAAM,MAAM,IAAIA,iBAA0B;AAC1C,IAAI,aAAa,SAAS,KAAK;AAC/B,IAAI,aAAa,kBAAkB,MAAM,QAAQ;AACjD,IAAI,aAAa,mBAAmB,OAAO,QAAQ;AACnD,IAAI,aAAa,+BAA+B,kBAAkB,QAAQ;AAE1E,SAAS,KAAK,OAAO,GAAG;AAGxB,IAAM,aAAa,SAAS,cAAc,qBAAqB;AAE/D,eAAe,mBAAmB;AAChC,MAAI,CAAC,WAAY;AAEjB,aAAW,aAAa,YAAY,EAAE;AACtC,aAAW,YAAY;AAAA;AAAA;AAAA;AAKvB,QAAM,OAAO,MAAM,GAAG,KAAK;AAC3B,QAAM,OAAO,OAAO,OAAO;AAE3B,aAAW,YAAY;AAAA;AAAA;AAAA;AAKvB,QAAM,OAAO,OAAO,KAAK,CAAC,GAAG,OAAO,OAAO,WAAW,GAAG,KAAK,KAAK,CAAC;AAEpE,QAAM,IAAI,QAAQ;AAElB,aAAW,YAAY;AAAA;AAAA;AAGzB;AAxBe;AA0Bf,YAAY,iBAAiB,SAAS,gBAAgB;AAGtD,IAAI,SAAS,SAAS,SAAS,SAAS,YAAY,GAAG;AACrD,WAAS,iBAAiB,SAAS,EAAE,QAAQ,OAAO,WAAW;AAC7D,UAAM,eACJ,SAAS,SAAS,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,YAAY,KAAK;AACtE,UAAM,UAAU,aAAa,WAAW,MAAM;AAC9C,UAAM,EAAE,SAAS,UAAU,IAAI,MAAM,OACnC,GAAG,SAAS,SAAS,MAAM,mBAC3B,EAAE,MAAM,EAAE,MAAM,OAAO,EAAE;AAI3B,UAAM,eAAe,OAAO,OAAO,SAAS,EAAE,QAAQ,EAAE,CAAC;AAGzD,UAAM,WAAW,UACb,iBAAiB,aAAa,MAC9B,iBAAiB,aAAa;AAGlC,WAAO,iBAAiB,aAAa,EAAE,QAAQ,CAAC,SAAS;AACvD,WAAK,eAAe,UAAU,IAAI,QAAQ;AAE1C,iBAAW,MAAM;AACf,aAAK,eAAe,UAAU,OAAO,cAAc;AACnD,aAAK,UAAU,OAAO,YAAY;AAClC,aAAK,UAAU,IAAI,uBAAuB;AAAA,MAC5C,GAAG,GAAG;AAAA,IACR,CAAC;AAGD,WAAO,iBAAiB,mBAAmB,EAAE,QAAQ,CAAC,MAAM;AAC1D,UAAI,QAAS,GAAE,aAAa,QAAQ,eAAe;AACnD,UAAI,CAAC,UAAU;AACb,mBAAW,MAAM;AACf,YAAE,UAAU,OAAO,QAAQ;AAAA,QAC7B,GAAG,GAAG;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH,OAAO;AACL,WAAS,iBAAiB,SAAS,EAAE,QAAQ,CAAC,WAAW;AACvD,WAAO,OAAO;AAAA,EAChB,CAAC;AACH;","names":["element_default"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/index.js.map"}
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/mstile-150x150.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/mstile-150x150.png
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/node_crypto-QYMDOTAM.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/node_crypto-QYMDOTAM.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/node_crypto-QYMDOTAM.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/node_crypto-QYMDOTAM.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/oauth-client-metadata.json
··· 1 + ../bafybeicp5hi5rw4vffqlbmyqqaxhmxzx4ilejru3cq4esycpeyuuhen5ha/oauth-client-metadata.json
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/oauth-client-metadata.tunnel.json
··· 1 + ../bafybeicp5hi5rw4vffqlbmyqqaxhmxzx4ilejru3cq4esycpeyuuhen5ha/oauth-client-metadata.tunnel.json
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/oauth/callback/index.html
··· 1 + ../../../bafybeiauzef62425mum6ztycx7plxmceagc2pjl4uck4h2q6qjds3ahe2u/oauth/callback/index.html
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/oauth/callback/index.js
··· 1 + ../../../bafybeifzg2vr4j7pvtjsr5jbyswboxepndwv4tzkqwzc72k4xck7oaozii/oauth/callback/index.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/oauth/callback/index.js.map
··· 1 + ../../../bafybeifzg2vr4j7pvtjsr5jbyswboxepndwv4tzkqwzc72k4xck7oaozii/oauth/callback/index.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/safari-pinned-tab.svg
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/safari-pinned-tab.svg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/animations.css
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/animations.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/animations.css.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/animations.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/base.css
··· 1 + ../../bafybeiftdd7dlfoayxlckoz7nnnoun5ggr2p2biwnbnfn3zflg2drlkmca/styles/base.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/base.css.map
··· 1 + ../../bafybeiftdd7dlfoayxlckoz7nnnoun5ggr2p2biwnbnfn3zflg2drlkmca/styles/base.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/diffuse/colors.css
··· 1 + ../../../bafybeiftdd7dlfoayxlckoz7nnnoun5ggr2p2biwnbnfn3zflg2drlkmca/styles/diffuse/colors.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/diffuse/colors.css.map
··· 1 + ../../../bafybeiftdd7dlfoayxlckoz7nnnoun5ggr2p2biwnbnfn3zflg2drlkmca/styles/diffuse/colors.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/diffuse/fonts.css
··· 1 + ../../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/diffuse/fonts.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/diffuse/fonts.css.map
··· 1 + ../../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/diffuse/fonts.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/diffuse/page.css
··· 1 + ../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/styles/diffuse/page.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/diffuse/page.css.map
··· 1 + ../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/styles/diffuse/page.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/font-faces.css
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/font-faces.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/font-faces.css.map
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/font-faces.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/loader.css
··· 1 + ../../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/styles/loader.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/loader.css.map
··· 1 + ../../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/styles/loader.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/reset.css
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/reset.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/reset.css.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/reset.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/variables.css
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/variables.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/variables.css.map
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/variables.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/vendor/98.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/98.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/vendor/98.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/98.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/vendor/ms_sans_serif.woff2
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif.woff2
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/vendor/ms_sans_serif_bold.woff2
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif_bold.woff2
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/vendor/phosphor/bold/Phosphor-Bold.svg
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/Phosphor-Bold.svg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/vendor/phosphor/bold/Phosphor-Bold.ttf
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/Phosphor-Bold.ttf
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/vendor/phosphor/bold/Phosphor-Bold.woff
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/Phosphor-Bold.woff
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/vendor/phosphor/bold/Phosphor-Bold.woff2
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/Phosphor-Bold.woff2
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/vendor/phosphor/bold/style.css
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/style.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/vendor/phosphor/bold/style.css.map
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/style.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/vendor/phosphor/fill/Phosphor-Fill.svg
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.svg
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/vendor/phosphor/fill/Phosphor-Fill.ttf
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.ttf
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/vendor/phosphor/fill/Phosphor-Fill.woff
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.woff
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/vendor/phosphor/fill/Phosphor-Fill.woff2
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.woff2
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/vendor/phosphor/fill/style.css
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/style.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/vendor/phosphor/fill/style.css.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/style.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/wireframe/ui.css
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/wireframe/ui.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/styles/wireframe/ui.css.map
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/wireframe/ui.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/testing/index.html
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/testing/index.html
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/testing/output.js
··· 1 + ../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/testing/output.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/testing/output.js.map
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/testing/output.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/testing/output/index.html
··· 1 + ../../../bafybeic6tj6wx4iomrjs54m3je4e7lmq4jgcn7zqegufxtvqijffq32zkm/testing/output/index.html
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/testing/sample/tracks.js
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/testing/sample/tracks.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/testing/sample/tracks.js.map
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/testing/sample/tracks.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/blur/artwork-controller/element.css
··· 1 + ../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/themes/blur/artwork-controller/element.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/blur/artwork-controller/element.css.map
··· 1 + ../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/themes/blur/artwork-controller/element.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/blur/artwork-controller/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/themes/blur/artwork-controller/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/blur/artwork-controller/element.js.map
··· 1 + ../../../../bafybeidi3kcddz5dkh3zvsszshh4pe37cf4zjgco3xgydj77g7v3ksd2ya/themes/blur/artwork-controller/element.js.map
+33
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/blur/artwork-controller/facet.html
··· 1 + <style> 2 + @import "./styles/vendor/phosphor/bold/style.css"; 3 + @import "./styles/vendor/phosphor/fill/style.css"; 4 + @import "./styles/base.css"; 5 + </style> 6 + 7 + <script type="module"> 8 + import foundation from "@diffuse/foundation"; 9 + import ArtworkController from "@diffuse/themes/blur/artwork-controller/element.js"; 10 + 11 + // Setup the prerequisite elements 12 + foundation.features.playAudioFromQueue(); 13 + foundation.features.processInputs(); 14 + 15 + const aud = foundation.engine.audio(); 16 + const art = foundation.processor.artwork(); 17 + const fav = foundation.orchestrator.favourites(); 18 + const inp = foundation.orchestrator.input(); 19 + const out = foundation.orchestrator.output(); 20 + const que = foundation.engine.queue(); 21 + 22 + // Controller 23 + const dac = new ArtworkController(); 24 + dac.setAttribute("artwork-processor-selector", art.selector); 25 + dac.setAttribute("audio-engine-selector", aud.selector); 26 + dac.setAttribute("input-selector", inp.selector); 27 + dac.setAttribute("output-selector", out.selector); 28 + dac.setAttribute("queue-engine-selector", que.selector); 29 + dac.setAttribute("favourites-orchestrator-selector", fav.selector); 30 + 31 + // Add to DOM 32 + document.body.append(dac); 33 + </script>
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/blur/index.css
··· 1 + ../../../bafybeihr4brahqptxmxcdksktdfgs4hyl64odwx524vqmmitjvmn57sklq/themes/blur/index.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/blur/index.css.map
··· 1 + ../../../bafybeihr4brahqptxmxcdksktdfgs4hyl64odwx524vqmmitjvmn57sklq/themes/blur/index.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/blur/index.html
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/index.html
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/blur/index.js
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/blur/index.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/blur/index.js.map
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/blur/index.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/blur/variables.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/variables.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/blur/variables.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/variables.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/index.html
··· 1 + ../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/themes/index.html
+310
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/index.js
··· 1 + import { 2 + EditorView, 3 + autocompletion, 4 + basicSetup, 5 + css, 6 + html, 7 + javascript 8 + } from "../chunk-ZW7YO2UU.js"; 9 + import { 10 + foundation_default 11 + } from "../chunk-ZUHY7USF.js"; 12 + import "../chunk-UMMPFCLQ.js"; 13 + import "../chunk-G4P4YFWD.js"; 14 + import "../chunk-6JNRNMZQ.js"; 15 + import "../chunk-YV3SRJQF.js"; 16 + import "../chunk-ESYALJPH.js"; 17 + import "../chunk-OSKZBJ24.js"; 18 + import "../chunk-XGM6M423.js"; 19 + import "../chunk-6KMZB5IA.js"; 20 + import "../chunk-B63ZUKFI.js"; 21 + import "../chunk-TXU4RB3O.js"; 22 + import "../chunk-3ENCKNXO.js"; 23 + import "../chunk-PKN6FN7E.js"; 24 + import "../chunk-NP7LZHKR.js"; 25 + import "../chunk-M2MAFKPM.js"; 26 + import "../chunk-MVUUUQRL.js"; 27 + import "../chunk-GKE6NGNQ.js"; 28 + import "../chunk-VWO2GNWZ.js"; 29 + import "../chunk-QSPAYUAI.js"; 30 + import "../chunk-I3VKG3ZJ.js"; 31 + import "../chunk-OIRYE7B4.js"; 32 + import "../chunk-3AO35WC3.js"; 33 + import "../chunk-JBHW662S.js"; 34 + import "../chunk-GX3WPNEX.js"; 35 + import "../chunk-FJBTJV3K.js"; 36 + import "../chunk-PTVB4Y37.js"; 37 + import "../chunk-HN4F5JEZ.js"; 38 + import { 39 + i 40 + } from "../chunk-NBQPHQFP.js"; 41 + import "../chunk-QERJLR3Q.js"; 42 + import "../chunk-OBWEBS4T.js"; 43 + import "../chunk-S6SMX4HA.js"; 44 + import "../chunk-XRGLBUX4.js"; 45 + import "../chunk-R3EQQDW5.js"; 46 + import "../chunk-GQIBEDKG.js"; 47 + import "../chunk-DDF5P57I.js"; 48 + import "../chunk-EEUCFWD4.js"; 49 + import "../chunk-6DRHTH2U.js"; 50 + import "../chunk-TSYF7OPM.js"; 51 + import "../chunk-GCLDJKYV.js"; 52 + import "../chunk-KJFA7KRK.js"; 53 + import "../chunk-HMBZONBJ.js"; 54 + import "../chunk-6CB2LXND.js"; 55 + import { 56 + B, 57 + T 58 + } from "../chunk-V7EQPFPD.js"; 59 + import "../chunk-G56PUJUJ.js"; 60 + import { 61 + themeFromURI 62 + } from "../chunk-4LOJTZ72.js"; 63 + import "../chunk-6DKPDMFE.js"; 64 + import "../chunk-TP5GZFTO.js"; 65 + import "../chunk-ZQZJJU3T.js"; 66 + import { 67 + loadURI 68 + } from "../chunk-X6J7NMRW.js"; 69 + import "../chunk-WN6GL63Q.js"; 70 + import "../chunk-CRZ7HJJ4.js"; 71 + import "../chunk-242LG3VP.js"; 72 + import { 73 + now 74 + } from "../chunk-BKRD2ZIW.js"; 75 + import { 76 + effect, 77 + signal 78 + } from "../chunk-HNJPKCUJ.js"; 79 + import { 80 + create 81 + } from "../chunk-4YB6QUPN.js"; 82 + import "../chunk-SGR5ST3A.js"; 83 + import { 84 + __name, 85 + init_Buffer, 86 + init_process 87 + } from "../chunk-FZQXS3RE.js"; 88 + 89 + // themes/index.js 90 + init_Buffer(); 91 + init_process(); 92 + document.body.addEventListener( 93 + "click", 94 + /** 95 + * @param {MouseEvent} event 96 + */ 97 + async (event) => { 98 + const target = ( 99 + /** @type {HTMLElement} */ 100 + event.target 101 + ); 102 + const rel = target.getAttribute("rel"); 103 + if (!rel) return; 104 + const uri = target.closest("li")?.getAttribute("data-uri"); 105 + if (!uri) return; 106 + const name = target.closest("li")?.getAttribute("data-name"); 107 + if (!name) return; 108 + switch (rel) { 109 + case "fork": { 110 + const theme = await themeFromURI({ name, uri }, { fetchHTML: true }); 111 + editTheme(theme); 112 + document.querySelector("#build")?.scrollIntoView(); 113 + break; 114 + } 115 + case "save": { 116 + const theme = await themeFromURI({ name, uri }, { fetchHTML: false }); 117 + const out = foundation_default.orchestrator.output(); 118 + out.themes.save([ 119 + ...out.themes.collection(), 120 + theme 121 + ]); 122 + break; 123 + } 124 + } 125 + } 126 + ); 127 + var listEl = document.querySelector("#list"); 128 + if (!listEl) throw new Error("List element not found"); 129 + listEl.innerHTML = ""; 130 + var output = foundation_default.orchestrator.output(); 131 + effect(() => { 132 + const col = output.themes.collection().sort((a, b) => { 133 + return a.name.toLocaleLowerCase().localeCompare(b.name.toLocaleLowerCase()); 134 + }); 135 + const state = output.themes.state(); 136 + const h = col.length && state === "loaded" ? T` 137 + <ul> 138 + ${col.map( 139 + (c) => i( 140 + c.id, 141 + T` 142 + <li> 143 + <div style="position: relative;"> 144 + <a href="themes/l/?id=${c.id}"> 145 + ${c.name} 146 + </a> 147 + <button 148 + class="button--fixed button--transparent" 149 + popovertarget="theme-menu-col-${c.id}" 150 + style="anchor-name: --theme-anchor-col-${c.id}; position: absolute; right: 0; top: 50%; transform: translateY(-50%);" 151 + > 152 + <i class="ph-fill ph-dots-three-circle"></i> 153 + </button> 154 + </div> 155 + <div class="list-description"> 156 + ${c.uri && !c.html ? T` 157 + <span class="with-icon"> 158 + <i class="ph-fill ph-binoculars"></i> 159 + <span>Tracking the original <a href="${c.uri}">URI</a></span> 160 + </span> 161 + ` : T` 162 + <span class="with-icon"> 163 + <i class="ph-fill ph-code"></i> 164 + <span>Custom code</span> 165 + </span> 166 + `} 167 + </div> 168 + 169 + <!-- Dropdown Menu --> 170 + <div 171 + id="theme-menu-col-${c.id}" 172 + class="dropdown" 173 + style="position-anchor: --theme-anchor-col-${c.id}" 174 + popover 175 + > 176 + <a href="themes/l/?id=${c.id}"> 177 + <span class="with-icon"> 178 + <i class="ph-fill ph-globe"></i> Open 179 + </span> 180 + </a> 181 + <a @click="${() => editTheme(c)}"> 182 + <span class="with-icon"> 183 + <i class="ph-fill ph-cursor-text"></i> Edit 184 + </span> 185 + </a> 186 + <a @click="${deleteTheme({ id: c.id })}"> 187 + <span class="with-icon"> 188 + <i class="ph-fill ph-eraser"></i> Delete 189 + </span> 190 + </a> 191 + </div> 192 + </li> 193 + ` 194 + ) 195 + )} 196 + </ul> 197 + ` : state === "loaded" ? emptyThemesList : T` 198 + <div class="with-icon" style="font-size: var(--fs-sm);"> 199 + <i class="ph-bold ph-spinner-gap"></i> 200 + Loading items 201 + </div> 202 + `; 203 + B(h, listEl); 204 + }); 205 + var emptyThemesList = T` 206 + <p style="margin-bottom: 0;"> 207 + <i class="ph-fill ph-info"></i> You have not saved any themes yet. 208 + </p> 209 + `; 210 + function deleteTheme({ id }) { 211 + return () => { 212 + const c = confirm("Are you sure you want to delete this theme?"); 213 + if (!c) return; 214 + output.themes.save( 215 + output.themes.collection().filter((c2) => !(c2.id === id)) 216 + ); 217 + }; 218 + } 219 + __name(deleteTheme, "deleteTheme"); 220 + var $editingTheme = signal( 221 + /** @type {Theme | null} */ 222 + null 223 + ); 224 + var editorContainer = document.body.querySelector("#html-input-container"); 225 + if (!editorContainer) throw new Error("Editor container not found"); 226 + var editor = new EditorView({ 227 + parent: editorContainer, 228 + doc: ``.trim(), 229 + extensions: [ 230 + basicSetup, 231 + html(), 232 + css(), 233 + javascript(), 234 + autocompletion() 235 + ] 236 + }); 237 + document.querySelector("#build-form")?.addEventListener( 238 + "submit", 239 + onBuildSubmit 240 + ); 241 + async function onBuildSubmit(event) { 242 + event.preventDefault(); 243 + const nameEl = ( 244 + /** @type {HTMLInputElement | null} */ 245 + document.querySelector( 246 + "#name-input" 247 + ) 248 + ); 249 + const html2 = editor.state.doc.toString(); 250 + const cid = await create(85, new TextEncoder().encode(html2)); 251 + const name = nameEl?.value ?? "nameless"; 252 + const theme = $editingTheme.value ? { 253 + ...$editingTheme.value, 254 + cid, 255 + html: html2, 256 + name 257 + } : { 258 + $type: "sh.diffuse.output.theme", 259 + id: now(), 260 + cid, 261 + html: html2, 262 + name 263 + }; 264 + switch ( 265 + /** @type {any} */ 266 + event.submitter.name 267 + ) { 268 + case "save": 269 + await saveTheme(theme); 270 + break; 271 + case "save+open": 272 + await saveTheme(theme); 273 + globalThis.open(`./themes/l/?id=${theme.id}`, "blank"); 274 + break; 275 + } 276 + } 277 + __name(onBuildSubmit, "onBuildSubmit"); 278 + async function editTheme(ogTheme) { 279 + const theme = { ...ogTheme }; 280 + const nameEl = ( 281 + /** @type {HTMLInputElement | null} */ 282 + document.querySelector( 283 + "#name-input" 284 + ) 285 + ); 286 + if (!nameEl) return; 287 + if (!theme.html && theme.uri) { 288 + const html2 = await loadURI(theme.uri); 289 + const cid = await create(85, new TextEncoder().encode(html2)); 290 + theme.html = html2; 291 + theme.cid = cid; 292 + } 293 + $editingTheme.value = theme; 294 + nameEl.value = theme.name; 295 + editor.dispatch({ 296 + changes: { from: 0, to: editor.state.doc.length, insert: theme.html } 297 + }); 298 + } 299 + __name(editTheme, "editTheme"); 300 + async function saveTheme(theme) { 301 + const col = output.themes.collection(); 302 + const colWithoutId = col.filter((c) => c.id !== theme.id); 303 + await output.themes.save([...colWithoutId, { 304 + ...theme, 305 + updatedAt: (/* @__PURE__ */ new Date()).toISOString() 306 + }]); 307 + } 308 + __name(saveTheme, "saveTheme"); 309 + 310 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/index.js.map
··· 1 + {"version":3,"sources":["/index.js"],"sourcesContent":["import { html, render } from \"lit-html\";\nimport { keyed } from \"lit-html/directives/keyed.js\";\n\nimport { basicSetup, EditorView } from \"codemirror\";\nimport { css as langCss } from \"@codemirror/lang-css\";\nimport { html as langHtml } from \"@codemirror/lang-html\";\nimport { javascript as langJs } from \"@codemirror/lang-javascript\";\nimport { autocompletion } from \"@codemirror/autocomplete\";\n\nimport * as TID from \"@atcute/tid\";\n\nimport * as CID from \"@common/cid.js\";\nimport foundation from \"@common/facets/foundation.js\";\nimport { effect, signal } from \"@common/signal.js\";\nimport { themeFromURI } from \"@common/themes/utils.js\";\nimport { loadURI } from \"@common/loader.js\";\n\n/**\n * @import {Theme} from \"@definitions/types.d.ts\"\n */\n\n////////////////////////////////////////////\n// SAVE & FORK\n////////////////////////////////////////////\n\ndocument.body.addEventListener(\n \"click\",\n /**\n * @param {MouseEvent} event\n */\n async (event) => {\n const target = /** @type {HTMLElement} */ (event.target);\n const rel = target.getAttribute(\"rel\");\n if (!rel) return;\n\n const uri = target.closest(\"li\")?.getAttribute(\"data-uri\");\n if (!uri) return;\n\n const name = target.closest(\"li\")?.getAttribute(\"data-name\");\n if (!name) return;\n\n switch (rel) {\n case \"fork\": {\n const theme = await themeFromURI({ name, uri }, { fetchHTML: true });\n editTheme(theme);\n document.querySelector(\"#build\")?.scrollIntoView();\n break;\n }\n case \"save\": {\n const theme = await themeFromURI({ name, uri }, { fetchHTML: false });\n const out = foundation.orchestrator.output();\n\n out.themes.save([\n ...out.themes.collection(),\n theme,\n ]);\n break;\n }\n }\n },\n);\n\n////////////////////////////////////////////\n// YOUR COLLECTION\n////////////////////////////////////////////\n\n/** @type {HTMLElement | null} */\nconst listEl = document.querySelector(\"#list\");\nif (!listEl) throw new Error(\"List element not found\");\n\nlistEl.innerHTML = \"\";\n\nconst output = foundation.orchestrator.output();\n\neffect(() => {\n const col = output.themes.collection().sort((a, b) => {\n return a.name.toLocaleLowerCase().localeCompare(b.name.toLocaleLowerCase());\n });\n\n const state = output.themes.state();\n\n const h = col.length && state === \"loaded\"\n ? html`\n <ul>\n ${col.map((c) =>\n keyed(\n c.id,\n html`\n <li>\n <div style=\"position: relative;\">\n <a href=\"themes/l/?id=${c.id}\">\n ${c.name}\n </a>\n <button\n class=\"button--fixed button--transparent\"\n popovertarget=\"theme-menu-col-${c.id}\"\n style=\"anchor-name: --theme-anchor-col-${c\n .id}; position: absolute; right: 0; top: 50%; transform: translateY(-50%);\"\n >\n <i class=\"ph-fill ph-dots-three-circle\"></i>\n </button>\n </div>\n <div class=\"list-description\">\n ${c.uri && !c.html\n ? html`\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-binoculars\"></i>\n <span>Tracking the original <a href=\"${c\n .uri}\">URI</a></span>\n </span>\n `\n : html`\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-code\"></i>\n <span>Custom code</span>\n </span>\n `}\n </div>\n\n <!-- Dropdown Menu -->\n <div\n id=\"theme-menu-col-${c.id}\"\n class=\"dropdown\"\n style=\"position-anchor: --theme-anchor-col-${c.id}\"\n popover\n >\n <a href=\"themes/l/?id=${c.id}\">\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-globe\"></i> Open\n </span>\n </a>\n <a @click=\"${() => editTheme(c)}\">\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-cursor-text\"></i> Edit\n </span>\n </a>\n <a @click=\"${deleteTheme({ id: c.id })}\">\n <span class=\"with-icon\">\n <i class=\"ph-fill ph-eraser\"></i> Delete\n </span>\n </a>\n </div>\n </li>\n `,\n )\n )}\n </ul>\n `\n : state === \"loaded\"\n ? emptyThemesList\n : html`\n <div class=\"with-icon\" style=\"font-size: var(--fs-sm);\">\n <i class=\"ph-bold ph-spinner-gap\"></i>\n Loading items\n </div>\n `;\n\n render(h, listEl);\n});\n\nconst emptyThemesList = html`\n <p style=\"margin-bottom: 0;\">\n <i class=\"ph-fill ph-info\"></i> You have not saved any themes yet.\n </p>\n`;\n\n/**\n * @param {{ id: string }} _\n */\nfunction deleteTheme({ id }) {\n return () => {\n const c = confirm(\"Are you sure you want to delete this theme?\");\n if (!c) return;\n\n output.themes.save(\n output.themes.collection().filter((c) => !(c.id === id)),\n );\n };\n}\n\n////////////////////////////////////////////\n// BUILD\n////////////////////////////////////////////\n\nconst $editingTheme = signal(/** @type {Theme | null} */ (null));\n\n// Code editor\nconst editorContainer = document.body.querySelector(\"#html-input-container\");\nif (!editorContainer) throw new Error(\"Editor container not found\");\n\nconst editor = new EditorView({\n parent: editorContainer,\n doc: ``.trim(),\n extensions: [\n basicSetup,\n langHtml(),\n langCss(),\n langJs(),\n autocompletion(),\n ],\n});\n\n// Form submit\ndocument.querySelector(\"#build-form\")?.addEventListener(\n \"submit\",\n onBuildSubmit,\n);\n\n/**\n * @param {Event} event\n */\nasync function onBuildSubmit(event) {\n event.preventDefault();\n\n const nameEl = /** @type {HTMLInputElement | null} */ (document.querySelector(\n \"#name-input\",\n ));\n\n const html = editor.state.doc.toString();\n const cid = await CID.create(0x55, new TextEncoder().encode(html));\n const name = nameEl?.value ?? \"nameless\";\n\n /** @type {Theme} */\n const theme = $editingTheme.value\n ? {\n ...$editingTheme.value,\n cid,\n html,\n name,\n }\n : {\n $type: \"sh.diffuse.output.theme\",\n id: TID.now(),\n cid,\n html,\n name,\n };\n\n switch (/** @type {any} */ (event).submitter.name) {\n case \"save\":\n await saveTheme(theme);\n break;\n case \"save+open\":\n await saveTheme(theme);\n globalThis.open(`./themes/l/?id=${theme.id}`, \"blank\");\n break;\n }\n}\n\n/**\n * @param {Theme} ogTheme\n */\nasync function editTheme(ogTheme) {\n const theme = { ...ogTheme };\n const nameEl = /** @type {HTMLInputElement | null} */ (document.querySelector(\n \"#name-input\",\n ));\n\n if (!nameEl) return;\n\n // Make sure HTML is loaded\n if (!theme.html && theme.uri) {\n const html = await loadURI(theme.uri);\n const cid = await CID.create(0x55, new TextEncoder().encode(html));\n\n theme.html = html;\n theme.cid = cid;\n }\n\n $editingTheme.value = theme;\n nameEl.value = theme.name;\n\n editor.dispatch({\n changes: { from: 0, to: editor.state.doc.length, insert: theme.html },\n });\n}\n\n/**\n * @param {Theme} theme\n */\nasync function saveTheme(theme) {\n const col = output.themes.collection();\n const colWithoutId = col.filter((c) => c.id !== theme.id);\n await output.themes.save([...colWithoutId, {\n ...theme,\n updatedAt: new Date().toISOString(),\n }]);\n}\n"],"mappings":"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","names":["c","html"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/themes/index.js.map"}
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/l/index.css
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/l/index.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/l/index.css.map
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/l/index.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/l/index.html
··· 1 + ../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/themes/l/index.html
+84
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/l/index.js
··· 1 + import { 2 + foundation_default 3 + } from "../../chunk-ZUHY7USF.js"; 4 + import "../../chunk-UMMPFCLQ.js"; 5 + import "../../chunk-G4P4YFWD.js"; 6 + import "../../chunk-6JNRNMZQ.js"; 7 + import "../../chunk-YV3SRJQF.js"; 8 + import "../../chunk-ESYALJPH.js"; 9 + import "../../chunk-OSKZBJ24.js"; 10 + import "../../chunk-XGM6M423.js"; 11 + import "../../chunk-6KMZB5IA.js"; 12 + import "../../chunk-B63ZUKFI.js"; 13 + import "../../chunk-TXU4RB3O.js"; 14 + import "../../chunk-3ENCKNXO.js"; 15 + import "../../chunk-PKN6FN7E.js"; 16 + import "../../chunk-NP7LZHKR.js"; 17 + import "../../chunk-M2MAFKPM.js"; 18 + import "../../chunk-MVUUUQRL.js"; 19 + import "../../chunk-GKE6NGNQ.js"; 20 + import "../../chunk-VWO2GNWZ.js"; 21 + import "../../chunk-QSPAYUAI.js"; 22 + import "../../chunk-I3VKG3ZJ.js"; 23 + import "../../chunk-OIRYE7B4.js"; 24 + import "../../chunk-3AO35WC3.js"; 25 + import "../../chunk-JBHW662S.js"; 26 + import "../../chunk-GX3WPNEX.js"; 27 + import "../../chunk-FJBTJV3K.js"; 28 + import "../../chunk-PTVB4Y37.js"; 29 + import "../../chunk-HN4F5JEZ.js"; 30 + import "../../chunk-NBQPHQFP.js"; 31 + import "../../chunk-QERJLR3Q.js"; 32 + import "../../chunk-OBWEBS4T.js"; 33 + import "../../chunk-S6SMX4HA.js"; 34 + import "../../chunk-XRGLBUX4.js"; 35 + import "../../chunk-R3EQQDW5.js"; 36 + import "../../chunk-GQIBEDKG.js"; 37 + import "../../chunk-DDF5P57I.js"; 38 + import "../../chunk-EEUCFWD4.js"; 39 + import "../../chunk-6DRHTH2U.js"; 40 + import "../../chunk-TSYF7OPM.js"; 41 + import "../../chunk-GCLDJKYV.js"; 42 + import "../../chunk-KJFA7KRK.js"; 43 + import "../../chunk-HMBZONBJ.js"; 44 + import "../../chunk-6CB2LXND.js"; 45 + import "../../chunk-V7EQPFPD.js"; 46 + import "../../chunk-G56PUJUJ.js"; 47 + import "../../chunk-6DKPDMFE.js"; 48 + import "../../chunk-TP5GZFTO.js"; 49 + import "../../chunk-ZQZJJU3T.js"; 50 + import { 51 + createLoader 52 + } from "../../chunk-X6J7NMRW.js"; 53 + import "../../chunk-WN6GL63Q.js"; 54 + import "../../chunk-CRZ7HJJ4.js"; 55 + import "../../chunk-242LG3VP.js"; 56 + import "../../chunk-BKRD2ZIW.js"; 57 + import "../../chunk-HNJPKCUJ.js"; 58 + import "../../chunk-4YB6QUPN.js"; 59 + import "../../chunk-SGR5ST3A.js"; 60 + import { 61 + __name, 62 + init_Buffer, 63 + init_process 64 + } from "../../chunk-FZQXS3RE.js"; 65 + 66 + // themes/l/index.js 67 + init_Buffer(); 68 + init_process(); 69 + createLoader({ 70 + $type: "sh.diffuse.output.theme", 71 + label: "Theme", 72 + source: /* @__PURE__ */ __name(() => { 73 + const output = foundation_default.orchestrator.output(); 74 + return output.themes; 75 + }, "source"), 76 + render(theme) { 77 + const iframe = document.createElement("iframe"); 78 + iframe.srcdoc = theme.html ?? ""; 79 + document.body.innerHTML = ""; 80 + document.body.append(iframe); 81 + } 82 + }); 83 + 84 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/l/index.js.map
··· 1 + {"version":3,"sources":["/index.js"],"sourcesContent":["import foundation from \"@common/facets/foundation.js\";\nimport { createLoader } from \"@common/loader.js\";\n\ncreateLoader({\n $type: \"sh.diffuse.output.theme\",\n label: \"Theme\",\n source: () => {\n const output = foundation.orchestrator.output();\n return output.themes;\n },\n render(theme) {\n // TODO: Validate if CID matches HTML\n const iframe = document.createElement(\"iframe\");\n iframe.srcdoc = theme.html ?? \"\";\n\n document.body.innerHTML = \"\";\n document.body.append(iframe);\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAGA,aAAa;AAAA,EACX,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ,6BAAM;AACZ,UAAM,SAAS,mBAAW,aAAa,OAAO;AAC9C,WAAO,OAAO;AAAA,EAChB,GAHQ;AAAA,EAIR,OAAO,OAAO;AAEZ,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,SAAS,MAAM,QAAQ;AAE9B,aAAS,KAAK,YAAY;AAC1B,aAAS,KAAK,OAAO,MAAM;AAAA,EAC7B;AACF,CAAC;","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/themes/l/index.js.map"}
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/98-extra.css
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/98-extra.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/98-extra.css.map
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/98-extra.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/98-vars.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/98-vars.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/98-vars.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/98-vars.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/browser/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/themes/webamp/browser/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/browser/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/browser/element.js.map
+41
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/browser/facet.html
··· 1 + <div class="window"> 2 + <div class="title-bar"> 3 + <div class="title-bar-icon"> 4 + <img src="images/icons/windows_98/directory_explorer-4.png" height="14" /> 5 + </div> 6 + <div class="title-bar-text" draggable="false">Browse collection</div> 7 + <div class="title-bar-controls"> 8 + <button aria-label="Close" onclick="window.close()"></button> 9 + </div> 10 + </div> 11 + <div class="window-body"> 12 + <div id="placeholder"></div> 13 + </div> 14 + </div> 15 + 16 + <style> 17 + @import "./styles/vendor/98.css"; 18 + @import "./themes/webamp/fonts.css"; 19 + @import "./themes/webamp/facet.css"; 20 + </style> 21 + 22 + <script type="module"> 23 + import foundation from "@diffuse/foundation"; 24 + import BrowserElement from "@diffuse/themes/webamp/browser/element.js"; 25 + 26 + foundation.features.processInputs(); 27 + foundation.features.searchThroughCollection(); 28 + 29 + const out = foundation.orchestrator.output(); 30 + const que = foundation.engine.queue(); 31 + const scp = foundation.engine.scope(); 32 + const trc = foundation.orchestrator.scopedTracks(); 33 + 34 + const el = new BrowserElement(); 35 + el.setAttribute("output-selector", out.selector); 36 + el.setAttribute("queue-engine-selector", que.selector); 37 + el.setAttribute("scope-engine-selector", scp.selector); 38 + el.setAttribute("tracks-selector", trc.selector); 39 + 40 + document.querySelector("#placeholder")?.replaceWith(el); 41 + </script>
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/common/ui.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/webamp/common/ui.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/common/ui.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/common/ui.js.map
+33
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/configurators/input/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../../chunk-FRIHFBDQ.js"; 6 + import "../../../../chunk-3CXPPL5Z.js"; 7 + import "../../../../chunk-I3VKG3ZJ.js"; 8 + import "../../../../chunk-3AO35WC3.js"; 9 + import "../../../../chunk-JBHW662S.js"; 10 + import "../../../../chunk-GX3WPNEX.js"; 11 + import "../../../../chunk-HN4F5JEZ.js"; 12 + import "../../../../chunk-GQIBEDKG.js"; 13 + import "../../../../chunk-DDF5P57I.js"; 14 + import "../../../../chunk-EEUCFWD4.js"; 15 + import "../../../../chunk-6DRHTH2U.js"; 16 + import "../../../../chunk-KJFA7KRK.js"; 17 + import "../../../../chunk-HMBZONBJ.js"; 18 + import "../../../../chunk-V7EQPFPD.js"; 19 + import "../../../../chunk-G56PUJUJ.js"; 20 + import "../../../../chunk-6DKPDMFE.js"; 21 + import "../../../../chunk-TP5GZFTO.js"; 22 + import "../../../../chunk-ZQZJJU3T.js"; 23 + import "../../../../chunk-BKRD2ZIW.js"; 24 + import "../../../../chunk-HNJPKCUJ.js"; 25 + import "../../../../chunk-SGR5ST3A.js"; 26 + import "../../../../chunk-FZQXS3RE.js"; 27 + export { 28 + CLASS, 29 + NAME, 30 + element_default as default 31 + }; 32 + 33 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/configurators/input/element.js.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/configurators/input/element.js.map
+39
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/configurators/input/facet.html
··· 1 + <div class="window"> 2 + <div class="title-bar"> 3 + <div class="title-bar-icon"> 4 + <img src="images/icons/windows_98/directory_explorer-4.png" height="14" /> 5 + </div> 6 + <div class="title-bar-text" draggable="false">Input configurator</div> 7 + <div class="title-bar-controls"> 8 + <button aria-label="Close" onclick="window.close()"></button> 9 + </div> 10 + </div> 11 + <div class="window-body"> 12 + <div id="placeholder"></div> 13 + </div> 14 + </div> 15 + 16 + <style> 17 + @import "./styles/variables.css"; 18 + @import "./styles/vendor/98.css"; 19 + @import "./themes/webamp/fonts.css"; 20 + @import "./themes/webamp/facet.css"; 21 + </style> 22 + 23 + <script type="module"> 24 + import foundation from "@diffuse/foundation"; 25 + import InputConfigElement from "@diffuse/themes/webamp/configurators/input/element.js"; 26 + 27 + const inp = foundation.orchestrator.input(); 28 + const out = foundation.orchestrator.output(); 29 + const pro = foundation.orchestrator.processTracks({ disableWhenReady: true }); 30 + const sou = foundation.orchestrator.sources(); 31 + 32 + const el = new InputConfigElement(); 33 + el.setAttribute("input-selector", inp.selector); 34 + el.setAttribute("output-selector", out.selector); 35 + el.setAttribute("sources-orchestrator-selector", sou.selector); 36 + el.setAttribute("process-tracks-orchestrator-selector", pro.selector); 37 + 38 + document.querySelector("#placeholder")?.replaceWith(el); 39 + </script>
+36
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/configurators/output/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../../chunk-7LJOF6CE.js"; 6 + import "../../../../chunk-BLEJHIYA.js"; 7 + import "../../../../chunk-6WKBRQHS.js"; 8 + import "../../../../chunk-XCWUJTYE.js"; 9 + import "../../../../chunk-4QN6X76O.js"; 10 + import "../../../../chunk-77ZY4GQV.js"; 11 + import "../../../../chunk-NZ7ODGIJ.js"; 12 + import "../../../../chunk-IGKYDHDK.js"; 13 + import "../../../../chunk-YCKIJVMK.js"; 14 + import "../../../../chunk-JZMTETBD.js"; 15 + import "../../../../chunk-H3WG7GN4.js"; 16 + import "../../../../chunk-B63ZUKFI.js"; 17 + import "../../../../chunk-JBHW662S.js"; 18 + import "../../../../chunk-HMBZONBJ.js"; 19 + import "../../../../chunk-V7EQPFPD.js"; 20 + import "../../../../chunk-G56PUJUJ.js"; 21 + import "../../../../chunk-6DKPDMFE.js"; 22 + import "../../../../chunk-TP5GZFTO.js"; 23 + import "../../../../chunk-ZQZJJU3T.js"; 24 + import "../../../../chunk-WN6GL63Q.js"; 25 + import "../../../../chunk-CRZ7HJJ4.js"; 26 + import "../../../../chunk-242LG3VP.js"; 27 + import "../../../../chunk-BKRD2ZIW.js"; 28 + import "../../../../chunk-HNJPKCUJ.js"; 29 + import "../../../../chunk-FZQXS3RE.js"; 30 + export { 31 + CLASS, 32 + NAME, 33 + element_default as default 34 + }; 35 + 36 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/configurators/output/element.js.map
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/webamp/configurators/output/element.js.map
+37
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/configurators/output/facet.html
··· 1 + <div class="window"> 2 + <div 3 + class="title-bar" 4 + > 5 + <div class="title-bar-icon"> 6 + <img src="images/icons/windows_98/directory_explorer-4.png" height="14" /> 7 + </div> 8 + <div class="title-bar-text" draggable="false"> 9 + Output configurator 10 + </div> 11 + <div class="title-bar-controls"> 12 + <button aria-label="Close" onclick="window.close()"></button> 13 + </div> 14 + </div> 15 + <div class="window-body"> 16 + <div id="placeholder"></div> 17 + </div> 18 + </div> 19 + 20 + <style> 21 + @import "./styles/variables.css"; 22 + @import "./styles/vendor/98.css"; 23 + @import "./themes/webamp/fonts.css"; 24 + @import "./themes/webamp/facet.css"; 25 + </style> 26 + 27 + <script type="module"> 28 + import foundation from "@diffuse/foundation"; 29 + import OutputConfigElement from "@diffuse/themes/webamp/configurators/output/element.js"; 30 + 31 + const out = foundation.orchestrator.output(); 32 + 33 + const el = new OutputConfigElement(); 34 + el.setAttribute("output-selector", out.selector); 35 + 36 + document.querySelector("#placeholder")?.replaceWith(el); 37 + </script>
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/facet.css
··· 1 + ../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/themes/webamp/facet.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/facet.css.map
··· 1 + ../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/themes/webamp/facet.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/fonts.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/fonts.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/fonts.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/fonts.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/index.css
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/index.css
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/index.css.map
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/index.css.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/index.html
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/index.html
+194
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/index.js
··· 1 + import "../../chunk-676R57TH.js"; 2 + import "../../chunk-FRIHFBDQ.js"; 3 + import "../../chunk-3CXPPL5Z.js"; 4 + import "../../chunk-7LJOF6CE.js"; 5 + import { 6 + element_default 7 + } from "../../chunk-2E662X3X.js"; 8 + import { 9 + element_default as element_default2 10 + } from "../../chunk-3THWHK2M.js"; 11 + import "../../chunk-QXBWZVFE.js"; 12 + import "../../chunk-BLEJHIYA.js"; 13 + import "../../chunk-6WKBRQHS.js"; 14 + import "../../chunk-XCWUJTYE.js"; 15 + import "../../chunk-4QN6X76O.js"; 16 + import "../../chunk-77ZY4GQV.js"; 17 + import "../../chunk-NZ7ODGIJ.js"; 18 + import "../../chunk-IGKYDHDK.js"; 19 + import "../../chunk-YCKIJVMK.js"; 20 + import "../../chunk-JZMTETBD.js"; 21 + import "../../chunk-H3WG7GN4.js"; 22 + import { 23 + element_exports as element_exports3 24 + } from "../../chunk-UMMPFCLQ.js"; 25 + import "../../chunk-6JNRNMZQ.js"; 26 + import "../../chunk-OSKZBJ24.js"; 27 + import "../../chunk-XGM6M423.js"; 28 + import "../../chunk-6KMZB5IA.js"; 29 + import "../../chunk-B63ZUKFI.js"; 30 + import "../../chunk-TXU4RB3O.js"; 31 + import "../../chunk-PKN6FN7E.js"; 32 + import { 33 + element_exports as element_exports4 34 + } from "../../chunk-M2MAFKPM.js"; 35 + import "../../chunk-GKE6NGNQ.js"; 36 + import "../../chunk-VWO2GNWZ.js"; 37 + import "../../chunk-QSPAYUAI.js"; 38 + import "../../chunk-I3VKG3ZJ.js"; 39 + import "../../chunk-OIRYE7B4.js"; 40 + import "../../chunk-3AO35WC3.js"; 41 + import "../../chunk-JBHW662S.js"; 42 + import "../../chunk-GX3WPNEX.js"; 43 + import "../../chunk-FJBTJV3K.js"; 44 + import "../../chunk-PTVB4Y37.js"; 45 + import "../../chunk-HN4F5JEZ.js"; 46 + import { 47 + element_exports 48 + } from "../../chunk-OBWEBS4T.js"; 49 + import "../../chunk-XRGLBUX4.js"; 50 + import "../../chunk-R3EQQDW5.js"; 51 + import "../../chunk-GQIBEDKG.js"; 52 + import "../../chunk-DDF5P57I.js"; 53 + import "../../chunk-EEUCFWD4.js"; 54 + import "../../chunk-6DRHTH2U.js"; 55 + import "../../chunk-TSYF7OPM.js"; 56 + import { 57 + element_exports as element_exports2 58 + } from "../../chunk-GCLDJKYV.js"; 59 + import "../../chunk-KJFA7KRK.js"; 60 + import "../../chunk-HMBZONBJ.js"; 61 + import "../../chunk-6CB2LXND.js"; 62 + import { 63 + component 64 + } from "../../chunk-V7EQPFPD.js"; 65 + import "../../chunk-G56PUJUJ.js"; 66 + import "../../chunk-6DKPDMFE.js"; 67 + import "../../chunk-TP5GZFTO.js"; 68 + import "../../chunk-ZQZJJU3T.js"; 69 + import "../../chunk-WN6GL63Q.js"; 70 + import "../../chunk-CRZ7HJJ4.js"; 71 + import "../../chunk-242LG3VP.js"; 72 + import "../../chunk-BKRD2ZIW.js"; 73 + import { 74 + effect, 75 + untracked 76 + } from "../../chunk-HNJPKCUJ.js"; 77 + import "../../chunk-SGR5ST3A.js"; 78 + import { 79 + __name, 80 + init_Buffer, 81 + init_process 82 + } from "../../chunk-FZQXS3RE.js"; 83 + 84 + // themes/webamp/index.js 85 + init_Buffer(); 86 + init_process(); 87 + var input = component(element_exports2); 88 + var queue = component(element_exports); 89 + var search = component(element_exports3); 90 + var scopedTracks = component(element_exports4); 91 + var output = document.querySelector("#output"); 92 + if (!output) throw new Error("Missing output element"); 93 + globalThis.queue = queue; 94 + globalThis.output = output; 95 + var index = {}; 96 + var initiatedPlaylist = false; 97 + var ampElement = document.querySelector("dtw-webamp"); 98 + if (ampElement instanceof element_default === false) { 99 + throw new Error("Missing webamp element"); 100 + } 101 + var amp = ampElement.amp; 102 + var loadFromUrl = amp.media.loadFromUrl.bind(amp.media); 103 + async function loadOverride(uri, autoPlay) { 104 + if (uri.startsWith("blob:")) { 105 + return await loadFromUrl(uri, autoPlay); 106 + } 107 + const resp = await input.resolve({ method: "GET", uri }); 108 + if (!resp) throw new Error("Failed to resolve URI"); 109 + if (resp && "stream" in resp) { 110 + throw new Error("Webamp does not support playing streams."); 111 + } 112 + return await loadFromUrl(resp.url, autoPlay); 113 + } 114 + __name(loadOverride, "loadOverride"); 115 + amp.media.loadFromUrl = loadOverride.bind(amp.media); 116 + effect(() => { 117 + const past = untracked(() => queue.past()); 118 + const now = untracked(() => queue.now()); 119 + const future = queue.future(); 120 + const list = [...past, ...now ? [now] : [], ...future]; 121 + const newIdx = {}; 122 + list.forEach((item) => { 123 + newIdx[item.id] = (newIdx[item.id] ?? 0) + 1; 124 + }); 125 + const tracksToAdd = []; 126 + Object.entries(newIdx).forEach(([id, n]) => { 127 + const x = index[id] ?? 0; 128 + if (n > x) { 129 + const track = output.tracks.collection().find((t) => t.id === id); 130 + if (track) tracksToAdd.push(track); 131 + index[id] = x + 1; 132 + } 133 + }); 134 + tracksToAdd.forEach((t) => ampElement.addTrack(t)); 135 + if (!initiatedPlaylist && tracksToAdd.length) { 136 + initiatedPlaylist = true; 137 + amp.store.dispatch({ type: "BUFFER_TRACK", id: 0 }); 138 + } 139 + }); 140 + effect(() => { 141 + const tracks = scopedTracks.tracks(); 142 + queue.supply({ trackIds: tracks.map((t) => t.id) }); 143 + }); 144 + var tracksPromise = Promise.withResolvers(); 145 + effect(() => { 146 + const state = output.tracks.state(); 147 + if (state !== "loaded") return; 148 + const fingerprintSearch = search.supplyFingerprint(); 149 + if (fingerprintSearch === void 0) return; 150 + const fingerprintQueue = queue.supplyFingerprint(); 151 + if (fingerprintQueue === void 0) return; 152 + tracksPromise.resolve("loaded"); 153 + }); 154 + document.body.querySelectorAll(".desktop__item").forEach((element) => { 155 + if (element instanceof HTMLElement) { 156 + element.addEventListener("dblclick", () => { 157 + const f = element.querySelector("label")?.getAttribute("for"); 158 + if (f) return windowManager()?.toggleWindow(f); 159 + }); 160 + } 161 + }); 162 + document.body.querySelector("#desktop-batch")?.addEventListener( 163 + "dblclick", 164 + () => { 165 + tracksPromise.promise.then(() => { 166 + addBatch(); 167 + }); 168 + } 169 + ); 170 + var winampIsShown = true; 171 + document.body.querySelector("#desktop-winamp")?.addEventListener( 172 + "dblclick", 173 + () => { 174 + if (winampIsShown) { 175 + amp.close(); 176 + } else { 177 + amp.reopen(); 178 + winampIsShown = true; 179 + } 180 + } 181 + ); 182 + amp.onClose(() => winampIsShown = false); 183 + async function addBatch() { 184 + await queue.fill({ augment: true, amount: 50, shuffled: true }); 185 + } 186 + __name(addBatch, "addBatch"); 187 + function windowManager() { 188 + const w = document.body.querySelector("dtw-window-manager"); 189 + if (w instanceof element_default2) return w; 190 + return null; 191 + } 192 + __name(windowManager, "windowManager"); 193 + 194 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/index.js.map
··· 1 + {"version":3,"sources":["/index.js"],"sourcesContent":["import \"@components/engine/scope/element.js\";\nimport \"@components/input/opensubsonic/element.js\";\nimport \"@components/input/s3/element.js\";\nimport \"@components/orchestrator/input/element.js\";\nimport \"@components/orchestrator/output/element.js\";\nimport \"@components/orchestrator/process-tracks/element.js\";\nimport \"@components/orchestrator/sources/element.js\";\nimport \"@components/processor/metadata/element.js\";\n\nimport * as Input from \"@components/configurator/input/element.js\";\nimport * as Queue from \"@components/engine/queue/element.js\";\nimport * as Search from \"@components/processor/search/element.js\";\nimport * as ScopedTracks from \"@components/orchestrator/scoped-tracks/element.js\";\n\nimport { component } from \"@common/element.js\";\nimport { effect, untracked } from \"@common/signal.js\";\n\nimport \"./browser/element.js\";\nimport \"./configurators/input/element.js\";\nimport \"./configurators/output/element.js\";\nimport \"./window/element.js\";\n\nimport WindowManager from \"./window-manager/element.js\";\nimport WebampElement from \"./webamp/element.js\";\n\n/**\n * @import {OutputElement} from \"@components/output/types.d.ts\"\n * @import {Track} from \"@definitions/types.d.ts\"\n */\n\nconst input = component(Input);\nconst queue = component(Queue);\nconst search = component(Search);\nconst scopedTracks = component(ScopedTracks);\n\n/** @type {OutputElement | null} */\nconst output = document.querySelector(\"#output\");\nif (!output) throw new Error(\"Missing output element\");\n\nglobalThis.queue = queue;\nglobalThis.output = output;\n\n////////////////////////////////////////////\n// 📡\n////////////////////////////////////////////\n\n/** @type {Record<string, number>} */\nconst index = {};\n\n/** @type {boolean} */\nlet initiatedPlaylist = false;\n\n////////////////////////////////////////////\n// ⚡️\n////////////////////////////////////////////\n\nconst ampElement = document.querySelector(\"dtw-webamp\");\nif (ampElement instanceof WebampElement === false) {\n throw new Error(\"Missing webamp element\");\n}\n\nconst amp = ampElement.amp;\n\n// Override track loader\nconst loadFromUrl = amp.media.loadFromUrl.bind(amp.media);\n\n/**\n * @param {string} uri\n * @param {boolean} autoPlay\n */\nasync function loadOverride(uri, autoPlay) {\n if (uri.startsWith(\"blob:\")) {\n return await loadFromUrl(uri, autoPlay);\n }\n\n const resp = await input.resolve({ method: \"GET\", uri });\n if (!resp) throw new Error(\"Failed to resolve URI\");\n if (resp && \"stream\" in resp) {\n throw new Error(\"Webamp does not support playing streams.\");\n }\n\n return await loadFromUrl(resp.url, autoPlay);\n}\n\namp.media.loadFromUrl = loadOverride.bind(amp.media);\n\n////////////////////////////////////////////\n// 📡\n////////////////////////////////////////////\n\n/**\n * Whenever the queue changes update the playlist.\n */\neffect(() => {\n const past = untracked(() => queue.past());\n const now = untracked(() => queue.now());\n const future = queue.future();\n const list = [...past, ...(now ? [now] : []), ...future];\n\n /** @type {Record<string, number>} */\n const newIdx = {};\n\n list.forEach((item) => {\n newIdx[item.id] = (newIdx[item.id] ?? 0) + 1;\n });\n\n /** @type {Track[]} */\n const tracksToAdd = [];\n\n Object.entries(newIdx).forEach(([id, n]) => {\n const x = index[id] ?? 0;\n if (n > x) {\n const track = output.tracks.collection().find((t) => t.id === id);\n if (track) tracksToAdd.push(track);\n index[id] = x + 1;\n }\n });\n\n tracksToAdd.forEach((t) => ampElement.addTrack(t));\n\n if (!initiatedPlaylist && tracksToAdd.length) {\n initiatedPlaylist = true;\n amp.store.dispatch({ type: \"BUFFER_TRACK\", id: 0 });\n }\n});\n\n/**\n * Fill queue supply with available tracks.\n */\neffect(() => {\n const tracks = scopedTracks.tracks();\n queue.supply({ trackIds: tracks.map((t) => t.id) });\n});\n\n/**\n * Keep note of when search is ready.\n */\nconst tracksPromise = Promise.withResolvers();\n\neffect(() => {\n const state = output.tracks.state();\n if (state !== \"loaded\") return;\n\n const fingerprintSearch = search.supplyFingerprint();\n if (fingerprintSearch === undefined) return;\n\n const fingerprintQueue = queue.supplyFingerprint();\n if (fingerprintQueue === undefined) return;\n\n tracksPromise.resolve(\"loaded\");\n});\n\n////////////////////////////////////////////\n// DESKTOP\n////////////////////////////////////////////\n\n// Open associated window when click desktop items\ndocument.body.querySelectorAll(\".desktop__item\").forEach((element) => {\n if (element instanceof HTMLElement) {\n element.addEventListener(\"dblclick\", () => {\n const f = element.querySelector(\"label\")?.getAttribute(\"for\");\n if (f) return windowManager()?.toggleWindow(f);\n });\n }\n});\n\n// Add batch\ndocument.body.querySelector(\"#desktop-batch\")?.addEventListener(\n \"dblclick\",\n () => {\n tracksPromise.promise.then(() => {\n addBatch();\n });\n },\n);\n\n// Toggle Winamp if click that desktop item\nlet winampIsShown = true;\n\ndocument.body.querySelector(\"#desktop-winamp\")?.addEventListener(\n \"dblclick\",\n () => {\n if (winampIsShown) {\n amp.close();\n } else {\n amp.reopen();\n winampIsShown = true;\n }\n },\n);\n\namp.onClose(() => winampIsShown = false);\n\n////////////////////////////////////////////\n// 🛠️\n////////////////////////////////////////////\n\nasync function addBatch() {\n await queue.fill({ augment: true, amount: 50, shuffled: true });\n}\n\nfunction windowManager() {\n const w = document.body.querySelector(\"dtw-window-manager\");\n if (w instanceof WindowManager) return w;\n return null;\n}\n"],"mappings":"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","names":["element_exports","element_default"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/themes/webamp/index.js.map"}
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/webamp/element.js
··· 1 + ../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/themes/webamp/webamp/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/webamp/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/webamp/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/window-manager/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/themes/webamp/window-manager/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/window-manager/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/window-manager/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/window/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/themes/webamp/window/element.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/themes/webamp/window/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/window/element.js.map
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/vendor/@atcute/tid/index.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/vendor/@atcute/tid/index.js
+1
artifacts/bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma/vendor/@atcute/tid/index.js.map
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/vendor/@atcute/tid/index.js.map
+2 -2
artifacts/versions.json
··· 5 5 "version": "3.5.0" 6 6 }, 7 7 "4.0.0-alpha": { 8 - "cid": "bafybeicp5hi5rw4vffqlbmyqqaxhmxzx4ilejru3cq4esycpeyuuhen5ha", 9 - "createdAt": "2026-03-01T22:22:39.808Z", 8 + "cid": "bafybeiftqofdq4smwmja7bhcconzsevvy3hqxq2mhyujfz4r5zdx4cb5ma", 9 + "createdAt": "2026-03-02T10:33:45.846Z", 10 10 "version": "4.0.0-alpha" 11 11 } 12 12 }