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

+7099 -2
+5
artifacts/artifacts.json
··· 198 198 "cid": "bafybeidwijmtzstw5ss6sw3o6cfuqyqkmoekv2eeayu2ifmahyo4wmc3uq", 199 199 "createdAt": "2026-02-28T21:19:23.450Z", 200 200 "version": "4.0.0-alpha" 201 + }, 202 + "bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu": { 203 + "cid": "bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu", 204 + "createdAt": "2026-03-01T10:15:55.972Z", 205 + "version": "4.0.0-alpha" 201 206 } 202 207 }
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/APEv2Parser-JBT6ZPPL.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/APEv2Parser-JBT6ZPPL.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/APEv2Parser-JBT6ZPPL.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/APEv2Parser-JBT6ZPPL.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/AiffParser-7J3JIU4R.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/AiffParser-7J3JIU4R.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/AiffParser-7J3JIU4R.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/AiffParser-7J3JIU4R.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/AsfParser-K6K2MCFT.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/AsfParser-K6K2MCFT.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/AsfParser-K6K2MCFT.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/AsfParser-K6K2MCFT.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/DsdiffParser-RX5L67QC.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/DsdiffParser-RX5L67QC.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/DsdiffParser-RX5L67QC.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/DsdiffParser-RX5L67QC.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/DsfParser-SEGRVUZ3.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/DsfParser-SEGRVUZ3.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/DsfParser-SEGRVUZ3.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/DsfParser-SEGRVUZ3.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/FlacParser-JAF54BZM.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/FlacParser-JAF54BZM.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/FlacParser-JAF54BZM.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/FlacParser-JAF54BZM.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/MP4Parser-TI5DETOV.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/MP4Parser-TI5DETOV.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/MP4Parser-TI5DETOV.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/MP4Parser-TI5DETOV.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/MatroskaParser-2BD5GINE.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/MatroskaParser-2BD5GINE.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/MatroskaParser-2BD5GINE.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/MatroskaParser-2BD5GINE.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/MpegParser-BNW6GDHZ.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/MpegParser-BNW6GDHZ.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/MpegParser-BNW6GDHZ.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/MpegParser-BNW6GDHZ.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/MusepackParser-AOTNNUS6.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/MusepackParser-AOTNNUS6.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/MusepackParser-AOTNNUS6.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/MusepackParser-AOTNNUS6.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/OggParser-UNPX7QR4.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/OggParser-UNPX7QR4.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/OggParser-UNPX7QR4.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/OggParser-UNPX7QR4.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/WavPackParser-BRAHRFOP.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/WavPackParser-BRAHRFOP.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/WavPackParser-BRAHRFOP.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/WavPackParser-BRAHRFOP.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/WaveParser-EPX6CXTY.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/WaveParser-EPX6CXTY.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/WaveParser-EPX6CXTY.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/WaveParser-EPX6CXTY.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/android-chrome-192x192.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/android-chrome-192x192.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/android-chrome-512x512.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/android-chrome-512x512.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/apple-touch-icon.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/apple-touch-icon.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/browserconfig.xml
··· 1 + ../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/browserconfig.xml
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-242LG3VP.js
··· 1 + ../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/chunk-242LG3VP.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-242LG3VP.js.map
··· 1 + ../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/chunk-242LG3VP.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-26GILFF4.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-26GILFF4.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-26GILFF4.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-26GILFF4.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-2E662X3X.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-2E662X3X.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-2E662X3X.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-2E662X3X.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-3AO35WC3.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-3AO35WC3.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-3AO35WC3.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-3AO35WC3.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-3CXPPL5Z.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-3CXPPL5Z.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-3CXPPL5Z.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-3CXPPL5Z.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-3ENCKNXO.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-3ENCKNXO.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-3ENCKNXO.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-3ENCKNXO.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-3IXJYTB6.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-3IXJYTB6.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-3IXJYTB6.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-3IXJYTB6.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-3THWHK2M.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-3THWHK2M.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-3THWHK2M.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-3THWHK2M.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-4LOJTZ72.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-4LOJTZ72.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-4LOJTZ72.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-4LOJTZ72.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-4YB6QUPN.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-4YB6QUPN.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-4YB6QUPN.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-4YB6QUPN.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-676R57TH.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-676R57TH.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-676R57TH.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-676R57TH.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-6CB2LXND.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-6CB2LXND.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-6CB2LXND.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-6CB2LXND.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-6DKPDMFE.js
··· 1 + ../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/chunk-6DKPDMFE.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-6DKPDMFE.js.map
··· 1 + ../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/chunk-6DKPDMFE.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-6DRHTH2U.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-6DRHTH2U.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-6DRHTH2U.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-6DRHTH2U.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-6JNRNMZQ.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-6JNRNMZQ.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-6JNRNMZQ.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-6JNRNMZQ.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-6KMZB5IA.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-6KMZB5IA.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-6KMZB5IA.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-6KMZB5IA.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-6WKBRQHS.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-6WKBRQHS.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-6WKBRQHS.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-6WKBRQHS.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-77ZY4GQV.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-77ZY4GQV.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-77ZY4GQV.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-77ZY4GQV.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-7BHFTEJL.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-7BHFTEJL.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-7BHFTEJL.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-7BHFTEJL.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-7SBFGDAO.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-7SBFGDAO.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-7SBFGDAO.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-7SBFGDAO.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-7XAKBJEU.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-7XAKBJEU.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-7XAKBJEU.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-7XAKBJEU.js.map
+355
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-A7YBZO62.js
··· 1 + import { 2 + OAuthUserAgent, 3 + TokenRefreshError, 4 + clearStoredSession, 5 + login, 6 + logout, 7 + restoreOrFinalize 8 + } from "./chunk-NSJY6VZI.js"; 9 + import { 10 + BroadcastedOutputElement, 11 + outputManager 12 + } from "./chunk-YCKIJVMK.js"; 13 + import { 14 + Client, 15 + ClientResponseError, 16 + ok 17 + } from "./chunk-WN6GL63Q.js"; 18 + import { 19 + now 20 + } from "./chunk-BKRD2ZIW.js"; 21 + import { 22 + computed, 23 + signal 24 + } from "./chunk-HNJPKCUJ.js"; 25 + import { 26 + __name, 27 + init_Buffer, 28 + init_process 29 + } from "./chunk-FZQXS3RE.js"; 30 + 31 + // components/output/raw/atproto/element.js 32 + init_Buffer(); 33 + init_process(); 34 + var ATProtoOutput = class extends BroadcastedOutputElement { 35 + static { 36 + __name(this, "ATProtoOutput"); 37 + } 38 + static NAME = "diffuse/output/raw/atproto"; 39 + #manager; 40 + /** @type {PromiseWithResolvers<void>} */ 41 + #authenticated = Promise.withResolvers(); 42 + /** @type {Client | null} */ 43 + #rpc = null; 44 + /** @type {OAuthUserAgent | null} */ 45 + #agent = null; 46 + constructor() { 47 + super(); 48 + this.#manager = outputManager({ 49 + facets: { 50 + empty: /* @__PURE__ */ __name(() => [], "empty"), 51 + get: /* @__PURE__ */ __name(() => this.listRecords("sh.diffuse.output.facet"), "get"), 52 + put: /* @__PURE__ */ __name((data) => this.#putRecords("sh.diffuse.output.facet", data), "put") 53 + }, 54 + playlistItems: { 55 + empty: /* @__PURE__ */ __name(() => [], "empty"), 56 + get: /* @__PURE__ */ __name(() => this.listRecords("sh.diffuse.output.playlistItem"), "get"), 57 + put: /* @__PURE__ */ __name((data) => this.#putRecords("sh.diffuse.output.playlistItem", data), "put") 58 + }, 59 + themes: { 60 + empty: /* @__PURE__ */ __name(() => [], "empty"), 61 + get: /* @__PURE__ */ __name(() => this.listRecords("sh.diffuse.output.theme"), "get"), 62 + put: /* @__PURE__ */ __name((data) => this.#putRecords("sh.diffuse.output.theme", data), "put") 63 + }, 64 + tracks: { 65 + empty: /* @__PURE__ */ __name(() => [], "empty"), 66 + get: /* @__PURE__ */ __name(async () => { 67 + const bundles = await this.listRecords( 68 + "sh.diffuse.output.trackBundle" 69 + ); 70 + return bundles.flatMap((bundle) => bundle.tracks ?? []); 71 + }, "get"), 72 + put: /* @__PURE__ */ __name((data) => { 73 + const bundles = []; 74 + for (let i = 0; i < data.length; i += 100) { 75 + bundles.push({ 76 + $type: "sh.diffuse.output.trackBundle", 77 + id: now(), 78 + tracks: data.slice(i, i + 100) 79 + }); 80 + } 81 + return this.#putRecords("sh.diffuse.output.trackBundle", bundles, { 82 + upsertBatchSize: 1 83 + }); 84 + }, "put") 85 + } 86 + }); 87 + this.facets = this.#manager.facets; 88 + this.playlistItems = this.#manager.playlistItems; 89 + this.themes = this.#manager.themes; 90 + this.tracks = this.#manager.tracks; 91 + } 92 + // SIGNALS 93 + #did = signal( 94 + /** @type {string | null} */ 95 + null 96 + ); 97 + #isOnline = signal(navigator.onLine); 98 + #rev = signal( 99 + /** @type {string | null} */ 100 + null 101 + ); 102 + did = this.#did.get; 103 + rev = this.#rev.get; 104 + ready = computed(() => { 105 + return this.#did.value !== null && !!this.#rpc && this.#isOnline.value; 106 + }); 107 + // LIFECYCLE 108 + /** @override */ 109 + connectedCallback() { 110 + this.replicateSavedData(this.#manager); 111 + super.connectedCallback(); 112 + this.#tryRestore(); 113 + globalThis.addEventListener("online", this.#online); 114 + globalThis.addEventListener("offline", this.#offline); 115 + } 116 + /** @override */ 117 + disconnectedCallback() { 118 + globalThis.removeEventListener("online", this.#online); 119 + globalThis.removeEventListener("offline", this.#offline); 120 + } 121 + #offline = /* @__PURE__ */ __name(() => this.#isOnline.set(false), "#offline"); 122 + #online = /* @__PURE__ */ __name(() => this.#isOnline.set(true), "#online"); 123 + // AUTH 124 + /** 125 + * Initiate the OAuth flow. 126 + * Navigates the browser to the authorization server. 127 + * 128 + * @param {string} handle 129 + */ 130 + async login(handle) { 131 + await login(handle); 132 + } 133 + /** 134 + * Sign out and revoke the current session. 135 + */ 136 + async logout() { 137 + if (this.#agent) { 138 + await logout(this.#agent); 139 + this.#agent = null; 140 + this.#authenticated = Promise.withResolvers(); 141 + this.#did.value = null; 142 + this.#rpc = null; 143 + } 144 + } 145 + /** 146 + * Clear session state without contacting the server. 147 + * Used when the session has already been revoked. 148 + */ 149 + #clearSession() { 150 + this.#agent = null; 151 + this.#authenticated = Promise.withResolvers(); 152 + this.#did.value = null; 153 + this.#rpc = null; 154 + clearStoredSession(); 155 + } 156 + /** 157 + * @param {unknown} err 158 + * @returns {boolean} 159 + */ 160 + #isSessionError(err) { 161 + if (err instanceof TokenRefreshError) return true; 162 + if (err instanceof ClientResponseError && err.status === 401) return true; 163 + if (err && typeof err === "object" && "cause" in err) { 164 + return this.#isSessionError( 165 + /** @type {any} */ 166 + err.cause 167 + ); 168 + } 169 + return false; 170 + } 171 + async #tryRestore() { 172 + await this.whenConnected(); 173 + try { 174 + const session = await restoreOrFinalize(); 175 + if (session) { 176 + this.#setSession(session); 177 + } 178 + } catch (err) { 179 + if (this.#isSessionError(err)) { 180 + this.#clearSession(); 181 + } else { 182 + throw err; 183 + } 184 + } 185 + } 186 + /** 187 + * @param {import("@atcute/oauth-browser-client").Session} session 188 + */ 189 + #setSession(session) { 190 + const agent = new OAuthUserAgent(session); 191 + const originalGetSession = agent.getSession.bind(agent); 192 + agent.getSession = /** @param {any[]} args */ 193 + (...args) => { 194 + const promise = originalGetSession(...args); 195 + promise.catch((err) => { 196 + if (err instanceof TokenRefreshError) { 197 + this.#clearSession(); 198 + } 199 + }); 200 + return promise; 201 + }; 202 + this.#agent = agent; 203 + this.#rpc = new Client({ handler: agent }); 204 + this.#did.value = session.info.sub; 205 + this.#authenticated.resolve(); 206 + } 207 + // RECORDS 208 + /** 209 + * Fetch the latest commit rev for this repo. 210 + * Returns `null` if not authenticated or on error. 211 + * 212 + * @returns {Promise<string | null>} 213 + */ 214 + async getLatestCommit() { 215 + const did = this.#did.value; 216 + const rpc = this.#rpc; 217 + if (!rpc || !did) return null; 218 + try { 219 + const result = await ok(rpc.get( 220 + "com.atproto.sync.getLatestCommit", 221 + { params: { did } } 222 + )); 223 + this.#rev.value = result?.rev; 224 + return result?.rev; 225 + } catch (err) { 226 + if (this.#isSessionError(err)) { 227 + this.#clearSession(); 228 + return null; 229 + } 230 + throw err; 231 + } 232 + } 233 + /** 234 + * @template T 235 + * @param {string} collection 236 + * @param {string} [did] 237 + * @returns {Promise<T[]>} 238 + */ 239 + async listRecords(collection, did) { 240 + did ??= this.#did.value ?? void 0; 241 + const rpc = this.#rpc; 242 + if (!rpc || !did) return []; 243 + try { 244 + const records = []; 245 + let cursor; 246 + do { 247 + const page = await ok(rpc.get( 248 + "com.atproto.repo.listRecords", 249 + { params: { repo: did, collection, limit: 100, cursor } } 250 + )); 251 + for (const record of page?.records ?? []) { 252 + records.push(record.value); 253 + } 254 + cursor = page?.cursor; 255 + } while (cursor); 256 + return records; 257 + } catch (err) { 258 + if (this.#isSessionError(err)) { 259 + this.#clearSession(); 260 + return []; 261 + } 262 + throw err; 263 + } 264 + } 265 + /** 266 + * @param {string} collection 267 + * @param {Array<{ id: string }>} data 268 + * @param {{ deleteBatchSize?: number, upsertBatchSize?: number }} [options] 269 + */ 270 + async #putRecords(collection, data, { deleteBatchSize = 100, upsertBatchSize = deleteBatchSize } = {}) { 271 + const rpc = this.#rpc; 272 + if (!rpc || !this.#did.value) return; 273 + try { 274 + const existing = /* @__PURE__ */ new Map(); 275 + let cursor; 276 + do { 277 + const page = await ok(rpc.get( 278 + "com.atproto.repo.listRecords", 279 + { 280 + params: { repo: this.#did.value, collection, limit: 100, cursor } 281 + } 282 + )); 283 + for (const record of page?.records ?? []) { 284 + const rkey = record.uri.split("/").pop(); 285 + existing.set(record.value.id, { rkey, value: record.value }); 286 + } 287 + cursor = page?.cursor; 288 + } while (cursor); 289 + const desired = new Map( 290 + data.map((record) => [record.id, { $type: collection, ...record }]) 291 + ); 292 + const deletes = []; 293 + const upserts = []; 294 + for (const [id, { rkey }] of existing) { 295 + if (!desired.has(id)) { 296 + deletes.push({ 297 + $type: "com.atproto.repo.applyWrites#delete", 298 + collection, 299 + rkey 300 + }); 301 + } 302 + } 303 + for (const [id, record] of desired) { 304 + const entry = existing.get(id); 305 + if (!entry) { 306 + upserts.push({ 307 + $type: "com.atproto.repo.applyWrites#create", 308 + collection, 309 + rkey: id, 310 + value: record 311 + }); 312 + } else if (JSON.stringify(entry.value) !== JSON.stringify(record)) { 313 + upserts.push({ 314 + $type: "com.atproto.repo.applyWrites#update", 315 + collection, 316 + rkey: entry.rkey, 317 + value: record 318 + }); 319 + } 320 + } 321 + const applyBatch = /* @__PURE__ */ __name(async (batch) => { 322 + const result = await ok(rpc.post("com.atproto.repo.applyWrites", { 323 + input: { repo: this.#did.value, writes: batch } 324 + })); 325 + if (result?.commit?.rev) { 326 + this.#rev.value = result.commit.rev; 327 + } 328 + }, "applyBatch"); 329 + for (let i = 0; i < deletes.length; i += deleteBatchSize) { 330 + await applyBatch(deletes.slice(i, i + deleteBatchSize)); 331 + } 332 + for (let i = 0; i < upserts.length; i += upsertBatchSize) { 333 + await applyBatch(upserts.slice(i, i + upsertBatchSize)); 334 + } 335 + } catch (err) { 336 + if (this.#isSessionError(err)) { 337 + this.#clearSession(); 338 + return; 339 + } 340 + throw err; 341 + } 342 + } 343 + }; 344 + var element_default = ATProtoOutput; 345 + var CLASS = ATProtoOutput; 346 + var NAME = "dor-atproto"; 347 + customElements.define(NAME, ATProtoOutput); 348 + 349 + export { 350 + element_default, 351 + CLASS, 352 + NAME 353 + }; 354 + 355 + //# sourceMappingURL=./chunk-A7YBZO62.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-A7YBZO62.js.map
··· 1 + {"version":3,"sources":["/components/output/raw/atproto/element.js"],"sourcesContent":["import { Client, ClientResponseError, ok } from \"@atcute/client\";\nimport * as TID from \"@atcute/tid\";\n\nimport { computed, signal } from \"@common/signal.js\";\nimport { BroadcastedOutputElement, outputManager } from \"../../common.js\";\n\nimport {\n clearStoredSession,\n login,\n logout,\n OAuthUserAgent,\n restoreOrFinalize,\n TokenRefreshError,\n} from \"./oauth.js\";\n\n/**\n * @import {TrackBundle} from \"@definitions/types.d.ts\"\n * @import {OutputManager} from \"../../types.d.ts\"\n * @import {ATProtoOutputElement} from \"./types.d.ts\"\n */\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {ATProtoOutputElement}\n */\nclass ATProtoOutput extends BroadcastedOutputElement {\n static NAME = \"diffuse/output/raw/atproto\";\n\n #manager;\n\n /** @type {PromiseWithResolvers<void>} */\n #authenticated = Promise.withResolvers();\n\n /** @type {Client | null} */\n #rpc = null;\n\n /** @type {OAuthUserAgent | null} */\n #agent = null;\n\n constructor() {\n super();\n\n /** @type {OutputManager} */\n this.#manager = outputManager({\n facets: {\n empty: () => [],\n get: () => this.listRecords(\"sh.diffuse.output.facet\"),\n put: (data) => this.#putRecords(\"sh.diffuse.output.facet\", data),\n },\n playlistItems: {\n empty: () => [],\n get: () => this.listRecords(\"sh.diffuse.output.playlistItem\"),\n put: (data) => this.#putRecords(\"sh.diffuse.output.playlistItem\", data),\n },\n themes: {\n empty: () => [],\n get: () => this.listRecords(\"sh.diffuse.output.theme\"),\n put: (data) => this.#putRecords(\"sh.diffuse.output.theme\", data),\n },\n tracks: {\n empty: () => [],\n get: async () => {\n const bundles = await this.listRecords(\n \"sh.diffuse.output.trackBundle\",\n );\n\n return bundles.flatMap((bundle) => bundle.tracks ?? []);\n },\n put: (data) => {\n /** @type {TrackBundle[]} */\n const bundles = [];\n\n for (let i = 0; i < data.length; i += 100) {\n bundles.push({\n $type: \"sh.diffuse.output.trackBundle\",\n id: TID.now(),\n tracks: data.slice(i, i + 100),\n });\n }\n\n return this.#putRecords(\"sh.diffuse.output.trackBundle\", bundles, {\n upsertBatchSize: 1,\n });\n },\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\n // SIGNALS\n\n #did = signal(/** @type {string | null} */ (null));\n #isOnline = signal(navigator.onLine);\n #rev = signal(/** @type {string | null} */ (null));\n\n did = this.#did.get;\n rev = this.#rev.get;\n\n ready = computed(() => {\n return this.#did.value !== null && !!this.#rpc && this.#isOnline.value;\n });\n\n // LIFECYCLE\n\n /** @override */\n connectedCallback() {\n this.replicateSavedData(this.#manager);\n\n super.connectedCallback();\n\n this.#tryRestore();\n\n globalThis.addEventListener(\"online\", this.#online);\n globalThis.addEventListener(\"offline\", this.#offline);\n }\n\n /** @override */\n disconnectedCallback() {\n globalThis.removeEventListener(\"online\", this.#online);\n globalThis.removeEventListener(\"offline\", this.#offline);\n }\n\n #offline = () => this.#isOnline.set(false);\n #online = () => this.#isOnline.set(true);\n\n // AUTH\n\n /**\n * Initiate the OAuth flow.\n * Navigates the browser to the authorization server.\n *\n * @param {string} handle\n */\n async login(handle) {\n await login(handle);\n }\n\n /**\n * Sign out and revoke the current session.\n */\n async logout() {\n if (this.#agent) {\n await logout(this.#agent);\n this.#agent = null;\n this.#authenticated = Promise.withResolvers();\n this.#did.value = null;\n this.#rpc = null;\n }\n }\n\n /**\n * Clear session state without contacting the server.\n * Used when the session has already been revoked.\n */\n #clearSession() {\n this.#agent = null;\n this.#authenticated = Promise.withResolvers();\n this.#did.value = null;\n this.#rpc = null;\n\n clearStoredSession();\n }\n\n /**\n * @param {unknown} err\n * @returns {boolean}\n */\n #isSessionError(err) {\n if (err instanceof TokenRefreshError) return true;\n // OAuthUserAgent.handle() swallows TokenRefreshError and returns the\n // original 401 response, which ok() wraps as a ClientResponseError.\n if (err instanceof ClientResponseError && err.status === 401) return true;\n if (err && typeof err === \"object\" && \"cause\" in err) {\n return this.#isSessionError(/** @type {any} */ (err).cause);\n }\n return false;\n }\n\n async #tryRestore() {\n await this.whenConnected();\n\n try {\n const session = await restoreOrFinalize();\n\n if (session) {\n this.#setSession(session);\n }\n } catch (err) {\n if (this.#isSessionError(err)) {\n this.#clearSession();\n } else {\n throw err;\n }\n }\n }\n\n /**\n * @param {import(\"@atcute/oauth-browser-client\").Session} session\n */\n #setSession(session) {\n const agent = new OAuthUserAgent(session);\n\n // Intercept token refresh to detect session revocation proactively.\n // OAuthUserAgent.handle() swallows TokenRefreshError silently,\n // so we hook into getSession to clear state as soon as refresh fails.\n const originalGetSession = agent.getSession.bind(agent);\n agent.getSession = /** @param {any[]} args */ (...args) => {\n const promise = originalGetSession(...args);\n\n promise.catch((err) => {\n if (err instanceof TokenRefreshError) {\n this.#clearSession();\n }\n });\n\n return promise;\n };\n\n this.#agent = agent;\n this.#rpc = new Client({ handler: agent });\n this.#did.value = session.info.sub;\n this.#authenticated.resolve();\n }\n\n // RECORDS\n\n /**\n * Fetch the latest commit rev for this repo.\n * Returns `null` if not authenticated or on error.\n *\n * @returns {Promise<string | null>}\n */\n async getLatestCommit() {\n const did = this.#did.value;\n\n const rpc = this.#rpc;\n if (!rpc || !did) return null;\n\n try {\n const result = await ok(rpc.get(\n \"com.atproto.sync.getLatestCommit\",\n { params: { did } },\n ));\n\n this.#rev.value = result?.rev;\n return result?.rev;\n } catch (err) {\n if (this.#isSessionError(err)) {\n this.#clearSession();\n return null;\n }\n\n throw err;\n }\n }\n\n /**\n * @template T\n * @param {string} collection\n * @param {string} [did]\n * @returns {Promise<T[]>}\n */\n async listRecords(collection, did) {\n did ??= this.#did.value ?? undefined;\n\n const rpc = this.#rpc;\n if (!rpc || !did) return [];\n\n try {\n const records = [];\n\n /** @type {any} */\n let cursor;\n\n do {\n const page = await ok(rpc.get(\n \"com.atproto.repo.listRecords\",\n { params: { repo: did, collection, limit: 100, cursor } },\n ));\n\n for (const record of (page?.records ?? [])) {\n records.push(record.value);\n }\n\n cursor = page?.cursor;\n } while (cursor);\n\n return records;\n } catch (err) {\n if (this.#isSessionError(err)) {\n this.#clearSession();\n return [];\n }\n\n throw err;\n }\n }\n\n /**\n * @param {string} collection\n * @param {Array<{ id: string }>} data\n * @param {{ deleteBatchSize?: number, upsertBatchSize?: number }} [options]\n */\n async #putRecords(collection, data, { deleteBatchSize = 100, upsertBatchSize = deleteBatchSize } = {}) {\n const rpc = this.#rpc;\n if (!rpc || !this.#did.value) return;\n\n try {\n // 1. Fetch current state\n /** @type {Map<string, { rkey: string, value: unknown }>} */\n const existing = new Map();\n\n /** @type {any} */\n let cursor;\n\n do {\n const page = await ok(rpc.get(\n \"com.atproto.repo.listRecords\",\n {\n params: { repo: this.#did.value, collection, limit: 100, cursor },\n },\n ));\n\n for (const record of (page?.records ?? [])) {\n const rkey = record.uri.split(\"/\").pop();\n existing.set(record.value.id, { rkey, value: record.value });\n }\n\n cursor = page?.cursor;\n } while (cursor);\n\n // 2. Build desired state\n const desired = new Map(\n data.map((record) => [record.id, { $type: collection, ...record }]),\n );\n\n // 3. Compute diff\n /** @type {unknown[]} */\n const deletes = [];\n\n /** @type {unknown[]} */\n const upserts = [];\n\n for (const [id, { rkey }] of existing) {\n if (!desired.has(id)) {\n deletes.push({\n $type: \"com.atproto.repo.applyWrites#delete\",\n collection,\n rkey,\n });\n }\n }\n\n for (const [id, record] of desired) {\n const entry = existing.get(id);\n\n if (!entry) {\n upserts.push({\n $type: \"com.atproto.repo.applyWrites#create\",\n collection,\n rkey: id,\n value: record,\n });\n } else if (JSON.stringify(entry.value) !== JSON.stringify(record)) {\n upserts.push({\n $type: \"com.atproto.repo.applyWrites#update\",\n collection,\n rkey: entry.rkey,\n value: record,\n });\n }\n }\n\n // 4. Apply in batches\n const applyBatch = async (/** @type {unknown[]} */ batch) => {\n const result = await ok(rpc.post(\"com.atproto.repo.applyWrites\", {\n input: { repo: this.#did.value, writes: batch },\n }));\n\n if (result?.commit?.rev) {\n this.#rev.value = result.commit.rev;\n }\n };\n\n for (let i = 0; i < deletes.length; i += deleteBatchSize) {\n await applyBatch(deletes.slice(i, i + deleteBatchSize));\n }\n\n for (let i = 0; i < upserts.length; i += upsertBatchSize) {\n await applyBatch(upserts.slice(i, i + upsertBatchSize));\n }\n } catch (err) {\n if (this.#isSessionError(err)) {\n this.#clearSession();\n return;\n }\n\n throw err;\n }\n }\n}\n\nexport default ATProtoOutput;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = ATProtoOutput;\nexport const NAME = \"dor-atproto\";\n\ncustomElements.define(NAME, ATProtoOutput);\n"],"mappings":"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","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-A7YBZO62.js.map"}
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-AHN37DQ6.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-AHN37DQ6.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-AHN37DQ6.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-AHN37DQ6.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-B63ZUKFI.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-B63ZUKFI.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-B63ZUKFI.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-B63ZUKFI.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-BKRD2ZIW.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-BKRD2ZIW.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-BKRD2ZIW.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-BKRD2ZIW.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-BLEJHIYA.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-BLEJHIYA.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-BLEJHIYA.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-BLEJHIYA.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-CMU4QLMC.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-CMU4QLMC.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-CMU4QLMC.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-CMU4QLMC.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-CRZ7HJJ4.js
··· 1 + ../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/chunk-CRZ7HJJ4.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-CRZ7HJJ4.js.map
··· 1 + ../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/chunk-CRZ7HJJ4.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-DDF5P57I.js
··· 1 + ../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/chunk-DDF5P57I.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-DDF5P57I.js.map
··· 1 + ../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/chunk-DDF5P57I.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-EEUCFWD4.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-EEUCFWD4.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-EEUCFWD4.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-EEUCFWD4.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-ESYALJPH.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-ESYALJPH.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-ESYALJPH.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-ESYALJPH.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-F27JDJI2.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-F27JDJI2.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-F27JDJI2.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-F27JDJI2.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-FAW4EB7G.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-FAW4EB7G.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-FAW4EB7G.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-FAW4EB7G.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-FJAAY3PY.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-FJAAY3PY.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-FJAAY3PY.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-FJAAY3PY.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-FJBTJV3K.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-FJBTJV3K.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-FJBTJV3K.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-FJBTJV3K.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-FPIXTJ7E.js
··· 1 + ../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-FPIXTJ7E.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-FPIXTJ7E.js.map
··· 1 + ../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-FPIXTJ7E.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-FVLUJBZP.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-FVLUJBZP.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-FVLUJBZP.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-FVLUJBZP.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-FZQXS3RE.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-FZQXS3RE.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-FZQXS3RE.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-FZQXS3RE.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-G4P4YFWD.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-G4P4YFWD.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-G4P4YFWD.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-G4P4YFWD.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-G56PUJUJ.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-G56PUJUJ.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-G56PUJUJ.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-G56PUJUJ.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-GCLDJKYV.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-GCLDJKYV.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-GCLDJKYV.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-GCLDJKYV.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-GQIBEDKG.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-GQIBEDKG.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-GQIBEDKG.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-GQIBEDKG.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-GX3WPNEX.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-GX3WPNEX.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-GX3WPNEX.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-GX3WPNEX.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-H3WG7GN4.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-H3WG7GN4.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-H3WG7GN4.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-H3WG7GN4.js.map
+189
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-HC6LITPW.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-HC6LITPW.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-HC6LITPW.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-HC6LITPW.js.map"}
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-HMBZONBJ.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-HMBZONBJ.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-HMBZONBJ.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-HMBZONBJ.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-HN4F5JEZ.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-HN4F5JEZ.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-HN4F5JEZ.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-HN4F5JEZ.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-HNJPKCUJ.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-HNJPKCUJ.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-HNJPKCUJ.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-HNJPKCUJ.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-IGKYDHDK.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-IGKYDHDK.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-IGKYDHDK.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-IGKYDHDK.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-J67JY2AB.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-J67JY2AB.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-J67JY2AB.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-J67JY2AB.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-JBHW662S.js
··· 1 + ../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-JBHW662S.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-JBHW662S.js.map
··· 1 + ../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-JBHW662S.js.map
+312
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-JEB4WIQV.js
··· 1 + import { 2 + element_default 3 + } from "./chunk-G4P4YFWD.js"; 4 + import { 5 + element_default as element_default7 6 + } from "./chunk-6JNRNMZQ.js"; 7 + import { 8 + element_default as element_default11 9 + } from "./chunk-UMMPFCLQ.js"; 10 + import { 11 + element_default as element_default16 12 + } from "./chunk-PKN6FN7E.js"; 13 + import { 14 + element_default as element_default3 15 + } from "./chunk-NP7LZHKR.js"; 16 + import { 17 + element_default as element_default13 18 + } from "./chunk-M2MAFKPM.js"; 19 + import { 20 + element_default as element_default14 21 + } from "./chunk-YV3SRJQF.js"; 22 + import { 23 + element_default as element_default15 24 + } from "./chunk-ESYALJPH.js"; 25 + import { 26 + element_default as element_default5 27 + } from "./chunk-U5LVPDQM.js"; 28 + import { 29 + element_default as element_default6 30 + } from "./chunk-HC6LITPW.js"; 31 + import { 32 + element_default as element_default8 33 + } from "./chunk-TXU4RB3O.js"; 34 + import { 35 + element_default as element_default9 36 + } from "./chunk-3ENCKNXO.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-JEB4WIQV.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-JEB4WIQV.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-JEB4WIQV.js.map"}
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-JZMTETBD.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-JZMTETBD.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-JZMTETBD.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-JZMTETBD.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-KJFA7KRK.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-KJFA7KRK.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-KJFA7KRK.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-KJFA7KRK.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-M2MAFKPM.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-M2MAFKPM.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-M2MAFKPM.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-M2MAFKPM.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-MKOANARL.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-MKOANARL.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-MKOANARL.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-MKOANARL.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-MVUUUQRL.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-MVUUUQRL.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-MVUUUQRL.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-MVUUUQRL.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-NBQPHQFP.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-NBQPHQFP.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-NBQPHQFP.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-NBQPHQFP.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-NKNZGHQG.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-NKNZGHQG.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-NKNZGHQG.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-NKNZGHQG.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-NP7LZHKR.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-NP7LZHKR.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-NP7LZHKR.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-NP7LZHKR.js.map
+1408
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-NSJY6VZI.js
··· 1 + import { 2 + webcrypto 3 + } from "./chunk-77ZY4GQV.js"; 4 + import { 5 + fromBase64Url, 6 + toBase64Url 7 + } from "./chunk-NZ7ODGIJ.js"; 8 + import { 9 + CompositeDidDocumentResolver, 10 + LocalActorResolver, 11 + PlcDidDocumentResolver, 12 + WebDidDocumentResolver, 13 + XrpcHandleResolver, 14 + index_esm_exports 15 + } from "./chunk-CRZ7HJJ4.js"; 16 + import { 17 + encodeUtf8, 18 + toSha256 19 + } from "./chunk-242LG3VP.js"; 20 + import { 21 + Buffer, 22 + __name, 23 + init_Buffer, 24 + init_process 25 + } from "./chunk-FZQXS3RE.js"; 26 + 27 + // components/output/raw/atproto/oauth.js 28 + init_Buffer(); 29 + init_process(); 30 + 31 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/index.js 32 + init_Buffer(); 33 + init_process(); 34 + 35 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/environment.js 36 + init_Buffer(); 37 + init_process(); 38 + 39 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/store/db.js 40 + init_Buffer(); 41 + init_process(); 42 + 43 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/utils/runtime.js 44 + init_Buffer(); 45 + init_process(); 46 + var locks = typeof navigator !== "undefined" ? navigator.locks : void 0; 47 + 48 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/store/db.js 49 + var parse = /* @__PURE__ */ __name((raw) => { 50 + if (raw != null) { 51 + const parsed = JSON.parse(raw); 52 + if (parsed != null) { 53 + return parsed; 54 + } 55 + } 56 + return {}; 57 + }, "parse"); 58 + var createOAuthDatabase = /* @__PURE__ */ __name(({ name }) => { 59 + const controller = new AbortController(); 60 + const signal = controller.signal; 61 + const createStore = /* @__PURE__ */ __name((subname, expiresAt, persistUpdatedAt = false) => { 62 + let store; 63 + const storageKey = `${name}:${subname}`; 64 + const persist = /* @__PURE__ */ __name(() => store && localStorage.setItem(storageKey, JSON.stringify(store)), "persist"); 65 + const read = /* @__PURE__ */ __name(() => { 66 + if (signal.aborted) { 67 + throw new Error(`store closed`); 68 + } 69 + return store ??= parse(localStorage.getItem(storageKey)); 70 + }, "read"); 71 + { 72 + const listener = /* @__PURE__ */ __name((ev) => { 73 + if (ev.key === storageKey) { 74 + store = void 0; 75 + } 76 + }, "listener"); 77 + globalThis.addEventListener("storage", listener, { signal }); 78 + } 79 + { 80 + const cleanup = /* @__PURE__ */ __name(async (lock) => { 81 + if (!lock || signal.aborted) { 82 + return; 83 + } 84 + await new Promise((resolve) => setTimeout(resolve, 1e4)); 85 + if (signal.aborted) { 86 + return; 87 + } 88 + let now = Date.now(); 89 + let changed = false; 90 + read(); 91 + for (const key in store) { 92 + const item = store[key]; 93 + const expiresAt2 = item.expiresAt; 94 + if (expiresAt2 !== null && now > expiresAt2) { 95 + changed = true; 96 + delete store[key]; 97 + } 98 + } 99 + if (changed) { 100 + persist(); 101 + } 102 + }, "cleanup"); 103 + if (locks) { 104 + locks.request(`${storageKey}:cleanup`, { ifAvailable: true }, cleanup); 105 + } else { 106 + cleanup(true); 107 + } 108 + } 109 + return { 110 + get(key) { 111 + read(); 112 + const item = store[key]; 113 + if (!item) { 114 + return; 115 + } 116 + const expiresAt2 = item.expiresAt; 117 + if (expiresAt2 !== null && Date.now() > expiresAt2) { 118 + delete store[key]; 119 + persist(); 120 + return; 121 + } 122 + return item.value; 123 + }, 124 + getWithLapsed(key) { 125 + read(); 126 + const item = store[key]; 127 + const now = Date.now(); 128 + if (!item) { 129 + return [void 0, Infinity]; 130 + } 131 + const updatedAt = item.updatedAt; 132 + if (updatedAt === void 0) { 133 + return [item.value, Infinity]; 134 + } 135 + return [item.value, now - updatedAt]; 136 + }, 137 + set(key, value) { 138 + read(); 139 + const item = { 140 + value, 141 + expiresAt: expiresAt(value), 142 + updatedAt: persistUpdatedAt ? Date.now() : void 0 143 + }; 144 + store[key] = item; 145 + persist(); 146 + }, 147 + delete(key) { 148 + read(); 149 + if (store[key] !== void 0) { 150 + delete store[key]; 151 + persist(); 152 + } 153 + }, 154 + keys() { 155 + read(); 156 + return Object.keys(store); 157 + } 158 + }; 159 + }, "createStore"); 160 + return { 161 + dispose: /* @__PURE__ */ __name(() => { 162 + controller.abort(); 163 + }, "dispose"), 164 + sessions: createStore("sessions", ({ token }) => { 165 + if (token.refresh) { 166 + return null; 167 + } 168 + return token.expires_at ?? null; 169 + }), 170 + states: createStore("states", (_item) => Date.now() + 10 * 60 * 1e3), 171 + // 10 minutes 172 + // The reference PDS have nonces that expire after 3 minutes, while other 173 + // implementations can have varying expiration times. 174 + // Stored for 24 hours. 175 + dpopNonces: createStore("dpopNonces", (_item) => Date.now() + 24 * 60 * 60 * 1e3, true), 176 + inflightDpop: /* @__PURE__ */ new Map() 177 + }; 178 + }, "createOAuthDatabase"); 179 + 180 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/environment.js 181 + var CLIENT_ID; 182 + var REDIRECT_URI; 183 + var fetchClientAssertion; 184 + var database; 185 + var identityResolver; 186 + var configureOAuth = /* @__PURE__ */ __name((options) => { 187 + ({ identityResolver, fetchClientAssertion } = options); 188 + ({ client_id: CLIENT_ID, redirect_uri: REDIRECT_URI } = options.metadata); 189 + database = createOAuthDatabase({ name: options.storageName ?? "atcute-oauth" }); 190 + }, "configureOAuth"); 191 + 192 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/errors.js 193 + init_Buffer(); 194 + init_process(); 195 + var LoginError = class extends Error { 196 + static { 197 + __name(this, "LoginError"); 198 + } 199 + name = "LoginError"; 200 + }; 201 + var AuthorizationError = class extends Error { 202 + static { 203 + __name(this, "AuthorizationError"); 204 + } 205 + name = "AuthorizationError"; 206 + }; 207 + var ResolverError = class extends Error { 208 + static { 209 + __name(this, "ResolverError"); 210 + } 211 + name = "ResolverError"; 212 + }; 213 + var TokenRefreshError = class extends Error { 214 + static { 215 + __name(this, "TokenRefreshError"); 216 + } 217 + sub; 218 + name = "TokenRefreshError"; 219 + constructor(sub, message, options) { 220 + super(message, options); 221 + this.sub = sub; 222 + } 223 + }; 224 + var OAuthResponseError = class extends Error { 225 + static { 226 + __name(this, "OAuthResponseError"); 227 + } 228 + response; 229 + data; 230 + name = "OAuthResponseError"; 231 + error; 232 + description; 233 + constructor(response, data) { 234 + const error = ifString(ifObject(data)?.["error"]); 235 + const errorDescription = ifString(ifObject(data)?.["error_description"]); 236 + const messageError = error ? `"${error}"` : "unknown"; 237 + const messageDesc = errorDescription ? `: ${errorDescription}` : ""; 238 + const message = `OAuth ${messageError} error${messageDesc}`; 239 + super(message); 240 + this.response = response; 241 + this.data = data; 242 + this.error = error; 243 + this.description = errorDescription; 244 + } 245 + get status() { 246 + return this.response.status; 247 + } 248 + get headers() { 249 + return this.response.headers; 250 + } 251 + }; 252 + var FetchResponseError = class extends Error { 253 + static { 254 + __name(this, "FetchResponseError"); 255 + } 256 + response; 257 + status; 258 + name = "FetchResponseError"; 259 + constructor(response, status, message) { 260 + super(message); 261 + this.response = response; 262 + this.status = status; 263 + } 264 + }; 265 + var ifString = /* @__PURE__ */ __name((v) => { 266 + return typeof v === "string" ? v : void 0; 267 + }, "ifString"); 268 + var ifObject = /* @__PURE__ */ __name((v) => { 269 + return typeof v === "object" && v !== null && !Array.isArray(v) ? v : void 0; 270 + }, "ifObject"); 271 + 272 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/agents/exchange.js 273 + init_Buffer(); 274 + init_process(); 275 + 276 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/index.js 277 + init_Buffer(); 278 + init_process(); 279 + 280 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/client-assertion/index.js 281 + init_Buffer(); 282 + init_process(); 283 + 284 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/client-assertion/create-client-assertion.js 285 + init_Buffer(); 286 + init_process(); 287 + 288 + // ../node_modules/.deno/nanoid@5.1.6/node_modules/nanoid/index.js 289 + init_Buffer(); 290 + init_process(); 291 + 292 + // ../node_modules/.deno/nanoid@5.1.6/node_modules/nanoid/url-alphabet/index.js 293 + init_Buffer(); 294 + init_process(); 295 + var urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"; 296 + 297 + // ../node_modules/.deno/nanoid@5.1.6/node_modules/nanoid/index.js 298 + var POOL_SIZE_MULTIPLIER = 128; 299 + var pool; 300 + var poolOffset; 301 + function fillPool(bytes) { 302 + if (!pool || pool.length < bytes) { 303 + pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER); 304 + webcrypto.getRandomValues(pool); 305 + poolOffset = 0; 306 + } else if (poolOffset + bytes > pool.length) { 307 + webcrypto.getRandomValues(pool); 308 + poolOffset = 0; 309 + } 310 + poolOffset += bytes; 311 + } 312 + __name(fillPool, "fillPool"); 313 + function nanoid(size = 21) { 314 + fillPool(size |= 0); 315 + let id = ""; 316 + for (let i = poolOffset - size; i < poolOffset; i++) { 317 + id += urlAlphabet[pool[i] & 63]; 318 + } 319 + return id; 320 + } 321 + __name(nanoid, "nanoid"); 322 + 323 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/internal/key-cache.js 324 + init_Buffer(); 325 + init_process(); 326 + 327 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/internal/jwk.js 328 + init_Buffer(); 329 + init_process(); 330 + 331 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/internal/crypto.js 332 + init_Buffer(); 333 + init_process(); 334 + var HASH_BY_ALG = { 335 + ES256: "SHA-256", 336 + ES384: "SHA-384", 337 + ES512: "SHA-512", 338 + PS256: "SHA-256", 339 + PS384: "SHA-384", 340 + PS512: "SHA-512", 341 + RS256: "SHA-256", 342 + RS384: "SHA-384", 343 + RS512: "SHA-512" 344 + }; 345 + var CURVE_BY_ALG = { 346 + ES256: "P-256", 347 + ES384: "P-384", 348 + ES512: "P-521", 349 + PS256: null, 350 + PS384: null, 351 + PS512: null, 352 + RS256: null, 353 + RS384: null, 354 + RS512: null 355 + }; 356 + var getHashName = /* @__PURE__ */ __name((alg) => { 357 + return HASH_BY_ALG[alg]; 358 + }, "getHashName"); 359 + var getNamedCurve = /* @__PURE__ */ __name((alg) => { 360 + return CURVE_BY_ALG[alg]; 361 + }, "getNamedCurve"); 362 + var getSignAlgorithm = /* @__PURE__ */ __name((alg) => { 363 + if (alg.startsWith("ES")) { 364 + return { name: "ECDSA", hash: { name: getHashName(alg) } }; 365 + } 366 + if (alg.startsWith("PS")) { 367 + return { 368 + name: "RSA-PSS", 369 + hash: { name: getHashName(alg) }, 370 + saltLength: getHashLength(getHashName(alg)) 371 + }; 372 + } 373 + return { name: "RSASSA-PKCS1-v1_5" }; 374 + }, "getSignAlgorithm"); 375 + var getImportAlgorithm = /* @__PURE__ */ __name((alg, curve) => { 376 + if (alg.startsWith("ES")) { 377 + const namedCurve = curve ?? getNamedCurve(alg); 378 + if (!namedCurve) { 379 + throw new Error(`unable to determine curve for ${alg}`); 380 + } 381 + return { name: "ECDSA", namedCurve }; 382 + } 383 + if (alg.startsWith("PS")) { 384 + return { name: "RSA-PSS", hash: { name: getHashName(alg) } }; 385 + } 386 + return { name: "RSASSA-PKCS1-v1_5", hash: { name: getHashName(alg) } }; 387 + }, "getImportAlgorithm"); 388 + var getGenerateAlgorithm = /* @__PURE__ */ __name((alg) => { 389 + const curve = getNamedCurve(alg); 390 + if (curve) { 391 + return { name: "ECDSA", namedCurve: curve }; 392 + } 393 + const hash = { name: getHashName(alg) }; 394 + return { 395 + name: alg.startsWith("PS") ? "RSA-PSS" : "RSASSA-PKCS1-v1_5", 396 + hash, 397 + modulusLength: 2048, 398 + publicExponent: new Uint8Array([1, 0, 1]) 399 + }; 400 + }, "getGenerateAlgorithm"); 401 + var getHashLength = /* @__PURE__ */ __name((hash) => { 402 + switch (hash) { 403 + case "SHA-256": 404 + return 32; 405 + case "SHA-384": 406 + return 48; 407 + case "SHA-512": 408 + return 64; 409 + } 410 + }, "getHashLength"); 411 + 412 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/internal/jwk.js 413 + var SIGNING_ALGORITHMS = [ 414 + "ES256", 415 + "ES384", 416 + "ES512", 417 + "PS256", 418 + "PS384", 419 + "PS512", 420 + "RS256", 421 + "RS384", 422 + "RS512" 423 + ]; 424 + var isSigningAlgorithm = /* @__PURE__ */ __name((alg) => { 425 + return SIGNING_ALGORITHMS.includes(alg); 426 + }, "isSigningAlgorithm"); 427 + var derivePublicJwk = /* @__PURE__ */ __name((privateJwk, kid, alg) => { 428 + if (privateJwk.kty === "EC") { 429 + const { crv, x, y } = privateJwk; 430 + return { kty: "EC", crv, x, y, kid, alg, use: "sig" }; 431 + } 432 + if (privateJwk.kty === "RSA") { 433 + const { n, e } = privateJwk; 434 + return { kty: "RSA", n, e, kid, alg, use: "sig" }; 435 + } 436 + throw new Error(`unsupported key type`); 437 + }, "derivePublicJwk"); 438 + var importPrivateKeyFromJwk = /* @__PURE__ */ __name(async (jwk, alg) => { 439 + if (!("d" in jwk) || !jwk.d) { 440 + throw new Error(`expected a private key (missing 'd' parameter)`); 441 + } 442 + if (jwk.kty === "EC" && !alg.startsWith("ES")) { 443 + throw new Error(`algorithm ${alg} does not match ec key`); 444 + } 445 + if (jwk.kty === "RSA" && alg.startsWith("ES")) { 446 + throw new Error(`algorithm ${alg} does not match rsa key`); 447 + } 448 + const algorithm = getImportAlgorithm(alg, jwk.kty === "EC" ? jwk.crv : void 0); 449 + const key = await crypto.subtle.importKey("jwk", jwk, algorithm, true, ["sign"]); 450 + if (!(key instanceof CryptoKey)) { 451 + throw new Error(`expected asymmetric key, got symmetric`); 452 + } 453 + return key; 454 + }, "importPrivateKeyFromJwk"); 455 + var exportPrivateJwkFromKey = /* @__PURE__ */ __name(async (key, alg, kid) => { 456 + const jwk = await crypto.subtle.exportKey("jwk", key); 457 + jwk.alg = alg; 458 + if (kid) { 459 + jwk.kid = kid; 460 + } 461 + return jwk; 462 + }, "exportPrivateJwkFromKey"); 463 + 464 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/internal/key-cache.js 465 + var keyCache = /* @__PURE__ */ new WeakMap(); 466 + var getCachedKeyMaterial = /* @__PURE__ */ __name(async (jwk) => { 467 + const cached = keyCache.get(jwk); 468 + if (cached) { 469 + return cached; 470 + } 471 + const { alg } = jwk; 472 + const cryptoKey = await importPrivateKeyFromJwk(jwk, alg); 473 + const publicJwk = derivePublicJwk(jwk, jwk.kid, alg); 474 + const material = { cryptoKey, publicJwk }; 475 + keyCache.set(jwk, material); 476 + return material; 477 + }, "getCachedKeyMaterial"); 478 + var setCachedKeyMaterial = /* @__PURE__ */ __name((jwk, cryptoKey) => { 479 + const publicJwk = derivePublicJwk(jwk, jwk.kid, jwk.alg); 480 + keyCache.set(jwk, { cryptoKey, publicJwk }); 481 + }, "setCachedKeyMaterial"); 482 + 483 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/jwt/index.js 484 + init_Buffer(); 485 + init_process(); 486 + var signJwt = /* @__PURE__ */ __name(async (params) => { 487 + const { header, payload, key, alg } = params; 488 + const fullHeader = { ...header, alg }; 489 + const headerSegment = encodeSegment(fullHeader); 490 + const payloadSegment = encodeSegment(payload); 491 + const signingInput = `${headerSegment}.${payloadSegment}`; 492 + const signature = await crypto.subtle.sign(getSignAlgorithm(alg), key, encodeUtf8(signingInput)); 493 + const signatureSegment = toBase64Url(new Uint8Array(signature)); 494 + return `${signingInput}.${signatureSegment}`; 495 + }, "signJwt"); 496 + var encodeSegment = /* @__PURE__ */ __name((value) => { 497 + return toBase64Url(encodeUtf8(JSON.stringify(value))); 498 + }, "encodeSegment"); 499 + 500 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/client-assertion/generate-key.js 501 + init_Buffer(); 502 + init_process(); 503 + 504 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/client-assertion/keys.js 505 + init_Buffer(); 506 + init_process(); 507 + 508 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/dpop/index.js 509 + init_Buffer(); 510 + init_process(); 511 + 512 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/dpop/fetch.js 513 + init_Buffer(); 514 + init_process(); 515 + 516 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/hash/sha256.js 517 + init_Buffer(); 518 + init_process(); 519 + var sha256Base64Url = /* @__PURE__ */ __name(async (input) => { 520 + const bytes = encodeUtf8(input); 521 + const digest = await toSha256(bytes); 522 + return toBase64Url(digest); 523 + }, "sha256Base64Url"); 524 + 525 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/dpop/proof.js 526 + init_Buffer(); 527 + init_process(); 528 + var createDpopProofSigner = /* @__PURE__ */ __name((jwk) => { 529 + const alg = jwk.alg; 530 + let materialPromise; 531 + return async (htm, htu, nonce, ath) => { 532 + materialPromise ||= getCachedKeyMaterial(jwk); 533 + const { cryptoKey, publicJwk } = await materialPromise; 534 + const now = Math.floor(Date.now() / 1e3); 535 + return signJwt({ 536 + header: { 537 + typ: "dpop+jwt", 538 + jwk: publicJwk 539 + }, 540 + payload: { 541 + htm, 542 + htu, 543 + iat: now, 544 + jti: nanoid(24), 545 + nonce, 546 + ath 547 + }, 548 + key: cryptoKey, 549 + alg 550 + }); 551 + }; 552 + }, "createDpopProofSigner"); 553 + 554 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/dpop/generate-key.js 555 + init_Buffer(); 556 + init_process(); 557 + var PREFERRED_ALGORITHMS = [ 558 + "ES256", 559 + "ES384", 560 + "ES512", 561 + "PS256", 562 + "PS384", 563 + "PS512", 564 + "RS256", 565 + "RS384", 566 + "RS512" 567 + ]; 568 + var sortAlgorithms = /* @__PURE__ */ __name((algs) => { 569 + return [...algs].sort((a, b) => { 570 + const aIdx = PREFERRED_ALGORITHMS.indexOf(a); 571 + const bIdx = PREFERRED_ALGORITHMS.indexOf(b); 572 + if (aIdx === -1 && bIdx === -1) { 573 + return 0; 574 + } 575 + if (aIdx === -1) { 576 + return 1; 577 + } 578 + if (bIdx === -1) { 579 + return -1; 580 + } 581 + return aIdx - bIdx; 582 + }); 583 + }, "sortAlgorithms"); 584 + var generateDpopKey = /* @__PURE__ */ __name(async (supportedAlgs) => { 585 + const normalized = supportedAlgs?.filter(isSigningAlgorithm) ?? []; 586 + if (supportedAlgs?.length && normalized.length === 0) { 587 + throw new Error(`no supported algorithms provided`); 588 + } 589 + const algs = normalized.length ? sortAlgorithms(normalized) : ["ES256"]; 590 + const errors = []; 591 + for (const alg of algs) { 592 + try { 593 + const pair = await crypto.subtle.generateKey(getGenerateAlgorithm(alg), true, ["sign", "verify"]); 594 + const jwk = await exportPrivateJwkFromKey(pair.privateKey, alg); 595 + setCachedKeyMaterial(jwk, pair.privateKey); 596 + return jwk; 597 + } catch (err) { 598 + errors.push(err); 599 + } 600 + } 601 + throw new AggregateError(errors, `failed to generate DPoP key for any of: ${algs.join(", ")}`); 602 + }, "generateDpopKey"); 603 + 604 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/dpop/verify.js 605 + init_Buffer(); 606 + init_process(); 607 + 608 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/jwk/compute-jkt.js 609 + init_Buffer(); 610 + init_process(); 611 + 612 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/dpop/verify.js 613 + var dpopJwkSchema = index_esm_exports.union(index_esm_exports.object({ 614 + kty: index_esm_exports.literal("EC"), 615 + crv: index_esm_exports.union(index_esm_exports.literal("P-256"), index_esm_exports.literal("P-384"), index_esm_exports.literal("P-521")), 616 + x: index_esm_exports.string(), 617 + y: index_esm_exports.string() 618 + }), index_esm_exports.object({ 619 + kty: index_esm_exports.literal("RSA"), 620 + e: index_esm_exports.string(), 621 + n: index_esm_exports.string() 622 + })); 623 + var dpopHeaderSchema = index_esm_exports.object({ 624 + typ: index_esm_exports.literal("dpop+jwt"), 625 + alg: index_esm_exports.string().assert((alg) => alg !== "none", 'alg must not be "none"'), 626 + jwk: dpopJwkSchema 627 + }); 628 + var dpopPayloadSchema = index_esm_exports.object({ 629 + htm: index_esm_exports.string(), 630 + htu: index_esm_exports.string(), 631 + iat: index_esm_exports.number(), 632 + jti: index_esm_exports.string(), 633 + nonce: index_esm_exports.string().optional() 634 + }); 635 + 636 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/hash/index.js 637 + init_Buffer(); 638 + init_process(); 639 + 640 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/hash/pkce.js 641 + init_Buffer(); 642 + init_process(); 643 + var generatePkce = /* @__PURE__ */ __name(async (length = 64) => { 644 + const verifier = nanoid(length); 645 + const challenge = await sha256Base64Url(verifier); 646 + return { verifier, challenge, method: "S256" }; 647 + }, "generatePkce"); 648 + 649 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/jwk/index.js 650 + init_Buffer(); 651 + init_process(); 652 + 653 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/jwk/keys.js 654 + init_Buffer(); 655 + init_process(); 656 + 657 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/resolvers.js 658 + init_Buffer(); 659 + init_process(); 660 + 661 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/utils/response.js 662 + init_Buffer(); 663 + init_process(); 664 + var extractContentType = /* @__PURE__ */ __name((headers) => { 665 + return headers.get("content-type")?.split(";")[0]; 666 + }, "extractContentType"); 667 + 668 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/utils/strings.js 669 + init_Buffer(); 670 + init_process(); 671 + var isUrlParseSupported = "parse" in URL; 672 + var isValidUrl = /* @__PURE__ */ __name((urlString) => { 673 + let url = null; 674 + if (isUrlParseSupported) { 675 + url = URL.parse(urlString); 676 + } else { 677 + try { 678 + url = new URL(urlString); 679 + } catch { 680 + } 681 + } 682 + if (url !== null) { 683 + return url.protocol === "https:" || url.protocol === "http:"; 684 + } 685 + return false; 686 + }, "isValidUrl"); 687 + 688 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/resolvers.js 689 + var resolveFromIdentifier = /* @__PURE__ */ __name(async (ident) => { 690 + const identity = await identityResolver.resolve(ident); 691 + return { 692 + identity, 693 + metadata: await getMetadataFromResourceServer(identity.pds) 694 + }; 695 + }, "resolveFromIdentifier"); 696 + var resolveFromService = /* @__PURE__ */ __name(async (host) => { 697 + try { 698 + const metadata = await getMetadataFromResourceServer(host); 699 + return { metadata }; 700 + } catch (err) { 701 + if (err instanceof ResolverError) { 702 + try { 703 + const metadata = await getOAuthAuthorizationServerMetadata(host); 704 + return { metadata }; 705 + } catch { 706 + } 707 + } 708 + throw err; 709 + } 710 + }, "resolveFromService"); 711 + var getOAuthProtectedResourceMetadata = /* @__PURE__ */ __name(async (host) => { 712 + const url = new URL(`/.well-known/oauth-protected-resource`, host); 713 + const response = await fetch(url.href, { 714 + redirect: "manual", 715 + headers: { 716 + accept: "application/json" 717 + } 718 + }); 719 + if (response.status !== 200 || extractContentType(response.headers) !== "application/json") { 720 + throw new ResolverError(`unexpected response`); 721 + } 722 + const metadata = await response.json(); 723 + if (metadata.resource !== url.origin) { 724 + throw new ResolverError(`unexpected issuer`); 725 + } 726 + return metadata; 727 + }, "getOAuthProtectedResourceMetadata"); 728 + var getOAuthAuthorizationServerMetadata = /* @__PURE__ */ __name(async (host) => { 729 + const url = new URL(`/.well-known/oauth-authorization-server`, host); 730 + const response = await fetch(url.href, { 731 + redirect: "manual", 732 + headers: { 733 + accept: "application/json" 734 + } 735 + }); 736 + if (response.status !== 200 || extractContentType(response.headers) !== "application/json") { 737 + throw new ResolverError(`unexpected response`); 738 + } 739 + const metadata = await response.json(); 740 + if (metadata.issuer !== url.origin) { 741 + throw new ResolverError(`unexpected issuer`); 742 + } 743 + if (!isValidUrl(metadata.authorization_endpoint)) { 744 + throw new ResolverError(`authorization server provided incorrect authorization endpoint`); 745 + } 746 + if (!metadata.client_id_metadata_document_supported) { 747 + throw new ResolverError(`authorization server does not support 'client_id_metadata_document'`); 748 + } 749 + if (!metadata.pushed_authorization_request_endpoint) { 750 + throw new ResolverError(`authorization server does not support 'pushed_authorization request'`); 751 + } 752 + if (metadata.response_types_supported) { 753 + if (!metadata.response_types_supported.includes("code")) { 754 + throw new ResolverError(`authorization server does not support 'code' response type`); 755 + } 756 + } 757 + return metadata; 758 + }, "getOAuthAuthorizationServerMetadata"); 759 + var getMetadataFromResourceServer = /* @__PURE__ */ __name(async (input) => { 760 + const rs_metadata = await getOAuthProtectedResourceMetadata(input); 761 + if (rs_metadata.authorization_servers?.length !== 1) { 762 + throw new ResolverError(`expected exactly one authorization server in the listing`); 763 + } 764 + const issuer = rs_metadata.authorization_servers[0]; 765 + const as_metadata = await getOAuthAuthorizationServerMetadata(issuer); 766 + if (as_metadata.protected_resources) { 767 + if (!as_metadata.protected_resources.includes(rs_metadata.resource)) { 768 + throw new ResolverError(`server is not in authorization server's jurisdiction`); 769 + } 770 + } 771 + return as_metadata; 772 + }, "getMetadataFromResourceServer"); 773 + 774 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/agents/server-agent.js 775 + init_Buffer(); 776 + init_process(); 777 + 778 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/dpop.js 779 + init_Buffer(); 780 + init_process(); 781 + var createDPoPFetch = /* @__PURE__ */ __name((dpopKey, isAuthServer) => { 782 + const nonces = database.dpopNonces; 783 + const pending2 = database.inflightDpop; 784 + const sign = createDpopProofSigner(dpopKey); 785 + return async (input, init) => { 786 + const request = new Request(input, init); 787 + const authorizationHeader = request.headers.get("authorization"); 788 + const ath = authorizationHeader?.startsWith("DPoP ") ? await sha256Base64Url(authorizationHeader.slice(5)) : void 0; 789 + const { method, url } = request; 790 + const { origin, pathname } = new URL(url); 791 + const htu = origin + pathname; 792 + let deferred = pending2.get(origin); 793 + if (deferred) { 794 + await deferred.promise; 795 + deferred = void 0; 796 + } 797 + let initNonce; 798 + let expiredOrMissing = false; 799 + try { 800 + const [nonce, lapsed] = nonces.getWithLapsed(origin); 801 + initNonce = nonce; 802 + expiredOrMissing = lapsed > 3 * 60 * 1e3; 803 + } catch { 804 + } 805 + if (expiredOrMissing) { 806 + pending2.set(origin, deferred = Promise.withResolvers()); 807 + } 808 + let nextNonce; 809 + try { 810 + const initProof = await sign(method, htu, initNonce, ath); 811 + request.headers.set("dpop", initProof); 812 + const initResponse = await fetch(request); 813 + nextNonce = initResponse.headers.get("dpop-nonce"); 814 + if (nextNonce === null || nextNonce === initNonce) { 815 + return initResponse; 816 + } 817 + try { 818 + nonces.set(origin, nextNonce); 819 + } catch { 820 + } 821 + const shouldRetry = await isUseDpopNonceError(initResponse, isAuthServer); 822 + if (!shouldRetry) { 823 + return initResponse; 824 + } 825 + if (input === request || init?.body instanceof ReadableStream) { 826 + return initResponse; 827 + } 828 + } finally { 829 + if (deferred) { 830 + pending2.delete(origin); 831 + deferred.resolve(); 832 + } 833 + } 834 + { 835 + const nextProof = await sign(method, htu, nextNonce, ath); 836 + const nextRequest = new Request(input, init); 837 + nextRequest.headers.set("dpop", nextProof); 838 + const retryResponse = await fetch(nextRequest); 839 + const retryNonce = retryResponse.headers.get("dpop-nonce"); 840 + if (retryNonce !== null && retryNonce !== nextNonce) { 841 + try { 842 + nonces.set(origin, retryNonce); 843 + } catch { 844 + } 845 + } 846 + return retryResponse; 847 + } 848 + }; 849 + }, "createDPoPFetch"); 850 + var isUseDpopNonceError = /* @__PURE__ */ __name(async (response, isAuthServer) => { 851 + if (isAuthServer === void 0 || isAuthServer === false) { 852 + if (response.status === 401) { 853 + const wwwAuth = response.headers.get("www-authenticate"); 854 + if (wwwAuth?.startsWith("DPoP")) { 855 + return wwwAuth.includes('error="use_dpop_nonce"'); 856 + } 857 + } 858 + } 859 + if (isAuthServer === void 0 || isAuthServer === true) { 860 + if (response.status === 400 && extractContentType(response.headers) === "application/json") { 861 + try { 862 + const json = await response.clone().json(); 863 + return typeof json === "object" && json?.["error"] === "use_dpop_nonce"; 864 + } catch { 865 + return false; 866 + } 867 + } 868 + } 869 + return false; 870 + }, "isUseDpopNonceError"); 871 + 872 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/utils/misc.js 873 + init_Buffer(); 874 + init_process(); 875 + var pick = /* @__PURE__ */ __name((obj, keys) => { 876 + const cloned = {}; 877 + for (let idx = 0, len = keys.length; idx < len; idx++) { 878 + const key = keys[idx]; 879 + cloned[key] = obj[key]; 880 + } 881 + return cloned; 882 + }, "pick"); 883 + 884 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/agents/server-agent.js 885 + var OAuthServerAgent = class { 886 + static { 887 + __name(this, "OAuthServerAgent"); 888 + } 889 + #fetch; 890 + #metadata; 891 + #dpopKey; 892 + constructor(metadata, dpopKey) { 893 + this.#metadata = metadata; 894 + this.#dpopKey = dpopKey; 895 + this.#fetch = createDPoPFetch(dpopKey, true); 896 + } 897 + async request(endpoint, payload) { 898 + const url = this.#metadata[`${endpoint}_endpoint`]; 899 + if (!url) { 900 + throw new Error(`no endpoint for ${endpoint}`); 901 + } 902 + if ((endpoint === "token" || endpoint === "pushed_authorization_request") && fetchClientAssertion !== void 0) { 903 + const sign = createDpopProofSigner(this.#dpopKey); 904 + const assertion = await fetchClientAssertion({ 905 + aud: this.#metadata.issuer, 906 + createDpopProof: /* @__PURE__ */ __name(async (url2, nonce) => { 907 + return await sign("POST", url2, nonce, void 0); 908 + }, "createDpopProof") 909 + }); 910 + payload = { ...payload, ...assertion }; 911 + } 912 + const response = await this.#fetch(url, { 913 + method: "post", 914 + headers: { "content-type": "application/json" }, 915 + body: JSON.stringify({ ...payload, client_id: CLIENT_ID }) 916 + }); 917 + if (extractContentType(response.headers) !== "application/json") { 918 + throw new FetchResponseError(response, 2, `unexpected content-type`); 919 + } 920 + const json = await response.json(); 921 + if (response.ok) { 922 + return json; 923 + } else { 924 + throw new OAuthResponseError(response, json); 925 + } 926 + } 927 + async revoke(token) { 928 + try { 929 + await this.request("revocation", { token }); 930 + } catch { 931 + } 932 + } 933 + async exchangeCode(code, verifier) { 934 + const response = await this.request("token", { 935 + grant_type: "authorization_code", 936 + redirect_uri: REDIRECT_URI, 937 + code, 938 + code_verifier: verifier 939 + }); 940 + try { 941 + return await this.#processExchangeResponse(response); 942 + } catch (err) { 943 + await this.revoke(response.access_token); 944 + throw err; 945 + } 946 + } 947 + async refresh({ sub, token }) { 948 + if (!token.refresh) { 949 + throw new TokenRefreshError(sub, "no refresh token available"); 950 + } 951 + const response = await this.request("token", { 952 + grant_type: "refresh_token", 953 + refresh_token: token.refresh 954 + }); 955 + try { 956 + if (sub !== response.sub) { 957 + throw new TokenRefreshError(sub, `sub mismatch in token response; got ${response.sub}`); 958 + } 959 + return this.#processTokenResponse(response); 960 + } catch (err) { 961 + await this.revoke(response.access_token); 962 + throw err; 963 + } 964 + } 965 + #processTokenResponse(res) { 966 + if (!res.sub) { 967 + throw new TypeError(`missing sub field in token response`); 968 + } 969 + if (!res.scope) { 970 + throw new TypeError(`missing scope field in token response`); 971 + } 972 + if (res.token_type !== "DPoP") { 973 + throw new TypeError(`token response returned a non-dpop token`); 974 + } 975 + return { 976 + scope: res.scope, 977 + refresh: res.refresh_token, 978 + access: res.access_token, 979 + type: res.token_type, 980 + expires_at: typeof res.expires_in === "number" ? Date.now() + res.expires_in * 1e3 : void 0 981 + }; 982 + } 983 + async #processExchangeResponse(res) { 984 + const sub = res.sub; 985 + if (!sub) { 986 + throw new TypeError(`missing sub field in token response`); 987 + } 988 + const token = this.#processTokenResponse(res); 989 + const resolved = await resolveFromIdentifier(sub); 990 + if (resolved.metadata.issuer !== this.#metadata.issuer) { 991 + throw new TypeError(`issuer mismatch; got ${resolved.metadata.issuer}`); 992 + } 993 + return { 994 + token, 995 + info: { 996 + sub, 997 + aud: resolved.identity.pds, 998 + server: pick(resolved.metadata, [ 999 + "issuer", 1000 + "authorization_endpoint", 1001 + "introspection_endpoint", 1002 + "pushed_authorization_request_endpoint", 1003 + "revocation_endpoint", 1004 + "token_endpoint" 1005 + ]) 1006 + } 1007 + }; 1008 + } 1009 + }; 1010 + 1011 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/agents/sessions.js 1012 + init_Buffer(); 1013 + init_process(); 1014 + 1015 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/utils/dpop-key.js 1016 + init_Buffer(); 1017 + init_process(); 1018 + var ES256_ALG = { name: "ECDSA", namedCurve: "P-256" }; 1019 + var isLegacyDpopKey = /* @__PURE__ */ __name((key) => { 1020 + return typeof key.key === "string" && typeof key.jwt === "string"; 1021 + }, "isLegacyDpopKey"); 1022 + var migrateLegacyDpopKey = /* @__PURE__ */ __name(async (key) => { 1023 + const pkcs8 = fromBase64Url(key.key); 1024 + const cryptoKey = await crypto.subtle.importKey("pkcs8", pkcs8, ES256_ALG, true, ["sign"]); 1025 + const jwk = await crypto.subtle.exportKey("jwk", cryptoKey); 1026 + jwk.alg = "ES256"; 1027 + return jwk; 1028 + }, "migrateLegacyDpopKey"); 1029 + 1030 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/agents/sessions.js 1031 + var pending = /* @__PURE__ */ new Map(); 1032 + var getSession = /* @__PURE__ */ __name(async (sub, options) => { 1033 + options?.signal?.throwIfAborted(); 1034 + let allowStored = isTokenUsable; 1035 + if (options?.noCache) { 1036 + allowStored = returnFalse; 1037 + } else if (options?.allowStale) { 1038 + allowStored = returnTrue; 1039 + } 1040 + let previousExecutionFlow; 1041 + while (previousExecutionFlow = pending.get(sub)) { 1042 + try { 1043 + const { isFresh, value: value2 } = await previousExecutionFlow; 1044 + if (isFresh || allowStored(value2)) { 1045 + return value2; 1046 + } 1047 + } catch { 1048 + } 1049 + options?.signal?.throwIfAborted(); 1050 + } 1051 + const run = /* @__PURE__ */ __name(async () => { 1052 + const storedSession = await migrateSessionIfNeeded(sub, database.sessions.get(sub)); 1053 + if (storedSession && allowStored(storedSession)) { 1054 + return { isFresh: false, value: storedSession }; 1055 + } 1056 + const newSession = await refreshToken(sub, storedSession); 1057 + await storeSession(sub, newSession); 1058 + return { isFresh: true, value: newSession }; 1059 + }, "run"); 1060 + let promise; 1061 + if (locks) { 1062 + promise = locks.request(`atcute-oauth:${sub}`, run); 1063 + } else { 1064 + promise = run(); 1065 + } 1066 + promise = promise.finally(() => pending.delete(sub)); 1067 + if (pending.has(sub)) { 1068 + throw new Error("concurrent request for the same key"); 1069 + } 1070 + pending.set(sub, promise); 1071 + const { value } = await promise; 1072 + return value; 1073 + }, "getSession"); 1074 + var storeSession = /* @__PURE__ */ __name(async (sub, newSession) => { 1075 + try { 1076 + database.sessions.set(sub, newSession); 1077 + } catch (err) { 1078 + await onRefreshError(newSession); 1079 + throw err; 1080 + } 1081 + }, "storeSession"); 1082 + var deleteStoredSession = /* @__PURE__ */ __name((sub) => { 1083 + database.sessions.delete(sub); 1084 + }, "deleteStoredSession"); 1085 + var returnTrue = /* @__PURE__ */ __name(() => true, "returnTrue"); 1086 + var returnFalse = /* @__PURE__ */ __name(() => false, "returnFalse"); 1087 + var refreshToken = /* @__PURE__ */ __name(async (sub, storedSession) => { 1088 + if (storedSession === void 0) { 1089 + throw new TokenRefreshError(sub, `session deleted by another tab`); 1090 + } 1091 + const { dpopKey, info, token } = storedSession; 1092 + const server = new OAuthServerAgent(info.server, dpopKey); 1093 + try { 1094 + const newToken = await server.refresh({ sub: info.sub, token }); 1095 + return { dpopKey, info, token: newToken }; 1096 + } catch (cause) { 1097 + if (cause instanceof OAuthResponseError && cause.status === 400 && cause.error === "invalid_grant") { 1098 + throw new TokenRefreshError(sub, `session was revoked`, { cause }); 1099 + } 1100 + throw cause; 1101 + } 1102 + }, "refreshToken"); 1103 + var onRefreshError = /* @__PURE__ */ __name(async ({ dpopKey, info, token }) => { 1104 + const server = new OAuthServerAgent(info.server, dpopKey); 1105 + await server.revoke(token.refresh ?? token.access); 1106 + }, "onRefreshError"); 1107 + var isTokenUsable = /* @__PURE__ */ __name(({ token }) => { 1108 + const expires = token.expires_at; 1109 + return expires == null || Date.now() + 6e4 <= expires; 1110 + }, "isTokenUsable"); 1111 + var migrateSessionIfNeeded = /* @__PURE__ */ __name(async (sub, session) => { 1112 + if (!session || !isLegacyDpopKey(session.dpopKey)) { 1113 + return session; 1114 + } 1115 + const dpopKey = await migrateLegacyDpopKey(session.dpopKey); 1116 + const migrated = { ...session, dpopKey }; 1117 + try { 1118 + database.sessions.set(sub, migrated); 1119 + } catch { 1120 + } 1121 + return migrated; 1122 + }, "migrateSessionIfNeeded"); 1123 + 1124 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/agents/exchange.js 1125 + var createAuthorizationUrl = /* @__PURE__ */ __name(async (options) => { 1126 + const { target, scope, state = null, ...reqs } = options; 1127 + let resolved; 1128 + switch (target.type) { 1129 + case "account": { 1130 + resolved = await resolveFromIdentifier(target.identifier); 1131 + break; 1132 + } 1133 + case "pds": { 1134 + resolved = await resolveFromService(target.serviceUrl); 1135 + } 1136 + } 1137 + const { identity, metadata } = resolved; 1138 + const loginHint = identity ? identity.handle !== "handle.invalid" ? identity.handle : identity.did : void 0; 1139 + const sid = nanoid(24); 1140 + const pkce = await generatePkce(); 1141 + const dpopKey = await generateDpopKey(["ES256"]); 1142 + const params = { 1143 + display: reqs.display, 1144 + ui_locales: reqs.locale, 1145 + prompt: reqs.prompt, 1146 + redirect_uri: REDIRECT_URI, 1147 + code_challenge: pkce.challenge, 1148 + code_challenge_method: pkce.method, 1149 + state: sid, 1150 + login_hint: loginHint, 1151 + response_mode: "fragment", 1152 + response_type: "code", 1153 + scope 1154 + }; 1155 + database.states.set(sid, { 1156 + dpopKey, 1157 + metadata, 1158 + verifier: pkce.verifier, 1159 + state 1160 + }); 1161 + const server = new OAuthServerAgent(metadata, dpopKey); 1162 + const response = await server.request("pushed_authorization_request", params); 1163 + const authUrl = new URL(metadata.authorization_endpoint); 1164 + authUrl.searchParams.set("client_id", CLIENT_ID); 1165 + authUrl.searchParams.set("request_uri", response.request_uri); 1166 + return authUrl; 1167 + }, "createAuthorizationUrl"); 1168 + var finalizeAuthorization = /* @__PURE__ */ __name(async (params) => { 1169 + const issuer = params.get("iss"); 1170 + const sid = params.get("state"); 1171 + const code = params.get("code"); 1172 + const error = params.get("error"); 1173 + if (!sid || !(code || error)) { 1174 + throw new LoginError(`missing parameters`); 1175 + } 1176 + const stored = database.states.get(sid); 1177 + if (stored) { 1178 + database.states.delete(sid); 1179 + } else { 1180 + throw new LoginError(`unknown state provided`); 1181 + } 1182 + if (error) { 1183 + throw new AuthorizationError(params.get("error_description") || error); 1184 + } 1185 + if (!code) { 1186 + throw new LoginError(`missing code parameter`); 1187 + } 1188 + const dpopKey = stored.dpopKey; 1189 + const metadata = stored.metadata; 1190 + const state = stored.state ?? null; 1191 + if (issuer === null) { 1192 + throw new LoginError(`missing issuer parameter`); 1193 + } else if (issuer !== metadata.issuer) { 1194 + throw new LoginError(`issuer mismatch`); 1195 + } 1196 + const server = new OAuthServerAgent(metadata, dpopKey); 1197 + const { info, token } = await server.exchangeCode(code, stored.verifier); 1198 + const sub = info.sub; 1199 + const session = { dpopKey, info, token }; 1200 + await storeSession(sub, session); 1201 + return { session, state }; 1202 + }, "finalizeAuthorization"); 1203 + 1204 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/agents/user-agent.js 1205 + init_Buffer(); 1206 + init_process(); 1207 + var OAuthUserAgent = class { 1208 + static { 1209 + __name(this, "OAuthUserAgent"); 1210 + } 1211 + session; 1212 + #fetch; 1213 + #getSessionPromise; 1214 + constructor(session) { 1215 + this.session = session; 1216 + this.#fetch = createDPoPFetch(session.dpopKey, false); 1217 + } 1218 + get sub() { 1219 + return this.session.info.sub; 1220 + } 1221 + getSession(options) { 1222 + const promise = getSession(this.session.info.sub, options); 1223 + promise.then((session) => { 1224 + this.session = session; 1225 + }).finally(() => { 1226 + this.#getSessionPromise = void 0; 1227 + }); 1228 + return this.#getSessionPromise = promise; 1229 + } 1230 + async signOut() { 1231 + const sub = this.session.info.sub; 1232 + try { 1233 + const { dpopKey, info, token } = await getSession(sub, { allowStale: true }); 1234 + const server = new OAuthServerAgent(info.server, dpopKey); 1235 + await server.revoke(token.refresh ?? token.access); 1236 + } finally { 1237 + deleteStoredSession(sub); 1238 + } 1239 + } 1240 + async handle(pathname, init) { 1241 + await this.#getSessionPromise; 1242 + const headers = new Headers(init?.headers); 1243 + let session = this.session; 1244 + let url = new URL(pathname, session.info.aud); 1245 + headers.set("authorization", `${session.token.type} ${session.token.access}`); 1246 + let response = await this.#fetch(url.href, { ...init, headers }); 1247 + if (!isInvalidTokenResponse(response)) { 1248 + return response; 1249 + } 1250 + try { 1251 + if (this.#getSessionPromise) { 1252 + session = await this.#getSessionPromise; 1253 + } else { 1254 + session = await this.getSession(); 1255 + } 1256 + } catch { 1257 + return response; 1258 + } 1259 + if (init?.body instanceof ReadableStream) { 1260 + return response; 1261 + } 1262 + url = new URL(pathname, session.info.aud); 1263 + headers.set("authorization", `${session.token.type} ${session.token.access}`); 1264 + return await this.#fetch(url.href, { ...init, headers }); 1265 + } 1266 + }; 1267 + var isInvalidTokenResponse = /* @__PURE__ */ __name((response) => { 1268 + if (response.status !== 401) { 1269 + return false; 1270 + } 1271 + const auth = response.headers.get("www-authenticate"); 1272 + return auth != null && (auth.startsWith("Bearer ") || auth.startsWith("DPoP ")) && auth.includes('error="invalid_token"'); 1273 + }, "isInvalidTokenResponse"); 1274 + 1275 + // oauth-client-metadata.json 1276 + var oauth_client_metadata_default = { 1277 + client_id: "https://elements.diffuse.sh/oauth-client-metadata.json", 1278 + client_name: "Diffuse", 1279 + client_uri: "https://elements.diffuse.sh", 1280 + redirect_uris: ["https://elements.diffuse.sh/oauth/callback"], 1281 + scope: "atproto repo?collection=sh.diffuse.output.facet&collection=sh.diffuse.output.playlistItem&collection=sh.diffuse.output.theme&collection=sh.diffuse.output.track&collection=sh.diffuse.output.trackBundle", 1282 + grant_types: ["authorization_code", "refresh_token"], 1283 + response_types: ["code"], 1284 + token_endpoint_auth_method: "none", 1285 + application_type: "web", 1286 + dpop_bound_access_tokens: true 1287 + }; 1288 + 1289 + // components/output/raw/atproto/oauth.js 1290 + var STORAGE_KEY = "diffuse/output/raw/atproto/did"; 1291 + var SCOPE = oauth_client_metadata_default.scope; 1292 + var location = globalThis.location; 1293 + var redirect_uri = (location.origin + location.pathname + location.search).replace( 1294 + "://localhost", 1295 + "://127.0.0.1" 1296 + ); 1297 + var isLocalDev = redirect_uri.startsWith("http://127.0.0.1"); 1298 + if (!isLocalDev) { 1299 + redirect_uri = location.origin + "/oauth/callback"; 1300 + } 1301 + var client_id = isLocalDev ? `http://localhost/?redirect_uri=${encodeURIComponent(redirect_uri)}&scope=${encodeURIComponent(SCOPE)}` : ( 1302 + /** @type {any} */ 1303 + import.meta.env?.ATPROTO_CLIENT_ID ?? "https://elements.diffuse.sh/oauth-client-metadata.json" 1304 + ); 1305 + configureOAuth({ 1306 + metadata: { 1307 + client_id, 1308 + redirect_uri 1309 + }, 1310 + identityResolver: new LocalActorResolver({ 1311 + handleResolver: new XrpcHandleResolver({ 1312 + serviceUrl: "https://public.api.bsky.app" 1313 + }), 1314 + didDocumentResolver: new CompositeDidDocumentResolver({ 1315 + methods: { 1316 + plc: new PlcDidDocumentResolver(), 1317 + web: new WebDidDocumentResolver() 1318 + } 1319 + }) 1320 + }) 1321 + }); 1322 + async function login(handle) { 1323 + const location2 = globalThis.location; 1324 + if (location2.origin.startsWith("http://localhost")) { 1325 + location2.assign( 1326 + location2.href.replace("http://localhost:", "http://127.0.0.1:") 1327 + ); 1328 + } 1329 + sessionStorage.setItem( 1330 + "diffuse/output/raw/atproto/oauth/redirect_path", 1331 + location2.pathname + location2.search 1332 + ); 1333 + const authUrl = await createAuthorizationUrl({ 1334 + target: { type: "account", identifier: ( 1335 + /** @type {any} */ 1336 + handle 1337 + ) }, 1338 + scope: SCOPE 1339 + }); 1340 + location2.assign(authUrl.toString()); 1341 + } 1342 + __name(login, "login"); 1343 + async function restoreOrFinalize() { 1344 + const location2 = globalThis.location; 1345 + const params = new URLSearchParams(location2.hash.slice(1)); 1346 + if (params.has("code")) { 1347 + const result = await finalizeAuthorization(params); 1348 + history.replaceState( 1349 + null, 1350 + "", 1351 + location2.pathname + location2.search 1352 + ); 1353 + localStorage.setItem(STORAGE_KEY, result.session.info.sub); 1354 + return result.session; 1355 + } 1356 + const did = localStorage.getItem(STORAGE_KEY); 1357 + if (did) { 1358 + try { 1359 + return await getSession( 1360 + /** @type {`did:${string}:${string}`} */ 1361 + did 1362 + ); 1363 + } catch (err) { 1364 + console.warn(err); 1365 + clearStoredSession(); 1366 + return null; 1367 + } 1368 + } 1369 + return null; 1370 + } 1371 + __name(restoreOrFinalize, "restoreOrFinalize"); 1372 + function clearStoredSession() { 1373 + const did = localStorage.getItem(STORAGE_KEY); 1374 + if (did) { 1375 + deleteStoredSession( 1376 + /** @type {`did:${string}:${string}`} */ 1377 + did 1378 + ); 1379 + } 1380 + localStorage.removeItem(STORAGE_KEY); 1381 + } 1382 + __name(clearStoredSession, "clearStoredSession"); 1383 + async function logout(agent) { 1384 + const did = localStorage.getItem(STORAGE_KEY); 1385 + try { 1386 + await agent.signOut(); 1387 + } catch { 1388 + if (did) { 1389 + deleteStoredSession( 1390 + /** @type {`did:${string}:${string}`} */ 1391 + did 1392 + ); 1393 + } 1394 + } 1395 + localStorage.removeItem(STORAGE_KEY); 1396 + } 1397 + __name(logout, "logout"); 1398 + 1399 + export { 1400 + TokenRefreshError, 1401 + OAuthUserAgent, 1402 + login, 1403 + restoreOrFinalize, 1404 + clearStoredSession, 1405 + logout 1406 + }; 1407 + 1408 + //# sourceMappingURL=./chunk-NSJY6VZI.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-NSJY6VZI.js.map
··· 1 + {"version":3,"sources":["/components/output/raw/atproto/oauth.js","/node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/index.ts","/node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/environment.ts","/node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/store/db.ts","/node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/utils/runtime.ts","/node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/errors.ts","/node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/agents/exchange.ts","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/index.ts","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/client-assertion/index.ts","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/client-assertion/create-client-assertion.ts","/node_modules/.deno/nanoid@5.1.6/node_modules/nanoid/index.js","/node_modules/.deno/nanoid@5.1.6/node_modules/nanoid/url-alphabet/index.js","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/internal/key-cache.ts","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/internal/jwk.ts","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/internal/crypto.ts","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/jwt/index.ts","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/client-assertion/generate-key.ts","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/client-assertion/keys.ts","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/dpop/index.ts","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/dpop/fetch.ts","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/hash/sha256.ts","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/dpop/proof.ts","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/dpop/generate-key.ts","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/dpop/verify.ts","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/jwk/compute-jkt.ts","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/hash/index.ts","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/hash/pkce.ts","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/jwk/index.ts","/node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/lib/jwk/keys.ts","/node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/resolvers.ts","/node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/utils/response.ts","/node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/utils/strings.ts","/node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/agents/server-agent.ts","/node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/dpop.ts","/node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/utils/misc.ts","/node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/agents/sessions.ts","/node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/utils/dpop-key.ts","/node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/lib/agents/user-agent.ts","/oauth-client-metadata.json"],"sourcesContent":["import { configureOAuth } from \"@atcute/oauth-browser-client\";\n\nimport metadata from \"../../../../oauth-client-metadata.json\" with {\n type: \"json\",\n};\n\nimport {\n CompositeDidDocumentResolver,\n LocalActorResolver,\n PlcDidDocumentResolver,\n WebDidDocumentResolver,\n XrpcHandleResolver,\n} from \"@atcute/identity-resolver\";\n\nimport {\n createAuthorizationUrl,\n deleteStoredSession,\n finalizeAuthorization,\n getSession,\n OAuthUserAgent,\n TokenRefreshError,\n} from \"@atcute/oauth-browser-client\";\n\nexport { OAuthUserAgent, TokenRefreshError };\n\n/**\n * @import {Session} from \"@atcute/oauth-browser-client\"\n */\n\nconst STORAGE_KEY = \"diffuse/output/raw/atproto/did\";\nconst SCOPE = metadata.scope;\n\n// CONFIGURE\n// =========\n\nconst location = globalThis.location;\n\nlet redirect_uri = (location.origin + location.pathname + location.search)\n .replace(\n \"://localhost\",\n \"://127.0.0.1\",\n );\n\nconst isLocalDev = redirect_uri.startsWith(\"http://127.0.0.1\");\n\nif (!isLocalDev) {\n redirect_uri = location.origin + \"/oauth/callback\";\n}\n\nconst client_id = isLocalDev\n ? `http://localhost/?redirect_uri=${encodeURIComponent(redirect_uri)}&scope=${\n encodeURIComponent(SCOPE)\n }`\n : /** @type {any} */ (import.meta).env?.ATPROTO_CLIENT_ID ??\n \"https://elements.diffuse.sh/oauth-client-metadata.json\";\n\nconfigureOAuth({\n metadata: {\n client_id,\n redirect_uri,\n },\n identityResolver: new LocalActorResolver({\n handleResolver: new XrpcHandleResolver({\n serviceUrl: \"https://public.api.bsky.app\",\n }),\n didDocumentResolver: new CompositeDidDocumentResolver({\n methods: {\n plc: new PlcDidDocumentResolver(),\n web: new WebDidDocumentResolver(),\n },\n }),\n }),\n});\n\n// LOGIN\n// =====\n\n/**\n * Initiate the OAuth authorization flow for a given handle.\n * Navigates the browser away to the authorization server.\n *\n * @param {string} handle\n */\nexport async function login(handle) {\n const location = globalThis.location;\n\n if (location.origin.startsWith(\"http://localhost\")) {\n location.assign(\n location.href.replace(\"http://localhost:\", \"http://127.0.0.1:\"),\n );\n }\n\n sessionStorage.setItem(\n \"diffuse/output/raw/atproto/oauth/redirect_path\",\n location.pathname + location.search,\n );\n\n const authUrl = await createAuthorizationUrl({\n target: { type: \"account\", identifier: /** @type {any} */ (handle) },\n scope: SCOPE,\n });\n\n location.assign(authUrl.toString());\n}\n\n// SESSION RESTORE / CALLBACK\n// ==========================\n\n/**\n * Attempt to restore an existing session or finalize an OAuth callback.\n * Returns the session if successful, or null if no session is available.\n *\n * @returns {Promise<Session | null>}\n */\nexport async function restoreOrFinalize() {\n const location = globalThis.location;\n\n // Check for OAuth callback parameters (the library uses response_mode=fragment,\n // so params arrive in the URL hash, not the query string)\n const params = new URLSearchParams(location.hash.slice(1));\n\n if (params.has(\"code\")) {\n const result = await finalizeAuthorization(params);\n\n // Clean up URL (remove fragment containing OAuth params)\n history.replaceState(\n null,\n \"\",\n location.pathname + location.search,\n );\n\n // Persist the DID for future session restoration\n localStorage.setItem(STORAGE_KEY, result.session.info.sub);\n\n return result.session;\n }\n\n // Try to restore a previously stored session\n const did = localStorage.getItem(STORAGE_KEY);\n\n if (did) {\n try {\n return await getSession(\n /** @type {`did:${string}:${string}`} */ (did),\n );\n } catch (err) {\n console.warn(err);\n clearStoredSession();\n return null;\n }\n }\n\n return null;\n}\n\n// CLEAR SESSION\n// =============\n\n/**\n * Remove stored session data without contacting the server.\n * Used when the session has already been revoked.\n */\nexport function clearStoredSession() {\n const did = localStorage.getItem(STORAGE_KEY);\n\n if (did) {\n deleteStoredSession(/** @type {`did:${string}:${string}`} */ (did));\n }\n\n localStorage.removeItem(STORAGE_KEY);\n}\n\n// LOGOUT\n// ======\n\n/**\n * Sign out and revoke the current session.\n *\n * @param {OAuthUserAgent} agent\n */\nexport async function logout(agent) {\n const did = localStorage.getItem(STORAGE_KEY);\n\n try {\n await agent.signOut();\n } catch {\n if (did) {\n deleteStoredSession(\n /** @type {`did:${string}:${string}`} */ (did),\n );\n }\n }\n\n localStorage.removeItem(STORAGE_KEY);\n}\n","export { configureOAuth, type ConfigureOAuthOptions } from './environment.js';\n\nexport * from './errors.js';\n\nexport * from './agents/exchange.js';\nexport {\n\tgetSession,\n\tdeleteStoredSession,\n\tlistStoredSessions,\n\ttype SessionGetOptions,\n} from './agents/sessions.js';\nexport * from './agents/user-agent.js';\n\nexport type {\n\tClientAssertionCredentials,\n\tClientAssertionFetcher,\n\tFetchClientAssertionParams,\n} from './types/client-assertion.js';\nexport type { TokenInfo, ExchangeInfo, Session } from './types/token.js';\n","import type { ActorResolver } from '@atcute/identity-resolver';\n\nimport { createOAuthDatabase, type OAuthDatabase } from './store/db.js';\nimport type { ClientAssertionFetcher } from './types/client-assertion.js';\n\nexport let CLIENT_ID: string;\nexport let REDIRECT_URI: string;\n\nexport let fetchClientAssertion: ClientAssertionFetcher | undefined;\n\nexport let database: OAuthDatabase;\n\nexport let identityResolver: ActorResolver;\n\nexport interface ConfigureOAuthOptions {\n\t/**\n\t * client metadata, necessary to drive the whole request\n\t */\n\tmetadata: {\n\t\tclient_id: string;\n\t\tredirect_uri: string;\n\t};\n\n\t/** resolves actor identifiers into identity metadata */\n\tidentityResolver: ActorResolver;\n\n\t/**\n\t * optional function to fetch DPoP-bound client assertions from your backend.\n\t */\n\tfetchClientAssertion?: ClientAssertionFetcher;\n\n\t/**\n\t * name that will be used as prefix for storage keys needed to persist authentication.\n\t * @default \"atcute-oauth\"\n\t */\n\tstorageName?: string;\n}\n\nexport const configureOAuth = (options: ConfigureOAuthOptions) => {\n\t({ identityResolver, fetchClientAssertion } = options);\n\t({ client_id: CLIENT_ID, redirect_uri: REDIRECT_URI } = options.metadata);\n\n\tdatabase = createOAuthDatabase({ name: options.storageName ?? 'atcute-oauth' });\n};\n","import type { Did } from '@atcute/lexicons';\nimport type { DpopPrivateJwk } from '@atcute/oauth-crypto';\nimport type { OAuthAuthorizationServerMetadata } from '@atcute/oauth-types';\n\nimport type { SimpleStore } from '../types/store.js';\nimport type { RawSession } from '../types/token.js';\nimport { locks } from '../utils/runtime.js';\n\nexport interface OAuthDatabaseOptions {\n\tname: string;\n}\n\ninterface SchemaItem<T> {\n\tvalue: T;\n\texpiresAt: number | null;\n\tupdatedAt?: number;\n}\n\ninterface Schema {\n\tsessions: {\n\t\tkey: Did;\n\t\tvalue: RawSession;\n\t\tindexes: {\n\t\t\texpiresAt: number;\n\t\t};\n\t};\n\tstates: {\n\t\tkey: string;\n\t\tvalue: {\n\t\t\tdpopKey: DpopPrivateJwk;\n\t\t\tmetadata: OAuthAuthorizationServerMetadata;\n\t\t\tverifier?: string;\n\t\t\tstate?: unknown;\n\t\t};\n\t};\n\n\tdpopNonces: {\n\t\tkey: string;\n\t\tvalue: string;\n\t};\n}\n\nconst parse = (raw: string | null) => {\n\tif (raw != null) {\n\t\tconst parsed = JSON.parse(raw);\n\t\tif (parsed != null) {\n\t\t\treturn parsed;\n\t\t}\n\t}\n\n\treturn {};\n};\n\nexport type OAuthDatabase = ReturnType<typeof createOAuthDatabase>;\n\nexport const createOAuthDatabase = ({ name }: OAuthDatabaseOptions) => {\n\tconst controller = new AbortController();\n\tconst signal = controller.signal;\n\n\tconst createStore = <N extends keyof Schema>(\n\t\tsubname: N,\n\t\texpiresAt: (item: Schema[N]['value']) => null | number,\n\t\tpersistUpdatedAt = false,\n\t): SimpleStore<Schema[N]['key'], Schema[N]['value']> => {\n\t\tlet store: any;\n\n\t\tconst storageKey = `${name}:${subname}`;\n\n\t\tconst persist = () => store && localStorage.setItem(storageKey, JSON.stringify(store));\n\t\tconst read = () => {\n\t\t\tif (signal.aborted) {\n\t\t\t\tthrow new Error(`store closed`);\n\t\t\t}\n\n\t\t\treturn (store ??= parse(localStorage.getItem(storageKey)));\n\t\t};\n\n\t\t{\n\t\t\tconst listener = (ev: StorageEvent) => {\n\t\t\t\tif (ev.key === storageKey) {\n\t\t\t\t\tstore = undefined;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tglobalThis.addEventListener('storage', listener, { signal });\n\t\t}\n\n\t\t{\n\t\t\tconst cleanup = async (lock: Lock | true | null) => {\n\t\t\t\tif (!lock || signal.aborted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 10_000));\n\t\t\t\tif (signal.aborted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet now = Date.now();\n\t\t\t\tlet changed = false;\n\n\t\t\t\tread();\n\n\t\t\t\tfor (const key in store) {\n\t\t\t\t\tconst item = store[key];\n\t\t\t\t\tconst expiresAt = item.expiresAt;\n\n\t\t\t\t\tif (expiresAt !== null && now > expiresAt) {\n\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\tdelete store[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (changed) {\n\t\t\t\t\tpersist();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (locks) {\n\t\t\t\tlocks.request(`${storageKey}:cleanup`, { ifAvailable: true }, cleanup);\n\t\t\t} else {\n\t\t\t\tcleanup(true);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tget(key) {\n\t\t\t\tread();\n\n\t\t\t\tconst item: SchemaItem<Schema[N]['value']> = store[key];\n\t\t\t\tif (!item) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst expiresAt = item.expiresAt;\n\t\t\t\tif (expiresAt !== null && Date.now() > expiresAt) {\n\t\t\t\t\tdelete store[key];\n\t\t\t\t\tpersist();\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\treturn item.value;\n\t\t\t},\n\t\t\tgetWithLapsed(key) {\n\t\t\t\tread();\n\n\t\t\t\tconst item: SchemaItem<Schema[N]['value']> = store[key];\n\t\t\t\tconst now = Date.now();\n\t\t\t\tif (!item) {\n\t\t\t\t\treturn [undefined, Infinity];\n\t\t\t\t}\n\n\t\t\t\tconst updatedAt = item.updatedAt;\n\t\t\t\tif (updatedAt === undefined) {\n\t\t\t\t\treturn [item.value, Infinity];\n\t\t\t\t}\n\n\t\t\t\treturn [item.value, now - updatedAt];\n\t\t\t},\n\t\t\tset(key, value) {\n\t\t\t\tread();\n\n\t\t\t\tconst item: SchemaItem<Schema[N]['value']> = {\n\t\t\t\t\tvalue: value,\n\t\t\t\t\texpiresAt: expiresAt(value),\n\t\t\t\t\tupdatedAt: persistUpdatedAt ? Date.now() : undefined,\n\t\t\t\t};\n\n\t\t\t\tstore[key] = item;\n\t\t\t\tpersist();\n\t\t\t},\n\t\t\tdelete(key) {\n\t\t\t\tread();\n\n\t\t\t\tif (store[key] !== undefined) {\n\t\t\t\t\tdelete store[key];\n\t\t\t\t\tpersist();\n\t\t\t\t}\n\t\t\t},\n\t\t\tkeys() {\n\t\t\t\tread();\n\n\t\t\t\treturn Object.keys(store);\n\t\t\t},\n\t\t};\n\t};\n\n\treturn {\n\t\tdispose: () => {\n\t\t\tcontroller.abort();\n\t\t},\n\n\t\tsessions: createStore('sessions', ({ token }) => {\n\t\t\tif (token.refresh) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn token.expires_at ?? null;\n\t\t}),\n\t\tstates: createStore('states', (_item) => Date.now() + 10 * 60 * 1_000), // 10 minutes\n\n\t\t// The reference PDS have nonces that expire after 3 minutes, while other\n\t\t// implementations can have varying expiration times.\n\t\t// Stored for 24 hours.\n\t\tdpopNonces: createStore('dpopNonces', (_item) => Date.now() + 24 * 60 * 60 * 1_000, true),\n\t\tinflightDpop: new Map<string, PromiseWithResolvers<void>>(),\n\t};\n};\n","export const locks: LockManager | undefined = typeof navigator !== 'undefined' ? navigator.locks : undefined;\n","import type { Did } from '@atcute/lexicons';\n\nexport class LoginError extends Error {\n\toverride name = 'LoginError';\n}\n\nexport class AuthorizationError extends Error {\n\toverride name = 'AuthorizationError';\n}\n\nexport class ResolverError extends Error {\n\toverride name = 'ResolverError';\n}\n\nexport class TokenRefreshError extends Error {\n\toverride name = 'TokenRefreshError';\n\n\tconstructor(\n\t\tpublic readonly sub: Did,\n\t\tmessage: string,\n\t\toptions?: ErrorOptions,\n\t) {\n\t\tsuper(message, options);\n\t}\n}\n\nexport class OAuthResponseError extends Error {\n\toverride name = 'OAuthResponseError';\n\n\treadonly error: string | undefined;\n\treadonly description: string | undefined;\n\n\tconstructor(\n\t\tpublic readonly response: Response,\n\t\tpublic readonly data: any,\n\t) {\n\t\tconst error = ifString(ifObject(data)?.['error']);\n\t\tconst errorDescription = ifString(ifObject(data)?.['error_description']);\n\n\t\tconst messageError = error ? `\"${error}\"` : 'unknown';\n\t\tconst messageDesc = errorDescription ? `: ${errorDescription}` : '';\n\t\tconst message = `OAuth ${messageError} error${messageDesc}`;\n\n\t\tsuper(message);\n\n\t\tthis.error = error;\n\t\tthis.description = errorDescription;\n\t}\n\n\tget status() {\n\t\treturn this.response.status;\n\t}\n\n\tget headers() {\n\t\treturn this.response.headers;\n\t}\n}\n\nexport class FetchResponseError extends Error {\n\toverride name = 'FetchResponseError';\n\n\tconstructor(\n\t\tpublic readonly response: Response,\n\t\tpublic status: number,\n\t\tmessage: string,\n\t) {\n\t\tsuper(message);\n\t}\n}\n\nconst ifString = (v: unknown): string | undefined => {\n\treturn typeof v === 'string' ? v : undefined;\n};\nconst ifObject = (v: unknown): Record<string, unknown> | undefined => {\n\treturn typeof v === 'object' && v !== null && !Array.isArray(v) ? (v as any) : undefined;\n};\n","import type { ResolvedActor } from '@atcute/identity-resolver';\nimport type { ActorIdentifier } from '@atcute/lexicons';\nimport { generateDpopKey, generatePkce } from '@atcute/oauth-crypto';\nimport type { OAuthAuthorizationServerMetadata, OAuthPrompt } from '@atcute/oauth-types';\n\nimport { nanoid } from 'nanoid';\n\nimport { CLIENT_ID, database, REDIRECT_URI } from '../environment.js';\nimport { AuthorizationError, LoginError } from '../errors.js';\nimport { resolveFromIdentifier, resolveFromService } from '../resolvers.js';\nimport type { Session } from '../types/token.js';\n\nimport { OAuthServerAgent } from './server-agent.js';\nimport { storeSession } from './sessions.js';\n\nexport type AuthorizeTargetOptions =\n\t| { type: 'account'; identifier: ActorIdentifier }\n\t| { type: 'pds'; serviceUrl: string };\n\nexport interface AuthorizeOptions {\n\ttarget: AuthorizeTargetOptions;\n\tscope: string;\n\tstate?: unknown;\n\tprompt?: OAuthPrompt | (string & {});\n\tdisplay?: 'page' | 'popup' | 'touch' | 'wap';\n\tlocale?: string;\n}\n\n/**\n * Create authentication URL for authorization\n * @param options\n * @returns URL to redirect the user for authorization\n */\nexport const createAuthorizationUrl = async (options: AuthorizeOptions): Promise<URL> => {\n\tconst { target, scope, state = null, ...reqs } = options;\n\n\tlet resolved: { identity?: ResolvedActor; metadata: OAuthAuthorizationServerMetadata };\n\tswitch (target.type) {\n\t\tcase 'account': {\n\t\t\tresolved = await resolveFromIdentifier(target.identifier);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'pds': {\n\t\t\tresolved = await resolveFromService(target.serviceUrl);\n\t\t}\n\t}\n\n\tconst { identity, metadata } = resolved;\n\tconst loginHint = identity\n\t\t? identity.handle !== 'handle.invalid'\n\t\t\t? identity.handle\n\t\t\t: identity.did\n\t\t: undefined;\n\n\tconst sid = nanoid(24);\n\n\tconst pkce = await generatePkce();\n\tconst dpopKey = await generateDpopKey(['ES256']);\n\n\tconst params = {\n\t\tdisplay: reqs.display,\n\t\tui_locales: reqs.locale,\n\t\tprompt: reqs.prompt,\n\n\t\tredirect_uri: REDIRECT_URI,\n\t\tcode_challenge: pkce.challenge,\n\t\tcode_challenge_method: pkce.method,\n\t\tstate: sid,\n\t\tlogin_hint: loginHint,\n\t\tresponse_mode: 'fragment',\n\t\tresponse_type: 'code',\n\t\tscope: scope,\n\t} satisfies Record<string, string | undefined>;\n\n\tdatabase.states.set(sid, {\n\t\tdpopKey: dpopKey,\n\t\tmetadata: metadata,\n\t\tverifier: pkce.verifier,\n\t\tstate: state,\n\t});\n\n\tconst server = new OAuthServerAgent(metadata, dpopKey);\n\tconst response = await server.request('pushed_authorization_request', params);\n\n\tconst authUrl = new URL(metadata.authorization_endpoint);\n\tauthUrl.searchParams.set('client_id', CLIENT_ID);\n\tauthUrl.searchParams.set('request_uri', response.request_uri);\n\n\treturn authUrl;\n};\n\n/**\n * Finalize authorization\n * @param params Search params\n * @returns Session object, which you can use to instantiate user agents\n */\nexport const finalizeAuthorization = async (params: URLSearchParams) => {\n\tconst issuer = params.get('iss');\n\tconst sid = params.get('state');\n\tconst code = params.get('code');\n\tconst error = params.get('error');\n\n\tif (!sid || !(code || error)) {\n\t\tthrow new LoginError(`missing parameters`);\n\t}\n\n\tconst stored = database.states.get(sid);\n\tif (stored) {\n\t\t// Delete now that we've caught it\n\t\tdatabase.states.delete(sid);\n\t} else {\n\t\tthrow new LoginError(`unknown state provided`);\n\t}\n\n\tif (error) {\n\t\tthrow new AuthorizationError(params.get('error_description') || error);\n\t}\n\tif (!code) {\n\t\tthrow new LoginError(`missing code parameter`);\n\t}\n\n\tconst dpopKey = stored.dpopKey;\n\tconst metadata = stored.metadata;\n\tconst state = stored.state ?? null;\n\n\tif (issuer === null) {\n\t\tthrow new LoginError(`missing issuer parameter`);\n\t} else if (issuer !== metadata.issuer) {\n\t\tthrow new LoginError(`issuer mismatch`);\n\t}\n\n\t// Retrieve authentication tokens\n\tconst server = new OAuthServerAgent(metadata, dpopKey);\n\tconst { info, token } = await server.exchangeCode(code, stored.verifier);\n\n\t// We're finished!\n\tconst sub = info.sub;\n\tconst session: Session = { dpopKey, info, token };\n\n\tawait storeSession(sub, session);\n\n\treturn { session, state };\n};\n","export * from './client-assertion/index.js';\nexport * from './dpop/index.js';\nexport * from './hash/index.js';\nexport * from './jwk/index.js';\nexport * from './jwt/index.js';\n","export { createClientAssertion } from './create-client-assertion.js';\nexport { generateClientAssertionKey } from './generate-key.js';\nexport { importClientAssertionPkcs8 } from './keys.js';\nexport type { ClientAssertionPrivateJwk } from './types.js';\n","import { nanoid } from 'nanoid';\n\nimport { getCachedKeyMaterial } from '../internal/key-cache.js';\nimport { signJwt } from '../jwt/index.js';\n\nimport type { ClientAssertionPrivateJwk } from './types.js';\n\nexport interface CreateClientAssertionOptions {\n\t/** client id */\n\tclient_id: string;\n\t/** authorization server issuer */\n\taud: string;\n\t/** JWK thumbprint of the DPoP key to bind to (for CAB pattern) */\n\tjkt?: string;\n\t/** client assertion signing key */\n\tkey: ClientAssertionPrivateJwk;\n}\n\n/**\n * creates a DPoP-bound client assertion per RFC 7523.\n *\n * @param options creation options\n * @returns signed client assertion JWT\n */\nexport const createClientAssertion = async (options: CreateClientAssertionOptions): Promise<string> => {\n\tconst { client_id, aud, jkt, key } = options;\n\tconst { kid, alg } = key;\n\tconst { cryptoKey } = await getCachedKeyMaterial(key);\n\n\tconst now = Math.floor(Date.now() / 1000);\n\tconst cnf = jkt ? { jkt } : undefined;\n\n\treturn signJwt({\n\t\theader: {\n\t\t\talg,\n\t\t\tkid,\n\t\t},\n\t\tpayload: {\n\t\t\tiss: client_id,\n\t\t\tsub: client_id,\n\t\t\taud: aud,\n\t\t\tjti: nanoid(24),\n\t\t\tiat: now,\n\t\t\texp: now + 60,\n\t\t\tcnf,\n\t\t},\n\t\tkey: cryptoKey,\n\t\talg,\n\t});\n};\n","import { webcrypto as crypto } from 'node:crypto'\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nconst POOL_SIZE_MULTIPLIER = 128\nlet pool, poolOffset\nfunction fillPool(bytes) {\n if (!pool || pool.length < bytes) {\n pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER)\n crypto.getRandomValues(pool)\n poolOffset = 0\n } else if (poolOffset + bytes > pool.length) {\n crypto.getRandomValues(pool)\n poolOffset = 0\n }\n poolOffset += bytes\n}\nexport function random(bytes) {\n fillPool((bytes |= 0))\n return pool.subarray(poolOffset - bytes, poolOffset)\n}\nexport function customRandom(alphabet, defaultSize, getRandom) {\n let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1\n let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n if (!size) return ''\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let i = step\n while (i--) {\n id += alphabet[bytes[i] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport function customAlphabet(alphabet, size = 21) {\n return customRandom(alphabet, size, random)\n}\nexport function nanoid(size = 21) {\n fillPool((size |= 0))\n let id = ''\n for (let i = poolOffset - size; i < poolOffset; i++) {\n id += scopedUrlAlphabet[pool[i] & 63]\n }\n return id\n}\n","export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","import type { PrivateJwk, PublicJwk } from '../jwk/types.js';\n\nimport { derivePublicJwk, importPrivateKeyFromJwk } from './jwk.js';\n\n/**\n * cached key material for a JWK.\n */\nexport interface CachedKeyMaterial {\n\tcryptoKey: CryptoKey;\n\tpublicJwk: PublicJwk;\n}\n\n/**\n * cache for imported keys.\n * uses WeakMap so entries are garbage collected when JWK objects are no longer referenced.\n */\nconst keyCache = new WeakMap<PrivateJwk, CachedKeyMaterial>();\n\n/**\n * retrieves or creates cached key material for a JWK.\n *\n * @param jwk private JWK to get material for\n * @returns cached key material (CryptoKey and derived public JWK)\n */\nexport const getCachedKeyMaterial = async (jwk: PrivateJwk): Promise<CachedKeyMaterial> => {\n\tconst cached = keyCache.get(jwk);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tconst { alg } = jwk;\n\tconst cryptoKey = await importPrivateKeyFromJwk(jwk, alg);\n\tconst publicJwk = derivePublicJwk(jwk, jwk.kid, alg);\n\tconst material: CachedKeyMaterial = { cryptoKey, publicJwk };\n\n\tkeyCache.set(jwk, material);\n\n\treturn material;\n};\n\n/**\n * pre-populates the cache with already-imported key material.\n * useful for PKCS8 imports where we already have the CryptoKey.\n *\n * @param jwk private JWK to cache for\n * @param cryptoKey already-imported CryptoKey\n */\nexport const setCachedKeyMaterial = (jwk: PrivateJwk, cryptoKey: CryptoKey): void => {\n\tconst publicJwk = derivePublicJwk(jwk, jwk.kid, jwk.alg);\n\tkeyCache.set(jwk, { cryptoKey, publicJwk });\n};\n","import { fromBase64Pad, toBase64Pad } from '@atcute/multibase';\n\nimport type { PrivateJwk, PublicJwk, SigningAlgorithm } from '../jwk/types.js';\n\nimport { getImportAlgorithm } from './crypto.js';\n\nconst SIGNING_ALGORITHMS: readonly SigningAlgorithm[] = [\n\t'ES256',\n\t'ES384',\n\t'ES512',\n\t'PS256',\n\t'PS384',\n\t'PS512',\n\t'RS256',\n\t'RS384',\n\t'RS512',\n];\n\nconst CURVE_TO_ALG: Record<string, SigningAlgorithm> = {\n\t'P-256': 'ES256',\n\t'P-384': 'ES384',\n\t'P-521': 'ES512',\n};\n\nexport const isSigningAlgorithm = (alg: string): alg is SigningAlgorithm => {\n\treturn (SIGNING_ALGORITHMS as readonly string[]).includes(alg);\n};\n\nexport const parsePrivateJwkInput = (input: PrivateJwk | string): PrivateJwk => {\n\tif (typeof input === 'string') {\n\t\ttry {\n\t\t\tconst jwk = JSON.parse(input) as PrivateJwk;\n\t\t\treturn jwk;\n\t\t} catch {\n\t\t\tthrow new Error(`invalid JSON string`);\n\t\t}\n\t}\n\n\tif (typeof input === 'object' && input !== null && 'kty' in input) {\n\t\treturn input;\n\t}\n\n\tthrow new Error(`invalid input: expected JWK object or JSON string`);\n};\n\nexport const resolveSigningAlgorithm = (\n\tjwk: PrivateJwk,\n\toverride?: SigningAlgorithm,\n): SigningAlgorithm | undefined => {\n\tif (override) {\n\t\treturn override;\n\t}\n\n\tconst alg = jwk.alg;\n\tif (alg && isSigningAlgorithm(alg)) {\n\t\treturn alg;\n\t}\n\n\tif (jwk.kty === 'EC') {\n\t\tconst inferred = CURVE_TO_ALG[jwk.crv];\n\t\tif (inferred) {\n\t\t\treturn inferred;\n\t\t}\n\t}\n\n\treturn undefined;\n};\n\nexport const derivePublicJwk = (privateJwk: PrivateJwk, kid?: string, alg?: SigningAlgorithm): PublicJwk => {\n\tif (privateJwk.kty === 'EC') {\n\t\tconst { crv, x, y } = privateJwk;\n\t\treturn { kty: 'EC', crv, x, y, kid, alg, use: 'sig' };\n\t}\n\n\tif (privateJwk.kty === 'RSA') {\n\t\tconst { n, e } = privateJwk;\n\t\treturn { kty: 'RSA', n, e, kid, alg, use: 'sig' };\n\t}\n\n\tthrow new Error(`unsupported key type`);\n};\n\nexport const importPrivateKeyFromJwk = async (jwk: PrivateJwk, alg: SigningAlgorithm): Promise<CryptoKey> => {\n\tif (!('d' in jwk) || !jwk.d) {\n\t\tthrow new Error(`expected a private key (missing 'd' parameter)`);\n\t}\n\n\tif (jwk.kty === 'EC' && !alg.startsWith('ES')) {\n\t\tthrow new Error(`algorithm ${alg} does not match ec key`);\n\t}\n\tif (jwk.kty === 'RSA' && alg.startsWith('ES')) {\n\t\tthrow new Error(`algorithm ${alg} does not match rsa key`);\n\t}\n\n\tconst algorithm = getImportAlgorithm(alg, jwk.kty === 'EC' ? jwk.crv : undefined);\n\tconst key = await crypto.subtle.importKey('jwk', jwk, algorithm, true, ['sign']);\n\n\tif (!(key instanceof CryptoKey)) {\n\t\tthrow new Error(`expected asymmetric key, got symmetric`);\n\t}\n\n\treturn key;\n};\n\nexport const exportPrivateJwkFromKey = async (\n\tkey: CryptoKey,\n\talg: SigningAlgorithm,\n\tkid?: string,\n): Promise<PrivateJwk> => {\n\tconst jwk = (await crypto.subtle.exportKey('jwk', key)) as PrivateJwk;\n\tjwk.alg = alg;\n\tif (kid) {\n\t\tjwk.kid = kid;\n\t}\n\treturn jwk;\n};\n\nexport const importPkcs8PrivateKey = async (pem: string, alg: SigningAlgorithm): Promise<CryptoKey> => {\n\tconst bytes = parsePkcs8Pem(pem);\n\tconst algorithm = getImportAlgorithm(alg);\n\n\tconst key = await crypto.subtle.importKey('pkcs8', bytes, algorithm, true, ['sign']);\n\n\tif (!(key instanceof CryptoKey)) {\n\t\tthrow new Error(`expected asymmetric key, got symmetric`);\n\t}\n\n\treturn key;\n};\n\nexport const exportPkcs8PrivateKey = async (key: CryptoKey): Promise<string> => {\n\tconst pkcs8 = await crypto.subtle.exportKey('pkcs8', key);\n\tconst bytes = new Uint8Array(pkcs8);\n\tconst base64 = toBase64Pad(bytes);\n\n\treturn ['-----BEGIN PRIVATE KEY-----', ...chunk64(base64), '-----END PRIVATE KEY-----', ''].join('\\n');\n};\n\nconst parsePkcs8Pem = (pem: string): ArrayBuffer => {\n\tconst match = pem.match(/-----BEGIN PRIVATE KEY-----([\\s\\S]*?)-----END PRIVATE KEY-----/);\n\tif (!match) {\n\t\tthrow new Error(`invalid pkcs8 pem`);\n\t}\n\n\tconst base64 = match[1].replace(/\\s+/g, '');\n\tconst bytes = fromBase64Pad(base64);\n\tconst buffer = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);\n\treturn buffer;\n};\n\nconst chunk64 = (input: string): string[] => {\n\tconst chunks: string[] = [];\n\tfor (let i = 0; i < input.length; i += 64) {\n\t\tchunks.push(input.slice(i, i + 64));\n\t}\n\treturn chunks;\n};\n","import type { SigningAlgorithm } from '../jwk/types.js';\n\nconst HASH_BY_ALG: Record<SigningAlgorithm, 'SHA-256' | 'SHA-384' | 'SHA-512'> = {\n\tES256: 'SHA-256',\n\tES384: 'SHA-384',\n\tES512: 'SHA-512',\n\tPS256: 'SHA-256',\n\tPS384: 'SHA-384',\n\tPS512: 'SHA-512',\n\tRS256: 'SHA-256',\n\tRS384: 'SHA-384',\n\tRS512: 'SHA-512',\n};\n\nconst CURVE_BY_ALG: Record<SigningAlgorithm, 'P-256' | 'P-384' | 'P-521' | null> = {\n\tES256: 'P-256',\n\tES384: 'P-384',\n\tES512: 'P-521',\n\tPS256: null,\n\tPS384: null,\n\tPS512: null,\n\tRS256: null,\n\tRS384: null,\n\tRS512: null,\n};\n\nexport const getHashName = (alg: SigningAlgorithm): 'SHA-256' | 'SHA-384' | 'SHA-512' => {\n\treturn HASH_BY_ALG[alg];\n};\n\nexport const getNamedCurve = (alg: SigningAlgorithm): 'P-256' | 'P-384' | 'P-521' | null => {\n\treturn CURVE_BY_ALG[alg];\n};\n\nexport const getSignAlgorithm = (alg: SigningAlgorithm): AlgorithmIdentifier | EcdsaParams | RsaPssParams => {\n\tif (alg.startsWith('ES')) {\n\t\treturn { name: 'ECDSA', hash: { name: getHashName(alg) } };\n\t}\n\tif (alg.startsWith('PS')) {\n\t\treturn {\n\t\t\tname: 'RSA-PSS',\n\t\t\thash: { name: getHashName(alg) },\n\t\t\tsaltLength: getHashLength(getHashName(alg)),\n\t\t};\n\t}\n\treturn { name: 'RSASSA-PKCS1-v1_5' };\n};\n\nexport const getImportAlgorithm = (\n\talg: SigningAlgorithm,\n\tcurve?: 'P-256' | 'P-384' | 'P-521',\n): EcKeyImportParams | RsaHashedImportParams => {\n\tif (alg.startsWith('ES')) {\n\t\tconst namedCurve = curve ?? getNamedCurve(alg);\n\t\tif (!namedCurve) {\n\t\t\tthrow new Error(`unable to determine curve for ${alg}`);\n\t\t}\n\t\treturn { name: 'ECDSA', namedCurve };\n\t}\n\n\tif (alg.startsWith('PS')) {\n\t\treturn { name: 'RSA-PSS', hash: { name: getHashName(alg) } };\n\t}\n\n\treturn { name: 'RSASSA-PKCS1-v1_5', hash: { name: getHashName(alg) } };\n};\n\nexport const getGenerateAlgorithm = (alg: SigningAlgorithm): EcKeyGenParams | RsaHashedKeyGenParams => {\n\tconst curve = getNamedCurve(alg);\n\tif (curve) {\n\t\treturn { name: 'ECDSA', namedCurve: curve };\n\t}\n\n\tconst hash = { name: getHashName(alg) };\n\treturn {\n\t\tname: alg.startsWith('PS') ? 'RSA-PSS' : 'RSASSA-PKCS1-v1_5',\n\t\thash,\n\t\tmodulusLength: 2048,\n\t\tpublicExponent: new Uint8Array([0x01, 0x00, 0x01]),\n\t};\n};\n\nconst getHashLength = (hash: 'SHA-256' | 'SHA-384' | 'SHA-512'): number => {\n\tswitch (hash) {\n\t\tcase 'SHA-256':\n\t\t\treturn 32;\n\t\tcase 'SHA-384':\n\t\t\treturn 48;\n\t\tcase 'SHA-512':\n\t\t\treturn 64;\n\t}\n};\n","import { fromBase64Url, toBase64Url } from '@atcute/multibase';\nimport { decodeUtf8From, encodeUtf8 } from '@atcute/uint8array';\n\nimport { getSignAlgorithm } from '../internal/crypto.js';\nimport type { SigningAlgorithm } from '../jwk/types.js';\n\n/**\n * signs a jwt using webcrypto.\n *\n * @param params signing parameters\n * @returns signed jwt\n */\nexport const signJwt = async (params: {\n\theader: Record<string, unknown>;\n\tpayload: Record<string, unknown>;\n\tkey: CryptoKey;\n\talg: SigningAlgorithm;\n}): Promise<string> => {\n\tconst { header, payload, key, alg } = params;\n\tconst fullHeader = { ...header, alg };\n\tconst headerSegment = encodeSegment(fullHeader);\n\tconst payloadSegment = encodeSegment(payload);\n\tconst signingInput = `${headerSegment}.${payloadSegment}`;\n\n\tconst signature = await crypto.subtle.sign(\n\t\tgetSignAlgorithm(alg),\n\t\tkey,\n\t\tencodeUtf8(signingInput) as Uint8Array<ArrayBuffer>,\n\t);\n\n\tconst signatureSegment = toBase64Url(new Uint8Array(signature));\n\n\treturn `${signingInput}.${signatureSegment}`;\n};\n\n/**\n * verifies a jwt and returns its payload.\n *\n * @param jwt jwt string\n * @param options verification options\n * @returns decoded payload\n */\nexport const verifyJwt = async (\n\tjwt: string,\n\toptions: { key: CryptoKey; alg: SigningAlgorithm; typ?: string },\n): Promise<Record<string, unknown>> => {\n\tconst { key, alg, typ } = options;\n\tconst parts = jwt.split('.');\n\tif (parts.length !== 3) {\n\t\tthrow new Error(`invalid jwt format`);\n\t}\n\n\tconst header = decodeSegment<Record<string, unknown>>(parts[0]);\n\tif (header.alg !== alg) {\n\t\tthrow new Error(`invalid jwt alg`);\n\t}\n\tif (typ && header.typ !== typ) {\n\t\tthrow new Error(`invalid jwt typ`);\n\t}\n\n\tconst payload = decodeSegment<Record<string, unknown>>(parts[1]);\n\tconst signature = fromBase64Url(parts[2]);\n\tconst signingInput = `${parts[0]}.${parts[1]}`;\n\n\tconst ok = await crypto.subtle.verify(\n\t\tgetSignAlgorithm(alg),\n\t\tkey,\n\t\tsignature,\n\t\tencodeUtf8(signingInput) as Uint8Array<ArrayBuffer>,\n\t);\n\n\tif (!ok) {\n\t\tthrow new Error(`invalid jwt signature`);\n\t}\n\n\treturn payload;\n};\n\nconst encodeSegment = (value: unknown): string => {\n\treturn toBase64Url(encodeUtf8(JSON.stringify(value)));\n};\n\nconst decodeSegment = <T>(value: string): T => {\n\tconst bytes = fromBase64Url(value);\n\treturn JSON.parse(decodeUtf8From(bytes)) as T;\n};\n","import { getGenerateAlgorithm } from '../internal/crypto.js';\nimport { exportPrivateJwkFromKey } from '../internal/jwk.js';\nimport { setCachedKeyMaterial } from '../internal/key-cache.js';\nimport type { SigningAlgorithm } from '../jwk/types.js';\n\nimport type { ClientAssertionPrivateJwk } from './types.js';\n\n/**\n * generates a new client assertion private key.\n *\n * @param kid key id to assign\n * @param alg signing algorithm (defaults to es256)\n * @returns client assertion private JWK (with cache pre-warmed)\n */\nexport const generateClientAssertionKey = async (\n\tkid: string,\n\talg: SigningAlgorithm = 'ES256',\n): Promise<ClientAssertionPrivateJwk> => {\n\tconst pair = await crypto.subtle.generateKey(getGenerateAlgorithm(alg), true, ['sign', 'verify']);\n\tconst jwk = (await exportPrivateJwkFromKey(pair.privateKey, alg, kid)) as ClientAssertionPrivateJwk;\n\n\t// pre-populate cache so we don't re-import\n\tsetCachedKeyMaterial(jwk, pair.privateKey);\n\n\treturn jwk;\n};\n","import { exportPrivateJwkFromKey, importPkcs8PrivateKey } from '../internal/jwk.js';\nimport { setCachedKeyMaterial } from '../internal/key-cache.js';\nimport type { SigningAlgorithm } from '../jwk/types.js';\n\nimport type { ClientAssertionPrivateJwk } from './types.js';\n\n/**\n * imports a client assertion private key from a pkcs8 pem string.\n *\n * @param pem pkcs8 pem string\n * @param options import options (kid + alg)\n * @returns client assertion private JWK (with cache pre-warmed)\n */\nexport const importClientAssertionPkcs8 = async (\n\tpem: string,\n\toptions: { kid: string; alg: SigningAlgorithm },\n): Promise<ClientAssertionPrivateJwk> => {\n\tconst { kid, alg } = options;\n\tconst cryptoKey = await importPkcs8PrivateKey(pem, alg);\n\tconst jwk = (await exportPrivateJwkFromKey(cryptoKey, alg, kid)) as ClientAssertionPrivateJwk;\n\n\t// pre-populate cache so we don't re-import\n\tsetCachedKeyMaterial(jwk, cryptoKey);\n\n\treturn jwk;\n};\n","export { createDpopFetch } from './fetch.js';\nexport { generateDpopKey } from './generate-key.js';\nexport { createDpopProofSigner } from './proof.js';\nexport type { DpopNonceCache, DpopPrivateJwk } from './types.js';\nexport {\n\tDpopVerifyError,\n\tverifyDpopProof,\n\ttype DpopClaims,\n\ttype DpopVerifyOptions,\n\ttype DpopVerifyResult,\n} from './verify.js';\n","import { sha256Base64Url } from '../hash/sha256.js';\n\nimport { createDpopProofSigner } from './proof.js';\nimport type { DpopPrivateJwk, DpopNonceCache } from './types.js';\n\nexport interface CreateDpopFetchOptions {\n\t/** DPoP private key (JWK with `alg` set) */\n\tkey: DpopPrivateJwk;\n\t/** nonce store, keyed by origin */\n\tnonces: DpopNonceCache;\n\t/** server's supported DPoP signing algorithms */\n\tsupportedAlgs?: readonly string[];\n\t/**\n\t * is the target an authorization server (true) or resource server (false)?\n\t * affects how `use_dpop_nonce` errors are detected.\n\t */\n\tisAuthServer?: boolean;\n\t/** custom fetch implementation */\n\tfetch?: typeof globalThis.fetch;\n}\n\n/**\n * creates a fetch wrapper that adds DPoP proofs to requests.\n *\n * @param options DPoP configuration\n * @returns fetch function with DPoP support\n */\nexport const createDpopFetch = (options: CreateDpopFetchOptions): typeof globalThis.fetch => {\n\tconst { key, nonces, supportedAlgs, isAuthServer, fetch = globalThis.fetch } = options;\n\n\tnegotiateAlg(key, supportedAlgs);\n\tconst sign = createDpopProofSigner(key);\n\n\treturn async (input, init) => {\n\t\tconst request: Request = init == null && input instanceof Request ? input : new Request(input, init);\n\n\t\tconst authHeader = request.headers.get('Authorization');\n\t\tconst ath = authHeader?.startsWith('DPoP ') ? await sha256Base64Url(authHeader.slice(5)) : undefined;\n\n\t\tconst { origin } = new URL(request.url);\n\t\tconst htm = request.method;\n\t\tconst htu = buildHtu(request.url);\n\n\t\tlet initNonce: string | undefined;\n\t\ttry {\n\t\t\tinitNonce = await nonces.get(origin);\n\t\t} catch {\n\t\t\t// ignore get errors\n\t\t}\n\n\t\tconst initProof = await sign(htm, htu, initNonce, ath);\n\t\trequest.headers.set('DPoP', initProof);\n\n\t\tconst initResponse = await fetch(request);\n\n\t\tconst nextNonce = initResponse.headers.get('DPoP-Nonce');\n\t\tif (!nextNonce || nextNonce === initNonce) {\n\t\t\treturn initResponse;\n\t\t}\n\n\t\ttry {\n\t\t\tawait nonces.set(origin, nextNonce);\n\t\t} catch {\n\t\t\t// ignore set errors\n\t\t}\n\n\t\tconst shouldRetry = await isUseDpopNonceError(initResponse, isAuthServer);\n\t\tif (!shouldRetry) {\n\t\t\treturn initResponse;\n\t\t}\n\n\t\tif (input === request || init?.body instanceof ReadableStream) {\n\t\t\treturn initResponse;\n\t\t}\n\n\t\tawait initResponse.body?.cancel();\n\n\t\tconst nextProof = await sign(htm, htu, nextNonce, ath);\n\t\tconst nextRequest = new Request(input, init);\n\t\tnextRequest.headers.set('DPoP', nextProof);\n\n\t\tconst retryResponse = await fetch(nextRequest);\n\n\t\tconst retryNonce = retryResponse.headers.get('DPoP-Nonce');\n\t\tif (retryNonce && retryNonce !== nextNonce) {\n\t\t\ttry {\n\t\t\t\tawait nonces.set(origin, retryNonce);\n\t\t\t} catch {\n\t\t\t\t// ignore set errors\n\t\t\t}\n\t\t}\n\n\t\treturn retryResponse;\n\t};\n};\n\nconst buildHtu = (url: string): string => {\n\tconst fragmentIdx = url.indexOf('#');\n\tconst queryIdx = url.indexOf('?');\n\tconst end = fragmentIdx === -1 ? queryIdx : queryIdx === -1 ? fragmentIdx : Math.min(fragmentIdx, queryIdx);\n\n\treturn end === -1 ? url : url.slice(0, end);\n};\n\nconst negotiateAlg = (key: DpopPrivateJwk, supportedAlgs?: readonly string[]): string => {\n\tconst keyAlg = key.alg;\n\n\tif (supportedAlgs?.length) {\n\t\tif (supportedAlgs.includes(keyAlg)) {\n\t\t\treturn keyAlg;\n\t\t}\n\t\tthrow new Error(`DPoP key algorithm ${keyAlg} not supported by server: ${supportedAlgs.join(', ')}`);\n\t}\n\n\treturn keyAlg;\n};\n\nconst isUseDpopNonceError = async (response: Response, isAuthServer?: boolean): Promise<boolean> => {\n\tif (isAuthServer === undefined || isAuthServer === false) {\n\t\tif (response.status === 401) {\n\t\t\tconst wwwAuth = response.headers.get('WWW-Authenticate');\n\t\t\tif (wwwAuth?.startsWith('DPoP')) {\n\t\t\t\treturn wwwAuth.includes('error=\"use_dpop_nonce\"');\n\t\t\t}\n\t\t}\n\t}\n\n\tif (isAuthServer === undefined || isAuthServer === true) {\n\t\tif (response.status === 400) {\n\t\t\ttry {\n\t\t\t\tconst json = await response.clone().json();\n\t\t\t\treturn typeof json === 'object' && json?.error === 'use_dpop_nonce';\n\t\t\t} catch {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n};\n","import { toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8, toSha256 } from '@atcute/uint8array';\n\n/**\n * computes sha-256 hash and returns base64url-encoded result.\n *\n * @param input string to hash\n * @returns base64url-encoded sha-256 hash\n */\nexport const sha256Base64Url = async (input: string): Promise<string> => {\n\tconst bytes = encodeUtf8(input);\n\tconst digest = await toSha256(bytes);\n\treturn toBase64Url(digest);\n};\n","import { nanoid } from 'nanoid';\n\nimport type { CachedKeyMaterial } from '../internal/key-cache.js';\nimport { getCachedKeyMaterial } from '../internal/key-cache.js';\nimport { signJwt } from '../jwt/index.js';\n\nimport type { DpopPrivateJwk } from './types.js';\n\n/**\n * creates a DPoP proof signer.\n *\n * @param jwk DPoP private JWK (with `alg` set)\n * @returns signing function for DPoP proofs\n */\nexport const createDpopProofSigner = (\n\tjwk: DpopPrivateJwk,\n): ((htm: string, htu: string, nonce?: string, ath?: string) => Promise<string>) => {\n\tconst alg = jwk.alg;\n\n\t// lazily resolve key material on first sign\n\tlet materialPromise: Promise<CachedKeyMaterial> | undefined;\n\n\treturn async (htm: string, htu: string, nonce?: string, ath?: string) => {\n\t\tmaterialPromise ||= getCachedKeyMaterial(jwk);\n\t\tconst { cryptoKey, publicJwk } = await materialPromise;\n\n\t\tconst now = Math.floor(Date.now() / 1_000);\n\n\t\treturn signJwt({\n\t\t\theader: {\n\t\t\t\ttyp: 'dpop+jwt',\n\t\t\t\tjwk: publicJwk,\n\t\t\t},\n\t\t\tpayload: {\n\t\t\t\thtm,\n\t\t\t\thtu,\n\t\t\t\tiat: now,\n\t\t\t\tjti: nanoid(24),\n\t\t\t\tnonce,\n\t\t\t\tath,\n\t\t\t},\n\t\t\tkey: cryptoKey,\n\t\t\talg,\n\t\t});\n\t};\n};\n","import { getGenerateAlgorithm } from '../internal/crypto.js';\nimport { exportPrivateJwkFromKey, isSigningAlgorithm } from '../internal/jwk.js';\nimport { setCachedKeyMaterial } from '../internal/key-cache.js';\nimport type { SigningAlgorithm } from '../jwk/types.js';\n\nimport type { DpopPrivateJwk } from './types.js';\n\n/**\n * preferred algorithm order for DPoP key generation.\n */\nconst PREFERRED_ALGORITHMS: readonly SigningAlgorithm[] = [\n\t'ES256',\n\t'ES384',\n\t'ES512',\n\t'PS256',\n\t'PS384',\n\t'PS512',\n\t'RS256',\n\t'RS384',\n\t'RS512',\n];\n\nconst sortAlgorithms = (algs: readonly SigningAlgorithm[]): SigningAlgorithm[] => {\n\treturn [...algs].sort((a, b) => {\n\t\tconst aIdx = PREFERRED_ALGORITHMS.indexOf(a);\n\t\tconst bIdx = PREFERRED_ALGORITHMS.indexOf(b);\n\n\t\tif (aIdx === -1 && bIdx === -1) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (aIdx === -1) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (bIdx === -1) {\n\t\t\treturn -1;\n\t\t}\n\n\t\treturn aIdx - bIdx;\n\t});\n};\n\n/**\n * generates a new DPoP private JWK with `alg` set.\n *\n * @param supportedAlgs server supported algorithms (optional)\n * @returns private JWK (with cache pre-warmed)\n */\nexport const generateDpopKey = async (supportedAlgs?: readonly string[]): Promise<DpopPrivateJwk> => {\n\tconst normalized = supportedAlgs?.filter(isSigningAlgorithm) ?? [];\n\tif (supportedAlgs?.length && normalized.length === 0) {\n\t\tthrow new Error(`no supported algorithms provided`);\n\t}\n\n\tconst algs: SigningAlgorithm[] = normalized.length ? sortAlgorithms(normalized) : ['ES256'];\n\tconst errors: unknown[] = [];\n\n\tfor (const alg of algs) {\n\t\ttry {\n\t\t\tconst pair = await crypto.subtle.generateKey(getGenerateAlgorithm(alg), true, ['sign', 'verify']);\n\t\t\tconst jwk = (await exportPrivateJwkFromKey(pair.privateKey, alg)) as DpopPrivateJwk;\n\n\t\t\t// pre-populate cache so we don't re-import\n\t\t\tsetCachedKeyMaterial(jwk, pair.privateKey);\n\n\t\t\treturn jwk;\n\t\t} catch (err) {\n\t\t\terrors.push(err);\n\t\t}\n\t}\n\n\tthrow new AggregateError(errors, `failed to generate DPoP key for any of: ${algs.join(', ')}`);\n};\n","import { fromBase64Url } from '@atcute/multibase';\nimport { decodeUtf8From } from '@atcute/uint8array';\n\nimport * as v from '@badrap/valita';\n\nimport { getImportAlgorithm } from '../internal/crypto.js';\nimport { computeJktFromJwk } from '../jwk/compute-jkt.js';\nimport type { PublicJwk, SigningAlgorithm } from '../jwk/types.js';\nimport { verifyJwt } from '../jwt/index.js';\n\nimport type { Awaitable } from './types.js';\n\nconst dpopJwkSchema = v.union(\n\tv.object({\n\t\tkty: v.literal('EC'),\n\t\tcrv: v.union(v.literal('P-256'), v.literal('P-384'), v.literal('P-521')),\n\t\tx: v.string(),\n\t\ty: v.string(),\n\t}),\n\tv.object({\n\t\tkty: v.literal('RSA'),\n\t\te: v.string(),\n\t\tn: v.string(),\n\t}),\n);\n\nconst dpopHeaderSchema = v.object({\n\ttyp: v.literal('dpop+jwt'),\n\talg: v.string().assert((alg) => alg !== 'none', 'alg must not be \"none\"'),\n\tjwk: dpopJwkSchema,\n});\n\nconst dpopPayloadSchema = v.object({\n\thtm: v.string(),\n\thtu: v.string(),\n\tiat: v.number(),\n\tjti: v.string(),\n\tnonce: v.string().optional(),\n});\n\nexport type DpopClaims = v.Infer<typeof dpopPayloadSchema>;\ntype DpopJwk = v.Infer<typeof dpopJwkSchema>;\n\nexport interface DpopVerifyResult {\n\tclaims: DpopClaims;\n\tjkt: string;\n\tjwk: PublicJwk;\n}\n\nexport interface DpopVerifyOptions {\n\tmethod: string;\n\turl: string;\n\tnonce?: { check(nonce: string): Awaitable<boolean> };\n\tmaxClockSkew?: number;\n}\n\n/**\n * error thrown when dpop verification fails.\n */\nexport class DpopVerifyError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic code: 'missing' | 'invalid' | 'expired' | 'nonce_required',\n\t) {\n\t\tsuper(message);\n\t\tthis.name = 'DpopVerifyError';\n\t}\n}\n\n/**\n * verifies a dpop proof from a request header.\n *\n * @param dpopHeader dpop header value\n * @param options verification options\n * @returns verification result with claims and jwk thumbprint\n * @throws {DpopVerifyError} if verification fails\n */\nexport const verifyDpopProof = async (\n\tdpopHeader: string | null | undefined,\n\toptions: DpopVerifyOptions,\n): Promise<DpopVerifyResult> => {\n\tif (!dpopHeader) {\n\t\tthrow new DpopVerifyError(`missing dpop header`, 'missing');\n\t}\n\n\tconst { method, url, nonce: dpopNonce, maxClockSkew = 60 } = options;\n\tconst parts = dpopHeader.split('.');\n\tif (parts.length !== 3) {\n\t\tthrow new DpopVerifyError(`invalid dpop proof format`, 'invalid');\n\t}\n\n\tlet header: v.Infer<typeof dpopHeaderSchema>;\n\ttry {\n\t\theader = dpopHeaderSchema.parse(decodeSegment(parts[0]), { mode: 'passthrough' });\n\t} catch {\n\t\tthrow new DpopVerifyError(`invalid dpop header`, 'invalid');\n\t}\n\n\tconst { jwk, alg } = header;\n\tif (!isSigningAlgorithm(alg)) {\n\t\tthrow new DpopVerifyError(`unsupported dpop alg`, 'invalid');\n\t}\n\n\tlet payload: DpopClaims;\n\ttry {\n\t\tconst key = await importPublicKey(jwk, alg);\n\t\tconst raw = await verifyJwt(dpopHeader, { key, alg, typ: 'dpop+jwt' });\n\t\tpayload = dpopPayloadSchema.parse(raw, { mode: 'passthrough' });\n\t} catch (err) {\n\t\tif (err instanceof v.ValitaError) {\n\t\t\tthrow new DpopVerifyError(`invalid dpop payload`, 'invalid');\n\t\t}\n\t\tthrow new DpopVerifyError(`dpop signature verification failed`, 'invalid');\n\t}\n\n\tif (payload.htm !== method) {\n\t\tthrow new DpopVerifyError(`dpop htm mismatch: expected ${method}, got ${payload.htm}`, 'invalid');\n\t}\n\tif (payload.htu !== url) {\n\t\tthrow new DpopVerifyError(`dpop htu mismatch: expected ${url}, got ${payload.htu}`, 'invalid');\n\t}\n\n\tconst now = Math.floor(Date.now() / 1000);\n\tif (payload.iat > now + maxClockSkew) {\n\t\tthrow new DpopVerifyError(`dpop proof issued in the future`, 'invalid');\n\t}\n\tif (payload.iat < now - maxClockSkew) {\n\t\tthrow new DpopVerifyError(`dpop proof expired`, 'expired');\n\t}\n\n\tif (dpopNonce) {\n\t\tif (!payload.nonce || !(await dpopNonce.check(payload.nonce))) {\n\t\t\tthrow new DpopVerifyError(`invalid or missing dpop nonce`, 'nonce_required');\n\t\t}\n\t}\n\n\tconst jkt = await computeJktFromJwk(jwk as PublicJwk);\n\n\treturn { claims: payload, jwk: jwk as DpopJwk, jkt };\n};\n\nconst importPublicKey = async (jwk: PublicJwk, alg: SigningAlgorithm): Promise<CryptoKey> => {\n\tconst algorithm = getImportAlgorithm(alg, jwk.kty === 'EC' ? jwk.crv : undefined);\n\tconst key = await crypto.subtle.importKey('jwk', jwk, algorithm, true, ['verify']);\n\tif (!(key instanceof CryptoKey)) {\n\t\tthrow new Error(`expected asymmetric key, got symmetric`);\n\t}\n\n\treturn key;\n};\n\nconst isSigningAlgorithm = (alg: string): alg is SigningAlgorithm => {\n\treturn (\n\t\talg === 'ES256' ||\n\t\talg === 'ES384' ||\n\t\talg === 'ES512' ||\n\t\talg === 'PS256' ||\n\t\talg === 'PS384' ||\n\t\talg === 'PS512' ||\n\t\talg === 'RS256' ||\n\t\talg === 'RS384' ||\n\t\talg === 'RS512'\n\t);\n};\n\nconst decodeSegment = (segment: string): unknown => {\n\tconst bytes = fromBase64Url(segment);\n\treturn JSON.parse(decodeUtf8From(bytes));\n};\n","import { toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8, toSha256 } from '@atcute/uint8array';\n\nimport type { PublicJwk } from './types.js';\n\n/**\n * computes the jwk thumbprint (rfc 7638) for a public key.\n *\n * @param jwk public jwk\n * @returns base64url-encoded sha-256 thumbprint\n */\nexport const computeJktFromJwk = async (jwk: PublicJwk): Promise<string> => {\n\tlet canonical: Record<string, string>;\n\n\tif (jwk.kty === 'EC') {\n\t\tconst { crv, x, y } = jwk;\n\t\tcanonical = { crv, kty: jwk.kty, x, y };\n\t} else {\n\t\tconst { e, n } = jwk;\n\t\tcanonical = { e, kty: jwk.kty, n };\n\t}\n\n\tconst serialized = JSON.stringify(canonical);\n\tconst hash = await toSha256(encodeUtf8(serialized));\n\n\treturn toBase64Url(hash);\n};\n","export { generatePkce } from './pkce.js';\nexport { sha256Base64Url } from './sha256.js';\n","import { nanoid } from 'nanoid';\n\nimport { sha256Base64Url } from './sha256.js';\n\n/**\n * generates pkce verifier and challenge (s256).\n *\n * @param length verifier length (43-128 per rfc 7636)\n * @returns pkce values\n */\nexport const generatePkce = async (\n\tlength = 64,\n): Promise<{ verifier: string; challenge: string; method: 'S256' }> => {\n\tconst verifier = nanoid(length);\n\tconst challenge = await sha256Base64Url(verifier);\n\n\treturn { verifier, challenge, method: 'S256' };\n};\n","export { computeJktFromJwk } from './compute-jkt.js';\nexport { derivePublicJwk } from '../internal/jwk.js';\nexport { exportPkcs8PrivateKey } from './keys.js';\nexport type {\n\tEcPrivateJwk,\n\tEcPublicJwk,\n\tPrivateJwk,\n\tPublicJwk,\n\tRsaPrivateJwk,\n\tRsaPublicJwk,\n\tSigningAlgorithm,\n} from './types.js';\n","import { exportPkcs8PrivateKey as exportPkcs8 } from '../internal/jwk.js';\nimport { getCachedKeyMaterial } from '../internal/key-cache.js';\n\nimport type { PrivateJwk } from './types.js';\n\n/**\n * exports a private JWK to PKCS8 PEM format.\n *\n * @param jwk private JWK to export\n * @returns PKCS8 PEM string\n */\nexport const exportPkcs8PrivateKey = async (jwk: PrivateJwk): Promise<string> => {\n\tconst { cryptoKey } = await getCachedKeyMaterial(jwk);\n\treturn exportPkcs8(cryptoKey);\n};\n","import type { ResolvedActor } from '@atcute/identity-resolver';\nimport type { ActorIdentifier } from '@atcute/lexicons';\nimport type { OAuthAuthorizationServerMetadata, OAuthProtectedResourceMetadata } from '@atcute/oauth-types';\n\nimport { identityResolver } from './environment.js';\nimport { ResolverError } from './errors.js';\nimport { extractContentType } from './utils/response.js';\nimport { isValidUrl } from './utils/strings.js';\n\nexport const resolveFromIdentifier = async (\n\tident: ActorIdentifier,\n): Promise<{ identity: ResolvedActor; metadata: OAuthAuthorizationServerMetadata }> => {\n\tconst identity = await identityResolver.resolve(ident);\n\n\treturn {\n\t\tidentity: identity,\n\t\tmetadata: await getMetadataFromResourceServer(identity.pds),\n\t};\n};\n\nexport const resolveFromService = async (\n\thost: string,\n): Promise<{ metadata: OAuthAuthorizationServerMetadata }> => {\n\ttry {\n\t\tconst metadata = await getMetadataFromResourceServer(host);\n\t\treturn { metadata };\n\t} catch (err) {\n\t\tif (err instanceof ResolverError) {\n\t\t\ttry {\n\t\t\t\tconst metadata = await getOAuthAuthorizationServerMetadata(host);\n\t\t\t\treturn { metadata };\n\t\t\t} catch {}\n\t\t}\n\n\t\tthrow err;\n\t}\n};\n\nconst getOAuthProtectedResourceMetadata = async (host: string): Promise<OAuthProtectedResourceMetadata> => {\n\tconst url = new URL(`/.well-known/oauth-protected-resource`, host);\n\tconst response = await fetch(url.href, {\n\t\tredirect: 'manual',\n\t\theaders: {\n\t\t\taccept: 'application/json',\n\t\t},\n\t});\n\n\tif (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n\t\tthrow new ResolverError(`unexpected response`);\n\t}\n\n\tconst metadata = (await response.json()) as OAuthProtectedResourceMetadata;\n\tif (metadata.resource !== url.origin) {\n\t\tthrow new ResolverError(`unexpected issuer`);\n\t}\n\n\treturn metadata;\n};\n\nconst getOAuthAuthorizationServerMetadata = async (\n\thost: string,\n): Promise<OAuthAuthorizationServerMetadata> => {\n\tconst url = new URL(`/.well-known/oauth-authorization-server`, host);\n\tconst response = await fetch(url.href, {\n\t\tredirect: 'manual',\n\t\theaders: {\n\t\t\taccept: 'application/json',\n\t\t},\n\t});\n\n\tif (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n\t\tthrow new ResolverError(`unexpected response`);\n\t}\n\n\tconst metadata = (await response.json()) as OAuthAuthorizationServerMetadata;\n\tif (metadata.issuer !== url.origin) {\n\t\tthrow new ResolverError(`unexpected issuer`);\n\t}\n\tif (!isValidUrl(metadata.authorization_endpoint)) {\n\t\tthrow new ResolverError(`authorization server provided incorrect authorization endpoint`);\n\t}\n\tif (!metadata.client_id_metadata_document_supported) {\n\t\tthrow new ResolverError(`authorization server does not support 'client_id_metadata_document'`);\n\t}\n\tif (!metadata.pushed_authorization_request_endpoint) {\n\t\tthrow new ResolverError(`authorization server does not support 'pushed_authorization request'`);\n\t}\n\tif (metadata.response_types_supported) {\n\t\tif (!metadata.response_types_supported.includes('code')) {\n\t\t\tthrow new ResolverError(`authorization server does not support 'code' response type`);\n\t\t}\n\t}\n\n\treturn metadata;\n};\n\nconst getMetadataFromResourceServer = async (input: string) => {\n\tconst rs_metadata = await getOAuthProtectedResourceMetadata(input);\n\n\tif (rs_metadata.authorization_servers?.length !== 1) {\n\t\tthrow new ResolverError(`expected exactly one authorization server in the listing`);\n\t}\n\n\tconst issuer = rs_metadata.authorization_servers[0];\n\n\tconst as_metadata = await getOAuthAuthorizationServerMetadata(issuer);\n\n\tif (as_metadata.protected_resources) {\n\t\tif (!as_metadata.protected_resources.includes(rs_metadata.resource)) {\n\t\t\tthrow new ResolverError(`server is not in authorization server's jurisdiction`);\n\t\t}\n\t}\n\n\treturn as_metadata;\n};\n","export const extractContentType = (headers: Headers): string | undefined => {\n\treturn headers.get('content-type')?.split(';')[0];\n};\n","const isUrlParseSupported = 'parse' in URL;\n\nexport const isValidUrl = (urlString: string): boolean => {\n\tlet url: URL | null = null;\n\tif (isUrlParseSupported) {\n\t\turl = URL.parse(urlString);\n\t} else {\n\t\ttry {\n\t\t\turl = new URL(urlString);\n\t\t} catch {}\n\t}\n\n\tif (url !== null) {\n\t\treturn url.protocol === 'https:' || url.protocol === 'http:';\n\t}\n\n\treturn false;\n};\n","import type { Did } from '@atcute/lexicons';\nimport { createDpopProofSigner, type DpopPrivateJwk } from '@atcute/oauth-crypto';\nimport type { AtprotoOAuthTokenResponse, OAuthParResponse } from '@atcute/oauth-types';\n\nimport { createDPoPFetch } from '../dpop.js';\nimport { CLIENT_ID, fetchClientAssertion, REDIRECT_URI } from '../environment.js';\nimport { FetchResponseError, OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport { resolveFromIdentifier } from '../resolvers.js';\nimport type { PersistedAuthorizationServerMetadata } from '../types/server.js';\nimport type { ExchangeInfo, TokenInfo } from '../types/token.js';\nimport { pick } from '../utils/misc.js';\nimport { extractContentType } from '../utils/response.js';\n\nexport class OAuthServerAgent {\n\t#fetch: typeof fetch;\n\t#metadata: PersistedAuthorizationServerMetadata;\n\t#dpopKey: DpopPrivateJwk;\n\n\tconstructor(metadata: PersistedAuthorizationServerMetadata, dpopKey: DpopPrivateJwk) {\n\t\tthis.#metadata = metadata;\n\t\tthis.#dpopKey = dpopKey;\n\t\tthis.#fetch = createDPoPFetch(dpopKey, true);\n\t}\n\n\tasync request(\n\t\tendpoint: 'pushed_authorization_request',\n\t\tpayload: Record<string, unknown>,\n\t): Promise<OAuthParResponse>;\n\tasync request(endpoint: 'token', payload: Record<string, unknown>): Promise<AtprotoOAuthTokenResponse>;\n\tasync request(endpoint: 'revocation', payload: Record<string, unknown>): Promise<any>;\n\tasync request(endpoint: 'introspection', payload: Record<string, unknown>): Promise<any>;\n\tasync request(endpoint: string, payload: Record<string, unknown>): Promise<any> {\n\t\tconst url: string | undefined = (this.#metadata as any)[`${endpoint}_endpoint`];\n\t\tif (!url) {\n\t\t\tthrow new Error(`no endpoint for ${endpoint}`);\n\t\t}\n\n\t\tif (\n\t\t\t(endpoint === 'token' || endpoint === 'pushed_authorization_request') &&\n\t\t\tfetchClientAssertion !== undefined\n\t\t) {\n\t\t\tconst sign = createDpopProofSigner(this.#dpopKey);\n\n\t\t\tconst assertion = await fetchClientAssertion({\n\t\t\t\taud: this.#metadata.issuer,\n\t\t\t\tcreateDpopProof: async (url, nonce) => {\n\t\t\t\t\treturn await sign('POST', url, nonce, undefined);\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tpayload = { ...payload, ...assertion };\n\t\t}\n\n\t\tconst response = await this.#fetch(url, {\n\t\t\tmethod: 'post',\n\t\t\theaders: { 'content-type': 'application/json' },\n\t\t\tbody: JSON.stringify({ ...payload, client_id: CLIENT_ID }),\n\t\t});\n\n\t\tif (extractContentType(response.headers) !== 'application/json') {\n\t\t\tthrow new FetchResponseError(response, 2, `unexpected content-type`);\n\t\t}\n\n\t\tconst json = await response.json();\n\n\t\tif (response.ok) {\n\t\t\treturn json;\n\t\t} else {\n\t\t\tthrow new OAuthResponseError(response, json);\n\t\t}\n\t}\n\n\tasync revoke(token: string): Promise<void> {\n\t\ttry {\n\t\t\tawait this.request('revocation', { token: token });\n\t\t} catch {}\n\t}\n\n\tasync exchangeCode(code: string, verifier?: string): Promise<{ info: ExchangeInfo; token: TokenInfo }> {\n\t\tconst response = await this.request('token', {\n\t\t\tgrant_type: 'authorization_code',\n\t\t\tredirect_uri: REDIRECT_URI,\n\t\t\tcode: code,\n\t\t\tcode_verifier: verifier,\n\t\t});\n\n\t\ttry {\n\t\t\treturn await this.#processExchangeResponse(response);\n\t\t} catch (err) {\n\t\t\tawait this.revoke(response.access_token);\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync refresh({ sub, token }: { sub: Did; token: TokenInfo }): Promise<TokenInfo> {\n\t\tif (!token.refresh) {\n\t\t\tthrow new TokenRefreshError(sub, 'no refresh token available');\n\t\t}\n\n\t\tconst response = await this.request('token', {\n\t\t\tgrant_type: 'refresh_token',\n\t\t\trefresh_token: token.refresh,\n\t\t});\n\n\t\ttry {\n\t\t\tif (sub !== response.sub) {\n\t\t\t\tthrow new TokenRefreshError(sub, `sub mismatch in token response; got ${response.sub}`);\n\t\t\t}\n\n\t\t\treturn this.#processTokenResponse(response);\n\t\t} catch (err) {\n\t\t\tawait this.revoke(response.access_token);\n\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\t#processTokenResponse(res: AtprotoOAuthTokenResponse): TokenInfo {\n\t\tif (!res.sub) {\n\t\t\tthrow new TypeError(`missing sub field in token response`);\n\t\t}\n\t\tif (!res.scope) {\n\t\t\tthrow new TypeError(`missing scope field in token response`);\n\t\t}\n\t\tif (res.token_type !== 'DPoP') {\n\t\t\tthrow new TypeError(`token response returned a non-dpop token`);\n\t\t}\n\n\t\treturn {\n\t\t\tscope: res.scope,\n\t\t\trefresh: res.refresh_token,\n\t\t\taccess: res.access_token,\n\t\t\ttype: res.token_type,\n\t\t\texpires_at: typeof res.expires_in === 'number' ? Date.now() + res.expires_in * 1_000 : undefined,\n\t\t};\n\t}\n\n\tasync #processExchangeResponse(\n\t\tres: AtprotoOAuthTokenResponse,\n\t): Promise<{ info: ExchangeInfo; token: TokenInfo }> {\n\t\tconst sub = res.sub;\n\t\tif (!sub) {\n\t\t\tthrow new TypeError(`missing sub field in token response`);\n\t\t}\n\n\t\tconst token = this.#processTokenResponse(res);\n\t\tconst resolved = await resolveFromIdentifier(sub as Did);\n\n\t\tif (resolved.metadata.issuer !== this.#metadata.issuer) {\n\t\t\tthrow new TypeError(`issuer mismatch; got ${resolved.metadata.issuer}`);\n\t\t}\n\n\t\treturn {\n\t\t\ttoken: token,\n\t\t\tinfo: {\n\t\t\t\tsub: sub as Did,\n\t\t\t\taud: resolved.identity.pds,\n\t\t\t\tserver: pick(resolved.metadata, [\n\t\t\t\t\t'issuer',\n\t\t\t\t\t'authorization_endpoint',\n\t\t\t\t\t'introspection_endpoint',\n\t\t\t\t\t'pushed_authorization_request_endpoint',\n\t\t\t\t\t'revocation_endpoint',\n\t\t\t\t\t'token_endpoint',\n\t\t\t\t]),\n\t\t\t},\n\t\t};\n\t}\n}\n","import { createDpopProofSigner, sha256Base64Url, type DpopPrivateJwk } from '@atcute/oauth-crypto';\n\nimport { database } from './environment.js';\nimport { extractContentType } from './utils/response.js';\n\nexport const createDPoPFetch = (dpopKey: DpopPrivateJwk, isAuthServer?: boolean): typeof fetch => {\n\tconst nonces = database.dpopNonces;\n\tconst pending = database.inflightDpop;\n\n\tconst sign = createDpopProofSigner(dpopKey);\n\n\treturn async (input, init) => {\n\t\tconst request = new Request(input, init);\n\n\t\tconst authorizationHeader = request.headers.get('authorization');\n\t\tconst ath = authorizationHeader?.startsWith('DPoP ')\n\t\t\t? await sha256Base64Url(authorizationHeader.slice(5))\n\t\t\t: undefined;\n\n\t\tconst { method, url } = request;\n\t\tconst { origin, pathname } = new URL(url);\n\n\t\tconst htu = origin + pathname;\n\n\t\tlet deferred = pending.get(origin);\n\t\tif (deferred) {\n\t\t\tawait deferred.promise;\n\t\t\tdeferred = undefined;\n\t\t}\n\n\t\tlet initNonce: string | undefined;\n\t\tlet expiredOrMissing = false;\n\t\ttry {\n\t\t\tconst [nonce, lapsed] = nonces.getWithLapsed(origin);\n\n\t\t\tinitNonce = nonce;\n\t\t\texpiredOrMissing = lapsed > 3 * 60 * 1_000;\n\t\t} catch {\n\t\t\t// ignore read errors\n\t\t}\n\n\t\tif (expiredOrMissing) {\n\t\t\tpending.set(origin, (deferred = Promise.withResolvers()));\n\t\t}\n\n\t\tlet nextNonce: string | null;\n\t\ttry {\n\t\t\tconst initProof = await sign(method, htu, initNonce, ath);\n\t\t\trequest.headers.set('dpop', initProof);\n\n\t\t\tconst initResponse = await fetch(request);\n\n\t\t\tnextNonce = initResponse.headers.get('dpop-nonce');\n\t\t\tif (nextNonce === null || nextNonce === initNonce) {\n\t\t\t\treturn initResponse;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tnonces.set(origin, nextNonce);\n\t\t\t} catch {\n\t\t\t\t// ignore write errors\n\t\t\t}\n\n\t\t\tconst shouldRetry = await isUseDpopNonceError(initResponse, isAuthServer);\n\t\t\tif (!shouldRetry) {\n\t\t\t\treturn initResponse;\n\t\t\t}\n\n\t\t\tif (input === request || init?.body instanceof ReadableStream) {\n\t\t\t\treturn initResponse;\n\t\t\t}\n\t\t} finally {\n\t\t\tif (deferred) {\n\t\t\t\tpending.delete(origin);\n\t\t\t\tdeferred.resolve();\n\t\t\t}\n\t\t}\n\n\t\t{\n\t\t\tconst nextProof = await sign(method, htu, nextNonce, ath);\n\t\t\tconst nextRequest = new Request(input, init);\n\t\t\tnextRequest.headers.set('dpop', nextProof);\n\n\t\t\tconst retryResponse = await fetch(nextRequest);\n\n\t\t\tconst retryNonce = retryResponse.headers.get('dpop-nonce');\n\t\t\tif (retryNonce !== null && retryNonce !== nextNonce) {\n\t\t\t\ttry {\n\t\t\t\t\tnonces.set(origin, retryNonce);\n\t\t\t\t} catch {\n\t\t\t\t\t// ignore write errors\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn retryResponse;\n\t\t}\n\t};\n};\n\nconst isUseDpopNonceError = async (response: Response, isAuthServer?: boolean): Promise<boolean> => {\n\tif (isAuthServer === undefined || isAuthServer === false) {\n\t\tif (response.status === 401) {\n\t\t\tconst wwwAuth = response.headers.get('www-authenticate');\n\t\t\tif (wwwAuth?.startsWith('DPoP')) {\n\t\t\t\treturn wwwAuth.includes('error=\"use_dpop_nonce\"');\n\t\t\t}\n\t\t}\n\t}\n\n\tif (isAuthServer === undefined || isAuthServer === true) {\n\t\tif (response.status === 400 && extractContentType(response.headers) === 'application/json') {\n\t\t\ttry {\n\t\t\t\tconst json = await response.clone().json();\n\t\t\t\treturn typeof json === 'object' && json?.['error'] === 'use_dpop_nonce';\n\t\t\t} catch {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n};\n","type UnwrapArray<T> = T extends (infer V)[] ? V : never;\n\nexport const pick = <T, K extends (keyof T)[]>(obj: T, keys: K): Pick<T, UnwrapArray<K>> => {\n\tconst cloned = {};\n\n\tfor (let idx = 0, len = keys.length; idx < len; idx++) {\n\t\tconst key = keys[idx];\n\n\t\t// @ts-expect-error\n\t\tcloned[key] = obj[key];\n\t}\n\n\treturn cloned as Pick<T, UnwrapArray<K>>;\n};\n","import type { Did } from '@atcute/lexicons';\n\nimport { database } from '../environment.js';\nimport { OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport type { RawSession, Session } from '../types/token.js';\nimport { isLegacyDpopKey, migrateLegacyDpopKey } from '../utils/dpop-key.js';\nimport { locks } from '../utils/runtime.js';\n\nimport { OAuthServerAgent } from './server-agent.js';\n\nexport interface SessionGetOptions {\n\tsignal?: AbortSignal;\n\tnoCache?: boolean;\n\tallowStale?: boolean;\n}\n\ntype PendingItem<V> = Promise<{ value: V; isFresh: boolean }>;\nconst pending = new Map<Did, Promise<PendingItem<Session>>>();\n\nexport const getSession = async (sub: Did, options?: SessionGetOptions): Promise<Session> => {\n\toptions?.signal?.throwIfAborted();\n\n\tlet allowStored = isTokenUsable;\n\tif (options?.noCache) {\n\t\tallowStored = returnFalse;\n\t} else if (options?.allowStale) {\n\t\tallowStored = returnTrue;\n\t}\n\n\t// As long as concurrent requests are made for the same key, only one\n\t// request will be made to the cache & getter function at a time. This works\n\t// because there is no async operation between the while() loop and the\n\t// pending.set() call. Because of the \"single threaded\" nature of\n\t// JavaScript, the pending item will be set before the next iteration of the\n\t// while loop.\n\tlet previousExecutionFlow: Promise<PendingItem<Session>> | undefined;\n\twhile ((previousExecutionFlow = pending.get(sub))) {\n\t\ttry {\n\t\t\tconst { isFresh, value } = await previousExecutionFlow;\n\n\t\t\tif (isFresh || allowStored(value)) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore errors from previous execution flows (they will have been\n\t\t\t// propagated by that flow).\n\t\t}\n\n\t\toptions?.signal?.throwIfAborted();\n\t}\n\n\tconst run = async (): Promise<PendingItem<Session>> => {\n\t\tconst storedSession = await migrateSessionIfNeeded(sub, database.sessions.get(sub));\n\n\t\tif (storedSession && allowStored(storedSession)) {\n\t\t\t// Use the stored value as return value for the current execution\n\t\t\t// flow. Notify other concurrent execution flows (that should be\n\t\t\t// \"stuck\" in the loop before until this promise resolves) that we got\n\t\t\t// a value, but that it came from the store (isFresh = false).\n\t\t\treturn { isFresh: false, value: storedSession };\n\t\t}\n\n\t\tconst newSession = await refreshToken(sub, storedSession);\n\n\t\tawait storeSession(sub, newSession);\n\t\treturn { isFresh: true, value: newSession };\n\t};\n\n\tlet promise: Promise<PendingItem<Session>>;\n\n\tif (locks) {\n\t\tpromise = locks.request<PendingItem<Session>>(`atcute-oauth:${sub}`, run as any);\n\t} else {\n\t\tpromise = run();\n\t}\n\n\tpromise = promise.finally(() => pending.delete(sub));\n\n\tif (pending.has(sub)) {\n\t\t// This should never happen. Indeed, there must not be any 'await'\n\t\t// statement between this and the loop iteration check meaning that\n\t\t// this.pending.get returned undefined. It is there to catch bugs that\n\t\t// would occur in future changes to the code.\n\t\tthrow new Error('concurrent request for the same key');\n\t}\n\n\tpending.set(sub, promise);\n\n\tconst { value } = await promise;\n\treturn value;\n};\n\nexport const storeSession = async (sub: Did, newSession: Session): Promise<void> => {\n\ttry {\n\t\tdatabase.sessions.set(sub, newSession);\n\t} catch (err) {\n\t\tawait onRefreshError(newSession);\n\t\tthrow err;\n\t}\n};\n\nexport const deleteStoredSession = (sub: Did): void => {\n\tdatabase.sessions.delete(sub);\n};\n\nexport const listStoredSessions = (): Did[] => {\n\treturn database.sessions.keys();\n};\n\nconst returnTrue = () => true;\nconst returnFalse = () => false;\n\nconst refreshToken = async (sub: Did, storedSession: Session | undefined): Promise<Session> => {\n\tif (storedSession === undefined) {\n\t\tthrow new TokenRefreshError(sub, `session deleted by another tab`);\n\t}\n\n\tconst { dpopKey, info, token } = storedSession;\n\tconst server = new OAuthServerAgent(info.server, dpopKey);\n\n\ttry {\n\t\tconst newToken = await server.refresh({ sub: info.sub, token });\n\n\t\treturn { dpopKey, info, token: newToken };\n\t} catch (cause) {\n\t\tif (cause instanceof OAuthResponseError && cause.status === 400 && cause.error === 'invalid_grant') {\n\t\t\tthrow new TokenRefreshError(sub, `session was revoked`, { cause });\n\t\t}\n\n\t\tthrow cause;\n\t}\n};\n\nconst onRefreshError = async ({ dpopKey, info, token }: Session) => {\n\t// If the token data cannot be stored, let's revoke it\n\tconst server = new OAuthServerAgent(info.server, dpopKey);\n\tawait server.revoke(token.refresh ?? token.access);\n};\n\nconst isTokenUsable = ({ token }: Session): boolean => {\n\tconst expires = token.expires_at;\n\treturn expires == null || Date.now() + 60_000 <= expires;\n};\n\nconst migrateSessionIfNeeded = async (\n\tsub: Did,\n\tsession: RawSession | undefined,\n): Promise<Session | undefined> => {\n\tif (!session || !isLegacyDpopKey(session.dpopKey)) {\n\t\treturn session as Session | undefined;\n\t}\n\n\tconst dpopKey = await migrateLegacyDpopKey(session.dpopKey);\n\tconst migrated = { ...session, dpopKey };\n\n\ttry {\n\t\tdatabase.sessions.set(sub, migrated);\n\t} catch {\n\t\t// ignore persistence errors\n\t}\n\n\treturn migrated;\n};\n","import { fromBase64Url } from '@atcute/multibase';\nimport type { DpopPrivateJwk } from '@atcute/oauth-crypto';\n\nexport interface LegacyDpopKey {\n\ttyp: 'ES256';\n\tkey: string;\n\tjwt: string;\n\tjkt?: string;\n}\n\nconst ES256_ALG = { name: 'ECDSA', namedCurve: 'P-256' } as const;\n\nexport const isLegacyDpopKey = (key: DpopPrivateJwk | LegacyDpopKey): key is LegacyDpopKey => {\n\treturn typeof (key as LegacyDpopKey).key === 'string' && typeof (key as LegacyDpopKey).jwt === 'string';\n};\n\nexport const migrateLegacyDpopKey = async (key: LegacyDpopKey): Promise<DpopPrivateJwk> => {\n\tconst pkcs8 = fromBase64Url(key.key);\n\tconst cryptoKey = await crypto.subtle.importKey('pkcs8', pkcs8, ES256_ALG, true, ['sign']);\n\tconst jwk = (await crypto.subtle.exportKey('jwk', cryptoKey)) as DpopPrivateJwk;\n\tjwk.alg = 'ES256';\n\n\treturn jwk;\n};\n","import type { FetchHandlerObject } from '@atcute/client';\nimport type { Did } from '@atcute/lexicons';\n\nimport { createDPoPFetch } from '../dpop.js';\nimport type { Session } from '../types/token.js';\n\nimport { OAuthServerAgent } from './server-agent.js';\nimport { type SessionGetOptions, deleteStoredSession, getSession } from './sessions.js';\n\nexport class OAuthUserAgent implements FetchHandlerObject {\n\t#fetch: typeof fetch;\n\t#getSessionPromise: Promise<Session> | undefined;\n\n\tconstructor(public session: Session) {\n\t\tthis.#fetch = createDPoPFetch(session.dpopKey, false);\n\t}\n\n\tget sub(): Did {\n\t\treturn this.session.info.sub;\n\t}\n\n\tgetSession(options?: SessionGetOptions): Promise<Session> {\n\t\tconst promise = getSession(this.session.info.sub, options);\n\n\t\tpromise\n\t\t\t.then((session) => {\n\t\t\t\tthis.session = session;\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tthis.#getSessionPromise = undefined;\n\t\t\t});\n\n\t\treturn (this.#getSessionPromise = promise);\n\t}\n\n\tasync signOut(): Promise<void> {\n\t\tconst sub = this.session.info.sub;\n\n\t\ttry {\n\t\t\tconst { dpopKey, info, token } = await getSession(sub, { allowStale: true });\n\t\t\tconst server = new OAuthServerAgent(info.server, dpopKey);\n\n\t\t\tawait server.revoke(token.refresh ?? token.access);\n\t\t} finally {\n\t\t\tdeleteStoredSession(sub);\n\t\t}\n\t}\n\n\tasync handle(pathname: string, init?: RequestInit): Promise<Response> {\n\t\tawait this.#getSessionPromise;\n\n\t\tconst headers = new Headers(init?.headers);\n\n\t\tlet session = this.session;\n\t\tlet url = new URL(pathname, session.info.aud);\n\n\t\theaders.set('authorization', `${session.token.type} ${session.token.access}`);\n\n\t\tlet response = await this.#fetch(url.href, { ...init, headers });\n\t\tif (!isInvalidTokenResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\ttry {\n\t\t\tif (this.#getSessionPromise) {\n\t\t\t\tsession = await this.#getSessionPromise;\n\t\t\t} else {\n\t\t\t\tsession = await this.getSession();\n\t\t\t}\n\t\t} catch {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Stream already consumed, can't retry.\n\t\tif (init?.body instanceof ReadableStream) {\n\t\t\treturn response;\n\t\t}\n\n\t\turl = new URL(pathname, session.info.aud);\n\t\theaders.set('authorization', `${session.token.type} ${session.token.access}`);\n\n\t\treturn await this.#fetch(url.href, { ...init, headers });\n\t}\n}\n\nconst isInvalidTokenResponse = (response: Response) => {\n\tif (response.status !== 401) {\n\t\treturn false;\n\t}\n\n\tconst auth = response.headers.get('www-authenticate');\n\n\treturn (\n\t\tauth != null &&\n\t\t(auth.startsWith('Bearer ') || auth.startsWith('DPoP ')) &&\n\t\tauth.includes('error=\"invalid_token\"')\n\t);\n};\n","{\n \"client_id\": \"https://elements.diffuse.sh/oauth-client-metadata.json\",\n \"client_name\": \"Diffuse\",\n \"client_uri\": \"https://elements.diffuse.sh\",\n \"redirect_uris\": [\"https://elements.diffuse.sh/oauth/callback\"],\n \"scope\": \"atproto repo?collection=sh.diffuse.output.facet&collection=sh.diffuse.output.playlistItem&collection=sh.diffuse.output.theme&collection=sh.diffuse.output.track&collection=sh.diffuse.output.trackBundle\",\n \"grant_types\": [\"authorization_code\", \"refresh_token\"],\n \"response_types\": [\"code\"],\n \"token_endpoint_auth_method\": \"none\",\n \"application_type\": \"web\",\n \"dpop_bound_access_tokens\": true\n}\n"],"mappings":"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","names":["expiresAt","pending","url","value","location"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-NSJY6VZI.js.map"}
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-NZ7ODGIJ.js
··· 1 + ../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/chunk-NZ7ODGIJ.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-NZ7ODGIJ.js.map
··· 1 + ../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/chunk-NZ7ODGIJ.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-OBWEBS4T.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-OBWEBS4T.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-OBWEBS4T.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-OBWEBS4T.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-OIRYE7B4.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-OIRYE7B4.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-OIRYE7B4.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-OIRYE7B4.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-PJWFBDSG.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-PJWFBDSG.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-PJWFBDSG.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-PJWFBDSG.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-PKN6FN7E.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-PKN6FN7E.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-PKN6FN7E.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-PKN6FN7E.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-PTVB4Y37.js
··· 1 + ../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/chunk-PTVB4Y37.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-PTVB4Y37.js.map
··· 1 + ../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/chunk-PTVB4Y37.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-QERJLR3Q.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-QERJLR3Q.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-QERJLR3Q.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-QERJLR3Q.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-QXBWZVFE.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-QXBWZVFE.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-QXBWZVFE.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-QXBWZVFE.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-R3EQQDW5.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-R3EQQDW5.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-R3EQQDW5.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-R3EQQDW5.js.map
+705
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-RXJKQLTB.js
··· 1 + import { 2 + NAME as NAME2 3 + } from "./chunk-BLEJHIYA.js"; 4 + import { 5 + NAME as NAME3 6 + } from "./chunk-IGKYDHDK.js"; 7 + import { 8 + NAME 9 + } from "./chunk-A7YBZO62.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-RXJKQLTB.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-RXJKQLTB.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-RXJKQLTB.js.map"}
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-S6SMX4HA.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-S6SMX4HA.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-S6SMX4HA.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-S6SMX4HA.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-SGR5ST3A.js
··· 1 + ../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/chunk-SGR5ST3A.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-SGR5ST3A.js.map
··· 1 + ../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/chunk-SGR5ST3A.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-SVYFDHZC.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-SVYFDHZC.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-SVYFDHZC.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-SVYFDHZC.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-T2ADV37I.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-T2ADV37I.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-T2ADV37I.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-T2ADV37I.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-T6JAPJ7J.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-T6JAPJ7J.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-T6JAPJ7J.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-T6JAPJ7J.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-TP5GZFTO.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-TP5GZFTO.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-TP5GZFTO.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-TP5GZFTO.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-TSYF7OPM.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-TSYF7OPM.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-TSYF7OPM.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-TSYF7OPM.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-TXU4RB3O.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-TXU4RB3O.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-TXU4RB3O.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-TXU4RB3O.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-U5LVPDQM.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-U5LVPDQM.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-U5LVPDQM.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-U5LVPDQM.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-UMMPFCLQ.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-UMMPFCLQ.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-UMMPFCLQ.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-UMMPFCLQ.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-V7EQPFPD.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-V7EQPFPD.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-V7EQPFPD.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-V7EQPFPD.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-WN6GL63Q.js
··· 1 + ../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/chunk-WN6GL63Q.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-WN6GL63Q.js.map
··· 1 + ../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/chunk-WN6GL63Q.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-X6J7NMRW.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-X6J7NMRW.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-X6J7NMRW.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-X6J7NMRW.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-XGM6M423.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-XGM6M423.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-XGM6M423.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-XGM6M423.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-XMHD7DTB.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-XMHD7DTB.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-XMHD7DTB.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-XMHD7DTB.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-XRGLBUX4.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-XRGLBUX4.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-XRGLBUX4.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-XRGLBUX4.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-YCKIJVMK.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-YCKIJVMK.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-YCKIJVMK.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-YCKIJVMK.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-YEYOLW6N.js
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-YEYOLW6N.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-YEYOLW6N.js.map
··· 1 + ../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/chunk-YEYOLW6N.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-YV3SRJQF.js
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-YV3SRJQF.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-YV3SRJQF.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/chunk-YV3SRJQF.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-Z2SJTSR2.js
··· 1 + ../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/chunk-Z2SJTSR2.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-Z2SJTSR2.js.map
··· 1 + ../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/chunk-Z2SJTSR2.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-ZQZJJU3T.js
··· 1 + ../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/chunk-ZQZJJU3T.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/chunk-ZQZJJU3T.js.map
··· 1 + ../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/chunk-ZQZJJU3T.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/cid.js
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/cid.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/cid.js.map
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/cid.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/compare.js
··· 1 + ../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/common/compare.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/compare.js.map
··· 1 + ../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/common/compare.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/element.js
··· 1 + ../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/common/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/element.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/element.js.map
+61
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/facets/foundation.js
··· 1 + import { 2 + GROUP, 3 + config, 4 + findExistingOrAdd, 5 + foundation_default 6 + } from "../../chunk-JEB4WIQV.js"; 7 + import "../../chunk-G4P4YFWD.js"; 8 + import "../../chunk-6JNRNMZQ.js"; 9 + import "../../chunk-UMMPFCLQ.js"; 10 + import "../../chunk-PKN6FN7E.js"; 11 + import "../../chunk-NP7LZHKR.js"; 12 + import "../../chunk-M2MAFKPM.js"; 13 + import "../../chunk-YV3SRJQF.js"; 14 + import "../../chunk-MVUUUQRL.js"; 15 + import "../../chunk-ESYALJPH.js"; 16 + import "../../chunk-U5LVPDQM.js"; 17 + import "../../chunk-HC6LITPW.js"; 18 + import "../../chunk-6KMZB5IA.js"; 19 + import "../../chunk-XGM6M423.js"; 20 + import "../../chunk-B63ZUKFI.js"; 21 + import "../../chunk-TXU4RB3O.js"; 22 + import "../../chunk-3ENCKNXO.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 "../../chunk-BKRD2ZIW.js"; 51 + import "../../chunk-HNJPKCUJ.js"; 52 + import "../../chunk-SGR5ST3A.js"; 53 + import "../../chunk-FZQXS3RE.js"; 54 + export { 55 + GROUP, 56 + config, 57 + foundation_default as default, 58 + findExistingOrAdd 59 + }; 60 + 61 + //# sourceMappingURL=./foundation.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/facets/foundation.js.map
··· 1 + ../../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/common/facets/foundation.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/facets/utils.js
··· 1 + ../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/common/facets/utils.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/facets/utils.js.map
··· 1 + ../../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/common/facets/utils.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/loader.js
··· 1 + ../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/common/loader.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/loader.js.map
··· 1 + ../../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/common/loader.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/playlist.js
··· 1 + ../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/common/playlist.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/playlist.js.map
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/playlist.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/signal.js
··· 1 + ../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/common/signal.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/signal.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/signal.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/themes/utils.js
··· 1 + ../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/common/themes/utils.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/themes/utils.js.map
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/themes/utils.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/track.js
··· 1 + ../../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/common/track.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/track.js.map
··· 1 + ../../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/common/track.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/utils.js
··· 1 + ../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/common/utils.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/utils.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/utils.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/worker.js
··· 1 + ../../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/common/worker.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/worker.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/worker.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/worker/rpc-channel.js
··· 1 + ../../../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/common/worker/rpc-channel.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/common/worker/rpc-channel.js.map
··· 1 + ../../../bafybeidql7hdkrjfygjungtaqteq4sjgcxcjpndgmjqp7yt4rjqzrdfvja/common/worker/rpc-channel.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/configurator/input/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/configurator/input/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/configurator/input/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/configurator/input/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/configurator/input/worker.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/configurator/input/worker.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/configurator/input/worker.js.map
··· 1 + ../../../../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/components/configurator/input/worker.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/configurator/output/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/configurator/output/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/configurator/output/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/configurator/output/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/engine/audio/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/engine/audio/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/engine/audio/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/engine/audio/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/engine/queue/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/engine/queue/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/engine/queue/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/engine/queue/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/engine/queue/worker.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/engine/queue/worker.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/engine/queue/worker.js.map
··· 1 + ../../../../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/components/engine/queue/worker.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/engine/repeat-shuffle/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/engine/repeat-shuffle/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/engine/repeat-shuffle/element.js.map
··· 1 + ../../../../bafybeia4lo67fqia3emjf54vzbrvfyao6fwndoc4rnqpav4yezowfg4j6e/components/engine/repeat-shuffle/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/engine/scope/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/engine/scope/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/engine/scope/element.js.map
··· 1 + ../../../../bafybeihr4brahqptxmxcdksktdfgs4hyl64odwx524vqmmitjvmn57sklq/components/engine/scope/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/common.js
··· 1 + ../../../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/components/input/common.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/common.js.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/common.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/https/common.js
··· 1 + ../../../../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/components/input/https/common.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/https/common.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/https/common.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/https/constants.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/https/constants.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/https/constants.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/https/constants.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/https/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/input/https/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/https/element.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/https/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/https/worker.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/input/https/worker.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/https/worker.js.map
··· 1 + ../../../../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/components/input/https/worker.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/opensubsonic/class.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/opensubsonic/class.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/opensubsonic/class.js.map
··· 1 + ../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/components/input/opensubsonic/class.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/opensubsonic/common.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/input/opensubsonic/common.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/opensubsonic/common.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/opensubsonic/common.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/opensubsonic/constants.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/opensubsonic/constants.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/opensubsonic/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/opensubsonic/constants.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/opensubsonic/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/input/opensubsonic/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/opensubsonic/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/opensubsonic/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/opensubsonic/worker.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/input/opensubsonic/worker.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/opensubsonic/worker.js.map
··· 1 + ../../../../bafybeih26nbu4qfpdxtsnmdgp64bgrwdzhk5imx6nqiqsdut6nf4bhcuve/components/input/opensubsonic/worker.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/s3/common.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/input/s3/common.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/s3/common.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/s3/common.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/s3/constants.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/s3/constants.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/s3/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/s3/constants.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/s3/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/input/s3/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/s3/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/s3/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/s3/worker.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/input/s3/worker.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/input/s3/worker.js.map
··· 1 + ../../../../bafybeih26nbu4qfpdxtsnmdgp64bgrwdzhk5imx6nqiqsdut6nf4bhcuve/components/input/s3/worker.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/auto-queue/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/auto-queue/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/auto-queue/element.js.map
··· 1 + ../../../../bafybeia4lo67fqia3emjf54vzbrvfyao6fwndoc4rnqpav4yezowfg4j6e/components/orchestrator/auto-queue/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/favourites/common.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/favourites/common.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/favourites/common.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/orchestrator/favourites/common.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/favourites/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/favourites/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/favourites/element.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/orchestrator/favourites/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/favourites/worker.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/favourites/worker.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/favourites/worker.js.map
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/favourites/worker.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/input/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/input/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/input/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/input/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/media-session/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/media-session/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/media-session/element.js.map
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/media-session/element.js.map
+23
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/output/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-HC6LITPW.js"; 6 + import "../../../chunk-6KMZB5IA.js"; 7 + import "../../../chunk-XGM6M423.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/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/output/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/output/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/process-tracks/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/process-tracks/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/process-tracks/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/process-tracks/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/process-tracks/worker.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/process-tracks/worker.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/process-tracks/worker.js.map
··· 1 + ../../../../bafybeidi3kcddz5dkh3zvsszshh4pe37cf4zjgco3xgydj77g7v3ksd2ya/components/orchestrator/process-tracks/worker.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/queue-audio/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/queue-audio/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/queue-audio/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/queue-audio/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/scoped-tracks/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/scoped-tracks/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/scoped-tracks/element.js.map
··· 1 + ../../../../bafybeihr4brahqptxmxcdksktdfgs4hyl64odwx524vqmmitjvmn57sklq/components/orchestrator/scoped-tracks/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/sources/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/orchestrator/sources/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/orchestrator/sources/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/sources/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/output/bytes/s3/constants.js
··· 1 + ../../../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/bytes/s3/constants.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/output/bytes/s3/constants.js.map
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/output/bytes/s3/constants.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/output/bytes/s3/element.js
··· 1 + ../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/output/bytes/s3/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/output/bytes/s3/element.js.map
··· 1 + ../../../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/bytes/s3/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/output/bytes/s3/worker.js
··· 1 + ../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/output/bytes/s3/worker.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/output/bytes/s3/worker.js.map
··· 1 + ../../../../../bafybeidjafrs7ninvfei7lpwwdxcb6iddo52q2twtmznramlolmp6mi5ai/components/output/bytes/s3/worker.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/output/common.js
··· 1 + ../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/output/common.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/output/common.js.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/output/common.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/output/polymorphic/indexed-db/constants.js
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/output/polymorphic/indexed-db/constants.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/output/polymorphic/indexed-db/constants.js.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/output/polymorphic/indexed-db/constants.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/output/polymorphic/indexed-db/element.js
··· 1 + ../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/output/polymorphic/indexed-db/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/output/polymorphic/indexed-db/element.js.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/output/polymorphic/indexed-db/element.js.map
+29
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/output/raw/atproto/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../../chunk-A7YBZO62.js"; 6 + import "../../../../chunk-NSJY6VZI.js"; 7 + import "../../../../chunk-77ZY4GQV.js"; 8 + import "../../../../chunk-NZ7ODGIJ.js"; 9 + import "../../../../chunk-YCKIJVMK.js"; 10 + import "../../../../chunk-JZMTETBD.js"; 11 + import "../../../../chunk-H3WG7GN4.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-WN6GL63Q.js"; 18 + import "../../../../chunk-CRZ7HJJ4.js"; 19 + import "../../../../chunk-242LG3VP.js"; 20 + import "../../../../chunk-BKRD2ZIW.js"; 21 + import "../../../../chunk-HNJPKCUJ.js"; 22 + import "../../../../chunk-FZQXS3RE.js"; 23 + export { 24 + CLASS, 25 + NAME, 26 + element_default as default 27 + }; 28 + 29 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/output/raw/atproto/element.js.map
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/output/raw/atproto/element.js.map
+23
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/output/raw/atproto/oauth.js
··· 1 + import { 2 + OAuthUserAgent, 3 + TokenRefreshError, 4 + clearStoredSession, 5 + login, 6 + logout, 7 + restoreOrFinalize 8 + } from "../../../../chunk-NSJY6VZI.js"; 9 + import "../../../../chunk-77ZY4GQV.js"; 10 + import "../../../../chunk-NZ7ODGIJ.js"; 11 + import "../../../../chunk-CRZ7HJJ4.js"; 12 + import "../../../../chunk-242LG3VP.js"; 13 + import "../../../../chunk-FZQXS3RE.js"; 14 + export { 15 + OAuthUserAgent, 16 + TokenRefreshError, 17 + clearStoredSession, 18 + login, 19 + logout, 20 + restoreOrFinalize 21 + }; 22 + 23 + //# sourceMappingURL=./oauth.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/output/raw/atproto/oauth.js.map
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/output/raw/atproto/oauth.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/processor/artwork/constants.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/processor/artwork/constants.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/processor/artwork/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/artwork/constants.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/processor/artwork/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/processor/artwork/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/processor/artwork/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/artwork/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/processor/artwork/worker.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/processor/artwork/worker.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/processor/artwork/worker.js.map
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/processor/artwork/worker.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/processor/metadata/common.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/processor/metadata/common.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/processor/metadata/common.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/metadata/common.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/processor/metadata/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/processor/metadata/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/processor/metadata/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/metadata/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/processor/metadata/worker.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/processor/metadata/worker.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/processor/metadata/worker.js.map
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/processor/metadata/worker.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/processor/search/constants.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/processor/search/constants.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/processor/search/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/search/constants.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/processor/search/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/processor/search/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/processor/search/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/search/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/processor/search/worker.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/processor/search/worker.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/processor/search/worker.js.map
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/processor/search/worker.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/base.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/base.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/base.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/transformer/output/base.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/bytes/automerge/constants.js
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/bytes/automerge/constants.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/bytes/automerge/constants.js.map
··· 1 + ../../../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/transformer/output/bytes/automerge/constants.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/bytes/automerge/element.js
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/bytes/automerge/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/bytes/automerge/element.js.map
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/bytes/automerge/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/bytes/automerge/utils.js
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/bytes/automerge/utils.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/bytes/automerge/utils.js.map
··· 1 + ../../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/transformer/output/bytes/automerge/utils.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/bytes/dasl-sync/constants.js
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/bytes/dasl-sync/constants.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/bytes/dasl-sync/constants.js.map
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/bytes/dasl-sync/constants.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/bytes/dasl-sync/element.js
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/bytes/dasl-sync/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/bytes/dasl-sync/element.js.map
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/bytes/dasl-sync/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/bytes/json/element.js
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/bytes/json/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/bytes/json/element.js.map
··· 1 + ../../../../../../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/components/transformer/output/bytes/json/element.js.map
+319
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/raw/atproto-sync/element.js
··· 1 + import "../../../../../chunk-26GILFF4.js"; 2 + import { 3 + promiseLoadedState 4 + } from "../../../../../chunk-YCKIJVMK.js"; 5 + import "../../../../../chunk-FAW4EB7G.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/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/raw/atproto-sync/element.js.map
··· 1 + {"version":3,"sources":["/element.js"],"sourcesContent":["import { ifDefined } from \"lit-html/directives/if-defined.js\";\n\nimport \"@components/output/polymorphic/indexed-db/element.js\";\n\nimport { computed, signal } from \"@common/signal.js\";\nimport { OutputTransformer } from \"../../base.js\";\nimport { promiseLoadedState } from \"@toko/diffuse/components/output/common.js\";\n\n/**\n * @import { RenderArg } from \"@common/element.d.ts\"\n * @import { OutputElement } from \"@components/output/types.d.ts\"\n * @import { ATProtoOutputElement } from \"@components/output/raw/atproto/types.d.ts\"\n */\n\nconst COLLECTIONS = /** @type {const} */ ([\n \"facets\",\n \"playlistItems\",\n \"themes\",\n \"tracks\",\n]);\n\nconst STORAGE_PREFIX = \"diffuse/transformer/output/atproto-sync\";\n\n/**\n * Wraps an AT Protocol output with a local IndexedDB cache.\n *\n * Uses the repo `rev` (revision) from the AT Protocol to skip\n * unnecessary fetches when nothing changed remotely.\n *\n * When both local and remote have diverged, performs a union merge\n * by record `id`: records from both sides are combined, with\n * `updatedAt` used as a tiebreaker for conflicts on the same id\n * (falling back to local wins).\n *\n * Maintains a per-collection tombstone set of deleted record ids\n * so that records deleted on one side are not re-introduced by\n * the other during merge.\n *\n * @extends {OutputTransformer<null>}\n */\nclass ATProtoOutputSyncTransformer extends OutputTransformer {\n static NAME = \"diffuse/transformer/output/raw/atproto-sync\";\n\n constructor() {\n super();\n\n const remote = this.base();\n const local = this.#localOutput.get;\n\n for (const name of COLLECTIONS) {\n /** @ts-ignore */\n this[name] = {\n collection: computed(() => {\n const l = local();\n if (!l) return [];\n const data = l[name].collection();\n return Array.isArray(data) ? data : [];\n }),\n loaded: promiseLoadedState(\n computed(() => {\n const l = local();\n if (!l) return [];\n l[name].collection();\n }),\n computed(() => {\n return local()?.[name]?.state() ?? \"sleeping\";\n }),\n ),\n reload: async () => {\n await this.#sync();\n },\n save: async (/** @type {any} */ newData) => {\n const l = local();\n if (!l) return;\n\n // Track deletions: any id present in local but absent in\n // newData has been deleted by the user.\n const oldData = l[name].collection();\n if (Array.isArray(oldData)) {\n const newIds = new Set(newData.map((/** @type {any} */ r) => r.id));\n for (const record of oldData) {\n if (!newIds.has(record.id)) {\n this.#addTombstone(name, record.id);\n }\n }\n }\n\n // Update known ids\n this.#trackIds(name, newData);\n\n await l[name].save(newData);\n\n if (remote.ready()) {\n await remote[name].save(newData);\n const rev = this.#atproto()?.rev();\n if (rev) this.#storeRev(rev);\n this.#clearDirty();\n } else {\n this.#markDirty();\n }\n },\n state: computed(() => local()?.[name].state() ?? \"sleeping\"),\n };\n }\n\n this.ready = () => true;\n\n // Sync when remote becomes ready\n this.effect(() => {\n const l = local();\n if (!l) return;\n\n this.effect(async () => {\n if (!remote.ready()) return;\n if (!(await this.isLeader())) return;\n this.#sync();\n });\n });\n }\n\n // SIGNALS\n\n #localOutput = signal(\n /** @type {OutputElement<any> | undefined} */ (undefined),\n );\n\n #syncing = false;\n\n /**\n * @returns {ATProtoOutputElement | undefined}\n */\n #atproto() {\n return /** @type {any} */ (this.output.signal());\n }\n\n // SYNC\n\n async #sync() {\n if (this.#syncing) return;\n this.#syncing = true;\n\n try {\n const l = this.#localOutput.get();\n const remote = this.base();\n const atproto = this.#atproto();\n if (!l || !atproto || !remote.ready()) return;\n\n const remoteRev = await atproto.getLatestCommit();\n if (!remoteRev) return;\n\n const localRev = this.#getStoredRev();\n const dirty = this.#isDirty();\n\n if (localRev === remoteRev && !dirty) {\n return;\n }\n\n // Fetch remote data\n for (const name of COLLECTIONS) {\n await remote[name].reload();\n }\n\n const localHasData = COLLECTIONS.some((name) => {\n const data = l[name].collection();\n return Array.isArray(data) && data.length > 0;\n });\n\n if (!localHasData && !dirty) {\n // Local is empty and clean — just pull remote\n for (const name of COLLECTIONS) {\n const remoteData = remote[name].collection();\n if (Array.isArray(remoteData) && remoteData.length > 0) {\n this.#trackIds(name, remoteData);\n await l[name].save(remoteData);\n }\n }\n } else {\n // Union merge\n for (const name of COLLECTIONS) {\n const localData = l[name].collection();\n const remoteData = remote[name].collection();\n const localArr = Array.isArray(localData) ? localData : [];\n const remoteArr = Array.isArray(remoteData) ? remoteData : [];\n\n const merged = this.#mergeRecords(name, localArr, remoteArr);\n\n this.#trackIds(name, merged);\n await l[name].save(merged);\n await remote[name].save(merged);\n }\n }\n\n this.#storeRev(atproto.rev());\n this.#clearDirty();\n } catch (err) {\n console.warn(\"Sync failed:\", err);\n this.#syncing = false;\n }\n }\n\n /**\n * Union merge two record arrays by `id`.\n *\n * - Records only in local → keep (unless tombstoned)\n * - Records only in remote → keep (unless tombstoned)\n * - Records in both → pick the one with the later `updatedAt`,\n * falling back to local wins\n * - Records whose id is in the tombstone set are excluded\n *\n * @template {Record<string, any> & { id: string }} T\n * @param {string} collection\n * @param {T[]} localArr\n * @param {T[]} remoteArr\n * @returns {T[]}\n */\n #mergeRecords(collection, localArr, remoteArr) {\n const tombstones = this.#getTombstones(collection);\n const knownIds = this.#getKnownIds(collection);\n\n /** @type {Map<string, T>} */\n const merged = new Map();\n\n // Start with local records\n for (const record of localArr) {\n if (!tombstones.has(record.id)) {\n merged.set(record.id, record);\n }\n }\n\n // Merge remote records\n for (const record of remoteArr) {\n if (tombstones.has(record.id)) continue;\n\n // If this id was previously known but is absent from local,\n // it was deleted locally — skip it.\n if (knownIds.has(record.id) && !merged.has(record.id)) continue;\n\n const existing = merged.get(record.id);\n\n if (!existing) {\n merged.set(record.id, record);\n } else {\n // Both sides have this record — pick by updatedAt\n const lt = existing.updatedAt;\n const rt = record.updatedAt;\n if (lt && rt && rt > lt) {\n merged.set(record.id, record);\n }\n }\n }\n\n return [...merged.values()];\n }\n\n // TOMBSTONES & KNOWN IDS\n\n /**\n * @param {string} collection\n * @returns {Set<string>}\n */\n #getTombstones(collection) {\n const raw = localStorage.getItem(\n `${STORAGE_PREFIX}/tombstones/${collection}`,\n );\n return raw ? new Set(JSON.parse(raw)) : new Set();\n }\n\n /**\n * @param {string} collection\n * @param {string} id\n */\n #addTombstone(collection, id) {\n const tombstones = this.#getTombstones(collection);\n tombstones.add(id);\n localStorage.setItem(\n `${STORAGE_PREFIX}/tombstones/${collection}`,\n JSON.stringify([...tombstones]),\n );\n }\n\n /**\n * @param {string} collection\n * @returns {Set<string>}\n */\n #getKnownIds(collection) {\n const raw = localStorage.getItem(`${STORAGE_PREFIX}/known/${collection}`);\n return raw ? new Set(JSON.parse(raw)) : new Set();\n }\n\n /**\n * Record all ids from a data array as known.\n *\n * @param {string} collection\n * @param {Array<{ id: string }>} data\n */\n #trackIds(collection, data) {\n const known = this.#getKnownIds(collection);\n for (const record of data) {\n known.add(record.id);\n }\n localStorage.setItem(\n `${STORAGE_PREFIX}/known/${collection}`,\n JSON.stringify([...known]),\n );\n }\n\n // REV & DIRTY FLAG\n\n /** @returns {string | null} */\n #getStoredRev() {\n return localStorage.getItem(`${STORAGE_PREFIX}/rev`);\n }\n\n /** @param {string | null} rev */\n #storeRev(rev) {\n if (rev) {\n localStorage.setItem(`${STORAGE_PREFIX}/rev`, rev);\n }\n }\n\n #markDirty() {\n localStorage.setItem(`${STORAGE_PREFIX}/dirty`, \"1\");\n }\n\n #clearDirty() {\n localStorage.removeItem(`${STORAGE_PREFIX}/dirty`);\n }\n\n /** @returns {boolean} */\n #isDirty() {\n return localStorage.getItem(`${STORAGE_PREFIX}/dirty`) === \"1\";\n }\n\n // LIFECYCLE\n\n /** @override */\n connectedCallback() {\n // Broadcast if needed\n if (this.hasAttribute(\"group\")) {\n this.broadcast(this.identifier, {});\n }\n\n super.connectedCallback();\n\n /** @type {OutputElement<any> | null} */\n const local = this.root().querySelector(\"dop-indexed-db\");\n if (!local) throw new Error(\"Can't find local output\");\n\n customElements.whenDefined(local.localName).then(() => {\n this.#localOutput.value = local;\n });\n }\n\n // RENDER\n\n /**\n * @param {RenderArg} _\n */\n render({ html }) {\n return html`\n <dop-indexed-db\n group=\"${ifDefined(this.getAttribute(`group`))}\"\n namespace=\"${ifDefined(this.getAttribute(`namespace`))}\"\n ></dop-indexed-db>\n `;\n }\n}\n\nexport default ATProtoOutputSyncTransformer;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = ATProtoOutputSyncTransformer;\nexport const NAME = \"dtor-atproto-sync\";\n\ncustomElements.define(NAME, CLASS);\n"],"mappings":"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","names":[],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/components/transformer/output/raw/atproto-sync/element.js.map"}
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/refiner/default/element.js
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/refiner/default/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/refiner/default/element.js.map
··· 1 + ../../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/transformer/output/refiner/default/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/refiner/track-uri-passkey/element.js
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/refiner/track-uri-passkey/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/refiner/track-uri-passkey/element.js.map
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/refiner/track-uri-passkey/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/refiner/track-uri-passkey/passkey.js
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/refiner/track-uri-passkey/passkey.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/refiner/track-uri-passkey/passkey.js.map
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/refiner/track-uri-passkey/passkey.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/string/json/element.js
··· 1 + ../../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/components/transformer/output/string/json/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/components/transformer/output/string/json/element.js.map
··· 1 + ../../../../../../bafybeif36x7yy3gignoyekheplnhh4og5l5z3nrvviouxgiy36iimz3vai/components/transformer/output/string/json/element.js.map
+6
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/definitions/index.ts
··· 1 + export * as ShDiffuseOutputCollaboration from "./types/sh/diffuse/output/collaboration.ts"; 2 + export * as ShDiffuseOutputFacet from "./types/sh/diffuse/output/facet.ts"; 3 + export * as ShDiffuseOutputPlaylistItem from "./types/sh/diffuse/output/playlistItem.ts"; 4 + export * as ShDiffuseOutputTheme from "./types/sh/diffuse/output/theme.ts"; 5 + export * as ShDiffuseOutputTrack from "./types/sh/diffuse/output/track.ts"; 6 + export * as ShDiffuseOutputTrackBundle from "./types/sh/diffuse/output/trackBundle.ts";
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/definitions/output/collaboration.json
··· 1 + ../../../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/definitions/output/collaboration.json
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/definitions/output/facet.json
··· 1 + ../../../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/definitions/output/facet.json
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/definitions/output/playlistItem.json
··· 1 + ../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/definitions/output/playlistItem.json
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/definitions/output/theme.json
··· 1 + ../../../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/definitions/output/theme.json
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/definitions/output/track.json
··· 1 + ../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/definitions/output/track.json
+23
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/definitions/output/trackBundle.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "sh.diffuse.output.trackBundle", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "record": { 8 + "type": "object", 9 + "required": ["id", "tracks"], 10 + "properties": { 11 + "id": { "type": "string" }, 12 + "createdAt": { "type": "string", "format": "datetime" }, 13 + "tracks": { 14 + "type": "array", 15 + "description": "A bundle of tracks", 16 + "items": { "type": "ref", "ref": "sh.diffuse.output.track" } 17 + }, 18 + "updatedAt": { "type": "string", "format": "datetime" } 19 + } 20 + } 21 + } 22 + } 23 + }
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/facets/examples/generate-playlist.html.txt
··· 1 + ../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/facets/examples/generate-playlist.html.txt
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/facets/examples/now-playing.html.txt
··· 1 + ../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/facets/examples/now-playing.html.txt
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/facets/index.html
··· 1 + ../../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/facets/index.html
+1636
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/facets/index.js
··· 1 + import { 2 + EditorView, 3 + autocompletion, 4 + basicSetup, 5 + css, 6 + html, 7 + javascript 8 + } from "../chunk-T6JAPJ7J.js"; 9 + import { 10 + facetFromURI 11 + } from "../chunk-7XAKBJEU.js"; 12 + import { 13 + foundation_default 14 + } from "../chunk-JEB4WIQV.js"; 15 + import "../chunk-G4P4YFWD.js"; 16 + import "../chunk-6JNRNMZQ.js"; 17 + import "../chunk-UMMPFCLQ.js"; 18 + import "../chunk-PKN6FN7E.js"; 19 + import "../chunk-NP7LZHKR.js"; 20 + import "../chunk-M2MAFKPM.js"; 21 + import "../chunk-YV3SRJQF.js"; 22 + import "../chunk-MVUUUQRL.js"; 23 + import "../chunk-ESYALJPH.js"; 24 + import "../chunk-U5LVPDQM.js"; 25 + import "../chunk-HC6LITPW.js"; 26 + import "../chunk-6KMZB5IA.js"; 27 + import "../chunk-XGM6M423.js"; 28 + import "../chunk-B63ZUKFI.js"; 29 + import "../chunk-TXU4RB3O.js"; 30 + import "../chunk-3ENCKNXO.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 as i2 40 + } from "../chunk-NBQPHQFP.js"; 41 + import { 42 + e, 43 + i, 44 + t 45 + } from "../chunk-QERJLR3Q.js"; 46 + import "../chunk-OBWEBS4T.js"; 47 + import "../chunk-S6SMX4HA.js"; 48 + import "../chunk-XRGLBUX4.js"; 49 + import "../chunk-R3EQQDW5.js"; 50 + import "../chunk-GQIBEDKG.js"; 51 + import "../chunk-DDF5P57I.js"; 52 + import "../chunk-EEUCFWD4.js"; 53 + import "../chunk-6DRHTH2U.js"; 54 + import "../chunk-TSYF7OPM.js"; 55 + import "../chunk-GCLDJKYV.js"; 56 + import "../chunk-KJFA7KRK.js"; 57 + import "../chunk-HMBZONBJ.js"; 58 + import "../chunk-6CB2LXND.js"; 59 + import { 60 + A, 61 + B, 62 + E, 63 + T 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 { 70 + loadURI 71 + } from "../chunk-X6J7NMRW.js"; 72 + import "../chunk-WN6GL63Q.js"; 73 + import "../chunk-CRZ7HJJ4.js"; 74 + import "../chunk-242LG3VP.js"; 75 + import { 76 + now 77 + } from "../chunk-BKRD2ZIW.js"; 78 + import { 79 + effect, 80 + signal 81 + } from "../chunk-HNJPKCUJ.js"; 82 + import { 83 + create 84 + } from "../chunk-4YB6QUPN.js"; 85 + import "../chunk-SGR5ST3A.js"; 86 + import { 87 + __name, 88 + init_Buffer, 89 + init_process 90 + } from "../chunk-FZQXS3RE.js"; 91 + 92 + // facets/index.js 93 + init_Buffer(); 94 + init_process(); 95 + 96 + // ../node_modules/.deno/marked@17.0.3/node_modules/marked/lib/marked.esm.js 97 + init_Buffer(); 98 + init_process(); 99 + function M() { 100 + return { async: false, breaks: false, extensions: null, gfm: true, hooks: null, pedantic: false, renderer: null, silent: false, tokenizer: null, walkTokens: null }; 101 + } 102 + __name(M, "M"); 103 + var T2 = M(); 104 + function H(u3) { 105 + T2 = u3; 106 + } 107 + __name(H, "H"); 108 + var _ = { exec: /* @__PURE__ */ __name(() => null, "exec") }; 109 + function k(u3, e3 = "") { 110 + let t2 = typeof u3 == "string" ? u3 : u3.source, n = { replace: /* @__PURE__ */ __name((r, i3) => { 111 + let s = typeof i3 == "string" ? i3 : i3.source; 112 + return s = s.replace(m.caret, "$1"), t2 = t2.replace(r, s), n; 113 + }, "replace"), getRegex: /* @__PURE__ */ __name(() => new RegExp(t2, e3), "getRegex") }; 114 + return n; 115 + } 116 + __name(k, "k"); 117 + var Re = (() => { 118 + try { 119 + return !!new RegExp("(?<=1)(?<!1)"); 120 + } catch { 121 + return false; 122 + } 123 + })(); 124 + 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") }; 125 + var Te = /^(?:[ \t]*(?:\n|$))+/; 126 + var Oe = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/; 127 + var we = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/; 128 + var I = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/; 129 + var ye = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/; 130 + var N = / {0,3}(?:[*+-]|\d{1,9}[.)])/; 131 + var re = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/; 132 + 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(); 133 + 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(); 134 + var Q = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/; 135 + var Se = /^[^\n]+/; 136 + var F = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/; 137 + 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(); 138 + var _e = k(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, N).getRegex(); 139 + 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"; 140 + var j = /<!--(?:-?>|[\s\S]*?(?:-->|$))/; 141 + 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(); 142 + 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(); 143 + var Me = k(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", ie).getRegex(); 144 + 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 }; 145 + 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(); 146 + 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() }; 147 + 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} *[^ 148 + ]`).replace("lheading", se).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() }; 149 + var Ae = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/; 150 + var Ie = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/; 151 + var oe = /^( {2,}|\\)\n(?!\s*$)/; 152 + var Ee = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/; 153 + var v = /[\p{P}\p{S}]/u; 154 + var K = /[\s\p{P}\p{S}]/u; 155 + var ae = /[^\s\p{P}\p{S}]/u; 156 + var Be = k(/^((?![*_])punctSpace)/, "u").replace(/punctSpace/g, K).getRegex(); 157 + var le = /(?!~)[\p{P}\p{S}]/u; 158 + var De = /(?!~)[\s\p{P}\p{S}]/u; 159 + var qe = /(?:[^\s\p{P}\p{S}]|~)/u; 160 + var ue = /(?![*_])[\p{P}\p{S}]/u; 161 + var ve = /(?![*_])[\s\p{P}\p{S}]/u; 162 + var Ge = /(?:[^\s\p{P}\p{S}]|[*_])/u; 163 + 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(); 164 + var pe = /^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/; 165 + var Ze = k(pe, "u").replace(/punct/g, v).getRegex(); 166 + var Ne = k(pe, "u").replace(/punct/g, le).getRegex(); 167 + var ce = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)"; 168 + var Qe = k(ce, "gu").replace(/notPunctSpace/g, ae).replace(/punctSpace/g, K).replace(/punct/g, v).getRegex(); 169 + var Fe = k(ce, "gu").replace(/notPunctSpace/g, qe).replace(/punctSpace/g, De).replace(/punct/g, le).getRegex(); 170 + 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(); 171 + var Ue = k(/^~~?(?:((?!~)punct)|[^\s~])/, "u").replace(/punct/g, ue).getRegex(); 172 + var Ke = "^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)"; 173 + var We = k(Ke, "gu").replace(/notPunctSpace/g, Ge).replace(/punctSpace/g, ve).replace(/punct/g, ue).getRegex(); 174 + var Xe = k(/\\(punct)/, "gu").replace(/punct/g, v).getRegex(); 175 + 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(); 176 + var Ve = k(j).replace("(?:-->|$)", "-->").getRegex(); 177 + 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(); 178 + var D = /(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/; 179 + var et = k(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", D).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(); 180 + var he = k(/^!?\[(label)\]\[(ref)\]/).replace("label", D).replace("ref", F).getRegex(); 181 + var ke = k(/^!?\[(ref)\](?:\[\])?/).replace("ref", F).getRegex(); 182 + var tt = k("reflink|nolink(?!\\()", "g").replace("reflink", he).replace("nolink", ke).getRegex(); 183 + var ne = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/; 184 + 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: _ }; 185 + var nt = { ...W, link: k(/^!?\[(label)\]\((.*?)\)/).replace("label", D).getRegex(), reflink: k(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", D).getRegex() }; 186 + 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() }; 187 + var rt = { ...Z, br: k(oe).replace("{2,}", "*").getRegex(), text: k(Z.text).replace("\\b_", "\\b_| {2,}\\n").replace(/\{2,\}/g, "*").getRegex() }; 188 + var E2 = { normal: U, gfm: ze, pedantic: Ce }; 189 + var z = { normal: W, gfm: Z, breaks: rt, pedantic: nt }; 190 + var st = { "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" }; 191 + var de = /* @__PURE__ */ __name((u3) => st[u3], "de"); 192 + function O(u3, e3) { 193 + if (e3) { 194 + if (m.escapeTest.test(u3)) return u3.replace(m.escapeReplace, de); 195 + } else if (m.escapeTestNoEncode.test(u3)) return u3.replace(m.escapeReplaceNoEncode, de); 196 + return u3; 197 + } 198 + __name(O, "O"); 199 + function X(u3) { 200 + try { 201 + u3 = encodeURI(u3).replace(m.percentDecode, "%"); 202 + } catch { 203 + return null; 204 + } 205 + return u3; 206 + } 207 + __name(X, "X"); 208 + function J(u3, e3) { 209 + let t2 = u3.replace(m.findPipe, (i3, s, a) => { 210 + let o2 = false, l = s; 211 + for (; --l >= 0 && a[l] === "\\"; ) o2 = !o2; 212 + return o2 ? "|" : " |"; 213 + }), n = t2.split(m.splitPipe), r = 0; 214 + if (n[0].trim() || n.shift(), n.length > 0 && !n.at(-1)?.trim() && n.pop(), e3) if (n.length > e3) n.splice(e3); 215 + else for (; n.length < e3; ) n.push(""); 216 + for (; r < n.length; r++) n[r] = n[r].trim().replace(m.slashPipe, "|"); 217 + return n; 218 + } 219 + __name(J, "J"); 220 + function C(u3, e3, t2) { 221 + let n = u3.length; 222 + if (n === 0) return ""; 223 + let r = 0; 224 + for (; r < n; ) { 225 + let i3 = u3.charAt(n - r - 1); 226 + if (i3 === e3 && !t2) r++; 227 + else if (i3 !== e3 && t2) r++; 228 + else break; 229 + } 230 + return u3.slice(0, n - r); 231 + } 232 + __name(C, "C"); 233 + function ge(u3, e3) { 234 + if (u3.indexOf(e3[1]) === -1) return -1; 235 + let t2 = 0; 236 + for (let n = 0; n < u3.length; n++) if (u3[n] === "\\") n++; 237 + else if (u3[n] === e3[0]) t2++; 238 + else if (u3[n] === e3[1] && (t2--, t2 < 0)) return n; 239 + return t2 > 0 ? -2 : -1; 240 + } 241 + __name(ge, "ge"); 242 + function fe(u3, e3 = 0) { 243 + let t2 = e3, n = ""; 244 + for (let r of u3) if (r === " ") { 245 + let i3 = 4 - t2 % 4; 246 + n += " ".repeat(i3), t2 += i3; 247 + } else n += r, t2++; 248 + return n; 249 + } 250 + __name(fe, "fe"); 251 + function me(u3, e3, t2, n, r) { 252 + let i3 = e3.href, s = e3.title || null, a = u3[1].replace(r.other.outputLinkReplace, "$1"); 253 + n.state.inLink = true; 254 + let o2 = { type: u3[0].charAt(0) === "!" ? "image" : "link", raw: t2, href: i3, title: s, text: a, tokens: n.inlineTokens(a) }; 255 + return n.state.inLink = false, o2; 256 + } 257 + __name(me, "me"); 258 + function it(u3, e3, t2) { 259 + let n = u3.match(t2.other.indentCodeCompensation); 260 + if (n === null) return e3; 261 + let r = n[1]; 262 + return e3.split(` 263 + `).map((i3) => { 264 + let s = i3.match(t2.other.beginningSpace); 265 + if (s === null) return i3; 266 + let [a] = s; 267 + return a.length >= r.length ? i3.slice(r.length) : i3; 268 + }).join(` 269 + `); 270 + } 271 + __name(it, "it"); 272 + var w = class { 273 + static { 274 + __name(this, "w"); 275 + } 276 + options; 277 + rules; 278 + lexer; 279 + constructor(e3) { 280 + this.options = e3 || T2; 281 + } 282 + space(e3) { 283 + let t2 = this.rules.block.newline.exec(e3); 284 + if (t2 && t2[0].length > 0) return { type: "space", raw: t2[0] }; 285 + } 286 + code(e3) { 287 + let t2 = this.rules.block.code.exec(e3); 288 + if (t2) { 289 + let n = t2[0].replace(this.rules.other.codeRemoveIndent, ""); 290 + return { type: "code", raw: t2[0], codeBlockStyle: "indented", text: this.options.pedantic ? n : C(n, ` 291 + `) }; 292 + } 293 + } 294 + fences(e3) { 295 + let t2 = this.rules.block.fences.exec(e3); 296 + if (t2) { 297 + let n = t2[0], r = it(n, t2[3] || "", this.rules); 298 + return { type: "code", raw: n, lang: t2[2] ? t2[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : t2[2], text: r }; 299 + } 300 + } 301 + heading(e3) { 302 + let t2 = this.rules.block.heading.exec(e3); 303 + if (t2) { 304 + let n = t2[2].trim(); 305 + if (this.rules.other.endingHash.test(n)) { 306 + let r = C(n, "#"); 307 + (this.options.pedantic || !r || this.rules.other.endingSpaceChar.test(r)) && (n = r.trim()); 308 + } 309 + return { type: "heading", raw: t2[0], depth: t2[1].length, text: n, tokens: this.lexer.inline(n) }; 310 + } 311 + } 312 + hr(e3) { 313 + let t2 = this.rules.block.hr.exec(e3); 314 + if (t2) return { type: "hr", raw: C(t2[0], ` 315 + `) }; 316 + } 317 + blockquote(e3) { 318 + let t2 = this.rules.block.blockquote.exec(e3); 319 + if (t2) { 320 + let n = C(t2[0], ` 321 + `).split(` 322 + `), r = "", i3 = "", s = []; 323 + for (; n.length > 0; ) { 324 + let a = false, o2 = [], l; 325 + for (l = 0; l < n.length; l++) if (this.rules.other.blockquoteStart.test(n[l])) o2.push(n[l]), a = true; 326 + else if (!a) o2.push(n[l]); 327 + else break; 328 + n = n.slice(l); 329 + let p = o2.join(` 330 + `), c = p.replace(this.rules.other.blockquoteSetextReplace, ` 331 + $1`).replace(this.rules.other.blockquoteSetextReplace2, ""); 332 + r = r ? `${r} 333 + ${p}` : p, i3 = i3 ? `${i3} 334 + ${c}` : c; 335 + let d = this.lexer.state.top; 336 + if (this.lexer.state.top = true, this.lexer.blockTokens(c, s, true), this.lexer.state.top = d, n.length === 0) break; 337 + let h = s.at(-1); 338 + if (h?.type === "code") break; 339 + if (h?.type === "blockquote") { 340 + let R = h, f = R.raw + ` 341 + ` + n.join(` 342 + `), S = this.blockquote(f); 343 + 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; 344 + break; 345 + } else if (h?.type === "list") { 346 + let R = h, f = R.raw + ` 347 + ` + n.join(` 348 + `), S = this.list(f); 349 + 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(` 350 + `); 351 + continue; 352 + } 353 + } 354 + return { type: "blockquote", raw: r, tokens: s, text: i3 }; 355 + } 356 + } 357 + list(e3) { 358 + let t2 = this.rules.block.list.exec(e3); 359 + if (t2) { 360 + let n = t2[1].trim(), r = n.length > 1, i3 = { type: "list", raw: "", ordered: r, start: r ? +n.slice(0, -1) : "", loose: false, items: [] }; 361 + n = r ? `\\d{1,9}\\${n.slice(-1)}` : `\\${n}`, this.options.pedantic && (n = r ? n : "[*+-]"); 362 + let s = this.rules.other.listItemRegex(n), a = false; 363 + for (; e3; ) { 364 + let l = false, p = "", c = ""; 365 + if (!(t2 = s.exec(e3)) || this.rules.block.hr.test(e3)) break; 366 + p = t2[0], e3 = e3.substring(p.length); 367 + let d = fe(t2[2].split(` 368 + `, 1)[0], t2[1].length), h = e3.split(` 369 + `, 1)[0], R = !d.trim(), f = 0; 370 + 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 + ` 371 + `, e3 = e3.substring(h.length + 1), l = true), !l) { 372 + 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); 373 + for (; e3; ) { 374 + let G = e3.split(` 375 + `, 1)[0], A2; 376 + 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; 377 + if (A2.search(this.rules.other.nonSpaceChar) >= f || !h.trim()) c += ` 378 + ` + A2.slice(f); 379 + else { 380 + if (R || d.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4 || Y.test(d) || ee.test(d) || V.test(d)) break; 381 + c += ` 382 + ` + h; 383 + } 384 + R = !h.trim(), p += G + ` 385 + `, e3 = e3.substring(G.length + 1), d = A2.slice(f); 386 + } 387 + } 388 + 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; 389 + } 390 + let o2 = i3.items.at(-1); 391 + if (o2) o2.raw = o2.raw.trimEnd(), o2.text = o2.text.trimEnd(); 392 + else return; 393 + i3.raw = i3.raw.trimEnd(); 394 + for (let l of i3.items) { 395 + if (this.lexer.state.top = false, l.tokens = this.lexer.blockTokens(l.text, []), l.task) { 396 + if (l.text = l.text.replace(this.rules.other.listReplaceTask, ""), l.tokens[0]?.type === "text" || l.tokens[0]?.type === "paragraph") { 397 + 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, ""); 398 + for (let c = this.lexer.inlineQueue.length - 1; c >= 0; c--) if (this.rules.other.listIsTask.test(this.lexer.inlineQueue[c].src)) { 399 + this.lexer.inlineQueue[c].src = this.lexer.inlineQueue[c].src.replace(this.rules.other.listReplaceTask, ""); 400 + break; 401 + } 402 + } 403 + let p = this.rules.other.listTaskCheckbox.exec(l.raw); 404 + if (p) { 405 + let c = { type: "checkbox", raw: p[0] + " ", checked: p[0] !== "[ ]" }; 406 + 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); 407 + } 408 + } 409 + if (!i3.loose) { 410 + let p = l.tokens.filter((d) => d.type === "space"), c = p.length > 0 && p.some((d) => this.rules.other.anyLine.test(d.raw)); 411 + i3.loose = c; 412 + } 413 + } 414 + if (i3.loose) for (let l of i3.items) { 415 + l.loose = true; 416 + for (let p of l.tokens) p.type === "text" && (p.type = "paragraph"); 417 + } 418 + return i3; 419 + } 420 + } 421 + html(e3) { 422 + let t2 = this.rules.block.html.exec(e3); 423 + if (t2) return { type: "html", block: true, raw: t2[0], pre: t2[1] === "pre" || t2[1] === "script" || t2[1] === "style", text: t2[0] }; 424 + } 425 + def(e3) { 426 + let t2 = this.rules.block.def.exec(e3); 427 + if (t2) { 428 + 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]; 429 + return { type: "def", tag: n, raw: t2[0], href: r, title: i3 }; 430 + } 431 + } 432 + table(e3) { 433 + let t2 = this.rules.block.table.exec(e3); 434 + if (!t2 || !this.rules.other.tableDelimiter.test(t2[2])) return; 435 + 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(` 436 + `) : [], s = { type: "table", raw: t2[0], header: [], align: [], rows: [] }; 437 + if (n.length === r.length) { 438 + 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); 439 + 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] }); 440 + 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] }))); 441 + return s; 442 + } 443 + } 444 + lheading(e3) { 445 + let t2 = this.rules.block.lheading.exec(e3); 446 + if (t2) return { type: "heading", raw: t2[0], depth: t2[2].charAt(0) === "=" ? 1 : 2, text: t2[1], tokens: this.lexer.inline(t2[1]) }; 447 + } 448 + paragraph(e3) { 449 + let t2 = this.rules.block.paragraph.exec(e3); 450 + if (t2) { 451 + let n = t2[1].charAt(t2[1].length - 1) === ` 452 + ` ? t2[1].slice(0, -1) : t2[1]; 453 + return { type: "paragraph", raw: t2[0], text: n, tokens: this.lexer.inline(n) }; 454 + } 455 + } 456 + text(e3) { 457 + let t2 = this.rules.block.text.exec(e3); 458 + if (t2) return { type: "text", raw: t2[0], text: t2[0], tokens: this.lexer.inline(t2[0]) }; 459 + } 460 + escape(e3) { 461 + let t2 = this.rules.inline.escape.exec(e3); 462 + if (t2) return { type: "escape", raw: t2[0], text: t2[1] }; 463 + } 464 + tag(e3) { 465 + let t2 = this.rules.inline.tag.exec(e3); 466 + 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] }; 467 + } 468 + link(e3) { 469 + let t2 = this.rules.inline.link.exec(e3); 470 + if (t2) { 471 + let n = t2[2].trim(); 472 + if (!this.options.pedantic && this.rules.other.startAngleBracket.test(n)) { 473 + if (!this.rules.other.endAngleBracket.test(n)) return; 474 + let s = C(n.slice(0, -1), "\\"); 475 + if ((n.length - s.length) % 2 === 0) return; 476 + } else { 477 + let s = ge(t2[2], "()"); 478 + if (s === -2) return; 479 + if (s > -1) { 480 + let o2 = (t2[0].indexOf("!") === 0 ? 5 : 4) + t2[1].length + s; 481 + t2[2] = t2[2].substring(0, s), t2[0] = t2[0].substring(0, o2).trim(), t2[3] = ""; 482 + } 483 + } 484 + let r = t2[2], i3 = ""; 485 + if (this.options.pedantic) { 486 + let s = this.rules.other.pedanticHrefTitle.exec(r); 487 + s && (r = s[1], i3 = s[3]); 488 + } else i3 = t2[3] ? t2[3].slice(1, -1) : ""; 489 + 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); 490 + } 491 + } 492 + reflink(e3, t2) { 493 + let n; 494 + if ((n = this.rules.inline.reflink.exec(e3)) || (n = this.rules.inline.nolink.exec(e3))) { 495 + let r = (n[2] || n[1]).replace(this.rules.other.multipleSpaceGlobal, " "), i3 = t2[r.toLowerCase()]; 496 + if (!i3) { 497 + let s = n[0].charAt(0); 498 + return { type: "text", raw: s, text: s }; 499 + } 500 + return me(n, i3, n[0], this.lexer, this.rules); 501 + } 502 + } 503 + emStrong(e3, t2, n = "") { 504 + let r = this.rules.inline.emStrongLDelim.exec(e3); 505 + if (!r || r[3] && n.match(this.rules.other.unicodeAlphaNumeric)) return; 506 + if (!(r[1] || r[2] || "") || !n || this.rules.inline.punctuation.exec(n)) { 507 + let s = [...r[0]].length - 1, a, o2, l = s, p = 0, c = r[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; 508 + for (c.lastIndex = 0, t2 = t2.slice(-1 * e3.length + s); (r = c.exec(t2)) != null; ) { 509 + if (a = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !a) continue; 510 + if (o2 = [...a].length, r[3] || r[4]) { 511 + l += o2; 512 + continue; 513 + } else if ((r[5] || r[6]) && s % 3 && !((s + o2) % 3)) { 514 + p += o2; 515 + continue; 516 + } 517 + if (l -= o2, l > 0) continue; 518 + o2 = Math.min(o2, o2 + l + p); 519 + let d = [...r[0]][0].length, h = e3.slice(0, s + r.index + d + o2); 520 + if (Math.min(s, o2) % 2) { 521 + let f = h.slice(1, -1); 522 + return { type: "em", raw: h, text: f, tokens: this.lexer.inlineTokens(f) }; 523 + } 524 + let R = h.slice(2, -2); 525 + return { type: "strong", raw: h, text: R, tokens: this.lexer.inlineTokens(R) }; 526 + } 527 + } 528 + } 529 + codespan(e3) { 530 + let t2 = this.rules.inline.code.exec(e3); 531 + if (t2) { 532 + 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); 533 + return r && i3 && (n = n.substring(1, n.length - 1)), { type: "codespan", raw: t2[0], text: n }; 534 + } 535 + } 536 + br(e3) { 537 + let t2 = this.rules.inline.br.exec(e3); 538 + if (t2) return { type: "br", raw: t2[0] }; 539 + } 540 + del(e3, t2, n = "") { 541 + let r = this.rules.inline.delLDelim.exec(e3); 542 + if (!r) return; 543 + if (!(r[1] || "") || !n || this.rules.inline.punctuation.exec(n)) { 544 + let s = [...r[0]].length - 1, a, o2, l = s, p = this.rules.inline.delRDelim; 545 + for (p.lastIndex = 0, t2 = t2.slice(-1 * e3.length + s); (r = p.exec(t2)) != null; ) { 546 + if (a = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !a || (o2 = [...a].length, o2 !== s)) continue; 547 + if (r[3] || r[4]) { 548 + l += o2; 549 + continue; 550 + } 551 + if (l -= o2, l > 0) continue; 552 + o2 = Math.min(o2, o2 + l); 553 + let c = [...r[0]][0].length, d = e3.slice(0, s + r.index + c + o2), h = d.slice(s, -s); 554 + return { type: "del", raw: d, text: h, tokens: this.lexer.inlineTokens(h) }; 555 + } 556 + } 557 + } 558 + autolink(e3) { 559 + let t2 = this.rules.inline.autolink.exec(e3); 560 + if (t2) { 561 + let n, r; 562 + 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 }] }; 563 + } 564 + } 565 + url(e3) { 566 + let t2; 567 + if (t2 = this.rules.inline.url.exec(e3)) { 568 + let n, r; 569 + if (t2[2] === "@") n = t2[0], r = "mailto:" + n; 570 + else { 571 + let i3; 572 + do 573 + i3 = t2[0], t2[0] = this.rules.inline._backpedal.exec(t2[0])?.[0] ?? ""; 574 + while (i3 !== t2[0]); 575 + n = t2[0], t2[1] === "www." ? r = "http://" + t2[0] : r = t2[0]; 576 + } 577 + return { type: "link", raw: t2[0], text: n, href: r, tokens: [{ type: "text", raw: n, text: n }] }; 578 + } 579 + } 580 + inlineText(e3) { 581 + let t2 = this.rules.inline.text.exec(e3); 582 + if (t2) { 583 + let n = this.lexer.state.inRawBlock; 584 + return { type: "text", raw: t2[0], text: t2[0], escaped: n }; 585 + } 586 + } 587 + }; 588 + var x = class u { 589 + static { 590 + __name(this, "u"); 591 + } 592 + tokens; 593 + options; 594 + state; 595 + inlineQueue; 596 + tokenizer; 597 + constructor(e3) { 598 + 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 }; 599 + let t2 = { other: m, block: E2.normal, inline: z.normal }; 600 + 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; 601 + } 602 + static get rules() { 603 + return { block: E2, inline: z }; 604 + } 605 + static lex(e3, t2) { 606 + return new u(t2).lex(e3); 607 + } 608 + static lexInline(e3, t2) { 609 + return new u(t2).inlineTokens(e3); 610 + } 611 + lex(e3) { 612 + e3 = e3.replace(m.carriageReturn, ` 613 + `), this.blockTokens(e3, this.tokens); 614 + for (let t2 = 0; t2 < this.inlineQueue.length; t2++) { 615 + let n = this.inlineQueue[t2]; 616 + this.inlineTokens(n.src, n.tokens); 617 + } 618 + return this.inlineQueue = [], this.tokens; 619 + } 620 + blockTokens(e3, t2 = [], n = false) { 621 + for (this.options.pedantic && (e3 = e3.replace(m.tabCharGlobal, " ").replace(m.spaceLine, "")); e3; ) { 622 + let r; 623 + 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; 624 + if (r = this.tokenizer.space(e3)) { 625 + e3 = e3.substring(r.raw.length); 626 + let s = t2.at(-1); 627 + r.raw.length === 1 && s !== void 0 ? s.raw += ` 628 + ` : t2.push(r); 629 + continue; 630 + } 631 + if (r = this.tokenizer.code(e3)) { 632 + e3 = e3.substring(r.raw.length); 633 + let s = t2.at(-1); 634 + s?.type === "paragraph" || s?.type === "text" ? (s.raw += (s.raw.endsWith(` 635 + `) ? "" : ` 636 + `) + r.raw, s.text += ` 637 + ` + r.text, this.inlineQueue.at(-1).src = s.text) : t2.push(r); 638 + continue; 639 + } 640 + if (r = this.tokenizer.fences(e3)) { 641 + e3 = e3.substring(r.raw.length), t2.push(r); 642 + continue; 643 + } 644 + if (r = this.tokenizer.heading(e3)) { 645 + e3 = e3.substring(r.raw.length), t2.push(r); 646 + continue; 647 + } 648 + if (r = this.tokenizer.hr(e3)) { 649 + e3 = e3.substring(r.raw.length), t2.push(r); 650 + continue; 651 + } 652 + if (r = this.tokenizer.blockquote(e3)) { 653 + e3 = e3.substring(r.raw.length), t2.push(r); 654 + continue; 655 + } 656 + if (r = this.tokenizer.list(e3)) { 657 + e3 = e3.substring(r.raw.length), t2.push(r); 658 + continue; 659 + } 660 + if (r = this.tokenizer.html(e3)) { 661 + e3 = e3.substring(r.raw.length), t2.push(r); 662 + continue; 663 + } 664 + if (r = this.tokenizer.def(e3)) { 665 + e3 = e3.substring(r.raw.length); 666 + let s = t2.at(-1); 667 + s?.type === "paragraph" || s?.type === "text" ? (s.raw += (s.raw.endsWith(` 668 + `) ? "" : ` 669 + `) + r.raw, s.text += ` 670 + ` + 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)); 671 + continue; 672 + } 673 + if (r = this.tokenizer.table(e3)) { 674 + e3 = e3.substring(r.raw.length), t2.push(r); 675 + continue; 676 + } 677 + if (r = this.tokenizer.lheading(e3)) { 678 + e3 = e3.substring(r.raw.length), t2.push(r); 679 + continue; 680 + } 681 + let i3 = e3; 682 + if (this.options.extensions?.startBlock) { 683 + let s = 1 / 0, a = e3.slice(1), o2; 684 + this.options.extensions.startBlock.forEach((l) => { 685 + o2 = l.call({ lexer: this }, a), typeof o2 == "number" && o2 >= 0 && (s = Math.min(s, o2)); 686 + }), s < 1 / 0 && s >= 0 && (i3 = e3.substring(0, s + 1)); 687 + } 688 + if (this.state.top && (r = this.tokenizer.paragraph(i3))) { 689 + let s = t2.at(-1); 690 + n && s?.type === "paragraph" ? (s.raw += (s.raw.endsWith(` 691 + `) ? "" : ` 692 + `) + r.raw, s.text += ` 693 + ` + 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); 694 + continue; 695 + } 696 + if (r = this.tokenizer.text(e3)) { 697 + e3 = e3.substring(r.raw.length); 698 + let s = t2.at(-1); 699 + s?.type === "text" ? (s.raw += (s.raw.endsWith(` 700 + `) ? "" : ` 701 + `) + r.raw, s.text += ` 702 + ` + r.text, this.inlineQueue.pop(), this.inlineQueue.at(-1).src = s.text) : t2.push(r); 703 + continue; 704 + } 705 + if (e3) { 706 + let s = "Infinite loop on byte: " + e3.charCodeAt(0); 707 + if (this.options.silent) { 708 + console.error(s); 709 + break; 710 + } else throw new Error(s); 711 + } 712 + } 713 + return this.state.top = true, t2; 714 + } 715 + inline(e3, t2 = []) { 716 + return this.inlineQueue.push({ src: e3, tokens: t2 }), t2; 717 + } 718 + inlineTokens(e3, t2 = []) { 719 + let n = e3, r = null; 720 + if (this.tokens.links) { 721 + let o2 = Object.keys(this.tokens.links); 722 + 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)); 723 + } 724 + for (; (r = this.tokenizer.rules.inline.anyPunctuation.exec(n)) != null; ) n = n.slice(0, r.index) + "++" + n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex); 725 + let i3; 726 + 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); 727 + n = this.options.hooks?.emStrongMask?.call({ lexer: this }, n) ?? n; 728 + let s = false, a = ""; 729 + for (; e3; ) { 730 + s || (a = ""), s = false; 731 + let o2; 732 + 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; 733 + if (o2 = this.tokenizer.escape(e3)) { 734 + e3 = e3.substring(o2.raw.length), t2.push(o2); 735 + continue; 736 + } 737 + if (o2 = this.tokenizer.tag(e3)) { 738 + e3 = e3.substring(o2.raw.length), t2.push(o2); 739 + continue; 740 + } 741 + if (o2 = this.tokenizer.link(e3)) { 742 + e3 = e3.substring(o2.raw.length), t2.push(o2); 743 + continue; 744 + } 745 + if (o2 = this.tokenizer.reflink(e3, this.tokens.links)) { 746 + e3 = e3.substring(o2.raw.length); 747 + let p = t2.at(-1); 748 + o2.type === "text" && p?.type === "text" ? (p.raw += o2.raw, p.text += o2.text) : t2.push(o2); 749 + continue; 750 + } 751 + if (o2 = this.tokenizer.emStrong(e3, n, a)) { 752 + e3 = e3.substring(o2.raw.length), t2.push(o2); 753 + continue; 754 + } 755 + if (o2 = this.tokenizer.codespan(e3)) { 756 + e3 = e3.substring(o2.raw.length), t2.push(o2); 757 + continue; 758 + } 759 + if (o2 = this.tokenizer.br(e3)) { 760 + e3 = e3.substring(o2.raw.length), t2.push(o2); 761 + continue; 762 + } 763 + if (o2 = this.tokenizer.del(e3, n, a)) { 764 + e3 = e3.substring(o2.raw.length), t2.push(o2); 765 + continue; 766 + } 767 + if (o2 = this.tokenizer.autolink(e3)) { 768 + e3 = e3.substring(o2.raw.length), t2.push(o2); 769 + continue; 770 + } 771 + if (!this.state.inLink && (o2 = this.tokenizer.url(e3))) { 772 + e3 = e3.substring(o2.raw.length), t2.push(o2); 773 + continue; 774 + } 775 + let l = e3; 776 + if (this.options.extensions?.startInline) { 777 + let p = 1 / 0, c = e3.slice(1), d; 778 + this.options.extensions.startInline.forEach((h) => { 779 + d = h.call({ lexer: this }, c), typeof d == "number" && d >= 0 && (p = Math.min(p, d)); 780 + }), p < 1 / 0 && p >= 0 && (l = e3.substring(0, p + 1)); 781 + } 782 + if (o2 = this.tokenizer.inlineText(l)) { 783 + e3 = e3.substring(o2.raw.length), o2.raw.slice(-1) !== "_" && (a = o2.raw.slice(-1)), s = true; 784 + let p = t2.at(-1); 785 + p?.type === "text" ? (p.raw += o2.raw, p.text += o2.text) : t2.push(o2); 786 + continue; 787 + } 788 + if (e3) { 789 + let p = "Infinite loop on byte: " + e3.charCodeAt(0); 790 + if (this.options.silent) { 791 + console.error(p); 792 + break; 793 + } else throw new Error(p); 794 + } 795 + } 796 + return t2; 797 + } 798 + }; 799 + var y = class { 800 + static { 801 + __name(this, "y"); 802 + } 803 + options; 804 + parser; 805 + constructor(e3) { 806 + this.options = e3 || T2; 807 + } 808 + space(e3) { 809 + return ""; 810 + } 811 + code({ text: e3, lang: t2, escaped: n }) { 812 + let r = (t2 || "").match(m.notSpaceStart)?.[0], i3 = e3.replace(m.endingNewline, "") + ` 813 + `; 814 + return r ? '<pre><code class="language-' + O(r) + '">' + (n ? i3 : O(i3, true)) + `</code></pre> 815 + ` : "<pre><code>" + (n ? i3 : O(i3, true)) + `</code></pre> 816 + `; 817 + } 818 + blockquote({ tokens: e3 }) { 819 + return `<blockquote> 820 + ${this.parser.parse(e3)}</blockquote> 821 + `; 822 + } 823 + html({ text: e3 }) { 824 + return e3; 825 + } 826 + def(e3) { 827 + return ""; 828 + } 829 + heading({ tokens: e3, depth: t2 }) { 830 + return `<h${t2}>${this.parser.parseInline(e3)}</h${t2}> 831 + `; 832 + } 833 + hr(e3) { 834 + return `<hr> 835 + `; 836 + } 837 + list(e3) { 838 + let t2 = e3.ordered, n = e3.start, r = ""; 839 + for (let a = 0; a < e3.items.length; a++) { 840 + let o2 = e3.items[a]; 841 + r += this.listitem(o2); 842 + } 843 + let i3 = t2 ? "ol" : "ul", s = t2 && n !== 1 ? ' start="' + n + '"' : ""; 844 + return "<" + i3 + s + `> 845 + ` + r + "</" + i3 + `> 846 + `; 847 + } 848 + listitem(e3) { 849 + return `<li>${this.parser.parse(e3.tokens)}</li> 850 + `; 851 + } 852 + checkbox({ checked: e3 }) { 853 + return "<input " + (e3 ? 'checked="" ' : "") + 'disabled="" type="checkbox"> '; 854 + } 855 + paragraph({ tokens: e3 }) { 856 + return `<p>${this.parser.parseInline(e3)}</p> 857 + `; 858 + } 859 + table(e3) { 860 + let t2 = "", n = ""; 861 + for (let i3 = 0; i3 < e3.header.length; i3++) n += this.tablecell(e3.header[i3]); 862 + t2 += this.tablerow({ text: n }); 863 + let r = ""; 864 + for (let i3 = 0; i3 < e3.rows.length; i3++) { 865 + let s = e3.rows[i3]; 866 + n = ""; 867 + for (let a = 0; a < s.length; a++) n += this.tablecell(s[a]); 868 + r += this.tablerow({ text: n }); 869 + } 870 + return r && (r = `<tbody>${r}</tbody>`), `<table> 871 + <thead> 872 + ` + t2 + `</thead> 873 + ` + r + `</table> 874 + `; 875 + } 876 + tablerow({ text: e3 }) { 877 + return `<tr> 878 + ${e3}</tr> 879 + `; 880 + } 881 + tablecell(e3) { 882 + let t2 = this.parser.parseInline(e3.tokens), n = e3.header ? "th" : "td"; 883 + return (e3.align ? `<${n} align="${e3.align}">` : `<${n}>`) + t2 + `</${n}> 884 + `; 885 + } 886 + strong({ tokens: e3 }) { 887 + return `<strong>${this.parser.parseInline(e3)}</strong>`; 888 + } 889 + em({ tokens: e3 }) { 890 + return `<em>${this.parser.parseInline(e3)}</em>`; 891 + } 892 + codespan({ text: e3 }) { 893 + return `<code>${O(e3, true)}</code>`; 894 + } 895 + br(e3) { 896 + return "<br>"; 897 + } 898 + del({ tokens: e3 }) { 899 + return `<del>${this.parser.parseInline(e3)}</del>`; 900 + } 901 + link({ href: e3, title: t2, tokens: n }) { 902 + let r = this.parser.parseInline(n), i3 = X(e3); 903 + if (i3 === null) return r; 904 + e3 = i3; 905 + let s = '<a href="' + e3 + '"'; 906 + return t2 && (s += ' title="' + O(t2) + '"'), s += ">" + r + "</a>", s; 907 + } 908 + image({ href: e3, title: t2, text: n, tokens: r }) { 909 + r && (n = this.parser.parseInline(r, this.parser.textRenderer)); 910 + let i3 = X(e3); 911 + if (i3 === null) return O(n); 912 + e3 = i3; 913 + let s = `<img src="${e3}" alt="${O(n)}"`; 914 + return t2 && (s += ` title="${O(t2)}"`), s += ">", s; 915 + } 916 + text(e3) { 917 + return "tokens" in e3 && e3.tokens ? this.parser.parseInline(e3.tokens) : "escaped" in e3 && e3.escaped ? e3.text : O(e3.text); 918 + } 919 + }; 920 + var $ = class { 921 + static { 922 + __name(this, "$"); 923 + } 924 + strong({ text: e3 }) { 925 + return e3; 926 + } 927 + em({ text: e3 }) { 928 + return e3; 929 + } 930 + codespan({ text: e3 }) { 931 + return e3; 932 + } 933 + del({ text: e3 }) { 934 + return e3; 935 + } 936 + html({ text: e3 }) { 937 + return e3; 938 + } 939 + text({ text: e3 }) { 940 + return e3; 941 + } 942 + link({ text: e3 }) { 943 + return "" + e3; 944 + } 945 + image({ text: e3 }) { 946 + return "" + e3; 947 + } 948 + br() { 949 + return ""; 950 + } 951 + checkbox({ raw: e3 }) { 952 + return e3; 953 + } 954 + }; 955 + var b = class u2 { 956 + static { 957 + __name(this, "u"); 958 + } 959 + options; 960 + renderer; 961 + textRenderer; 962 + constructor(e3) { 963 + 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 $(); 964 + } 965 + static parse(e3, t2) { 966 + return new u2(t2).parse(e3); 967 + } 968 + static parseInline(e3, t2) { 969 + return new u2(t2).parseInline(e3); 970 + } 971 + parse(e3) { 972 + let t2 = ""; 973 + for (let n = 0; n < e3.length; n++) { 974 + let r = e3[n]; 975 + if (this.options.extensions?.renderers?.[r.type]) { 976 + let s = r, a = this.options.extensions.renderers[s.type].call({ parser: this }, s); 977 + if (a !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "def", "paragraph", "text"].includes(s.type)) { 978 + t2 += a || ""; 979 + continue; 980 + } 981 + } 982 + let i3 = r; 983 + switch (i3.type) { 984 + case "space": { 985 + t2 += this.renderer.space(i3); 986 + break; 987 + } 988 + case "hr": { 989 + t2 += this.renderer.hr(i3); 990 + break; 991 + } 992 + case "heading": { 993 + t2 += this.renderer.heading(i3); 994 + break; 995 + } 996 + case "code": { 997 + t2 += this.renderer.code(i3); 998 + break; 999 + } 1000 + case "table": { 1001 + t2 += this.renderer.table(i3); 1002 + break; 1003 + } 1004 + case "blockquote": { 1005 + t2 += this.renderer.blockquote(i3); 1006 + break; 1007 + } 1008 + case "list": { 1009 + t2 += this.renderer.list(i3); 1010 + break; 1011 + } 1012 + case "checkbox": { 1013 + t2 += this.renderer.checkbox(i3); 1014 + break; 1015 + } 1016 + case "html": { 1017 + t2 += this.renderer.html(i3); 1018 + break; 1019 + } 1020 + case "def": { 1021 + t2 += this.renderer.def(i3); 1022 + break; 1023 + } 1024 + case "paragraph": { 1025 + t2 += this.renderer.paragraph(i3); 1026 + break; 1027 + } 1028 + case "text": { 1029 + t2 += this.renderer.text(i3); 1030 + break; 1031 + } 1032 + default: { 1033 + let s = 'Token with "' + i3.type + '" type was not found.'; 1034 + if (this.options.silent) return console.error(s), ""; 1035 + throw new Error(s); 1036 + } 1037 + } 1038 + } 1039 + return t2; 1040 + } 1041 + parseInline(e3, t2 = this.renderer) { 1042 + let n = ""; 1043 + for (let r = 0; r < e3.length; r++) { 1044 + let i3 = e3[r]; 1045 + if (this.options.extensions?.renderers?.[i3.type]) { 1046 + let a = this.options.extensions.renderers[i3.type].call({ parser: this }, i3); 1047 + if (a !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(i3.type)) { 1048 + n += a || ""; 1049 + continue; 1050 + } 1051 + } 1052 + let s = i3; 1053 + switch (s.type) { 1054 + case "escape": { 1055 + n += t2.text(s); 1056 + break; 1057 + } 1058 + case "html": { 1059 + n += t2.html(s); 1060 + break; 1061 + } 1062 + case "link": { 1063 + n += t2.link(s); 1064 + break; 1065 + } 1066 + case "image": { 1067 + n += t2.image(s); 1068 + break; 1069 + } 1070 + case "checkbox": { 1071 + n += t2.checkbox(s); 1072 + break; 1073 + } 1074 + case "strong": { 1075 + n += t2.strong(s); 1076 + break; 1077 + } 1078 + case "em": { 1079 + n += t2.em(s); 1080 + break; 1081 + } 1082 + case "codespan": { 1083 + n += t2.codespan(s); 1084 + break; 1085 + } 1086 + case "br": { 1087 + n += t2.br(s); 1088 + break; 1089 + } 1090 + case "del": { 1091 + n += t2.del(s); 1092 + break; 1093 + } 1094 + case "text": { 1095 + n += t2.text(s); 1096 + break; 1097 + } 1098 + default: { 1099 + let a = 'Token with "' + s.type + '" type was not found.'; 1100 + if (this.options.silent) return console.error(a), ""; 1101 + throw new Error(a); 1102 + } 1103 + } 1104 + } 1105 + return n; 1106 + } 1107 + }; 1108 + var P = class { 1109 + static { 1110 + __name(this, "P"); 1111 + } 1112 + options; 1113 + block; 1114 + constructor(e3) { 1115 + this.options = e3 || T2; 1116 + } 1117 + static passThroughHooks = /* @__PURE__ */ new Set(["preprocess", "postprocess", "processAllTokens", "emStrongMask"]); 1118 + static passThroughHooksRespectAsync = /* @__PURE__ */ new Set(["preprocess", "postprocess", "processAllTokens"]); 1119 + preprocess(e3) { 1120 + return e3; 1121 + } 1122 + postprocess(e3) { 1123 + return e3; 1124 + } 1125 + processAllTokens(e3) { 1126 + return e3; 1127 + } 1128 + emStrongMask(e3) { 1129 + return e3; 1130 + } 1131 + provideLexer() { 1132 + return this.block ? x.lex : x.lexInline; 1133 + } 1134 + provideParser() { 1135 + return this.block ? b.parse : b.parseInline; 1136 + } 1137 + }; 1138 + var B2 = class { 1139 + static { 1140 + __name(this, "B"); 1141 + } 1142 + defaults = M(); 1143 + options = this.setOptions; 1144 + parse = this.parseMarkdown(true); 1145 + parseInline = this.parseMarkdown(false); 1146 + Parser = b; 1147 + Renderer = y; 1148 + TextRenderer = $; 1149 + Lexer = x; 1150 + Tokenizer = w; 1151 + Hooks = P; 1152 + constructor(...e3) { 1153 + this.use(...e3); 1154 + } 1155 + walkTokens(e3, t2) { 1156 + let n = []; 1157 + for (let r of e3) switch (n = n.concat(t2.call(this, r)), r.type) { 1158 + case "table": { 1159 + let i3 = r; 1160 + for (let s of i3.header) n = n.concat(this.walkTokens(s.tokens, t2)); 1161 + for (let s of i3.rows) for (let a of s) n = n.concat(this.walkTokens(a.tokens, t2)); 1162 + break; 1163 + } 1164 + case "list": { 1165 + let i3 = r; 1166 + n = n.concat(this.walkTokens(i3.items, t2)); 1167 + break; 1168 + } 1169 + default: { 1170 + let i3 = r; 1171 + this.defaults.extensions?.childTokens?.[i3.type] ? this.defaults.extensions.childTokens[i3.type].forEach((s) => { 1172 + let a = i3[s].flat(1 / 0); 1173 + n = n.concat(this.walkTokens(a, t2)); 1174 + }) : i3.tokens && (n = n.concat(this.walkTokens(i3.tokens, t2))); 1175 + } 1176 + } 1177 + return n; 1178 + } 1179 + use(...e3) { 1180 + let t2 = this.defaults.extensions || { renderers: {}, childTokens: {} }; 1181 + return e3.forEach((n) => { 1182 + let r = { ...n }; 1183 + if (r.async = this.defaults.async || r.async || false, n.extensions && (n.extensions.forEach((i3) => { 1184 + if (!i3.name) throw new Error("extension name required"); 1185 + if ("renderer" in i3) { 1186 + let s = t2.renderers[i3.name]; 1187 + s ? t2.renderers[i3.name] = function(...a) { 1188 + let o2 = i3.renderer.apply(this, a); 1189 + return o2 === false && (o2 = s.apply(this, a)), o2; 1190 + } : t2.renderers[i3.name] = i3.renderer; 1191 + } 1192 + if ("tokenizer" in i3) { 1193 + if (!i3.level || i3.level !== "block" && i3.level !== "inline") throw new Error("extension level must be 'block' or 'inline'"); 1194 + let s = t2[i3.level]; 1195 + 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])); 1196 + } 1197 + "childTokens" in i3 && i3.childTokens && (t2.childTokens[i3.name] = i3.childTokens); 1198 + }), r.extensions = t2), n.renderer) { 1199 + let i3 = this.defaults.renderer || new y(this.defaults); 1200 + for (let s in n.renderer) { 1201 + if (!(s in i3)) throw new Error(`renderer '${s}' does not exist`); 1202 + if (["options", "parser"].includes(s)) continue; 1203 + let a = s, o2 = n.renderer[a], l = i3[a]; 1204 + i3[a] = (...p) => { 1205 + let c = o2.apply(i3, p); 1206 + return c === false && (c = l.apply(i3, p)), c || ""; 1207 + }; 1208 + } 1209 + r.renderer = i3; 1210 + } 1211 + if (n.tokenizer) { 1212 + let i3 = this.defaults.tokenizer || new w(this.defaults); 1213 + for (let s in n.tokenizer) { 1214 + if (!(s in i3)) throw new Error(`tokenizer '${s}' does not exist`); 1215 + if (["options", "rules", "lexer"].includes(s)) continue; 1216 + let a = s, o2 = n.tokenizer[a], l = i3[a]; 1217 + i3[a] = (...p) => { 1218 + let c = o2.apply(i3, p); 1219 + return c === false && (c = l.apply(i3, p)), c; 1220 + }; 1221 + } 1222 + r.tokenizer = i3; 1223 + } 1224 + if (n.hooks) { 1225 + let i3 = this.defaults.hooks || new P(); 1226 + for (let s in n.hooks) { 1227 + if (!(s in i3)) throw new Error(`hook '${s}' does not exist`); 1228 + if (["options", "block"].includes(s)) continue; 1229 + let a = s, o2 = n.hooks[a], l = i3[a]; 1230 + P.passThroughHooks.has(s) ? i3[a] = (p) => { 1231 + if (this.defaults.async && P.passThroughHooksRespectAsync.has(s)) return (async () => { 1232 + let d = await o2.call(i3, p); 1233 + return l.call(i3, d); 1234 + })(); 1235 + let c = o2.call(i3, p); 1236 + return l.call(i3, c); 1237 + } : i3[a] = (...p) => { 1238 + if (this.defaults.async) return (async () => { 1239 + let d = await o2.apply(i3, p); 1240 + return d === false && (d = await l.apply(i3, p)), d; 1241 + })(); 1242 + let c = o2.apply(i3, p); 1243 + return c === false && (c = l.apply(i3, p)), c; 1244 + }; 1245 + } 1246 + r.hooks = i3; 1247 + } 1248 + if (n.walkTokens) { 1249 + let i3 = this.defaults.walkTokens, s = n.walkTokens; 1250 + r.walkTokens = function(a) { 1251 + let o2 = []; 1252 + return o2.push(s.call(this, a)), i3 && (o2 = o2.concat(i3.call(this, a))), o2; 1253 + }; 1254 + } 1255 + this.defaults = { ...this.defaults, ...r }; 1256 + }), this; 1257 + } 1258 + setOptions(e3) { 1259 + return this.defaults = { ...this.defaults, ...e3 }, this; 1260 + } 1261 + lexer(e3, t2) { 1262 + return x.lex(e3, t2 ?? this.defaults); 1263 + } 1264 + parser(e3, t2) { 1265 + return b.parse(e3, t2 ?? this.defaults); 1266 + } 1267 + parseMarkdown(e3) { 1268 + return (n, r) => { 1269 + let i3 = { ...r }, s = { ...this.defaults, ...i3 }, a = this.onError(!!s.silent, !!s.async); 1270 + 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.")); 1271 + if (typeof n > "u" || n === null) return a(new Error("marked(): input parameter is undefined or null")); 1272 + if (typeof n != "string") return a(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n) + ", string expected")); 1273 + if (s.hooks && (s.hooks.options = s, s.hooks.block = e3), s.async) return (async () => { 1274 + 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; 1275 + s.walkTokens && await Promise.all(this.walkTokens(c, s.walkTokens)); 1276 + let h = await (s.hooks ? await s.hooks.provideParser() : e3 ? b.parse : b.parseInline)(c, s); 1277 + return s.hooks ? await s.hooks.postprocess(h) : h; 1278 + })().catch(a); 1279 + try { 1280 + s.hooks && (n = s.hooks.preprocess(n)); 1281 + let l = (s.hooks ? s.hooks.provideLexer() : e3 ? x.lex : x.lexInline)(n, s); 1282 + s.hooks && (l = s.hooks.processAllTokens(l)), s.walkTokens && this.walkTokens(l, s.walkTokens); 1283 + let c = (s.hooks ? s.hooks.provideParser() : e3 ? b.parse : b.parseInline)(l, s); 1284 + return s.hooks && (c = s.hooks.postprocess(c)), c; 1285 + } catch (o2) { 1286 + return a(o2); 1287 + } 1288 + }; 1289 + } 1290 + onError(e3, t2) { 1291 + return (n) => { 1292 + if (n.message += ` 1293 + Please report this to https://github.com/markedjs/marked.`, e3) { 1294 + let r = "<p>An error occurred:</p><pre>" + O(n.message + "", true) + "</pre>"; 1295 + return t2 ? Promise.resolve(r) : r; 1296 + } 1297 + if (t2) return Promise.reject(n); 1298 + throw n; 1299 + }; 1300 + } 1301 + }; 1302 + var L = new B2(); 1303 + function g(u3, e3) { 1304 + return L.parse(u3, e3); 1305 + } 1306 + __name(g, "g"); 1307 + g.options = g.setOptions = function(u3) { 1308 + return L.setOptions(u3), g.defaults = L.defaults, H(g.defaults), g; 1309 + }; 1310 + g.getDefaults = M; 1311 + g.defaults = T2; 1312 + g.use = function(...u3) { 1313 + return L.use(...u3), g.defaults = L.defaults, H(g.defaults), g; 1314 + }; 1315 + g.walkTokens = function(u3, e3) { 1316 + return L.walkTokens(u3, e3); 1317 + }; 1318 + g.parseInline = L.parseInline; 1319 + g.Parser = b; 1320 + g.parser = b.parse; 1321 + g.Renderer = y; 1322 + g.TextRenderer = $; 1323 + g.Lexer = x; 1324 + g.lexer = x.lex; 1325 + g.Tokenizer = w; 1326 + g.Hooks = P; 1327 + g.parse = g; 1328 + var Ut = g.options; 1329 + var Kt = g.setOptions; 1330 + var Wt = g.use; 1331 + var Xt = g.walkTokens; 1332 + var Jt = g.parseInline; 1333 + var Yt = b.parse; 1334 + var en = x.lex; 1335 + 1336 + // ../node_modules/.deno/lit-html@3.3.2/node_modules/lit-html/node/directives/unsafe-html.js 1337 + init_Buffer(); 1338 + init_process(); 1339 + var e2 = class extends i { 1340 + static { 1341 + __name(this, "e"); 1342 + } 1343 + constructor(i3) { 1344 + if (super(i3), this.it = A, i3.type !== t.CHILD) throw Error(this.constructor.directiveName + "() can only be used in child bindings"); 1345 + } 1346 + render(r) { 1347 + if (r === A || null == r) return this._t = void 0, this.it = r; 1348 + if (r === E) return r; 1349 + if ("string" != typeof r) throw Error(this.constructor.directiveName + "() called with a non-string value"); 1350 + if (r === this.it) return this._t; 1351 + this.it = r; 1352 + const s = [r]; 1353 + return s.raw = s, this._t = { _$litType$: this.constructor.resultType, strings: s, values: [] }; 1354 + } 1355 + }; 1356 + e2.directiveName = "unsafeHTML", e2.resultType = 1; 1357 + var o = e(e2); 1358 + 1359 + // facets/index.js 1360 + document.body.addEventListener( 1361 + "click", 1362 + /** 1363 + * @param {MouseEvent} event 1364 + */ 1365 + async (event) => { 1366 + const target = ( 1367 + /** @type {HTMLElement} */ 1368 + event.target 1369 + ); 1370 + const rel = target.getAttribute("rel"); 1371 + if (!rel) return; 1372 + const uri = target.closest("li")?.getAttribute("data-uri"); 1373 + if (!uri) return; 1374 + const name = target.closest("li")?.getAttribute("data-name"); 1375 + if (!name) return; 1376 + switch (rel) { 1377 + case "fork": { 1378 + const facet = await facetFromURI({ name, uri }, { fetchHTML: true }); 1379 + editFacet(facet); 1380 + document.querySelector("#build")?.scrollIntoView(); 1381 + break; 1382 + } 1383 + case "save": { 1384 + const facet = await facetFromURI({ name, uri }, { fetchHTML: false }); 1385 + const out = foundation_default.orchestrator.output(); 1386 + out.facets.save([ 1387 + ...out.facets.collection(), 1388 + facet 1389 + ]); 1390 + break; 1391 + } 1392 + } 1393 + } 1394 + ); 1395 + var listEl = document.querySelector("#list"); 1396 + if (!listEl) throw new Error("List element not found"); 1397 + var output = foundation_default.orchestrator.output(); 1398 + listEl.innerHTML = ""; 1399 + effect(() => { 1400 + const col = output.facets.collection().sort((a, b2) => { 1401 + return a.name.toLocaleLowerCase().localeCompare(b2.name.toLocaleLowerCase()); 1402 + }); 1403 + const state = output.facets.state(); 1404 + const h = col.length && state === "loaded" ? T` 1405 + <ul> 1406 + ${col.map( 1407 + (c) => i2( 1408 + c.id, 1409 + T` 1410 + <li> 1411 + <div style="position: relative;"> 1412 + <a href="facets/l/?id=${c.id}"> 1413 + ${c.name} 1414 + </a> 1415 + <button 1416 + class="button--fixed button--transparent" 1417 + popovertarget="facet-menu-col-${c.id}" 1418 + style="anchor-name: --facet-anchor-col-${c.id}; position: absolute; right: 0; top: 50%; transform: translateY(-50%);" 1419 + > 1420 + <i class="ph-fill ph-dots-three-circle"></i> 1421 + </button> 1422 + </div> 1423 + <div class="list-description"> 1424 + <div> 1425 + ${c.description?.trim().length ? o( 1426 + g.parse(c.description, { async: false }) 1427 + ) : A} 1428 + </div> 1429 + <div> 1430 + ${c.uri && !c.html ? T` 1431 + <span class="with-icon"> 1432 + <i class="ph-fill ph-binoculars"></i> 1433 + <span>Tracking the original <a href="${c.uri}">URI</a></span> 1434 + </span> 1435 + ` : T` 1436 + <span class="with-icon"> 1437 + <i class="ph-fill ph-code"></i> 1438 + <span>Custom code</span> 1439 + </span> 1440 + `} 1441 + </div> 1442 + </div> 1443 + 1444 + <!-- Dropdown Menu --> 1445 + <div 1446 + id="facet-menu-col-${c.id}" 1447 + class="dropdown" 1448 + style="position-anchor: --facet-anchor-col-${c.id}" 1449 + popover 1450 + > 1451 + <a href="facets/l/?id=${c.id}"> 1452 + <span class="with-icon"> 1453 + <i class="ph-fill ph-globe"></i> Open 1454 + </span> 1455 + </a> 1456 + <a @click="${() => editFacet(c)}"> 1457 + <span class="with-icon"> 1458 + <i class="ph-fill ph-cursor-text"></i> Edit 1459 + </span> 1460 + </a> 1461 + <a @click="${deleteFacet({ id: c.id })}"> 1462 + <span class="with-icon"> 1463 + <i class="ph-fill ph-eraser"></i> Delete 1464 + </span> 1465 + </a> 1466 + </div> 1467 + </li> 1468 + ` 1469 + ) 1470 + )} 1471 + </ul> 1472 + ` : state === "loaded" ? emptyFacetsList : T` 1473 + <div class="with-icon" style="font-size: var(--fs-sm);"> 1474 + <i class="ph-bold ph-spinner-gap"></i> 1475 + Loading items 1476 + </div> 1477 + `; 1478 + B(h, listEl); 1479 + }); 1480 + var emptyFacetsList = T` 1481 + <p style="margin-bottom: 0;"> 1482 + <i class="ph-fill ph-info"></i> You have not saved any facets yet. 1483 + </p> 1484 + `; 1485 + function deleteFacet({ id }) { 1486 + return () => { 1487 + const c = confirm("Are you sure you want to delete this facet?"); 1488 + if (!c) return; 1489 + output.facets.save( 1490 + output.facets.collection().filter((c2) => !(c2.id === id)) 1491 + ); 1492 + }; 1493 + } 1494 + __name(deleteFacet, "deleteFacet"); 1495 + var $editingFacet = signal( 1496 + /** @type {Facet | null} */ 1497 + null 1498 + ); 1499 + var editorContainer = document.body.querySelector("#html-input-container"); 1500 + if (!editorContainer) throw new Error("Editor container not found"); 1501 + var editor = new EditorView({ 1502 + parent: editorContainer, 1503 + doc: ` 1504 + <main> 1505 + <h1 id="now-playing"> 1506 + Waiting on tracks &amp; queue to load ... 1507 + </h1> 1508 + </main> 1509 + 1510 + <style> 1511 + @import "./styles/base.css"; 1512 + @import "./styles/diffuse/page.css"; 1513 + </style> 1514 + 1515 + <script type="module"> 1516 + import foundation from "@diffuse/foundation"; 1517 + import { effect } from "./common/signal.js"; 1518 + 1519 + const components = foundation.features.fillQueueAutomatically(); 1520 + const myHtmlElement = document.querySelector("#now-playing"); 1521 + 1522 + effect(() => { 1523 + const now = components.engine.queue.now(); 1524 + const currentlyPlaying = now ? components.orchestrator.output.tracks.collection().find(t => t.id === now.id) : undefined; 1525 + if (currentlyPlaying && myHtmlElement) { 1526 + myHtmlElement.innerText = \`\${currentlyPlaying.tags.artist} - \${currentlyPlaying.tags.title}\`; 1527 + } 1528 + }) 1529 + <\/script> 1530 + `.trim(), 1531 + extensions: [ 1532 + basicSetup, 1533 + html(), 1534 + css(), 1535 + javascript(), 1536 + autocompletion() 1537 + ] 1538 + }); 1539 + document.querySelector("#build-form")?.addEventListener( 1540 + "submit", 1541 + onBuildSubmit 1542 + ); 1543 + async function onBuildSubmit(event) { 1544 + event.preventDefault(); 1545 + const nameEl = ( 1546 + /** @type {HTMLInputElement | null} */ 1547 + document.querySelector( 1548 + "#name-input" 1549 + ) 1550 + ); 1551 + const descriptionEl = ( 1552 + /** @type {HTMLTextAreaElement | null} */ 1553 + document.querySelector("#description-input") 1554 + ); 1555 + const html2 = editor.state.doc.toString(); 1556 + const cid = await create(85, new TextEncoder().encode(html2)); 1557 + const name = nameEl?.value ?? "nameless"; 1558 + const description = descriptionEl?.value ?? ""; 1559 + const facet = $editingFacet.value ? { 1560 + ...$editingFacet.value, 1561 + cid, 1562 + description, 1563 + html: html2, 1564 + name 1565 + } : { 1566 + $type: "sh.diffuse.output.facet", 1567 + id: now(), 1568 + cid, 1569 + description, 1570 + html: html2, 1571 + name 1572 + }; 1573 + switch ( 1574 + /** @type {any} */ 1575 + event.submitter.name 1576 + ) { 1577 + case "save": 1578 + await saveFacet(facet); 1579 + break; 1580 + case "save+open": 1581 + await saveFacet(facet); 1582 + globalThis.open(`./facets/l/?id=${facet.id}`, "blank"); 1583 + break; 1584 + } 1585 + } 1586 + __name(onBuildSubmit, "onBuildSubmit"); 1587 + async function editFacet(ogFacet) { 1588 + const facet = { ...ogFacet }; 1589 + const nameEl = ( 1590 + /** @type {HTMLInputElement | null} */ 1591 + document.querySelector( 1592 + "#name-input" 1593 + ) 1594 + ); 1595 + const descriptionEl = ( 1596 + /** @type {HTMLTextAreaElement | null} */ 1597 + document.querySelector("#description-input") 1598 + ); 1599 + if (!nameEl) return; 1600 + document.querySelector("#build")?.scrollIntoView(); 1601 + if (!facet.html && facet.uri) { 1602 + const html2 = await loadURI(facet.uri); 1603 + const cid = await create(85, new TextEncoder().encode(html2)); 1604 + facet.html = html2; 1605 + facet.cid = cid; 1606 + } 1607 + $editingFacet.value = facet; 1608 + nameEl.value = facet.name; 1609 + if (descriptionEl) { 1610 + descriptionEl.value = facet.description ?? ""; 1611 + } 1612 + editor.dispatch({ 1613 + changes: { from: 0, to: editor.state.doc.length, insert: facet.html } 1614 + }); 1615 + } 1616 + __name(editFacet, "editFacet"); 1617 + async function saveFacet(facet) { 1618 + const col = output.facets.collection(); 1619 + const colWithoutId = col.filter((c) => c.id !== facet.id); 1620 + await output.facets.save([...colWithoutId, { 1621 + ...facet, 1622 + updatedAt: (/* @__PURE__ */ new Date()).toISOString() 1623 + }]); 1624 + } 1625 + __name(saveFacet, "saveFacet"); 1626 + /*! Bundled license information: 1627 + 1628 + lit-html/node/directives/unsafe-html.js: 1629 + (** 1630 + * @license 1631 + * Copyright 2017 Google LLC 1632 + * SPDX-License-Identifier: BSD-3-Clause 1633 + *) 1634 + */ 1635 + 1636 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/facets/index.js.map
··· 1 + ../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/facets/index.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/facets/l/index.html
··· 1 + ../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/facets/l/index.html
+86
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/facets/l/index.js
··· 1 + import { 2 + foundation_default 3 + } from "../../chunk-JEB4WIQV.js"; 4 + import "../../chunk-G4P4YFWD.js"; 5 + import "../../chunk-6JNRNMZQ.js"; 6 + import "../../chunk-UMMPFCLQ.js"; 7 + import "../../chunk-PKN6FN7E.js"; 8 + import "../../chunk-NP7LZHKR.js"; 9 + import "../../chunk-M2MAFKPM.js"; 10 + import "../../chunk-YV3SRJQF.js"; 11 + import "../../chunk-MVUUUQRL.js"; 12 + import "../../chunk-ESYALJPH.js"; 13 + import "../../chunk-U5LVPDQM.js"; 14 + import "../../chunk-HC6LITPW.js"; 15 + import "../../chunk-6KMZB5IA.js"; 16 + import "../../chunk-XGM6M423.js"; 17 + import "../../chunk-B63ZUKFI.js"; 18 + import "../../chunk-TXU4RB3O.js"; 19 + import "../../chunk-3ENCKNXO.js"; 20 + import "../../chunk-OIRYE7B4.js"; 21 + import "../../chunk-3AO35WC3.js"; 22 + import "../../chunk-JBHW662S.js"; 23 + import "../../chunk-GX3WPNEX.js"; 24 + import "../../chunk-FJBTJV3K.js"; 25 + import "../../chunk-PTVB4Y37.js"; 26 + import "../../chunk-HN4F5JEZ.js"; 27 + import "../../chunk-NBQPHQFP.js"; 28 + import "../../chunk-QERJLR3Q.js"; 29 + import "../../chunk-OBWEBS4T.js"; 30 + import "../../chunk-S6SMX4HA.js"; 31 + import "../../chunk-XRGLBUX4.js"; 32 + import "../../chunk-R3EQQDW5.js"; 33 + import "../../chunk-GQIBEDKG.js"; 34 + import "../../chunk-DDF5P57I.js"; 35 + import "../../chunk-EEUCFWD4.js"; 36 + import "../../chunk-6DRHTH2U.js"; 37 + import "../../chunk-TSYF7OPM.js"; 38 + import "../../chunk-GCLDJKYV.js"; 39 + import "../../chunk-KJFA7KRK.js"; 40 + import "../../chunk-HMBZONBJ.js"; 41 + import "../../chunk-6CB2LXND.js"; 42 + import "../../chunk-V7EQPFPD.js"; 43 + import "../../chunk-G56PUJUJ.js"; 44 + import "../../chunk-6DKPDMFE.js"; 45 + import "../../chunk-TP5GZFTO.js"; 46 + import "../../chunk-ZQZJJU3T.js"; 47 + import { 48 + createLoader 49 + } from "../../chunk-X6J7NMRW.js"; 50 + import "../../chunk-WN6GL63Q.js"; 51 + import "../../chunk-CRZ7HJJ4.js"; 52 + import "../../chunk-242LG3VP.js"; 53 + import "../../chunk-BKRD2ZIW.js"; 54 + import "../../chunk-HNJPKCUJ.js"; 55 + import "../../chunk-4YB6QUPN.js"; 56 + import "../../chunk-SGR5ST3A.js"; 57 + import { 58 + __name, 59 + init_Buffer, 60 + init_process 61 + } from "../../chunk-FZQXS3RE.js"; 62 + 63 + // facets/l/index.js 64 + init_Buffer(); 65 + init_process(); 66 + createLoader({ 67 + $type: "sh.diffuse.output.facet", 68 + label: "Facet", 69 + source: /* @__PURE__ */ __name(() => { 70 + const output = foundation_default.orchestrator.output(); 71 + return output.facets; 72 + }, "source"), 73 + render(facet) { 74 + const container = ( 75 + /** @type {HTMLDivElement} */ 76 + document.querySelector("#container") 77 + ); 78 + const range = document.createRange(); 79 + range.selectNode(container); 80 + const documentFragment = range.createContextualFragment(facet.html ?? ""); 81 + container.innerHTML = ""; 82 + container.append(documentFragment); 83 + } 84 + }); 85 + 86 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/facets/l/index.js.map
··· 1 + ../../../bafybeih26nbu4qfpdxtsnmdgp64bgrwdzhk5imx6nqiqsdut6nf4bhcuve/facets/l/index.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/facets/tools/auto-queue.html.txt
··· 1 + ../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/facets/tools/auto-queue.html.txt
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/facets/tools/v3-import.html.txt
··· 1 + ../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/facets/tools/v3-import.html.txt
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/favicon-16x16.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/favicon-16x16.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/favicon-32x32.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/favicon-32x32.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/favicon.ico
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/favicon.ico
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/fonts/CommitMonoVariable.woff2
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/fonts/CommitMonoVariable.woff2
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/fonts/InterVariable-Italic.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/fonts/InterVariable-Italic.woff2
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/fonts/InterVariable.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/fonts/InterVariable.woff2
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/fonts/ms_sans_serif.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif.woff2
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/fonts/ms_sans_serif_bold.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif_bold.woff2
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/1.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/1.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/10.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/10.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/11.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/11.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/12.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/12.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/13.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/13.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/14.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/14.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/15.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/15.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/16.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/16.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/17.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/17.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/18.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/18.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/19.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/19.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/2.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/2.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/20.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/20.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/21.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/21.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/22.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/22.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/23.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/23.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/24.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/24.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/25.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/25.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/26.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/26.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/27.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/27.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/28.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/28.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/29.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/29.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/3.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/3.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/30.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/30.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/4.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/4.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/5.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/5.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/6.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/6.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/7.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/7.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/8.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/8.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/9.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/9.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/1.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/1.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/10.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/10.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/11.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/11.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/12.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/12.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/13.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/13.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/14.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/14.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/15.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/15.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/16.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/16.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/17.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/17.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/18.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/18.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/19.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/19.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/2.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/2.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/20.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/20.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/21.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/21.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/22.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/22.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/23.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/23.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/24.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/24.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/25.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/25.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/26.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/26.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/27.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/27.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/28.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/28.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/29.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/29.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/3.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/3.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/30.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/30.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/4.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/4.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/5.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/5.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/6.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/6.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/7.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/7.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/8.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/8.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/background/thumbnails/9.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/9.jpg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/diffuse-current.svg
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/diffuse-current.svg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/diffuse-dark.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse-dark.svg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/diffuse-grey.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse-grey.svg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/diffuse-light.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse-light.svg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/diffuse__icon-dark.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse__icon-dark.svg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/diffuse__icon-grey.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse__icon-grey.svg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/diffuse__icon-light.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse__icon-light.svg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icon-square-ws.png
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/icon-square-ws.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icon-square.png
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/icon-square.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icon.png
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/icon.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/catalog-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/catalog-1.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/cd_audio_cd_a-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/cd_audio_cd_a-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-2.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/cd_audio_cd_a-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-3.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/cd_audio_cd_a-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-4.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/cd_drive-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_drive-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/cd_drive_purple-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_drive_purple-3.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/channels-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/channels-2.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/check-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/check-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/computer_sound-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/computer_sound-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/computer_user_pencil-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/computer_user_pencil-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/connected_world-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/connected_world-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/directory_admin_tools-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_admin_tools-3.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/directory_admin_tools-5.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_admin_tools-5.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/directory_channels-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_channels-2.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/directory_channels-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_channels-3.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/directory_closed-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_closed-3.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/directory_closed-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_closed-4.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/directory_control_panel-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_control_panel-2.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/directory_control_panel-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_control_panel-3.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/directory_explorer-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_explorer-4.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/directory_explorer-5.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_explorer-5.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/directory_favorites-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_favorites-2.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/directory_favorites-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_favorites-4.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/directory_net_web-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_net_web-3.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/directory_net_web-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_net_web-4.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/directory_network_conn-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_network_conn-3.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/directory_network_conn-5.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_network_conn-5.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/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/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/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/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/gears-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/gears-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/globe_map-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/globe_map-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/help_book_big-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/help_book_big-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/installer-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/installer-3.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/installer_generic_old-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/installer_generic_old-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/keys-5.png
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/images/icons/windows_98/keys-5.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/loudspeaker_wave-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/loudspeaker_wave-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/magnifying_glass-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/magnifying_glass-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/magnifying_glass_4-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/magnifying_glass_4-1.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/media_player-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/media_player-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/media_player_stream_no.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/media_player_stream_no.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/ms_dos-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/ms_dos-1.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/msg_error-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_error-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/msg_information-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_information-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/msg_question-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_question-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/msg_warning-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_warning-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/multimedia-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/multimedia-4.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/network_drive_world-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/network_drive_world-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/no-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/no-1.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/restrict-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/restrict-1.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/search_computer-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/search_computer-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/search_server-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/search_server-1.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/search_web-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/search_web-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/settings_gear-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/settings_gear-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/settings_gear-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/settings_gear-2.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/tip.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/tip.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/utopia_smiley.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/utopia_smiley.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/winamp2-32x32.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/winamp2-32x32.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/windows-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/windows-0.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/world-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/world-2.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/world-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/world-4.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/images/icons/windows_98/world_network_directories-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/world_network_directories-3.png
+535
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/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/opensubsonic/element.js">Opensubsonic</a> 294 + <div class="list-description">Add any (open)subsonic server.</div> 295 + </li> 296 + <li> 297 + <a href="components/input/https/element.js">HTTPS</a> 298 + <div class="list-description">HTTPS URLs to audio files or streams.</div> 299 + </li> 300 + <li> 301 + <span class="todo">[todo]</span> 302 + <span>HTTPS (JSON)</span> 303 + <div class="list-description">Generate tracks based on HTTPS servers that provide JSON (directory) listings.</div> 304 + </li> 305 + <li> 306 + <a href="components/input/s3/element.js">S3</a> 307 + <div class="list-description">AWS S3 and services that provide the same surface API such as Cloudflare R2.</div> 308 + </li> 309 + <li> 310 + <span class="todo">[todo]</span> 311 + <span>WebDAV</span> 312 + <div class="list-description">Add any WebDAV server.</div> 313 + </li> 314 + </ul> 315 + 316 + </div> 317 + 318 + 319 + <div class="element"> 320 + <h3>Orchestrators</h3> 321 + 322 + <p> 323 + <em> 324 + 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. 325 + </em> 326 + </p> 327 + 328 + <ul> 329 + <li> 330 + <a href="components/orchestrator/auto-queue/element.js">Automatic queue</a> 331 + <div class="list-description">Fill the queue automatically with non-manual items (shuffled or regular, based on repeat-shuffle engine).</div> 332 + </li> 333 + <li> 334 + <a href="components/orchestrator/favourites/element.js">Favourites</a> 335 + <div class="list-description">Mark tracks as favourites. Automatically creates an unordered 'Favourites' playlist.</div> 336 + </li> 337 + <li> 338 + <a href="components/orchestrator/input/element.js">Input</a> 339 + <div class="list-description"><strong>A default input configuration.</strong> Contains all the inputs provided here.</div> 340 + </li> 341 + <li> 342 + <a href="components/orchestrator/media-session/element.js">Media Session</a> 343 + <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> 344 + </li> 345 + <li> 346 + <a href="components/orchestrator/output/element.js">Output</a> 347 + <div class="list-description"><strong>A default output configuration.</strong> Contains all the outputs provided here along with the relevant transformers.</div> 348 + </li> 349 + <li> 350 + <a href="components/orchestrator/process-tracks/element.js">Process inputs into tracks</a> 351 + <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> 352 + </li> 353 + <li> 354 + <a href="components/orchestrator/queue-audio/element.js">Queue ⭤ Audio</a> 355 + <div class="list-description">Connects the given queue engine to the given audio engine.</div> 356 + </li> 357 + <li> 358 + <a href="components/orchestrator/sources/element.js">Sources</a> 359 + <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> 360 + </li> 361 + <li> 362 + <a href="components/orchestrator/scoped-tracks/element.js">Scoped Tracks</a> 363 + <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> 364 + </li> 365 + </ul> 366 + 367 + </div> 368 + 369 + 370 + <div class="element"> 371 + <h3>Output</h3> 372 + 373 + <p> 374 + <em> 375 + 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. 376 + </em> 377 + </p> 378 + 379 + <ul> 380 + <li> 381 + <a href="components/output/polymorphic/indexed-db/element.js">Polymorphic / IndexedDB</a> 382 + <div class="list-description">Stores output into the local indexedDB. Supports any type of data that indexedDB supports.</div> 383 + </li> 384 + <li> 385 + <a href="components/output/bytes/s3/element.js">Bytes / S3</a> 386 + <div class="list-description">Store output data on AWS S3 or compatible services such as Cloudflare R2.</div> 387 + </li> 388 + <li> 389 + <a href="components/output/raw/atproto/element.js">Raw / AT Protocol</a> 390 + <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> 391 + </li> 392 + </ul> 393 + 394 + </div> 395 + 396 + 397 + <div class="element"> 398 + <h3>Processors</h3> 399 + 400 + <p> 401 + <em> 402 + These elements work with the output generated by the input elements to add more data to them, or process them in some other way. 403 + </em> 404 + </p> 405 + 406 + <ul> 407 + <li> 408 + <a href="components/processor/artwork/element.js">Artwork</a> 409 + <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> 410 + </li> 411 + <li> 412 + <a href="components/processor/metadata/element.js">Metadata</a> 413 + <div class="list-description">Fetch audio metadata for a given set of tracks, adding to the <code>Track</code> object.</div> 414 + </li> 415 + <li> 416 + <a href="components/processor/search/element.js">Search</a> 417 + <div class="list-description">Provides a way to search through a collection of tracks, powered by orama.js</div> 418 + </li> 419 + </ul> 420 + 421 + </div> 422 + 423 + 424 + <div class="element"> 425 + <h3>Supplements</h3> 426 + 427 + <p> 428 + <em> 429 + Additional elements, such as scrobblers. 430 + </em> 431 + </p> 432 + 433 + <ul> 434 + <li> 435 + <span class="todo">[todo]</span> 436 + <span>Last.fm scrobbler</span> 437 + </li> 438 + <li> 439 + <span class="todo">[todo]</span> 440 + <span>ListenBrainz scrobbler</span> 441 + </li> 442 + <li> 443 + <span class="todo">[todo]</span> 444 + <span>Rocksky scrobbler</span> 445 + </li> 446 + <li> 447 + <span class="todo">[todo]</span> 448 + <span>Teal.fm scrobbler</span> 449 + </li> 450 + </ul> 451 + 452 + </div> 453 + 454 + 455 + <div class="element"> 456 + <h3>Transformers</h3> 457 + 458 + <p> 459 + <em> 460 + 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. 461 + </em> 462 + </p> 463 + 464 + <ul> 465 + <li> 466 + <a href="components/transformer/output/bytes/automerge/element.js">Output / Bytes / Automerge</a> 467 + <div class="list-description">Translate data to and from an Automerge CRDT.</div> 468 + </li> 469 + <li> 470 + <span class="todo">[todo]</span> 471 + <span>Output / Bytes / Cambria lenses</span> 472 + <div class="list-description">Uses the Cambria library to seamlessly translate between data schemas so that no data migration is needed.</div> 473 + </li> 474 + <li> 475 + <a href="components/transformer/output/bytes/json/element.js">Output / Bytes / JSON</a> 476 + <div class="list-description">Raw data schema output ⇄ JSON Uint8Array.</div> 477 + </li> 478 + <li> 479 + <a href="components/transformer/output/raw/atproto-sync/element.js">Output / Raw / AT Protocol Sync</a> 480 + <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> 481 + </li> 482 + <li> 483 + <a href="components/transformer/output/refiner/default/element.js">Output / Refiner / Default</a> 484 + <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> 485 + </li> 486 + <li> 487 + <a href="components/transformer/output/string/json/element.js">Output / String / JSON</a> 488 + <div class="list-description">Raw data schema output ⇄ JSON UTF8 string.</div> 489 + </li> 490 + </ul> 491 + 492 + </div> 493 + 494 + </div> 495 + </section> 496 + 497 + <!-- DEFINITIONS --> 498 + <section> 499 + <h2 id="definitions">Definitions</h2> 500 + 501 + <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> 502 + 503 + <ul> 504 + <li> 505 + <a href="definitions/output/facet.json">Output / Facet</a> 506 + <div class="list-description">Facet pointer or HTML snippet.</div> 507 + </li> 508 + <li> 509 + <a href="definitions/output/playlistItem.json">Output / Playlist Item</a> 510 + <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> 511 + </li> 512 + <li> 513 + <span class="todo">[todo]</span> 514 + <span>Output / Progress</span> 515 + <div class="list-description">Used to track progress of (long) audio playback.</div> 516 + </li> 517 + <li> 518 + <a href="definitions/output/theme.json">Output / Theme</a> 519 + <div class="list-description">Theme pointer or HTML snippet.</div> 520 + </li> 521 + <li> 522 + <a href="definitions/output/track.json">Output / Track</a> 523 + <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> 524 + </li> 525 + <li> 526 + <a href="definitions/output/trackBundle.json">Output / Track Bundle</a> 527 + <div class="list-description">A bundle of tracks.</div> 528 + </li> 529 + </ul> 530 + 531 + </section> 532 + </main> 533 + 534 + </body> 535 + </html>
+136
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/index.js
··· 1 + import { 2 + GROUP 3 + } from "./chunk-JEB4WIQV.js"; 4 + import "./chunk-G4P4YFWD.js"; 5 + import { 6 + element_default as element_default4 7 + } from "./chunk-6JNRNMZQ.js"; 8 + import "./chunk-UMMPFCLQ.js"; 9 + import "./chunk-PKN6FN7E.js"; 10 + import "./chunk-NP7LZHKR.js"; 11 + import "./chunk-M2MAFKPM.js"; 12 + import "./chunk-YV3SRJQF.js"; 13 + import "./chunk-MVUUUQRL.js"; 14 + import "./chunk-ESYALJPH.js"; 15 + import "./chunk-U5LVPDQM.js"; 16 + import { 17 + element_default as element_default3 18 + } from "./chunk-HC6LITPW.js"; 19 + import "./chunk-6KMZB5IA.js"; 20 + import "./chunk-XGM6M423.js"; 21 + import "./chunk-B63ZUKFI.js"; 22 + import { 23 + element_default as element_default5 24 + } from "./chunk-TXU4RB3O.js"; 25 + import "./chunk-3ENCKNXO.js"; 26 + import { 27 + element_default as element_default2 28 + } from "./chunk-OIRYE7B4.js"; 29 + import "./chunk-3AO35WC3.js"; 30 + import "./chunk-JBHW662S.js"; 31 + import "./chunk-GX3WPNEX.js"; 32 + import "./chunk-FJBTJV3K.js"; 33 + import "./chunk-PTVB4Y37.js"; 34 + import "./chunk-HN4F5JEZ.js"; 35 + import "./chunk-NBQPHQFP.js"; 36 + import "./chunk-QERJLR3Q.js"; 37 + import "./chunk-OBWEBS4T.js"; 38 + import "./chunk-S6SMX4HA.js"; 39 + import "./chunk-XRGLBUX4.js"; 40 + import "./chunk-R3EQQDW5.js"; 41 + import "./chunk-GQIBEDKG.js"; 42 + import "./chunk-DDF5P57I.js"; 43 + import "./chunk-EEUCFWD4.js"; 44 + import "./chunk-6DRHTH2U.js"; 45 + import "./chunk-TSYF7OPM.js"; 46 + import { 47 + element_default 48 + } from "./chunk-GCLDJKYV.js"; 49 + import "./chunk-KJFA7KRK.js"; 50 + import "./chunk-HMBZONBJ.js"; 51 + import "./chunk-6CB2LXND.js"; 52 + import "./chunk-V7EQPFPD.js"; 53 + import "./chunk-G56PUJUJ.js"; 54 + import "./chunk-6DKPDMFE.js"; 55 + import "./chunk-TP5GZFTO.js"; 56 + import "./chunk-ZQZJJU3T.js"; 57 + import "./chunk-BKRD2ZIW.js"; 58 + import "./chunk-HNJPKCUJ.js"; 59 + import "./chunk-SGR5ST3A.js"; 60 + import { 61 + __name, 62 + init_Buffer, 63 + init_process 64 + } from "./chunk-FZQXS3RE.js"; 65 + 66 + // index.js 67 + init_Buffer(); 68 + init_process(); 69 + var s3 = new element_default2(); 70 + var input = new element_default(); 71 + input.setAttribute("group", GROUP); 72 + input.append(s3); 73 + var output = new element_default3(); 74 + output.setAttribute("group", GROUP); 75 + var metadataProcessor = new element_default4(); 76 + metadataProcessor.setAttribute("group", GROUP); 77 + document.body.append(input, output, metadataProcessor); 78 + var pto = new element_default5(); 79 + pto.setAttribute("group", GROUP); 80 + pto.setAttribute("input-selector", input.selector); 81 + pto.setAttribute("output-selector", output.selector); 82 + pto.setAttribute("metadata-processor-selector", metadataProcessor.selector); 83 + document.body.append(pto); 84 + var addDemoBtn = document.querySelector("#add-sample-content"); 85 + async function addSampleContent() { 86 + if (!addDemoBtn) return; 87 + addDemoBtn.setAttribute("disabled", ""); 88 + addDemoBtn.innerHTML = `<span> 89 + <i class="ph-fill ph-hourglass-medium"></i> 90 + Adding source 91 + </span>`; 92 + const demo = await s3.demo(); 93 + await output.tracks.loaded(); 94 + addDemoBtn.innerHTML = `<span> 95 + <i class="ph-fill ph-hourglass-medium"></i> 96 + Processing source 97 + </span>`; 98 + await output.tracks.save([...output.tracks.collection(), demo.track]); 99 + await pto.process(); 100 + addDemoBtn.innerHTML = `<span> 101 + <i class="ph-fill ph-check-fat"></i> Added 102 + </span>`; 103 + } 104 + __name(addSampleContent, "addSampleContent"); 105 + addDemoBtn?.addEventListener("click", addSampleContent); 106 + if (document.location.hostname.endsWith("diffuse.sh")) { 107 + document.querySelectorAll("#status").forEach(async (status) => { 108 + const versionOrCid = document.location.pathname.slice(1).split("/")[0]?.toLowerCase() ?? ""; 109 + const usesCid = versionOrCid.startsWith("bafy"); 110 + const { default: artifacts } = await import(`${document.location.origin}/artifacts.json`, { with: { type: "json" } }); 111 + const lastArtifact = Object.values(artifacts).reverse()[0]; 112 + const isLatest = usesCid ? versionOrCid === lastArtifact.cid : versionOrCid === lastArtifact.version; 113 + status.querySelectorAll(".ph-spinner").forEach((icon) => { 114 + icon.parentElement?.classList.add("hidden"); 115 + setTimeout(() => { 116 + icon.parentElement?.classList.remove("animate-spin"); 117 + icon.classList.remove("ph-spinner"); 118 + icon.classList.add("ph-arrow-fat-lines-up"); 119 + }, 500); 120 + }); 121 + status.querySelectorAll(`[href="/latest/"]`).forEach((a) => { 122 + if (usesCid) a.setAttribute("href", "/latest/hash/"); 123 + if (!isLatest) { 124 + setTimeout(() => { 125 + a.classList.remove("hidden"); 126 + }, 750); 127 + } 128 + }); 129 + }); 130 + } else { 131 + document.querySelectorAll("#status").forEach((status) => { 132 + status.remove(); 133 + }); 134 + } 135 + 136 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/index.js.map
··· 1 + ../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/index.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/mstile-150x150.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/mstile-150x150.png
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/node_crypto-QYMDOTAM.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/node_crypto-QYMDOTAM.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/node_crypto-QYMDOTAM.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/node_crypto-QYMDOTAM.js.map
+12
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/oauth-client-metadata.json
··· 1 + { 2 + "client_id": "https://elements.diffuse.sh/oauth-client-metadata.json", 3 + "client_name": "Diffuse", 4 + "client_uri": "https://elements.diffuse.sh", 5 + "redirect_uris": ["https://elements.diffuse.sh/oauth/callback"], 6 + "scope": "atproto repo?collection=sh.diffuse.output.facet&collection=sh.diffuse.output.playlistItem&collection=sh.diffuse.output.theme&collection=sh.diffuse.output.track&collection=sh.diffuse.output.trackBundle", 7 + "grant_types": ["authorization_code", "refresh_token"], 8 + "response_types": ["code"], 9 + "token_endpoint_auth_method": "none", 10 + "application_type": "web", 11 + "dpop_bound_access_tokens": true 12 + }
+12
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/oauth-client-metadata.tunnel.json
··· 1 + { 2 + "client_id": "https://handed-pixels-solo-folks.trycloudflare.com/oauth-client-metadata.tunnel.json", 3 + "client_name": "Diffuse", 4 + "client_uri": "https://handed-pixels-solo-folks.trycloudflare.com", 5 + "redirect_uris": ["https://handed-pixels-solo-folks.trycloudflare.com/oauth/callback"], 6 + "scope": "atproto repo?collection=sh.diffuse.output.facet&collection=sh.diffuse.output.playlistItem&collection=sh.diffuse.output.theme&collection=sh.diffuse.output.track&collection=sh.diffuse.output.trackBundle", 7 + "grant_types": ["authorization_code", "refresh_token"], 8 + "response_types": ["code"], 9 + "token_endpoint_auth_method": "none", 10 + "application_type": "web", 11 + "dpop_bound_access_tokens": true 12 + }
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/oauth/callback/index.html
··· 1 + ../../../bafybeiauzef62425mum6ztycx7plxmceagc2pjl4uck4h2q6qjds3ahe2u/oauth/callback/index.html
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/oauth/callback/index.js
··· 1 + ../../../bafybeifzg2vr4j7pvtjsr5jbyswboxepndwv4tzkqwzc72k4xck7oaozii/oauth/callback/index.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/oauth/callback/index.js.map
··· 1 + ../../../bafybeifzg2vr4j7pvtjsr5jbyswboxepndwv4tzkqwzc72k4xck7oaozii/oauth/callback/index.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/safari-pinned-tab.svg
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/safari-pinned-tab.svg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/animations.css
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/animations.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/animations.css.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/animations.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/base.css
··· 1 + ../../bafybeiftdd7dlfoayxlckoz7nnnoun5ggr2p2biwnbnfn3zflg2drlkmca/styles/base.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/base.css.map
··· 1 + ../../bafybeiftdd7dlfoayxlckoz7nnnoun5ggr2p2biwnbnfn3zflg2drlkmca/styles/base.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/diffuse/colors.css
··· 1 + ../../../bafybeiftdd7dlfoayxlckoz7nnnoun5ggr2p2biwnbnfn3zflg2drlkmca/styles/diffuse/colors.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/diffuse/colors.css.map
··· 1 + ../../../bafybeiftdd7dlfoayxlckoz7nnnoun5ggr2p2biwnbnfn3zflg2drlkmca/styles/diffuse/colors.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/diffuse/fonts.css
··· 1 + ../../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/diffuse/fonts.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/diffuse/fonts.css.map
··· 1 + ../../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/diffuse/fonts.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/diffuse/page.css
··· 1 + ../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/styles/diffuse/page.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/diffuse/page.css.map
··· 1 + ../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/styles/diffuse/page.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/font-faces.css
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/font-faces.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/font-faces.css.map
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/font-faces.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/loader.css
··· 1 + ../../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/styles/loader.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/loader.css.map
··· 1 + ../../bafybeiairw5zug6xd6xosgopcoyu3ieg4kiiesvqeszsk2xvipvsoxasvy/styles/loader.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/reset.css
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/reset.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/reset.css.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/reset.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/variables.css
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/variables.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/variables.css.map
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/variables.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/vendor/98.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/98.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/vendor/98.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/98.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/vendor/ms_sans_serif.woff2
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif.woff2
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/vendor/ms_sans_serif_bold.woff2
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif_bold.woff2
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/vendor/phosphor/bold/Phosphor-Bold.svg
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/Phosphor-Bold.svg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/vendor/phosphor/bold/Phosphor-Bold.ttf
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/Phosphor-Bold.ttf
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/vendor/phosphor/bold/Phosphor-Bold.woff
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/Phosphor-Bold.woff
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/vendor/phosphor/bold/Phosphor-Bold.woff2
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/Phosphor-Bold.woff2
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/vendor/phosphor/bold/style.css
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/style.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/vendor/phosphor/bold/style.css.map
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/style.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/vendor/phosphor/fill/Phosphor-Fill.svg
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.svg
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/vendor/phosphor/fill/Phosphor-Fill.ttf
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.ttf
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/vendor/phosphor/fill/Phosphor-Fill.woff
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.woff
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/vendor/phosphor/fill/Phosphor-Fill.woff2
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.woff2
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/vendor/phosphor/fill/style.css
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/style.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/vendor/phosphor/fill/style.css.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/style.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/wireframe/ui.css
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/wireframe/ui.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/styles/wireframe/ui.css.map
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/wireframe/ui.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/testing/index.html
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/testing/index.html
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/testing/output.js
··· 1 + ../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/testing/output.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/testing/output.js.map
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/testing/output.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/testing/output/index.html
··· 1 + ../../../bafybeic6tj6wx4iomrjs54m3je4e7lmq4jgcn7zqegufxtvqijffq32zkm/testing/output/index.html
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/testing/sample/tracks.js
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/testing/sample/tracks.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/testing/sample/tracks.js.map
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/testing/sample/tracks.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/blur/artwork-controller/element.css
··· 1 + ../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/themes/blur/artwork-controller/element.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/blur/artwork-controller/element.css.map
··· 1 + ../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/themes/blur/artwork-controller/element.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/blur/artwork-controller/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/themes/blur/artwork-controller/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/blur/artwork-controller/element.js.map
··· 1 + ../../../../bafybeidi3kcddz5dkh3zvsszshh4pe37cf4zjgco3xgydj77g7v3ksd2ya/themes/blur/artwork-controller/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/blur/artwork-controller/facet.html.txt
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/themes/blur/artwork-controller/facet.html.txt
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/blur/index.css
··· 1 + ../../../bafybeihr4brahqptxmxcdksktdfgs4hyl64odwx524vqmmitjvmn57sklq/themes/blur/index.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/blur/index.css.map
··· 1 + ../../../bafybeihr4brahqptxmxcdksktdfgs4hyl64odwx524vqmmitjvmn57sklq/themes/blur/index.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/blur/index.html
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/index.html
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/blur/index.js
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/blur/index.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/blur/index.js.map
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/blur/index.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/blur/variables.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/variables.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/blur/variables.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/variables.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/index.html
··· 1 + ../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/themes/index.html
+307
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/index.js
··· 1 + import { 2 + EditorView, 3 + autocompletion, 4 + basicSetup, 5 + css, 6 + html, 7 + javascript 8 + } from "../chunk-T6JAPJ7J.js"; 9 + import { 10 + foundation_default 11 + } from "../chunk-JEB4WIQV.js"; 12 + import "../chunk-G4P4YFWD.js"; 13 + import "../chunk-6JNRNMZQ.js"; 14 + import "../chunk-UMMPFCLQ.js"; 15 + import "../chunk-PKN6FN7E.js"; 16 + import "../chunk-NP7LZHKR.js"; 17 + import "../chunk-M2MAFKPM.js"; 18 + import "../chunk-YV3SRJQF.js"; 19 + import "../chunk-MVUUUQRL.js"; 20 + import "../chunk-ESYALJPH.js"; 21 + import "../chunk-U5LVPDQM.js"; 22 + import "../chunk-HC6LITPW.js"; 23 + import "../chunk-6KMZB5IA.js"; 24 + import "../chunk-XGM6M423.js"; 25 + import "../chunk-B63ZUKFI.js"; 26 + import "../chunk-TXU4RB3O.js"; 27 + import "../chunk-3ENCKNXO.js"; 28 + import "../chunk-OIRYE7B4.js"; 29 + import "../chunk-3AO35WC3.js"; 30 + import "../chunk-JBHW662S.js"; 31 + import "../chunk-GX3WPNEX.js"; 32 + import "../chunk-FJBTJV3K.js"; 33 + import "../chunk-PTVB4Y37.js"; 34 + import "../chunk-HN4F5JEZ.js"; 35 + import { 36 + i 37 + } from "../chunk-NBQPHQFP.js"; 38 + import "../chunk-QERJLR3Q.js"; 39 + import "../chunk-OBWEBS4T.js"; 40 + import "../chunk-S6SMX4HA.js"; 41 + import "../chunk-XRGLBUX4.js"; 42 + import "../chunk-R3EQQDW5.js"; 43 + import "../chunk-GQIBEDKG.js"; 44 + import "../chunk-DDF5P57I.js"; 45 + import "../chunk-EEUCFWD4.js"; 46 + import "../chunk-6DRHTH2U.js"; 47 + import "../chunk-TSYF7OPM.js"; 48 + import "../chunk-GCLDJKYV.js"; 49 + import "../chunk-KJFA7KRK.js"; 50 + import "../chunk-HMBZONBJ.js"; 51 + import "../chunk-6CB2LXND.js"; 52 + import { 53 + B, 54 + T 55 + } from "../chunk-V7EQPFPD.js"; 56 + import "../chunk-G56PUJUJ.js"; 57 + import { 58 + themeFromURI 59 + } from "../chunk-4LOJTZ72.js"; 60 + import "../chunk-6DKPDMFE.js"; 61 + import "../chunk-TP5GZFTO.js"; 62 + import "../chunk-ZQZJJU3T.js"; 63 + import { 64 + loadURI 65 + } from "../chunk-X6J7NMRW.js"; 66 + import "../chunk-WN6GL63Q.js"; 67 + import "../chunk-CRZ7HJJ4.js"; 68 + import "../chunk-242LG3VP.js"; 69 + import { 70 + now 71 + } from "../chunk-BKRD2ZIW.js"; 72 + import { 73 + effect, 74 + signal 75 + } from "../chunk-HNJPKCUJ.js"; 76 + import { 77 + create 78 + } from "../chunk-4YB6QUPN.js"; 79 + import "../chunk-SGR5ST3A.js"; 80 + import { 81 + __name, 82 + init_Buffer, 83 + init_process 84 + } from "../chunk-FZQXS3RE.js"; 85 + 86 + // themes/index.js 87 + init_Buffer(); 88 + init_process(); 89 + document.body.addEventListener( 90 + "click", 91 + /** 92 + * @param {MouseEvent} event 93 + */ 94 + async (event) => { 95 + const target = ( 96 + /** @type {HTMLElement} */ 97 + event.target 98 + ); 99 + const rel = target.getAttribute("rel"); 100 + if (!rel) return; 101 + const uri = target.closest("li")?.getAttribute("data-uri"); 102 + if (!uri) return; 103 + const name = target.closest("li")?.getAttribute("data-name"); 104 + if (!name) return; 105 + switch (rel) { 106 + case "fork": { 107 + const theme = await themeFromURI({ name, uri }, { fetchHTML: true }); 108 + editTheme(theme); 109 + document.querySelector("#build")?.scrollIntoView(); 110 + break; 111 + } 112 + case "save": { 113 + const theme = await themeFromURI({ name, uri }, { fetchHTML: false }); 114 + const out = foundation_default.orchestrator.output(); 115 + out.themes.save([ 116 + ...out.themes.collection(), 117 + theme 118 + ]); 119 + break; 120 + } 121 + } 122 + } 123 + ); 124 + var listEl = document.querySelector("#list"); 125 + if (!listEl) throw new Error("List element not found"); 126 + listEl.innerHTML = ""; 127 + var output = foundation_default.orchestrator.output(); 128 + effect(() => { 129 + const col = output.themes.collection().sort((a, b) => { 130 + return a.name.toLocaleLowerCase().localeCompare(b.name.toLocaleLowerCase()); 131 + }); 132 + const state = output.themes.state(); 133 + const h = col.length && state === "loaded" ? T` 134 + <ul> 135 + ${col.map( 136 + (c) => i( 137 + c.id, 138 + T` 139 + <li> 140 + <div style="position: relative;"> 141 + <a href="themes/l/?id=${c.id}"> 142 + ${c.name} 143 + </a> 144 + <button 145 + class="button--fixed button--transparent" 146 + popovertarget="theme-menu-col-${c.id}" 147 + style="anchor-name: --theme-anchor-col-${c.id}; position: absolute; right: 0; top: 50%; transform: translateY(-50%);" 148 + > 149 + <i class="ph-fill ph-dots-three-circle"></i> 150 + </button> 151 + </div> 152 + <div class="list-description"> 153 + ${c.uri && !c.html ? T` 154 + <span class="with-icon"> 155 + <i class="ph-fill ph-binoculars"></i> 156 + <span>Tracking the original <a href="${c.uri}">URI</a></span> 157 + </span> 158 + ` : T` 159 + <span class="with-icon"> 160 + <i class="ph-fill ph-code"></i> 161 + <span>Custom code</span> 162 + </span> 163 + `} 164 + </div> 165 + 166 + <!-- Dropdown Menu --> 167 + <div 168 + id="theme-menu-col-${c.id}" 169 + class="dropdown" 170 + style="position-anchor: --theme-anchor-col-${c.id}" 171 + popover 172 + > 173 + <a href="themes/l/?id=${c.id}"> 174 + <span class="with-icon"> 175 + <i class="ph-fill ph-globe"></i> Open 176 + </span> 177 + </a> 178 + <a @click="${() => editTheme(c)}"> 179 + <span class="with-icon"> 180 + <i class="ph-fill ph-cursor-text"></i> Edit 181 + </span> 182 + </a> 183 + <a @click="${deleteTheme({ id: c.id })}"> 184 + <span class="with-icon"> 185 + <i class="ph-fill ph-eraser"></i> Delete 186 + </span> 187 + </a> 188 + </div> 189 + </li> 190 + ` 191 + ) 192 + )} 193 + </ul> 194 + ` : state === "loaded" ? emptyThemesList : T` 195 + <div class="with-icon" style="font-size: var(--fs-sm);"> 196 + <i class="ph-bold ph-spinner-gap"></i> 197 + Loading items 198 + </div> 199 + `; 200 + B(h, listEl); 201 + }); 202 + var emptyThemesList = T` 203 + <p style="margin-bottom: 0;"> 204 + <i class="ph-fill ph-info"></i> You have not saved any themes yet. 205 + </p> 206 + `; 207 + function deleteTheme({ id }) { 208 + return () => { 209 + const c = confirm("Are you sure you want to delete this theme?"); 210 + if (!c) return; 211 + output.themes.save( 212 + output.themes.collection().filter((c2) => !(c2.id === id)) 213 + ); 214 + }; 215 + } 216 + __name(deleteTheme, "deleteTheme"); 217 + var $editingTheme = signal( 218 + /** @type {Theme | null} */ 219 + null 220 + ); 221 + var editorContainer = document.body.querySelector("#html-input-container"); 222 + if (!editorContainer) throw new Error("Editor container not found"); 223 + var editor = new EditorView({ 224 + parent: editorContainer, 225 + doc: ``.trim(), 226 + extensions: [ 227 + basicSetup, 228 + html(), 229 + css(), 230 + javascript(), 231 + autocompletion() 232 + ] 233 + }); 234 + document.querySelector("#build-form")?.addEventListener( 235 + "submit", 236 + onBuildSubmit 237 + ); 238 + async function onBuildSubmit(event) { 239 + event.preventDefault(); 240 + const nameEl = ( 241 + /** @type {HTMLInputElement | null} */ 242 + document.querySelector( 243 + "#name-input" 244 + ) 245 + ); 246 + const html2 = editor.state.doc.toString(); 247 + const cid = await create(85, new TextEncoder().encode(html2)); 248 + const name = nameEl?.value ?? "nameless"; 249 + const theme = $editingTheme.value ? { 250 + ...$editingTheme.value, 251 + cid, 252 + html: html2, 253 + name 254 + } : { 255 + $type: "sh.diffuse.output.theme", 256 + id: now(), 257 + cid, 258 + html: html2, 259 + name 260 + }; 261 + switch ( 262 + /** @type {any} */ 263 + event.submitter.name 264 + ) { 265 + case "save": 266 + await saveTheme(theme); 267 + break; 268 + case "save+open": 269 + await saveTheme(theme); 270 + globalThis.open(`./themes/l/?id=${theme.id}`, "blank"); 271 + break; 272 + } 273 + } 274 + __name(onBuildSubmit, "onBuildSubmit"); 275 + async function editTheme(ogTheme) { 276 + const theme = { ...ogTheme }; 277 + const nameEl = ( 278 + /** @type {HTMLInputElement | null} */ 279 + document.querySelector( 280 + "#name-input" 281 + ) 282 + ); 283 + if (!nameEl) return; 284 + if (!theme.html && theme.uri) { 285 + const html2 = await loadURI(theme.uri); 286 + const cid = await create(85, new TextEncoder().encode(html2)); 287 + theme.html = html2; 288 + theme.cid = cid; 289 + } 290 + $editingTheme.value = theme; 291 + nameEl.value = theme.name; 292 + editor.dispatch({ 293 + changes: { from: 0, to: editor.state.doc.length, insert: theme.html } 294 + }); 295 + } 296 + __name(editTheme, "editTheme"); 297 + async function saveTheme(theme) { 298 + const col = output.themes.collection(); 299 + const colWithoutId = col.filter((c) => c.id !== theme.id); 300 + await output.themes.save([...colWithoutId, { 301 + ...theme, 302 + updatedAt: (/* @__PURE__ */ new Date()).toISOString() 303 + }]); 304 + } 305 + __name(saveTheme, "saveTheme"); 306 + 307 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/index.js.map
··· 1 + ../../bafybeih26nbu4qfpdxtsnmdgp64bgrwdzhk5imx6nqiqsdut6nf4bhcuve/themes/index.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/l/index.css
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/l/index.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/l/index.css.map
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/l/index.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/l/index.html
··· 1 + ../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/themes/l/index.html
+81
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/l/index.js
··· 1 + import { 2 + foundation_default 3 + } from "../../chunk-JEB4WIQV.js"; 4 + import "../../chunk-G4P4YFWD.js"; 5 + import "../../chunk-6JNRNMZQ.js"; 6 + import "../../chunk-UMMPFCLQ.js"; 7 + import "../../chunk-PKN6FN7E.js"; 8 + import "../../chunk-NP7LZHKR.js"; 9 + import "../../chunk-M2MAFKPM.js"; 10 + import "../../chunk-YV3SRJQF.js"; 11 + import "../../chunk-MVUUUQRL.js"; 12 + import "../../chunk-ESYALJPH.js"; 13 + import "../../chunk-U5LVPDQM.js"; 14 + import "../../chunk-HC6LITPW.js"; 15 + import "../../chunk-6KMZB5IA.js"; 16 + import "../../chunk-XGM6M423.js"; 17 + import "../../chunk-B63ZUKFI.js"; 18 + import "../../chunk-TXU4RB3O.js"; 19 + import "../../chunk-3ENCKNXO.js"; 20 + import "../../chunk-OIRYE7B4.js"; 21 + import "../../chunk-3AO35WC3.js"; 22 + import "../../chunk-JBHW662S.js"; 23 + import "../../chunk-GX3WPNEX.js"; 24 + import "../../chunk-FJBTJV3K.js"; 25 + import "../../chunk-PTVB4Y37.js"; 26 + import "../../chunk-HN4F5JEZ.js"; 27 + import "../../chunk-NBQPHQFP.js"; 28 + import "../../chunk-QERJLR3Q.js"; 29 + import "../../chunk-OBWEBS4T.js"; 30 + import "../../chunk-S6SMX4HA.js"; 31 + import "../../chunk-XRGLBUX4.js"; 32 + import "../../chunk-R3EQQDW5.js"; 33 + import "../../chunk-GQIBEDKG.js"; 34 + import "../../chunk-DDF5P57I.js"; 35 + import "../../chunk-EEUCFWD4.js"; 36 + import "../../chunk-6DRHTH2U.js"; 37 + import "../../chunk-TSYF7OPM.js"; 38 + import "../../chunk-GCLDJKYV.js"; 39 + import "../../chunk-KJFA7KRK.js"; 40 + import "../../chunk-HMBZONBJ.js"; 41 + import "../../chunk-6CB2LXND.js"; 42 + import "../../chunk-V7EQPFPD.js"; 43 + import "../../chunk-G56PUJUJ.js"; 44 + import "../../chunk-6DKPDMFE.js"; 45 + import "../../chunk-TP5GZFTO.js"; 46 + import "../../chunk-ZQZJJU3T.js"; 47 + import { 48 + createLoader 49 + } from "../../chunk-X6J7NMRW.js"; 50 + import "../../chunk-WN6GL63Q.js"; 51 + import "../../chunk-CRZ7HJJ4.js"; 52 + import "../../chunk-242LG3VP.js"; 53 + import "../../chunk-BKRD2ZIW.js"; 54 + import "../../chunk-HNJPKCUJ.js"; 55 + import "../../chunk-4YB6QUPN.js"; 56 + import "../../chunk-SGR5ST3A.js"; 57 + import { 58 + __name, 59 + init_Buffer, 60 + init_process 61 + } from "../../chunk-FZQXS3RE.js"; 62 + 63 + // themes/l/index.js 64 + init_Buffer(); 65 + init_process(); 66 + createLoader({ 67 + $type: "sh.diffuse.output.theme", 68 + label: "Theme", 69 + source: /* @__PURE__ */ __name(() => { 70 + const output = foundation_default.orchestrator.output(); 71 + return output.themes; 72 + }, "source"), 73 + render(theme) { 74 + const iframe = document.createElement("iframe"); 75 + iframe.srcdoc = theme.html ?? ""; 76 + document.body.innerHTML = ""; 77 + document.body.append(iframe); 78 + } 79 + }); 80 + 81 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/l/index.js.map
··· 1 + ../../../bafybeih26nbu4qfpdxtsnmdgp64bgrwdzhk5imx6nqiqsdut6nf4bhcuve/themes/l/index.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/98-extra.css
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/98-extra.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/98-extra.css.map
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/98-extra.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/98-vars.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/98-vars.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/98-vars.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/98-vars.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/browser/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/themes/webamp/browser/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/browser/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/browser/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/browser/facet.html.txt
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/themes/webamp/browser/facet.html.txt
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/common/ui.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/webamp/common/ui.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/common/ui.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/common/ui.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/configurators/input/element.js
··· 1 + ../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/themes/webamp/configurators/input/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/configurators/input/element.js.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/configurators/input/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/configurators/input/facet.html.txt
··· 1 + ../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/themes/webamp/configurators/input/facet.html.txt
+36
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/configurators/output/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../../chunk-RXJKQLTB.js"; 6 + import "../../../../chunk-BLEJHIYA.js"; 7 + import "../../../../chunk-6WKBRQHS.js"; 8 + import "../../../../chunk-IGKYDHDK.js"; 9 + import "../../../../chunk-A7YBZO62.js"; 10 + import "../../../../chunk-NSJY6VZI.js"; 11 + import "../../../../chunk-77ZY4GQV.js"; 12 + import "../../../../chunk-NZ7ODGIJ.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/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/configurators/output/element.js.map
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/webamp/configurators/output/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/configurators/output/facet.html.txt
··· 1 + ../../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/themes/webamp/configurators/output/facet.html.txt
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/facet.css
··· 1 + ../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/themes/webamp/facet.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/facet.css.map
··· 1 + ../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/themes/webamp/facet.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/fonts.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/fonts.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/fonts.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/fonts.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/index.css
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/index.css
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/index.css.map
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/index.css.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/index.html
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/index.html
+191
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/index.js
··· 1 + import "../../chunk-FJAAY3PY.js"; 2 + import "../../chunk-RXJKQLTB.js"; 3 + import { 4 + element_default 5 + } from "../../chunk-2E662X3X.js"; 6 + import { 7 + element_default as element_default2 8 + } from "../../chunk-3THWHK2M.js"; 9 + import "../../chunk-QXBWZVFE.js"; 10 + import "../../chunk-676R57TH.js"; 11 + import "../../chunk-3CXPPL5Z.js"; 12 + import "../../chunk-BLEJHIYA.js"; 13 + import "../../chunk-6WKBRQHS.js"; 14 + import "../../chunk-IGKYDHDK.js"; 15 + import "../../chunk-A7YBZO62.js"; 16 + import "../../chunk-NSJY6VZI.js"; 17 + import "../../chunk-77ZY4GQV.js"; 18 + import "../../chunk-NZ7ODGIJ.js"; 19 + import "../../chunk-YCKIJVMK.js"; 20 + import "../../chunk-JZMTETBD.js"; 21 + import "../../chunk-H3WG7GN4.js"; 22 + import "../../chunk-6JNRNMZQ.js"; 23 + import { 24 + element_exports as element_exports3 25 + } from "../../chunk-UMMPFCLQ.js"; 26 + import "../../chunk-PKN6FN7E.js"; 27 + import { 28 + element_exports as element_exports4 29 + } from "../../chunk-M2MAFKPM.js"; 30 + import "../../chunk-U5LVPDQM.js"; 31 + import "../../chunk-HC6LITPW.js"; 32 + import "../../chunk-6KMZB5IA.js"; 33 + import "../../chunk-XGM6M423.js"; 34 + import "../../chunk-B63ZUKFI.js"; 35 + import "../../chunk-TXU4RB3O.js"; 36 + import "../../chunk-OIRYE7B4.js"; 37 + import "../../chunk-3AO35WC3.js"; 38 + import "../../chunk-JBHW662S.js"; 39 + import "../../chunk-GX3WPNEX.js"; 40 + import "../../chunk-FJBTJV3K.js"; 41 + import "../../chunk-PTVB4Y37.js"; 42 + import "../../chunk-HN4F5JEZ.js"; 43 + import { 44 + element_exports 45 + } from "../../chunk-OBWEBS4T.js"; 46 + import "../../chunk-XRGLBUX4.js"; 47 + import "../../chunk-R3EQQDW5.js"; 48 + import "../../chunk-GQIBEDKG.js"; 49 + import "../../chunk-DDF5P57I.js"; 50 + import "../../chunk-EEUCFWD4.js"; 51 + import "../../chunk-6DRHTH2U.js"; 52 + import "../../chunk-TSYF7OPM.js"; 53 + import { 54 + element_exports as element_exports2 55 + } from "../../chunk-GCLDJKYV.js"; 56 + import "../../chunk-KJFA7KRK.js"; 57 + import "../../chunk-HMBZONBJ.js"; 58 + import "../../chunk-6CB2LXND.js"; 59 + import { 60 + component 61 + } from "../../chunk-V7EQPFPD.js"; 62 + import "../../chunk-G56PUJUJ.js"; 63 + import "../../chunk-6DKPDMFE.js"; 64 + import "../../chunk-TP5GZFTO.js"; 65 + import "../../chunk-ZQZJJU3T.js"; 66 + import "../../chunk-WN6GL63Q.js"; 67 + import "../../chunk-CRZ7HJJ4.js"; 68 + import "../../chunk-242LG3VP.js"; 69 + import "../../chunk-BKRD2ZIW.js"; 70 + import { 71 + effect, 72 + untracked 73 + } from "../../chunk-HNJPKCUJ.js"; 74 + import "../../chunk-SGR5ST3A.js"; 75 + import { 76 + __name, 77 + init_Buffer, 78 + init_process 79 + } from "../../chunk-FZQXS3RE.js"; 80 + 81 + // themes/webamp/index.js 82 + init_Buffer(); 83 + init_process(); 84 + var input = component(element_exports2); 85 + var queue = component(element_exports); 86 + var search = component(element_exports3); 87 + var scopedTracks = component(element_exports4); 88 + var output = document.querySelector("#output"); 89 + if (!output) throw new Error("Missing output element"); 90 + globalThis.queue = queue; 91 + globalThis.output = output; 92 + var index = {}; 93 + var initiatedPlaylist = false; 94 + var ampElement = document.querySelector("dtw-webamp"); 95 + if (ampElement instanceof element_default === false) { 96 + throw new Error("Missing webamp element"); 97 + } 98 + var amp = ampElement.amp; 99 + var loadFromUrl = amp.media.loadFromUrl.bind(amp.media); 100 + async function loadOverride(uri, autoPlay) { 101 + if (uri.startsWith("blob:")) { 102 + return await loadFromUrl(uri, autoPlay); 103 + } 104 + const resp = await input.resolve({ method: "GET", uri }); 105 + if (!resp) throw new Error("Failed to resolve URI"); 106 + if (resp && "stream" in resp) { 107 + throw new Error("Webamp does not support playing streams."); 108 + } 109 + return await loadFromUrl(resp.url, autoPlay); 110 + } 111 + __name(loadOverride, "loadOverride"); 112 + amp.media.loadFromUrl = loadOverride.bind(amp.media); 113 + effect(() => { 114 + const past = untracked(() => queue.past()); 115 + const now = untracked(() => queue.now()); 116 + const future = queue.future(); 117 + const list = [...past, ...now ? [now] : [], ...future]; 118 + const newIdx = {}; 119 + list.forEach((item) => { 120 + newIdx[item.id] = (newIdx[item.id] ?? 0) + 1; 121 + }); 122 + const tracksToAdd = []; 123 + Object.entries(newIdx).forEach(([id, n]) => { 124 + const x = index[id] ?? 0; 125 + if (n > x) { 126 + const track = output.tracks.collection().find((t) => t.id === id); 127 + if (track) tracksToAdd.push(track); 128 + index[id] = x + 1; 129 + } 130 + }); 131 + tracksToAdd.forEach((t) => ampElement.addTrack(t)); 132 + if (!initiatedPlaylist && tracksToAdd.length) { 133 + initiatedPlaylist = true; 134 + amp.store.dispatch({ type: "BUFFER_TRACK", id: 0 }); 135 + } 136 + }); 137 + effect(() => { 138 + const tracks = scopedTracks.tracks(); 139 + queue.supply({ trackIds: tracks.map((t) => t.id) }); 140 + }); 141 + var tracksPromise = Promise.withResolvers(); 142 + effect(() => { 143 + const state = output.tracks.state(); 144 + if (state !== "loaded") return; 145 + const fingerprintSearch = search.supplyFingerprint(); 146 + if (fingerprintSearch === void 0) return; 147 + const fingerprintQueue = queue.supplyFingerprint(); 148 + if (fingerprintQueue === void 0) return; 149 + tracksPromise.resolve("loaded"); 150 + }); 151 + document.body.querySelectorAll(".desktop__item").forEach((element) => { 152 + if (element instanceof HTMLElement) { 153 + element.addEventListener("dblclick", () => { 154 + const f = element.querySelector("label")?.getAttribute("for"); 155 + if (f) return windowManager()?.toggleWindow(f); 156 + }); 157 + } 158 + }); 159 + document.body.querySelector("#desktop-batch")?.addEventListener( 160 + "dblclick", 161 + () => { 162 + tracksPromise.promise.then(() => { 163 + addBatch(); 164 + }); 165 + } 166 + ); 167 + var winampIsShown = true; 168 + document.body.querySelector("#desktop-winamp")?.addEventListener( 169 + "dblclick", 170 + () => { 171 + if (winampIsShown) { 172 + amp.close(); 173 + } else { 174 + amp.reopen(); 175 + winampIsShown = true; 176 + } 177 + } 178 + ); 179 + amp.onClose(() => winampIsShown = false); 180 + async function addBatch() { 181 + await queue.fill({ augment: true, amount: 50, shuffled: true }); 182 + } 183 + __name(addBatch, "addBatch"); 184 + function windowManager() { 185 + const w = document.body.querySelector("dtw-window-manager"); 186 + if (w instanceof element_default2) return w; 187 + return null; 188 + } 189 + __name(windowManager, "windowManager"); 190 + 191 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/index.js.map
··· 1 + ../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/themes/webamp/index.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/webamp/element.js
··· 1 + ../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/themes/webamp/webamp/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/webamp/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/webamp/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/window-manager/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/themes/webamp/window-manager/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/window-manager/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/window-manager/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/window/element.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/themes/webamp/window/element.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/themes/webamp/window/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/window/element.js.map
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/vendor/@atcute/tid/index.js
··· 1 + ../../../../bafybeiccyxrk34dahmyu7ub2ex2bdlcnofekso7iosiroyrhjakww64cae/vendor/@atcute/tid/index.js
+1
artifacts/bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu/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": "bafybeidwijmtzstw5ss6sw3o6cfuqyqkmoekv2eeayu2ifmahyo4wmc3uq", 9 - "createdAt": "2026-02-28T21:19:23.450Z", 8 + "cid": "bafybeidei3ezzvkd2q7yaojc2wlog532cduo5sy2cmeb565bvmb6sfo4bu", 9 + "createdAt": "2026-03-01T10:15:55.972Z", 10 10 "version": "4.0.0-alpha" 11 11 } 12 12 }