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

+6789 -2
+5
artifacts/artifacts.json
··· 118 118 "cid": "bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie", 119 119 "createdAt": "2026-02-18T18:40:23.511Z", 120 120 "version": "4.0.0-alpha" 121 + }, 122 + "bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie": { 123 + "cid": "bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie", 124 + "createdAt": "2026-02-18T19:11:40.462Z", 125 + "version": "4.0.0-alpha" 121 126 } 122 127 }
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/APEv2Parser-BRKJRV7N.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/APEv2Parser-BRKJRV7N.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/APEv2Parser-BRKJRV7N.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/APEv2Parser-BRKJRV7N.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/AiffParser-TQ5FJFYY.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/AiffParser-TQ5FJFYY.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/AiffParser-TQ5FJFYY.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/AiffParser-TQ5FJFYY.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/AsfParser-ROMHQSZ4.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/AsfParser-ROMHQSZ4.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/AsfParser-ROMHQSZ4.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/AsfParser-ROMHQSZ4.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/DsdiffParser-IPZ4LJVB.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/DsdiffParser-IPZ4LJVB.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/DsdiffParser-IPZ4LJVB.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/DsdiffParser-IPZ4LJVB.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/DsfParser-3LJNLQO5.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/DsfParser-3LJNLQO5.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/DsfParser-3LJNLQO5.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/DsfParser-3LJNLQO5.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/FlacParser-CORWQOPJ.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/FlacParser-CORWQOPJ.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/FlacParser-CORWQOPJ.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/FlacParser-CORWQOPJ.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/MP4Parser-Z47EMV4S.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/MP4Parser-Z47EMV4S.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/MP4Parser-Z47EMV4S.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/MP4Parser-Z47EMV4S.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/MatroskaParser-AYAGCKYO.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/MatroskaParser-AYAGCKYO.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/MatroskaParser-AYAGCKYO.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/MatroskaParser-AYAGCKYO.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/MpegParser-OHXYR6LX.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/MpegParser-OHXYR6LX.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/MpegParser-OHXYR6LX.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/MpegParser-OHXYR6LX.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/MusepackParser-J3NHX4UP.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/MusepackParser-J3NHX4UP.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/MusepackParser-J3NHX4UP.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/MusepackParser-J3NHX4UP.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/OggParser-IPNXVFB4.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/OggParser-IPNXVFB4.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/OggParser-IPNXVFB4.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/OggParser-IPNXVFB4.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/WavPackParser-7DDX5KAZ.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/WavPackParser-7DDX5KAZ.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/WavPackParser-7DDX5KAZ.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/WavPackParser-7DDX5KAZ.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/WaveParser-TGWUU72U.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/WaveParser-TGWUU72U.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/WaveParser-TGWUU72U.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/WaveParser-TGWUU72U.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/android-chrome-192x192.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/android-chrome-192x192.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/android-chrome-512x512.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/android-chrome-512x512.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/apple-touch-icon.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/apple-touch-icon.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/browserconfig.xml
··· 1 + ../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/browserconfig.xml
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-2E662X3X.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-2E662X3X.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-2E662X3X.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-2E662X3X.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-2K4IS7RU.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-2K4IS7RU.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-2K4IS7RU.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-2K4IS7RU.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-2RWEBKV5.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-2RWEBKV5.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-2RWEBKV5.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-2RWEBKV5.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-33YSHWBQ.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-33YSHWBQ.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-33YSHWBQ.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-33YSHWBQ.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-3CXPPL5Z.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-3CXPPL5Z.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-3CXPPL5Z.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-3CXPPL5Z.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-4XM4KNLF.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-4XM4KNLF.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-4XM4KNLF.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-4XM4KNLF.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-4XWBI3QC.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-4XWBI3QC.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-4XWBI3QC.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-4XWBI3QC.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-4YB6QUPN.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-4YB6QUPN.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-4YB6QUPN.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-4YB6QUPN.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-5EMZ3NAI.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-5EMZ3NAI.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-5EMZ3NAI.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-5EMZ3NAI.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-5F2TCUTS.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-5F2TCUTS.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-5F2TCUTS.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-5F2TCUTS.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-5LCUNSRQ.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-5LCUNSRQ.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-5LCUNSRQ.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-5LCUNSRQ.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-5UTOUDDD.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-5UTOUDDD.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-5UTOUDDD.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-5UTOUDDD.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-6DRHTH2U.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-6DRHTH2U.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-6DRHTH2U.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-6DRHTH2U.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-6FINJPVD.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-6FINJPVD.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-6FINJPVD.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-6FINJPVD.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-77ZY4GQV.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-77ZY4GQV.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-77ZY4GQV.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-77ZY4GQV.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-7DBAGGP4.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-7DBAGGP4.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-7DBAGGP4.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-7DBAGGP4.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-7HCR4FJB.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-7HCR4FJB.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-7HCR4FJB.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-7HCR4FJB.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-7U6IWNID.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-7U6IWNID.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-7U6IWNID.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-7U6IWNID.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-AISBWLUT.js
··· 1 + ../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-AISBWLUT.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-AISBWLUT.js.map
··· 1 + ../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-AISBWLUT.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-AKDQWSN2.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-AKDQWSN2.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-AKDQWSN2.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-AKDQWSN2.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-B5LLSFSV.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-B5LLSFSV.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-B5LLSFSV.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-B5LLSFSV.js.map
+3621
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-CHYBYJZ3.js
··· 1 + import { 2 + webcrypto 3 + } from "./chunk-77ZY4GQV.js"; 4 + import { 5 + Buffer, 6 + __commonJS, 7 + __export, 8 + __name, 9 + __reExport, 10 + __toESM, 11 + init_Buffer, 12 + init_process 13 + } from "./chunk-FZQXS3RE.js"; 14 + 15 + // ../node_modules/.deno/@badrap+valita@0.4.6/node_modules/@badrap/valita/dist/node-cjs/index.js 16 + var require_node_cjs = __commonJS({ 17 + "../node_modules/.deno/@badrap+valita@0.4.6/node_modules/@badrap/valita/dist/node-cjs/index.js"(exports) { 18 + "use strict"; 19 + init_Buffer(); 20 + init_process(); 21 + Object.defineProperty(exports, "__esModule", { value: true }); 22 + exports.lazy = exports.union = exports.tuple = exports.array = exports.record = exports.object = exports.literal = exports.undefined = exports.null = exports.boolean = exports.bigint = exports.number = exports.string = exports.never = exports.unknown = exports.ValitaError = void 0; 23 + exports.ok = ok3; 24 + exports.err = err2; 25 + function expectedType(expected) { 26 + return { 27 + ok: false, 28 + code: "invalid_type", 29 + expected 30 + }; 31 + } 32 + __name(expectedType, "expectedType"); 33 + var ISSUE_EXPECTED_NOTHING = expectedType([]); 34 + var ISSUE_EXPECTED_STRING = expectedType(["string"]); 35 + var ISSUE_EXPECTED_NUMBER = expectedType(["number"]); 36 + var ISSUE_EXPECTED_BIGINT = expectedType(["bigint"]); 37 + var ISSUE_EXPECTED_BOOLEAN = expectedType(["boolean"]); 38 + var ISSUE_EXPECTED_UNDEFINED = expectedType(["undefined"]); 39 + var ISSUE_EXPECTED_NULL = expectedType(["null"]); 40 + var ISSUE_EXPECTED_OBJECT = expectedType(["object"]); 41 + var ISSUE_EXPECTED_ARRAY = expectedType(["array"]); 42 + var ISSUE_MISSING_VALUE = { 43 + ok: false, 44 + code: "missing_value" 45 + }; 46 + function joinIssues(left, right) { 47 + return left ? { ok: false, code: "join", left, right } : right; 48 + } 49 + __name(joinIssues, "joinIssues"); 50 + function prependPath(key, tree) { 51 + return { ok: false, code: "prepend", key, tree }; 52 + } 53 + __name(prependPath, "prependPath"); 54 + function cloneIssueWithPath(tree, path) { 55 + const code = tree.code; 56 + switch (code) { 57 + case "invalid_type": 58 + return { code, path, expected: tree.expected }; 59 + case "invalid_literal": 60 + return { code, path, expected: tree.expected }; 61 + case "missing_value": 62 + return { code, path }; 63 + case "invalid_length": 64 + return { 65 + code, 66 + path, 67 + minLength: tree.minLength, 68 + maxLength: tree.maxLength 69 + }; 70 + case "unrecognized_keys": 71 + return { code, path, keys: tree.keys }; 72 + case "invalid_union": 73 + return { code, path, tree: tree.tree, issues: collectIssues(tree.tree) }; 74 + case "custom_error": 75 + if (typeof tree.error === "object" && tree.error.path !== void 0) { 76 + path.push(...tree.error.path); 77 + } 78 + return { 79 + code, 80 + path, 81 + message: typeof tree.error === "string" ? tree.error : tree.error?.message, 82 + error: tree.error 83 + }; 84 + } 85 + } 86 + __name(cloneIssueWithPath, "cloneIssueWithPath"); 87 + function collectIssues(tree, path = [], issues = []) { 88 + for (; ; ) { 89 + if (tree.code === "join") { 90 + collectIssues(tree.left, path.slice(), issues); 91 + tree = tree.right; 92 + } else if (tree.code === "prepend") { 93 + path.push(tree.key); 94 + tree = tree.tree; 95 + } else { 96 + issues.push(cloneIssueWithPath(tree, path)); 97 + return issues; 98 + } 99 + } 100 + } 101 + __name(collectIssues, "collectIssues"); 102 + function separatedList(list, sep) { 103 + if (list.length === 0) { 104 + return "nothing"; 105 + } else if (list.length === 1) { 106 + return list[0]; 107 + } else { 108 + return `${list.slice(0, -1).join(", ")} ${sep} ${list[list.length - 1]}`; 109 + } 110 + } 111 + __name(separatedList, "separatedList"); 112 + function formatLiteral(value) { 113 + return typeof value === "bigint" ? `${value}n` : JSON.stringify(value); 114 + } 115 + __name(formatLiteral, "formatLiteral"); 116 + function countIssues(tree) { 117 + let count = 0; 118 + for (; ; ) { 119 + if (tree.code === "join") { 120 + count += countIssues(tree.left); 121 + tree = tree.right; 122 + } else if (tree.code === "prepend") { 123 + tree = tree.tree; 124 + } else { 125 + return count + 1; 126 + } 127 + } 128 + } 129 + __name(countIssues, "countIssues"); 130 + function formatIssueTree(tree) { 131 + let path = ""; 132 + let count = 0; 133 + for (; ; ) { 134 + if (tree.code === "join") { 135 + count += countIssues(tree.right); 136 + tree = tree.left; 137 + } else if (tree.code === "prepend") { 138 + path += `.${tree.key}`; 139 + tree = tree.tree; 140 + } else { 141 + break; 142 + } 143 + } 144 + let message = "validation failed"; 145 + if (tree.code === "invalid_type") { 146 + message = `expected ${separatedList(tree.expected, "or")}`; 147 + } else if (tree.code === "invalid_literal") { 148 + message = `expected ${separatedList(tree.expected.map(formatLiteral), "or")}`; 149 + } else if (tree.code === "missing_value") { 150 + message = `missing value`; 151 + } else if (tree.code === "unrecognized_keys") { 152 + const keys = tree.keys; 153 + message = `unrecognized ${keys.length === 1 ? "key" : "keys"} ${separatedList(keys.map(formatLiteral), "and")}`; 154 + } else if (tree.code === "invalid_length") { 155 + const min = tree.minLength; 156 + const max = tree.maxLength; 157 + message = `expected an array with `; 158 + if (min > 0) { 159 + if (max === min) { 160 + message += `${min}`; 161 + } else if (max !== void 0) { 162 + message += `between ${min} and ${max}`; 163 + } else { 164 + message += `at least ${min}`; 165 + } 166 + } else { 167 + message += `at most ${max ?? "\u221E"}`; 168 + } 169 + message += ` item(s)`; 170 + } else if (tree.code === "custom_error") { 171 + const error = tree.error; 172 + if (typeof error === "string") { 173 + message = error; 174 + } else if (error !== void 0) { 175 + if (error.message !== void 0) { 176 + message = error.message; 177 + } 178 + if (error.path !== void 0) { 179 + path += "." + error.path.join("."); 180 + } 181 + } 182 + } 183 + let msg = `${tree.code} at .${path.slice(1)} (${message})`; 184 + if (count === 1) { 185 + msg += ` (+ 1 other issue)`; 186 + } else if (count > 1) { 187 + msg += ` (+ ${count} other issues)`; 188 + } 189 + return msg; 190 + } 191 + __name(formatIssueTree, "formatIssueTree"); 192 + function lazyProperty(obj, prop, value, enumerable) { 193 + Object.defineProperty(obj, prop, { 194 + value, 195 + enumerable, 196 + writable: false 197 + }); 198 + return value; 199 + } 200 + __name(lazyProperty, "lazyProperty"); 201 + var ValitaError2 = class extends Error { 202 + static { 203 + __name(this, "ValitaError"); 204 + } 205 + constructor(issueTree) { 206 + super(formatIssueTree(issueTree)); 207 + Object.setPrototypeOf(this, new.target.prototype); 208 + this.name = new.target.name; 209 + this._issueTree = issueTree; 210 + } 211 + get issues() { 212 + return lazyProperty(this, "issues", collectIssues(this._issueTree), true); 213 + } 214 + }; 215 + exports.ValitaError = ValitaError2; 216 + var ErrImpl = class { 217 + static { 218 + __name(this, "ErrImpl"); 219 + } 220 + constructor(issueTree) { 221 + this.ok = false; 222 + this._issueTree = issueTree; 223 + } 224 + get issues() { 225 + return lazyProperty(this, "issues", collectIssues(this._issueTree), true); 226 + } 227 + get message() { 228 + return lazyProperty(this, "message", formatIssueTree(this._issueTree), true); 229 + } 230 + throw() { 231 + throw new ValitaError2(this._issueTree); 232 + } 233 + }; 234 + function ok3(value) { 235 + return { ok: true, value }; 236 + } 237 + __name(ok3, "ok"); 238 + function err2(error) { 239 + return new ErrImpl({ ok: false, code: "custom_error", error }); 240 + } 241 + __name(err2, "err"); 242 + function isObject(v) { 243 + return typeof v === "object" && v !== null && !Array.isArray(v); 244 + } 245 + __name(isObject, "isObject"); 246 + var FLAG_FORBID_EXTRA_KEYS = 1 << 0; 247 + var FLAG_STRIP_EXTRA_KEYS = 1 << 1; 248 + var FLAG_MISSING_VALUE = 1 << 2; 249 + var TAG_UNKNOWN = 0; 250 + var TAG_NEVER = 1; 251 + var TAG_STRING = 2; 252 + var TAG_NUMBER = 3; 253 + var TAG_BIGINT = 4; 254 + var TAG_BOOLEAN = 5; 255 + var TAG_NULL = 6; 256 + var TAG_UNDEFINED = 7; 257 + var TAG_LITERAL = 8; 258 + var TAG_OPTIONAL = 9; 259 + var TAG_OBJECT = 10; 260 + var TAG_ARRAY = 11; 261 + var TAG_UNION = 12; 262 + var TAG_SIMPLE_UNION = 13; 263 + var TAG_TRANSFORM = 14; 264 + var TAG_OTHER = 15; 265 + var taggedMatcher = /* @__PURE__ */ __name((tag, match) => { 266 + return { tag, match }; 267 + }, "taggedMatcher"); 268 + function callMatcher(matcher, value, flags) { 269 + switch (matcher.tag) { 270 + case TAG_UNKNOWN: 271 + return void 0; 272 + case TAG_NEVER: 273 + return ISSUE_EXPECTED_NOTHING; 274 + case TAG_STRING: 275 + return typeof value === "string" ? void 0 : ISSUE_EXPECTED_STRING; 276 + case TAG_NUMBER: 277 + return typeof value === "number" ? void 0 : ISSUE_EXPECTED_NUMBER; 278 + case TAG_BIGINT: 279 + return typeof value === "bigint" ? void 0 : ISSUE_EXPECTED_BIGINT; 280 + case TAG_BOOLEAN: 281 + return typeof value === "boolean" ? void 0 : ISSUE_EXPECTED_BOOLEAN; 282 + case TAG_NULL: 283 + return value === null ? void 0 : ISSUE_EXPECTED_NULL; 284 + case TAG_UNDEFINED: 285 + return value === void 0 ? void 0 : ISSUE_EXPECTED_UNDEFINED; 286 + case TAG_LITERAL: 287 + return matcher.match(value, flags); 288 + case TAG_OPTIONAL: 289 + return matcher.match(value, flags); 290 + case TAG_OBJECT: 291 + return matcher.match(value, flags); 292 + case TAG_ARRAY: 293 + return matcher.match(value, flags); 294 + case TAG_UNION: 295 + return matcher.match(value, flags); 296 + case TAG_SIMPLE_UNION: 297 + return matcher.match(value, flags); 298 + case TAG_TRANSFORM: 299 + return matcher.match(value, flags); 300 + default: 301 + return matcher.match(value, flags); 302 + } 303 + } 304 + __name(callMatcher, "callMatcher"); 305 + var MATCHER_SYMBOL = /* @__PURE__ */ Symbol.for("@valita/internal"); 306 + var AbstractType = class { 307 + static { 308 + __name(this, "AbstractType"); 309 + } 310 + default(defaultValue) { 311 + const defaultResult = ok3(defaultValue); 312 + return new TransformType(this.optional(), (v) => { 313 + return v === void 0 ? defaultResult : void 0; 314 + }); 315 + } 316 + /** 317 + * Derive a new validator that uses the provided predicate function to 318 + * perform custom validation for the source validator's output values. 319 + * 320 + * The predicate function should return `true` when the source 321 + * type's output value is valid, `false` otherwise. The checked value 322 + * itself won't get modified or replaced, and is returned as-is on 323 + * validation success. 324 + * 325 + * @example A validator that accepts only numeric strings. 326 + * ```ts 327 + * const numericString = v.string().assert((s) => /^\d+$/.test(s)) 328 + * numericString.parse("1"); 329 + * // "1" 330 + * numericString.parse("foo"); 331 + * // ValitaError: custom_error at . (validation failed) 332 + * ``` 333 + * 334 + * You can also _refine_ the output type by passing in a 335 + * [type predicate](https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates). 336 + * Note that the type predicate must have a compatible input type. 337 + * 338 + * @example A validator with its output type refined to `Date`. 339 + * ```ts 340 + * const dateType = v.unknown().assert((v): v is Date => v instanceof Date); 341 + * ``` 342 + * 343 + * You can also pass in a custom failure messages. 344 + * 345 + * @example A validator that rejects non-integers with a custom error. 346 + * ```ts 347 + * const integer = v.number().assert((n) => Number.isInteger(n), "not an integer"); 348 + * integer.parse(1); 349 + * // 1 350 + * integer.parse(1.5); 351 + * // ValitaError: custom_error at . (not an integer) 352 + * ``` 353 + * 354 + * @param func - The assertion predicate function. 355 + * @param [error] - A custom error for situations when the assertion 356 + * predicate returns `false`. 357 + */ 358 + assert(func, error) { 359 + const err3 = { ok: false, code: "custom_error", error }; 360 + return new TransformType(this, (v, flags) => func(v, flagsToOptions(flags)) ? void 0 : err3); 361 + } 362 + map(func) { 363 + return new TransformType(this, (v, flags) => ({ 364 + ok: true, 365 + value: func(v, flagsToOptions(flags)) 366 + })); 367 + } 368 + chain(input) { 369 + if (typeof input === "function") { 370 + return new TransformType(this, (v, flags) => { 371 + const r = input(v, flagsToOptions(flags)); 372 + return r.ok ? r : r._issueTree; 373 + }); 374 + } 375 + return new TransformType(this, (v, flags) => callMatcher(input[MATCHER_SYMBOL], v, flags)); 376 + } 377 + }; 378 + var Type = class extends AbstractType { 379 + static { 380 + __name(this, "Type"); 381 + } 382 + optional(defaultFn) { 383 + const optional = new Optional(this); 384 + if (!defaultFn) { 385 + return optional; 386 + } 387 + return new TransformType(optional, (v) => { 388 + return v === void 0 ? { ok: true, value: defaultFn() } : void 0; 389 + }); 390 + } 391 + nullable(defaultFn) { 392 + const nullable = new SimpleUnion([null_(), this]); 393 + if (!defaultFn) { 394 + return nullable; 395 + } 396 + return new TransformType(nullable, (v) => { 397 + return v === null ? { ok: true, value: defaultFn() } : void 0; 398 + }); 399 + } 400 + _toTerminals(func) { 401 + func(this); 402 + } 403 + /** 404 + * Parse a value without throwing. 405 + */ 406 + try(v, options) { 407 + const r = callMatcher(this[MATCHER_SYMBOL], v, options === void 0 ? FLAG_FORBID_EXTRA_KEYS : options.mode === "strip" ? FLAG_STRIP_EXTRA_KEYS : options.mode === "passthrough" ? 0 : FLAG_FORBID_EXTRA_KEYS); 408 + return r === void 0 || r.ok ? { ok: true, value: r === void 0 ? v : r.value } : new ErrImpl(r); 409 + } 410 + /** 411 + * Parse a value. Throw a ValitaError on failure. 412 + */ 413 + parse(v, options) { 414 + const r = callMatcher(this[MATCHER_SYMBOL], v, options === void 0 ? FLAG_FORBID_EXTRA_KEYS : options.mode === "strip" ? FLAG_STRIP_EXTRA_KEYS : options.mode === "passthrough" ? 0 : FLAG_FORBID_EXTRA_KEYS); 415 + if (r === void 0 || r.ok) { 416 + return r === void 0 ? v : r.value; 417 + } 418 + throw new ValitaError2(r); 419 + } 420 + }; 421 + var SimpleUnion = class extends Type { 422 + static { 423 + __name(this, "SimpleUnion"); 424 + } 425 + constructor(options) { 426 + super(); 427 + this.name = "union"; 428 + this.options = options; 429 + } 430 + get [MATCHER_SYMBOL]() { 431 + const options = this.options.map((o) => o[MATCHER_SYMBOL]); 432 + return lazyProperty(this, MATCHER_SYMBOL, taggedMatcher(TAG_SIMPLE_UNION, (v, flags) => { 433 + let issue = ISSUE_EXPECTED_NOTHING; 434 + for (const option of options) { 435 + const result = callMatcher(option, v, flags); 436 + if (result === void 0 || result.ok) { 437 + return result; 438 + } 439 + issue = result; 440 + } 441 + return issue; 442 + }), false); 443 + } 444 + _toTerminals(func) { 445 + for (const option of this.options) { 446 + option._toTerminals(func); 447 + } 448 + } 449 + }; 450 + var Optional = class extends AbstractType { 451 + static { 452 + __name(this, "Optional"); 453 + } 454 + constructor(type) { 455 + super(); 456 + this.name = "optional"; 457 + this.type = type; 458 + } 459 + optional(defaultFn) { 460 + if (!defaultFn) { 461 + return this; 462 + } 463 + return new TransformType(this, (v) => { 464 + return v === void 0 ? { ok: true, value: defaultFn() } : void 0; 465 + }); 466 + } 467 + get [MATCHER_SYMBOL]() { 468 + const matcher = this.type[MATCHER_SYMBOL]; 469 + return lazyProperty(this, MATCHER_SYMBOL, taggedMatcher(TAG_OPTIONAL, (v, flags) => v === void 0 || flags & FLAG_MISSING_VALUE ? void 0 : callMatcher(matcher, v, flags)), false); 470 + } 471 + _toTerminals(func) { 472 + func(this); 473 + func(undefined_()); 474 + this.type._toTerminals(func); 475 + } 476 + }; 477 + function setBit(bits, index) { 478 + if (typeof bits !== "number") { 479 + const idx = index >> 5; 480 + for (let i = bits.length; i <= idx; i++) { 481 + bits.push(0); 482 + } 483 + bits[idx] |= 1 << index % 32; 484 + return bits; 485 + } else if (index < 32) { 486 + return bits | 1 << index; 487 + } else { 488 + return setBit([bits, 0], index); 489 + } 490 + } 491 + __name(setBit, "setBit"); 492 + function getBit(bits, index) { 493 + if (typeof bits === "number") { 494 + return index < 32 ? bits >>> index & 1 : 0; 495 + } else { 496 + return bits[index >> 5] >>> index % 32 & 1; 497 + } 498 + } 499 + __name(getBit, "getBit"); 500 + var ObjectType = class _ObjectType extends Type { 501 + static { 502 + __name(this, "ObjectType"); 503 + } 504 + constructor(shape, restType, checks) { 505 + super(); 506 + this.name = "object"; 507 + this.shape = shape; 508 + this._restType = restType; 509 + this._checks = checks; 510 + } 511 + get [MATCHER_SYMBOL]() { 512 + const func = createObjectMatcher(this.shape, this._restType, this._checks); 513 + return lazyProperty(this, MATCHER_SYMBOL, taggedMatcher(TAG_OBJECT, (v, flags) => isObject(v) ? func(v, flags) : ISSUE_EXPECTED_OBJECT), false); 514 + } 515 + check(func, error) { 516 + const issue = { ok: false, code: "custom_error", error }; 517 + return new _ObjectType(this.shape, this._restType, [ 518 + ...this._checks ?? [], 519 + { 520 + func, 521 + issue 522 + } 523 + ]); 524 + } 525 + rest(restType) { 526 + return new _ObjectType(this.shape, restType); 527 + } 528 + extend(shape) { 529 + return new _ObjectType({ ...this.shape, ...shape }, this._restType); 530 + } 531 + pick(...keys) { 532 + const shape = {}; 533 + for (const key of keys) { 534 + set(shape, key, this.shape[key]); 535 + } 536 + return new _ObjectType(shape, void 0); 537 + } 538 + omit(...keys) { 539 + const shape = { ...this.shape }; 540 + for (const key of keys) { 541 + delete shape[key]; 542 + } 543 + return new _ObjectType(shape, this._restType); 544 + } 545 + partial() { 546 + const shape = {}; 547 + for (const key of Object.keys(this.shape)) { 548 + set(shape, key, this.shape[key].optional()); 549 + } 550 + const rest = this._restType?.optional(); 551 + return new _ObjectType(shape, rest); 552 + } 553 + }; 554 + function set(obj, key, value) { 555 + if (key === "__proto__") { 556 + Object.defineProperty(obj, key, { 557 + value, 558 + writable: true, 559 + enumerable: true, 560 + configurable: true 561 + }); 562 + } else { 563 + obj[key] = value; 564 + } 565 + } 566 + __name(set, "set"); 567 + function createObjectMatcher(shape, rest, checks) { 568 + const indexedEntries = Object.keys(shape).map((key, index) => { 569 + const type = shape[key]; 570 + let optional = false; 571 + type._toTerminals((t) => { 572 + optional ||= t.name === "optional"; 573 + }); 574 + return { 575 + key, 576 + index, 577 + matcher: type[MATCHER_SYMBOL], 578 + optional, 579 + missing: prependPath(key, ISSUE_MISSING_VALUE) 580 + }; 581 + }); 582 + const keyedEntries = /* @__PURE__ */ Object.create(null); 583 + for (const entry of indexedEntries) { 584 + keyedEntries[entry.key] = entry; 585 + } 586 + const restMatcher = rest?.[MATCHER_SYMBOL]; 587 + const fastPath = indexedEntries.length === 0 && rest?.name === "unknown" && checks === void 0; 588 + return (obj, flags) => { 589 + if (fastPath) { 590 + return void 0; 591 + } 592 + let output = void 0; 593 + let issues = void 0; 594 + let unrecognized = void 0; 595 + let seenBits = 0; 596 + let seenCount = 0; 597 + if (flags & (FLAG_FORBID_EXTRA_KEYS | FLAG_STRIP_EXTRA_KEYS) || restMatcher !== void 0) { 598 + for (const key in obj) { 599 + const value = obj[key]; 600 + const entry = keyedEntries[key]; 601 + if (entry === void 0 && restMatcher === void 0) { 602 + if (flags & FLAG_FORBID_EXTRA_KEYS) { 603 + if (unrecognized === void 0) { 604 + unrecognized = [key]; 605 + issues = joinIssues(issues, { 606 + ok: false, 607 + code: "unrecognized_keys", 608 + keys: unrecognized 609 + }); 610 + } else { 611 + unrecognized.push(key); 612 + } 613 + } else if (flags & FLAG_STRIP_EXTRA_KEYS && issues === void 0 && output === void 0) { 614 + output = {}; 615 + for (let m = 0; m < indexedEntries.length; m++) { 616 + if (getBit(seenBits, m)) { 617 + const k = indexedEntries[m].key; 618 + set(output, k, obj[k]); 619 + } 620 + } 621 + } 622 + continue; 623 + } 624 + const r = entry === void 0 ? callMatcher(restMatcher, value, flags) : callMatcher(entry.matcher, value, flags); 625 + if (r === void 0) { 626 + if (output !== void 0 && issues === void 0) { 627 + set(output, key, value); 628 + } 629 + } else if (!r.ok) { 630 + issues = joinIssues(issues, prependPath(key, r)); 631 + } else if (issues === void 0) { 632 + if (output === void 0) { 633 + output = {}; 634 + if (restMatcher === void 0) { 635 + for (let m = 0; m < indexedEntries.length; m++) { 636 + if (getBit(seenBits, m)) { 637 + const k = indexedEntries[m].key; 638 + set(output, k, obj[k]); 639 + } 640 + } 641 + } else { 642 + for (const k in obj) { 643 + set(output, k, obj[k]); 644 + } 645 + } 646 + } 647 + set(output, key, r.value); 648 + } 649 + if (entry !== void 0) { 650 + seenCount++; 651 + seenBits = setBit(seenBits, entry.index); 652 + } 653 + } 654 + } 655 + if (seenCount < indexedEntries.length) { 656 + for (let i = 0; i < indexedEntries.length; i++) { 657 + if (getBit(seenBits, i)) { 658 + continue; 659 + } 660 + const entry = indexedEntries[i]; 661 + const value = obj[entry.key]; 662 + let extraFlags = 0; 663 + if (value === void 0 && !(entry.key in obj)) { 664 + if (!entry.optional) { 665 + issues = joinIssues(issues, entry.missing); 666 + continue; 667 + } 668 + extraFlags = FLAG_MISSING_VALUE; 669 + } 670 + const r = callMatcher(entry.matcher, value, flags | extraFlags); 671 + if (r === void 0) { 672 + if (output !== void 0 && issues === void 0 && !extraFlags) { 673 + set(output, entry.key, value); 674 + } 675 + } else if (!r.ok) { 676 + issues = joinIssues(issues, prependPath(entry.key, r)); 677 + } else if (issues === void 0) { 678 + if (output === void 0) { 679 + output = {}; 680 + if (restMatcher === void 0) { 681 + for (let m = 0; m < indexedEntries.length; m++) { 682 + if (m < i || getBit(seenBits, m)) { 683 + const k = indexedEntries[m].key; 684 + set(output, k, obj[k]); 685 + } 686 + } 687 + } else { 688 + for (const k in obj) { 689 + set(output, k, obj[k]); 690 + } 691 + for (let m = 0; m < i; m++) { 692 + if (!getBit(seenBits, m)) { 693 + const k = indexedEntries[m].key; 694 + set(output, k, obj[k]); 695 + } 696 + } 697 + } 698 + } 699 + set(output, entry.key, r.value); 700 + } 701 + } 702 + } 703 + if (issues !== void 0) { 704 + return issues; 705 + } 706 + if (checks !== void 0) { 707 + for (const { func, issue } of checks) { 708 + if (!func(output ?? obj)) { 709 + return issue; 710 + } 711 + } 712 + } 713 + return output && { ok: true, value: output }; 714 + }; 715 + } 716 + __name(createObjectMatcher, "createObjectMatcher"); 717 + var ArrayOrTupleType = class _ArrayOrTupleType extends Type { 718 + static { 719 + __name(this, "ArrayOrTupleType"); 720 + } 721 + constructor(prefix, rest, suffix) { 722 + super(); 723 + this.name = "array"; 724 + this._prefix = prefix; 725 + this._rest = rest; 726 + this._suffix = suffix; 727 + } 728 + get [MATCHER_SYMBOL]() { 729 + const prefix = this._prefix.map((t) => t[MATCHER_SYMBOL]); 730 + const suffix = this._suffix.map((t) => t[MATCHER_SYMBOL]); 731 + const rest = this._rest?.[MATCHER_SYMBOL] ?? taggedMatcher(1, () => ISSUE_MISSING_VALUE); 732 + const minLength = prefix.length + suffix.length; 733 + const maxLength = this._rest ? Infinity : minLength; 734 + const invalidLength = { 735 + ok: false, 736 + code: "invalid_length", 737 + minLength, 738 + maxLength: maxLength === Infinity ? void 0 : maxLength 739 + }; 740 + return lazyProperty(this, MATCHER_SYMBOL, taggedMatcher(TAG_ARRAY, (arr, flags) => { 741 + if (!Array.isArray(arr)) { 742 + return ISSUE_EXPECTED_ARRAY; 743 + } 744 + const length = arr.length; 745 + if (length < minLength || length > maxLength) { 746 + return invalidLength; 747 + } 748 + const headEnd = prefix.length; 749 + const tailStart = arr.length - suffix.length; 750 + let issueTree = void 0; 751 + let output = arr; 752 + for (let i = 0; i < arr.length; i++) { 753 + const entry = i < headEnd ? prefix[i] : i >= tailStart ? suffix[i - tailStart] : rest; 754 + const r = callMatcher(entry, arr[i], flags); 755 + if (r !== void 0) { 756 + if (r.ok) { 757 + if (output === arr) { 758 + output = arr.slice(); 759 + } 760 + output[i] = r.value; 761 + } else { 762 + issueTree = joinIssues(issueTree, prependPath(i, r)); 763 + } 764 + } 765 + } 766 + if (issueTree) { 767 + return issueTree; 768 + } else if (arr === output) { 769 + return void 0; 770 + } else { 771 + return { ok: true, value: output }; 772 + } 773 + }), false); 774 + } 775 + concat(type) { 776 + if (this._rest) { 777 + if (type._rest) { 778 + throw new TypeError("can not concatenate two variadic types"); 779 + } 780 + return new _ArrayOrTupleType(this._prefix, this._rest, [ 781 + ...this._suffix, 782 + ...type._prefix, 783 + ...type._suffix 784 + ]); 785 + } else if (type._rest) { 786 + return new _ArrayOrTupleType([...this._prefix, ...this._suffix, ...type._prefix], type._rest, type._suffix); 787 + } else { 788 + return new _ArrayOrTupleType([...this._prefix, ...this._suffix, ...type._prefix, ...type._suffix], type._rest, type._suffix); 789 + } 790 + } 791 + }; 792 + function toInputType(v) { 793 + const type = typeof v; 794 + if (type !== "object") { 795 + return type; 796 + } else if (v === null) { 797 + return "null"; 798 + } else if (Array.isArray(v)) { 799 + return "array"; 800 + } else { 801 + return type; 802 + } 803 + } 804 + __name(toInputType, "toInputType"); 805 + function dedup(arr) { 806 + return [...new Set(arr)]; 807 + } 808 + __name(dedup, "dedup"); 809 + function groupTerminals(terminals) { 810 + const order = /* @__PURE__ */ new Map(); 811 + const literals = /* @__PURE__ */ new Map(); 812 + const types = /* @__PURE__ */ new Map(); 813 + const unknowns = []; 814 + const optionals = []; 815 + const expectedTypes = []; 816 + for (const { root, terminal } of terminals) { 817 + order.set(root, order.get(root) ?? order.size); 818 + if (terminal.name === "never") { 819 + } else if (terminal.name === "optional") { 820 + optionals.push(root); 821 + } else if (terminal.name === "unknown") { 822 + unknowns.push(root); 823 + } else if (terminal.name === "literal") { 824 + const roots = literals.get(terminal.value) ?? []; 825 + roots.push(root); 826 + literals.set(terminal.value, roots); 827 + expectedTypes.push(toInputType(terminal.value)); 828 + } else { 829 + const roots = types.get(terminal.name) ?? []; 830 + roots.push(root); 831 + types.set(terminal.name, roots); 832 + expectedTypes.push(terminal.name); 833 + } 834 + } 835 + const byOrder = /* @__PURE__ */ __name((a, b) => { 836 + return (order.get(a) ?? 0) - (order.get(b) ?? 0); 837 + }, "byOrder"); 838 + for (const [value, roots] of literals) { 839 + const options = types.get(toInputType(value)); 840 + if (options) { 841 + options.push(...roots); 842 + literals.delete(value); 843 + } else { 844 + literals.set(value, dedup(roots.concat(unknowns)).sort(byOrder)); 845 + } 846 + } 847 + for (const [type, roots] of types) { 848 + types.set(type, dedup(roots.concat(unknowns)).sort(byOrder)); 849 + } 850 + return { 851 + types, 852 + literals, 853 + unknowns: dedup(unknowns).sort(byOrder), 854 + optionals: dedup(optionals).sort(byOrder), 855 + expectedTypes: dedup(expectedTypes) 856 + }; 857 + } 858 + __name(groupTerminals, "groupTerminals"); 859 + function createObjectKeyMatcher(objects, key) { 860 + const list = []; 861 + for (const { root, terminal } of objects) { 862 + terminal.shape[key]._toTerminals((t) => list.push({ root, terminal: t })); 863 + } 864 + const { types, literals, optionals, unknowns, expectedTypes } = groupTerminals(list); 865 + if (unknowns.length > 0 || optionals.length > 1) { 866 + return void 0; 867 + } 868 + for (const roots of literals.values()) { 869 + if (roots.length > 1) { 870 + return void 0; 871 + } 872 + } 873 + for (const roots of types.values()) { 874 + if (roots.length > 1) { 875 + return void 0; 876 + } 877 + } 878 + const missingValue = prependPath(key, ISSUE_MISSING_VALUE); 879 + const issue = prependPath(key, types.size === 0 ? { 880 + ok: false, 881 + code: "invalid_literal", 882 + expected: [...literals.keys()] 883 + } : { 884 + ok: false, 885 + code: "invalid_type", 886 + expected: expectedTypes 887 + }); 888 + const byLiteral = literals.size > 0 ? /* @__PURE__ */ new Map() : void 0; 889 + if (byLiteral) { 890 + for (const [literal4, options] of literals) { 891 + byLiteral.set(literal4, options[0][MATCHER_SYMBOL]); 892 + } 893 + } 894 + const byType = types.size > 0 ? {} : void 0; 895 + if (byType) { 896 + for (const [type, options] of types) { 897 + byType[type] = options[0][MATCHER_SYMBOL]; 898 + } 899 + } 900 + const optional = optionals[0]?.[MATCHER_SYMBOL]; 901 + return (obj, flags) => { 902 + const value = obj[key]; 903 + if (value === void 0 && !(key in obj)) { 904 + return optional === void 0 ? missingValue : callMatcher(optional, obj, flags); 905 + } 906 + const option = byType?.[toInputType(value)] ?? byLiteral?.get(value); 907 + return option ? callMatcher(option, obj, flags) : issue; 908 + }; 909 + } 910 + __name(createObjectKeyMatcher, "createObjectKeyMatcher"); 911 + function createUnionObjectMatcher(terminals) { 912 + const objects = []; 913 + const keyCounts = /* @__PURE__ */ new Map(); 914 + for (const { root, terminal } of terminals) { 915 + if (terminal.name === "unknown") { 916 + return void 0; 917 + } 918 + if (terminal.name === "object") { 919 + for (const key in terminal.shape) { 920 + keyCounts.set(key, (keyCounts.get(key) ?? 0) + 1); 921 + } 922 + objects.push({ root, terminal }); 923 + } 924 + } 925 + if (objects.length < 2) { 926 + return void 0; 927 + } 928 + for (const [key, count] of keyCounts) { 929 + if (count === objects.length) { 930 + const matcher = createObjectKeyMatcher(objects, key); 931 + if (matcher) { 932 + return matcher; 933 + } 934 + } 935 + } 936 + return void 0; 937 + } 938 + __name(createUnionObjectMatcher, "createUnionObjectMatcher"); 939 + function createUnionBaseMatcher(terminals) { 940 + const { expectedTypes, literals, types, unknowns, optionals } = groupTerminals(terminals); 941 + const issue = types.size === 0 && unknowns.length === 0 ? { 942 + ok: false, 943 + code: "invalid_literal", 944 + expected: [...literals.keys()] 945 + } : { 946 + ok: false, 947 + code: "invalid_type", 948 + expected: expectedTypes 949 + }; 950 + const byLiteral = literals.size > 0 ? /* @__PURE__ */ new Map() : void 0; 951 + if (byLiteral) { 952 + for (const [literal4, options] of literals) { 953 + byLiteral.set(literal4, options.map((t) => t[MATCHER_SYMBOL])); 954 + } 955 + } 956 + const byType = types.size > 0 ? {} : void 0; 957 + if (byType) { 958 + for (const [type, options] of types) { 959 + byType[type] = options.map((t) => t[MATCHER_SYMBOL]); 960 + } 961 + } 962 + const optionalMatchers = optionals.map((t) => t[MATCHER_SYMBOL]); 963 + const unknownMatchers = unknowns.map((t) => t[MATCHER_SYMBOL]); 964 + return (value, flags) => { 965 + const options = flags & FLAG_MISSING_VALUE ? optionalMatchers : byType?.[toInputType(value)] ?? byLiteral?.get(value) ?? unknownMatchers; 966 + let count = 0; 967 + let issueTree = issue; 968 + for (let i = 0; i < options.length; i++) { 969 + const r = callMatcher(options[i], value, flags); 970 + if (r === void 0 || r.ok) { 971 + return r; 972 + } 973 + issueTree = count > 0 ? joinIssues(issueTree, r) : r; 974 + count++; 975 + } 976 + if (count > 1) { 977 + return { ok: false, code: "invalid_union", tree: issueTree }; 978 + } 979 + return issueTree; 980 + }; 981 + } 982 + __name(createUnionBaseMatcher, "createUnionBaseMatcher"); 983 + var UnionType = class extends Type { 984 + static { 985 + __name(this, "UnionType"); 986 + } 987 + constructor(options) { 988 + super(); 989 + this.name = "union"; 990 + this.options = options; 991 + } 992 + _toTerminals(func) { 993 + for (const option of this.options) { 994 + option._toTerminals(func); 995 + } 996 + } 997 + get [MATCHER_SYMBOL]() { 998 + const flattened = []; 999 + for (const option of this.options) { 1000 + option._toTerminals((terminal) => { 1001 + flattened.push({ root: option, terminal }); 1002 + }); 1003 + } 1004 + const base = createUnionBaseMatcher(flattened); 1005 + const object7 = createUnionObjectMatcher(flattened); 1006 + return lazyProperty(this, MATCHER_SYMBOL, taggedMatcher(TAG_UNION, (v, f) => object7 !== void 0 && isObject(v) ? object7(v, f) : base(v, f)), false); 1007 + } 1008 + }; 1009 + var STRICT = Object.freeze({ mode: "strict" }); 1010 + var STRIP = Object.freeze({ mode: "strip" }); 1011 + var PASSTHROUGH = Object.freeze({ mode: "passthrough" }); 1012 + function flagsToOptions(flags) { 1013 + return flags & FLAG_FORBID_EXTRA_KEYS ? STRICT : flags & FLAG_STRIP_EXTRA_KEYS ? STRIP : PASSTHROUGH; 1014 + } 1015 + __name(flagsToOptions, "flagsToOptions"); 1016 + var TransformType = class _TransformType extends Type { 1017 + static { 1018 + __name(this, "TransformType"); 1019 + } 1020 + constructor(transformed, transform) { 1021 + super(); 1022 + this.name = "transform"; 1023 + this._transformed = transformed; 1024 + this._transform = transform; 1025 + } 1026 + get [MATCHER_SYMBOL]() { 1027 + const chain = []; 1028 + let next = this; 1029 + while (next instanceof _TransformType) { 1030 + chain.push(next._transform); 1031 + next = next._transformed; 1032 + } 1033 + chain.reverse(); 1034 + const matcher = next[MATCHER_SYMBOL]; 1035 + const undef = ok3(void 0); 1036 + return lazyProperty(this, MATCHER_SYMBOL, taggedMatcher(TAG_TRANSFORM, (v, flags) => { 1037 + let result = callMatcher(matcher, v, flags); 1038 + if (result !== void 0 && !result.ok) { 1039 + return result; 1040 + } 1041 + let current; 1042 + if (result !== void 0) { 1043 + current = result.value; 1044 + } else if (flags & FLAG_MISSING_VALUE) { 1045 + current = void 0; 1046 + result = undef; 1047 + } else { 1048 + current = v; 1049 + } 1050 + for (let i = 0; i < chain.length; i++) { 1051 + const r = chain[i](current, flags); 1052 + if (r !== void 0) { 1053 + if (!r.ok) { 1054 + return r; 1055 + } 1056 + current = r.value; 1057 + result = r; 1058 + } 1059 + } 1060 + return result; 1061 + }), false); 1062 + } 1063 + _toTerminals(func) { 1064 + this._transformed._toTerminals(func); 1065 + } 1066 + }; 1067 + var LazyType = class extends Type { 1068 + static { 1069 + __name(this, "LazyType"); 1070 + } 1071 + constructor(definer) { 1072 + super(); 1073 + this.name = "lazy"; 1074 + this._recursing = false; 1075 + this._definer = definer; 1076 + } 1077 + get type() { 1078 + return lazyProperty(this, "type", this._definer(), true); 1079 + } 1080 + get [MATCHER_SYMBOL]() { 1081 + const matcher = taggedMatcher(TAG_OTHER, (value, flags) => { 1082 + const typeMatcher = this.type[MATCHER_SYMBOL]; 1083 + matcher.tag = typeMatcher.tag; 1084 + matcher.match = typeMatcher.match; 1085 + lazyProperty(this, MATCHER_SYMBOL, typeMatcher, false); 1086 + return callMatcher(typeMatcher, value, flags); 1087 + }); 1088 + return matcher; 1089 + } 1090 + _toTerminals(func) { 1091 + if (!this._recursing) { 1092 + this._recursing = true; 1093 + try { 1094 + this.type._toTerminals(func); 1095 + } finally { 1096 + this._recursing = false; 1097 + } 1098 + } 1099 + } 1100 + }; 1101 + function singleton(name, tag, match) { 1102 + const value = taggedMatcher(tag, match); 1103 + class SimpleType extends Type { 1104 + static { 1105 + __name(this, "SimpleType"); 1106 + } 1107 + constructor() { 1108 + super(); 1109 + this.name = name; 1110 + this[MATCHER_SYMBOL] = value; 1111 + } 1112 + } 1113 + const instance = new SimpleType(); 1114 + return /* @__NO_SIDE_EFFECTS__ */ () => instance; 1115 + } 1116 + __name(singleton, "singleton"); 1117 + exports.unknown = singleton("unknown", TAG_UNKNOWN, () => void 0); 1118 + exports.never = singleton("never", TAG_NEVER, () => ISSUE_EXPECTED_NOTHING); 1119 + exports.string = singleton("string", TAG_STRING, (v) => typeof v === "string" ? void 0 : ISSUE_EXPECTED_STRING); 1120 + exports.number = singleton("number", TAG_NUMBER, (v) => typeof v === "number" ? void 0 : ISSUE_EXPECTED_NUMBER); 1121 + exports.bigint = singleton("bigint", TAG_BIGINT, (v) => typeof v === "bigint" ? void 0 : ISSUE_EXPECTED_BIGINT); 1122 + exports.boolean = singleton("boolean", TAG_BOOLEAN, (v) => typeof v === "boolean" ? void 0 : ISSUE_EXPECTED_BOOLEAN); 1123 + var null_ = /* @__PURE__ */ singleton("null", TAG_NULL, (v) => v === null ? void 0 : ISSUE_EXPECTED_NULL); 1124 + exports.null = null_; 1125 + var undefined_ = /* @__PURE__ */ singleton("undefined", TAG_UNDEFINED, (v) => v === void 0 ? void 0 : ISSUE_EXPECTED_UNDEFINED); 1126 + exports.undefined = undefined_; 1127 + var LiteralType = class extends Type { 1128 + static { 1129 + __name(this, "LiteralType"); 1130 + } 1131 + constructor(value) { 1132 + super(); 1133 + this.name = "literal"; 1134 + const issue = { 1135 + ok: false, 1136 + code: "invalid_literal", 1137 + expected: [value] 1138 + }; 1139 + this[MATCHER_SYMBOL] = taggedMatcher(TAG_LITERAL, (v) => v === value ? void 0 : issue); 1140 + this.value = value; 1141 + } 1142 + }; 1143 + var literal3 = /* @__PURE__ */ __name((value) => { 1144 + return /* @__PURE__ */ new LiteralType(value); 1145 + }, "literal"); 1146 + exports.literal = literal3; 1147 + var object6 = /* @__PURE__ */ __name((obj) => { 1148 + return /* @__PURE__ */ new ObjectType(obj, void 0); 1149 + }, "object"); 1150 + exports.object = object6; 1151 + var record2 = /* @__PURE__ */ __name((valueType) => { 1152 + return /* @__PURE__ */ new ObjectType({}, valueType ?? (0, exports.unknown)()); 1153 + }, "record"); 1154 + exports.record = record2; 1155 + var array3 = /* @__PURE__ */ __name((item) => { 1156 + return /* @__PURE__ */ new ArrayOrTupleType([], item ?? (0, exports.unknown)(), []); 1157 + }, "array"); 1158 + exports.array = array3; 1159 + var tuple2 = /* @__PURE__ */ __name((items) => { 1160 + return /* @__PURE__ */ new ArrayOrTupleType(items, void 0, []); 1161 + }, "tuple"); 1162 + exports.tuple = tuple2; 1163 + var union4 = /* @__PURE__ */ __name((...options) => { 1164 + return /* @__PURE__ */ new UnionType(options); 1165 + }, "union"); 1166 + exports.union = union4; 1167 + var lazy = /* @__PURE__ */ __name((definer) => { 1168 + return new LazyType(definer); 1169 + }, "lazy"); 1170 + exports.lazy = lazy; 1171 + } 1172 + }); 1173 + 1174 + // components/output/raw/atproto/oauth.js 1175 + init_Buffer(); 1176 + init_process(); 1177 + 1178 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/index.js 1179 + init_Buffer(); 1180 + init_process(); 1181 + 1182 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/environment.js 1183 + init_Buffer(); 1184 + init_process(); 1185 + 1186 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/store/db.js 1187 + init_Buffer(); 1188 + init_process(); 1189 + 1190 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/utils/runtime.js 1191 + init_Buffer(); 1192 + init_process(); 1193 + var locks = typeof navigator !== "undefined" ? navigator.locks : void 0; 1194 + 1195 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/store/db.js 1196 + var parse = /* @__PURE__ */ __name((raw) => { 1197 + if (raw != null) { 1198 + const parsed = JSON.parse(raw); 1199 + if (parsed != null) { 1200 + return parsed; 1201 + } 1202 + } 1203 + return {}; 1204 + }, "parse"); 1205 + var createOAuthDatabase = /* @__PURE__ */ __name(({ name }) => { 1206 + const controller = new AbortController(); 1207 + const signal = controller.signal; 1208 + const createStore = /* @__PURE__ */ __name((subname, expiresAt, persistUpdatedAt = false) => { 1209 + let store; 1210 + const storageKey = `${name}:${subname}`; 1211 + const persist = /* @__PURE__ */ __name(() => store && localStorage.setItem(storageKey, JSON.stringify(store)), "persist"); 1212 + const read = /* @__PURE__ */ __name(() => { 1213 + if (signal.aborted) { 1214 + throw new Error(`store closed`); 1215 + } 1216 + return store ??= parse(localStorage.getItem(storageKey)); 1217 + }, "read"); 1218 + { 1219 + const listener = /* @__PURE__ */ __name((ev) => { 1220 + if (ev.key === storageKey) { 1221 + store = void 0; 1222 + } 1223 + }, "listener"); 1224 + globalThis.addEventListener("storage", listener, { signal }); 1225 + } 1226 + { 1227 + const cleanup = /* @__PURE__ */ __name(async (lock) => { 1228 + if (!lock || signal.aborted) { 1229 + return; 1230 + } 1231 + await new Promise((resolve) => setTimeout(resolve, 1e4)); 1232 + if (signal.aborted) { 1233 + return; 1234 + } 1235 + let now = Date.now(); 1236 + let changed = false; 1237 + read(); 1238 + for (const key in store) { 1239 + const item = store[key]; 1240 + const expiresAt2 = item.expiresAt; 1241 + if (expiresAt2 !== null && now > expiresAt2) { 1242 + changed = true; 1243 + delete store[key]; 1244 + } 1245 + } 1246 + if (changed) { 1247 + persist(); 1248 + } 1249 + }, "cleanup"); 1250 + if (locks) { 1251 + locks.request(`${storageKey}:cleanup`, { ifAvailable: true }, cleanup); 1252 + } else { 1253 + cleanup(true); 1254 + } 1255 + } 1256 + return { 1257 + get(key) { 1258 + read(); 1259 + const item = store[key]; 1260 + if (!item) { 1261 + return; 1262 + } 1263 + const expiresAt2 = item.expiresAt; 1264 + if (expiresAt2 !== null && Date.now() > expiresAt2) { 1265 + delete store[key]; 1266 + persist(); 1267 + return; 1268 + } 1269 + return item.value; 1270 + }, 1271 + getWithLapsed(key) { 1272 + read(); 1273 + const item = store[key]; 1274 + const now = Date.now(); 1275 + if (!item) { 1276 + return [void 0, Infinity]; 1277 + } 1278 + const updatedAt = item.updatedAt; 1279 + if (updatedAt === void 0) { 1280 + return [item.value, Infinity]; 1281 + } 1282 + return [item.value, now - updatedAt]; 1283 + }, 1284 + set(key, value) { 1285 + read(); 1286 + const item = { 1287 + value, 1288 + expiresAt: expiresAt(value), 1289 + updatedAt: persistUpdatedAt ? Date.now() : void 0 1290 + }; 1291 + store[key] = item; 1292 + persist(); 1293 + }, 1294 + delete(key) { 1295 + read(); 1296 + if (store[key] !== void 0) { 1297 + delete store[key]; 1298 + persist(); 1299 + } 1300 + }, 1301 + keys() { 1302 + read(); 1303 + return Object.keys(store); 1304 + } 1305 + }; 1306 + }, "createStore"); 1307 + return { 1308 + dispose: /* @__PURE__ */ __name(() => { 1309 + controller.abort(); 1310 + }, "dispose"), 1311 + sessions: createStore("sessions", ({ token }) => { 1312 + if (token.refresh) { 1313 + return null; 1314 + } 1315 + return token.expires_at ?? null; 1316 + }), 1317 + states: createStore("states", (_item) => Date.now() + 10 * 60 * 1e3), 1318 + // 10 minutes 1319 + // The reference PDS have nonces that expire after 3 minutes, while other 1320 + // implementations can have varying expiration times. 1321 + // Stored for 24 hours. 1322 + dpopNonces: createStore("dpopNonces", (_item) => Date.now() + 24 * 60 * 60 * 1e3, true), 1323 + inflightDpop: /* @__PURE__ */ new Map() 1324 + }; 1325 + }, "createOAuthDatabase"); 1326 + 1327 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/environment.js 1328 + var CLIENT_ID; 1329 + var REDIRECT_URI; 1330 + var fetchClientAssertion; 1331 + var database; 1332 + var identityResolver; 1333 + var configureOAuth = /* @__PURE__ */ __name((options) => { 1334 + ({ identityResolver, fetchClientAssertion } = options); 1335 + ({ client_id: CLIENT_ID, redirect_uri: REDIRECT_URI } = options.metadata); 1336 + database = createOAuthDatabase({ name: options.storageName ?? "atcute-oauth" }); 1337 + }, "configureOAuth"); 1338 + 1339 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/errors.js 1340 + init_Buffer(); 1341 + init_process(); 1342 + var LoginError = class extends Error { 1343 + static { 1344 + __name(this, "LoginError"); 1345 + } 1346 + name = "LoginError"; 1347 + }; 1348 + var AuthorizationError = class extends Error { 1349 + static { 1350 + __name(this, "AuthorizationError"); 1351 + } 1352 + name = "AuthorizationError"; 1353 + }; 1354 + var ResolverError = class extends Error { 1355 + static { 1356 + __name(this, "ResolverError"); 1357 + } 1358 + name = "ResolverError"; 1359 + }; 1360 + var TokenRefreshError = class extends Error { 1361 + static { 1362 + __name(this, "TokenRefreshError"); 1363 + } 1364 + sub; 1365 + name = "TokenRefreshError"; 1366 + constructor(sub, message, options) { 1367 + super(message, options); 1368 + this.sub = sub; 1369 + } 1370 + }; 1371 + var OAuthResponseError = class extends Error { 1372 + static { 1373 + __name(this, "OAuthResponseError"); 1374 + } 1375 + response; 1376 + data; 1377 + name = "OAuthResponseError"; 1378 + error; 1379 + description; 1380 + constructor(response2, data) { 1381 + const error = ifString(ifObject(data)?.["error"]); 1382 + const errorDescription = ifString(ifObject(data)?.["error_description"]); 1383 + const messageError = error ? `"${error}"` : "unknown"; 1384 + const messageDesc = errorDescription ? `: ${errorDescription}` : ""; 1385 + const message = `OAuth ${messageError} error${messageDesc}`; 1386 + super(message); 1387 + this.response = response2; 1388 + this.data = data; 1389 + this.error = error; 1390 + this.description = errorDescription; 1391 + } 1392 + get status() { 1393 + return this.response.status; 1394 + } 1395 + get headers() { 1396 + return this.response.headers; 1397 + } 1398 + }; 1399 + var FetchResponseError = class extends Error { 1400 + static { 1401 + __name(this, "FetchResponseError"); 1402 + } 1403 + response; 1404 + status; 1405 + name = "FetchResponseError"; 1406 + constructor(response2, status, message) { 1407 + super(message); 1408 + this.response = response2; 1409 + this.status = status; 1410 + } 1411 + }; 1412 + var ifString = /* @__PURE__ */ __name((v) => { 1413 + return typeof v === "string" ? v : void 0; 1414 + }, "ifString"); 1415 + var ifObject = /* @__PURE__ */ __name((v) => { 1416 + return typeof v === "object" && v !== null && !Array.isArray(v) ? v : void 0; 1417 + }, "ifObject"); 1418 + 1419 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/agents/exchange.js 1420 + init_Buffer(); 1421 + init_process(); 1422 + 1423 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/index.js 1424 + init_Buffer(); 1425 + init_process(); 1426 + 1427 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/client-assertion/index.js 1428 + init_Buffer(); 1429 + init_process(); 1430 + 1431 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/client-assertion/create-client-assertion.js 1432 + init_Buffer(); 1433 + init_process(); 1434 + 1435 + // ../node_modules/.deno/nanoid@5.1.6/node_modules/nanoid/index.js 1436 + init_Buffer(); 1437 + init_process(); 1438 + 1439 + // ../node_modules/.deno/nanoid@5.1.6/node_modules/nanoid/url-alphabet/index.js 1440 + init_Buffer(); 1441 + init_process(); 1442 + var urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"; 1443 + 1444 + // ../node_modules/.deno/nanoid@5.1.6/node_modules/nanoid/index.js 1445 + var POOL_SIZE_MULTIPLIER = 128; 1446 + var pool; 1447 + var poolOffset; 1448 + function fillPool(bytes) { 1449 + if (!pool || pool.length < bytes) { 1450 + pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER); 1451 + webcrypto.getRandomValues(pool); 1452 + poolOffset = 0; 1453 + } else if (poolOffset + bytes > pool.length) { 1454 + webcrypto.getRandomValues(pool); 1455 + poolOffset = 0; 1456 + } 1457 + poolOffset += bytes; 1458 + } 1459 + __name(fillPool, "fillPool"); 1460 + function nanoid(size = 21) { 1461 + fillPool(size |= 0); 1462 + let id = ""; 1463 + for (let i = poolOffset - size; i < poolOffset; i++) { 1464 + id += urlAlphabet[pool[i] & 63]; 1465 + } 1466 + return id; 1467 + } 1468 + __name(nanoid, "nanoid"); 1469 + 1470 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/internal/key-cache.js 1471 + init_Buffer(); 1472 + init_process(); 1473 + 1474 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/internal/jwk.js 1475 + init_Buffer(); 1476 + init_process(); 1477 + 1478 + // ../node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/dist/index.js 1479 + init_Buffer(); 1480 + init_process(); 1481 + 1482 + // ../node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/dist/bases/base16-node.js 1483 + init_Buffer(); 1484 + init_process(); 1485 + 1486 + // ../node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/dist/bases/base16-web-native.js 1487 + init_Buffer(); 1488 + init_process(); 1489 + 1490 + // ../node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/dist/bases/base16-web-polyfill.js 1491 + init_Buffer(); 1492 + init_process(); 1493 + 1494 + // ../node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/dist/utils.js 1495 + init_Buffer(); 1496 + init_process(); 1497 + 1498 + // ../node_modules/.deno/@atcute+uint8array@1.1.1/node_modules/@atcute/uint8array/dist/index.node.js 1499 + init_Buffer(); 1500 + init_process(); 1501 + var textEncoder = new TextEncoder(); 1502 + var textDecoder = new TextDecoder(); 1503 + var subtle = crypto.subtle; 1504 + var alloc = /* @__PURE__ */ __name((size) => { 1505 + return new Uint8Array(size); 1506 + }, "alloc"); 1507 + var allocUnsafe = alloc; 1508 + var encodeUtf8 = /* @__PURE__ */ __name((str) => { 1509 + return textEncoder.encode(str); 1510 + }, "encodeUtf8"); 1511 + var _fromCharCode = String.fromCharCode; 1512 + var toSha256 = /* @__PURE__ */ __name(async (buffer) => { 1513 + return new Uint8Array(await subtle.digest("SHA-256", buffer)); 1514 + }, "toSha256"); 1515 + 1516 + // ../node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/dist/utils.js 1517 + var createRfc4648Encode = /* @__PURE__ */ __name((alphabet, bitsPerChar, pad) => { 1518 + return (bytes) => { 1519 + const mask = (1 << bitsPerChar) - 1; 1520 + let str = ""; 1521 + let bits = 0; 1522 + let buffer = 0; 1523 + for (let i = 0; i < bytes.length; ++i) { 1524 + buffer = buffer << 8 | bytes[i]; 1525 + bits += 8; 1526 + while (bits > bitsPerChar) { 1527 + bits -= bitsPerChar; 1528 + str += alphabet[mask & buffer >> bits]; 1529 + } 1530 + } 1531 + if (bits !== 0) { 1532 + str += alphabet[mask & buffer << bitsPerChar - bits]; 1533 + } 1534 + if (pad) { 1535 + while ((str.length * bitsPerChar & 7) !== 0) { 1536 + str += "="; 1537 + } 1538 + } 1539 + return str; 1540 + }; 1541 + }, "createRfc4648Encode"); 1542 + var createRfc4648Decode = /* @__PURE__ */ __name((alphabet, bitsPerChar, pad) => { 1543 + const codes = {}; 1544 + for (let i = 0; i < alphabet.length; ++i) { 1545 + codes[alphabet[i]] = i; 1546 + } 1547 + return (str) => { 1548 + let end = str.length; 1549 + while (pad && str[end - 1] === "=") { 1550 + --end; 1551 + } 1552 + const bytes = allocUnsafe(end * bitsPerChar / 8 | 0); 1553 + let bits = 0; 1554 + let buffer = 0; 1555 + let written = 0; 1556 + for (let i = 0; i < end; ++i) { 1557 + const value = codes[str[i]]; 1558 + if (value === void 0) { 1559 + throw new SyntaxError(`invalid base string`); 1560 + } 1561 + buffer = buffer << bitsPerChar | value; 1562 + bits += bitsPerChar; 1563 + if (bits >= 8) { 1564 + bits -= 8; 1565 + bytes[written++] = 255 & buffer >> bits; 1566 + } 1567 + } 1568 + if (bits >= bitsPerChar || (255 & buffer << 8 - bits) !== 0) { 1569 + throw new SyntaxError("unexpected end of data"); 1570 + } 1571 + return bytes; 1572 + }; 1573 + }, "createRfc4648Decode"); 1574 + 1575 + // ../node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/dist/bases/base16-node.js 1576 + var HAS_NATIVE_SUPPORT = "fromHex" in Uint8Array; 1577 + 1578 + // ../node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/dist/bases/base64-node.js 1579 + init_Buffer(); 1580 + init_process(); 1581 + 1582 + // ../node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/dist/bases/base64-web-native.js 1583 + init_Buffer(); 1584 + init_process(); 1585 + var fromBase64Url = /* @__PURE__ */ __name((str) => { 1586 + return Uint8Array.fromBase64(str, { 1587 + alphabet: "base64url", 1588 + lastChunkHandling: "loose" 1589 + }); 1590 + }, "fromBase64Url"); 1591 + var toBase64Url = /* @__PURE__ */ __name((bytes) => { 1592 + return bytes.toBase64({ alphabet: "base64url", omitPadding: true }); 1593 + }, "toBase64Url"); 1594 + 1595 + // ../node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/dist/bases/base64-web-polyfill.js 1596 + init_Buffer(); 1597 + init_process(); 1598 + var BASE64URL_CHARSET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; 1599 + var fromBase64Url2 = /* @__PURE__ */ createRfc4648Decode(BASE64URL_CHARSET, 6, false); 1600 + var toBase64Url2 = /* @__PURE__ */ createRfc4648Encode(BASE64URL_CHARSET, 6, false); 1601 + 1602 + // ../node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/dist/bases/base64-node.js 1603 + var HAS_NATIVE_SUPPORT2 = "fromBase64" in Uint8Array; 1604 + var fromBase64Url3 = !HAS_NATIVE_SUPPORT2 ? fromBase64Url2 : fromBase64Url; 1605 + var toBase64Url3 = !HAS_NATIVE_SUPPORT2 ? toBase64Url2 : toBase64Url; 1606 + 1607 + // ../node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/dist/bases/base32.js 1608 + init_Buffer(); 1609 + init_process(); 1610 + 1611 + // ../node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/dist/bases/base32-encode.js 1612 + init_Buffer(); 1613 + init_process(); 1614 + var ALPHABET = "abcdefghijklmnopqrstuvwxyz234567"; 1615 + var _cc = (() => { 1616 + const t = new Uint8Array(32); 1617 + for (let i = 0; i < 32; i++) { 1618 + t[i] = ALPHABET.charCodeAt(i); 1619 + } 1620 + return t; 1621 + })(); 1622 + var _fromCharCode2 = String.fromCharCode; 1623 + 1624 + // ../node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/dist/bases/base32.js 1625 + var ALPHABET2 = "abcdefghijklmnopqrstuvwxyz234567"; 1626 + var _decodeLut = (() => { 1627 + const t = new Uint8Array(128).fill(255); 1628 + for (let i = 0; i < 32; i++) { 1629 + t[ALPHABET2.charCodeAt(i)] = i; 1630 + } 1631 + return t; 1632 + })(); 1633 + 1634 + // ../node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/dist/bases/base58.js 1635 + init_Buffer(); 1636 + init_process(); 1637 + 1638 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/internal/crypto.js 1639 + init_Buffer(); 1640 + init_process(); 1641 + var HASH_BY_ALG = { 1642 + ES256: "SHA-256", 1643 + ES384: "SHA-384", 1644 + ES512: "SHA-512", 1645 + PS256: "SHA-256", 1646 + PS384: "SHA-384", 1647 + PS512: "SHA-512", 1648 + RS256: "SHA-256", 1649 + RS384: "SHA-384", 1650 + RS512: "SHA-512" 1651 + }; 1652 + var CURVE_BY_ALG = { 1653 + ES256: "P-256", 1654 + ES384: "P-384", 1655 + ES512: "P-521", 1656 + PS256: null, 1657 + PS384: null, 1658 + PS512: null, 1659 + RS256: null, 1660 + RS384: null, 1661 + RS512: null 1662 + }; 1663 + var getHashName = /* @__PURE__ */ __name((alg) => { 1664 + return HASH_BY_ALG[alg]; 1665 + }, "getHashName"); 1666 + var getNamedCurve = /* @__PURE__ */ __name((alg) => { 1667 + return CURVE_BY_ALG[alg]; 1668 + }, "getNamedCurve"); 1669 + var getSignAlgorithm = /* @__PURE__ */ __name((alg) => { 1670 + if (alg.startsWith("ES")) { 1671 + return { name: "ECDSA", hash: { name: getHashName(alg) } }; 1672 + } 1673 + if (alg.startsWith("PS")) { 1674 + return { 1675 + name: "RSA-PSS", 1676 + hash: { name: getHashName(alg) }, 1677 + saltLength: getHashLength(getHashName(alg)) 1678 + }; 1679 + } 1680 + return { name: "RSASSA-PKCS1-v1_5" }; 1681 + }, "getSignAlgorithm"); 1682 + var getImportAlgorithm = /* @__PURE__ */ __name((alg, curve) => { 1683 + if (alg.startsWith("ES")) { 1684 + const namedCurve = curve ?? getNamedCurve(alg); 1685 + if (!namedCurve) { 1686 + throw new Error(`unable to determine curve for ${alg}`); 1687 + } 1688 + return { name: "ECDSA", namedCurve }; 1689 + } 1690 + if (alg.startsWith("PS")) { 1691 + return { name: "RSA-PSS", hash: { name: getHashName(alg) } }; 1692 + } 1693 + return { name: "RSASSA-PKCS1-v1_5", hash: { name: getHashName(alg) } }; 1694 + }, "getImportAlgorithm"); 1695 + var getGenerateAlgorithm = /* @__PURE__ */ __name((alg) => { 1696 + const curve = getNamedCurve(alg); 1697 + if (curve) { 1698 + return { name: "ECDSA", namedCurve: curve }; 1699 + } 1700 + const hash = { name: getHashName(alg) }; 1701 + return { 1702 + name: alg.startsWith("PS") ? "RSA-PSS" : "RSASSA-PKCS1-v1_5", 1703 + hash, 1704 + modulusLength: 2048, 1705 + publicExponent: new Uint8Array([1, 0, 1]) 1706 + }; 1707 + }, "getGenerateAlgorithm"); 1708 + var getHashLength = /* @__PURE__ */ __name((hash) => { 1709 + switch (hash) { 1710 + case "SHA-256": 1711 + return 32; 1712 + case "SHA-384": 1713 + return 48; 1714 + case "SHA-512": 1715 + return 64; 1716 + } 1717 + }, "getHashLength"); 1718 + 1719 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/internal/jwk.js 1720 + var SIGNING_ALGORITHMS = [ 1721 + "ES256", 1722 + "ES384", 1723 + "ES512", 1724 + "PS256", 1725 + "PS384", 1726 + "PS512", 1727 + "RS256", 1728 + "RS384", 1729 + "RS512" 1730 + ]; 1731 + var isSigningAlgorithm = /* @__PURE__ */ __name((alg) => { 1732 + return SIGNING_ALGORITHMS.includes(alg); 1733 + }, "isSigningAlgorithm"); 1734 + var derivePublicJwk = /* @__PURE__ */ __name((privateJwk, kid, alg) => { 1735 + if (privateJwk.kty === "EC") { 1736 + const { crv, x, y } = privateJwk; 1737 + return { kty: "EC", crv, x, y, kid, alg, use: "sig" }; 1738 + } 1739 + if (privateJwk.kty === "RSA") { 1740 + const { n, e } = privateJwk; 1741 + return { kty: "RSA", n, e, kid, alg, use: "sig" }; 1742 + } 1743 + throw new Error(`unsupported key type`); 1744 + }, "derivePublicJwk"); 1745 + var importPrivateKeyFromJwk = /* @__PURE__ */ __name(async (jwk, alg) => { 1746 + if (!("d" in jwk) || !jwk.d) { 1747 + throw new Error(`expected a private key (missing 'd' parameter)`); 1748 + } 1749 + if (jwk.kty === "EC" && !alg.startsWith("ES")) { 1750 + throw new Error(`algorithm ${alg} does not match ec key`); 1751 + } 1752 + if (jwk.kty === "RSA" && alg.startsWith("ES")) { 1753 + throw new Error(`algorithm ${alg} does not match rsa key`); 1754 + } 1755 + const algorithm = getImportAlgorithm(alg, jwk.kty === "EC" ? jwk.crv : void 0); 1756 + const key = await crypto.subtle.importKey("jwk", jwk, algorithm, true, ["sign"]); 1757 + if (!(key instanceof CryptoKey)) { 1758 + throw new Error(`expected asymmetric key, got symmetric`); 1759 + } 1760 + return key; 1761 + }, "importPrivateKeyFromJwk"); 1762 + var exportPrivateJwkFromKey = /* @__PURE__ */ __name(async (key, alg, kid) => { 1763 + const jwk = await crypto.subtle.exportKey("jwk", key); 1764 + jwk.alg = alg; 1765 + if (kid) { 1766 + jwk.kid = kid; 1767 + } 1768 + return jwk; 1769 + }, "exportPrivateJwkFromKey"); 1770 + 1771 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/internal/key-cache.js 1772 + var keyCache = /* @__PURE__ */ new WeakMap(); 1773 + var getCachedKeyMaterial = /* @__PURE__ */ __name(async (jwk) => { 1774 + const cached = keyCache.get(jwk); 1775 + if (cached) { 1776 + return cached; 1777 + } 1778 + const { alg } = jwk; 1779 + const cryptoKey = await importPrivateKeyFromJwk(jwk, alg); 1780 + const publicJwk = derivePublicJwk(jwk, jwk.kid, alg); 1781 + const material = { cryptoKey, publicJwk }; 1782 + keyCache.set(jwk, material); 1783 + return material; 1784 + }, "getCachedKeyMaterial"); 1785 + var setCachedKeyMaterial = /* @__PURE__ */ __name((jwk, cryptoKey) => { 1786 + const publicJwk = derivePublicJwk(jwk, jwk.kid, jwk.alg); 1787 + keyCache.set(jwk, { cryptoKey, publicJwk }); 1788 + }, "setCachedKeyMaterial"); 1789 + 1790 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/jwt/index.js 1791 + init_Buffer(); 1792 + init_process(); 1793 + var signJwt = /* @__PURE__ */ __name(async (params) => { 1794 + const { header, payload, key, alg } = params; 1795 + const fullHeader = { ...header, alg }; 1796 + const headerSegment = encodeSegment(fullHeader); 1797 + const payloadSegment = encodeSegment(payload); 1798 + const signingInput = `${headerSegment}.${payloadSegment}`; 1799 + const signature = await crypto.subtle.sign(getSignAlgorithm(alg), key, encodeUtf8(signingInput)); 1800 + const signatureSegment = toBase64Url3(new Uint8Array(signature)); 1801 + return `${signingInput}.${signatureSegment}`; 1802 + }, "signJwt"); 1803 + var encodeSegment = /* @__PURE__ */ __name((value) => { 1804 + return toBase64Url3(encodeUtf8(JSON.stringify(value))); 1805 + }, "encodeSegment"); 1806 + 1807 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/client-assertion/generate-key.js 1808 + init_Buffer(); 1809 + init_process(); 1810 + 1811 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/client-assertion/keys.js 1812 + init_Buffer(); 1813 + init_process(); 1814 + 1815 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/dpop/index.js 1816 + init_Buffer(); 1817 + init_process(); 1818 + 1819 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/dpop/fetch.js 1820 + init_Buffer(); 1821 + init_process(); 1822 + 1823 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/hash/sha256.js 1824 + init_Buffer(); 1825 + init_process(); 1826 + var sha256Base64Url = /* @__PURE__ */ __name(async (input) => { 1827 + const bytes = encodeUtf8(input); 1828 + const digest = await toSha256(bytes); 1829 + return toBase64Url3(digest); 1830 + }, "sha256Base64Url"); 1831 + 1832 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/dpop/proof.js 1833 + init_Buffer(); 1834 + init_process(); 1835 + var createDpopProofSigner = /* @__PURE__ */ __name((jwk) => { 1836 + const alg = jwk.alg; 1837 + let materialPromise; 1838 + return async (htm, htu, nonce, ath) => { 1839 + materialPromise ||= getCachedKeyMaterial(jwk); 1840 + const { cryptoKey, publicJwk } = await materialPromise; 1841 + const now = Math.floor(Date.now() / 1e3); 1842 + return signJwt({ 1843 + header: { 1844 + typ: "dpop+jwt", 1845 + jwk: publicJwk 1846 + }, 1847 + payload: { 1848 + htm, 1849 + htu, 1850 + iat: now, 1851 + jti: nanoid(24), 1852 + nonce, 1853 + ath 1854 + }, 1855 + key: cryptoKey, 1856 + alg 1857 + }); 1858 + }; 1859 + }, "createDpopProofSigner"); 1860 + 1861 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/dpop/generate-key.js 1862 + init_Buffer(); 1863 + init_process(); 1864 + var PREFERRED_ALGORITHMS = [ 1865 + "ES256", 1866 + "ES384", 1867 + "ES512", 1868 + "PS256", 1869 + "PS384", 1870 + "PS512", 1871 + "RS256", 1872 + "RS384", 1873 + "RS512" 1874 + ]; 1875 + var sortAlgorithms = /* @__PURE__ */ __name((algs) => { 1876 + return [...algs].sort((a, b) => { 1877 + const aIdx = PREFERRED_ALGORITHMS.indexOf(a); 1878 + const bIdx = PREFERRED_ALGORITHMS.indexOf(b); 1879 + if (aIdx === -1 && bIdx === -1) { 1880 + return 0; 1881 + } 1882 + if (aIdx === -1) { 1883 + return 1; 1884 + } 1885 + if (bIdx === -1) { 1886 + return -1; 1887 + } 1888 + return aIdx - bIdx; 1889 + }); 1890 + }, "sortAlgorithms"); 1891 + var generateDpopKey = /* @__PURE__ */ __name(async (supportedAlgs) => { 1892 + const normalized = supportedAlgs?.filter(isSigningAlgorithm) ?? []; 1893 + if (supportedAlgs?.length && normalized.length === 0) { 1894 + throw new Error(`no supported algorithms provided`); 1895 + } 1896 + const algs = normalized.length ? sortAlgorithms(normalized) : ["ES256"]; 1897 + const errors = []; 1898 + for (const alg of algs) { 1899 + try { 1900 + const pair = await crypto.subtle.generateKey(getGenerateAlgorithm(alg), true, ["sign", "verify"]); 1901 + const jwk = await exportPrivateJwkFromKey(pair.privateKey, alg); 1902 + setCachedKeyMaterial(jwk, pair.privateKey); 1903 + return jwk; 1904 + } catch (err2) { 1905 + errors.push(err2); 1906 + } 1907 + } 1908 + throw new AggregateError(errors, `failed to generate DPoP key for any of: ${algs.join(", ")}`); 1909 + }, "generateDpopKey"); 1910 + 1911 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/dpop/verify.js 1912 + init_Buffer(); 1913 + init_process(); 1914 + 1915 + // ../node_modules/.deno/@badrap+valita@0.4.6/node_modules/@badrap/valita/dist/node-cjs/index.esm.mjs 1916 + var index_esm_exports = {}; 1917 + init_Buffer(); 1918 + init_process(); 1919 + __reExport(index_esm_exports, __toESM(require_node_cjs(), 1)); 1920 + 1921 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/jwk/compute-jkt.js 1922 + init_Buffer(); 1923 + init_process(); 1924 + 1925 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/dpop/verify.js 1926 + var dpopJwkSchema = index_esm_exports.union(index_esm_exports.object({ 1927 + kty: index_esm_exports.literal("EC"), 1928 + crv: index_esm_exports.union(index_esm_exports.literal("P-256"), index_esm_exports.literal("P-384"), index_esm_exports.literal("P-521")), 1929 + x: index_esm_exports.string(), 1930 + y: index_esm_exports.string() 1931 + }), index_esm_exports.object({ 1932 + kty: index_esm_exports.literal("RSA"), 1933 + e: index_esm_exports.string(), 1934 + n: index_esm_exports.string() 1935 + })); 1936 + var dpopHeaderSchema = index_esm_exports.object({ 1937 + typ: index_esm_exports.literal("dpop+jwt"), 1938 + alg: index_esm_exports.string().assert((alg) => alg !== "none", 'alg must not be "none"'), 1939 + jwk: dpopJwkSchema 1940 + }); 1941 + var dpopPayloadSchema = index_esm_exports.object({ 1942 + htm: index_esm_exports.string(), 1943 + htu: index_esm_exports.string(), 1944 + iat: index_esm_exports.number(), 1945 + jti: index_esm_exports.string(), 1946 + nonce: index_esm_exports.string().optional() 1947 + }); 1948 + 1949 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/hash/index.js 1950 + init_Buffer(); 1951 + init_process(); 1952 + 1953 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/hash/pkce.js 1954 + init_Buffer(); 1955 + init_process(); 1956 + var generatePkce = /* @__PURE__ */ __name(async (length = 64) => { 1957 + const verifier = nanoid(length); 1958 + const challenge = await sha256Base64Url(verifier); 1959 + return { verifier, challenge, method: "S256" }; 1960 + }, "generatePkce"); 1961 + 1962 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/jwk/index.js 1963 + init_Buffer(); 1964 + init_process(); 1965 + 1966 + // ../node_modules/.deno/@atcute+oauth-crypto@0.1.0/node_modules/@atcute/oauth-crypto/dist/jwk/keys.js 1967 + init_Buffer(); 1968 + init_process(); 1969 + 1970 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/resolvers.js 1971 + init_Buffer(); 1972 + init_process(); 1973 + 1974 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/utils/response.js 1975 + init_Buffer(); 1976 + init_process(); 1977 + var extractContentType = /* @__PURE__ */ __name((headers) => { 1978 + return headers.get("content-type")?.split(";")[0]; 1979 + }, "extractContentType"); 1980 + 1981 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/utils/strings.js 1982 + init_Buffer(); 1983 + init_process(); 1984 + var isUrlParseSupported = "parse" in URL; 1985 + var isValidUrl = /* @__PURE__ */ __name((urlString) => { 1986 + let url = null; 1987 + if (isUrlParseSupported) { 1988 + url = URL.parse(urlString); 1989 + } else { 1990 + try { 1991 + url = new URL(urlString); 1992 + } catch { 1993 + } 1994 + } 1995 + if (url !== null) { 1996 + return url.protocol === "https:" || url.protocol === "http:"; 1997 + } 1998 + return false; 1999 + }, "isValidUrl"); 2000 + 2001 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/resolvers.js 2002 + var resolveFromIdentifier = /* @__PURE__ */ __name(async (ident) => { 2003 + const identity = await identityResolver.resolve(ident); 2004 + return { 2005 + identity, 2006 + metadata: await getMetadataFromResourceServer(identity.pds) 2007 + }; 2008 + }, "resolveFromIdentifier"); 2009 + var resolveFromService = /* @__PURE__ */ __name(async (host) => { 2010 + try { 2011 + const metadata = await getMetadataFromResourceServer(host); 2012 + return { metadata }; 2013 + } catch (err2) { 2014 + if (err2 instanceof ResolverError) { 2015 + try { 2016 + const metadata = await getOAuthAuthorizationServerMetadata(host); 2017 + return { metadata }; 2018 + } catch { 2019 + } 2020 + } 2021 + throw err2; 2022 + } 2023 + }, "resolveFromService"); 2024 + var getOAuthProtectedResourceMetadata = /* @__PURE__ */ __name(async (host) => { 2025 + const url = new URL(`/.well-known/oauth-protected-resource`, host); 2026 + const response2 = await fetch(url.href, { 2027 + redirect: "manual", 2028 + headers: { 2029 + accept: "application/json" 2030 + } 2031 + }); 2032 + if (response2.status !== 200 || extractContentType(response2.headers) !== "application/json") { 2033 + throw new ResolverError(`unexpected response`); 2034 + } 2035 + const metadata = await response2.json(); 2036 + if (metadata.resource !== url.origin) { 2037 + throw new ResolverError(`unexpected issuer`); 2038 + } 2039 + return metadata; 2040 + }, "getOAuthProtectedResourceMetadata"); 2041 + var getOAuthAuthorizationServerMetadata = /* @__PURE__ */ __name(async (host) => { 2042 + const url = new URL(`/.well-known/oauth-authorization-server`, host); 2043 + const response2 = await fetch(url.href, { 2044 + redirect: "manual", 2045 + headers: { 2046 + accept: "application/json" 2047 + } 2048 + }); 2049 + if (response2.status !== 200 || extractContentType(response2.headers) !== "application/json") { 2050 + throw new ResolverError(`unexpected response`); 2051 + } 2052 + const metadata = await response2.json(); 2053 + if (metadata.issuer !== url.origin) { 2054 + throw new ResolverError(`unexpected issuer`); 2055 + } 2056 + if (!isValidUrl(metadata.authorization_endpoint)) { 2057 + throw new ResolverError(`authorization server provided incorrect authorization endpoint`); 2058 + } 2059 + if (!metadata.client_id_metadata_document_supported) { 2060 + throw new ResolverError(`authorization server does not support 'client_id_metadata_document'`); 2061 + } 2062 + if (!metadata.pushed_authorization_request_endpoint) { 2063 + throw new ResolverError(`authorization server does not support 'pushed_authorization request'`); 2064 + } 2065 + if (metadata.response_types_supported) { 2066 + if (!metadata.response_types_supported.includes("code")) { 2067 + throw new ResolverError(`authorization server does not support 'code' response type`); 2068 + } 2069 + } 2070 + return metadata; 2071 + }, "getOAuthAuthorizationServerMetadata"); 2072 + var getMetadataFromResourceServer = /* @__PURE__ */ __name(async (input) => { 2073 + const rs_metadata = await getOAuthProtectedResourceMetadata(input); 2074 + if (rs_metadata.authorization_servers?.length !== 1) { 2075 + throw new ResolverError(`expected exactly one authorization server in the listing`); 2076 + } 2077 + const issuer = rs_metadata.authorization_servers[0]; 2078 + const as_metadata = await getOAuthAuthorizationServerMetadata(issuer); 2079 + if (as_metadata.protected_resources) { 2080 + if (!as_metadata.protected_resources.includes(rs_metadata.resource)) { 2081 + throw new ResolverError(`server is not in authorization server's jurisdiction`); 2082 + } 2083 + } 2084 + return as_metadata; 2085 + }, "getMetadataFromResourceServer"); 2086 + 2087 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/agents/server-agent.js 2088 + init_Buffer(); 2089 + init_process(); 2090 + 2091 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/dpop.js 2092 + init_Buffer(); 2093 + init_process(); 2094 + var createDPoPFetch = /* @__PURE__ */ __name((dpopKey, isAuthServer) => { 2095 + const nonces = database.dpopNonces; 2096 + const pending2 = database.inflightDpop; 2097 + const sign = createDpopProofSigner(dpopKey); 2098 + return async (input, init) => { 2099 + const request = new Request(input, init); 2100 + const authorizationHeader = request.headers.get("authorization"); 2101 + const ath = authorizationHeader?.startsWith("DPoP ") ? await sha256Base64Url(authorizationHeader.slice(5)) : void 0; 2102 + const { method, url } = request; 2103 + const { origin, pathname } = new URL(url); 2104 + const htu = origin + pathname; 2105 + let deferred = pending2.get(origin); 2106 + if (deferred) { 2107 + await deferred.promise; 2108 + deferred = void 0; 2109 + } 2110 + let initNonce; 2111 + let expiredOrMissing = false; 2112 + try { 2113 + const [nonce, lapsed] = nonces.getWithLapsed(origin); 2114 + initNonce = nonce; 2115 + expiredOrMissing = lapsed > 3 * 60 * 1e3; 2116 + } catch { 2117 + } 2118 + if (expiredOrMissing) { 2119 + pending2.set(origin, deferred = Promise.withResolvers()); 2120 + } 2121 + let nextNonce; 2122 + try { 2123 + const initProof = await sign(method, htu, initNonce, ath); 2124 + request.headers.set("dpop", initProof); 2125 + const initResponse = await fetch(request); 2126 + nextNonce = initResponse.headers.get("dpop-nonce"); 2127 + if (nextNonce === null || nextNonce === initNonce) { 2128 + return initResponse; 2129 + } 2130 + try { 2131 + nonces.set(origin, nextNonce); 2132 + } catch { 2133 + } 2134 + const shouldRetry = await isUseDpopNonceError(initResponse, isAuthServer); 2135 + if (!shouldRetry) { 2136 + return initResponse; 2137 + } 2138 + if (input === request || init?.body instanceof ReadableStream) { 2139 + return initResponse; 2140 + } 2141 + } finally { 2142 + if (deferred) { 2143 + pending2.delete(origin); 2144 + deferred.resolve(); 2145 + } 2146 + } 2147 + { 2148 + const nextProof = await sign(method, htu, nextNonce, ath); 2149 + const nextRequest = new Request(input, init); 2150 + nextRequest.headers.set("dpop", nextProof); 2151 + const retryResponse = await fetch(nextRequest); 2152 + const retryNonce = retryResponse.headers.get("dpop-nonce"); 2153 + if (retryNonce !== null && retryNonce !== nextNonce) { 2154 + try { 2155 + nonces.set(origin, retryNonce); 2156 + } catch { 2157 + } 2158 + } 2159 + return retryResponse; 2160 + } 2161 + }; 2162 + }, "createDPoPFetch"); 2163 + var isUseDpopNonceError = /* @__PURE__ */ __name(async (response2, isAuthServer) => { 2164 + if (isAuthServer === void 0 || isAuthServer === false) { 2165 + if (response2.status === 401) { 2166 + const wwwAuth = response2.headers.get("www-authenticate"); 2167 + if (wwwAuth?.startsWith("DPoP")) { 2168 + return wwwAuth.includes('error="use_dpop_nonce"'); 2169 + } 2170 + } 2171 + } 2172 + if (isAuthServer === void 0 || isAuthServer === true) { 2173 + if (response2.status === 400 && extractContentType(response2.headers) === "application/json") { 2174 + try { 2175 + const json = await response2.clone().json(); 2176 + return typeof json === "object" && json?.["error"] === "use_dpop_nonce"; 2177 + } catch { 2178 + return false; 2179 + } 2180 + } 2181 + } 2182 + return false; 2183 + }, "isUseDpopNonceError"); 2184 + 2185 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/utils/misc.js 2186 + init_Buffer(); 2187 + init_process(); 2188 + var pick = /* @__PURE__ */ __name((obj, keys) => { 2189 + const cloned = {}; 2190 + for (let idx = 0, len = keys.length; idx < len; idx++) { 2191 + const key = keys[idx]; 2192 + cloned[key] = obj[key]; 2193 + } 2194 + return cloned; 2195 + }, "pick"); 2196 + 2197 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/agents/server-agent.js 2198 + var OAuthServerAgent = class { 2199 + static { 2200 + __name(this, "OAuthServerAgent"); 2201 + } 2202 + #fetch; 2203 + #metadata; 2204 + #dpopKey; 2205 + constructor(metadata, dpopKey) { 2206 + this.#metadata = metadata; 2207 + this.#dpopKey = dpopKey; 2208 + this.#fetch = createDPoPFetch(dpopKey, true); 2209 + } 2210 + async request(endpoint, payload) { 2211 + const url = this.#metadata[`${endpoint}_endpoint`]; 2212 + if (!url) { 2213 + throw new Error(`no endpoint for ${endpoint}`); 2214 + } 2215 + if ((endpoint === "token" || endpoint === "pushed_authorization_request") && fetchClientAssertion !== void 0) { 2216 + const sign = createDpopProofSigner(this.#dpopKey); 2217 + const assertion = await fetchClientAssertion({ 2218 + aud: this.#metadata.issuer, 2219 + createDpopProof: /* @__PURE__ */ __name(async (url2, nonce) => { 2220 + return await sign("POST", url2, nonce, void 0); 2221 + }, "createDpopProof") 2222 + }); 2223 + payload = { ...payload, ...assertion }; 2224 + } 2225 + const response2 = await this.#fetch(url, { 2226 + method: "post", 2227 + headers: { "content-type": "application/json" }, 2228 + body: JSON.stringify({ ...payload, client_id: CLIENT_ID }) 2229 + }); 2230 + if (extractContentType(response2.headers) !== "application/json") { 2231 + throw new FetchResponseError(response2, 2, `unexpected content-type`); 2232 + } 2233 + const json = await response2.json(); 2234 + if (response2.ok) { 2235 + return json; 2236 + } else { 2237 + throw new OAuthResponseError(response2, json); 2238 + } 2239 + } 2240 + async revoke(token) { 2241 + try { 2242 + await this.request("revocation", { token }); 2243 + } catch { 2244 + } 2245 + } 2246 + async exchangeCode(code, verifier) { 2247 + const response2 = await this.request("token", { 2248 + grant_type: "authorization_code", 2249 + redirect_uri: REDIRECT_URI, 2250 + code, 2251 + code_verifier: verifier 2252 + }); 2253 + try { 2254 + return await this.#processExchangeResponse(response2); 2255 + } catch (err2) { 2256 + await this.revoke(response2.access_token); 2257 + throw err2; 2258 + } 2259 + } 2260 + async refresh({ sub, token }) { 2261 + if (!token.refresh) { 2262 + throw new TokenRefreshError(sub, "no refresh token available"); 2263 + } 2264 + const response2 = await this.request("token", { 2265 + grant_type: "refresh_token", 2266 + refresh_token: token.refresh 2267 + }); 2268 + try { 2269 + if (sub !== response2.sub) { 2270 + throw new TokenRefreshError(sub, `sub mismatch in token response; got ${response2.sub}`); 2271 + } 2272 + return this.#processTokenResponse(response2); 2273 + } catch (err2) { 2274 + await this.revoke(response2.access_token); 2275 + throw err2; 2276 + } 2277 + } 2278 + #processTokenResponse(res) { 2279 + if (!res.sub) { 2280 + throw new TypeError(`missing sub field in token response`); 2281 + } 2282 + if (!res.scope) { 2283 + throw new TypeError(`missing scope field in token response`); 2284 + } 2285 + if (res.token_type !== "DPoP") { 2286 + throw new TypeError(`token response returned a non-dpop token`); 2287 + } 2288 + return { 2289 + scope: res.scope, 2290 + refresh: res.refresh_token, 2291 + access: res.access_token, 2292 + type: res.token_type, 2293 + expires_at: typeof res.expires_in === "number" ? Date.now() + res.expires_in * 1e3 : void 0 2294 + }; 2295 + } 2296 + async #processExchangeResponse(res) { 2297 + const sub = res.sub; 2298 + if (!sub) { 2299 + throw new TypeError(`missing sub field in token response`); 2300 + } 2301 + const token = this.#processTokenResponse(res); 2302 + const resolved = await resolveFromIdentifier(sub); 2303 + if (resolved.metadata.issuer !== this.#metadata.issuer) { 2304 + throw new TypeError(`issuer mismatch; got ${resolved.metadata.issuer}`); 2305 + } 2306 + return { 2307 + token, 2308 + info: { 2309 + sub, 2310 + aud: resolved.identity.pds, 2311 + server: pick(resolved.metadata, [ 2312 + "issuer", 2313 + "authorization_endpoint", 2314 + "introspection_endpoint", 2315 + "pushed_authorization_request_endpoint", 2316 + "revocation_endpoint", 2317 + "token_endpoint" 2318 + ]) 2319 + } 2320 + }; 2321 + } 2322 + }; 2323 + 2324 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/agents/sessions.js 2325 + init_Buffer(); 2326 + init_process(); 2327 + 2328 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/utils/dpop-key.js 2329 + init_Buffer(); 2330 + init_process(); 2331 + var ES256_ALG = { name: "ECDSA", namedCurve: "P-256" }; 2332 + var isLegacyDpopKey = /* @__PURE__ */ __name((key) => { 2333 + return typeof key.key === "string" && typeof key.jwt === "string"; 2334 + }, "isLegacyDpopKey"); 2335 + var migrateLegacyDpopKey = /* @__PURE__ */ __name(async (key) => { 2336 + const pkcs8 = fromBase64Url3(key.key); 2337 + const cryptoKey = await crypto.subtle.importKey("pkcs8", pkcs8, ES256_ALG, true, ["sign"]); 2338 + const jwk = await crypto.subtle.exportKey("jwk", cryptoKey); 2339 + jwk.alg = "ES256"; 2340 + return jwk; 2341 + }, "migrateLegacyDpopKey"); 2342 + 2343 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/agents/sessions.js 2344 + var pending = /* @__PURE__ */ new Map(); 2345 + var getSession = /* @__PURE__ */ __name(async (sub, options) => { 2346 + options?.signal?.throwIfAborted(); 2347 + let allowStored = isTokenUsable; 2348 + if (options?.noCache) { 2349 + allowStored = returnFalse; 2350 + } else if (options?.allowStale) { 2351 + allowStored = returnTrue; 2352 + } 2353 + let previousExecutionFlow; 2354 + while (previousExecutionFlow = pending.get(sub)) { 2355 + try { 2356 + const { isFresh, value: value2 } = await previousExecutionFlow; 2357 + if (isFresh || allowStored(value2)) { 2358 + return value2; 2359 + } 2360 + } catch { 2361 + } 2362 + options?.signal?.throwIfAborted(); 2363 + } 2364 + const run = /* @__PURE__ */ __name(async () => { 2365 + const storedSession = await migrateSessionIfNeeded(sub, database.sessions.get(sub)); 2366 + if (storedSession && allowStored(storedSession)) { 2367 + return { isFresh: false, value: storedSession }; 2368 + } 2369 + const newSession = await refreshToken(sub, storedSession); 2370 + await storeSession(sub, newSession); 2371 + return { isFresh: true, value: newSession }; 2372 + }, "run"); 2373 + let promise; 2374 + if (locks) { 2375 + promise = locks.request(`atcute-oauth:${sub}`, run); 2376 + } else { 2377 + promise = run(); 2378 + } 2379 + promise = promise.finally(() => pending.delete(sub)); 2380 + if (pending.has(sub)) { 2381 + throw new Error("concurrent request for the same key"); 2382 + } 2383 + pending.set(sub, promise); 2384 + const { value } = await promise; 2385 + return value; 2386 + }, "getSession"); 2387 + var storeSession = /* @__PURE__ */ __name(async (sub, newSession) => { 2388 + try { 2389 + database.sessions.set(sub, newSession); 2390 + } catch (err2) { 2391 + await onRefreshError(newSession); 2392 + throw err2; 2393 + } 2394 + }, "storeSession"); 2395 + var deleteStoredSession = /* @__PURE__ */ __name((sub) => { 2396 + database.sessions.delete(sub); 2397 + }, "deleteStoredSession"); 2398 + var returnTrue = /* @__PURE__ */ __name(() => true, "returnTrue"); 2399 + var returnFalse = /* @__PURE__ */ __name(() => false, "returnFalse"); 2400 + var refreshToken = /* @__PURE__ */ __name(async (sub, storedSession) => { 2401 + if (storedSession === void 0) { 2402 + throw new TokenRefreshError(sub, `session deleted by another tab`); 2403 + } 2404 + const { dpopKey, info, token } = storedSession; 2405 + const server = new OAuthServerAgent(info.server, dpopKey); 2406 + try { 2407 + const newToken = await server.refresh({ sub: info.sub, token }); 2408 + return { dpopKey, info, token: newToken }; 2409 + } catch (cause) { 2410 + if (cause instanceof OAuthResponseError && cause.status === 400 && cause.error === "invalid_grant") { 2411 + throw new TokenRefreshError(sub, `session was revoked`, { cause }); 2412 + } 2413 + throw cause; 2414 + } 2415 + }, "refreshToken"); 2416 + var onRefreshError = /* @__PURE__ */ __name(async ({ dpopKey, info, token }) => { 2417 + const server = new OAuthServerAgent(info.server, dpopKey); 2418 + await server.revoke(token.refresh ?? token.access); 2419 + }, "onRefreshError"); 2420 + var isTokenUsable = /* @__PURE__ */ __name(({ token }) => { 2421 + const expires = token.expires_at; 2422 + return expires == null || Date.now() + 6e4 <= expires; 2423 + }, "isTokenUsable"); 2424 + var migrateSessionIfNeeded = /* @__PURE__ */ __name(async (sub, session) => { 2425 + if (!session || !isLegacyDpopKey(session.dpopKey)) { 2426 + return session; 2427 + } 2428 + const dpopKey = await migrateLegacyDpopKey(session.dpopKey); 2429 + const migrated = { ...session, dpopKey }; 2430 + try { 2431 + database.sessions.set(sub, migrated); 2432 + } catch { 2433 + } 2434 + return migrated; 2435 + }, "migrateSessionIfNeeded"); 2436 + 2437 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/agents/exchange.js 2438 + var createAuthorizationUrl = /* @__PURE__ */ __name(async (options) => { 2439 + const { target, scope, state = null, ...reqs } = options; 2440 + let resolved; 2441 + switch (target.type) { 2442 + case "account": { 2443 + resolved = await resolveFromIdentifier(target.identifier); 2444 + break; 2445 + } 2446 + case "pds": { 2447 + resolved = await resolveFromService(target.serviceUrl); 2448 + } 2449 + } 2450 + const { identity, metadata } = resolved; 2451 + const loginHint = identity ? identity.handle !== "handle.invalid" ? identity.handle : identity.did : void 0; 2452 + const sid = nanoid(24); 2453 + const pkce = await generatePkce(); 2454 + const dpopKey = await generateDpopKey(["ES256"]); 2455 + const params = { 2456 + display: reqs.display, 2457 + ui_locales: reqs.locale, 2458 + prompt: reqs.prompt, 2459 + redirect_uri: REDIRECT_URI, 2460 + code_challenge: pkce.challenge, 2461 + code_challenge_method: pkce.method, 2462 + state: sid, 2463 + login_hint: loginHint, 2464 + response_mode: "fragment", 2465 + response_type: "code", 2466 + scope 2467 + }; 2468 + database.states.set(sid, { 2469 + dpopKey, 2470 + metadata, 2471 + verifier: pkce.verifier, 2472 + state 2473 + }); 2474 + const server = new OAuthServerAgent(metadata, dpopKey); 2475 + const response2 = await server.request("pushed_authorization_request", params); 2476 + const authUrl = new URL(metadata.authorization_endpoint); 2477 + authUrl.searchParams.set("client_id", CLIENT_ID); 2478 + authUrl.searchParams.set("request_uri", response2.request_uri); 2479 + return authUrl; 2480 + }, "createAuthorizationUrl"); 2481 + var finalizeAuthorization = /* @__PURE__ */ __name(async (params) => { 2482 + const issuer = params.get("iss"); 2483 + const sid = params.get("state"); 2484 + const code = params.get("code"); 2485 + const error = params.get("error"); 2486 + if (!sid || !(code || error)) { 2487 + throw new LoginError(`missing parameters`); 2488 + } 2489 + const stored = database.states.get(sid); 2490 + if (stored) { 2491 + database.states.delete(sid); 2492 + } else { 2493 + throw new LoginError(`unknown state provided`); 2494 + } 2495 + if (error) { 2496 + throw new AuthorizationError(params.get("error_description") || error); 2497 + } 2498 + if (!code) { 2499 + throw new LoginError(`missing code parameter`); 2500 + } 2501 + const dpopKey = stored.dpopKey; 2502 + const metadata = stored.metadata; 2503 + const state = stored.state ?? null; 2504 + if (issuer === null) { 2505 + throw new LoginError(`missing issuer parameter`); 2506 + } else if (issuer !== metadata.issuer) { 2507 + throw new LoginError(`issuer mismatch`); 2508 + } 2509 + const server = new OAuthServerAgent(metadata, dpopKey); 2510 + const { info, token } = await server.exchangeCode(code, stored.verifier); 2511 + const sub = info.sub; 2512 + const session = { dpopKey, info, token }; 2513 + await storeSession(sub, session); 2514 + return { session, state }; 2515 + }, "finalizeAuthorization"); 2516 + 2517 + // ../node_modules/.deno/@atcute+oauth-browser-client@3.0.0/node_modules/@atcute/oauth-browser-client/dist/agents/user-agent.js 2518 + init_Buffer(); 2519 + init_process(); 2520 + var OAuthUserAgent = class { 2521 + static { 2522 + __name(this, "OAuthUserAgent"); 2523 + } 2524 + session; 2525 + #fetch; 2526 + #getSessionPromise; 2527 + constructor(session) { 2528 + this.session = session; 2529 + this.#fetch = createDPoPFetch(session.dpopKey, false); 2530 + } 2531 + get sub() { 2532 + return this.session.info.sub; 2533 + } 2534 + getSession(options) { 2535 + const promise = getSession(this.session.info.sub, options); 2536 + promise.then((session) => { 2537 + this.session = session; 2538 + }).finally(() => { 2539 + this.#getSessionPromise = void 0; 2540 + }); 2541 + return this.#getSessionPromise = promise; 2542 + } 2543 + async signOut() { 2544 + const sub = this.session.info.sub; 2545 + try { 2546 + const { dpopKey, info, token } = await getSession(sub, { allowStale: true }); 2547 + const server = new OAuthServerAgent(info.server, dpopKey); 2548 + await server.revoke(token.refresh ?? token.access); 2549 + } finally { 2550 + deleteStoredSession(sub); 2551 + } 2552 + } 2553 + async handle(pathname, init) { 2554 + await this.#getSessionPromise; 2555 + const headers = new Headers(init?.headers); 2556 + let session = this.session; 2557 + let url = new URL(pathname, session.info.aud); 2558 + headers.set("authorization", `${session.token.type} ${session.token.access}`); 2559 + let response2 = await this.#fetch(url.href, { ...init, headers }); 2560 + if (!isInvalidTokenResponse(response2)) { 2561 + return response2; 2562 + } 2563 + try { 2564 + if (this.#getSessionPromise) { 2565 + session = await this.#getSessionPromise; 2566 + } else { 2567 + session = await this.getSession(); 2568 + } 2569 + } catch { 2570 + return response2; 2571 + } 2572 + if (init?.body instanceof ReadableStream) { 2573 + return response2; 2574 + } 2575 + url = new URL(pathname, session.info.aud); 2576 + headers.set("authorization", `${session.token.type} ${session.token.access}`); 2577 + return await this.#fetch(url.href, { ...init, headers }); 2578 + } 2579 + }; 2580 + var isInvalidTokenResponse = /* @__PURE__ */ __name((response2) => { 2581 + if (response2.status !== 401) { 2582 + return false; 2583 + } 2584 + const auth = response2.headers.get("www-authenticate"); 2585 + return auth != null && (auth.startsWith("Bearer ") || auth.startsWith("DPoP ")) && auth.includes('error="invalid_token"'); 2586 + }, "isInvalidTokenResponse"); 2587 + 2588 + // oauth-client-metadata.json 2589 + var oauth_client_metadata_default = { 2590 + client_id: "https://elements.diffuse.sh/oauth-client-metadata.json", 2591 + client_name: "Diffuse", 2592 + client_uri: "https://elements.diffuse.sh", 2593 + redirect_uris: ["https://elements.diffuse.sh/"], 2594 + scope: "atproto repo?collection=sh.diffuse.output.facet&collection=sh.diffuse.output.playlist&collection=sh.diffuse.output.theme&collection=sh.diffuse.output.track", 2595 + grant_types: ["authorization_code", "refresh_token"], 2596 + response_types: ["code"], 2597 + token_endpoint_auth_method: "none", 2598 + application_type: "web", 2599 + dpop_bound_access_tokens: true 2600 + }; 2601 + 2602 + // ../node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/dist/index.js 2603 + init_Buffer(); 2604 + init_process(); 2605 + 2606 + // ../node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/dist/actor/local.js 2607 + init_Buffer(); 2608 + init_process(); 2609 + 2610 + // ../node_modules/.deno/@atcute+identity@1.1.3/node_modules/@atcute/identity/dist/index.js 2611 + init_Buffer(); 2612 + init_process(); 2613 + 2614 + // ../node_modules/.deno/@atcute+identity@1.1.3/node_modules/@atcute/identity/dist/typedefs.js 2615 + var typedefs_exports = {}; 2616 + __export(typedefs_exports, { 2617 + FRAGMENT_RE: () => FRAGMENT_RE, 2618 + MULTIBASE_RE: () => MULTIBASE_RE, 2619 + didDocument: () => didDocument, 2620 + didRelativeUri: () => didRelativeUri, 2621 + didString: () => didString, 2622 + multibaseString: () => multibaseString, 2623 + rfc3968UriSchema: () => rfc3968UriSchema, 2624 + service: () => service, 2625 + verificationMethod: () => verificationMethod 2626 + }); 2627 + init_Buffer(); 2628 + init_process(); 2629 + 2630 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/syntax/index.js 2631 + init_Buffer(); 2632 + init_process(); 2633 + 2634 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/syntax/at-identifier.js 2635 + init_Buffer(); 2636 + init_process(); 2637 + 2638 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/syntax/did.js 2639 + init_Buffer(); 2640 + init_process(); 2641 + var DID_RE = /^did:([a-z]+):([a-zA-Z0-9._:%-]*[a-zA-Z0-9._-])$/; 2642 + var isDid = /* @__PURE__ */ __name(/* @__NO_SIDE_EFFECTS__ */ (input) => { 2643 + return typeof input === "string" && input.length >= 7 && input.length <= 2048 && DID_RE.test(input); 2644 + }, "isDid"); 2645 + 2646 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/syntax/handle.js 2647 + init_Buffer(); 2648 + init_process(); 2649 + 2650 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/syntax/utils/ascii.js 2651 + init_Buffer(); 2652 + init_process(); 2653 + var isAsciiAlpha = /* @__PURE__ */ __name(/* @__NO_SIDE_EFFECTS__ */ (c) => { 2654 + return c >= 65 && c <= 90 || c >= 97 && c <= 122; 2655 + }, "isAsciiAlpha"); 2656 + var isAsciiAlphaNum = /* @__PURE__ */ __name(/* @__NO_SIDE_EFFECTS__ */ (c) => { 2657 + return /* @__PURE__ */ isAsciiAlpha(c) || c >= 48 && c <= 57; 2658 + }, "isAsciiAlphaNum"); 2659 + 2660 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/syntax/handle.js 2661 + var isValidLabel = /* @__PURE__ */ __name((input, start, end) => { 2662 + const len = end - start; 2663 + if (len === 0 || len > 63) { 2664 + return false; 2665 + } 2666 + const first = input.charCodeAt(start); 2667 + if (!isAsciiAlphaNum(first)) { 2668 + return false; 2669 + } 2670 + if (len > 1) { 2671 + if (!isAsciiAlphaNum(input.charCodeAt(end - 1))) 2672 + return false; 2673 + for (let j = start + 1; j < end - 1; j++) { 2674 + const c = input.charCodeAt(j); 2675 + if (!isAsciiAlphaNum(c) && c !== 45) { 2676 + return false; 2677 + } 2678 + } 2679 + } 2680 + return true; 2681 + }, "isValidLabel"); 2682 + var isHandle = /* @__PURE__ */ __name(/* @__NO_SIDE_EFFECTS__ */ (input) => { 2683 + if (typeof input !== "string") { 2684 + return false; 2685 + } 2686 + const len = input.length; 2687 + if (len < 3 || len > 253) { 2688 + return false; 2689 + } 2690 + let labelStart = 0; 2691 + let labelCount = 0; 2692 + let lastLabelStart = 0; 2693 + for (let i = 0; i <= len; i++) { 2694 + if (i === len || input.charCodeAt(i) === 46) { 2695 + if (!isValidLabel(input, labelStart, i)) { 2696 + return false; 2697 + } 2698 + lastLabelStart = labelStart; 2699 + labelStart = i + 1; 2700 + labelCount++; 2701 + } 2702 + } 2703 + if (labelCount < 2) { 2704 + return false; 2705 + } 2706 + return isAsciiAlpha(input.charCodeAt(lastLabelStart)); 2707 + }, "isHandle"); 2708 + 2709 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/syntax/at-uri.js 2710 + init_Buffer(); 2711 + init_process(); 2712 + 2713 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/utils.js 2714 + init_Buffer(); 2715 + init_process(); 2716 + 2717 + // ../node_modules/.deno/esm-env@1.2.2/node_modules/esm-env/index.js 2718 + init_Buffer(); 2719 + init_process(); 2720 + 2721 + // ../node_modules/.deno/esm-env@1.2.2/node_modules/esm-env/browser-fallback.js 2722 + init_Buffer(); 2723 + init_process(); 2724 + 2725 + // ../node_modules/.deno/esm-env@1.2.2/node_modules/esm-env/dev-fallback.js 2726 + init_Buffer(); 2727 + init_process(); 2728 + var node_env = globalThis.process?.env?.NODE_ENV; 2729 + var dev_fallback_default = node_env && !node_env.toLowerCase().startsWith("prod"); 2730 + 2731 + // ../node_modules/.deno/esm-env@1.2.2/node_modules/esm-env/true.js 2732 + init_Buffer(); 2733 + init_process(); 2734 + 2735 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/syntax/nsid.js 2736 + init_Buffer(); 2737 + init_process(); 2738 + 2739 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/syntax/record-key.js 2740 + init_Buffer(); 2741 + init_process(); 2742 + 2743 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/syntax/at-uri.js 2744 + var CANONICAL_AT_URI_MIN_LENGTH = 5 + 7 + 1 + 5 + 1 + 1; 2745 + var AT_URI_MAX_LENGTH = 5 + 2048 + 1 + 317 + 1 + 512; 2746 + 2747 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/syntax/cid.js 2748 + init_Buffer(); 2749 + init_process(); 2750 + 2751 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/syntax/datetime.js 2752 + init_Buffer(); 2753 + init_process(); 2754 + 2755 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/syntax/language.js 2756 + init_Buffer(); 2757 + init_process(); 2758 + 2759 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/syntax/tid.js 2760 + init_Buffer(); 2761 + init_process(); 2762 + 2763 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/syntax/uri.js 2764 + init_Buffer(); 2765 + init_process(); 2766 + 2767 + // ../node_modules/.deno/@atcute+identity@1.1.3/node_modules/@atcute/identity/dist/types.js 2768 + init_Buffer(); 2769 + init_process(); 2770 + 2771 + // ../node_modules/.deno/@atcute+identity@1.1.3/node_modules/@atcute/identity/dist/typedefs.js 2772 + var FRAGMENT_RE = /^#[^#]+$/; 2773 + var MULTIBASE_RE = /^z[a-km-zA-HJ-NP-Z1-9]+$/; 2774 + var rfc3968UriSchema = index_esm_exports.string().assert((input) => { 2775 + return URL.canParse(input); 2776 + }, `must be a url`); 2777 + var didRelativeUri = index_esm_exports.string().assert((input) => { 2778 + return FRAGMENT_RE.test(input) || URL.canParse(input); 2779 + }, `must be a did relative uri`); 2780 + var multibaseString = index_esm_exports.string().assert((input) => { 2781 + return MULTIBASE_RE.test(input); 2782 + }, `must be a base58 multibase`); 2783 + var didString = index_esm_exports.string().assert(isDid, `must be a did`); 2784 + var verificationMethod = index_esm_exports.object({ 2785 + id: didRelativeUri, 2786 + type: index_esm_exports.string(), 2787 + controller: didString, 2788 + publicKeyMultibase: multibaseString.optional(), 2789 + publicKeyJwk: index_esm_exports.record().optional() 2790 + }).chain((input) => { 2791 + switch (input.type) { 2792 + case "Multikey": { 2793 + if (input.publicKeyMultibase === void 0) { 2794 + return index_esm_exports.err({ message: `missing multikey`, path: ["publicKeyMultibase"] }); 2795 + } 2796 + break; 2797 + } 2798 + case "EcdsaSecp256k1VerificationKey2019": 2799 + case "EcdsaSecp256r1VerificationKey2019": { 2800 + if (input.publicKeyMultibase === void 0) { 2801 + return index_esm_exports.err({ message: `missing multibase key`, path: ["publicKeyMultibase"] }); 2802 + } 2803 + break; 2804 + } 2805 + } 2806 + return index_esm_exports.ok(input); 2807 + }); 2808 + var service = index_esm_exports.object({ 2809 + // should've only been RFC3968, but did:plc uses relative URIs. 2810 + id: didRelativeUri, 2811 + type: index_esm_exports.union(index_esm_exports.string(), index_esm_exports.array(index_esm_exports.string())), 2812 + serviceEndpoint: index_esm_exports.union(rfc3968UriSchema, index_esm_exports.record(rfc3968UriSchema), index_esm_exports.array(index_esm_exports.union(rfc3968UriSchema, index_esm_exports.record(rfc3968UriSchema)))) 2813 + }); 2814 + var didDocument = index_esm_exports.object({ 2815 + "@context": index_esm_exports.array(rfc3968UriSchema), 2816 + id: didString, 2817 + alsoKnownAs: index_esm_exports.array(rfc3968UriSchema).chain((input) => { 2818 + for (let i = 0, len = input.length; i < len; i++) { 2819 + const aka = input[i]; 2820 + for (let j = 0; j < i; j++) { 2821 + if (aka === input[j]) { 2822 + return index_esm_exports.err({ 2823 + message: `duplicate "${aka}" aka entry`, 2824 + path: [i] 2825 + }); 2826 + } 2827 + } 2828 + } 2829 + return index_esm_exports.ok(input); 2830 + }).optional(), 2831 + verificationMethod: index_esm_exports.array(verificationMethod).chain((input) => { 2832 + for (let i = 0, len = input.length; i < len; i++) { 2833 + const method = input[i]; 2834 + const methodId = method.id; 2835 + for (let j = 0; j < i; j++) { 2836 + if (methodId === input[j].id) { 2837 + return index_esm_exports.err({ 2838 + message: `duplicate "${methodId}" verification method`, 2839 + path: [i, "id"] 2840 + }); 2841 + } 2842 + } 2843 + } 2844 + return index_esm_exports.ok(input); 2845 + }).optional(), 2846 + service: index_esm_exports.array(service).optional(), 2847 + controller: index_esm_exports.union(didString, index_esm_exports.array(didString)).optional(), 2848 + authentication: index_esm_exports.array(index_esm_exports.union(didRelativeUri, verificationMethod)).optional() 2849 + }).chain((input) => { 2850 + const { id: did, service: services } = input; 2851 + if (services?.length) { 2852 + const len = services.length; 2853 + const identifiers = new Array(len); 2854 + for (let i = 0; i < len; i++) { 2855 + const service2 = services[i]; 2856 + let id = service2.id; 2857 + if (id[0] === "#") { 2858 + id = did + id; 2859 + } 2860 + identifiers[i] = id; 2861 + } 2862 + for (let i = 0; i < len; i++) { 2863 + const id = identifiers[i]; 2864 + for (let j = 0; j < i; j++) { 2865 + if (id === identifiers[j]) { 2866 + return index_esm_exports.err({ 2867 + message: `duplicate "${id}" service`, 2868 + path: ["service", i, "id"] 2869 + }); 2870 + } 2871 + } 2872 + } 2873 + } 2874 + return index_esm_exports.ok(input); 2875 + }); 2876 + 2877 + // ../node_modules/.deno/@atcute+identity@1.1.3/node_modules/@atcute/identity/dist/utils.js 2878 + init_Buffer(); 2879 + init_process(); 2880 + var isUrlParseSupported2 = "parse" in URL; 2881 + var isAtprotoServiceEndpoint = /* @__PURE__ */ __name((input) => { 2882 + let url = null; 2883 + if (isUrlParseSupported2) { 2884 + url = URL.parse(input); 2885 + } else { 2886 + try { 2887 + url = new URL(input); 2888 + } catch { 2889 + } 2890 + } 2891 + return url !== null && (url.protocol === "https:" || url.protocol === "http:") && url.pathname === "/" && url.search === "" && url.hash === ""; 2892 + }, "isAtprotoServiceEndpoint"); 2893 + var getAtprotoHandle = /* @__PURE__ */ __name((doc) => { 2894 + const alsoKnownAs = doc.alsoKnownAs; 2895 + if (!alsoKnownAs) { 2896 + return null; 2897 + } 2898 + const PREFIX = "at://"; 2899 + for (let idx = 0, len = alsoKnownAs.length; idx < len; idx++) { 2900 + const aka = alsoKnownAs[idx]; 2901 + if (!aka.startsWith(PREFIX)) { 2902 + continue; 2903 + } 2904 + const raw = aka.slice(PREFIX.length); 2905 + if (!isHandle(raw)) { 2906 + return void 0; 2907 + } 2908 + return raw; 2909 + } 2910 + return null; 2911 + }, "getAtprotoHandle"); 2912 + var getAtprotoServiceEndpoint = /* @__PURE__ */ __name((doc, predicate) => { 2913 + const services = doc.service; 2914 + if (!services) { 2915 + return; 2916 + } 2917 + for (let idx = 0, len = services.length; idx < len; idx++) { 2918 + const { id, type, serviceEndpoint } = services[idx]; 2919 + if (id !== predicate.id && id !== doc.id + predicate.id) { 2920 + continue; 2921 + } 2922 + if (predicate.type !== void 0) { 2923 + if (Array.isArray(type)) { 2924 + if (!type.includes(predicate.type)) { 2925 + continue; 2926 + } 2927 + } else { 2928 + if (type !== predicate.type) { 2929 + continue; 2930 + } 2931 + } 2932 + } 2933 + if (typeof serviceEndpoint !== "string" || !isAtprotoServiceEndpoint(serviceEndpoint)) { 2934 + continue; 2935 + } 2936 + return serviceEndpoint; 2937 + } 2938 + }, "getAtprotoServiceEndpoint"); 2939 + var getPdsEndpoint = /* @__PURE__ */ __name((doc) => { 2940 + return getAtprotoServiceEndpoint(doc, { 2941 + id: "#atproto_pds", 2942 + type: "AtprotoPersonalDataServer" 2943 + }); 2944 + }, "getPdsEndpoint"); 2945 + 2946 + // ../node_modules/.deno/@atcute+identity@1.1.3/node_modules/@atcute/identity/dist/did.js 2947 + init_Buffer(); 2948 + init_process(); 2949 + 2950 + // ../node_modules/.deno/@atcute+identity@1.1.3/node_modules/@atcute/identity/dist/methods/plc.js 2951 + init_Buffer(); 2952 + init_process(); 2953 + var PLC_DID_RE = /^did:plc:([a-z2-7]{24})$/; 2954 + var isPlcDid = /* @__PURE__ */ __name((input) => { 2955 + return input.length === 32 && PLC_DID_RE.test(input); 2956 + }, "isPlcDid"); 2957 + 2958 + // ../node_modules/.deno/@atcute+identity@1.1.3/node_modules/@atcute/identity/dist/methods/web.js 2959 + init_Buffer(); 2960 + init_process(); 2961 + var ATPROTO_WEB_DID_RE = /^did:web:([a-zA-Z0-9\-]+(?:\.[a-zA-Z0-9\-]+)*(?:\.[a-zA-Z]{2,})|localhost(?:%3[aA]\d+)?)$/; 2962 + var isAtprotoWebDid = /* @__PURE__ */ __name((input) => { 2963 + return input.length >= 12 && ATPROTO_WEB_DID_RE.test(input); 2964 + }, "isAtprotoWebDid"); 2965 + var webDidToDocumentUrl = /* @__PURE__ */ __name((did) => { 2966 + const [host, ...paths] = did.slice(8).split(":").map(decodeURIComponent); 2967 + let pathname = "/" + paths.join("/"); 2968 + if (pathname === "/") { 2969 + pathname = `/.well-known/did.json`; 2970 + } else { 2971 + pathname += `/did.json`; 2972 + } 2973 + const url = new URL(`https://${host}${pathname}`); 2974 + if (url.hostname === "localhost") { 2975 + url.protocol = "http:"; 2976 + } 2977 + return url; 2978 + }, "webDidToDocumentUrl"); 2979 + 2980 + // ../node_modules/.deno/@atcute+identity@1.1.3/node_modules/@atcute/identity/dist/did.js 2981 + var isAtprotoDid = /* @__PURE__ */ __name((input) => { 2982 + return isPlcDid(input) || isAtprotoWebDid(input); 2983 + }, "isAtprotoDid"); 2984 + var extractDidMethod = /* @__PURE__ */ __name((did) => { 2985 + const isep = did.indexOf(":", 4); 2986 + const method = did.slice(4, isep); 2987 + return method; 2988 + }, "extractDidMethod"); 2989 + 2990 + // ../node_modules/.deno/@atcute+identity@1.1.3/node_modules/@atcute/identity/dist/methods/key.js 2991 + init_Buffer(); 2992 + init_process(); 2993 + 2994 + // ../node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/dist/errors.js 2995 + init_Buffer(); 2996 + init_process(); 2997 + var DidDocumentResolutionError = class extends Error { 2998 + static { 2999 + __name(this, "DidDocumentResolutionError"); 3000 + } 3001 + name = "DidResolutionError"; 3002 + }; 3003 + var UnsupportedDidMethodError = class extends DidDocumentResolutionError { 3004 + static { 3005 + __name(this, "UnsupportedDidMethodError"); 3006 + } 3007 + did; 3008 + name = "UnsupportedDidMethodError"; 3009 + constructor(did) { 3010 + super(`unsupported did method; did=${did}`); 3011 + this.did = did; 3012 + } 3013 + }; 3014 + var DocumentNotFoundError = class extends DidDocumentResolutionError { 3015 + static { 3016 + __name(this, "DocumentNotFoundError"); 3017 + } 3018 + did; 3019 + name = "DocumentNotFoundError"; 3020 + constructor(did) { 3021 + super(`did document not found; did=${did}`); 3022 + this.did = did; 3023 + } 3024 + }; 3025 + var FailedDocumentResolutionError = class extends DidDocumentResolutionError { 3026 + static { 3027 + __name(this, "FailedDocumentResolutionError"); 3028 + } 3029 + did; 3030 + name = "FailedDocumentResolutionError"; 3031 + constructor(did, options) { 3032 + super(`failed to resolve did document; did=${did}`, options); 3033 + this.did = did; 3034 + } 3035 + }; 3036 + var HandleResolutionError = class extends Error { 3037 + static { 3038 + __name(this, "HandleResolutionError"); 3039 + } 3040 + name = "HandleResolutionError"; 3041 + }; 3042 + var DidNotFoundError = class extends HandleResolutionError { 3043 + static { 3044 + __name(this, "DidNotFoundError"); 3045 + } 3046 + handle; 3047 + name = "DidNotFoundError"; 3048 + constructor(handle) { 3049 + super(`handle returned no did; handle=${handle}`); 3050 + this.handle = handle; 3051 + } 3052 + }; 3053 + var FailedHandleResolutionError = class extends HandleResolutionError { 3054 + static { 3055 + __name(this, "FailedHandleResolutionError"); 3056 + } 3057 + handle; 3058 + name = "FailedHandleResolutionError"; 3059 + constructor(handle, options) { 3060 + super(`failed to resolve handle; handle=${handle}`, options); 3061 + this.handle = handle; 3062 + } 3063 + }; 3064 + var ActorResolutionError = class extends Error { 3065 + static { 3066 + __name(this, "ActorResolutionError"); 3067 + } 3068 + name = "ActorResolutionError"; 3069 + }; 3070 + 3071 + // ../node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/dist/actor/local.js 3072 + var LocalActorResolver = class { 3073 + static { 3074 + __name(this, "LocalActorResolver"); 3075 + } 3076 + handleResolver; 3077 + didDocumentResolver; 3078 + constructor(options) { 3079 + this.handleResolver = options.handleResolver; 3080 + this.didDocumentResolver = options.didDocumentResolver; 3081 + } 3082 + async resolve(actor, options) { 3083 + const identifierIsDid = isDid(actor); 3084 + let did; 3085 + if (identifierIsDid) { 3086 + did = actor; 3087 + } else { 3088 + try { 3089 + did = await this.handleResolver.resolve(actor, options); 3090 + } catch (err2) { 3091 + throw new ActorResolutionError(`failed to resolve handle`, { cause: err2 }); 3092 + } 3093 + } 3094 + let doc; 3095 + try { 3096 + doc = await this.didDocumentResolver.resolve(did, options); 3097 + } catch (err2) { 3098 + throw new ActorResolutionError(`failed to resolve did document`, { cause: err2 }); 3099 + } 3100 + const pds = getPdsEndpoint(doc); 3101 + if (!pds) { 3102 + throw new ActorResolutionError(`missing pds endpoint`); 3103 + } 3104 + let handle = "handle.invalid"; 3105 + if (identifierIsDid) { 3106 + const writtenHandle = getAtprotoHandle(doc); 3107 + if (writtenHandle) { 3108 + try { 3109 + const resolved = await this.handleResolver.resolve(writtenHandle, options); 3110 + if (resolved === did) { 3111 + handle = writtenHandle; 3112 + } 3113 + } catch { 3114 + } 3115 + } 3116 + } else if (getAtprotoHandle(doc) === actor) { 3117 + handle = actor; 3118 + } 3119 + return { 3120 + did, 3121 + handle, 3122 + pds: new URL(pds).href 3123 + }; 3124 + } 3125 + }; 3126 + 3127 + // ../node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/dist/did/composite.js 3128 + init_Buffer(); 3129 + init_process(); 3130 + var CompositeDidDocumentResolver = class { 3131 + static { 3132 + __name(this, "CompositeDidDocumentResolver"); 3133 + } 3134 + #methods; 3135 + constructor({ methods }) { 3136 + this.#methods = new Map(Object.entries(methods)); 3137 + } 3138 + async resolve(did, options) { 3139 + const method = extractDidMethod(did); 3140 + const resolver = this.#methods.get(method); 3141 + if (resolver === void 0) { 3142 + throw new UnsupportedDidMethodError(did); 3143 + } 3144 + return await resolver.resolve(did, options); 3145 + } 3146 + }; 3147 + 3148 + // ../node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/dist/did/methods/plc.js 3149 + init_Buffer(); 3150 + init_process(); 3151 + 3152 + // ../node_modules/.deno/@atcute+util-fetch@1.0.5/node_modules/@atcute/util-fetch/dist/index.js 3153 + init_Buffer(); 3154 + init_process(); 3155 + 3156 + // ../node_modules/.deno/@atcute+util-fetch@1.0.5/node_modules/@atcute/util-fetch/dist/doh-json.js 3157 + init_Buffer(); 3158 + init_process(); 3159 + 3160 + // ../node_modules/.deno/@atcute+util-fetch@1.0.5/node_modules/@atcute/util-fetch/dist/pipeline.js 3161 + init_Buffer(); 3162 + init_process(); 3163 + function pipe(...pipeline) { 3164 + return pipeline.reduce(pipeTwo); 3165 + } 3166 + __name(pipe, "pipe"); 3167 + var pipeTwo = /* @__PURE__ */ __name((first, second) => { 3168 + return (input) => first(input).then(second); 3169 + }, "pipeTwo"); 3170 + 3171 + // ../node_modules/.deno/@atcute+util-fetch@1.0.5/node_modules/@atcute/util-fetch/dist/transformers.js 3172 + init_Buffer(); 3173 + init_process(); 3174 + 3175 + // ../node_modules/.deno/@atcute+util-fetch@1.0.5/node_modules/@atcute/util-fetch/dist/errors.js 3176 + init_Buffer(); 3177 + init_process(); 3178 + var FetchResponseError2 = class extends Error { 3179 + static { 3180 + __name(this, "FetchResponseError"); 3181 + } 3182 + name = "FetchResponseError"; 3183 + }; 3184 + var FailedResponseError = class extends FetchResponseError2 { 3185 + static { 3186 + __name(this, "FailedResponseError"); 3187 + } 3188 + response; 3189 + name = "FailedResponseError"; 3190 + constructor(response2) { 3191 + super(`got http ${response2.status}`); 3192 + this.response = response2; 3193 + } 3194 + get status() { 3195 + return this.response.status; 3196 + } 3197 + }; 3198 + var ImproperContentTypeError = class extends FetchResponseError2 { 3199 + static { 3200 + __name(this, "ImproperContentTypeError"); 3201 + } 3202 + contentType; 3203 + name = "ImproperContentTypeError"; 3204 + constructor(contentType, reason) { 3205 + super(reason); 3206 + this.contentType = contentType; 3207 + } 3208 + }; 3209 + var ImproperContentLengthError = class extends FetchResponseError2 { 3210 + static { 3211 + __name(this, "ImproperContentLengthError"); 3212 + } 3213 + expectedSize; 3214 + actualSize; 3215 + name = "ImproperContentLengthError"; 3216 + constructor(expectedSize, actualSize, reason) { 3217 + super(reason); 3218 + this.expectedSize = expectedSize; 3219 + this.actualSize = actualSize; 3220 + } 3221 + }; 3222 + var ImproperResponseError = class extends FetchResponseError2 { 3223 + static { 3224 + __name(this, "ImproperResponseError"); 3225 + } 3226 + name = "ImproperResponseError"; 3227 + constructor(reason, options) { 3228 + super(reason, options); 3229 + } 3230 + }; 3231 + 3232 + // ../node_modules/.deno/@atcute+util-fetch@1.0.5/node_modules/@atcute/util-fetch/dist/streams/size-limit.js 3233 + init_Buffer(); 3234 + init_process(); 3235 + var SizeLimitStream = class extends TransformStream { 3236 + static { 3237 + __name(this, "SizeLimitStream"); 3238 + } 3239 + constructor(maxSize) { 3240 + let bytesRead = 0; 3241 + super({ 3242 + transform(chunk, controller) { 3243 + bytesRead += chunk.length; 3244 + if (bytesRead > maxSize) { 3245 + controller.error(new ImproperContentLengthError(maxSize, bytesRead, `response content-length too large`)); 3246 + return; 3247 + } 3248 + controller.enqueue(chunk); 3249 + } 3250 + }); 3251 + } 3252 + }; 3253 + 3254 + // ../node_modules/.deno/@atcute+util-fetch@1.0.5/node_modules/@atcute/util-fetch/dist/transformers.js 3255 + var isResponseOk = /* @__PURE__ */ __name(async (response2) => { 3256 + if (response2.ok) { 3257 + return response2; 3258 + } 3259 + throw new FailedResponseError(response2); 3260 + }, "isResponseOk"); 3261 + var readResponseAsText = /* @__PURE__ */ __name((maxSize) => async (response2) => { 3262 + const text = await readResponse(response2, maxSize); 3263 + return { response: response2, text }; 3264 + }, "readResponseAsText"); 3265 + var parseResponseAsJson = /* @__PURE__ */ __name((typeRegex, maxSize) => async (response2) => { 3266 + await assertContentType(response2, typeRegex); 3267 + const text = await readResponse(response2, maxSize); 3268 + try { 3269 + const json = JSON.parse(text); 3270 + return { response: response2, json }; 3271 + } catch (error) { 3272 + throw new ImproperResponseError(`unexpected json data`, { cause: error }); 3273 + } 3274 + }, "parseResponseAsJson"); 3275 + var validateJsonWith = /* @__PURE__ */ __name((schema, options) => async (parsed) => { 3276 + const json = schema.parse(parsed.json, options); 3277 + return { response: parsed.response, json }; 3278 + }, "validateJsonWith"); 3279 + var assertContentType = /* @__PURE__ */ __name(async (response2, typeRegex) => { 3280 + const type = response2.headers.get("content-type")?.split(";", 1)[0].trim(); 3281 + if (type === void 0) { 3282 + if (response2.body) { 3283 + await response2.body.cancel(); 3284 + } 3285 + throw new ImproperContentTypeError(null, `missing response content-type`); 3286 + } 3287 + if (!typeRegex.test(type)) { 3288 + if (response2.body) { 3289 + await response2.body.cancel(); 3290 + } 3291 + throw new ImproperContentTypeError(type, `unexpected response content-type`); 3292 + } 3293 + }, "assertContentType"); 3294 + var readResponse = /* @__PURE__ */ __name(async (response2, maxSize) => { 3295 + const rawSize = response2.headers.get("content-length"); 3296 + if (rawSize !== null) { 3297 + const size = Number(rawSize); 3298 + if (!Number.isSafeInteger(size) || size <= 0) { 3299 + response2.body?.cancel(); 3300 + throw new ImproperContentLengthError(maxSize, null, `invalid response content-length`); 3301 + } 3302 + if (size > maxSize) { 3303 + response2.body?.cancel(); 3304 + throw new ImproperContentLengthError(maxSize, size, `response content-length too large`); 3305 + } 3306 + } 3307 + const stream = response2.body.pipeThrough(new SizeLimitStream(maxSize)).pipeThrough(new TextDecoderStream()); 3308 + let text = ""; 3309 + for await (const chunk of createStreamIterator(stream)) { 3310 + text += chunk; 3311 + } 3312 + return text; 3313 + }, "readResponse"); 3314 + var createStreamIterator = Symbol.asyncIterator in ReadableStream.prototype ? (stream) => stream[Symbol.asyncIterator]() : (stream) => { 3315 + const reader = stream.getReader(); 3316 + return { 3317 + [Symbol.asyncIterator]() { 3318 + return this; 3319 + }, 3320 + next() { 3321 + return reader.read(); 3322 + }, 3323 + async return() { 3324 + await reader.cancel(); 3325 + return { done: true, value: void 0 }; 3326 + }, 3327 + async throw(error) { 3328 + await reader.cancel(error); 3329 + return { done: true, value: void 0 }; 3330 + } 3331 + }; 3332 + }; 3333 + 3334 + // ../node_modules/.deno/@atcute+util-fetch@1.0.5/node_modules/@atcute/util-fetch/dist/doh-json.js 3335 + var uint32 = index_esm_exports.number().assert((input) => Number.isInteger(input) && input >= 0 && input <= 2 ** 32 - 1); 3336 + var question = index_esm_exports.object({ 3337 + name: index_esm_exports.string(), 3338 + type: index_esm_exports.literal(16) 3339 + // TXT 3340 + }); 3341 + var answer = index_esm_exports.object({ 3342 + name: index_esm_exports.string(), 3343 + type: index_esm_exports.literal(16), 3344 + // TXT 3345 + TTL: uint32, 3346 + data: index_esm_exports.string().chain((input) => { 3347 + return index_esm_exports.ok(input.replace(/^"|"$/g, "").replace(/\\"/g, '"')); 3348 + }) 3349 + }); 3350 + var authority = index_esm_exports.object({ 3351 + name: index_esm_exports.string(), 3352 + type: uint32, 3353 + TTL: uint32, 3354 + data: index_esm_exports.string() 3355 + }); 3356 + var dohJsonTxtResult = index_esm_exports.object({ 3357 + /** DNS response code */ 3358 + Status: uint32, 3359 + /** whether response is truncated */ 3360 + TC: index_esm_exports.boolean(), 3361 + /** whether recursive desired bit is set, always true for Google and Cloudflare DoH */ 3362 + RD: index_esm_exports.boolean(), 3363 + /** whether recursive available bit is set, always true for Google and Cloudflare DoH */ 3364 + RA: index_esm_exports.boolean(), 3365 + /** whether response data was validated with DNSSEC */ 3366 + AD: index_esm_exports.boolean(), 3367 + /** whether client asked to disable DNSSEC validation */ 3368 + CD: index_esm_exports.boolean(), 3369 + /** requested records */ 3370 + Question: index_esm_exports.tuple([question]), 3371 + /** answers */ 3372 + Answer: index_esm_exports.array(answer).optional(() => []), 3373 + /** authority */ 3374 + Authority: index_esm_exports.array(authority).optional(), 3375 + /** comment from the DNS server */ 3376 + Comment: index_esm_exports.union(index_esm_exports.string(), index_esm_exports.array(index_esm_exports.string())).optional() 3377 + }); 3378 + var fetchDohJsonTxt = pipe(isResponseOk, parseResponseAsJson(/^application\/(dns-)?json$/, 16 * 1024), validateJsonWith(dohJsonTxtResult, { mode: "passthrough" })); 3379 + 3380 + // ../node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/dist/did/utils.js 3381 + init_Buffer(); 3382 + init_process(); 3383 + var fetchDocHandler = pipe(isResponseOk, parseResponseAsJson(/^application\/(did\+ld\+)?json$/, 20 * 1024), validateJsonWith(typedefs_exports.didDocument, { mode: "passthrough" })); 3384 + 3385 + // ../node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/dist/did/methods/plc.js 3386 + var PlcDidDocumentResolver = class { 3387 + static { 3388 + __name(this, "PlcDidDocumentResolver"); 3389 + } 3390 + apiUrl; 3391 + #fetch; 3392 + constructor({ apiUrl = "https://plc.directory", fetch: fetchThis = fetch } = {}) { 3393 + this.apiUrl = apiUrl; 3394 + this.#fetch = fetchThis; 3395 + } 3396 + async resolve(did, options) { 3397 + if (!did.startsWith("did:plc:")) { 3398 + throw new UnsupportedDidMethodError(did); 3399 + } 3400 + let json; 3401 + try { 3402 + const url = new URL(`/${encodeURIComponent(did)}`, this.apiUrl); 3403 + const response2 = await (0, this.#fetch)(url, { 3404 + signal: options?.signal, 3405 + cache: options?.noCache ? "no-cache" : void 0, 3406 + redirect: "manual", 3407 + headers: { accept: "application/did+ld+json,application/json" } 3408 + }); 3409 + if (response2.status >= 300 && response2.status < 400) { 3410 + throw new TypeError(`unexpected redirect`); 3411 + } 3412 + const handled = await fetchDocHandler(response2); 3413 + json = handled.json; 3414 + } catch (cause) { 3415 + if (cause instanceof FailedResponseError && cause.status === 404) { 3416 + throw new DocumentNotFoundError(did); 3417 + } 3418 + throw new FailedDocumentResolutionError(did, { cause }); 3419 + } 3420 + return json; 3421 + } 3422 + }; 3423 + 3424 + // ../node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/dist/did/methods/web.js 3425 + init_Buffer(); 3426 + init_process(); 3427 + var WebDidDocumentResolver = class { 3428 + static { 3429 + __name(this, "WebDidDocumentResolver"); 3430 + } 3431 + #fetch; 3432 + constructor({ fetch: fetchThis = fetch } = {}) { 3433 + this.#fetch = fetchThis; 3434 + } 3435 + async resolve(did, options) { 3436 + if (!did.startsWith("did:web:")) { 3437 + throw new UnsupportedDidMethodError(did); 3438 + } 3439 + let json; 3440 + try { 3441 + const url = webDidToDocumentUrl(did); 3442 + const response2 = await (0, this.#fetch)(url, { 3443 + signal: options?.signal, 3444 + cache: options?.noCache ? "no-cache" : void 0, 3445 + redirect: "manual", 3446 + headers: { accept: "application/did+ld+json,application/json" } 3447 + }); 3448 + if (response2.status >= 300 && response2.status < 400) { 3449 + throw new TypeError(`unexpected redirect`); 3450 + } 3451 + const handled = await fetchDocHandler(response2); 3452 + json = handled.json; 3453 + } catch (cause) { 3454 + if (cause instanceof FailedResponseError && cause.status === 404) { 3455 + throw new DocumentNotFoundError(did); 3456 + } 3457 + throw new FailedDocumentResolutionError(did, { cause }); 3458 + } 3459 + return json; 3460 + } 3461 + }; 3462 + 3463 + // ../node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/dist/did/methods/xrpc.js 3464 + init_Buffer(); 3465 + init_process(); 3466 + var fetchXrpcHandler = pipe(isResponseOk, parseResponseAsJson(/^application\/json$/, 20 * 1024 + 16), validateJsonWith(index_esm_exports.object({ didDoc: typedefs_exports.didDocument }), { mode: "passthrough" })); 3467 + 3468 + // ../node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/dist/handle/composite.js 3469 + init_Buffer(); 3470 + init_process(); 3471 + 3472 + // ../node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/dist/handle/methods/doh-json.js 3473 + init_Buffer(); 3474 + init_process(); 3475 + 3476 + // ../node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/dist/handle/methods/well-known.js 3477 + init_Buffer(); 3478 + init_process(); 3479 + var fetchWellKnownHandler = pipe(isResponseOk, readResponseAsText(2048 + 16)); 3480 + 3481 + // ../node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/dist/handle/methods/xrpc.js 3482 + init_Buffer(); 3483 + init_process(); 3484 + var response = index_esm_exports.object({ 3485 + did: index_esm_exports.string().assert((input) => isAtprotoDid(input)) 3486 + }); 3487 + var fetchXrpcHandler2 = pipe(isResponseOk, parseResponseAsJson(/^application\/json$/, 4 * 1024), validateJsonWith(response, { mode: "passthrough" })); 3488 + var XrpcHandleResolver = class { 3489 + static { 3490 + __name(this, "XrpcHandleResolver"); 3491 + } 3492 + serviceUrl; 3493 + #fetch; 3494 + constructor({ serviceUrl, fetch: fetchThis = fetch }) { 3495 + this.serviceUrl = serviceUrl; 3496 + this.#fetch = fetchThis; 3497 + } 3498 + async resolve(handle, options) { 3499 + let json; 3500 + try { 3501 + const url = new URL(`/xrpc/com.atproto.identity.resolveHandle`, this.serviceUrl); 3502 + url.searchParams.set("handle", handle); 3503 + const response2 = await (0, this.#fetch)(url, { 3504 + signal: options?.signal, 3505 + cache: options?.noCache ? "no-cache" : void 0, 3506 + headers: { accept: "application/json" } 3507 + }); 3508 + const handled = await fetchXrpcHandler2(response2); 3509 + json = handled.json; 3510 + } catch (cause) { 3511 + if (cause instanceof FailedResponseError && cause.status === 400) { 3512 + throw new DidNotFoundError(handle); 3513 + } 3514 + throw new FailedHandleResolutionError(handle, { cause }); 3515 + } 3516 + return json.did; 3517 + } 3518 + }; 3519 + 3520 + // ../node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/dist/types.js 3521 + init_Buffer(); 3522 + init_process(); 3523 + 3524 + // components/output/raw/atproto/oauth.js 3525 + var STORAGE_KEY = "diffuse/output/raw/atproto/did"; 3526 + var SCOPE = oauth_client_metadata_default.scope; 3527 + var redirect_uri = (globalThis.location.origin + globalThis.location.pathname + globalThis.location.search).replace( 3528 + "://localhost", 3529 + "://127.0.0.1" 3530 + ); 3531 + configureOAuth({ 3532 + metadata: { 3533 + client_id: redirect_uri.startsWith("http://127.0.0.1") ? `http://localhost/?redirect_uri=${encodeURIComponent(redirect_uri)}&scope=${encodeURIComponent(SCOPE)}` : ( 3534 + /** @type {any} */ 3535 + import.meta.env?.ATPROTO_CLIENT_ID ?? "https://elements.diffuse.sh/oauth-client-metadata.json" 3536 + ), 3537 + redirect_uri 3538 + }, 3539 + identityResolver: new LocalActorResolver({ 3540 + handleResolver: new XrpcHandleResolver({ 3541 + serviceUrl: "https://public.api.bsky.app" 3542 + }), 3543 + didDocumentResolver: new CompositeDidDocumentResolver({ 3544 + methods: { 3545 + plc: new PlcDidDocumentResolver(), 3546 + web: new WebDidDocumentResolver() 3547 + } 3548 + }) 3549 + }) 3550 + }); 3551 + async function login(handle) { 3552 + const location = globalThis.location; 3553 + if (location.origin.startsWith("http://localhost")) { 3554 + location.assign( 3555 + location.href.replace("http://localhost:", "http://127.0.0.1:") 3556 + ); 3557 + } 3558 + const authUrl = await createAuthorizationUrl({ 3559 + target: { type: "account", identifier: ( 3560 + /** @type {any} */ 3561 + handle 3562 + ) }, 3563 + scope: SCOPE 3564 + }); 3565 + location.assign(authUrl.toString()); 3566 + } 3567 + __name(login, "login"); 3568 + async function restoreOrFinalize() { 3569 + const location = globalThis.location; 3570 + const params = new URLSearchParams(location.hash.slice(1)); 3571 + if (params.has("code")) { 3572 + const result = await finalizeAuthorization(params); 3573 + history.replaceState( 3574 + null, 3575 + "", 3576 + location.pathname + location.search 3577 + ); 3578 + localStorage.setItem(STORAGE_KEY, result.session.info.sub); 3579 + return result.session; 3580 + } 3581 + const did = localStorage.getItem(STORAGE_KEY); 3582 + if (did) { 3583 + try { 3584 + return await getSession( 3585 + /** @type {`did:${string}:${string}`} */ 3586 + did, 3587 + { allowStale: true } 3588 + ); 3589 + } catch (err2) { 3590 + console.warn(err2); 3591 + localStorage.removeItem(STORAGE_KEY); 3592 + return null; 3593 + } 3594 + } 3595 + return null; 3596 + } 3597 + __name(restoreOrFinalize, "restoreOrFinalize"); 3598 + async function logout(agent) { 3599 + const did = localStorage.getItem(STORAGE_KEY); 3600 + try { 3601 + await agent.signOut(); 3602 + } catch { 3603 + if (did) { 3604 + deleteStoredSession( 3605 + /** @type {`did:${string}:${string}`} */ 3606 + did 3607 + ); 3608 + } 3609 + } 3610 + localStorage.removeItem(STORAGE_KEY); 3611 + } 3612 + __name(logout, "logout"); 3613 + 3614 + export { 3615 + OAuthUserAgent, 3616 + login, 3617 + restoreOrFinalize, 3618 + logout 3619 + }; 3620 + 3621 + //# sourceMappingURL=./chunk-CHYBYJZ3.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-CHYBYJZ3.js.map
··· 1 + {"version":3,"sources":["/node_modules/.deno/@badrap+valita@0.4.6/node_modules/@badrap/valita/src/index.ts","/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+multibase@1.1.8/node_modules/@atcute/multibase/lib/index.ts","/node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/lib/bases/base16-web.ts","/node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/lib/bases/base16-web-native.ts","/node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/lib/bases/base16-web-polyfill.ts","/node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/lib/utils.ts","/node_modules/.deno/@atcute+uint8array@1.1.1/node_modules/@atcute/uint8array/lib/index.ts","/node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/lib/bases/base64-web.ts","/node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/lib/bases/base64-web-native.ts","/node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/lib/bases/base64-web-polyfill.ts","/node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/lib/bases/base32.ts","/node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/lib/bases/base32-encode.ts","/node_modules/.deno/@atcute+multibase@1.1.8/node_modules/@atcute/multibase/lib/bases/base58.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/@badrap+valita@0.4.6/node_modules/@badrap/valita/src/index.esm.mts","/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","/node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/index.ts","/node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/actor/local.ts","/node_modules/.deno/@atcute+identity@1.1.3/node_modules/@atcute/identity/lib/index.ts","/node_modules/.deno/@atcute+identity@1.1.3/node_modules/@atcute/identity/lib/typedefs.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/syntax/index.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/syntax/at-identifier.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/syntax/did.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/syntax/handle.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/syntax/utils/ascii.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/syntax/at-uri.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/utils.ts","/node_modules/.deno/esm-env@1.2.2/node_modules/esm-env/index.js","/node_modules/.deno/esm-env@1.2.2/node_modules/esm-env/browser-fallback.js","/node_modules/.deno/esm-env@1.2.2/node_modules/esm-env/dev-fallback.js","/node_modules/.deno/esm-env@1.2.2/node_modules/esm-env/true.js","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/syntax/nsid.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/syntax/record-key.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/syntax/cid.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/syntax/datetime.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/syntax/language.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/syntax/tid.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/syntax/uri.ts","/node_modules/.deno/@atcute+identity@1.1.3/node_modules/@atcute/identity/dist/types.js","/node_modules/.deno/@atcute+identity@1.1.3/node_modules/@atcute/identity/lib/utils.ts","/node_modules/.deno/@atcute+identity@1.1.3/node_modules/@atcute/identity/lib/did.ts","/node_modules/.deno/@atcute+identity@1.1.3/node_modules/@atcute/identity/lib/methods/plc.ts","/node_modules/.deno/@atcute+identity@1.1.3/node_modules/@atcute/identity/lib/methods/web.ts","/node_modules/.deno/@atcute+identity@1.1.3/node_modules/@atcute/identity/lib/methods/key.ts","/node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/errors.ts","/node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/did/composite.ts","/node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/did/methods/plc.ts","/node_modules/.deno/@atcute+util-fetch@1.0.5/node_modules/@atcute/util-fetch/lib/index.ts","/node_modules/.deno/@atcute+util-fetch@1.0.5/node_modules/@atcute/util-fetch/lib/doh-json.ts","/node_modules/.deno/@atcute+util-fetch@1.0.5/node_modules/@atcute/util-fetch/lib/pipeline.ts","/node_modules/.deno/@atcute+util-fetch@1.0.5/node_modules/@atcute/util-fetch/lib/transformers.ts","/node_modules/.deno/@atcute+util-fetch@1.0.5/node_modules/@atcute/util-fetch/lib/errors.ts","/node_modules/.deno/@atcute+util-fetch@1.0.5/node_modules/@atcute/util-fetch/lib/streams/size-limit.ts","/node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/did/utils.ts","/node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/did/methods/web.ts","/node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/did/methods/xrpc.ts","/node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/handle/composite.ts","/node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/handle/methods/doh-json.ts","/node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/handle/methods/well-known.ts","/node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/lib/handle/methods/xrpc.ts","/node_modules/.deno/@atcute+identity-resolver@1.2.2/node_modules/@atcute/identity-resolver/dist/types.js"],"sourcesContent":["/**\n * @module\n * A typesafe validation & parsing library for TypeScript.\n *\n * @example\n * ```ts\n * import * as v from \"@badrap/valita\";\n *\n * const vehicle = v.union(\n * v.object({ type: v.literal(\"plane\"), airline: v.string() }),\n * v.object({ type: v.literal(\"train\") }),\n * v.object({ type: v.literal(\"automobile\"), make: v.string() })\n * );\n * vehicle.parse({ type: \"bike\" });\n * // ValitaError: invalid_literal at .type (expected \"plane\", \"train\" or \"automobile\")\n * ```\n */\n\n// This is magic that turns object intersections to nicer-looking types.\ntype PrettyIntersection<V> = Extract<{ [K in keyof V]: V[K] }, unknown>;\n\ntype Literal = string | number | bigint | boolean;\ntype Key = string | number;\ntype InputType =\n | \"object\"\n | \"array\"\n | \"null\"\n | \"undefined\"\n | \"string\"\n | \"number\"\n | \"bigint\"\n | \"boolean\";\n\ntype CustomError =\n | undefined\n | string\n | {\n message?: string;\n path?: Key[];\n };\n\ntype IssueLeaf = Readonly<\n | { ok: false; code: \"custom_error\"; error: CustomError }\n | { ok: false; code: \"invalid_type\"; expected: InputType[] }\n | { ok: false; code: \"missing_value\" }\n | { ok: false; code: \"invalid_literal\"; expected: Literal[] }\n | { ok: false; code: \"unrecognized_keys\"; keys: Key[] }\n | { ok: false; code: \"invalid_union\"; tree: IssueTree }\n | {\n ok: false;\n code: \"invalid_length\";\n minLength: number;\n maxLength: number | undefined;\n }\n>;\n\nfunction expectedType(expected: InputType[]): IssueLeaf {\n return {\n ok: false,\n code: \"invalid_type\",\n expected,\n };\n}\n\nconst ISSUE_EXPECTED_NOTHING = expectedType([]);\nconst ISSUE_EXPECTED_STRING = expectedType([\"string\"]);\nconst ISSUE_EXPECTED_NUMBER = expectedType([\"number\"]);\nconst ISSUE_EXPECTED_BIGINT = expectedType([\"bigint\"]);\nconst ISSUE_EXPECTED_BOOLEAN = expectedType([\"boolean\"]);\nconst ISSUE_EXPECTED_UNDEFINED = expectedType([\"undefined\"]);\nconst ISSUE_EXPECTED_NULL = expectedType([\"null\"]);\nconst ISSUE_EXPECTED_OBJECT = expectedType([\"object\"]);\nconst ISSUE_EXPECTED_ARRAY = expectedType([\"array\"]);\nconst ISSUE_MISSING_VALUE: IssueLeaf = {\n ok: false,\n code: \"missing_value\",\n};\n\ntype IssueTree =\n | Readonly<{ ok: false; code: \"prepend\"; key: Key; tree: IssueTree }>\n | Readonly<{ ok: false; code: \"join\"; left: IssueTree; right: IssueTree }>\n | IssueLeaf;\n\ntype Issue = Readonly<\n | {\n code: \"custom_error\";\n path: Key[];\n message?: string | undefined;\n /** @deprecated Instead of `.error` use `.message`. */\n error: CustomError;\n }\n | { code: \"invalid_type\"; path: Key[]; expected: InputType[] }\n | { code: \"missing_value\"; path: Key[] }\n | { code: \"invalid_literal\"; path: Key[]; expected: Literal[] }\n | { code: \"unrecognized_keys\"; path: Key[]; keys: Key[] }\n | {\n code: \"invalid_union\";\n path: Key[];\n issues: Issue[];\n /** @deprecated Instead of `.tree` use `.issues`. */\n tree: IssueTree;\n }\n | {\n code: \"invalid_length\";\n path: Key[];\n minLength: number;\n maxLength: number | undefined;\n }\n>;\n\nfunction joinIssues(left: IssueTree | undefined, right: IssueTree): IssueTree {\n return left ? { ok: false, code: \"join\", left, right } : right;\n}\n\nfunction prependPath(key: Key, tree: IssueTree): IssueTree {\n return { ok: false, code: \"prepend\", key, tree };\n}\n\nfunction cloneIssueWithPath(tree: IssueLeaf, path: Key[]): Issue {\n const code = tree.code;\n switch (code) {\n case \"invalid_type\":\n return { code, path, expected: tree.expected };\n case \"invalid_literal\":\n return { code, path, expected: tree.expected };\n case \"missing_value\":\n return { code, path };\n case \"invalid_length\":\n return {\n code,\n path,\n minLength: tree.minLength,\n maxLength: tree.maxLength,\n };\n case \"unrecognized_keys\":\n return { code, path, keys: tree.keys };\n case \"invalid_union\":\n return { code, path, tree: tree.tree, issues: collectIssues(tree.tree) };\n case \"custom_error\":\n if (typeof tree.error === \"object\" && tree.error.path !== undefined) {\n path.push(...tree.error.path);\n }\n return {\n code,\n path,\n message:\n typeof tree.error === \"string\" ? tree.error : tree.error?.message,\n error: tree.error,\n };\n }\n}\n\nfunction collectIssues(\n tree: IssueTree,\n path: Key[] = [],\n issues: Issue[] = [],\n): Issue[] {\n for (;;) {\n if (tree.code === \"join\") {\n collectIssues(tree.left, path.slice(), issues);\n tree = tree.right;\n } else if (tree.code === \"prepend\") {\n path.push(tree.key);\n tree = tree.tree;\n } else {\n issues.push(cloneIssueWithPath(tree, path));\n return issues;\n }\n }\n}\n\nfunction separatedList(list: string[], sep: \"or\" | \"and\"): string {\n if (list.length === 0) {\n return \"nothing\";\n } else if (list.length === 1) {\n return list[0];\n } else {\n return `${list.slice(0, -1).join(\", \")} ${sep} ${list[list.length - 1]}`;\n }\n}\n\nfunction formatLiteral(value: Literal): string {\n return typeof value === \"bigint\" ? `${value}n` : JSON.stringify(value);\n}\n\nfunction countIssues(tree: IssueTree): number {\n let count = 0;\n for (;;) {\n if (tree.code === \"join\") {\n count += countIssues(tree.left);\n tree = tree.right;\n } else if (tree.code === \"prepend\") {\n tree = tree.tree;\n } else {\n return count + 1;\n }\n }\n}\n\nfunction formatIssueTree(tree: IssueTree): string {\n let path = \"\";\n let count = 0;\n for (;;) {\n if (tree.code === \"join\") {\n count += countIssues(tree.right);\n tree = tree.left;\n } else if (tree.code === \"prepend\") {\n path += `.${tree.key}`;\n tree = tree.tree;\n } else {\n break;\n }\n }\n\n let message = \"validation failed\";\n if (tree.code === \"invalid_type\") {\n message = `expected ${separatedList(tree.expected, \"or\")}`;\n } else if (tree.code === \"invalid_literal\") {\n message = `expected ${separatedList(\n tree.expected.map(formatLiteral),\n \"or\",\n )}`;\n } else if (tree.code === \"missing_value\") {\n message = `missing value`;\n } else if (tree.code === \"unrecognized_keys\") {\n const keys = tree.keys;\n message = `unrecognized ${\n keys.length === 1 ? \"key\" : \"keys\"\n } ${separatedList(keys.map(formatLiteral), \"and\")}`;\n } else if (tree.code === \"invalid_length\") {\n const min = tree.minLength;\n const max = tree.maxLength;\n message = `expected an array with `;\n if (min > 0) {\n if (max === min) {\n message += `${min}`;\n } else if (max !== undefined) {\n message += `between ${min} and ${max}`;\n } else {\n message += `at least ${min}`;\n }\n } else {\n message += `at most ${max ?? \"∞\"}`;\n }\n message += ` item(s)`;\n } else if (tree.code === \"custom_error\") {\n const error = tree.error;\n if (typeof error === \"string\") {\n message = error;\n } else if (error !== undefined) {\n if (error.message !== undefined) {\n message = error.message;\n }\n if (error.path !== undefined) {\n path += \".\" + error.path.join(\".\");\n }\n }\n }\n\n let msg = `${tree.code} at .${path.slice(1)} (${message})`;\n if (count === 1) {\n msg += ` (+ 1 other issue)`;\n } else if (count > 1) {\n msg += ` (+ ${count} other issues)`;\n }\n return msg;\n}\n\nfunction lazyProperty<T>(\n obj: object,\n prop: string | number | symbol,\n value: T,\n enumerable: boolean,\n): T {\n Object.defineProperty(obj, prop, {\n value,\n enumerable,\n writable: false,\n });\n return value;\n}\n\n/**\n * An error type representing one or more validation/parsing errors.\n *\n * The `.message` property gives a short overview of the encountered issues,\n * while the `.issue` property can be used to get a more detailed list.\n *\n * @example\n * ```ts\n * const t = v.object({ a: v.null(), b: v.null() });\n *\n * try {\n * t.parse({ a: 1 });\n * } catch (err) {\n * err.message;\n * // \"invalid_type at .a (expected null) (+ 1 other issue)\"\n *\n * err.issues;\n * // [\n * // { code: 'invalid_type', path: [ 'a' ], expected: [ 'null' ] },\n * // { code: 'missing_value', path: [ 'b' ] }\n * // ]\n * }\n * ```\n */\nexport class ValitaError extends Error {\n /** @internal */\n private readonly _issueTree: IssueTree;\n\n constructor(issueTree: IssueTree) {\n super(formatIssueTree(issueTree));\n\n Object.setPrototypeOf(this, new.target.prototype);\n\n this.name = new.target.name;\n this._issueTree = issueTree;\n }\n\n get issues(): readonly Issue[] {\n return lazyProperty(this, \"issues\", collectIssues(this._issueTree), true);\n }\n}\n\n/**\n * A successful validation/parsing result.\n *\n * Used in situations where both the parsing success and failure\n * cases are returned as values.\n */\nexport type Ok<T> = {\n readonly ok: true;\n\n /**\n * The successfully parsed value.\n */\n readonly value: T;\n};\n\n/**\n * A validation/parsing failure.\n *\n * Used in situations where both the parsing success and failure\n * cases are returned as values.\n */\nexport type Err = {\n readonly ok: false;\n\n /**\n * A condensed overview of the parsing issues.\n */\n readonly message: string;\n\n /**\n * A detailed list of the parsing issues.\n */\n readonly issues: readonly Issue[];\n\n /**\n * Throw a new ValitaError representing the parsing issues.\n */\n throw(): never;\n};\n\n/**\n * A validation/parsing success or failure.\n *\n * Used by parsing-related methods where and both success and failure\n * cases are returned as values (instead of raising an exception on failure).\n * The most notable example is the `Type.try(...)` method.\n *\n * The `.ok` property can to assert whether the value represents a success or\n * failure and access further information in a typesafe way.\n *\n * @example\n * ```ts\n * const t = v.string();\n *\n * // Make parsing fail or succeed about equally.\n * const result = t.try(Math.random() < 0.5 ? \"hello\" : null);\n *\n * if (result.ok) {\n * // TypeScript allows accessing .value within this code block.\n * console.log(`Success: ${result.value}`);\n * } else {\n * // TypeScript allows accessing .message within this code block.\n * console.log(`Failed: ${result.message}`);\n * }\n * ```\n */\nexport type ValitaResult<V> = Ok<V> | Err;\n\nclass ErrImpl implements Err {\n readonly ok = false;\n\n /** @internal */\n private readonly _issueTree: IssueTree;\n\n constructor(issueTree: IssueTree) {\n this._issueTree = issueTree;\n }\n\n get issues(): readonly Issue[] {\n return lazyProperty(this, \"issues\", collectIssues(this._issueTree), true);\n }\n\n get message(): string {\n return lazyProperty(\n this,\n \"message\",\n formatIssueTree(this._issueTree),\n true,\n );\n }\n\n throw(): never {\n throw new ValitaError(this._issueTree);\n }\n}\n\n/**\n * Create a value for returning a successful parsing result from chain().\n *\n * @example\n * ```ts\n * const t = v.string().chain((s) => v.ok(s + \", world!\"));\n *\n * t.parse(\"Hello\");\n * // \"Hello, world!\"\n * ```\n */\nexport function ok<T extends Literal>(value: T): Ok<T>;\nexport function ok<T>(value: T): Ok<T>;\nexport function ok<T>(value: T): Ok<T> {\n return { ok: true, value };\n}\n\n/**\n * Create a value for returning a parsing error from chain().\n *\n * An optional error message can be provided.\n *\n * @example\n * ```ts\n * const t = v.string().chain(() => v.err(\"bad value\"));\n *\n * t.parse(\"hello\");\n * // ValitaError: custom_error at . (bad value)\n * ```\n */\nexport function err(error?: CustomError): Err {\n return new ErrImpl({ ok: false, code: \"custom_error\", error });\n}\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nconst FLAG_FORBID_EXTRA_KEYS = 1 << 0;\nconst FLAG_STRIP_EXTRA_KEYS = 1 << 1;\nconst FLAG_MISSING_VALUE = 1 << 2;\n\n/**\n * Return the inferred output type of a validator.\n *\n * @example\n * ```ts\n * const t = v.union(v.literal(1), v.string());\n *\n * type T = v.Infer<typeof t>;\n * // type T = 1 | string;\n * ```\n */\nexport type Infer<T extends AbstractType> =\n T extends AbstractType<infer I> ? I : never;\n\nexport type ParseOptions = {\n mode?: \"passthrough\" | \"strict\" | \"strip\";\n};\n\nconst TAG_UNKNOWN = 0;\nconst TAG_NEVER = 1;\nconst TAG_STRING = 2;\nconst TAG_NUMBER = 3;\nconst TAG_BIGINT = 4;\nconst TAG_BOOLEAN = 5;\nconst TAG_NULL = 6;\nconst TAG_UNDEFINED = 7;\nconst TAG_LITERAL = 8;\nconst TAG_OPTIONAL = 9;\nconst TAG_OBJECT = 10;\nconst TAG_ARRAY = 11;\nconst TAG_UNION = 12;\nconst TAG_SIMPLE_UNION = 13;\nconst TAG_TRANSFORM = 14;\nconst TAG_OTHER = 15;\n\ntype MatcherResult = undefined | Ok<unknown> | IssueTree;\n\ntype Matcher<Input = unknown> = (value: Input, flags: number) => MatcherResult;\n\ntype TaggedMatcher = { tag: number; match: Matcher };\n\nconst taggedMatcher = (tag: number, match: Matcher): TaggedMatcher => {\n return { tag, match };\n};\n\nfunction callMatcher(\n matcher: TaggedMatcher,\n value: unknown,\n flags: number,\n): MatcherResult {\n switch (matcher.tag) {\n case TAG_UNKNOWN:\n return undefined;\n case TAG_NEVER:\n return ISSUE_EXPECTED_NOTHING;\n case TAG_STRING:\n return typeof value === \"string\" ? undefined : ISSUE_EXPECTED_STRING;\n case TAG_NUMBER:\n return typeof value === \"number\" ? undefined : ISSUE_EXPECTED_NUMBER;\n case TAG_BIGINT:\n return typeof value === \"bigint\" ? undefined : ISSUE_EXPECTED_BIGINT;\n case TAG_BOOLEAN:\n return typeof value === \"boolean\" ? undefined : ISSUE_EXPECTED_BOOLEAN;\n case TAG_NULL:\n return value === null ? undefined : ISSUE_EXPECTED_NULL;\n case TAG_UNDEFINED:\n return value === undefined ? undefined : ISSUE_EXPECTED_UNDEFINED;\n case TAG_LITERAL:\n return matcher.match(value, flags);\n case TAG_OPTIONAL:\n return matcher.match(value, flags);\n case TAG_OBJECT:\n return matcher.match(value, flags);\n case TAG_ARRAY:\n return matcher.match(value, flags);\n case TAG_UNION:\n return matcher.match(value, flags);\n case TAG_SIMPLE_UNION:\n return matcher.match(value, flags);\n case TAG_TRANSFORM:\n return matcher.match(value, flags);\n default:\n return matcher.match(value, flags);\n }\n}\n\nconst MATCHER_SYMBOL: unique symbol = Symbol.for(\"@valita/internal\");\n\nabstract class AbstractType<Output = unknown> {\n abstract readonly name: string;\n\n /** @internal */\n abstract _toTerminals(func: (t: TerminalType) => void): void;\n\n /** @internal */\n abstract readonly [MATCHER_SYMBOL]: TaggedMatcher;\n\n /**\n * Return new optional type that can not be used as a standalone\n * validator. Rather, it's meant to be used as a with object validators,\n * to mark one of the object's properties as _optional_. Optional property\n * types accept both the original type, `undefined` and missing properties.\n *\n * The optional `defaultFn` function, if provided, will be called each\n * time a value that is missing or `undefined` is parsed.\n *\n * @param [defaultFn] - An optional function returning the default value.\n */\n // Use `<X extends T>() => X` instead of `() => T` to make literal\n // inference work when an optionals with defaultFn is used as a\n // ObjectType property.\n // The same could be accomplished by replacing the `| T` in the\n // output type with `NoInfer<T>`, but it's supported only from\n // TypeScript 5.4 onwards.\n abstract optional<T extends Literal>(\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n defaultFn: <X extends T>() => X,\n ): Type<Exclude<Output, undefined> | T>;\n // Support parsers like `v.array(t).optional(() => [])`\n // so that the output type is `Infer<typeof t>[]` instead of\n // `Infer<typeof t>[] | never[]`.\n abstract optional(\n defaultFn: () => Exclude<Output, undefined>,\n ): Type<Exclude<Output, undefined>>;\n abstract optional<T>(\n defaultFn: () => T,\n ): Type<Exclude<Output, undefined> | T>;\n abstract optional(): Optional<Output>;\n\n /**\n * @deprecated Instead of `.default(x)` use `.optional(() => x)`.\n */\n default<T extends Literal>(\n defaultValue: T,\n ): Type<Exclude<Output, undefined> | T>;\n default<T>(defaultValue: T): Type<Exclude<Output, undefined> | T>;\n default<T>(defaultValue: T): Type<Exclude<Output, undefined> | T> {\n const defaultResult = ok(defaultValue);\n return new TransformType(this.optional(), (v) => {\n return v === undefined ? defaultResult : undefined;\n });\n }\n\n /**\n * Derive a new validator that uses the provided predicate function to\n * perform custom validation for the source validator's output values.\n *\n * The predicate function should return `true` when the source\n * type's output value is valid, `false` otherwise. The checked value\n * itself won't get modified or replaced, and is returned as-is on\n * validation success.\n *\n * @example A validator that accepts only numeric strings.\n * ```ts\n * const numericString = v.string().assert((s) => /^\\d+$/.test(s))\n * numericString.parse(\"1\");\n * // \"1\"\n * numericString.parse(\"foo\");\n * // ValitaError: custom_error at . (validation failed)\n * ```\n *\n * You can also _refine_ the output type by passing in a\n * [type predicate](https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates).\n * Note that the type predicate must have a compatible input type.\n *\n * @example A validator with its output type refined to `Date`.\n * ```ts\n * const dateType = v.unknown().assert((v): v is Date => v instanceof Date);\n * ```\n *\n * You can also pass in a custom failure messages.\n *\n * @example A validator that rejects non-integers with a custom error.\n * ```ts\n * const integer = v.number().assert((n) => Number.isInteger(n), \"not an integer\");\n * integer.parse(1);\n * // 1\n * integer.parse(1.5);\n * // ValitaError: custom_error at . (not an integer)\n * ```\n *\n * @param func - The assertion predicate function.\n * @param [error] - A custom error for situations when the assertion\n * predicate returns `false`.\n */\n assert<T extends Output>(\n func:\n | ((v: Output, options: ParseOptions) => v is T)\n | ((v: Output, options: ParseOptions) => boolean),\n error?: CustomError,\n ): Type<T> {\n const err: IssueLeaf = { ok: false, code: \"custom_error\", error };\n return new TransformType(this, (v, flags) =>\n func(v as Output, flagsToOptions(flags)) ? undefined : err,\n );\n }\n\n /**\n * Derive a new validator that uses the provided mapping function to\n * perform custom mapping for the source validator's output values.\n *\n * The mapped value's type doesn't have to stay same, but mapping must\n * always succeed (i.e. not throw) for all values that the source validator\n * outputs.\n *\n * @example\n * ```ts\n * const stringLength = v.string().assert((s) => s.length);\n * stringLength.parse(\"Hello, World!\");\n * // 13\n * stringLength.parse(1);\n * // ValitaError: invalid_type at . (expected string)\n * ```\n *\n * @param func - The mapping function.\n */\n map<T extends Literal>(\n func: (v: Output, options: ParseOptions) => T,\n ): Type<T>;\n map<T>(func: (v: Output, options: ParseOptions) => T): Type<T>;\n map<T>(func: (v: Output, options: ParseOptions) => T): Type<T> {\n return new TransformType(this, (v, flags) => ({\n ok: true,\n value: func(v as Output, flagsToOptions(flags)),\n }));\n }\n\n /**\n * Derive a new validator that uses the provided mapping function to\n * perform custom parsing for the source validator's output values.\n *\n * Unlike `.map`, `.chain` can also be used for cases where the\n * transformation might fail. If the transformation fails, return an error\n * with an optional message with `err(...)`. If not, then return the\n * transformed value with `ok(...)`.\n *\n * @example A parser for date strings, returns `Date` objects on success.\n * ```ts\n * const DateType = v.string().chain((s) => {\n * const date = new Date(s);\n * if (isNaN(+date)) {\n * return v.err(\"invalid date\");\n * }\n * return v.ok(date);\n * });\n *\n * Date.parse(\"2022-01-01\");\n * // 2022-01-01T00:00:00.000Z\n * Date.parse(\"foo\");\n * // ValitaError: custom_error at . (invalid date)\n * ```\n *\n * @param func - The parsing function.\n */\n chain<T extends Literal>(\n func: (v: Output, options: ParseOptions) => ValitaResult<T>,\n ): Type<T>;\n chain<T>(\n func: (v: Output, options: ParseOptions) => ValitaResult<T>,\n ): Type<T>;\n chain<T>(type: Type<T>): Type<T>;\n chain(\n input: Type | ((v: Output, options: ParseOptions) => ValitaResult<unknown>),\n ): Type {\n if (typeof input === \"function\") {\n return new TransformType(this, (v, flags) => {\n const r = input(v as Output, flagsToOptions(flags));\n return r.ok\n ? r\n : (r as unknown as { _issueTree: IssueTree })._issueTree;\n });\n }\n return new TransformType(this, (v, flags) =>\n callMatcher(input[MATCHER_SYMBOL], v, flags),\n );\n }\n}\n\ntype TypeName =\n | \"unknown\"\n | \"never\"\n | \"string\"\n | \"number\"\n | \"bigint\"\n | \"boolean\"\n | \"null\"\n | \"undefined\"\n | \"literal\"\n | \"object\"\n | \"array\"\n | \"union\"\n | \"lazy\"\n | \"transform\";\n\n/**\n * A base class for all concrete validators/parsers.\n */\nabstract class Type<Output = unknown> extends AbstractType<Output> {\n abstract name: TypeName;\n\n optional<T extends Literal>(\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n defaultFn: <X extends T>() => X,\n ): Type<Exclude<Output, undefined> | T>;\n optional(\n defaultFn: () => Exclude<Output, undefined>,\n ): Type<Exclude<Output, undefined>>;\n optional<T>(defaultFn: () => T): Type<Exclude<Output, undefined> | T>;\n optional(): Optional<Output>;\n optional(defaultFn?: () => unknown): unknown {\n // If this type is already Optional there's no need to wrap it inside\n // a new Optional instance.\n const optional = new Optional(this);\n if (!defaultFn) {\n return optional;\n }\n return new TransformType(optional, (v) => {\n return v === undefined ? { ok: true, value: defaultFn() } : undefined;\n });\n }\n\n /**\n * Return new validator that accepts both the original type and `null`.\n *\n * The optional `defaultFn` function, if provided, will be called each\n * time a `null` is parsed.\n *\n * @param [defaultFn] - An optional function returning the default value.\n */\n nullable<T extends Literal>(\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n defaultFn: <X extends T>() => X,\n ): Type<Exclude<Output, null> | T>;\n nullable(defaultFn: () => Exclude<Output, null>): Type<Exclude<Output, null>>;\n nullable<T>(defaultFn: () => T): Type<Exclude<Output, null> | T>;\n nullable(): UnionType<[Type<null>, this]>;\n nullable(defaultFn?: () => unknown): unknown {\n const nullable = new SimpleUnion([null_(), this]);\n if (!defaultFn) {\n return nullable;\n }\n return new TransformType(nullable, (v) => {\n return v === null ? { ok: true, value: defaultFn() } : undefined;\n });\n }\n\n _toTerminals(func: (t: TerminalType) => void): void {\n func(this as TerminalType);\n }\n\n /**\n * Parse a value without throwing.\n */\n try(v: unknown, options?: ParseOptions): ValitaResult<Infer<this>> {\n const r = callMatcher(\n this[MATCHER_SYMBOL],\n v,\n options === undefined\n ? FLAG_FORBID_EXTRA_KEYS\n : options.mode === \"strip\"\n ? FLAG_STRIP_EXTRA_KEYS\n : options.mode === \"passthrough\"\n ? 0\n : FLAG_FORBID_EXTRA_KEYS,\n );\n return r === undefined || r.ok\n ? { ok: true, value: (r === undefined ? v : r.value) as Infer<this> }\n : new ErrImpl(r);\n }\n\n /**\n * Parse a value. Throw a ValitaError on failure.\n */\n parse(v: unknown, options?: ParseOptions): Infer<this> {\n const r = callMatcher(\n this[MATCHER_SYMBOL],\n v,\n options === undefined\n ? FLAG_FORBID_EXTRA_KEYS\n : options.mode === \"strip\"\n ? FLAG_STRIP_EXTRA_KEYS\n : options.mode === \"passthrough\"\n ? 0\n : FLAG_FORBID_EXTRA_KEYS,\n );\n if (r === undefined || r.ok) {\n return (r === undefined ? v : r.value) as Infer<this>;\n }\n throw new ValitaError(r);\n }\n}\n\nclass SimpleUnion<Options extends Type[]> extends Type<Infer<Options[number]>> {\n readonly name = \"union\";\n readonly options: Readonly<Options>;\n\n constructor(options: Readonly<Options>) {\n super();\n this.options = options;\n }\n\n get [MATCHER_SYMBOL](): TaggedMatcher {\n const options = this.options.map((o) => o[MATCHER_SYMBOL]);\n return lazyProperty(\n this,\n MATCHER_SYMBOL,\n taggedMatcher(TAG_SIMPLE_UNION, (v, flags) => {\n let issue: IssueTree = ISSUE_EXPECTED_NOTHING;\n for (const option of options) {\n const result = callMatcher(option, v, flags);\n if (result === undefined || result.ok) {\n return result;\n }\n issue = result;\n }\n return issue;\n }),\n false,\n );\n }\n\n _toTerminals(func: (t: TerminalType) => void): void {\n for (const option of this.options) {\n option._toTerminals(func);\n }\n }\n}\n\n/**\n * A validator/parser marked as \"optional\", signifying that their value can\n * be missing from the parsed object.\n *\n * As such optionals can only be used as property validators within\n * object validators.\n */\nclass Optional<Output = unknown> extends AbstractType<Output | undefined> {\n readonly name = \"optional\";\n readonly type: Type<Output>;\n\n constructor(type: Type<Output>) {\n super();\n this.type = type;\n }\n\n optional<T extends Literal>(\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n defaultFn: <X extends T>() => X,\n ): Type<Exclude<Output, undefined> | T>;\n optional(\n defaultFn: () => Exclude<Output, undefined>,\n ): Type<Exclude<Output, undefined>>;\n optional<T>(defaultFn: () => T): Type<Exclude<Output, undefined> | T>;\n optional(): Optional<Output>;\n optional(defaultFn?: () => unknown): unknown {\n if (!defaultFn) {\n return this;\n }\n return new TransformType(this, (v) => {\n return v === undefined ? { ok: true, value: defaultFn() } : undefined;\n });\n }\n\n get [MATCHER_SYMBOL](): TaggedMatcher {\n const matcher = this.type[MATCHER_SYMBOL];\n return lazyProperty(\n this,\n MATCHER_SYMBOL,\n taggedMatcher(TAG_OPTIONAL, (v, flags) =>\n v === undefined || flags & FLAG_MISSING_VALUE\n ? undefined\n : callMatcher(matcher, v, flags),\n ),\n false,\n );\n }\n\n _toTerminals(func: (t: TerminalType) => void): void {\n func(this);\n func(undefined_() as TerminalType);\n this.type._toTerminals(func);\n }\n}\n\ntype ObjectShape = Record<string, AbstractType>;\n\ntype ObjectOutput<\n T extends ObjectShape,\n R extends AbstractType | undefined,\n> = PrettyIntersection<\n {\n [K in keyof T]?: T[K] extends Optional ? Infer<T[K]> : unknown;\n } & {\n [K in keyof T as T[K] extends Optional ? never : K]: Infer<T[K]>;\n } & (R extends Type<infer I>\n ? Record<string, I>\n : R extends Optional<infer J>\n ? Partial<Record<string, J>>\n : unknown)\n>;\n\n// A bitset type, used for keeping track which known (required & optional) keys\n// the object validator has seen. Basically, when key `knownKey` is encountered,\n// the corresponding bit at index `keys.indexOf(knownKey)` gets flipped to 1.\n//\n// BitSet values initially start as a number (to avoid garbage collector churn),\n// and an empty BitSet is initialized like this:\n// let bitSet: BitSet = 0;\n//\n// As JavaScript bit arithmetic for numbers can only deal with 32-bit numbers,\n// BitSet values are upgraded to number arrays if a bits other than 0-31 need\n// to be flipped.\ntype BitSet = number | number[];\n\n// Set a bit in position `index` to one and return the updated bitset.\n// This function may or may not mutate `bits` in-place.\nfunction setBit(bits: BitSet, index: number): BitSet {\n if (typeof bits !== \"number\") {\n const idx = index >> 5;\n for (let i = bits.length; i <= idx; i++) {\n bits.push(0);\n }\n bits[idx] |= 1 << index % 32;\n return bits;\n } else if (index < 32) {\n return bits | (1 << index);\n } else {\n return setBit([bits, 0], index);\n }\n}\n\n// Get the bit at position `index`.\nfunction getBit(bits: BitSet, index: number): number {\n if (typeof bits === \"number\") {\n return index < 32 ? (bits >>> index) & 1 : 0;\n } else {\n return (bits[index >> 5] >>> index % 32) & 1;\n }\n}\n\nclass ObjectType<\n Shape extends ObjectShape = ObjectShape,\n Rest extends AbstractType | undefined = AbstractType | undefined,\n> extends Type<ObjectOutput<Shape, Rest>> {\n readonly name = \"object\";\n readonly shape: Shape;\n\n /** @internal */\n private readonly _restType: Rest;\n\n /** @internal */\n private readonly _checks?: {\n func: (v: unknown) => boolean;\n issue: IssueLeaf;\n }[];\n\n constructor(\n shape: Shape,\n restType: Rest,\n checks?: {\n func: (v: unknown) => boolean;\n issue: IssueLeaf;\n }[],\n ) {\n super();\n this.shape = shape;\n this._restType = restType;\n this._checks = checks;\n }\n\n get [MATCHER_SYMBOL](): TaggedMatcher {\n const func = createObjectMatcher(this.shape, this._restType, this._checks);\n return lazyProperty(\n this,\n MATCHER_SYMBOL,\n taggedMatcher(TAG_OBJECT, (v, flags) =>\n isObject(v) ? func(v, flags) : ISSUE_EXPECTED_OBJECT,\n ),\n false,\n );\n }\n\n check(\n func: (v: ObjectOutput<Shape, Rest>) => boolean,\n error?: CustomError,\n ): ObjectType<Shape, Rest> {\n const issue: IssueLeaf = { ok: false, code: \"custom_error\", error };\n return new ObjectType(this.shape, this._restType, [\n ...(this._checks ?? []),\n {\n func: func as (v: unknown) => boolean,\n issue,\n },\n ]);\n }\n\n rest<R extends Type>(restType: R): ObjectType<Shape, R> {\n return new ObjectType(this.shape, restType);\n }\n\n extend<S extends ObjectShape>(\n shape: S,\n ): ObjectType<Omit<Shape, keyof S> & S, Rest> {\n return new ObjectType(\n { ...this.shape, ...shape } as Omit<Shape, keyof S> & S,\n this._restType,\n );\n }\n\n pick<K extends (string & keyof Shape)[]>(\n ...keys: K\n ): ObjectType<Pick<Shape, K[number]>, undefined> {\n const shape = {} as Pick<Shape, K[number]>;\n for (const key of keys) {\n set(shape, key, this.shape[key]);\n }\n return new ObjectType(shape, undefined);\n }\n\n omit<K extends (string & keyof Shape)[]>(\n ...keys: K\n ): ObjectType<Omit<Shape, K[number]>, Rest> {\n const shape = { ...this.shape };\n for (const key of keys) {\n delete shape[key];\n }\n return new ObjectType(shape as Omit<Shape, K[number]>, this._restType);\n }\n\n partial(): ObjectType<\n { [K in keyof Shape]: Optional<Infer<Shape[K]>> },\n Rest extends AbstractType<infer I> ? Optional<I> : undefined\n > {\n const shape = {} as Record<string, unknown>;\n for (const key of Object.keys(this.shape)) {\n set(shape, key, this.shape[key].optional());\n }\n const rest = this._restType?.optional();\n return new ObjectType(\n shape as { [K in keyof Shape]: Optional<Infer<Shape[K]>> },\n rest as Rest extends AbstractType<infer I> ? Optional<I> : undefined,\n );\n }\n}\n\nfunction set(obj: Record<string, unknown>, key: string, value: unknown): void {\n if (key === \"__proto__\") {\n Object.defineProperty(obj, key, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n } else {\n obj[key] = value;\n }\n}\n\nfunction createObjectMatcher(\n shape: ObjectShape,\n rest?: AbstractType,\n checks?: {\n func: (v: unknown) => boolean;\n issue: IssueLeaf;\n }[],\n): Matcher<Record<string, unknown>> {\n type Entry = {\n key: string;\n index: number;\n matcher: TaggedMatcher;\n optional: boolean;\n missing: IssueTree;\n };\n\n const indexedEntries = Object.keys(shape).map((key, index) => {\n const type = shape[key];\n\n let optional = false as boolean;\n type._toTerminals((t) => {\n optional ||= t.name === \"optional\";\n });\n\n return {\n key,\n index,\n matcher: type[MATCHER_SYMBOL],\n optional,\n missing: prependPath(key, ISSUE_MISSING_VALUE),\n } satisfies Entry;\n });\n\n const keyedEntries = Object.create(null) as { [K in string]?: Entry };\n for (const entry of indexedEntries) {\n keyedEntries[entry.key] = entry;\n }\n\n const restMatcher = rest?.[MATCHER_SYMBOL];\n\n // A fast path for record(unknown()) without checks\n const fastPath =\n indexedEntries.length === 0 &&\n rest?.name === \"unknown\" &&\n checks === undefined;\n\n return (obj, flags) => {\n if (fastPath) {\n return undefined;\n }\n\n let output: Record<string, unknown> | undefined = undefined;\n let issues: IssueTree | undefined = undefined;\n let unrecognized: Key[] | undefined = undefined;\n let seenBits: BitSet = 0;\n let seenCount = 0;\n\n if (\n flags & (FLAG_FORBID_EXTRA_KEYS | FLAG_STRIP_EXTRA_KEYS) ||\n restMatcher !== undefined\n ) {\n for (const key in obj) {\n const value = obj[key];\n\n const entry = keyedEntries[key];\n if (entry === undefined && restMatcher === undefined) {\n if (flags & FLAG_FORBID_EXTRA_KEYS) {\n if (unrecognized === undefined) {\n unrecognized = [key];\n issues = joinIssues(issues, {\n ok: false,\n code: \"unrecognized_keys\",\n keys: unrecognized,\n });\n } else {\n unrecognized.push(key);\n }\n } else if (\n flags & FLAG_STRIP_EXTRA_KEYS &&\n issues === undefined &&\n output === undefined\n ) {\n output = {};\n for (let m = 0; m < indexedEntries.length; m++) {\n if (getBit(seenBits, m)) {\n const k = indexedEntries[m].key;\n set(output, k, obj[k]);\n }\n }\n }\n continue;\n }\n\n const r =\n entry === undefined\n ? callMatcher(restMatcher!, value, flags)\n : callMatcher(entry.matcher, value, flags);\n if (r === undefined) {\n if (output !== undefined && issues === undefined) {\n set(output, key, value);\n }\n } else if (!r.ok) {\n issues = joinIssues(issues, prependPath(key, r));\n } else if (issues === undefined) {\n if (output === undefined) {\n output = {};\n if (restMatcher === undefined) {\n for (let m = 0; m < indexedEntries.length; m++) {\n if (getBit(seenBits, m)) {\n const k = indexedEntries[m].key;\n set(output, k, obj[k]);\n }\n }\n } else {\n for (const k in obj) {\n set(output, k, obj[k]);\n }\n }\n }\n set(output, key, r.value);\n }\n\n if (entry !== undefined) {\n seenCount++;\n seenBits = setBit(seenBits, entry.index);\n }\n }\n }\n\n if (seenCount < indexedEntries.length) {\n for (let i = 0; i < indexedEntries.length; i++) {\n if (getBit(seenBits, i)) {\n continue;\n }\n const entry = indexedEntries[i];\n const value = obj[entry.key];\n\n let extraFlags = 0;\n if (value === undefined && !(entry.key in obj)) {\n if (!entry.optional) {\n issues = joinIssues(issues, entry.missing);\n continue;\n }\n extraFlags = FLAG_MISSING_VALUE;\n }\n\n const r = callMatcher(entry.matcher, value, flags | extraFlags);\n if (r === undefined) {\n if (output !== undefined && issues === undefined && !extraFlags) {\n set(output, entry.key, value);\n }\n } else if (!r.ok) {\n issues = joinIssues(issues, prependPath(entry.key, r));\n } else if (issues === undefined) {\n if (output === undefined) {\n output = {};\n if (restMatcher === undefined) {\n for (let m = 0; m < indexedEntries.length; m++) {\n if (m < i || getBit(seenBits, m)) {\n const k = indexedEntries[m].key;\n set(output, k, obj[k]);\n }\n }\n } else {\n for (const k in obj) {\n set(output, k, obj[k]);\n }\n for (let m = 0; m < i; m++) {\n if (!getBit(seenBits, m)) {\n const k = indexedEntries[m].key;\n set(output, k, obj[k]);\n }\n }\n }\n }\n set(output, entry.key, r.value);\n }\n }\n }\n\n if (issues !== undefined) {\n return issues;\n }\n\n if (checks !== undefined) {\n for (const { func, issue } of checks) {\n if (!func(output ?? obj)) {\n return issue;\n }\n }\n }\n return output && { ok: true, value: output };\n };\n}\n\ntype TupleOutput<T extends Type[]> = {\n [K in keyof T]: T[K] extends Type<infer U> ? U : never;\n};\n\ntype ArrayOutput<\n Head extends Type[],\n Rest extends Type | undefined,\n Tail extends Type[],\n> = [\n ...TupleOutput<Head>,\n ...(Rest extends Type ? Infer<Rest>[] : []),\n ...TupleOutput<Tail>,\n];\n\nclass ArrayOrTupleType<\n Head extends Type[] = Type[],\n Rest extends Type | undefined = Type | undefined,\n Tail extends Type[] = Type[],\n> extends Type<ArrayOutput<Head, Rest, Tail>> {\n readonly name = \"array\";\n readonly _prefix: Head;\n readonly _rest: Rest | undefined;\n readonly _suffix: Tail;\n\n constructor(prefix: Head, rest: Rest | undefined, suffix: Tail) {\n super();\n this._prefix = prefix;\n this._rest = rest;\n this._suffix = suffix;\n }\n\n get [MATCHER_SYMBOL](): TaggedMatcher {\n const prefix = this._prefix.map((t) => t[MATCHER_SYMBOL]);\n const suffix = this._suffix.map((t) => t[MATCHER_SYMBOL]);\n const rest =\n this._rest?.[MATCHER_SYMBOL] ??\n taggedMatcher(1, () => ISSUE_MISSING_VALUE);\n\n const minLength = prefix.length + suffix.length;\n const maxLength = this._rest ? Infinity : minLength;\n const invalidLength: IssueLeaf = {\n ok: false,\n code: \"invalid_length\",\n minLength,\n maxLength: maxLength === Infinity ? undefined : maxLength,\n };\n\n return lazyProperty(\n this,\n MATCHER_SYMBOL,\n taggedMatcher(TAG_ARRAY, (arr, flags) => {\n if (!Array.isArray(arr)) {\n return ISSUE_EXPECTED_ARRAY;\n }\n\n const length = arr.length;\n if (length < minLength || length > maxLength) {\n return invalidLength;\n }\n\n const headEnd = prefix.length;\n const tailStart = arr.length - suffix.length;\n\n let issueTree: IssueTree | undefined = undefined;\n let output: unknown[] = arr;\n for (let i = 0; i < arr.length; i++) {\n const entry =\n i < headEnd\n ? prefix[i]\n : i >= tailStart\n ? suffix[i - tailStart]\n : rest;\n const r = callMatcher(entry, arr[i], flags);\n if (r !== undefined) {\n if (r.ok) {\n if (output === arr) {\n output = arr.slice();\n }\n output[i] = r.value;\n } else {\n issueTree = joinIssues(issueTree, prependPath(i, r));\n }\n }\n }\n if (issueTree) {\n return issueTree;\n } else if (arr === output) {\n return undefined;\n } else {\n return { ok: true, value: output };\n }\n }),\n false,\n );\n }\n\n concat(type: ArrayType | TupleType | VariadicTupleType): ArrayOrTupleType {\n if (this._rest) {\n if (type._rest) {\n throw new TypeError(\"can not concatenate two variadic types\");\n }\n return new ArrayOrTupleType(this._prefix, this._rest, [\n ...this._suffix,\n ...type._prefix,\n ...type._suffix,\n ]);\n } else if (type._rest) {\n return new ArrayOrTupleType(\n [...this._prefix, ...this._suffix, ...type._prefix],\n type._rest,\n type._suffix,\n );\n } else {\n return new ArrayOrTupleType(\n [...this._prefix, ...this._suffix, ...type._prefix, ...type._suffix],\n type._rest,\n type._suffix,\n );\n }\n }\n}\n\n/**\n * A validator for arbitrary-length array types like `T[]`.\n */\ninterface ArrayType<Element extends Type = Type>\n extends Type<Infer<Element>[]> {\n readonly name: \"array\";\n\n /** @internal */\n readonly _prefix: Type[];\n\n /** @internal */\n readonly _rest: Element;\n\n /** @internal */\n readonly _suffix: Type[];\n\n concat<Suffix extends Type[]>(\n type: TupleType<Suffix>,\n ): VariadicTupleType<[], Element, Suffix>;\n}\n\n/**\n * A validator for a fixed-length tuple type like `[]`, `[T1, T2]`\n * or `[T1, T2, ..., Tn]`.\n */\ninterface TupleType<Elements extends Type[] = Type[]>\n extends Type<TupleOutput<Elements>> {\n readonly name: \"array\";\n\n /** @internal */\n readonly _prefix: Elements;\n\n /** @internal */\n readonly _rest: undefined;\n\n /** @internal */\n readonly _suffix: Type[];\n\n concat<ConcatPrefix extends Type[]>(\n type: TupleType<ConcatPrefix>,\n ): TupleType<[...Elements, ...ConcatPrefix]>;\n concat<\n ConcatPrefix extends Type[],\n Rest extends Type | undefined,\n Suffix extends Type[],\n >(\n type: VariadicTupleType<ConcatPrefix, Rest, Suffix>,\n ): VariadicTupleType<[...Elements, ...ConcatPrefix], Rest, Suffix>;\n concat<Element extends Type>(\n type: ArrayType<Element>,\n ): VariadicTupleType<Elements, Element, []>;\n}\n\n/**\n * A validator for a variadic tuple type like `[T1, ...T[], Tn]`,\n * `[...T[], Tn-1, Tn]` or `[T1, T2, ...T[]]`.\n */\ninterface VariadicTupleType<\n Prefix extends Type[] = Type[],\n Rest extends Type | undefined = undefined,\n Suffix extends Type[] = Type[],\n> extends Type<ArrayOutput<Prefix, Rest, Suffix>> {\n readonly name: \"array\";\n\n /** @internal */\n readonly _prefix: Prefix;\n\n /** @internal */\n readonly _rest: Rest;\n\n /** @internal */\n readonly _suffix: Suffix;\n\n concat<OtherPrefix extends Type[]>(\n type: TupleType<OtherPrefix>,\n ): VariadicTupleType<Prefix, Rest, [...Suffix, ...OtherPrefix]>;\n}\n\nfunction toInputType(v: unknown): InputType {\n const type = typeof v;\n if (type !== \"object\") {\n return type as InputType;\n } else if (v === null) {\n return \"null\";\n } else if (Array.isArray(v)) {\n return \"array\";\n } else {\n return type;\n }\n}\n\nfunction dedup<T>(arr: T[]): T[] {\n return [...new Set(arr)];\n}\n\nfunction groupTerminals(\n terminals: { root: AbstractType; terminal: TerminalType }[],\n): {\n types: Map<InputType, AbstractType[]>;\n literals: Map<unknown, AbstractType[]>;\n unknowns: AbstractType[];\n optionals: AbstractType[];\n expectedTypes: InputType[];\n} {\n const order = new Map<AbstractType, number>();\n const literals = new Map<unknown, AbstractType[]>();\n const types = new Map<InputType, AbstractType[]>();\n const unknowns = [] as AbstractType[];\n const optionals = [] as AbstractType[];\n const expectedTypes = [] as InputType[];\n for (const { root, terminal } of terminals) {\n order.set(root, order.get(root) ?? order.size);\n\n if (terminal.name === \"never\") {\n // skip\n } else if (terminal.name === \"optional\") {\n optionals.push(root);\n } else if (terminal.name === \"unknown\") {\n unknowns.push(root);\n } else if (terminal.name === \"literal\") {\n const roots = literals.get(terminal.value) ?? [];\n roots.push(root);\n literals.set(terminal.value, roots);\n expectedTypes.push(toInputType(terminal.value));\n } else {\n const roots = types.get(terminal.name) ?? [];\n roots.push(root);\n types.set(terminal.name, roots);\n expectedTypes.push(terminal.name);\n }\n }\n\n const byOrder = (a: AbstractType, b: AbstractType): number => {\n return (order.get(a) ?? 0) - (order.get(b) ?? 0);\n };\n\n for (const [value, roots] of literals) {\n const options = types.get(toInputType(value));\n if (options) {\n options.push(...roots);\n literals.delete(value);\n } else {\n literals.set(value, dedup(roots.concat(unknowns)).sort(byOrder));\n }\n }\n\n for (const [type, roots] of types) {\n types.set(type, dedup(roots.concat(unknowns)).sort(byOrder));\n }\n\n return {\n types,\n literals,\n unknowns: dedup(unknowns).sort(byOrder),\n optionals: dedup(optionals).sort(byOrder),\n expectedTypes: dedup(expectedTypes),\n };\n}\n\nfunction createObjectKeyMatcher(\n objects: { root: AbstractType; terminal: ObjectType }[],\n key: string,\n): Matcher<Record<string, unknown>> | undefined {\n const list: { root: AbstractType; terminal: TerminalType }[] = [];\n for (const { root, terminal } of objects) {\n terminal.shape[key]._toTerminals((t) => list.push({ root, terminal: t }));\n }\n\n const { types, literals, optionals, unknowns, expectedTypes } =\n groupTerminals(list);\n if (unknowns.length > 0 || optionals.length > 1) {\n return undefined;\n }\n for (const roots of literals.values()) {\n if (roots.length > 1) {\n return undefined;\n }\n }\n for (const roots of types.values()) {\n if (roots.length > 1) {\n return undefined;\n }\n }\n\n const missingValue = prependPath(key, ISSUE_MISSING_VALUE);\n const issue = prependPath(\n key,\n types.size === 0\n ? {\n ok: false,\n code: \"invalid_literal\",\n expected: [...literals.keys()] as Literal[],\n }\n : {\n ok: false,\n code: \"invalid_type\",\n expected: expectedTypes,\n },\n );\n\n const byLiteral =\n literals.size > 0 ? new Map<unknown, TaggedMatcher>() : undefined;\n if (byLiteral) {\n for (const [literal, options] of literals) {\n byLiteral.set(literal, options[0][MATCHER_SYMBOL]);\n }\n }\n\n const byType =\n types.size > 0 ? ({} as Record<string, TaggedMatcher>) : undefined;\n if (byType) {\n for (const [type, options] of types) {\n byType[type] = options[0][MATCHER_SYMBOL];\n }\n }\n\n const optional = optionals[0]?.[MATCHER_SYMBOL] as TaggedMatcher | undefined;\n return (obj, flags) => {\n const value = obj[key];\n if (value === undefined && !(key in obj)) {\n return optional === undefined\n ? missingValue\n : callMatcher(optional, obj, flags);\n }\n const option = byType?.[toInputType(value)] ?? byLiteral?.get(value);\n return option ? callMatcher(option, obj, flags) : issue;\n };\n}\n\nfunction createUnionObjectMatcher(\n terminals: { root: AbstractType; terminal: TerminalType }[],\n): Matcher<Record<string, unknown>> | undefined {\n const objects: { root: AbstractType; terminal: ObjectType }[] = [];\n const keyCounts = new Map<string, number>();\n\n for (const { root, terminal } of terminals) {\n if (terminal.name === \"unknown\") {\n return undefined;\n }\n\n if (terminal.name === \"object\") {\n for (const key in terminal.shape) {\n keyCounts.set(key, (keyCounts.get(key) ?? 0) + 1);\n }\n objects.push({ root, terminal });\n }\n }\n\n if (objects.length < 2) {\n return undefined;\n }\n\n for (const [key, count] of keyCounts) {\n if (count === objects.length) {\n const matcher = createObjectKeyMatcher(objects, key);\n if (matcher) {\n return matcher;\n }\n }\n }\n return undefined;\n}\n\nfunction createUnionBaseMatcher(\n terminals: { root: AbstractType; terminal: TerminalType }[],\n): Matcher {\n const { expectedTypes, literals, types, unknowns, optionals } =\n groupTerminals(terminals);\n\n const issue: IssueLeaf =\n types.size === 0 && unknowns.length === 0\n ? {\n ok: false,\n code: \"invalid_literal\",\n expected: [...literals.keys()] as Literal[],\n }\n : {\n ok: false,\n code: \"invalid_type\",\n expected: expectedTypes,\n };\n\n const byLiteral =\n literals.size > 0 ? new Map<unknown, TaggedMatcher[]>() : undefined;\n if (byLiteral) {\n for (const [literal, options] of literals) {\n byLiteral.set(\n literal,\n options.map((t) => t[MATCHER_SYMBOL]),\n );\n }\n }\n\n const byType =\n types.size > 0 ? ({} as Record<string, TaggedMatcher[]>) : undefined;\n if (byType) {\n for (const [type, options] of types) {\n byType[type] = options.map((t) => t[MATCHER_SYMBOL]);\n }\n }\n\n const optionalMatchers = optionals.map((t) => t[MATCHER_SYMBOL]);\n const unknownMatchers = unknowns.map((t) => t[MATCHER_SYMBOL]);\n return (value: unknown, flags: number) => {\n const options =\n flags & FLAG_MISSING_VALUE\n ? optionalMatchers\n : (byType?.[toInputType(value)] ??\n byLiteral?.get(value) ??\n unknownMatchers);\n\n let count = 0;\n let issueTree: IssueTree = issue;\n for (let i = 0; i < options.length; i++) {\n const r = callMatcher(options[i], value, flags);\n if (r === undefined || r.ok) {\n return r;\n }\n issueTree = count > 0 ? joinIssues(issueTree, r) : r;\n count++;\n }\n if (count > 1) {\n return { ok: false, code: \"invalid_union\", tree: issueTree };\n }\n return issueTree;\n };\n}\n\nclass UnionType<T extends Type[] = Type[]> extends Type<Infer<T[number]>> {\n readonly name = \"union\";\n readonly options: Readonly<T>;\n\n constructor(options: Readonly<T>) {\n super();\n this.options = options;\n }\n\n _toTerminals(func: (t: TerminalType) => void): void {\n for (const option of this.options) {\n option._toTerminals(func);\n }\n }\n\n get [MATCHER_SYMBOL](): TaggedMatcher {\n const flattened: { root: AbstractType; terminal: TerminalType }[] = [];\n for (const option of this.options) {\n option._toTerminals((terminal) => {\n flattened.push({ root: option, terminal });\n });\n }\n const base = createUnionBaseMatcher(flattened);\n const object = createUnionObjectMatcher(flattened);\n return lazyProperty(\n this,\n MATCHER_SYMBOL,\n taggedMatcher(TAG_UNION, (v, f) =>\n object !== undefined && isObject(v) ? object(v, f) : base(v, f),\n ),\n false,\n );\n }\n}\n\ntype TransformFunc = (value: unknown, flags: number) => MatcherResult;\n\nconst STRICT = Object.freeze({ mode: \"strict\" }) as ParseOptions;\nconst STRIP = Object.freeze({ mode: \"strip\" }) as ParseOptions;\nconst PASSTHROUGH = Object.freeze({ mode: \"passthrough\" }) as ParseOptions;\n\nfunction flagsToOptions(flags: number): ParseOptions {\n return flags & FLAG_FORBID_EXTRA_KEYS\n ? STRICT\n : flags & FLAG_STRIP_EXTRA_KEYS\n ? STRIP\n : PASSTHROUGH;\n}\n\nclass TransformType<Output> extends Type<Output> {\n readonly name = \"transform\";\n\n /** @internal */\n protected readonly _transformed: AbstractType;\n\n /** @internal */\n protected readonly _transform: TransformFunc;\n\n constructor(transformed: AbstractType, transform: TransformFunc) {\n super();\n this._transformed = transformed;\n this._transform = transform;\n }\n\n get [MATCHER_SYMBOL](): TaggedMatcher {\n const chain: TransformFunc[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let next: AbstractType = this;\n while (next instanceof TransformType) {\n chain.push(next._transform);\n next = next._transformed;\n }\n chain.reverse();\n\n const matcher = next[MATCHER_SYMBOL];\n const undef = ok(undefined);\n\n return lazyProperty(\n this,\n MATCHER_SYMBOL,\n taggedMatcher(TAG_TRANSFORM, (v, flags) => {\n let result = callMatcher(matcher, v, flags);\n if (result !== undefined && !result.ok) {\n return result;\n }\n\n let current: unknown;\n if (result !== undefined) {\n current = result.value;\n } else if (flags & FLAG_MISSING_VALUE) {\n current = undefined;\n result = undef;\n } else {\n current = v;\n }\n\n for (let i = 0; i < chain.length; i++) {\n const r = chain[i](current, flags);\n if (r !== undefined) {\n if (!r.ok) {\n return r;\n }\n current = r.value;\n result = r;\n }\n }\n return result;\n }),\n false,\n );\n }\n\n _toTerminals(func: (t: TerminalType) => void): void {\n this._transformed._toTerminals(func);\n }\n}\n\nclass LazyType<T> extends Type<T> {\n readonly name = \"lazy\";\n\n /** @internal */\n private _recursing = false;\n\n /** @internal */\n private readonly _definer: () => Type<T>;\n\n constructor(definer: () => Type<T>) {\n super();\n this._definer = definer;\n }\n\n get type() {\n return lazyProperty(this, \"type\", this._definer(), true);\n }\n\n get [MATCHER_SYMBOL]() {\n const matcher = taggedMatcher(TAG_OTHER, (value, flags) => {\n const typeMatcher = this.type[MATCHER_SYMBOL];\n matcher.tag = typeMatcher.tag;\n matcher.match = typeMatcher.match;\n lazyProperty(this, MATCHER_SYMBOL, typeMatcher, false);\n return callMatcher(typeMatcher, value, flags);\n });\n return matcher;\n }\n\n _toTerminals(func: (t: TerminalType) => void): void {\n if (!this._recursing) {\n this._recursing = true;\n try {\n this.type._toTerminals(func);\n } finally {\n this._recursing = false;\n }\n }\n }\n}\n\nfunction singleton<Output>(\n name: TypeName,\n tag: number,\n match: (value: unknown, flags: number) => MatcherResult,\n): () => Type<Output> {\n const value = taggedMatcher(tag, match);\n\n class SimpleType extends Type<Output> {\n readonly name: TypeName;\n readonly [MATCHER_SYMBOL]: TaggedMatcher;\n\n constructor() {\n super();\n this.name = name;\n this[MATCHER_SYMBOL] = value;\n }\n }\n\n const instance = new SimpleType();\n return /*#__NO_SIDE_EFFECTS__*/ () => instance;\n}\n\n/**\n * Create a validator that matches any value,\n * analogous to the TypeScript type `unknown`.\n */\nexport const unknown: () => Type = /*#__PURE__*/ singleton<unknown>(\n \"unknown\",\n TAG_UNKNOWN,\n () => undefined,\n);\n\n/**\n * Create a validator that never matches any value,\n * analogous to the TypeScript type `never`.\n */\nexport const never: () => Type<never> = /*#__PURE__*/ singleton<never>(\n \"never\",\n TAG_NEVER,\n () => ISSUE_EXPECTED_NOTHING,\n);\n\n/**\n * Create a validator that matches any string value.\n */\nexport const string: () => Type<string> = /*#__PURE__*/ singleton<string>(\n \"string\",\n TAG_STRING,\n (v) => (typeof v === \"string\" ? undefined : ISSUE_EXPECTED_STRING),\n);\n\n/**\n * Create a validator that matches any number value.\n */\nexport const number: () => Type<number> = /*#__PURE__*/ singleton<number>(\n \"number\",\n TAG_NUMBER,\n (v) => (typeof v === \"number\" ? undefined : ISSUE_EXPECTED_NUMBER),\n);\n\n/**\n * Create a validator that matches any bigint value.\n */\nexport const bigint: () => Type<bigint> = /*#__PURE__*/ singleton<bigint>(\n \"bigint\",\n TAG_BIGINT,\n (v) => (typeof v === \"bigint\" ? undefined : ISSUE_EXPECTED_BIGINT),\n);\n\n/**\n * Create a validator that matches any boolean value.\n */\nexport const boolean: () => Type<boolean> = /*#__PURE__*/ singleton<boolean>(\n \"boolean\",\n TAG_BOOLEAN,\n (v) => (typeof v === \"boolean\" ? undefined : ISSUE_EXPECTED_BOOLEAN),\n);\n\n/**\n * Create a validator that matches `null`.\n */\nconst null_: () => Type<null> = /*#__PURE__*/ singleton<null>(\n \"null\",\n TAG_NULL,\n (v) => (v === null ? undefined : ISSUE_EXPECTED_NULL),\n);\nexport { null_ as null };\n\n/**\n * Create a validator that matches `undefined`.\n */\nconst undefined_: () => Type<undefined> = /*#__PURE__*/ singleton<undefined>(\n \"undefined\",\n TAG_UNDEFINED,\n (v) => (v === undefined ? undefined : ISSUE_EXPECTED_UNDEFINED),\n);\nexport { undefined_ as undefined };\n\nclass LiteralType<Out extends Literal = Literal> extends Type<Out> {\n readonly name = \"literal\";\n readonly [MATCHER_SYMBOL]: TaggedMatcher;\n readonly value: Out;\n\n constructor(value: Out) {\n super();\n\n const issue: IssueLeaf = {\n ok: false,\n code: \"invalid_literal\",\n expected: [value],\n };\n this[MATCHER_SYMBOL] = taggedMatcher(TAG_LITERAL, (v) =>\n v === value ? undefined : issue,\n );\n this.value = value;\n }\n}\n\n/**\n * Create a validator for a specific string, number, bigint or boolean value.\n */\nexport const literal = <T extends Literal>(value: T): Type<T> => {\n return /*#__PURE__*/ new LiteralType(value);\n};\n\n/**\n * Create a validator for an object type.\n */\nexport const object = <T extends Record<string, AbstractType>>(\n obj: T,\n): ObjectType<T, undefined> => {\n return /*#__PURE__*/ new ObjectType(obj, undefined);\n};\n\n/**\n * Create a validator for a record type `Record<string, T>`,\n * where `T` is the output type of the given subvalidator.\n */\nexport const record = <T extends Type>(\n valueType?: T,\n): Type<Record<string, Infer<T>>> => {\n return /*#__PURE__*/ new ObjectType({}, valueType ?? unknown()) as Type<\n Record<string, Infer<T>>\n >;\n};\n\n/**\n * Create a validator for an array type `T[]`,\n * where `T` is the output type of the given subvalidator.\n */\nexport const array = <T extends Type>(item?: T): ArrayType<T> => {\n return /*#__PURE__*/ new ArrayOrTupleType(\n [],\n item ?? unknown(),\n [],\n ) as unknown as ArrayType<T>;\n};\n\n/**\n * Create a validator for an array type `[T1, T2, ..., Tn]`,\n * where `T1`, `T2`, ..., `Tn` are the output types of the given subvalidators.\n */\nexport const tuple = <T extends [] | [Type, ...Type[]]>(\n items: T,\n): TupleType<T> => {\n return /*#__PURE__*/ new ArrayOrTupleType(\n items,\n undefined,\n [],\n ) as unknown as TupleType<T>;\n};\n\n/**\n * Create a validator that matches any type `T1 | T2 | ... | Tn`,\n * where `T1`, `T2`, ..., `Tn` are the output types of the given subvalidators.\n *\n * This is analogous to how TypeScript's union types are constructed.\n */\nexport const union = <T extends Type[]>(...options: T): UnionType<T> => {\n return /*#__PURE__*/ new UnionType(options) as UnionType<T>;\n};\n\n/**\n * Create a validator that can reference itself, directly or indirectly.\n *\n * In most cases an explicit type annotation is also needed, as TypeScript\n * cannot infer return types of recursive functions.\n *\n * @example\n * ```ts\n * import * as v from \"@badrap/valita\";\n *\n * type T = string | T[];\n * const type: v.Type<T> = v.lazy(() => v.union(v.string(), v.array(type)));\n * ```\n */\nexport const lazy = <T>(definer: () => Type<T>): Type<T> => {\n return new LazyType(definer);\n};\n\ntype TerminalType =\n | (Type & {\n name:\n | \"unknown\"\n | \"never\"\n | \"string\"\n | \"number\"\n | \"bigint\"\n | \"boolean\"\n | \"null\"\n | \"undefined\";\n })\n | LiteralType\n | ObjectType\n | ArrayOrTupleType\n | Optional;\n\nexport type { Type, Optional };\nexport type { ObjectType, ArrayType, TupleType, VariadicTupleType, UnionType };\n","import { configureOAuth } from \"@atcute/oauth-browser-client\";\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} from \"@atcute/oauth-browser-client\";\n\nexport { OAuthUserAgent };\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 redirect_uri =\n (globalThis.location.origin + globalThis.location.pathname +\n globalThis.location.search).replace(\n \"://localhost\",\n \"://127.0.0.1\",\n );\n\nconfigureOAuth({\n metadata: {\n client_id: redirect_uri.startsWith(\"http://127.0.0.1\")\n ? `http://localhost/?redirect_uri=${\n encodeURIComponent(redirect_uri)\n }&scope=${encodeURIComponent(SCOPE)}`\n : /** @type {any} */ (import.meta).env?.ATPROTO_CLIENT_ID ??\n \"https://elements.diffuse.sh/oauth-client-metadata.json\",\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 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 { allowStale: true },\n );\n } catch (err) {\n console.warn(err);\n localStorage.removeItem(STORAGE_KEY);\n return null;\n }\n }\n\n return null;\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","export { fromBase16, toBase16 } from '#bases/base16';\nexport {\n\tfromBase64,\n\tfromBase64Pad,\n\tfromBase64Url,\n\tfromBase64UrlPad,\n\ttoBase64,\n\ttoBase64Pad,\n\ttoBase64Url,\n\ttoBase64UrlPad,\n} from '#bases/base64';\n\nexport { fromBase32, toBase32 } from './bases/base32.ts';\nexport { fromBase58Btc, toBase58Btc } from './bases/base58.ts';\n","import { fromBase16 as fromBase16Native, toBase16 as toBase16Native } from './base16-web-native.ts';\nimport { fromBase16 as fromBase16Polyfill, toBase16 as toBase16Polyfill } from './base16-web-polyfill.ts';\n\nconst HAS_NATIVE_SUPPORT = 'fromHex' in Uint8Array;\n\nexport const fromBase16 = !HAS_NATIVE_SUPPORT ? fromBase16Polyfill : fromBase16Native;\nexport const toBase16 = !HAS_NATIVE_SUPPORT ? toBase16Polyfill : toBase16Native;\n","export const fromBase16 = (str: string): Uint8Array<ArrayBuffer> => {\n\treturn Uint8Array.fromHex(str) as Uint8Array<ArrayBuffer>;\n};\n\nexport const toBase16 = (bytes: Uint8Array): string => {\n\treturn bytes.toHex();\n};\n","// remove after September 2027\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array/toHex\n\nimport { createRfc4648Decode, createRfc4648Encode } from '../utils.ts';\n\nconst BASE16_CHARSET = '0123456789abcdef';\n\nexport const fromBase16: (str: string) => Uint8Array<ArrayBuffer> =\n\t/*#__PURE__*/ createRfc4648Decode(BASE16_CHARSET, 4, false);\nexport const toBase16: (bytes: Uint8Array) => string =\n\t/*#__PURE__*/ createRfc4648Encode(BASE16_CHARSET, 4, false);\n","import { alloc, allocUnsafe } from '@atcute/uint8array';\n\nexport const createRfc4648Encode = (alphabet: string, bitsPerChar: number, pad: boolean) => {\n\treturn (bytes: Uint8Array): string => {\n\t\tconst mask = (1 << bitsPerChar) - 1;\n\t\tlet str = '';\n\n\t\tlet bits = 0; // Number of bits currently in the buffer\n\t\tlet buffer = 0; // Bits waiting to be written out, MSB first\n\t\tfor (let i = 0; i < bytes.length; ++i) {\n\t\t\t// Slurp data into the buffer:\n\t\t\tbuffer = (buffer << 8) | bytes[i];\n\t\t\tbits += 8;\n\n\t\t\t// Write out as much as we can:\n\t\t\twhile (bits > bitsPerChar) {\n\t\t\t\tbits -= bitsPerChar;\n\t\t\t\tstr += alphabet[mask & (buffer >> bits)];\n\t\t\t}\n\t\t}\n\n\t\t// Partial character:\n\t\tif (bits !== 0) {\n\t\t\tstr += alphabet[mask & (buffer << (bitsPerChar - bits))];\n\t\t}\n\n\t\t// Add padding characters until we hit a byte boundary:\n\t\tif (pad) {\n\t\t\twhile (((str.length * bitsPerChar) & 7) !== 0) {\n\t\t\t\tstr += '=';\n\t\t\t}\n\t\t}\n\n\t\treturn str;\n\t};\n};\n\nexport const createRfc4648Decode = (alphabet: string, bitsPerChar: number, pad: boolean) => {\n\t// Build the character lookup table:\n\tconst codes: Record<string, number> = {};\n\tfor (let i = 0; i < alphabet.length; ++i) {\n\t\tcodes[alphabet[i]] = i;\n\t}\n\n\treturn (str: string): Uint8Array<ArrayBuffer> => {\n\t\t// Count the padding bytes:\n\t\tlet end = str.length;\n\t\twhile (pad && str[end - 1] === '=') {\n\t\t\t--end;\n\t\t}\n\n\t\t// Allocate the output:\n\t\tconst bytes = allocUnsafe(((end * bitsPerChar) / 8) | 0);\n\n\t\t// Parse the data:\n\t\tlet bits = 0; // Number of bits currently in the buffer\n\t\tlet buffer = 0; // Bits waiting to be written out, MSB first\n\t\tlet written = 0; // Next byte to write\n\t\tfor (let i = 0; i < end; ++i) {\n\t\t\t// Read one character from the string:\n\t\t\tconst value = codes[str[i]];\n\t\t\tif (value === undefined) {\n\t\t\t\tthrow new SyntaxError(`invalid base string`);\n\t\t\t}\n\n\t\t\t// Append the bits to the buffer:\n\t\t\tbuffer = (buffer << bitsPerChar) | value;\n\t\t\tbits += bitsPerChar;\n\n\t\t\t// Write out some bits if the buffer has a byte's worth:\n\t\t\tif (bits >= 8) {\n\t\t\t\tbits -= 8;\n\t\t\t\tbytes[written++] = 0xff & (buffer >> bits);\n\t\t\t}\n\t\t}\n\n\t\t// Verify that we have received just enough bits:\n\t\tif (bits >= bitsPerChar || (0xff & (buffer << (8 - bits))) !== 0) {\n\t\t\tthrow new SyntaxError('unexpected end of data');\n\t\t}\n\n\t\treturn bytes;\n\t};\n};\n\nexport const createBtcBaseEncode = (alphabet: string) => {\n\tif (alphabet.length >= 255) {\n\t\tthrow new RangeError(`alphabet too long`);\n\t}\n\n\tconst BASE = alphabet.length;\n\tconst LEADER = alphabet.charAt(0);\n\tconst iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up\n\n\treturn (source: Uint8Array): string => {\n\t\tif (source.length === 0) {\n\t\t\treturn '';\n\t\t}\n\n\t\t// Skip & count leading zeroes.\n\t\tlet zeroes = 0;\n\t\tlet length = 0;\n\t\tlet pbegin = 0;\n\t\tconst pend = source.length;\n\t\twhile (pbegin !== pend && source[pbegin] === 0) {\n\t\t\tpbegin++;\n\t\t\tzeroes++;\n\t\t}\n\n\t\t// Allocate enough space in big-endian base-N representation.\n\t\tconst dataLen = pend - pbegin;\n\t\tconst size = (dataLen * iFACTOR + 1) >>> 0;\n\t\tconst bN = alloc(size);\n\n\t\t// Process 3 source bytes at a time where possible.\n\t\t// multiplier: 256^3 = 16777216. max carry: 16777216 * (BASE-1) + (BASE-1).\n\t\t// for BASE=58: 16777216 * 57 = 956301312, well within 2^32 - 1.\n\t\t{\n\t\t\tconst rem = dataLen % 3;\n\t\t\tconst tripleEnd = pend - rem;\n\n\t\t\twhile (pbegin < tripleEnd) {\n\t\t\t\tlet carry = (source[pbegin] << 16) | (source[pbegin + 1] << 8) | source[pbegin + 2];\n\n\t\t\t\tlet i = 0;\n\t\t\t\tfor (let it1 = size - 1; (carry !== 0 || i < length) && it1 !== -1; it1--, i++) {\n\t\t\t\t\tcarry = carry + 16777216 * bN[it1];\n\t\t\t\t\tbN[it1] = (carry % BASE) | 0;\n\t\t\t\t\tcarry = (carry / BASE) | 0;\n\t\t\t\t}\n\n\t\t\t\tlength = i;\n\t\t\t\tpbegin += 3;\n\t\t\t}\n\t\t}\n\n\t\t// Process remaining 0-2 bytes one at a time.\n\t\twhile (pbegin !== pend) {\n\t\t\tlet carry = source[pbegin];\n\n\t\t\tlet i = 0;\n\t\t\tfor (let it1 = size - 1; (carry !== 0 || i < length) && it1 !== -1; it1--, i++) {\n\t\t\t\tcarry = carry + 256 * bN[it1];\n\t\t\t\tbN[it1] = (carry % BASE) | 0;\n\t\t\t\tcarry = (carry / BASE) | 0;\n\t\t\t}\n\n\t\t\tlength = i;\n\t\t\tpbegin++;\n\t\t}\n\n\t\t// Skip leading zeroes in base-N result.\n\t\tlet it2 = size - length;\n\t\twhile (it2 !== size && bN[it2] === 0) {\n\t\t\tit2++;\n\t\t}\n\n\t\t// Translate the result into a string.\n\t\tlet str = LEADER.repeat(zeroes);\n\t\tfor (; it2 < size; ++it2) {\n\t\t\tstr += alphabet.charAt(bN[it2]);\n\t\t}\n\n\t\treturn str;\n\t};\n};\n\nexport const createBtcBaseDecode = (alphabet: string) => {\n\tif (alphabet.length >= 255) {\n\t\tthrow new RangeError(`alphabet too long`);\n\t}\n\n\tconst BASE_MAP = new Uint8Array(128).fill(255);\n\tfor (let i = 0; i < alphabet.length; i++) {\n\t\tconst xc = alphabet.charCodeAt(i);\n\n\t\tif (xc >= 128) {\n\t\t\tthrow new RangeError(`non-ASCII character in alphabet`);\n\t\t}\n\t\tif (BASE_MAP[xc] !== 255) {\n\t\t\tthrow new RangeError(`${alphabet[i]} is ambiguous`);\n\t\t}\n\n\t\tBASE_MAP[xc] = i;\n\t}\n\n\tconst BASE = alphabet.length;\n\tconst BASE2 = BASE * BASE;\n\tconst LEADER = alphabet.charAt(0);\n\tconst FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up\n\n\treturn (source: string): Uint8Array<ArrayBuffer> => {\n\t\tif (source.length === 0) {\n\t\t\treturn allocUnsafe(0);\n\t\t}\n\n\t\t// Skip and count leading leader characters.\n\t\tlet psz = 0;\n\t\tlet zeroes = 0;\n\t\tlet length = 0;\n\n\t\twhile (source[psz] === LEADER) {\n\t\t\tzeroes++;\n\t\t\tpsz++;\n\t\t}\n\n\t\t// Allocate enough space in big-endian base256 representation.\n\t\tconst remaining = source.length - psz;\n\t\tconst size = (remaining * FACTOR + 1) >>> 0;\n\t\tconst b256 = alloc(size);\n\n\t\t// Process 2 source characters at a time where possible.\n\t\t// combined value: c0 * BASE + c1, multiplier: BASE^2.\n\t\t// max carry: BASE^2 * 255 + (BASE^2 - 1).\n\t\t// for BASE=58: 3364 * 255 + 3363 = 861183, well within safe integer range.\n\t\t{\n\t\t\tconst rem = remaining & 1;\n\t\t\tconst pairEnd = source.length - rem;\n\n\t\t\twhile (psz < pairEnd) {\n\t\t\t\tconst c0 = BASE_MAP[source.charCodeAt(psz)];\n\t\t\t\tconst c1 = BASE_MAP[source.charCodeAt(psz + 1)];\n\n\t\t\t\tif (c0 === 255 || c1 === 255) {\n\t\t\t\t\tthrow new Error(`invalid string`);\n\t\t\t\t}\n\n\t\t\t\tlet carry = c0 * BASE + c1;\n\n\t\t\t\tlet i = 0;\n\t\t\t\tfor (let it3 = size - 1; (carry !== 0 || i < length) && it3 !== -1; it3--, i++) {\n\t\t\t\t\tcarry += BASE2 * b256[it3];\n\t\t\t\t\tb256[it3] = carry & 0xff;\n\t\t\t\t\tcarry = (carry - (carry & 0xff)) / 256;\n\t\t\t\t}\n\t\t\t\tif (carry !== 0) {\n\t\t\t\t\tthrow new Error('non-zero carry');\n\t\t\t\t}\n\t\t\t\tlength = i;\n\t\t\t\tpsz += 2;\n\t\t\t}\n\t\t}\n\n\t\t// Process remaining character if odd count.\n\t\tif (psz < source.length) {\n\t\t\tlet carry = BASE_MAP[source.charCodeAt(psz)];\n\n\t\t\tif (carry === 255) {\n\t\t\t\tthrow new Error(`invalid string`);\n\t\t\t}\n\n\t\t\tlet i = 0;\n\t\t\tfor (let it3 = size - 1; (carry !== 0 || i < length) && it3 !== -1; it3--, i++) {\n\t\t\t\tcarry += BASE * b256[it3];\n\t\t\t\tb256[it3] = carry & 0xff;\n\t\t\t\tcarry = carry >>> 8;\n\t\t\t}\n\t\t\tif (carry !== 0) {\n\t\t\t\tthrow new Error('non-zero carry');\n\t\t\t}\n\t\t\tlength = i;\n\t\t}\n\n\t\t// Skip leading zeroes in b256.\n\t\tlet it4 = size - length;\n\t\twhile (it4 !== size && b256[it4] === 0) {\n\t\t\tit4++;\n\t\t}\n\n\t\tif (it4 === zeroes) {\n\t\t\treturn b256;\n\t\t}\n\n\t\tconst vch = allocUnsafe(zeroes + (size - it4));\n\t\tvch.fill(0, 0, zeroes);\n\t\tvch.set(b256.subarray(it4), zeroes);\n\n\t\treturn vch;\n\t};\n};\n","const textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\n\nconst subtle = crypto.subtle;\n\n/**\n * creates an Uint8Array of the requested size, with the contents zeroed\n */\nexport const alloc = (size: number): Uint8Array<ArrayBuffer> => {\n\treturn new Uint8Array(size);\n};\n\n/**\n * creates an Uint8Array of the requested size, where the contents may not be\n * zeroed out. only use if you're certain that the contents will be overwritten\n */\nexport const allocUnsafe = alloc;\n\n/**\n * compares two Uint8Array buffers\n */\nexport const compare = (a: Uint8Array, b: Uint8Array): number => {\n\tconst alen = a.length;\n\tconst blen = b.length;\n\n\tif (alen > blen) {\n\t\treturn 1;\n\t}\n\tif (alen < blen) {\n\t\treturn -1;\n\t}\n\n\tfor (let i = 0; i < alen; i++) {\n\t\tconst ax = a[i];\n\t\tconst bx = b[i];\n\n\t\tif (ax < bx) {\n\t\t\treturn -1;\n\t\t}\n\n\t\tif (ax > bx) {\n\t\t\treturn 1;\n\t\t}\n\t}\n\n\treturn 0;\n};\n\n/**\n * checks if the two Uint8Array buffers are equal\n */\nexport const equals = (a: Uint8Array, b: Uint8Array): boolean => {\n\tif (a === b) {\n\t\treturn true;\n\t}\n\n\tlet len: number;\n\tif ((len = a.length) === b.length) {\n\t\twhile (len--) {\n\t\t\tif (a[len] !== b[len]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn len === -1;\n};\n\n/**\n * checks if the two Uint8Array buffers are equal, timing-safe version\n */\nexport const timingSafeEquals = (a: Uint8Array, b: Uint8Array): boolean => {\n\tlet len: number;\n\tlet out = 0;\n\tif ((len = a.length) === b.length) {\n\t\twhile (len--) {\n\t\t\tout |= a[len] ^ b[len];\n\t\t}\n\t}\n\n\treturn len === -1 && out === 0;\n};\n\n/**\n * concatenates multiple Uint8Array buffers into one\n */\nexport const concat = (arrays: Uint8Array[], size?: number): Uint8Array<ArrayBuffer> => {\n\tlet written = 0;\n\n\tlet len = arrays.length;\n\tlet idx: number;\n\n\tif (size === undefined) {\n\t\tfor (idx = size = 0; idx < len; idx++) {\n\t\t\tconst chunk = arrays[idx];\n\t\t\tsize += chunk.length;\n\t\t}\n\t}\n\n\tconst buffer = new Uint8Array(size);\n\n\tfor (idx = 0; idx < len; idx++) {\n\t\tconst chunk = arrays[idx];\n\n\t\tbuffer.set(chunk, written);\n\t\twritten += chunk.length;\n\t}\n\n\treturn buffer;\n};\n\n/**\n * encodes a UTF-8 string\n */\nexport const encodeUtf8 = (str: string): Uint8Array<ArrayBuffer> => {\n\treturn textEncoder.encode(str);\n};\n\n/**\n * encodes a UTF-8 string into a given buffer\n */\nexport const encodeUtf8Into = (to: Uint8Array, str: string, offset?: number, length?: number): number => {\n\tlet buffer: Uint8Array;\n\n\tif (offset === undefined) {\n\t\tbuffer = to;\n\t} else if (length === undefined) {\n\t\tbuffer = to.subarray(offset);\n\t} else {\n\t\tbuffer = to.subarray(offset, offset + length);\n\t}\n\n\tconst result = textEncoder.encodeInto(str, buffer);\n\n\treturn result.written;\n};\n\nconst _fromCharCode = String.fromCharCode;\n\n// fully unrolled short string decoder, inspired by cbor-x\n// returns null if non-ASCII byte encountered, signaling fallback to TextDecoder\nconst _shortString = (from: Uint8Array, p: number, length: number): string | null => {\n\tif (length < 4) {\n\t\tif (length < 2) {\n\t\t\tif (length === 0) return '';\n\t\t\tconst a = from[p];\n\t\t\tif (a & 0x80) return null;\n\t\t\treturn _fromCharCode(a);\n\t\t}\n\t\tconst a = from[p];\n\t\tconst b = from[p + 1];\n\t\tif ((a | b) & 0x80) return null;\n\t\tif (length === 2) return _fromCharCode(a, b);\n\t\tconst c = from[p + 2];\n\t\tif (c & 0x80) return null;\n\t\treturn _fromCharCode(a, b, c);\n\t}\n\tconst a = from[p];\n\tconst b = from[p + 1];\n\tconst c = from[p + 2];\n\tconst d = from[p + 3];\n\tif ((a | b | c | d) & 0x80) return null;\n\tif (length < 8) {\n\t\tif (length === 4) return _fromCharCode(a, b, c, d);\n\t\tconst e = from[p + 4];\n\t\tif (e & 0x80) return null;\n\t\tif (length === 5) return _fromCharCode(a, b, c, d, e);\n\t\tconst f = from[p + 5];\n\t\tif (f & 0x80) return null;\n\t\tif (length === 6) return _fromCharCode(a, b, c, d, e, f);\n\t\tconst g = from[p + 6];\n\t\tif (g & 0x80) return null;\n\t\treturn _fromCharCode(a, b, c, d, e, f, g);\n\t}\n\tconst e = from[p + 4];\n\tconst f = from[p + 5];\n\tconst g = from[p + 6];\n\tconst h = from[p + 7];\n\tif ((e | f | g | h) & 0x80) return null;\n\tif (length < 12) {\n\t\tif (length === 8) return _fromCharCode(a, b, c, d, e, f, g, h);\n\t\tconst i = from[p + 8];\n\t\tif (i & 0x80) return null;\n\t\tif (length === 9) return _fromCharCode(a, b, c, d, e, f, g, h, i);\n\t\tconst j = from[p + 9];\n\t\tif (j & 0x80) return null;\n\t\tif (length === 10) return _fromCharCode(a, b, c, d, e, f, g, h, i, j);\n\t\tconst k = from[p + 10];\n\t\tif (k & 0x80) return null;\n\t\treturn _fromCharCode(a, b, c, d, e, f, g, h, i, j, k);\n\t}\n\tconst i = from[p + 8];\n\tconst j = from[p + 9];\n\tconst k = from[p + 10];\n\tconst l = from[p + 11];\n\tif ((i | j | k | l) & 0x80) return null;\n\tif (length === 12) return _fromCharCode(a, b, c, d, e, f, g, h, i, j, k, l);\n\tconst m = from[p + 12];\n\tif (m & 0x80) return null;\n\tif (length === 13) return _fromCharCode(a, b, c, d, e, f, g, h, i, j, k, l, m);\n\tconst n = from[p + 13];\n\tif (n & 0x80) return null;\n\tif (length === 14) return _fromCharCode(a, b, c, d, e, f, g, h, i, j, k, l, m, n);\n\tconst o = from[p + 14];\n\tif (o & 0x80) return null;\n\treturn _fromCharCode(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);\n};\n\n/**\n * decodes a UTF-8 string from a given buffer\n * @param from source buffer\n * @param offset byte offset to start reading from\n * @param length number of bytes to read\n * @returns decoded string\n */\nexport const decodeUtf8From = (\n\tfrom: Uint8Array,\n\toffset: number = 0,\n\tlength: number = from.length,\n): string => {\n\tif (length <= 15) {\n\t\tconst result = _shortString(from, offset, length);\n\t\tif (result !== null) return result;\n\t}\n\tif (offset === 0 && length === from.length) {\n\t\treturn textDecoder.decode(from);\n\t}\n\treturn textDecoder.decode(from.subarray(offset, offset + length));\n};\n\n/**\n * calculates the UTF-8 byte length of a string\n * @param str string to measure\n * @returns byte length when encoded as UTF-8\n */\nexport const getUtf8Length = (str: string): number => {\n\tconst len = str.length;\n\n\tlet u16pos = 0;\n\tlet u8pos = 0;\n\n\t// ASCII fast-path: batch process 4 chars at a time\n\twhile (u16pos + 3 < len) {\n\t\tconst a = str.charCodeAt(u16pos);\n\t\tconst b = str.charCodeAt(u16pos + 1);\n\t\tconst c = str.charCodeAt(u16pos + 2);\n\t\tconst d = str.charCodeAt(u16pos + 3);\n\n\t\tif ((a | b | c | d) >= 0x80) {\n\t\t\tbreak;\n\t\t}\n\n\t\tu16pos += 4;\n\t\tu8pos += 4;\n\t}\n\n\t// handle remaining chars\n\twhile (u16pos < len) {\n\t\tconst code = str.charCodeAt(u16pos);\n\n\t\tif (code < 0x80) {\n\t\t\tu16pos += 1;\n\t\t\tu8pos += 1;\n\t\t} else if (code < 0x800) {\n\t\t\tu16pos += 1;\n\t\t\tu8pos += 2;\n\t\t} else if (code < 0xd800 || code > 0xdbff) {\n\t\t\tu16pos += 1;\n\t\t\tu8pos += 3;\n\t\t} else {\n\t\t\tu16pos += 2;\n\t\t\tu8pos += 4;\n\t\t}\n\t}\n\n\treturn u8pos;\n};\n\n/**\n * checks if a string's UTF-8 byte length is within a given range.\n * includes early-exit optimization when exceeding max length.\n * @param str string to measure\n * @param min minimum byte length (inclusive)\n * @param max maximum byte length (inclusive)\n * @returns true if byte length is within [min, max]\n */\nexport const isUtf8LengthInRange = (str: string, min: number, max: number): boolean => {\n\tconst len = str.length;\n\n\t// fast path: if max possible UTF-8 length is below min, fail\n\tif (len * 3 < min) {\n\t\treturn false;\n\t}\n\n\t// fast path: if UTF-16 length satisfies min and max possible satisfies max\n\tif (len >= min && len * 3 <= max) {\n\t\treturn true;\n\t}\n\n\tlet u16pos = 0;\n\tlet u8pos = 0;\n\n\twhile (u16pos < len) {\n\t\tconst code = str.charCodeAt(u16pos);\n\n\t\tif (code < 0x80) {\n\t\t\tu16pos += 1;\n\t\t\tu8pos += 1;\n\t\t} else if (code < 0x800) {\n\t\t\tu16pos += 1;\n\t\t\tu8pos += 2;\n\t\t} else if (code < 0xd800 || code > 0xdbff) {\n\t\t\tu16pos += 1;\n\t\t\tu8pos += 3;\n\t\t} else {\n\t\t\tu16pos += 2;\n\t\t\tu8pos += 4;\n\t\t}\n\n\t\t// early exit once we exceed max\n\t\tif (u8pos > max) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn u8pos >= min;\n};\n\n/**\n * get a SHA-256 digest of this buffer\n */\nexport const toSha256 = async (buffer: Uint8Array<ArrayBuffer>): Promise<Uint8Array<ArrayBuffer>> => {\n\treturn new Uint8Array(await subtle.digest('SHA-256', buffer));\n};\n\n/**\n * generates cryptographically secure random bytes\n * @param size number of bytes to generate\n * @returns buffer filled with random bytes\n */\nexport const randomBytes = (size: number): Uint8Array<ArrayBuffer> => {\n\treturn crypto.getRandomValues(new Uint8Array(size));\n};\n","import {\n\tfromBase64 as fromBase64Native,\n\tfromBase64Pad as fromBase64PadNative,\n\tfromBase64Url as fromBase64UrlNative,\n\tfromBase64UrlPad as fromBase64UrlPadNative,\n\ttoBase64 as toBase64Native,\n\ttoBase64Pad as toBase64PadNative,\n\ttoBase64Url as toBase64UrlNative,\n\ttoBase64UrlPad as toBase64UrlPadNative,\n} from './base64-web-native.ts';\nimport {\n\tfromBase64Pad as fromBase64PadPolyfill,\n\tfromBase64 as fromBase64Polyfill,\n\tfromBase64UrlPad as fromBase64UrlPadPolyfill,\n\tfromBase64Url as fromBase64UrlPolyfill,\n\ttoBase64Pad as toBase64PadPolyfill,\n\ttoBase64 as toBase64Polyfill,\n\ttoBase64UrlPad as toBase64UrlPadPolyfill,\n\ttoBase64Url as toBase64UrlPolyfill,\n} from './base64-web-polyfill.ts';\n\nconst HAS_NATIVE_SUPPORT = 'fromBase64' in Uint8Array;\n\n// #region base64\nexport const fromBase64 = !HAS_NATIVE_SUPPORT ? fromBase64Polyfill : fromBase64Native;\nexport const toBase64 = !HAS_NATIVE_SUPPORT ? toBase64Polyfill : toBase64Native;\n// #endregion\n\n// #region base64pad\nexport const fromBase64Pad = !HAS_NATIVE_SUPPORT ? fromBase64PadPolyfill : fromBase64PadNative;\nexport const toBase64Pad = !HAS_NATIVE_SUPPORT ? toBase64PadPolyfill : toBase64PadNative;\n// #endregion\n\n// #region base64url\nexport const fromBase64Url = !HAS_NATIVE_SUPPORT ? fromBase64UrlPolyfill : fromBase64UrlNative;\nexport const toBase64Url = !HAS_NATIVE_SUPPORT ? toBase64UrlPolyfill : toBase64UrlNative;\n// #endregion\n\n// #region base64urlpad\nexport const fromBase64UrlPad = !HAS_NATIVE_SUPPORT ? fromBase64UrlPadPolyfill : fromBase64UrlPadNative;\nexport const toBase64UrlPad = !HAS_NATIVE_SUPPORT ? toBase64UrlPadPolyfill : toBase64UrlPadNative;\n// #endregion\n","// #region base64\nexport const fromBase64 = (str: string): Uint8Array<ArrayBuffer> => {\n\treturn Uint8Array.fromBase64(str, {\n\t\talphabet: 'base64',\n\t\tlastChunkHandling: 'loose',\n\t}) as Uint8Array<ArrayBuffer>;\n};\n\nexport const toBase64 = (bytes: Uint8Array): string => {\n\treturn bytes.toBase64({ alphabet: 'base64', omitPadding: true });\n};\n// #endregion\n\n// #region base64pad\nexport const fromBase64Pad = (str: string): Uint8Array<ArrayBuffer> => {\n\treturn Uint8Array.fromBase64(str, {\n\t\talphabet: 'base64',\n\t\tlastChunkHandling: 'strict',\n\t}) as Uint8Array<ArrayBuffer>;\n};\n\nexport const toBase64Pad = (bytes: Uint8Array): string => {\n\treturn bytes.toBase64({ alphabet: 'base64', omitPadding: false });\n};\n// #endregion\n\n// #region base64url\nexport const fromBase64Url = (str: string): Uint8Array<ArrayBuffer> => {\n\treturn Uint8Array.fromBase64(str, {\n\t\talphabet: 'base64url',\n\t\tlastChunkHandling: 'loose',\n\t}) as Uint8Array<ArrayBuffer>;\n};\n\nexport const toBase64Url = (bytes: Uint8Array): string => {\n\treturn bytes.toBase64({ alphabet: 'base64url', omitPadding: true });\n};\n// #endregion\n\n// #region base64urlpad\nexport const fromBase64UrlPad = (str: string): Uint8Array<ArrayBuffer> => {\n\treturn Uint8Array.fromBase64(str, {\n\t\talphabet: 'base64url',\n\t\tlastChunkHandling: 'strict',\n\t}) as Uint8Array<ArrayBuffer>;\n};\n\nexport const toBase64UrlPad = (bytes: Uint8Array): string => {\n\treturn bytes.toBase64({ alphabet: 'base64url', omitPadding: false });\n};\n// #endregion\n","// remove after September 2027\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array/toBase64\n\nimport { createRfc4648Decode, createRfc4648Encode } from '../utils.ts';\n\nconst BASE64_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst BASE64URL_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n\n// #region base64\nexport const fromBase64: (str: string) => Uint8Array<ArrayBuffer> =\n\t/*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, false);\nexport const toBase64: (bytes: Uint8Array) => string =\n\t/*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, false);\n// #endregion\n\n// #region base64pad\nexport const fromBase64Pad: (str: string) => Uint8Array<ArrayBuffer> =\n\t/*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, true);\nexport const toBase64Pad: (bytes: Uint8Array) => string =\n\t/*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, true);\n// #endregion\n\n// #region base64url\nexport const fromBase64Url: (str: string) => Uint8Array<ArrayBuffer> =\n\t/*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, false);\nexport const toBase64Url: (bytes: Uint8Array) => string =\n\t/*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, false);\n// #endregion\n\n// #region base64urlpad\nexport const fromBase64UrlPad: (str: string) => Uint8Array<ArrayBuffer> =\n\t/*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, true);\nexport const toBase64UrlPad: (bytes: Uint8Array) => string =\n\t/*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, true);\n// #endregion\n","import { allocUnsafe } from '@atcute/uint8array';\n\nexport { toBase32 } from '#bases/base32-encode';\n\nconst ALPHABET = 'abcdefghijklmnopqrstuvwxyz234567';\n\n// #region decode\n\n// charCode -> 5-bit value lookup table, 0xff for invalid characters.\n// valid base32 chars: a-z (97-122) map to 0-25, 2-7 (50-55) map to 26-31.\nconst _decodeLut: Uint8Array = /*#__PURE__*/ (() => {\n\tconst t = new Uint8Array(128).fill(0xff);\n\tfor (let i = 0; i < 32; i++) {\n\t\tt[ALPHABET.charCodeAt(i)] = i;\n\t}\n\treturn t;\n})();\n\n/**\n * decodes an unpadded RFC 4648 base32 (lowercase) string to a Uint8Array\n * @param str base32 encoded string\n * @returns decoded buffer\n * @throws {SyntaxError} on invalid characters or malformed trailing bits\n */\nexport const fromBase32 = (str: string): Uint8Array<ArrayBuffer> => {\n\tconst end = str.length;\n\tconst bytes = allocUnsafe(((end * 5) / 8) | 0);\n\n\tlet written = 0;\n\tlet i = 0;\n\n\t// process 8-character groups (= 40 bits = 5 bytes each)\n\tconst fullGroups = end - (end % 8);\n\tfor (; i < fullGroups; i += 8) {\n\t\tconst c0 = _decodeLut[str.charCodeAt(i)];\n\t\tconst c1 = _decodeLut[str.charCodeAt(i + 1)];\n\t\tconst c2 = _decodeLut[str.charCodeAt(i + 2)];\n\t\tconst c3 = _decodeLut[str.charCodeAt(i + 3)];\n\t\tconst c4 = _decodeLut[str.charCodeAt(i + 4)];\n\t\tconst c5 = _decodeLut[str.charCodeAt(i + 5)];\n\t\tconst c6 = _decodeLut[str.charCodeAt(i + 6)];\n\t\tconst c7 = _decodeLut[str.charCodeAt(i + 7)];\n\n\t\t// valid base32 values are 0-31 (5 bits), so any value with bits\n\t\t// outside the low 5 means 0xff was in the mix\n\t\tif ((c0 | c1 | c2 | c3 | c4 | c5 | c6 | c7) & 0xe0) {\n\t\t\tthrow new SyntaxError(`invalid base string`);\n\t\t}\n\n\t\tbytes[written] = (c0 << 3) | (c1 >>> 2);\n\t\tbytes[written + 1] = ((c1 << 6) | (c2 << 1) | (c3 >>> 4)) & 0xff;\n\t\tbytes[written + 2] = ((c3 << 4) | (c4 >>> 1)) & 0xff;\n\t\tbytes[written + 3] = ((c4 << 7) | (c5 << 2) | (c6 >>> 3)) & 0xff;\n\t\tbytes[written + 4] = ((c6 << 5) | c7) & 0xff;\n\t\twritten += 5;\n\t}\n\n\t// handle remaining 1-7 characters\n\tif (i < end) {\n\t\tlet bits = 0;\n\t\tlet buffer = 0;\n\t\tfor (; i < end; ++i) {\n\t\t\tconst value = _decodeLut[str.charCodeAt(i)];\n\t\t\tif (value & 0xe0) {\n\t\t\t\tthrow new SyntaxError(`invalid base string`);\n\t\t\t}\n\t\t\tbuffer = (buffer << 5) | value;\n\t\t\tbits += 5;\n\t\t\tif (bits >= 8) {\n\t\t\t\tbits -= 8;\n\t\t\t\tbytes[written++] = 0xff & (buffer >> bits);\n\t\t\t}\n\t\t}\n\n\t\tif (bits >= 5 || (0xff & (buffer << (8 - bits))) !== 0) {\n\t\t\tthrow new SyntaxError(`unexpected end of data`);\n\t\t}\n\t}\n\n\treturn bytes;\n};\n\n// #endregion\n","const ALPHABET = 'abcdefghijklmnopqrstuvwxyz234567';\n\n// charCode lookup table: cc[i] = ALPHABET.charCodeAt(i) for i in 0..31\nconst _cc: Uint8Array = /*#__PURE__*/ (() => {\n\tconst t = new Uint8Array(32);\n\tfor (let i = 0; i < 32; i++) {\n\t\tt[i] = ALPHABET.charCodeAt(i);\n\t}\n\treturn t;\n})();\n\nconst _fromCharCode = String.fromCharCode;\n\n/**\n * encodes a Uint8Array to an unpadded RFC 4648 base32 (lowercase) string\n * @param bytes source buffer\n * @returns base32 encoded string\n */\nexport const toBase32 = (bytes: Uint8Array): string => {\n\tconst len = bytes.length;\n\tconst full = (len / 5) | 0;\n\tconst rem = len - full * 5;\n\tconst cc = _cc;\n\n\tlet str = '';\n\tlet ip = 0;\n\n\t// process pairs of 5-byte groups (10 bytes → 16 base32 chars) at a time,\n\t// batching into a single String.fromCharCode call for fewer string concats\n\tconst pairs = (full / 2) | 0;\n\tfor (let g = 0; g < pairs; g++) {\n\t\tconst a0 = bytes[ip],\n\t\t\ta1 = bytes[ip + 1],\n\t\t\ta2 = bytes[ip + 2],\n\t\t\ta3 = bytes[ip + 3],\n\t\t\ta4 = bytes[ip + 4];\n\t\tconst b0 = bytes[ip + 5],\n\t\t\tb1 = bytes[ip + 6],\n\t\t\tb2 = bytes[ip + 7],\n\t\t\tb3 = bytes[ip + 8],\n\t\t\tb4 = bytes[ip + 9];\n\n\t\tstr += _fromCharCode(\n\t\t\tcc[a0 >>> 3],\n\t\t\tcc[((a0 << 2) | (a1 >>> 6)) & 0x1f],\n\t\t\tcc[(a1 >>> 1) & 0x1f],\n\t\t\tcc[((a1 << 4) | (a2 >>> 4)) & 0x1f],\n\t\t\tcc[((a2 << 1) | (a3 >>> 7)) & 0x1f],\n\t\t\tcc[(a3 >>> 2) & 0x1f],\n\t\t\tcc[((a3 << 3) | (a4 >>> 5)) & 0x1f],\n\t\t\tcc[a4 & 0x1f],\n\t\t\tcc[b0 >>> 3],\n\t\t\tcc[((b0 << 2) | (b1 >>> 6)) & 0x1f],\n\t\t\tcc[(b1 >>> 1) & 0x1f],\n\t\t\tcc[((b1 << 4) | (b2 >>> 4)) & 0x1f],\n\t\t\tcc[((b2 << 1) | (b3 >>> 7)) & 0x1f],\n\t\t\tcc[(b3 >>> 2) & 0x1f],\n\t\t\tcc[((b3 << 3) | (b4 >>> 5)) & 0x1f],\n\t\t\tcc[b4 & 0x1f],\n\t\t);\n\t\tip += 10;\n\t}\n\n\t// remaining full group if odd count\n\tif (full & 1) {\n\t\tconst b0 = bytes[ip],\n\t\t\tb1 = bytes[ip + 1],\n\t\t\tb2 = bytes[ip + 2],\n\t\t\tb3 = bytes[ip + 3],\n\t\t\tb4 = bytes[ip + 4];\n\n\t\tstr += _fromCharCode(\n\t\t\tcc[b0 >>> 3],\n\t\t\tcc[((b0 << 2) | (b1 >>> 6)) & 0x1f],\n\t\t\tcc[(b1 >>> 1) & 0x1f],\n\t\t\tcc[((b1 << 4) | (b2 >>> 4)) & 0x1f],\n\t\t\tcc[((b2 << 1) | (b3 >>> 7)) & 0x1f],\n\t\t\tcc[(b3 >>> 2) & 0x1f],\n\t\t\tcc[((b3 << 3) | (b4 >>> 5)) & 0x1f],\n\t\t\tcc[b4 & 0x1f],\n\t\t);\n\t\tip += 5;\n\t}\n\n\t// handle remaining 1-4 bytes\n\tif (rem > 0) {\n\t\tlet buffer = 0;\n\t\tlet bits = 0;\n\t\tfor (let i = ip; i < len; i++) {\n\t\t\tbuffer = (buffer << 8) | bytes[i];\n\t\t\tbits += 8;\n\t\t}\n\t\twhile (bits >= 5) {\n\t\t\tbits -= 5;\n\t\t\tstr += _fromCharCode(cc[(buffer >>> bits) & 0x1f]);\n\t\t}\n\t\tif (bits > 0) {\n\t\t\tstr += _fromCharCode(cc[(buffer << (5 - bits)) & 0x1f]);\n\t\t}\n\t}\n\n\treturn str;\n};\n","import { createBtcBaseDecode, createBtcBaseEncode } from '../utils.ts';\n\nconst BASE58BTC_CHARSET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\nexport const fromBase58Btc: (source: string) => Uint8Array<ArrayBuffer> =\n\t/*#__PURE__*/ createBtcBaseDecode(BASE58BTC_CHARSET);\n\nexport const toBase58Btc: (source: Uint8Array) => string =\n\t/*#__PURE__*/ createBtcBaseEncode(BASE58BTC_CHARSET);\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","export * from \"./index.js\";\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/\"],\n \"scope\": \"atproto repo?collection=sh.diffuse.output.facet&collection=sh.diffuse.output.playlist&collection=sh.diffuse.output.theme&collection=sh.diffuse.output.track\",\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","export * from './actor/local.js';\n\nexport * from './did/composite.js';\nexport * from './did/methods/plc.js';\nexport * from './did/methods/web.js';\nexport * from './did/methods/xrpc.js';\n\nexport * from './handle/composite.js';\nexport * from './handle/methods/doh-json.js';\nexport * from './handle/methods/well-known.js';\nexport * from './handle/methods/xrpc.js';\n\nexport * from './errors.js';\nexport * from './types.js';\n","import { getAtprotoHandle, getPdsEndpoint } from '@atcute/identity';\nimport { isDid, type ActorIdentifier, type Did, type Handle } from '@atcute/lexicons/syntax';\n\nimport { ActorResolutionError } from '../errors.js';\nimport type {\n\tActorResolver,\n\tDidDocumentResolver,\n\tHandleResolver,\n\tResolveActorOptions,\n\tResolvedActor,\n} from '../types.js';\n\nexport interface LocalActorResolverOptions {\n\thandleResolver: HandleResolver;\n\tdidDocumentResolver: DidDocumentResolver;\n}\n\nexport class LocalActorResolver implements ActorResolver {\n\thandleResolver: HandleResolver;\n\tdidDocumentResolver: DidDocumentResolver;\n\n\tconstructor(options: LocalActorResolverOptions) {\n\t\tthis.handleResolver = options.handleResolver;\n\t\tthis.didDocumentResolver = options.didDocumentResolver;\n\t}\n\n\tasync resolve(actor: ActorIdentifier, options?: ResolveActorOptions): Promise<ResolvedActor> {\n\t\tconst identifierIsDid = isDid(actor);\n\n\t\tlet did: Did;\n\t\tif (identifierIsDid) {\n\t\t\tdid = actor as Did;\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tdid = await this.handleResolver.resolve(actor as Handle, options);\n\t\t\t} catch (err) {\n\t\t\t\tthrow new ActorResolutionError(`failed to resolve handle`, { cause: err });\n\t\t\t}\n\t\t}\n\n\t\tlet doc;\n\t\ttry {\n\t\t\tdoc = await this.didDocumentResolver.resolve(did, options);\n\t\t} catch (err) {\n\t\t\tthrow new ActorResolutionError(`failed to resolve did document`, { cause: err });\n\t\t}\n\n\t\tconst pds = getPdsEndpoint(doc);\n\t\tif (!pds) {\n\t\t\tthrow new ActorResolutionError(`missing pds endpoint`);\n\t\t}\n\n\t\tlet handle: Handle = 'handle.invalid';\n\t\tif (identifierIsDid) {\n\t\t\tconst writtenHandle = getAtprotoHandle(doc);\n\t\t\tif (writtenHandle) {\n\t\t\t\ttry {\n\t\t\t\t\tconst resolved = await this.handleResolver.resolve(writtenHandle, options);\n\n\t\t\t\t\tif (resolved === did) {\n\t\t\t\t\t\thandle = writtenHandle;\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t} else if (getAtprotoHandle(doc) === actor) {\n\t\t\thandle = actor as Handle;\n\t\t}\n\n\t\treturn {\n\t\t\tdid: did,\n\t\t\thandle: handle,\n\t\t\tpds: new URL(pds).href,\n\t\t};\n\t}\n}\n","export * as defs from './typedefs.js';\nexport * from './types.js';\n\nexport * from './utils.js';\n\nexport * from './did.js';\nexport * from './methods/key.js';\nexport * from './methods/plc.js';\nexport * from './methods/web.js';\n","import * as v from '@badrap/valita';\n\nimport { isDid } from '@atcute/lexicons/syntax';\n\nimport * as t from './types.js';\n\n/** @deprecated */\nexport const FRAGMENT_RE = /^#[^#]+$/;\n/** @deprecated */\nexport const MULTIBASE_RE = /^z[a-km-zA-HJ-NP-Z1-9]+$/;\n\nexport const rfc3968UriSchema = v.string().assert((input) => {\n\treturn URL.canParse(input);\n}, `must be a url`);\n\nexport const didRelativeUri = v.string().assert((input) => {\n\treturn FRAGMENT_RE.test(input) || URL.canParse(input);\n}, `must be a did relative uri`);\n\nexport const multibaseString = v.string().assert((input) => {\n\treturn MULTIBASE_RE.test(input);\n}, `must be a base58 multibase`);\n\nexport const didString = v.string().assert(isDid, `must be a did`);\n\nexport const verificationMethod: v.Type<t.VerificationMethod> = v\n\t.object({\n\t\tid: didRelativeUri,\n\t\ttype: v.string(),\n\t\tcontroller: didString,\n\t\tpublicKeyMultibase: multibaseString.optional(),\n\t\tpublicKeyJwk: v.record().optional(),\n\t})\n\t.chain((input) => {\n\t\tswitch (input.type) {\n\t\t\tcase 'Multikey': {\n\t\t\t\tif (input.publicKeyMultibase === undefined) {\n\t\t\t\t\treturn v.err({ message: `missing multikey`, path: ['publicKeyMultibase'] });\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'EcdsaSecp256k1VerificationKey2019':\n\t\t\tcase 'EcdsaSecp256r1VerificationKey2019': {\n\t\t\t\tif (input.publicKeyMultibase === undefined) {\n\t\t\t\t\treturn v.err({ message: `missing multibase key`, path: ['publicKeyMultibase'] });\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn v.ok(input);\n\t});\n\nexport const service: v.Type<t.Service> = v.object({\n\t// should've only been RFC3968, but did:plc uses relative URIs.\n\tid: didRelativeUri,\n\ttype: v.union(v.string(), v.array(v.string())),\n\tserviceEndpoint: v.union(\n\t\trfc3968UriSchema,\n\t\tv.record(rfc3968UriSchema),\n\t\tv.array(v.union(rfc3968UriSchema, v.record(rfc3968UriSchema))),\n\t),\n});\n\nexport const didDocument: v.Type<t.DidDocument> = v\n\t.object({\n\t\t'@context': v.array(rfc3968UriSchema),\n\n\t\tid: didString,\n\n\t\talsoKnownAs: v\n\t\t\t.array(rfc3968UriSchema)\n\t\t\t.chain((input) => {\n\t\t\t\tfor (let i = 0, len = input.length; i < len; i++) {\n\t\t\t\t\tconst aka = input[i];\n\n\t\t\t\t\tfor (let j = 0; j < i; j++) {\n\t\t\t\t\t\tif (aka === input[j]) {\n\t\t\t\t\t\t\treturn v.err({\n\t\t\t\t\t\t\t\tmessage: `duplicate \"${aka}\" aka entry`,\n\t\t\t\t\t\t\t\tpath: [i],\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn v.ok(input);\n\t\t\t})\n\t\t\t.optional(),\n\t\tverificationMethod: v\n\t\t\t.array(verificationMethod)\n\t\t\t.chain((input) => {\n\t\t\t\tfor (let i = 0, len = input.length; i < len; i++) {\n\t\t\t\t\tconst method = input[i];\n\t\t\t\t\tconst methodId = method.id;\n\n\t\t\t\t\tfor (let j = 0; j < i; j++) {\n\t\t\t\t\t\tif (methodId === input[j].id) {\n\t\t\t\t\t\t\treturn v.err({\n\t\t\t\t\t\t\t\tmessage: `duplicate \"${methodId}\" verification method`,\n\t\t\t\t\t\t\t\tpath: [i, 'id'],\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn v.ok(input);\n\t\t\t})\n\t\t\t.optional(),\n\t\tservice: v.array(service).optional(),\n\n\t\tcontroller: v.union(didString, v.array(didString)).optional(),\n\t\tauthentication: v.array(v.union(didRelativeUri, verificationMethod)).optional(),\n\t})\n\t.chain((input) => {\n\t\tconst { id: did, service: services } = input;\n\n\t\tif (services?.length) {\n\t\t\tconst len = services.length;\n\t\t\tconst identifiers = new Array(len);\n\n\t\t\tfor (let i = 0; i < len; i++) {\n\t\t\t\tconst service = services[i];\n\n\t\t\t\tlet id = service.id;\n\t\t\t\tif (id[0] === '#') {\n\t\t\t\t\tid = did + id;\n\t\t\t\t}\n\n\t\t\t\tidentifiers[i] = id;\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < len; i++) {\n\t\t\t\tconst id = identifiers[i];\n\n\t\t\t\tfor (let j = 0; j < i; j++) {\n\t\t\t\t\tif (id === identifiers[j]) {\n\t\t\t\t\t\treturn v.err({\n\t\t\t\t\t\t\tmessage: `duplicate \"${id}\" service`,\n\t\t\t\t\t\t\tpath: ['service', i, 'id'],\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn v.ok(input);\n\t});\n","export * from './at-identifier.ts';\nexport * from './at-uri.ts';\nexport * from './cid.ts';\nexport * from './datetime.ts';\nexport * from './did.ts';\nexport * from './handle.ts';\nexport * from './language.ts';\nexport * from './nsid.ts';\nexport * from './record-key.ts';\nexport * from './tid.ts';\nexport * from './uri.ts';\n","import { isDid, type Did } from './did.ts';\nimport { isHandle, type Handle } from './handle.ts';\n\n/**\n * represents an account's identifier, either a {@link Did} or a\n * {@link Handle}\n */\nexport type ActorIdentifier = Did | Handle;\n\n// #__NO_SIDE_EFFECTS__\nexport const isActorIdentifier = (input: unknown): input is ActorIdentifier => {\n\treturn isDid(input) || isHandle(input);\n};\n","/**\n * represents a decentralized identifier (DID).\n */\nexport type Did<Method extends string = string> = `did:${Method}:${string}`;\n\n/**\n * represents a decentralized identifier with methods supported in atproto\n */\nexport type AtprotoDid = Did<'plc' | 'web'>;\n\nexport type AtprotoAudience = `${AtprotoDid}#${string}`;\n\nconst DID_RE = /^did:([a-z]+):([a-zA-Z0-9._:%-]*[a-zA-Z0-9._-])$/;\n\n// #__NO_SIDE_EFFECTS__\nexport const isDid = (input: unknown): input is Did => {\n\treturn typeof input === 'string' && input.length >= 7 && input.length <= 2048 && DID_RE.test(input);\n};\n","import { isAsciiAlpha, isAsciiAlphaNum } from './utils/ascii.ts';\n\n/**\n * represents an account's handle, using domains as a human-friendly\n * identifier.\n */\nexport type Handle = `${string}.${string}`;\n\n// validates a domain label: starts/ends with alphanumeric, middle allows hyphens, max 63 chars\nconst isValidLabel = (input: string, start: number, end: number): boolean => {\n\tconst len = end - start;\n\tif (len === 0 || len > 63) {\n\t\treturn false;\n\t}\n\n\tconst first = input.charCodeAt(start);\n\tif (!isAsciiAlphaNum(first)) {\n\t\treturn false;\n\t}\n\n\tif (len > 1) {\n\t\tif (!isAsciiAlphaNum(input.charCodeAt(end - 1))) return false;\n\t\tfor (let j = start + 1; j < end - 1; j++) {\n\t\t\tconst c = input.charCodeAt(j);\n\t\t\tif (!isAsciiAlphaNum(c) && c !== 0x2d) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const isHandle = (input: unknown): input is Handle => {\n\tif (typeof input !== 'string') {\n\t\treturn false;\n\t}\n\n\tconst len = input.length;\n\tif (len < 3 || len > 253) {\n\t\treturn false;\n\t}\n\n\tlet labelStart = 0;\n\tlet labelCount = 0;\n\tlet lastLabelStart = 0;\n\n\tfor (let i = 0; i <= len; i++) {\n\t\tif (i === len || input.charCodeAt(i) === 0x2e) {\n\t\t\tif (!isValidLabel(input, labelStart, i)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlastLabelStart = labelStart;\n\t\t\tlabelStart = i + 1;\n\t\t\tlabelCount++;\n\t\t}\n\t}\n\n\t// need at least 2 labels (one dot)\n\tif (labelCount < 2) {\n\t\treturn false;\n\t}\n\n\t// TLD must start with a letter\n\treturn isAsciiAlpha(input.charCodeAt(lastLabelStart));\n};\n","// #__NO_SIDE_EFFECTS__\nexport const isAsciiAlpha = (c: number): boolean => {\n\treturn (c >= 0x41 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a);\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const isAsciiAlphaNum = (c: number): boolean => {\n\treturn isAsciiAlpha(c) || (c >= 0x30 && c <= 0x39);\n};\n","import { type Result } from '../utils.ts';\n\nimport { isActorIdentifier, type ActorIdentifier } from './at-identifier.ts';\nimport { isDid, type Did } from './did.ts';\nimport { isNsid, type Nsid } from './nsid.ts';\nimport { isRecordKey, type RecordKey } from './record-key.ts';\nimport { isAsciiAlphaNum } from './utils/ascii.ts';\n\n/**\n * represents a general AT Protocol URI, representing either an entire\n * repository, a specific collection within a repository, or a record.\n *\n * it allows using handles over DIDs, but this means that it won't be stable.\n */\nexport type ResourceUri =\n\t| `at://${ActorIdentifier}`\n\t| `at://${ActorIdentifier}/${Nsid}`\n\t| `at://${ActorIdentifier}/${Nsid}/${RecordKey}`;\n\nexport type ParsedResourceUri =\n\t| { repo: ActorIdentifier; collection: undefined; rkey: undefined; fragment: string | undefined }\n\t| { repo: ActorIdentifier; collection: Nsid; rkey: undefined; fragment: string | undefined }\n\t| { repo: ActorIdentifier; collection: Nsid; rkey: RecordKey; fragment: string | undefined };\n\n// minimum valid non-canonical at-uri is `at://a.a` (8 chars)\nconst AT_URI_MIN_LENGTH = 8;\n// minimum canonical at-uri is `at://did:m:v/a.b.c/x` (20 chars)\nconst CANONICAL_AT_URI_MIN_LENGTH = 5 + 7 + 1 + 5 + 1 + 1;\n// maximum structural length:\n// `at://` + DID (2048) + `/` + NSID (317) + `/` + rkey (512)\nconst AT_URI_MAX_LENGTH = 5 + 2048 + 1 + 317 + 1 + 512;\n\n// repo: [a-zA-Z0-9._:%-]\n// collection: [a-zA-Z0-9.-]\n// rkey: [a-zA-Z0-9._~:@!$&%')(*+,;=-]\n// fragment: /[a-zA-Z0-9._~:@!$&%')(*+,;=\\-[\\]/\\\\]*\nconst ATURI_RE =\n\t/^at:\\/\\/([a-zA-Z0-9._:%-]+)(?:\\/([a-zA-Z0-9-.]+)(?:\\/([a-zA-Z0-9._~:@!$&%')(*+,;=-]+))?)?(?:#(\\/[a-zA-Z0-9._~:@!$&%')(*+,;=\\-[\\]/\\\\]*))?$/;\n\nconst isFragmentChar = (c: number): boolean => {\n\treturn (\n\t\tisAsciiAlphaNum(c) ||\n\t\tc === 0x2e || // .\n\t\tc === 0x5f || // _\n\t\tc === 0x7e || // ~\n\t\tc === 0x3a || // :\n\t\tc === 0x40 || // @\n\t\tc === 0x21 || // !\n\t\tc === 0x24 || // $\n\t\tc === 0x26 || // &\n\t\tc === 0x25 || // %\n\t\tc === 0x27 || // '\n\t\tc === 0x29 || // )\n\t\tc === 0x28 || // (\n\t\tc === 0x2a || // *\n\t\tc === 0x2b || // +\n\t\tc === 0x2c || // ,\n\t\tc === 0x3b || // ;\n\t\tc === 0x3d || // =\n\t\tc === 0x2d || // -\n\t\tc === 0x5b || // [\n\t\tc === 0x5d || // ]\n\t\tc === 0x2f || // /\n\t\tc === 0x5c // \\\n\t);\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const isResourceUri = (input: unknown): input is ResourceUri => {\n\tif (typeof input !== 'string') {\n\t\treturn false;\n\t}\n\n\tconst len = input.length;\n\tif (len < AT_URI_MIN_LENGTH || len > AT_URI_MAX_LENGTH) {\n\t\treturn false;\n\t}\n\n\tif (\n\t\tinput.charCodeAt(0) !== 0x61 ||\n\t\tinput.charCodeAt(1) !== 0x74 ||\n\t\tinput.charCodeAt(2) !== 0x3a ||\n\t\tinput.charCodeAt(3) !== 0x2f ||\n\t\tinput.charCodeAt(4) !== 0x2f\n\t) {\n\t\treturn false;\n\t}\n\n\tconst hash = input.indexOf('#', 5);\n\tconst stop = hash === -1 ? len : hash;\n\n\tif (hash !== -1) {\n\t\tconst fragmentStart = hash + 1;\n\t\tif (fragmentStart >= len || input.charCodeAt(fragmentStart) !== 0x2f) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (let idx = fragmentStart; idx < len; idx++) {\n\t\t\tif (!isFragmentChar(input.charCodeAt(idx))) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst firstSlash = input.indexOf('/', 5);\n\tlet repoEnd = stop;\n\tlet collection: string | undefined;\n\tlet rkey: string | undefined;\n\n\tif (firstSlash !== -1 && firstSlash < stop) {\n\t\trepoEnd = firstSlash;\n\n\t\tconst collectionStart = firstSlash + 1;\n\t\tif (collectionStart >= stop) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst secondSlash = input.indexOf('/', collectionStart);\n\t\tif (secondSlash !== -1 && secondSlash < stop) {\n\t\t\tif (secondSlash === collectionStart || secondSlash + 1 >= stop) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst thirdSlash = input.indexOf('/', secondSlash + 1);\n\t\t\tif (thirdSlash !== -1 && thirdSlash < stop) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tcollection = input.substring(collectionStart, secondSlash);\n\t\t\trkey = input.substring(secondSlash + 1, stop);\n\t\t} else {\n\t\t\tcollection = input.substring(collectionStart, stop);\n\t\t}\n\t}\n\n\tif (repoEnd <= 5) {\n\t\treturn false;\n\t}\n\n\tconst repo = input.substring(5, repoEnd);\n\n\treturn (\n\t\tisActorIdentifier(repo) &&\n\t\t(collection === undefined || isNsid(collection)) &&\n\t\t(rkey === undefined || isRecordKey(rkey))\n\t);\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const parseResourceUri = (input: string): Result<ParsedResourceUri, string> => {\n\tconst len = input.length;\n\tif (len < AT_URI_MIN_LENGTH || len > AT_URI_MAX_LENGTH) {\n\t\treturn { ok: false, error: `invalid at-uri: ${input}` };\n\t}\n\n\tconst match = ATURI_RE.exec(input);\n\tif (match === null) {\n\t\treturn { ok: false, error: `invalid at-uri: ${input}` };\n\t}\n\n\tconst [, r, c, k, f] = match;\n\n\tif (!isActorIdentifier(r)) {\n\t\treturn { ok: false, error: `invalid repo in at-uri: ${r}` };\n\t}\n\n\tif (c !== undefined && !isNsid(c)) {\n\t\treturn { ok: false, error: `invalid collection in at-uri: ${c}` };\n\t}\n\n\tif (k !== undefined && !isRecordKey(k)) {\n\t\treturn { ok: false, error: `invalid rkey in at-uri: ${k}` };\n\t}\n\n\treturn { ok: true, value: { repo: r, collection: c, rkey: k, fragment: f } };\n};\n\n/**\n * represents a canonical AT Protocol URI for a specific record.\n *\n * this URI format uses the account's DID as the authority, ensuring that\n * the URI remains valid even as the account changes handles, uniquely\n * identifying a specific piece of record within AT Protocol.\n */\nexport type CanonicalResourceUri = `at://${Did}/${Nsid}/${RecordKey}`;\n\nexport type ParsedCanonicalResourceUri = {\n\trepo: Did;\n\tcollection: Nsid;\n\trkey: RecordKey;\n\tfragment: string | undefined;\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const isCanonicalResourceUri = (input: unknown): input is CanonicalResourceUri => {\n\tif (typeof input !== 'string') {\n\t\treturn false;\n\t}\n\n\tconst len = input.length;\n\tif (len < CANONICAL_AT_URI_MIN_LENGTH || len > AT_URI_MAX_LENGTH) {\n\t\treturn false;\n\t}\n\n\t// must start with \"at://\"\n\tif (\n\t\tinput.charCodeAt(0) !== 0x61 ||\n\t\tinput.charCodeAt(1) !== 0x74 ||\n\t\tinput.charCodeAt(2) !== 0x3a ||\n\t\tinput.charCodeAt(3) !== 0x2f ||\n\t\tinput.charCodeAt(4) !== 0x2f\n\t) {\n\t\treturn false;\n\t}\n\n\tconst firstSlash = input.indexOf('/', 5);\n\tif (firstSlash === -1) {\n\t\treturn false;\n\t}\n\n\tconst secondSlash = input.indexOf('/', firstSlash + 1);\n\tif (secondSlash === -1) {\n\t\treturn false;\n\t}\n\n\t// check for fragment\n\tconst hashPos = input.indexOf('#', secondSlash + 1);\n\n\tconst repo = input.substring(5, firstSlash);\n\tconst collection = input.substring(firstSlash + 1, secondSlash);\n\tconst rkey = hashPos === -1 ? input.substring(secondSlash + 1) : input.substring(secondSlash + 1, hashPos);\n\n\treturn isDid(repo) && isNsid(collection) && isRecordKey(rkey);\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const parseCanonicalResourceUri = (input: string): Result<ParsedCanonicalResourceUri, string> => {\n\tconst len = input.length;\n\tif (len < CANONICAL_AT_URI_MIN_LENGTH || len > AT_URI_MAX_LENGTH) {\n\t\treturn { ok: false, error: `invalid canonical-at-uri: ${input}` };\n\t}\n\n\tconst match = ATURI_RE.exec(input);\n\tif (match === null) {\n\t\treturn { ok: false, error: `invalid canonical-at-uri: ${input}` };\n\t}\n\n\tconst [, r, c, k, f] = match;\n\n\tif (!isDid(r)) {\n\t\treturn { ok: false, error: `invalid repo in canonical-at-uri: ${r}` };\n\t}\n\n\tif (!isNsid(c)) {\n\t\treturn { ok: false, error: `invalid collection in canonical-at-uri: ${c}` };\n\t}\n\n\tif (!isRecordKey(k)) {\n\t\treturn { ok: false, error: `invalid rkey in canonical-at-uri: ${k}` };\n\t}\n\n\treturn { ok: true, value: { repo: r, collection: c, rkey: k, fragment: f } };\n};\n","import { DEV } from 'esm-env';\n\nexport type Result<T, E> = { ok: true; value: T } | { ok: false; error: E };\n\nexport const assert: { (condition: any, message?: string): asserts condition } = (condition, message) => {\n\tif (!condition) {\n\t\tif (DEV) {\n\t\t\tthrow new Error(`Assertion failed` + (message ? `: ${message}` : ``));\n\t\t}\n\n\t\tthrow new Error(`Assertion failed`);\n\t}\n};\n\nexport const assertNever = (_: never, message?: string): never => {\n\tassert(false, message);\n};\n","export { default as BROWSER } from 'esm-env/browser';\nexport { default as DEV } from 'esm-env/development';\nexport { default as NODE } from 'esm-env/node';\n","export default typeof window !== 'undefined';\n","const node_env = globalThis.process?.env?.NODE_ENV;\nexport default node_env && !node_env.toLowerCase().startsWith('prod');\n","export default true;\n","import { isAsciiAlpha, isAsciiAlphaNum } from './utils/ascii.ts';\n\n/**\n * represents a namespace identifier (NSID)\n */\nexport type Nsid = `${string}.${string}.${string}`;\n\n// #__NO_SIDE_EFFECTS__\nexport const isNsid = (input: unknown): input is Nsid => {\n\tif (typeof input !== 'string') {\n\t\treturn false;\n\t}\n\n\tconst len = input.length;\n\tif (len < 5 || len > 317) {\n\t\treturn false;\n\t}\n\n\t// find the last dot to separate domain labels from the name segment\n\tlet lastDot = -1;\n\tfor (let j = len - 1; j >= 0; j--) {\n\t\tif (input.charCodeAt(j) === 0x2e) {\n\t\t\tlastDot = j;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (lastDot === -1) {\n\t\treturn false;\n\t}\n\n\t// validate domain segments (before lastDot)\n\tlet segStart = 0;\n\tlet segIdx = 0;\n\tfor (let i = 0; i <= lastDot; i++) {\n\t\tif (i === lastDot || input.charCodeAt(i) === 0x2e) {\n\t\t\tconst segLen = i - segStart;\n\t\t\tif (segLen === 0 || segLen > 63) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst first = input.charCodeAt(segStart);\n\t\t\tif (segIdx === 0) {\n\t\t\t\t// first domain label must start with a letter\n\t\t\t\tif (!isAsciiAlpha(first)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// subsequent domain labels start with alphanumeric\n\t\t\t\tif (!isAsciiAlphaNum(first)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (segLen > 1) {\n\t\t\t\tif (!isAsciiAlphaNum(input.charCodeAt(i - 1))) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tfor (let j = segStart + 1; j < i - 1; j++) {\n\t\t\t\t\tconst c = input.charCodeAt(j);\n\t\t\t\t\tif (!isAsciiAlphaNum(c) && c !== 0x2d) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsegStart = i + 1;\n\t\t\tsegIdx++;\n\t\t}\n\t}\n\n\t// need at least 2 domain segments\n\tif (segIdx < 2) {\n\t\treturn false;\n\t}\n\n\t// name segment (after lastDot): starts with letter, rest alphanumeric, max 63\n\tconst nameStart = lastDot + 1;\n\tconst nameLen = len - nameStart;\n\tif (nameLen === 0 || nameLen > 63) {\n\t\treturn false;\n\t}\n\n\tif (!isAsciiAlpha(input.charCodeAt(nameStart))) {\n\t\treturn false;\n\t}\n\tfor (let j = nameStart + 1; j < len; j++) {\n\t\tif (!isAsciiAlphaNum(input.charCodeAt(j))) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n};\n","import { isAsciiAlphaNum } from './utils/ascii.ts';\n\n/**\n * represents a record key\n */\nexport type RecordKey = string;\n\n// #__NO_SIDE_EFFECTS__\nexport const isRecordKey = (input: unknown): input is RecordKey => {\n\tif (typeof input !== 'string') {\n\t\treturn false;\n\t}\n\n\tconst len = input.length;\n\tif (len < 1 || len > 512) {\n\t\treturn false;\n\t}\n\n\t// reject \".\" and \"..\"\n\tif (len <= 2 && input.charCodeAt(0) === 0x2e && (len === 1 || input.charCodeAt(1) === 0x2e)) {\n\t\treturn false;\n\t}\n\n\tfor (let i = 0; i < len; i++) {\n\t\tconst c = input.charCodeAt(i);\n\t\t// [a-zA-Z0-9_~.:-]\n\t\tif (\n\t\t\t!isAsciiAlphaNum(c) &&\n\t\t\tc !== 0x5f && // _\n\t\t\tc !== 0x7e && // ~\n\t\t\tc !== 0x2e && // .\n\t\t\tc !== 0x3a && // :\n\t\t\tc !== 0x2d // -\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n};\n","/**\n * represents a content identifier (CID)\n */\nexport type Cid = string;\n\nconst DASL_CID_RE = /^baf[ky]rei[a-z2-7]{52}$/;\n\n// #__NO_SIDE_EFFECTS__\nexport const isCid = (input: unknown): input is Cid => {\n\treturn typeof input === 'string' && input.length === 59 && DASL_CID_RE.test(input);\n};\n","export type Datetime = string;\n\nconst DATE_TIME_RE =\n\t/^((?!0{3})\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01]))T((?:[01]\\d|2[0-3]):(?:[0-5]\\d):(?:[0-5]\\d))(\\.\\d+)?(Z|(?!-00:00)[+-](?:[01]\\d|2[0-3]):(?:[0-5]\\d))$/;\n\n// #__NO_SIDE_EFFECTS__\nexport const isDatetime = (input: unknown): input is Datetime => {\n\treturn typeof input === 'string' && input.length >= 20 && input.length <= 64 && DATE_TIME_RE.test(input);\n};\n","export type LanguageCode = string;\n\nconst LANGUAGE_CODE_RE =\n\t/^((?<grandfathered>(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)|(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))|((?<language>([A-Za-z]{2,3}(-(?<extlang>[A-Za-z]{3}(-[A-Za-z]{3}){0,2}))?)|[A-Za-z]{4}|[A-Za-z]{5,8})(-(?<script>[A-Za-z]{4}))?(-(?<region>[A-Za-z]{2}|[0-9]{3}))?(-(?<variant>[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(-(?<extension>[0-9A-WY-Za-wy-z](-[A-Za-z0-9]{2,8})+))*(-(?<privateUseA>x(-[A-Za-z0-9]{1,8})+))?)|(?<privateUseB>x(-[A-Za-z0-9]{1,8})+))$/;\n\n// #__NO_SIDE_EFFECTS__\nexport const isLanguageCode = (input: unknown): input is LanguageCode => {\n\treturn typeof input === 'string' && input.length >= 2 && LANGUAGE_CODE_RE.test(input);\n};\n","/**\n * represents a timestamp identifier (TID)\n */\nexport type Tid = string;\n\nconst TID_RE = /^[234567abcdefghij][234567abcdefghijklmnopqrstuvwxyz]{12}$/;\n\n// #__NO_SIDE_EFFECTS__\nexport const isTid = (input: unknown): input is Tid => {\n\treturn typeof input === 'string' && input.length === 13 && TID_RE.test(input);\n};\n","import { isUtf8LengthInRange } from '@atcute/uint8array';\n\n/**\n * represents a generic URI\n */\nexport type GenericUri = `${string}:${string}`;\n\nconst URI_RE = /^\\w+:(?:\\/\\/)?[^\\s/][^\\s]*$/;\n\n// #__NO_SIDE_EFFECTS__\nexport const isGenericUri = (input: unknown): input is GenericUri => {\n\tif (typeof input !== 'string') {\n\t\treturn false;\n\t}\n\n\tif (!isUtf8LengthInRange(input, 3, 8192)) {\n\t\treturn false;\n\t}\n\n\treturn URI_RE.test(input);\n};\n","export {};\n//# sourceMappingURL=types.js.map","import type { Handle } from '@atcute/lexicons';\nimport { isHandle } from '@atcute/lexicons/syntax';\n\nimport * as t from './types.js';\n\nexport interface VerificationMaterial {\n\ttype: string;\n\tpublicKeyMultibase: string;\n}\n\nconst isUrlParseSupported = 'parse' in URL;\n\nexport const isAtprotoServiceEndpoint = (input: string): boolean => {\n\tlet url: URL | null = null;\n\tif (isUrlParseSupported) {\n\t\turl = URL.parse(input);\n\t} else {\n\t\ttry {\n\t\t\turl = new URL(input);\n\t\t} catch {}\n\t}\n\n\treturn (\n\t\turl !== null &&\n\t\t(url.protocol === 'https:' || url.protocol === 'http:') &&\n\t\turl.pathname === '/' &&\n\t\turl.search === '' &&\n\t\turl.hash === ''\n\t);\n};\n\nexport const getVerificationMaterial = (\n\tdoc: t.DidDocument,\n\tid: `#${string}`,\n): VerificationMaterial | undefined => {\n\tconst verificationMethods = doc.verificationMethod;\n\tif (!verificationMethods) {\n\t\treturn;\n\t}\n\n\tconst expectedId = `${doc.id}${id}`;\n\n\tfor (let idx = 0, len = verificationMethods.length; idx < len; idx++) {\n\t\tconst { id, type, publicKeyMultibase } = verificationMethods[idx];\n\n\t\tif (id !== expectedId) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (publicKeyMultibase === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn { type, publicKeyMultibase };\n\t}\n};\n\nexport const getAtprotoVerificationMaterial = (doc: t.DidDocument): VerificationMaterial | undefined => {\n\treturn getVerificationMaterial(doc, '#atproto');\n};\n\nexport const getAtprotoLabelerVerificationMaterial = (\n\tdoc: t.DidDocument,\n): VerificationMaterial | undefined => {\n\treturn getVerificationMaterial(doc, '#atproto_label');\n};\n\nexport const getAtprotoHandle = (doc: t.DidDocument): Handle | null | undefined => {\n\tconst alsoKnownAs = doc.alsoKnownAs;\n\tif (!alsoKnownAs) {\n\t\treturn null;\n\t}\n\n\tconst PREFIX = 'at://';\n\n\tfor (let idx = 0, len = alsoKnownAs.length; idx < len; idx++) {\n\t\tconst aka = alsoKnownAs[idx];\n\n\t\tif (!aka.startsWith(PREFIX)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst raw = aka.slice(PREFIX.length);\n\n\t\tif (!isHandle(raw)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn raw;\n\t}\n\n\treturn null;\n};\n\nexport const getAtprotoServiceEndpoint = (\n\tdoc: t.DidDocument,\n\tpredicate: { id: `#${string}`; type?: string },\n): string | undefined => {\n\tconst services = doc.service;\n\tif (!services) {\n\t\treturn;\n\t}\n\n\tfor (let idx = 0, len = services.length; idx < len; idx++) {\n\t\tconst { id, type, serviceEndpoint } = services[idx];\n\n\t\tif (id !== predicate.id && id !== doc.id + predicate.id) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (predicate.type !== undefined) {\n\t\t\tif (Array.isArray(type)) {\n\t\t\t\tif (!type.includes(predicate.type)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (type !== predicate.type) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (typeof serviceEndpoint !== 'string' || !isAtprotoServiceEndpoint(serviceEndpoint)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn serviceEndpoint;\n\t}\n};\n\nexport const getPdsEndpoint = (doc: t.DidDocument): string | undefined => {\n\treturn getAtprotoServiceEndpoint(doc, {\n\t\tid: '#atproto_pds',\n\t\ttype: 'AtprotoPersonalDataServer',\n\t});\n};\n\nexport const getLabelerEndpoint = (doc: t.DidDocument): string | undefined => {\n\treturn getAtprotoServiceEndpoint(doc, {\n\t\tid: '#atproto_labeler',\n\t\ttype: 'AtprotoLabeler',\n\t});\n};\n\nexport const getBlueskyChatEndpoint = (doc: t.DidDocument): string | undefined => {\n\treturn getAtprotoServiceEndpoint(doc, {\n\t\tid: '#bsky_chat',\n\t\ttype: 'BskyChatService',\n\t});\n};\n\nexport const getBlueskyFeedgenEndpoint = (doc: t.DidDocument): string | undefined => {\n\treturn getAtprotoServiceEndpoint(doc, {\n\t\tid: '#bsky_fg',\n\t\ttype: 'BskyFeedGenerator',\n\t});\n};\n\nexport const getBlueskyNotificationEndpoint = (doc: t.DidDocument): string | undefined => {\n\treturn getAtprotoServiceEndpoint(doc, {\n\t\tid: '#bsky_notif',\n\t\ttype: 'BskyNotificationService',\n\t});\n};\n","import type { AtprotoAudience, AtprotoDid, Did } from '@atcute/lexicons/syntax';\n\nimport { isPlcDid } from './methods/plc.js';\nimport { isAtprotoWebDid } from './methods/web.js';\n\nconst FRAGMENT_RE = /^(?:[A-Za-z0-9\\-._~!$&'()*+,;=:@\\/?]|%[0-9A-Fa-f]{2})*$/;\n\n/**\n * checks if it's a DID identifier that is supported by atproto\n */\nexport const isAtprotoDid = (input: string): input is AtprotoDid => {\n\treturn isPlcDid(input) || isAtprotoWebDid(input);\n};\n\nexport const isAtprotoAudience = (input: string): input is AtprotoAudience => {\n\t// 'did:web:a.co#f'\n\tif (input.length < 14) {\n\t\treturn false;\n\t}\n\n\tconst isep = input.indexOf('#', 12);\n\tif (isep === -1) {\n\t\treturn false;\n\t}\n\n\treturn FRAGMENT_RE.test(input.slice(isep + 1)) && isAtprotoDid(input.slice(0, isep));\n};\n\n/**\n * returns the DID's method\n */\nexport const extractDidMethod = <M extends string>(did: Did<M>): M => {\n\tconst isep = did.indexOf(':', 4);\n\tconst method = did.slice(4, isep);\n\treturn method as M;\n};\n","import type { Did } from '@atcute/lexicons/syntax';\n\n/** @deprecated use `isPlcDid` instead */\nexport const PLC_DID_RE = /^did:plc:([a-z2-7]{24})$/;\n\n/**\n * checks if input is a did:plc identifier\n */\nexport const isPlcDid = (input: string): input is Did<'plc'> => {\n\treturn input.length === 32 && PLC_DID_RE.test(input);\n};\n","import type { Did } from '@atcute/lexicons/syntax';\n\n/** @deprecated use `isWebDid` instead */\nexport const WEB_DID_RE =\n\t/^did:web:([a-zA-Z0-9%\\-]+(?:(?:\\.[a-zA-Z0-9%\\-]+)*(?:\\.[a-zA-Z]{2,}))?)?((?::[a-zA-Z0-9\\-%.]+)+)?$/;\n\n/** @deprecated use `isAtprotoWebDid` instead */\nexport const ATPROTO_WEB_DID_RE =\n\t/^did:web:([a-zA-Z0-9\\-]+(?:\\.[a-zA-Z0-9\\-]+)*(?:\\.[a-zA-Z]{2,})|localhost(?:%3[aA]\\d+)?)$/;\n\n/**\n * checks if input is a did:web identifier, note that you should probably use\n * `isAtprotoDidWeb` for atproto-related cases as atproto only supports a subset\n * of the did:web specification (namely, no custom paths)\n */\nexport const isWebDid = (input: string): input is Did<'web'> => {\n\treturn input.length >= 9 && WEB_DID_RE.test(input);\n};\n\n/**\n * checks if input is a did:web identifier that is supported by atproto\n */\nexport const isAtprotoWebDid = (input: string): input is Did<'web'> => {\n\treturn input.length >= 12 && ATPROTO_WEB_DID_RE.test(input);\n};\n\n/**\n * normalize a did:web identifier\n */\nexport const normalizeWebDid = (did: Did<'web'>): Did<'web'> => {\n\tconst [host, ...paths] = did.slice(8).split(':').map(decodeURIComponent);\n\n\tlet normalized = `did:web:${encodeURIComponent(host.toLowerCase())}`;\n\tif (paths.length > 0) {\n\t\tnormalized += `:${paths.join(':')}`;\n\t}\n\n\treturn normalized as Did<'web'>;\n};\n\n/**\n * converts did:web identifier into the DID document's URL\n */\nexport const webDidToDocumentUrl = (did: Did<'web'>): URL => {\n\tconst [host, ...paths] = did.slice(8).split(':').map(decodeURIComponent);\n\n\tlet pathname = '/' + paths.join('/');\n\tif (pathname === '/') {\n\t\tpathname = `/.well-known/did.json`;\n\t} else {\n\t\tpathname += `/did.json`;\n\t}\n\n\tconst url = new URL(`https://${host}${pathname}`);\n\tif (url.hostname === 'localhost') {\n\t\turl.protocol = 'http:';\n\t}\n\n\treturn url;\n};\n","import type { Did } from '@atcute/lexicons';\n\nconst KEY_DID_RE = /^did:key:z[a-km-zA-HJ-NP-Z1-9]+$/;\n\n/**\n * checks if input is a did:key identifier\n */\nexport const isKeyDid = (input: string): input is Did<'key'> => {\n\treturn input.length >= 10 && KEY_DID_RE.test(input);\n};\n","import type { Did } from '@atcute/lexicons/syntax';\n\n// #region DID document resolution errors\nexport class DidDocumentResolutionError extends Error {\n\toverride name = 'DidResolutionError';\n}\n\nexport class UnsupportedDidMethodError extends DidDocumentResolutionError {\n\toverride name = 'UnsupportedDidMethodError';\n\n\tconstructor(public did: Did) {\n\t\tsuper(`unsupported did method; did=${did}`);\n\t}\n}\n\nexport class ImproperDidError extends DidDocumentResolutionError {\n\toverride name = 'ImproperDidError';\n\n\tconstructor(public did: Did) {\n\t\tsuper(`improper did; did=${did}`);\n\t}\n}\n\nexport class DocumentNotFoundError extends DidDocumentResolutionError {\n\toverride name = 'DocumentNotFoundError';\n\n\tconstructor(public did: Did) {\n\t\tsuper(`did document not found; did=${did}`);\n\t}\n}\n\nexport class FailedDocumentResolutionError extends DidDocumentResolutionError {\n\toverride name = 'FailedDocumentResolutionError';\n\n\tconstructor(\n\t\tpublic did: Did,\n\t\toptions?: ErrorOptions,\n\t) {\n\t\tsuper(`failed to resolve did document; did=${did}`, options);\n\t}\n}\n// #endregion\n\n// #region Handle resolution errors\nexport class HandleResolutionError extends Error {\n\toverride name = 'HandleResolutionError';\n}\n\nexport class DidNotFoundError extends HandleResolutionError {\n\toverride name = 'DidNotFoundError';\n\n\tconstructor(public handle: string) {\n\t\tsuper(`handle returned no did; handle=${handle}`);\n\t}\n}\n\nexport class FailedHandleResolutionError extends HandleResolutionError {\n\toverride name = 'FailedHandleResolutionError';\n\n\tconstructor(\n\t\tpublic handle: string,\n\t\toptions?: ErrorOptions,\n\t) {\n\t\tsuper(`failed to resolve handle; handle=${handle}`, options);\n\t}\n}\n\nexport class InvalidResolvedHandleError extends HandleResolutionError {\n\toverride name = 'InvalidResolvedHandleError';\n\n\tconstructor(\n\t\tpublic handle: string,\n\t\tpublic did: string,\n\t) {\n\t\tsuper(`handle returned invalid did; handle=${handle}; did=${did}`);\n\t}\n}\n\nexport class AmbiguousHandleError extends HandleResolutionError {\n\toverride name = 'AmbiguousHandleError';\n\n\tconstructor(handle: string) {\n\t\tsuper(`handle returned multiple did values; handle=${handle}`);\n\t}\n}\n// #endregion\n\n// #region Actor resolution errors\nexport class ActorResolutionError extends Error {\n\toverride name = 'ActorResolutionError';\n}\n// #endregion\n","import { extractDidMethod, type DidDocument } from '@atcute/identity';\nimport type { Did } from '@atcute/lexicons/syntax';\n\nimport * as err from '../errors.js';\nimport type { DidDocumentResolver, ResolveDidDocumentOptions } from '../types.js';\n\nexport interface CompositeDidDocumentResolverOptions<M extends string> {\n\tmethods: { [K in M]: DidDocumentResolver<K> };\n}\n\nexport class CompositeDidDocumentResolver<M extends string> implements DidDocumentResolver<M> {\n\t#methods: Map<string, DidDocumentResolver<M>>;\n\n\tconstructor({ methods }: CompositeDidDocumentResolverOptions<M>) {\n\t\tthis.#methods = new Map(Object.entries(methods));\n\t}\n\n\tasync resolve(did: Did<M>, options?: ResolveDidDocumentOptions): Promise<DidDocument> {\n\t\tconst method = extractDidMethod(did);\n\n\t\tconst resolver = this.#methods.get(method);\n\t\tif (resolver === undefined) {\n\t\t\tthrow new err.UnsupportedDidMethodError(did);\n\t\t}\n\n\t\treturn await resolver.resolve(did, options);\n\t}\n}\n","import type { DidDocument } from '@atcute/identity';\nimport type { Did } from '@atcute/lexicons/syntax';\nimport { FailedResponseError } from '@atcute/util-fetch';\n\nimport * as err from '../../errors.js';\nimport type { DidDocumentResolver, ResolveDidDocumentOptions } from '../../types.js';\nimport { fetchDocHandler } from '../utils.js';\n\nexport interface PlcDidDocumentResolverOptions {\n\tapiUrl?: string;\n\tfetch?: typeof fetch;\n}\n\nexport class PlcDidDocumentResolver implements DidDocumentResolver<'plc'> {\n\treadonly apiUrl: string;\n\t#fetch: typeof fetch;\n\n\tconstructor({\n\t\tapiUrl = 'https://plc.directory',\n\t\tfetch: fetchThis = fetch,\n\t}: PlcDidDocumentResolverOptions = {}) {\n\t\tthis.apiUrl = apiUrl;\n\t\tthis.#fetch = fetchThis;\n\t}\n\n\tasync resolve(did: Did<'plc'>, options?: ResolveDidDocumentOptions): Promise<DidDocument> {\n\t\t// quick sanity check\n\t\tif (!did.startsWith('did:plc:')) {\n\t\t\tthrow new err.UnsupportedDidMethodError(did);\n\t\t}\n\n\t\tlet json: DidDocument;\n\n\t\ttry {\n\t\t\tconst url = new URL(`/${encodeURIComponent(did)}`, this.apiUrl);\n\n\t\t\tconst response = await (0, this.#fetch)(url, {\n\t\t\t\tsignal: options?.signal,\n\t\t\t\tcache: options?.noCache ? 'no-cache' : undefined,\n\t\t\t\tredirect: 'manual',\n\t\t\t\theaders: { accept: 'application/did+ld+json,application/json' },\n\t\t\t});\n\n\t\t\tif (response.status >= 300 && response.status < 400) {\n\t\t\t\tthrow new TypeError(`unexpected redirect`);\n\t\t\t}\n\n\t\t\tconst handled = await fetchDocHandler(response);\n\n\t\t\tjson = handled.json;\n\t\t} catch (cause) {\n\t\t\tif (cause instanceof FailedResponseError && cause.status === 404) {\n\t\t\t\tthrow new err.DocumentNotFoundError(did);\n\t\t\t}\n\n\t\t\tthrow new err.FailedDocumentResolutionError(did, { cause });\n\t\t}\n\n\t\treturn json;\n\t}\n}\n","export * from './doh-json.js';\nexport * from './errors.js';\nexport * from './pipeline.js';\nexport * from './transformers.js';\n","import * as v from '@badrap/valita';\n\nimport { pipe } from './pipeline.js';\nimport { isResponseOk, parseResponseAsJson, validateJsonWith } from './transformers.js';\n\nconst uint32 = v.number().assert((input) => Number.isInteger(input) && input >= 0 && input <= 2 ** 32 - 1);\n\nconst question = v.object({\n\tname: v.string(),\n\ttype: v.literal(16), // TXT\n});\n\nconst answer = v.object({\n\tname: v.string(),\n\ttype: v.literal(16), // TXT\n\tTTL: uint32,\n\tdata: v.string().chain((input) => {\n\t\treturn v.ok(input.replace(/^\"|\"$/g, '').replace(/\\\\\"/g, '\"'));\n\t}),\n});\n\nconst authority = v.object({\n\tname: v.string(),\n\ttype: uint32,\n\tTTL: uint32,\n\tdata: v.string(),\n});\n\n/** DoH JSON response schema for TXT record queries */\nexport const dohJsonTxtResult = v.object({\n\t/** DNS response code */\n\tStatus: uint32,\n\t/** whether response is truncated */\n\tTC: v.boolean(),\n\t/** whether recursive desired bit is set, always true for Google and Cloudflare DoH */\n\tRD: v.boolean(),\n\t/** whether recursive available bit is set, always true for Google and Cloudflare DoH */\n\tRA: v.boolean(),\n\t/** whether response data was validated with DNSSEC */\n\tAD: v.boolean(),\n\t/** whether client asked to disable DNSSEC validation */\n\tCD: v.boolean(),\n\t/** requested records */\n\tQuestion: v.tuple([question]),\n\t/** answers */\n\tAnswer: v.array(answer).optional(() => []),\n\t/** authority */\n\tAuthority: v.array(authority).optional(),\n\t/** comment from the DNS server */\n\tComment: v.union(v.string(), v.array(v.string())).optional(),\n});\n\nexport type DohJsonTxtResult = v.Infer<typeof dohJsonTxtResult>;\n\n/** fetch handler pipeline for DoH JSON TXT record responses */\nexport const fetchDohJsonTxt = pipe(\n\tisResponseOk,\n\tparseResponseAsJson(/^application\\/(dns-)?json$/, 16 * 1024),\n\tvalidateJsonWith(dohJsonTxtResult, { mode: 'passthrough' }),\n);\n","type Transformer<I, O = I> = (input: I) => Promise<O>;\n\ntype PipelineInput<T extends readonly Transformer<any>[]> = T extends [Transformer<infer I, any>, ...any[]]\n\t? I\n\t: T extends Transformer<infer I, any>[]\n\t\t? I\n\t\t: never;\n\ntype PipelineOutput<T extends readonly Transformer<any>[]> = T extends [...any[], Transformer<any, infer O>]\n\t? O\n\t: T extends Transformer<any, infer O>[]\n\t\t? O\n\t\t: never;\n\ntype Pipeline<\n\tF extends readonly Transformer<any>[],\n\tAcc extends readonly Transformer<any>[] = [],\n> = F extends [Transformer<infer I, infer O>]\n\t? [...Acc, Transformer<I, O>]\n\t: F extends [Transformer<infer A, any>, ...infer Tail]\n\t\t? Tail extends [Transformer<infer B, any>, ...any[]]\n\t\t\t? Pipeline<Tail, [...Acc, Transformer<A, B>]>\n\t\t\t: Acc\n\t\t: Acc;\n\nexport function pipe(): never;\nexport function pipe<T extends readonly Transformer<any>[]>(\n\t...pipeline: Pipeline<T> extends T ? T : Pipeline<T>\n): (input: PipelineInput<T>) => Promise<PipelineOutput<T>>;\nexport function pipe<T extends readonly Transformer<any>[]>(\n\t...pipeline: Pipeline<T> extends T ? T : Pipeline<T>\n): (input: PipelineInput<T>) => Promise<PipelineOutput<T>> {\n\treturn pipeline.reduce(pipeTwo);\n}\n\nconst pipeTwo = <I, O, X = unknown>(\n\tfirst: Transformer<I, X>,\n\tsecond: Transformer<X, O>,\n): ((input: I) => Promise<O>) => {\n\treturn (input) => first(input).then(second);\n};\n","import * as v from '@badrap/valita';\n\nimport * as err from './errors.js';\nimport { SizeLimitStream } from './streams/size-limit.js';\n\nexport type TextResponse = {\n\tresponse: Response;\n\ttext: string;\n};\n\nexport type ParsedJsonResponse<T = unknown> = {\n\tresponse: Response;\n\tjson: T;\n};\n\nexport const isResponseOk = async (response: Response): Promise<Response> => {\n\tif (response.ok) {\n\t\treturn response;\n\t}\n\n\tthrow new err.FailedResponseError(response);\n};\n\nexport const readResponseAsText =\n\t(maxSize: number) =>\n\tasync (response: Response): Promise<TextResponse> => {\n\t\tconst text = await readResponse(response, maxSize);\n\t\treturn { response, text };\n\t};\n\nexport const parseResponseAsJson =\n\t(typeRegex: RegExp, maxSize: number) =>\n\tasync (response: Response): Promise<ParsedJsonResponse> => {\n\t\tawait assertContentType(response, typeRegex);\n\n\t\tconst text = await readResponse(response, maxSize);\n\n\t\ttry {\n\t\t\tconst json = JSON.parse(text);\n\t\t\treturn { response, json };\n\t\t} catch (error) {\n\t\t\tthrow new err.ImproperResponseError(`unexpected json data`, { cause: error });\n\t\t}\n\t};\n\ntype ParseOptions = NonNullable<Parameters<v.Type['parse']>[1]>;\n\nexport const validateJsonWith =\n\t<T>(schema: v.Type<T>, options?: ParseOptions) =>\n\tasync (parsed: ParsedJsonResponse): Promise<ParsedJsonResponse<T>> => {\n\t\tconst json = schema.parse(parsed.json, options);\n\t\treturn { response: parsed.response, json };\n\t};\n\nconst assertContentType = async (response: Response, typeRegex: RegExp): Promise<void> => {\n\tconst type = response.headers.get('content-type')?.split(';', 1)[0].trim();\n\n\tif (type === undefined) {\n\t\tif (response.body) {\n\t\t\tawait response.body.cancel();\n\t\t}\n\n\t\tthrow new err.ImproperContentTypeError(null, `missing response content-type`);\n\t}\n\n\tif (!typeRegex.test(type)) {\n\t\tif (response.body) {\n\t\t\tawait response.body.cancel();\n\t\t}\n\n\t\tthrow new err.ImproperContentTypeError(type, `unexpected response content-type`);\n\t}\n};\n\nconst readResponse = async (response: Response, maxSize: number): Promise<string> => {\n\tconst rawSize = response.headers.get('content-length');\n\tif (rawSize !== null) {\n\t\tconst size = Number(rawSize);\n\n\t\tif (!Number.isSafeInteger(size) || size <= 0) {\n\t\t\tresponse.body?.cancel();\n\t\t\tthrow new err.ImproperContentLengthError(maxSize, null, `invalid response content-length`);\n\t\t}\n\n\t\tif (size > maxSize) {\n\t\t\tresponse.body?.cancel();\n\t\t\tthrow new err.ImproperContentLengthError(maxSize, size, `response content-length too large`);\n\t\t}\n\t}\n\n\tconst stream = response\n\t\t.body!.pipeThrough(new SizeLimitStream(maxSize))\n\t\t.pipeThrough(new TextDecoderStream());\n\n\tlet text = '';\n\tfor await (const chunk of createStreamIterator(stream)) {\n\t\ttext += chunk;\n\t}\n\n\treturn text;\n};\n\nconst createStreamIterator: <T>(stream: ReadableStream<T>) => AsyncIterableIterator<T> =\n\tSymbol.asyncIterator in ReadableStream.prototype\n\t\t? (stream) => stream[Symbol.asyncIterator]()\n\t\t: (stream) => {\n\t\t\t\tconst reader = stream.getReader();\n\n\t\t\t\treturn {\n\t\t\t\t\t[Symbol.asyncIterator]() {\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t},\n\t\t\t\t\tnext() {\n\t\t\t\t\t\treturn reader.read() as Promise<IteratorResult<any>>;\n\t\t\t\t\t},\n\t\t\t\t\tasync return() {\n\t\t\t\t\t\tawait reader.cancel();\n\t\t\t\t\t\treturn { done: true, value: undefined };\n\t\t\t\t\t},\n\t\t\t\t\tasync throw(error: unknown) {\n\t\t\t\t\t\tawait reader.cancel(error);\n\t\t\t\t\t\treturn { done: true, value: undefined };\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t};\n","export class FetchResponseError extends Error {\n\toverride name = 'FetchResponseError';\n}\n\nexport class FailedResponseError extends FetchResponseError {\n\toverride name = 'FailedResponseError';\n\n\tconstructor(public response: Response) {\n\t\tsuper(`got http ${response.status}`);\n\t}\n\n\tget status(): number {\n\t\treturn this.response.status;\n\t}\n}\n\nexport class ImproperContentTypeError extends FetchResponseError {\n\toverride name = 'ImproperContentTypeError';\n\n\tconstructor(\n\t\tpublic contentType: string | null,\n\t\treason: string,\n\t) {\n\t\tsuper(reason);\n\t}\n}\n\nexport class ImproperContentLengthError extends FetchResponseError {\n\toverride name = 'ImproperContentLengthError';\n\n\tconstructor(\n\t\tpublic expectedSize: number,\n\t\tpublic actualSize: number | null,\n\t\treason: string,\n\t) {\n\t\tsuper(reason);\n\t}\n}\n\nexport class ImproperResponseError extends FetchResponseError {\n\toverride name = 'ImproperResponseError';\n\n\tconstructor(reason: string, options?: ErrorOptions) {\n\t\tsuper(reason, options);\n\t}\n}\n","import * as err from '../errors.js';\n\nexport class SizeLimitStream extends TransformStream<Uint8Array<ArrayBuffer>, Uint8Array<ArrayBuffer>> {\n\tconstructor(maxSize: number) {\n\t\tlet bytesRead = 0;\n\n\t\tsuper({\n\t\t\ttransform(chunk, controller) {\n\t\t\t\tbytesRead += chunk.length;\n\n\t\t\t\tif (bytesRead > maxSize) {\n\t\t\t\t\tcontroller.error(\n\t\t\t\t\t\tnew err.ImproperContentLengthError(maxSize, bytesRead, `response content-length too large`),\n\t\t\t\t\t);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcontroller.enqueue(chunk);\n\t\t\t},\n\t\t});\n\t}\n}\n","import { defs } from '@atcute/identity';\nimport { isResponseOk, parseResponseAsJson, pipe, validateJsonWith } from '@atcute/util-fetch';\n\nexport const fetchDocHandler = pipe(\n\tisResponseOk,\n\tparseResponseAsJson(/^application\\/(did\\+ld\\+)?json$/, 20 * 1024),\n\tvalidateJsonWith(defs.didDocument, { mode: 'passthrough' }),\n);\n","import { webDidToDocumentUrl, type DidDocument } from '@atcute/identity';\nimport type { Did } from '@atcute/lexicons/syntax';\nimport { FailedResponseError } from '@atcute/util-fetch';\n\nimport * as err from '../../errors.js';\nimport type { DidDocumentResolver, ResolveDidDocumentOptions } from '../../types.js';\nimport { fetchDocHandler } from '../utils.js';\n\nexport interface WebDidDocumentResolverOptions {\n\tfetch?: typeof fetch;\n}\n\nexport class WebDidDocumentResolver implements DidDocumentResolver<'web'> {\n\t#fetch: typeof fetch;\n\n\tconstructor({ fetch: fetchThis = fetch }: WebDidDocumentResolverOptions = {}) {\n\t\tthis.#fetch = fetchThis;\n\t}\n\n\tasync resolve(did: Did<'web'>, options?: ResolveDidDocumentOptions): Promise<DidDocument> {\n\t\t// quick sanity check\n\t\tif (!did.startsWith('did:web:')) {\n\t\t\tthrow new err.UnsupportedDidMethodError(did);\n\t\t}\n\n\t\tlet json: DidDocument;\n\n\t\ttry {\n\t\t\tconst url = webDidToDocumentUrl(did);\n\n\t\t\tconst response = await (0, this.#fetch)(url, {\n\t\t\t\tsignal: options?.signal,\n\t\t\t\tcache: options?.noCache ? 'no-cache' : undefined,\n\t\t\t\tredirect: 'manual',\n\t\t\t\theaders: { accept: 'application/did+ld+json,application/json' },\n\t\t\t});\n\n\t\t\tif (response.status >= 300 && response.status < 400) {\n\t\t\t\tthrow new TypeError(`unexpected redirect`);\n\t\t\t}\n\n\t\t\tconst handled = await fetchDocHandler(response);\n\n\t\t\tjson = handled.json;\n\t\t} catch (cause) {\n\t\t\tif (cause instanceof FailedResponseError && cause.status === 404) {\n\t\t\t\tthrow new err.DocumentNotFoundError(did);\n\t\t\t}\n\n\t\t\tthrow new err.FailedDocumentResolutionError(did, { cause });\n\t\t}\n\n\t\treturn json;\n\t}\n}\n\nexport class AtprotoWebDidDocumentResolver implements DidDocumentResolver<'web'> {\n\t#fetch: typeof fetch;\n\n\tconstructor({ fetch: fetchThis = fetch }: WebDidDocumentResolverOptions = {}) {\n\t\tthis.#fetch = fetchThis;\n\t}\n\n\tasync resolve(did: Did<'web'>, options?: ResolveDidDocumentOptions): Promise<DidDocument> {\n\t\t// quick sanity check\n\t\tif (!did.startsWith('did:web:')) {\n\t\t\tthrow new err.UnsupportedDidMethodError(did);\n\t\t}\n\n\t\tconst [host, ...paths] = did.slice(8).split(':').map(decodeURIComponent);\n\t\tconst url = new URL(`https://${host}/.well-known/did.json`);\n\n\t\tif (paths.length > 0) {\n\t\t\tthrow new err.ImproperDidError(did);\n\t\t}\n\n\t\tlet json: DidDocument;\n\n\t\ttry {\n\t\t\tconst response = await (0, this.#fetch)(url, {\n\t\t\t\tsignal: options?.signal,\n\t\t\t\tcache: options?.noCache ? 'no-cache' : undefined,\n\t\t\t\tredirect: 'manual',\n\t\t\t\theaders: { accept: 'application/did+ld+json,application/json' },\n\t\t\t});\n\n\t\t\tif (response.status >= 300 && response.status < 400) {\n\t\t\t\tthrow new TypeError(`unexpected redirect`);\n\t\t\t}\n\n\t\t\tconst handled = await fetchDocHandler(response);\n\n\t\t\tjson = handled.json;\n\t\t} catch (cause) {\n\t\t\tif (cause instanceof FailedResponseError && cause.status === 404) {\n\t\t\t\tthrow new err.DocumentNotFoundError(did);\n\t\t\t}\n\n\t\t\tthrow new err.FailedDocumentResolutionError(did, { cause });\n\t\t}\n\n\t\treturn json;\n\t}\n}\n","import { defs, type DidDocument } from '@atcute/identity';\nimport type { Did } from '@atcute/lexicons/syntax';\nimport {\n\tFailedResponseError,\n\tisResponseOk,\n\tparseResponseAsJson,\n\tpipe,\n\tvalidateJsonWith,\n} from '@atcute/util-fetch';\n\nimport * as v from '@badrap/valita';\n\nimport * as err from '../../errors.js';\nimport type { DidDocumentResolver, ResolveDidDocumentOptions } from '../../types.js';\n\nconst fetchXrpcHandler = pipe(\n\tisResponseOk,\n\tparseResponseAsJson(/^application\\/json$/, 20 * 1024 + 16),\n\tvalidateJsonWith(v.object({ didDoc: defs.didDocument }), { mode: 'passthrough' }),\n);\n\nexport interface XrpcDidDocumentResolverOptions {\n\tserviceUrl: string;\n\tfetch?: typeof fetch;\n}\n\nexport class XrpcDidDocumentResolver implements DidDocumentResolver<string> {\n\treadonly serviceUrl: string;\n\t#fetch: typeof fetch;\n\n\tconstructor({ serviceUrl, fetch: fetchThis = fetch }: XrpcDidDocumentResolverOptions) {\n\t\tthis.serviceUrl = serviceUrl;\n\t\tthis.#fetch = fetchThis;\n\t}\n\n\tasync resolve(did: Did, options?: ResolveDidDocumentOptions): Promise<DidDocument> {\n\t\tlet json: DidDocument;\n\n\t\ttry {\n\t\t\tconst url = new URL(`/xrpc/com.atproto.identity.resolveDid`, this.serviceUrl);\n\t\t\turl.searchParams.set('did', did);\n\n\t\t\tconst response = await (0, this.#fetch)(url, {\n\t\t\t\tsignal: options?.signal,\n\t\t\t\tcache: options?.noCache ? 'no-cache' : undefined,\n\t\t\t\theaders: { accept: 'application/json' },\n\t\t\t});\n\n\t\t\tconst handled = await fetchXrpcHandler(response);\n\n\t\t\tjson = handled.json.didDoc;\n\t\t} catch (cause) {\n\t\t\tif (cause instanceof FailedResponseError && cause.status === 404) {\n\t\t\t\tthrow new err.DocumentNotFoundError(did);\n\t\t\t}\n\n\t\t\tthrow new err.FailedDocumentResolutionError(did, { cause });\n\t\t}\n\n\t\treturn json;\n\t}\n}\n","import type { AtprotoDid, Handle } from '@atcute/lexicons/syntax';\n\nimport * as err from '../errors.js';\nimport type { HandleResolver, ResolveHandleOptions } from '../types.js';\n\nexport type CompositeStrategy = 'http-first' | 'dns-first' | 'race' | 'both';\n\nexport interface CompositeHandleResolverOptions {\n\t/** controls how the resolution is done, defaults to 'race' */\n\tstrategy?: CompositeStrategy;\n\t/** the methods to use for resolving the handle. */\n\tmethods: Record<'http' | 'dns', HandleResolver>;\n}\n\nexport class CompositeHandleResolver implements HandleResolver {\n\t#methods: Record<'http' | 'dns', HandleResolver>;\n\tstrategy: CompositeStrategy;\n\n\tconstructor({ methods, strategy = 'race' }: CompositeHandleResolverOptions) {\n\t\tthis.#methods = methods;\n\t\tthis.strategy = strategy;\n\t}\n\n\tasync resolve(handle: Handle, options?: ResolveHandleOptions): Promise<AtprotoDid> {\n\t\tconst { http, dns } = this.#methods;\n\n\t\tconst parentSignal = options?.signal;\n\t\tconst controller = new AbortController();\n\t\tif (parentSignal) {\n\t\t\tparentSignal.addEventListener('abort', () => controller.abort(), { signal: controller.signal });\n\t\t}\n\n\t\tconst dnsPromise = dns.resolve(handle, { ...options, signal: controller.signal });\n\t\tconst httpPromise = http.resolve(handle, { ...options, signal: controller.signal });\n\n\t\tswitch (this.strategy) {\n\t\t\tcase 'race': {\n\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\tdnsPromise.then(\n\t\t\t\t\t\t(did) => {\n\t\t\t\t\t\t\tcontroller.abort();\n\t\t\t\t\t\t\tresolve(did);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => resolve(httpPromise),\n\t\t\t\t\t);\n\n\t\t\t\t\thttpPromise.then(\n\t\t\t\t\t\t(did) => {\n\t\t\t\t\t\t\tcontroller.abort();\n\t\t\t\t\t\t\tresolve(did);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => resolve(dnsPromise),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t\tcase 'dns-first': {\n\t\t\t\thttpPromise.catch(noop);\n\n\t\t\t\tconst resolved = await dnsPromise.catch(noop);\n\t\t\t\tif (resolved) {\n\t\t\t\t\tcontroller.abort();\n\t\t\t\t\treturn resolved;\n\t\t\t\t}\n\n\t\t\t\treturn httpPromise;\n\t\t\t}\n\t\t\tcase 'http-first': {\n\t\t\t\tdnsPromise.catch(noop);\n\n\t\t\t\tconst resolved = await httpPromise.catch(noop);\n\t\t\t\tif (resolved) {\n\t\t\t\t\tcontroller.abort();\n\t\t\t\t\treturn resolved;\n\t\t\t\t}\n\n\t\t\t\treturn dnsPromise;\n\t\t\t}\n\t\t\tcase 'both': {\n\t\t\t\tconst [dnsResponse, httpResponse] = await Promise.allSettled([dnsPromise, httpPromise]);\n\n\t\t\t\tconst dnsDid = dnsResponse.status === 'fulfilled' ? dnsResponse.value : undefined;\n\t\t\t\tconst httpDid = httpResponse.status === 'fulfilled' ? httpResponse.value : undefined;\n\n\t\t\t\tif (dnsDid && httpDid && dnsDid !== httpDid) {\n\t\t\t\t\tthrow new err.AmbiguousHandleError(handle);\n\t\t\t\t}\n\n\t\t\t\treturn dnsDid || httpDid || dnsPromise;\n\t\t\t}\n\t\t}\n\t}\n}\n\nconst noop = () => {};\n","import { isAtprotoDid } from '@atcute/identity';\nimport type { AtprotoDid, Handle } from '@atcute/lexicons/syntax';\nimport { type DohJsonTxtResult, fetchDohJsonTxt } from '@atcute/util-fetch';\n\nimport * as err from '../../errors.js';\nimport type { HandleResolver, ResolveHandleOptions } from '../../types.js';\n\nconst SUBDOMAIN = '_atproto';\nconst PREFIX = 'did=';\n\nexport interface DohJsonHandleResolverOptions {\n\tdohUrl: string;\n\tfetch?: typeof fetch;\n}\n\nexport class DohJsonHandleResolver implements HandleResolver {\n\treadonly dohUrl: string;\n\t#fetch: typeof fetch;\n\n\tconstructor({ dohUrl, fetch: fetchThis = fetch }: DohJsonHandleResolverOptions) {\n\t\tthis.dohUrl = dohUrl;\n\t\tthis.#fetch = fetchThis;\n\t}\n\n\tasync resolve(handle: Handle, options?: ResolveHandleOptions): Promise<AtprotoDid> {\n\t\tlet json: DohJsonTxtResult;\n\n\t\ttry {\n\t\t\tconst url = new URL(this.dohUrl);\n\t\t\turl.searchParams.set('name', `${SUBDOMAIN}.${handle}`);\n\t\t\turl.searchParams.set('type', 'TXT');\n\n\t\t\tconst response = await (0, this.#fetch)(url, {\n\t\t\t\tsignal: options?.signal,\n\t\t\t\tcache: options?.noCache ? 'no-cache' : undefined,\n\t\t\t\theaders: { accept: 'application/dns-json' },\n\t\t\t});\n\n\t\t\tconst handled = await fetchDohJsonTxt(response);\n\n\t\t\tjson = handled.json;\n\t\t} catch (cause) {\n\t\t\tthrow new err.FailedHandleResolutionError(handle, { cause });\n\t\t}\n\n\t\tconst status = json.Status;\n\t\tconst answers = json.Answer;\n\n\t\tif (status !== 0 /* NOERROR */) {\n\t\t\tif (status === 3 /* NXDOMAIN */) {\n\t\t\t\tthrow new err.DidNotFoundError(handle);\n\t\t\t}\n\n\t\t\tthrow new err.FailedHandleResolutionError(handle, {\n\t\t\t\tcause: new TypeError(`dns returned ${status}`),\n\t\t\t});\n\t\t}\n\n\t\tfor (let i = 0, il = answers.length; i < il; i++) {\n\t\t\tconst answer = answers[i];\n\t\t\tconst data = answer.data;\n\n\t\t\tif (!data.startsWith(PREFIX)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor (let j = i + 1; j < il; j++) {\n\t\t\t\tconst data = answers[j].data;\n\t\t\t\tif (data.startsWith(PREFIX)) {\n\t\t\t\t\tthrow new err.AmbiguousHandleError(handle);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst did = data.slice(PREFIX.length);\n\t\t\tif (!isAtprotoDid(did)) {\n\t\t\t\tthrow new err.InvalidResolvedHandleError(handle, did);\n\t\t\t}\n\n\t\t\treturn did;\n\t\t}\n\n\t\t// theoretically this shouldn't happen, it should've returned NXDOMAIN\n\t\tthrow new err.DidNotFoundError(handle);\n\t}\n}\n","import { isAtprotoDid } from '@atcute/identity';\nimport type { AtprotoDid, Handle } from '@atcute/lexicons/syntax';\nimport { FailedResponseError, isResponseOk, pipe, readResponseAsText } from '@atcute/util-fetch';\n\nimport * as err from '../../errors.js';\nimport type { HandleResolver, ResolveHandleOptions } from '../../types.js';\n\nexport interface WellKnownHandleResolverOptions {\n\tfetch?: typeof fetch;\n}\n\nconst fetchWellKnownHandler = pipe(isResponseOk, readResponseAsText(2048 + 16));\n\nexport class WellKnownHandleResolver implements HandleResolver {\n\t#fetch: typeof fetch;\n\n\tconstructor({ fetch: fetchThis = fetch }: WellKnownHandleResolverOptions = {}) {\n\t\tthis.#fetch = fetchThis;\n\t}\n\n\tasync resolve(handle: Handle, options?: ResolveHandleOptions): Promise<AtprotoDid> {\n\t\tlet text: string;\n\n\t\ttry {\n\t\t\tconst url = new URL('/.well-known/atproto-did', `https://${handle}`);\n\n\t\t\tconst response = await (0, this.#fetch)(url, {\n\t\t\t\tsignal: options?.signal,\n\t\t\t\tcache: options?.noCache ? 'no-cache' : undefined,\n\t\t\t\tredirect: 'manual',\n\t\t\t});\n\n\t\t\tif (response.status >= 300 && response.status < 400) {\n\t\t\t\tthrow new TypeError(`unexpected redirect`);\n\t\t\t}\n\n\t\t\tconst handled = await fetchWellKnownHandler(response);\n\n\t\t\ttext = handled.text;\n\t\t} catch (cause) {\n\t\t\tif (cause instanceof FailedResponseError && cause.status === 404) {\n\t\t\t\tthrow new err.DidNotFoundError(handle);\n\t\t\t}\n\n\t\t\tthrow new err.FailedHandleResolutionError(handle, { cause });\n\t\t}\n\n\t\tconst did = text.split('\\n')[0]!.trim();\n\t\tif (!isAtprotoDid(did)) {\n\t\t\tthrow new err.InvalidResolvedHandleError(handle, did);\n\t\t}\n\n\t\treturn did;\n\t}\n}\n","import * as v from '@badrap/valita';\n\nimport { isAtprotoDid } from '@atcute/identity';\nimport type { AtprotoDid, Handle } from '@atcute/lexicons/syntax';\nimport {\n\tFailedResponseError,\n\tisResponseOk,\n\tparseResponseAsJson,\n\tpipe,\n\tvalidateJsonWith,\n} from '@atcute/util-fetch';\n\nimport * as err from '../../errors.js';\nimport type { HandleResolver, ResolveHandleOptions } from '../../types.js';\n\nconst response = v.object({\n\tdid: v.string().assert((input) => isAtprotoDid(input)),\n});\n\nconst fetchXrpcHandler = pipe(\n\tisResponseOk,\n\tparseResponseAsJson(/^application\\/json$/, 4 * 1024),\n\tvalidateJsonWith(response, { mode: 'passthrough' }),\n);\n\nexport interface XrpcHandleResolverOptions {\n\tserviceUrl: string;\n\tfetch?: typeof fetch;\n}\n\nexport class XrpcHandleResolver implements HandleResolver {\n\treadonly serviceUrl: string;\n\t#fetch: typeof fetch;\n\n\tconstructor({ serviceUrl, fetch: fetchThis = fetch }: XrpcHandleResolverOptions) {\n\t\tthis.serviceUrl = serviceUrl;\n\t\tthis.#fetch = fetchThis;\n\t}\n\n\tasync resolve(handle: Handle, options?: ResolveHandleOptions): Promise<AtprotoDid> {\n\t\tlet json: v.Infer<typeof response>;\n\n\t\ttry {\n\t\t\tconst url = new URL(`/xrpc/com.atproto.identity.resolveHandle`, this.serviceUrl);\n\t\t\turl.searchParams.set('handle', handle);\n\n\t\t\tconst response = await (0, this.#fetch)(url, {\n\t\t\t\tsignal: options?.signal,\n\t\t\t\tcache: options?.noCache ? 'no-cache' : undefined,\n\t\t\t\theaders: { accept: 'application/json' },\n\t\t\t});\n\n\t\t\tconst handled = await fetchXrpcHandler(response);\n\n\t\t\tjson = handled.json;\n\t\t} catch (cause) {\n\t\t\tif (cause instanceof FailedResponseError && cause.status === 400) {\n\t\t\t\tthrow new err.DidNotFoundError(handle);\n\t\t\t}\n\n\t\t\tthrow new err.FailedHandleResolutionError(handle, { cause });\n\t\t}\n\n\t\treturn json.did;\n\t}\n}\n","export {};\n//# sourceMappingURL=types.js.map"],"mappings":"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","names":["ok","err","ValitaError","literal","object","record","array","tuple","union","expiresAt","response","fromBase64Url","toBase64Url","HAS_NATIVE_SUPPORT","fromBase64Url","HAS_NATIVE_SUPPORT","toBase64Url","_fromCharCode","ALPHABET","toBase64Url","toBase64Url","toBase64Url","err","err","response","pending","response","url","response","err","fromBase64Url","value","err","response","response","service","isUrlParseSupported","err","FetchResponseError","response","response","response","response","fetchXrpcHandler","response","err"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-CHYBYJZ3.js.map"}
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-CMU4QLMC.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-CMU4QLMC.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-CMU4QLMC.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-CMU4QLMC.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-CPN2PPDQ.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-CPN2PPDQ.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-CPN2PPDQ.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-CPN2PPDQ.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-CPS76EE2.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-CPS76EE2.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-CPS76EE2.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-CPS76EE2.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-CW32SP4O.js
··· 1 + ../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-CW32SP4O.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-CW32SP4O.js.map
··· 1 + ../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-CW32SP4O.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-DUCTMCPX.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-DUCTMCPX.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-DUCTMCPX.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-DUCTMCPX.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-EEUCFWD4.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-EEUCFWD4.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-EEUCFWD4.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-EEUCFWD4.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-EEVL24MR.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-EEVL24MR.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-EEVL24MR.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-EEVL24MR.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-EPB7MNYY.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-EPB7MNYY.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-EPB7MNYY.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-EPB7MNYY.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-ERP4MUHU.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-ERP4MUHU.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-ERP4MUHU.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-ERP4MUHU.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-ET5MSOLB.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-ET5MSOLB.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-ET5MSOLB.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-ET5MSOLB.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-EXQ7VALC.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-EXQ7VALC.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-EXQ7VALC.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-EXQ7VALC.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-F22BR7N4.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-F22BR7N4.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-F22BR7N4.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-F22BR7N4.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-FAW4EB7G.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-FAW4EB7G.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-FAW4EB7G.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-FAW4EB7G.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-FPIXTJ7E.js
··· 1 + ../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-FPIXTJ7E.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-FPIXTJ7E.js.map
··· 1 + ../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-FPIXTJ7E.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-FVLUJBZP.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-FVLUJBZP.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-FVLUJBZP.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-FVLUJBZP.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-FZQXS3RE.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-FZQXS3RE.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-FZQXS3RE.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-FZQXS3RE.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-G2ZO6QIY.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-G2ZO6QIY.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-G2ZO6QIY.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-G2ZO6QIY.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-G56PUJUJ.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-G56PUJUJ.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-G56PUJUJ.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-G56PUJUJ.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-GX3WPNEX.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-GX3WPNEX.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-GX3WPNEX.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-GX3WPNEX.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-H6TRVIGW.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-H6TRVIGW.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-H6TRVIGW.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-H6TRVIGW.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-HBALNHVO.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-HBALNHVO.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-HBALNHVO.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-HBALNHVO.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-HN4F5JEZ.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-HN4F5JEZ.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-HN4F5JEZ.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-HN4F5JEZ.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-HVHVAQ4N.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-HVHVAQ4N.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-HVHVAQ4N.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-HVHVAQ4N.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-IGROFVGC.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-IGROFVGC.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-IGROFVGC.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-IGROFVGC.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-IZOBPV2S.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-IZOBPV2S.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-IZOBPV2S.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-IZOBPV2S.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-IZZUYQWS.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-IZZUYQWS.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-IZZUYQWS.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-IZZUYQWS.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-J34EA5F4.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-J34EA5F4.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-J34EA5F4.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-J34EA5F4.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-J7PU3ISY.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-J7PU3ISY.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-J7PU3ISY.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-J7PU3ISY.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-JBHW662S.js
··· 1 + ../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-JBHW662S.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-JBHW662S.js.map
··· 1 + ../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/chunk-JBHW662S.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-JSOX7OQB.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-JSOX7OQB.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-JSOX7OQB.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-JSOX7OQB.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-K5K7YTT4.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-K5K7YTT4.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-K5K7YTT4.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-K5K7YTT4.js.map
+679
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-KDXZLVT6.js
··· 1 + import { 2 + OAuthUserAgent, 3 + login, 4 + logout, 5 + restoreOrFinalize 6 + } from "./chunk-CHYBYJZ3.js"; 7 + import { 8 + outputManager 9 + } from "./chunk-5UTOUDDD.js"; 10 + import { 11 + BroadcastableDiffuseElement 12 + } from "./chunk-TI6SX5NQ.js"; 13 + import { 14 + computed, 15 + signal 16 + } from "./chunk-IZOBPV2S.js"; 17 + import { 18 + __name, 19 + init_Buffer, 20 + init_process 21 + } from "./chunk-FZQXS3RE.js"; 22 + 23 + // components/output/raw/atproto/element.js 24 + init_Buffer(); 25 + init_process(); 26 + 27 + // ../node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/dist/index.js 28 + init_Buffer(); 29 + init_process(); 30 + 31 + // ../node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/dist/client.js 32 + init_Buffer(); 33 + init_process(); 34 + 35 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/validations/index.js 36 + init_Buffer(); 37 + init_process(); 38 + 39 + // ../node_modules/.deno/@atcute+util-text@1.1.1/node_modules/@atcute/util-text/dist/index.js 40 + init_Buffer(); 41 + init_process(); 42 + var segmenter = new Intl.Segmenter(); 43 + 44 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/interfaces/bytes.js 45 + init_Buffer(); 46 + init_process(); 47 + 48 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/interfaces/index.js 49 + init_Buffer(); 50 + init_process(); 51 + 52 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/interfaces/blob.js 53 + init_Buffer(); 54 + init_process(); 55 + 56 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/interfaces/cid-link.js 57 + init_Buffer(); 58 + init_process(); 59 + 60 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/validations/utils.js 61 + init_Buffer(); 62 + init_process(); 63 + 64 + // ../node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/dist/validations/index.js 65 + var xrpcSchemaGenerated = false; 66 + var ok = /* @__PURE__ */ __name(/* @__NO_SIDE_EFFECTS__ */ (value) => { 67 + return { ok: true, value }; 68 + }, "ok"); 69 + var FLAG_EMPTY = 0; 70 + var FLAG_ABORT_EARLY = 1 << 0; 71 + var cloneIssueWithPath = /* @__PURE__ */ __name((issue, path) => { 72 + const { ok: _ok, msg: _fmt, ...clone } = issue; 73 + return { ...clone, path }; 74 + }, "cloneIssueWithPath"); 75 + var collectIssues = /* @__PURE__ */ __name((tree, path = [], issues = []) => { 76 + for (; ; ) { 77 + switch (tree.code) { 78 + case "join": { 79 + collectIssues(tree.left, path.slice(), issues); 80 + tree = tree.right; 81 + continue; 82 + } 83 + case "prepend": { 84 + path.push(tree.key); 85 + tree = tree.tree; 86 + continue; 87 + } 88 + default: { 89 + issues.push(cloneIssueWithPath(tree, path)); 90 + return issues; 91 + } 92 + } 93 + } 94 + }, "collectIssues"); 95 + var countIssues = /* @__PURE__ */ __name((tree) => { 96 + let count = 0; 97 + for (; ; ) { 98 + switch (tree.code) { 99 + case "join": { 100 + count += countIssues(tree.left); 101 + tree = tree.right; 102 + continue; 103 + } 104 + case "prepend": { 105 + tree = tree.tree; 106 + continue; 107 + } 108 + default: { 109 + return count + 1; 110 + } 111 + } 112 + } 113 + }, "countIssues"); 114 + var formatIssueTree = /* @__PURE__ */ __name((tree) => { 115 + let path = ""; 116 + let count = 0; 117 + for (; ; ) { 118 + switch (tree.code) { 119 + case "join": { 120 + count += countIssues(tree.right); 121 + tree = tree.left; 122 + continue; 123 + } 124 + case "prepend": { 125 + path += `.${tree.key}`; 126 + tree = tree.tree; 127 + continue; 128 + } 129 + } 130 + break; 131 + } 132 + const message = tree.msg(); 133 + let msg = `${tree.code} at ${path || "."} (${message})`; 134 + if (count > 0) { 135 + msg += ` (+${count} other issue(s))`; 136 + } 137 + return msg; 138 + }, "formatIssueTree"); 139 + var ValidationError = class extends Error { 140 + static { 141 + __name(this, "ValidationError"); 142 + } 143 + name = "ValidationError"; 144 + #issueTree; 145 + constructor(issueTree) { 146 + super(); 147 + this.#issueTree = issueTree; 148 + } 149 + get message() { 150 + return formatIssueTree(this.#issueTree); 151 + } 152 + get issues() { 153 + return collectIssues(this.#issueTree); 154 + } 155 + }; 156 + var ErrImpl = class { 157 + static { 158 + __name(this, "ErrImpl"); 159 + } 160 + ok = false; 161 + #issueTree; 162 + constructor(issueTree) { 163 + this.#issueTree = issueTree; 164 + } 165 + get message() { 166 + return formatIssueTree(this.#issueTree); 167 + } 168 + get issues() { 169 + return collectIssues(this.#issueTree); 170 + } 171 + throw() { 172 + throw new ValidationError(this.#issueTree); 173 + } 174 + }; 175 + var safeParse = /* @__PURE__ */ __name(/* @__NO_SIDE_EFFECTS__ */ (schema, input) => { 176 + const r = schema["~run"](input, FLAG_EMPTY); 177 + if (r === void 0) { 178 + return /* @__PURE__ */ ok(input); 179 + } 180 + if (r.ok) { 181 + return r; 182 + } 183 + return new ErrImpl(r); 184 + }, "safeParse"); 185 + 186 + // ../node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/dist/fetch-handler.js 187 + init_Buffer(); 188 + init_process(); 189 + var buildFetchHandler = /* @__PURE__ */ __name((handler) => { 190 + if (typeof handler === "object") { 191 + return handler.handle.bind(handler); 192 + } 193 + return handler; 194 + }, "buildFetchHandler"); 195 + 196 + // ../node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/dist/client.js 197 + var JSON_CONTENT_TYPE_RE = /\bapplication\/json\b/; 198 + var Client = class _Client { 199 + static { 200 + __name(this, "Client"); 201 + } 202 + handler; 203 + proxy; 204 + constructor({ handler, proxy = null }) { 205 + this.handler = buildFetchHandler(handler); 206 + this.proxy = proxy; 207 + } 208 + /** 209 + * clones this XRPC client 210 + * @param opts options to merge with 211 + * @returns the cloned XRPC client 212 + */ 213 + clone({ handler = this.handler, proxy = this.proxy } = {}) { 214 + return new _Client({ handler, proxy }); 215 + } 216 + get(name, options = {}) { 217 + return this.#perform("get", name, options); 218 + } 219 + post(name, options = {}) { 220 + return this.#perform("post", name, options); 221 + } 222 + async call(schema, options = {}) { 223 + if (!xrpcSchemaGenerated) { 224 + return; 225 + } 226 + if ("mainSchema" in schema) { 227 + schema = schema.mainSchema; 228 + } 229 + if (schema.params !== null) { 230 + const paramsResult = safeParse(schema.params, options.params); 231 + if (!paramsResult.ok) { 232 + throw new ClientValidationError("params", paramsResult); 233 + } 234 + } 235 + if (schema.type === "xrpc_procedure" && schema.input?.type === "lex") { 236 + const inputResult = safeParse(schema.input.schema, options.input); 237 + if (!inputResult.ok) { 238 + throw new ClientValidationError("input", inputResult); 239 + } 240 + } 241 + const isQuery = schema.type === "xrpc_query"; 242 + const method = isQuery ? "get" : "post"; 243 + if (options.as === void 0 && schema.output?.type === "blob") { 244 + throw new TypeError(`\`as\` option is required for endpoints returning blobs`); 245 + } 246 + const format = options.as !== void 0 ? options.as : schema.output?.type === "lex" ? "json" : null; 247 + const response = await this.#perform(method, schema.nsid, { 248 + params: options.params, 249 + input: isQuery ? void 0 : options.input, 250 + as: format, 251 + signal: options.signal, 252 + headers: options.headers 253 + }); 254 + if (format === "json" && response.ok && schema.output?.type === "lex") { 255 + const outputResult = safeParse(schema.output.schema, response.data); 256 + if (!outputResult.ok) { 257 + throw new ClientValidationError("output", outputResult); 258 + } 259 + return { 260 + ok: true, 261 + status: response.status, 262 + headers: response.headers, 263 + data: outputResult.value 264 + }; 265 + } 266 + return response; 267 + } 268 + async #perform(method, name, { signal: signal2, as: format = "json", headers, input, params }) { 269 + const isWebInput = input && (input instanceof Blob || ArrayBuffer.isView(input) || input instanceof ArrayBuffer || input instanceof ReadableStream); 270 + const url = `/xrpc/${name}` + _constructSearchParams(params); 271 + const response = await this.handler(url, { 272 + method, 273 + signal: signal2, 274 + body: input && !isWebInput ? JSON.stringify(input) : input, 275 + headers: _mergeHeaders(headers, { 276 + "content-type": input && !isWebInput ? "application/json" : null, 277 + "atproto-proxy": _constructProxyHeader(this.proxy) 278 + }), 279 + duplex: input instanceof ReadableStream ? "half" : void 0 280 + }); 281 + { 282 + const status = response.status; 283 + const headers2 = response.headers; 284 + const type = headers2.get("content-type"); 285 + if (status !== 200) { 286 + let json; 287 + if (type != null && JSON_CONTENT_TYPE_RE.test(type)) { 288 + try { 289 + const parsed = await response.json(); 290 + if (isXRPCErrorPayload(parsed)) { 291 + json = parsed; 292 + } 293 + } catch { 294 + } 295 + } else { 296 + await response.body?.cancel(); 297 + } 298 + return { 299 + ok: false, 300 + status, 301 + headers: headers2, 302 + data: json ?? { 303 + error: `UnknownXRPCError`, 304 + message: `Request failed with status code ${status}` 305 + } 306 + }; 307 + } 308 + { 309 + let data; 310 + switch (format) { 311 + case "json": { 312 + if (type != null && JSON_CONTENT_TYPE_RE.test(type)) { 313 + data = await response.json(); 314 + } else { 315 + await response.body?.cancel(); 316 + throw new TypeError(`Invalid response content-type (got ${type})`); 317 + } 318 + break; 319 + } 320 + case null: { 321 + data = null; 322 + await response.body?.cancel(); 323 + break; 324 + } 325 + case "blob": { 326 + data = await response.blob(); 327 + break; 328 + } 329 + case "bytes": { 330 + data = new Uint8Array(await response.arrayBuffer()); 331 + break; 332 + } 333 + case "stream": { 334 + data = response.body; 335 + break; 336 + } 337 + } 338 + return { 339 + ok: true, 340 + status, 341 + headers: headers2, 342 + data 343 + }; 344 + } 345 + } 346 + } 347 + }; 348 + var _constructSearchParams = /* @__PURE__ */ __name((params) => { 349 + let searchParams; 350 + for (const key in params) { 351 + const value = params[key]; 352 + if (value !== void 0) { 353 + searchParams ??= new URLSearchParams(); 354 + if (Array.isArray(value)) { 355 + for (let idx = 0, len = value.length; idx < len; idx++) { 356 + const val = value[idx]; 357 + searchParams.append(key, "" + val); 358 + } 359 + } else { 360 + searchParams.set(key, "" + value); 361 + } 362 + } 363 + } 364 + return searchParams ? `?` + searchParams.toString() : ""; 365 + }, "_constructSearchParams"); 366 + var _constructProxyHeader = /* @__PURE__ */ __name((proxy) => { 367 + if (proxy != null) { 368 + return `${proxy.did}${proxy.serviceId}`; 369 + } 370 + return null; 371 + }, "_constructProxyHeader"); 372 + var _mergeHeaders = /* @__PURE__ */ __name((init, defaults) => { 373 + let headers; 374 + for (const name in defaults) { 375 + const value = defaults[name]; 376 + if (value !== null) { 377 + headers ??= new Headers(init); 378 + if (!headers.has(name)) { 379 + headers.set(name, value); 380 + } 381 + } 382 + } 383 + return headers ?? init; 384 + }, "_mergeHeaders"); 385 + var isXRPCErrorPayload = /* @__PURE__ */ __name((input) => { 386 + if (typeof input !== "object" || input == null) { 387 + return false; 388 + } 389 + const kindType = typeof input.error; 390 + const messageType = typeof input.message; 391 + return kindType === "string" && (messageType === "undefined" || messageType === "string"); 392 + }, "isXRPCErrorPayload"); 393 + var ok2 = /* @__PURE__ */ __name((input) => { 394 + if (input instanceof Promise) { 395 + return input.then(ok2); 396 + } 397 + if (input.ok) { 398 + return input.data; 399 + } 400 + throw new ClientResponseError(input); 401 + }, "ok"); 402 + var ClientResponseError = class extends Error { 403 + static { 404 + __name(this, "ClientResponseError"); 405 + } 406 + /** error name returned by service */ 407 + error; 408 + /** error message returned by service */ 409 + description; 410 + /** response status */ 411 + status; 412 + /** response headers */ 413 + headers; 414 + constructor({ status, headers = new Headers(), data }) { 415 + super(`${data.error} > ${data.message ?? "(unspecified description)"}`); 416 + this.name = "ClientResponseError"; 417 + this.error = data.error; 418 + this.description = data.message; 419 + this.status = status; 420 + this.headers = headers; 421 + } 422 + }; 423 + var ClientValidationError = class extends Error { 424 + static { 425 + __name(this, "ClientValidationError"); 426 + } 427 + /** validation target (params, input, or output) */ 428 + target; 429 + /** validation result */ 430 + result; 431 + constructor(target, result) { 432 + super(`validation failed for ${target}: ${result.message}`); 433 + this.name = "ClientValidationError"; 434 + this.target = target; 435 + this.result = result; 436 + } 437 + }; 438 + 439 + // ../node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/dist/credential-manager.js 440 + init_Buffer(); 441 + init_process(); 442 + 443 + // ../node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/dist/utils/jwt.js 444 + init_Buffer(); 445 + init_process(); 446 + 447 + // components/output/raw/atproto/element.js 448 + var ATProtoOutput = class extends BroadcastableDiffuseElement { 449 + static { 450 + __name(this, "ATProtoOutput"); 451 + } 452 + static NAME = "diffuse/output/raw/atproto"; 453 + #manager; 454 + /** @type {PromiseWithResolvers<void>} */ 455 + #authenticated = Promise.withResolvers(); 456 + /** @type {Client | null} */ 457 + #rpc = null; 458 + /** @type {OAuthUserAgent | null} */ 459 + #agent = null; 460 + constructor() { 461 + super(); 462 + this.#manager = outputManager({ 463 + facets: { 464 + empty: /* @__PURE__ */ __name(() => [], "empty"), 465 + get: /* @__PURE__ */ __name(() => this.#listRecords("sh.diffuse.output.facet"), "get"), 466 + put: /* @__PURE__ */ __name((data) => this.#putRecords("sh.diffuse.output.facet", data), "put") 467 + }, 468 + playlists: { 469 + empty: /* @__PURE__ */ __name(() => [], "empty"), 470 + get: /* @__PURE__ */ __name(() => this.#listRecords("sh.diffuse.output.playlist"), "get"), 471 + put: /* @__PURE__ */ __name((data) => this.#putRecords("sh.diffuse.output.playlist", data), "put") 472 + }, 473 + themes: { 474 + empty: /* @__PURE__ */ __name(() => [], "empty"), 475 + get: /* @__PURE__ */ __name(() => this.#listRecords("sh.diffuse.output.theme"), "get"), 476 + put: /* @__PURE__ */ __name((data) => this.#putRecords("sh.diffuse.output.theme", data), "put") 477 + }, 478 + tracks: { 479 + empty: /* @__PURE__ */ __name(() => [], "empty"), 480 + get: /* @__PURE__ */ __name(() => this.#listRecords("sh.diffuse.output.track"), "get"), 481 + put: /* @__PURE__ */ __name((data) => this.#putRecords("sh.diffuse.output.track", data), "put") 482 + } 483 + }); 484 + this.facets = this.#manager.facets; 485 + this.playlists = this.#manager.playlists; 486 + this.themes = this.#manager.themes; 487 + this.tracks = this.#manager.tracks; 488 + } 489 + // SIGNALS 490 + #did = signal( 491 + /** @type {string | null} */ 492 + null 493 + ); 494 + // STATE 495 + did = this.#did.get; 496 + ready = computed(() => { 497 + return this.#did.value !== null && navigator.onLine; 498 + }); 499 + // LIFECYCLE 500 + /** @override */ 501 + connectedCallback() { 502 + if (this.hasAttribute("group")) { 503 + const actions = this.broadcast(this.nameWithGroup, { 504 + put: { strategy: "replicate", fn: this.#putIncoming } 505 + }); 506 + if (actions) { 507 + this.#put = this.#putOutgoing(actions.put); 508 + } 509 + } 510 + super.connectedCallback(); 511 + this.#tryRestore(); 512 + } 513 + // AUTH 514 + async #tryRestore() { 515 + await this.whenConnected(); 516 + const session = await restoreOrFinalize(); 517 + if (session) { 518 + this.#setSession(session); 519 + } 520 + } 521 + /** 522 + * @param {import("@atcute/oauth-browser-client").Session} session 523 + */ 524 + #setSession(session) { 525 + this.#agent = new OAuthUserAgent(session); 526 + this.#rpc = new Client({ handler: this.#agent }); 527 + this.#did.value = session.info.sub; 528 + this.#authenticated.resolve(); 529 + } 530 + /** 531 + * Initiate the OAuth flow. 532 + * Navigates the browser to the authorization server. 533 + * 534 + * @param {string} handle 535 + */ 536 + async login(handle) { 537 + await login(handle); 538 + } 539 + /** 540 + * Sign out and revoke the current session. 541 + */ 542 + async logout() { 543 + if (this.#agent) { 544 + await logout(this.#agent); 545 + this.#agent = null; 546 + this.#authenticated = Promise.withResolvers(); 547 + this.#did.value = null; 548 + this.#rpc = null; 549 + } 550 + } 551 + // RECORDS 552 + /** 553 + * @template T 554 + * @param {string} collection 555 + * @returns {Promise<T[]>} 556 + */ 557 + async #listRecords(collection) { 558 + if (!this.#rpc || !this.#did.value) return []; 559 + const records = []; 560 + let cursor; 561 + do { 562 + const page = await ok2(this.#rpc.get( 563 + "com.atproto.repo.listRecords", 564 + { params: { repo: this.#did.value, collection, limit: 100, cursor } } 565 + )); 566 + for (const record of page.records) { 567 + records.push(record.value); 568 + } 569 + cursor = page.cursor; 570 + } while (cursor); 571 + return records; 572 + } 573 + /** 574 + * @param {string} collection 575 + * @param {Array<{ id: string }>} data 576 + */ 577 + async #putRecordsSync(collection, data) { 578 + if (!this.#rpc || !this.#did.value) return; 579 + const existing = /* @__PURE__ */ new Map(); 580 + let cursor; 581 + do { 582 + const page = await ok2(this.#rpc.get( 583 + "com.atproto.repo.listRecords", 584 + { params: { repo: this.#did.value, collection, limit: 100, cursor } } 585 + )); 586 + for (const record of page.records) { 587 + const rkey = record.uri.split("/").pop(); 588 + existing.set(record.value.id, { rkey, value: record.value }); 589 + } 590 + cursor = page.cursor; 591 + } while (cursor); 592 + const desired = new Map( 593 + data.map((record) => [record.id, { $type: collection, ...record }]) 594 + ); 595 + const writes = []; 596 + for (const [id, { rkey }] of existing) { 597 + if (!desired.has(id)) { 598 + writes.push({ 599 + $type: "com.atproto.repo.applyWrites#delete", 600 + collection, 601 + rkey 602 + }); 603 + } 604 + } 605 + for (const [id, record] of desired) { 606 + const entry = existing.get(id); 607 + if (!entry) { 608 + writes.push({ 609 + $type: "com.atproto.repo.applyWrites#create", 610 + collection, 611 + rkey: id, 612 + value: record 613 + }); 614 + } else if (JSON.stringify(entry.value) !== JSON.stringify(record)) { 615 + writes.push({ 616 + $type: "com.atproto.repo.applyWrites#update", 617 + collection, 618 + rkey: entry.rkey, 619 + value: record 620 + }); 621 + } 622 + } 623 + if (writes.length > 0) { 624 + await this.#rpc.post("com.atproto.repo.applyWrites", { 625 + input: { repo: this.#did.value, writes } 626 + }); 627 + } 628 + } 629 + // GET & PUT (broadcasting layer) 630 + /** 631 + * @param {string} collection 632 + * @param {Array<{ id: string }>} data 633 + */ 634 + #putProxy = /* @__PURE__ */ __name((collection, data) => this.#putRecordsSync(collection, data), "#putProxy"); 635 + #put = this.#putProxy; 636 + /** 637 + * @param {string} collection 638 + * @param {Array<{ id: string }>} data 639 + */ 640 + #putRecords = /* @__PURE__ */ __name((collection, data) => this.#put(collection, data), "#putRecords"); 641 + /** 642 + * @param {(uuidSender: ReturnType<typeof crypto.randomUUID>, collection: string, data: Array<{ id: string }>) => Promise<void>} action 643 + * @returns {(collection: string, data: Array<{ id: string }>) => Promise<void>} 644 + */ 645 + #putOutgoing = /* @__PURE__ */ __name((action) => async (collection, data) => { 646 + return await action(this.uuid, collection, data); 647 + }, "#putOutgoing"); 648 + /** 649 + * @param {ReturnType<typeof crypto.randomUUID>} uuidSender 650 + * @param {string} collection 651 + * @param {Array<{ id: string }>} data 652 + */ 653 + #putIncoming(uuidSender, collection, data) { 654 + if (uuidSender === this.uuid) { 655 + this.#putProxy(collection, data); 656 + } else { 657 + const collectionMap = { 658 + "sh.diffuse.output.facet": this.#manager.signals.facets, 659 + "sh.diffuse.output.playlist": this.#manager.signals.playlists, 660 + "sh.diffuse.output.theme": this.#manager.signals.themes, 661 + "sh.diffuse.output.track": this.#manager.signals.tracks 662 + }; 663 + const sig = collectionMap[collection]; 664 + if (sig) sig.value = data; 665 + } 666 + } 667 + }; 668 + var element_default = ATProtoOutput; 669 + var CLASS = ATProtoOutput; 670 + var NAME = "dor-atproto"; 671 + customElements.define(NAME, ATProtoOutput); 672 + 673 + export { 674 + element_default, 675 + CLASS, 676 + NAME 677 + }; 678 + 679 + //# sourceMappingURL=./chunk-KDXZLVT6.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-KDXZLVT6.js.map
··· 1 + {"version":3,"sources":["/components/output/raw/atproto/element.js","/node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/lib/index.ts","/node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/lib/client.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/validations/index.ts","/node_modules/.deno/@atcute+util-text@1.1.1/node_modules/@atcute/util-text/lib/index.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/interfaces/bytes.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/interfaces/index.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/interfaces/blob.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/interfaces/cid-link.ts","/node_modules/.deno/@atcute+lexicons@1.2.9/node_modules/@atcute/lexicons/lib/validations/utils.ts","/node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/lib/fetch-handler.ts","/node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/lib/credential-manager.ts","/node_modules/.deno/@atcute+client@4.2.1/node_modules/@atcute/client/lib/utils/jwt.ts"],"sourcesContent":["import { Client, ok } from \"@atcute/client\";\nimport { BroadcastableDiffuseElement } from \"@common/element.js\";\nimport { computed, signal } from \"@common/signal.js\";\nimport { outputManager } from \"../../common.js\";\nimport { login, logout, OAuthUserAgent, restoreOrFinalize } from \"./oauth.js\";\n\n/**\n * @import {Signal} from \"@common/signal.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 BroadcastableDiffuseElement {\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 playlists: {\n empty: () => [],\n get: () => this.#listRecords(\"sh.diffuse.output.playlist\"),\n put: (data) => this.#putRecords(\"sh.diffuse.output.playlist\", 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: () => this.#listRecords(\"sh.diffuse.output.track\"),\n put: (data) => this.#putRecords(\"sh.diffuse.output.track\", data),\n },\n });\n\n this.facets = this.#manager.facets;\n this.playlists = this.#manager.playlists;\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\n // STATE\n\n did = this.#did.get;\n\n ready = computed(() => {\n return this.#did.value !== null && navigator.onLine\n });\n\n // LIFECYCLE\n\n /** @override */\n connectedCallback() {\n if (this.hasAttribute(\"group\")) {\n const actions = this.broadcast(this.nameWithGroup, {\n put: { strategy: \"replicate\", fn: this.#putIncoming },\n });\n\n if (actions) {\n this.#put = this.#putOutgoing(actions.put);\n }\n }\n\n super.connectedCallback();\n\n this.#tryRestore();\n }\n\n // AUTH\n\n async #tryRestore() {\n await this.whenConnected();\n\n const session = await restoreOrFinalize();\n\n if (session) {\n this.#setSession(session);\n }\n }\n\n /**\n * @param {import(\"@atcute/oauth-browser-client\").Session} session\n */\n #setSession(session) {\n this.#agent = new OAuthUserAgent(session);\n this.#rpc = new Client({ handler: this.#agent });\n this.#did.value = session.info.sub;\n this.#authenticated.resolve();\n }\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 // RECORDS\n\n /**\n * @template T\n * @param {string} collection\n * @returns {Promise<T[]>}\n */\n async #listRecords(collection) {\n if (!this.#rpc || !this.#did.value) return [];\n\n const records = [];\n let cursor;\n\n do {\n /** @type {any} */\n const page = await ok(this.#rpc.get(\n \"com.atproto.repo.listRecords\",\n { params: { repo: this.#did.value, 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 }\n\n /**\n * @param {string} collection\n * @param {Array<{ id: string }>} data\n */\n async #putRecordsSync(collection, data) {\n if (!this.#rpc || !this.#did.value) return;\n\n // 1. Fetch current state\n /** @type {Map<string, { rkey: string, value: unknown }>} */\n const existing = new Map();\n let cursor;\n\n do {\n /** @type {any} */\n const page = await ok(this.#rpc.get(\n \"com.atproto.repo.listRecords\",\n { params: { repo: this.#did.value, collection, limit: 100, cursor } },\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 writes = [];\n\n for (const [id, { rkey }] of existing) {\n if (!desired.has(id)) {\n writes.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 writes.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 writes.push({\n $type: \"com.atproto.repo.applyWrites#update\",\n collection,\n rkey: entry.rkey,\n value: record,\n });\n }\n }\n\n // 4. Apply\n if (writes.length > 0) {\n await this.#rpc.post(\"com.atproto.repo.applyWrites\", {\n input: { repo: this.#did.value, writes },\n });\n }\n }\n\n // GET & PUT (broadcasting layer)\n\n /**\n * @param {string} collection\n * @param {Array<{ id: string }>} data\n */\n #putProxy = (collection, data) => this.#putRecordsSync(collection, data);\n #put = this.#putProxy;\n\n /**\n * @param {string} collection\n * @param {Array<{ id: string }>} data\n */\n #putRecords = (collection, data) => this.#put(collection, data);\n\n /**\n * @param {(uuidSender: ReturnType<typeof crypto.randomUUID>, collection: string, data: Array<{ id: string }>) => Promise<void>} action\n * @returns {(collection: string, data: Array<{ id: string }>) => Promise<void>}\n */\n #putOutgoing = (action) => async (collection, data) => {\n return await action(this.uuid, collection, data);\n };\n\n /**\n * @param {ReturnType<typeof crypto.randomUUID>} uuidSender\n * @param {string} collection\n * @param {Array<{ id: string }>} data\n */\n #putIncoming(uuidSender, collection, data) {\n if (uuidSender === this.uuid) {\n this.#putProxy(collection, data);\n } else {\n /** @type {Record<string, Signal<unknown[]>>} */\n const collectionMap = {\n \"sh.diffuse.output.facet\": this.#manager.signals.facets,\n \"sh.diffuse.output.playlist\": this.#manager.signals.playlists,\n \"sh.diffuse.output.theme\": this.#manager.signals.themes,\n \"sh.diffuse.output.track\": this.#manager.signals.tracks,\n };\n\n const sig = collectionMap[collection];\n if (sig) sig.value = data;\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","export * from './client.js';\nexport * from './fetch-handler.js';\nexport * from './credential-manager.js';\n","import type { Did } from '@atcute/lexicons';\nimport type { XRPCProcedures, XRPCQueries } from '@atcute/lexicons/ambient';\nimport * as v from '@atcute/lexicons/validations';\nimport type {\n\tInferInput,\n\tInferOutput,\n\tObjectSchema,\n\tXRPCBlobBodyParam,\n\tXRPCLexBodyParam,\n\tXRPCProcedureMetadata,\n\tXRPCQueryMetadata,\n} from '@atcute/lexicons/validations';\n\nimport { buildFetchHandler, type FetchHandler, type FetchHandlerObject } from './fetch-handler.js';\n\n// #region Type utilities\ntype RequiredKeysOf<TType extends object> = TType extends any\n\t? Exclude<\n\t\t\t{\n\t\t\t\t[Key in keyof TType]: TType extends Record<Key, TType[Key]> ? Key : never;\n\t\t\t}[keyof TType],\n\t\t\tundefined\n\t\t>\n\t: never;\n\ntype HasRequiredKeys<TType extends object> = RequiredKeysOf<TType> extends never ? false : true;\n\n// #endregion\n\n// #region Type definitions for response formats\ntype ResponseFormat = 'json' | 'blob' | 'bytes' | 'stream';\n\ntype FormattedResponse<TDef> = {\n\tjson: TDef extends XRPCQueryMetadata<any, infer Body extends XRPCLexBodyParam, any>\n\t\t? InferOutput<Body['schema']>\n\t\t: TDef extends XRPCProcedureMetadata<any, any, infer Body extends XRPCLexBodyParam, any>\n\t\t\t? InferOutput<Body['schema']>\n\t\t\t: unknown;\n\tblob: Blob;\n\tbytes: Uint8Array;\n\tstream: ReadableStream<Uint8Array>;\n};\n\n// #endregion\n\n// #region Type definitions for request options\ntype BaseRequestOptions = {\n\tsignal?: AbortSignal;\n\theaders?: HeadersInit;\n};\n\nexport type QueryRequestOptions<TDef> = BaseRequestOptions &\n\t(TDef extends XRPCQueryMetadata<infer Params, infer Output, any>\n\t\t? (Params extends ObjectSchema\n\t\t\t\t? // query has parameters\n\t\t\t\t\t{ params: InferInput<Params> }\n\t\t\t\t: // query has no parameters\n\t\t\t\t\t{ params?: Record<string, unknown> }) &\n\t\t\t\t(Output extends XRPCLexBodyParam // query has JSON response, format is optionally specified\n\t\t\t\t\t? { as?: ResponseFormat | null }\n\t\t\t\t\t: // query doesn't have JSON response, format needs to be specified\n\t\t\t\t\t\t{ as: ResponseFormat | null })\n\t\t: {\n\t\t\t\tas: ResponseFormat | null;\n\t\t\t\tparams?: Record<string, unknown>;\n\t\t\t});\n\nexport type ProcedureRequestOptions<TDef> = BaseRequestOptions &\n\t(TDef extends XRPCProcedureMetadata<infer Params, infer Input, infer Output, any>\n\t\t? (Params extends ObjectSchema\n\t\t\t\t? // procedure has parameters\n\t\t\t\t\t{ params: InferInput<Params> }\n\t\t\t\t: // procedure has no parameters\n\t\t\t\t\t{ params?: Record<string, unknown> }) &\n\t\t\t\t(Input extends XRPCLexBodyParam\n\t\t\t\t\t? // procedure requires JSON input\n\t\t\t\t\t\t{ input: InferInput<Input['schema']> }\n\t\t\t\t\t: Input extends XRPCBlobBodyParam\n\t\t\t\t\t\t? // procedure requires blob\n\t\t\t\t\t\t\t{ input: Blob | ArrayBuffer | ArrayBufferView | ReadableStream }\n\t\t\t\t\t\t: // procedure doesn't specify input\n\t\t\t\t\t\t\t{ input?: Record<string, unknown> | Blob | ArrayBuffer | ArrayBufferView | ReadableStream }) &\n\t\t\t\t(Output extends XRPCLexBodyParam\n\t\t\t\t\t? // procedure has JSON response, format is optionally specified\n\t\t\t\t\t\t{ as?: ResponseFormat | null }\n\t\t\t\t\t: // procedure doesn't have JSON response, format needs to be specified\n\t\t\t\t\t\t{ as: ResponseFormat | null })\n\t\t: {\n\t\t\t\tas: ResponseFormat | null;\n\t\t\t\tinput?: Record<string, unknown> | Blob | ArrayBuffer | ArrayBufferView | ReadableStream;\n\t\t\t\tparams?: Record<string, unknown>;\n\t\t\t});\n\nexport type CallRequestOptions<TMeta> = BaseRequestOptions &\n\t// as is required if the endpoint returns blob, optional otherwise\n\t(TMeta extends XRPCQueryMetadata<any, infer Output, any>\n\t\t? Output extends XRPCBlobBodyParam\n\t\t\t? { as: ResponseFormat | null }\n\t\t\t: { as?: ResponseFormat | null }\n\t\t: TMeta extends XRPCProcedureMetadata<any, any, infer Output, any>\n\t\t\t? Output extends XRPCBlobBodyParam\n\t\t\t\t? { as: ResponseFormat | null }\n\t\t\t\t: { as?: ResponseFormat | null }\n\t\t\t: { as?: ResponseFormat | null }) &\n\t(TMeta extends XRPCQueryMetadata<infer Params, any, any>\n\t\t? // query\n\t\t\tParams extends ObjectSchema\n\t\t\t? { params: InferInput<Params> }\n\t\t\t: { params?: Record<string, unknown> }\n\t\t: TMeta extends XRPCProcedureMetadata<infer Params, infer Input, any, any>\n\t\t\t? // procedure\n\t\t\t\t(Params extends ObjectSchema\n\t\t\t\t\t? { params: InferInput<Params> }\n\t\t\t\t\t: { params?: Record<string, unknown> }) &\n\t\t\t\t\t(Input extends XRPCLexBodyParam\n\t\t\t\t\t\t? { input: InferInput<Input['schema']> }\n\t\t\t\t\t\t: Input extends XRPCBlobBodyParam\n\t\t\t\t\t\t\t? { input: Blob | ArrayBuffer | ArrayBufferView | ReadableStream }\n\t\t\t\t\t\t\t: { input?: Record<string, unknown> | Blob | ArrayBuffer | ArrayBufferView | ReadableStream })\n\t\t\t: never);\n\ntype InternalRequestOptions = BaseRequestOptions & {\n\tas?: ResponseFormat | null;\n\tparams?: Record<string, unknown>;\n\tinput?: Record<string, unknown> | Blob | BufferSource | ReadableStream;\n};\n\n// #endregion\n\n// #region Type definitions for client response\n/** standard XRPC error payload structure */\nexport type XRPCErrorPayload = {\n\t/** error name */\n\terror: string;\n\t/** error description */\n\tmessage?: string;\n};\n\ntype BaseClientResponse = {\n\t/** response status */\n\tstatus: number;\n\t/** response headers */\n\theaders: Headers;\n};\n\n/** represents a successful response returned by the client */\nexport type SuccessClientResponse<TDef, TInit> = BaseClientResponse & {\n\tok: true;\n\t/** response data */\n\tdata: TInit extends { as: infer TFormat }\n\t\t? TFormat extends ResponseFormat\n\t\t\t? FormattedResponse<TDef>[TFormat]\n\t\t\t: TFormat extends null\n\t\t\t\t? null\n\t\t\t\t: never\n\t\t: TDef extends XRPCQueryMetadata<any, infer Body, any>\n\t\t\t? Body extends XRPCLexBodyParam\n\t\t\t\t? InferOutput<Body['schema']>\n\t\t\t\t: null\n\t\t\t: TDef extends XRPCProcedureMetadata<any, any, infer Body, any>\n\t\t\t\t? Body extends XRPCLexBodyParam\n\t\t\t\t\t? InferOutput<Body['schema']>\n\t\t\t\t\t: null\n\t\t\t\t: never;\n};\n\n/** represents a failed response returned by the client */\nexport type FailedClientResponse = BaseClientResponse & {\n\tok: false;\n\t/** response data */\n\tdata: XRPCErrorPayload;\n};\n\n/** represents a response returned by the client */\nexport type ClientResponse<TDef, TInit> = SuccessClientResponse<TDef, TInit> | FailedClientResponse;\n\ntype UnknownClientResponse = { status: number; headers: Headers } & (\n\t| { ok: true; data: unknown }\n\t| { ok: false; data: XRPCErrorPayload }\n);\n\n// #endregion\n\n// #region Type definitions for call method\ntype Namespaced<T> = { mainSchema: T };\n\n// #endregion\n\n// #region Client\n/** options for configuring service proxying */\nexport type ServiceProxyOptions = {\n\t/** DID identifier that the upstream service should look up */\n\tdid: Did;\n\t/**\n\t * the specific service ID within the resolved DID document's `service` array\n\t * that the upstream service should forward requests to.\n\t *\n\t * must start with `#`\n\t *\n\t * common values include:\n\t * - `#atproto_pds` (personal data server)\n\t * - `#atproto_labeler` (labeler service)\n\t * - `#bsky_chat` (Bluesky chat service)\n\t */\n\tserviceId: `#${string}`;\n};\n\n/** options for configuring the client */\nexport type ClientOptions = {\n\t/** the underlying fetch handler it should make requests with */\n\thandler: FetchHandler | FetchHandlerObject;\n\t/** service proxy configuration */\n\tproxy?: ServiceProxyOptions | null;\n};\n\nconst JSON_CONTENT_TYPE_RE = /\\bapplication\\/json\\b/;\n\n/** XRPC API client */\nexport class Client<TQueries = XRPCQueries, TProcedures = XRPCProcedures> {\n\thandler: FetchHandler;\n\tproxy: ServiceProxyOptions | null;\n\n\tconstructor({ handler, proxy = null }: ClientOptions) {\n\t\tthis.handler = buildFetchHandler(handler);\n\t\tthis.proxy = proxy;\n\t}\n\n\t/**\n\t * clones this XRPC client\n\t * @param opts options to merge with\n\t * @returns the cloned XRPC client\n\t */\n\tclone({ handler = this.handler, proxy = this.proxy }: Partial<ClientOptions> = {}): Client<\n\t\tTQueries,\n\t\tTProcedures\n\t> {\n\t\treturn new Client({ handler, proxy });\n\t}\n\n\t/**\n\t * performs an XRPC query request (HTTP GET)\n\t * @param name NSID of the query\n\t * @param options query options\n\t */\n\tget<TName extends keyof TQueries, TInit extends QueryRequestOptions<TQueries[TName]>>(\n\t\tname: TName,\n\t\t...options: HasRequiredKeys<TInit> extends true ? [init: TInit] : [init?: TInit]\n\t): Promise<ClientResponse<TQueries[TName], TInit>>;\n\n\tget(name: string, options: InternalRequestOptions = {}) {\n\t\treturn this.#perform('get', name, options);\n\t}\n\n\t/**\n\t * performs an XRPC procedure request (HTTP POST)\n\t * @param name NSID of the procedure\n\t * @param options procedure options\n\t */\n\tpost<TName extends keyof TProcedures, TInit extends ProcedureRequestOptions<TProcedures[TName]>>(\n\t\tname: TName,\n\t\t...options: HasRequiredKeys<TInit> extends true ? [init: TInit] : [init?: TInit]\n\t): Promise<ClientResponse<TProcedures[TName], TInit>>;\n\n\tpost(name: string, options: InternalRequestOptions = {}) {\n\t\treturn this.#perform('post', name, options);\n\t}\n\n\t/**\n\t * performs an XRPC call with schema validation\n\t * @param schema the lexicon schema for the endpoint, or a namespace containing mainSchema\n\t * @param options call options\n\t */\n\tcall<TMeta extends XRPCQueryMetadata | XRPCProcedureMetadata, TInit extends CallRequestOptions<TMeta>>(\n\t\tschema: TMeta | Namespaced<TMeta>,\n\t\t...options: HasRequiredKeys<TInit> extends true ? [init: TInit] : [init?: TInit]\n\t): Promise<ClientResponse<TMeta, TInit>>;\n\n\tasync call(schema: any, options: any = {}): Promise<any> {\n\t\t// early bailout for tree-shaking when schemas aren't used\n\t\tif (!v.xrpcSchemaGenerated) {\n\t\t\treturn;\n\t\t}\n\n\t\t// extract mainSchema if namespace was passed\n\t\tif ('mainSchema' in schema) {\n\t\t\tschema = schema.mainSchema;\n\t\t}\n\n\t\tif (schema.params !== null) {\n\t\t\tconst paramsResult = v.safeParse(schema.params, options.params);\n\t\t\tif (!paramsResult.ok) {\n\t\t\t\tthrow new ClientValidationError('params', paramsResult);\n\t\t\t}\n\t\t}\n\n\t\tif (schema.type === 'xrpc_procedure' && schema.input?.type === 'lex') {\n\t\t\tconst inputResult = v.safeParse(schema.input.schema, options.input);\n\t\t\tif (!inputResult.ok) {\n\t\t\t\tthrow new ClientValidationError('input', inputResult);\n\t\t\t}\n\t\t}\n\n\t\tconst isQuery = schema.type === 'xrpc_query';\n\t\tconst method = isQuery ? 'get' : 'post';\n\n\t\tif (options.as === undefined && schema.output?.type === 'blob') {\n\t\t\tthrow new TypeError(`\\`as\\` option is required for endpoints returning blobs`);\n\t\t}\n\n\t\tconst format = options.as !== undefined ? options.as : schema.output?.type === 'lex' ? 'json' : null;\n\n\t\tconst response = await this.#perform(method, schema.nsid, {\n\t\t\tparams: options.params,\n\t\t\tinput: isQuery ? undefined : options.input,\n\t\t\tas: format,\n\t\t\tsignal: options.signal,\n\t\t\theaders: options.headers,\n\t\t});\n\n\t\tif (format === 'json' && response.ok && schema.output?.type === 'lex') {\n\t\t\tconst outputResult = v.safeParse(schema.output.schema, response.data);\n\t\t\tif (!outputResult.ok) {\n\t\t\t\tthrow new ClientValidationError('output', outputResult);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tok: true,\n\t\t\t\tstatus: response.status,\n\t\t\t\theaders: response.headers,\n\t\t\t\tdata: outputResult.value,\n\t\t\t};\n\t\t}\n\n\t\treturn response;\n\t}\n\n\tasync #perform(\n\t\tmethod: 'get' | 'post',\n\t\tname: string,\n\t\t{ signal, as: format = 'json', headers, input, params }: InternalRequestOptions,\n\t) {\n\t\tconst isWebInput =\n\t\t\tinput &&\n\t\t\t(input instanceof Blob ||\n\t\t\t\tArrayBuffer.isView(input) ||\n\t\t\t\tinput instanceof ArrayBuffer ||\n\t\t\t\tinput instanceof ReadableStream);\n\n\t\tconst url = `/xrpc/${name}` + _constructSearchParams(params);\n\n\t\tconst response = await this.handler(url, {\n\t\t\tmethod,\n\t\t\tsignal,\n\t\t\tbody: input && !isWebInput ? JSON.stringify(input) : input,\n\t\t\theaders: _mergeHeaders(headers, {\n\t\t\t\t'content-type': input && !isWebInput ? 'application/json' : null,\n\t\t\t\t'atproto-proxy': _constructProxyHeader(this.proxy),\n\t\t\t}),\n\t\t\tduplex: input instanceof ReadableStream ? 'half' : undefined,\n\t\t});\n\n\t\t{\n\t\t\tconst status = response.status;\n\t\t\tconst headers = response.headers;\n\n\t\t\tconst type = headers.get('content-type');\n\n\t\t\tif (status !== 200) {\n\t\t\t\tlet json: any;\n\n\t\t\t\tif (type != null && JSON_CONTENT_TYPE_RE.test(type)) {\n\t\t\t\t\t// it should be okay to swallow the parsing error here\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst parsed = await response.json();\n\t\t\t\t\t\tif (isXRPCErrorPayload(parsed)) {\n\t\t\t\t\t\t\tjson = parsed;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {}\n\t\t\t\t} else {\n\t\t\t\t\tawait response.body?.cancel();\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\tstatus: status,\n\t\t\t\t\theaders: headers,\n\t\t\t\t\tdata: json ?? {\n\t\t\t\t\t\terror: `UnknownXRPCError`,\n\t\t\t\t\t\tmessage: `Request failed with status code ${status}`,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t{\n\t\t\t\tlet data: any;\n\t\t\t\tswitch (format) {\n\t\t\t\t\tcase 'json': {\n\t\t\t\t\t\tif (type != null && JSON_CONTENT_TYPE_RE.test(type)) {\n\t\t\t\t\t\t\t// we shouldn't be handling parsing errors\n\t\t\t\t\t\t\tdata = await response.json();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tawait response.body?.cancel();\n\n\t\t\t\t\t\t\tthrow new TypeError(`Invalid response content-type (got ${type})`);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase null: {\n\t\t\t\t\t\tdata = null;\n\n\t\t\t\t\t\tawait response.body?.cancel();\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'blob': {\n\t\t\t\t\t\tdata = await response.blob();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'bytes': {\n\t\t\t\t\t\tdata = new Uint8Array(await response.arrayBuffer());\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'stream': {\n\t\t\t\t\t\tdata = response.body!;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tok: true,\n\t\t\t\t\tstatus: status,\n\t\t\t\t\theaders: headers,\n\t\t\t\t\tdata: data,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n}\n\n// #endregion\n\n// #region Utility functions\nconst _constructSearchParams = (params: Record<string, unknown> | undefined): string => {\n\tlet searchParams: URLSearchParams | undefined;\n\n\tfor (const key in params) {\n\t\tconst value = params[key];\n\n\t\tif (value !== undefined) {\n\t\t\tsearchParams ??= new URLSearchParams();\n\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tfor (let idx = 0, len = value.length; idx < len; idx++) {\n\t\t\t\t\tconst val = value[idx];\n\t\t\t\t\tsearchParams.append(key, '' + val);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsearchParams.set(key, '' + value);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn searchParams ? `?` + searchParams.toString() : '';\n};\n\nconst _constructProxyHeader = (proxy: ServiceProxyOptions | null | undefined): string | null => {\n\tif (proxy != null) {\n\t\treturn `${proxy.did}${proxy.serviceId}`;\n\t}\n\n\treturn null;\n};\n\nconst _mergeHeaders = (\n\tinit: HeadersInit | undefined,\n\tdefaults: Record<string, string | null>,\n): HeadersInit | undefined => {\n\tlet headers: Headers | undefined;\n\n\tfor (const name in defaults) {\n\t\tconst value = defaults[name];\n\n\t\tif (value !== null) {\n\t\t\theaders ??= new Headers(init);\n\n\t\t\tif (!headers.has(name)) {\n\t\t\t\theaders.set(name, value);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn headers ?? init;\n};\n\nexport const isXRPCErrorPayload = (input: any): input is XRPCErrorPayload => {\n\tif (typeof input !== 'object' || input == null) {\n\t\treturn false;\n\t}\n\n\tconst kindType = typeof input.error;\n\tconst messageType = typeof input.message;\n\n\treturn kindType === 'string' && (messageType === 'undefined' || messageType === 'string');\n};\n// #endregion\n\n// #region Optimistic response helper\ntype ExtractSuccessData<R> = R extends { ok: true; data: infer D } ? D : never;\n\n/**\n * takes in the response returned by the client, and either returns the data if\n * it is a successful response, or throws if it's a failed response.\n * @param input either a ClientResponse, or a promise that resolves to a ClientResponse\n * @returns the data from a successful response\n *\n * @example\n * const data = await ok(client.get('com.atproto.server.describeServer'));\n * // ^? ComAtprotoServerDescribeServer.Output\n */\nexport const ok: {\n\t<T extends UnknownClientResponse>(promise: Promise<T>): Promise<ExtractSuccessData<T>>;\n\t<T extends UnknownClientResponse>(response: T): ExtractSuccessData<T>;\n} = (input: Promise<UnknownClientResponse> | UnknownClientResponse): any => {\n\tif (input instanceof Promise) {\n\t\treturn input.then(ok);\n\t}\n\n\tif (input.ok) {\n\t\treturn input.data;\n\t}\n\n\tthrow new ClientResponseError(input);\n};\n\n/** options when constructing a ClientResponseError */\nexport type ClientResponseErrorOptions = {\n\tstatus: number;\n\theaders?: Headers;\n\tdata: XRPCErrorPayload;\n};\n\n/** represents an error response returned by the client */\nexport class ClientResponseError extends Error {\n\t/** error name returned by service */\n\treadonly error: string;\n\t/** error message returned by service */\n\treadonly description?: string;\n\n\t/** response status */\n\treadonly status: number;\n\t/** response headers */\n\treadonly headers: Headers;\n\n\tconstructor({ status, headers = new Headers(), data }: ClientResponseErrorOptions) {\n\t\tsuper(`${data.error} > ${data.message ?? '(unspecified description)'}`);\n\n\t\tthis.name = 'ClientResponseError';\n\n\t\tthis.error = data.error;\n\t\tthis.description = data.message;\n\n\t\tthis.status = status;\n\t\tthis.headers = headers;\n\t}\n}\n\n/** represents a validation error during typed calls */\nexport class ClientValidationError extends Error {\n\t/** validation target (params, input, or output) */\n\treadonly target: 'params' | 'input' | 'output';\n\t/** validation result */\n\treadonly result: v.Err;\n\n\tconstructor(target: 'params' | 'input' | 'output', result: v.Err) {\n\t\tsuper(`validation failed for ${target}: ${result.message}`);\n\n\t\tthis.name = 'ClientValidationError';\n\t\tthis.target = target;\n\t\tthis.result = result;\n\t}\n}\n\n// #endregion\n","import { isUtf8LengthInRange } from '@atcute/uint8array';\nimport { isGraphemeLengthInRange } from '@atcute/util-text';\n\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\n\nimport { _isBytesWrapper } from '../interfaces/bytes.ts';\nimport * as interfaces from '../interfaces/index.ts';\nimport * as syntax from '../syntax/index.ts';\nimport type { $type } from '../types/brand.ts';\nimport { assert } from '../utils.ts';\n\nimport { allowsEval, isArray, isObject, lazy, lazyProperty } from './utils.ts';\n\n/**\n * flag indicating whether xrpc schema generation helpers are used. set to true\n * when query() or procedure() is called. this enables conditional tree-shaking\n * of validation code when schemas are not used.\n * @deprecated internal flag for tree-shaking, do not use directly\n */\nexport let xrpcSchemaGenerated = false;\n\ntype Identity<T> = T;\ntype Flatten<T> = Identity<{ [K in keyof T]: T[K] }>;\n\ntype InputType =\n\t| 'unknown'\n\t| 'null'\n\t| 'undefined'\n\t| 'string'\n\t| 'integer'\n\t| 'boolean'\n\t| 'blob'\n\t| 'bytes'\n\t| 'cid-link'\n\t| 'object'\n\t| 'array';\n\ntype StringFormatMap = {\n\t'at-identifier': syntax.ActorIdentifier;\n\t'at-uri': syntax.ResourceUri;\n\tcid: syntax.Cid;\n\tdatetime: syntax.Datetime;\n\tdid: syntax.Did;\n\thandle: syntax.Handle;\n\tlanguage: syntax.LanguageCode;\n\tnsid: syntax.Nsid;\n\t'record-key': syntax.RecordKey;\n\ttid: syntax.Tid;\n\turi: syntax.GenericUri;\n};\n\nexport type StringFormat = keyof StringFormatMap;\n\ntype Literal = string | number | boolean;\ntype Key = string | number;\n\ntype IssueFormatter = () => string;\n\n// #region Schema issue types\nexport type IssueLeaf = { ok: false; msg: IssueFormatter } & (\n\t| { code: 'missing_value' }\n\t| { code: 'invalid_literal'; expected: readonly Literal[] }\n\t| { code: 'invalid_type'; expected: InputType }\n\t| { code: 'invalid_variant'; expected: string[] }\n\t| { code: 'invalid_integer_range'; min: number; max: number }\n\t| { code: 'invalid_string_format'; expected: StringFormat }\n\t| { code: 'invalid_string_graphemes'; minGraphemes: number; maxGraphemes: number }\n\t| { code: 'invalid_string_length'; minLength: number; maxLength: number }\n\t| { code: 'invalid_array_length'; minLength: number; maxLength: number }\n\t| { code: 'invalid_bytes_size'; minSize: number; maxSize: number }\n);\n\nexport type IssueTree =\n\t| IssueLeaf\n\t| { ok: false; code: 'prepend'; key: Key; tree: IssueTree }\n\t| { ok: false; code: 'join'; left: IssueTree; right: IssueTree };\n\nexport type Issue =\n\t| { code: 'missing_value'; path: Key[] }\n\t| { code: 'invalid_literal'; path: Key[]; expected: readonly Literal[] }\n\t| { code: 'invalid_type'; path: Key[]; expected: InputType }\n\t| { code: 'invalid_variant'; path: Key[]; expected: string[] }\n\t| { code: 'invalid_integer_range'; path: Key[]; min: number; max: number }\n\t| { code: 'invalid_string_format'; path: Key[]; expected: StringFormat }\n\t| { code: 'invalid_string_graphemes'; path: Key[]; minGraphemes: number; maxGraphemes: number }\n\t| { code: 'invalid_string_length'; path: Key[]; minLength: number; maxLength: number }\n\t| { code: 'invalid_array_length'; path: Key[]; minLength: number; maxLength: number }\n\t| { code: 'invalid_bytes_size'; path: Key[]; minSize: number; maxSize: number };\n\n// #__NO_SIDE_EFFECTS__\nconst joinIssues = (left: IssueTree | undefined, right: IssueTree): IssueTree => {\n\treturn left ? { ok: false, code: 'join', left, right } : right;\n};\n\n// #__NO_SIDE_EFFECTS__\nconst prependPath = (key: Key, tree: IssueTree): IssueTree => {\n\treturn { ok: false, code: 'prepend', key, tree };\n};\n\n// #region Schema result types\n\nexport type Ok<T> = {\n\tok: true;\n\tvalue: T;\n};\nexport type Err = {\n\tok: false;\n\treadonly message: string;\n\treadonly issues: readonly Issue[];\n\tthrow(): never;\n};\n\nexport type ValidationResult<T> = Ok<T> | Err;\n\n// #__NO_SIDE_EFFECTS__\nexport const ok = <T>(value: T): Ok<T> => {\n\treturn { ok: true, value };\n};\n\n// #region Base schema\n\n// Private symbols meant to hold types\ndeclare const kType: unique symbol;\ntype kType = typeof kType;\n\n// None set\nexport const FLAG_EMPTY = 0;\n// Don't continue validation if an error is encountered\nexport const FLAG_ABORT_EARLY = 1 << 0;\n\ntype MatcherResult = undefined | Ok<unknown> | IssueTree;\ntype Matcher = (input: unknown, flags: number) => MatcherResult;\n\ntype LexStandardSchemaResult<T extends BaseSchema> = StandardSchemaV1.Result<InferOutput<T>>;\n\ninterface LexStandardSchema<T extends BaseSchema> extends StandardSchemaV1.Props<unknown> {\n\treadonly validate: (value: unknown) => LexStandardSchemaResult<T> | Promise<LexStandardSchemaResult<T>>;\n\treadonly types?: StandardSchemaV1.Types<InferInput<T>, InferOutput<T>>;\n}\n\nexport interface BaseSchema<TInput = unknown, TOutput = TInput> {\n\treadonly kind: 'schema';\n\treadonly type: string;\n\treadonly '~run': Matcher;\n\treadonly '~standard': LexStandardSchema<this>;\n\n\treadonly [kType]?: { in: TInput; out: TOutput };\n}\n\nexport type InferInput<T extends BaseSchema> = NonNullable<T[kType]>['in'];\n\nexport type InferOutput<T extends BaseSchema> = NonNullable<T[kType]>['out'];\n\n// #region Schema runner\nconst cloneIssueWithPath = (issue: IssueLeaf, path: Key[]): Issue => {\n\tconst { ok: _ok, msg: _fmt, ...clone } = issue;\n\n\treturn { ...clone, path };\n};\n\nconst collectIssues = (tree: IssueTree, path: Key[] = [], issues: Issue[] = []): Issue[] => {\n\tfor (;;) {\n\t\tswitch (tree.code) {\n\t\t\tcase 'join': {\n\t\t\t\tcollectIssues(tree.left, path.slice(), issues);\n\t\t\t\ttree = tree.right;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'prepend': {\n\t\t\t\tpath.push(tree.key);\n\t\t\t\ttree = tree.tree;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tissues.push(cloneIssueWithPath(tree, path));\n\t\t\t\treturn issues;\n\t\t\t}\n\t\t}\n\t}\n};\n\nconst countIssues = (tree: IssueTree): number => {\n\tlet count = 0;\n\tfor (;;) {\n\t\tswitch (tree.code) {\n\t\t\tcase 'join': {\n\t\t\t\tcount += countIssues(tree.left);\n\t\t\t\ttree = tree.right;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'prepend': {\n\t\t\t\ttree = tree.tree;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\treturn count + 1;\n\t\t\t}\n\t\t}\n\t}\n};\n\nconst separatedList = (list: string[], sep: 'or' | 'and'): string => {\n\tswitch (list.length) {\n\t\tcase 0: {\n\t\t\treturn `nothing`;\n\t\t}\n\t\tcase 1: {\n\t\t\treturn list[0];\n\t\t}\n\t\tdefault: {\n\t\t\treturn `${list.slice(0, -1).join(', ')} ${sep} ${list[list.length - 1]}`;\n\t\t}\n\t}\n};\n\nconst formatLiteral = (value: Literal): string => {\n\treturn JSON.stringify(value);\n};\n\nconst formatRangeMessage = (\n\ttype: 'a string' | 'an array' | 'a byte array',\n\tunit: 'character' | 'grapheme' | 'item' | 'byte',\n\tmin: number,\n\tmax: number,\n): string => {\n\tlet message = `expected ${type} `;\n\n\tif (min > 0) {\n\t\tif (max === min) {\n\t\t\tmessage += `${min}`;\n\t\t} else if (max !== Infinity) {\n\t\t\tmessage += `between ${min} and ${max}`;\n\t\t} else {\n\t\t\tmessage += `at least ${min}`;\n\t\t}\n\t} else {\n\t\tmessage += `at most ${max}`;\n\t}\n\n\tmessage += ` ${unit}(s)`;\n\treturn message;\n};\n\nconst formatIssueTree = (tree: IssueTree): string => {\n\tlet path = '';\n\tlet count = 0;\n\tfor (;;) {\n\t\tswitch (tree.code) {\n\t\t\tcase 'join': {\n\t\t\t\tcount += countIssues(tree.right);\n\t\t\t\ttree = tree.left;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'prepend': {\n\t\t\t\tpath += `.${tree.key}`;\n\t\t\t\ttree = tree.tree;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tbreak;\n\t}\n\n\tconst message = tree.msg();\n\n\tlet msg = `${tree.code} at ${path || '.'} (${message})`;\n\tif (count > 0) {\n\t\tmsg += ` (+${count} other issue(s))`;\n\t}\n\n\treturn msg;\n};\n\nexport class ValidationError extends Error {\n\toverride readonly name = 'ValidationError';\n\n\t#issueTree: IssueTree;\n\n\tconstructor(issueTree: IssueTree) {\n\t\tsuper();\n\n\t\tthis.#issueTree = issueTree;\n\t}\n\n\toverride get message(): string {\n\t\treturn formatIssueTree(this.#issueTree);\n\t}\n\n\tget issues(): readonly Issue[] {\n\t\treturn collectIssues(this.#issueTree);\n\t}\n}\n\nclass ErrImpl implements Err {\n\treadonly ok = false;\n\n\t#issueTree: IssueTree;\n\n\tconstructor(issueTree: IssueTree) {\n\t\tthis.#issueTree = issueTree;\n\t}\n\n\tget message(): string {\n\t\treturn formatIssueTree(this.#issueTree);\n\t}\n\n\tget issues(): readonly Issue[] {\n\t\treturn collectIssues(this.#issueTree);\n\t}\n\n\tthrow(): never {\n\t\tthrow new ValidationError(this.#issueTree);\n\t}\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const is = <const TSchema extends BaseSchema>(\n\tschema: TSchema,\n\tinput: unknown,\n): input is InferInput<TSchema> => {\n\tconst r = schema['~run'](input, FLAG_ABORT_EARLY);\n\treturn r === undefined || r.ok;\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const safeParse = <const TSchema extends BaseSchema>(\n\tschema: TSchema,\n\tinput: unknown,\n): ValidationResult<InferOutput<TSchema>> => {\n\tconst r = schema['~run'](input, FLAG_EMPTY);\n\n\tif (r === undefined) {\n\t\treturn ok(input as InferOutput<TSchema>);\n\t}\n\n\tif (r.ok) {\n\t\treturn r as Ok<InferOutput<TSchema>>;\n\t}\n\n\treturn new ErrImpl(r);\n};\n\nexport const parse = <const TSchema extends BaseSchema>(\n\tschema: TSchema,\n\tinput: unknown,\n): InferOutput<TSchema> => {\n\tconst r = schema['~run'](input, FLAG_EMPTY);\n\n\tif (r === undefined) {\n\t\treturn input as InferOutput<TSchema>;\n\t}\n\n\tif (r.ok) {\n\t\treturn r.value as InferOutput<TSchema>;\n\t}\n\n\tthrow new ValidationError(r);\n};\n\n// #region Standard Schema support\n\nconst collectStandardIssues = (\n\ttree: IssueTree,\n\tpath: Key[] = [],\n\tissues: StandardSchemaV1.Issue[] = [],\n): StandardSchemaV1.Issue[] => {\n\tfor (;;) {\n\t\tswitch (tree.code) {\n\t\t\tcase 'join': {\n\t\t\t\tcollectStandardIssues(tree.left, path.slice(), issues);\n\t\t\t\ttree = tree.right;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'prepend': {\n\t\t\t\tpath.push(tree.key);\n\t\t\t\ttree = tree.tree;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tissues.push({ message: tree.msg(), path: path.length > 0 ? path : undefined });\n\t\t\t\treturn issues;\n\t\t\t}\n\t\t}\n\t}\n};\n\nconst toStandardSchema = <TSchema extends BaseSchema>(schema: TSchema): LexStandardSchema<TSchema> => {\n\treturn {\n\t\tversion: 1,\n\t\tvendor: '@atcute/lexicons',\n\t\tvalidate(value) {\n\t\t\tconst r = schema['~run'](value, FLAG_EMPTY);\n\n\t\t\tif (r === undefined) {\n\t\t\t\treturn { value: value as InferOutput<TSchema> };\n\t\t\t}\n\n\t\t\tif (r.ok) {\n\t\t\t\treturn { value: r.value as InferOutput<TSchema> };\n\t\t\t}\n\n\t\t\treturn { issues: collectStandardIssues(r) };\n\t\t},\n\t};\n};\n\n// #region Base constraint\n\nexport interface BaseConstraint<TType = unknown> {\n\treadonly kind: 'constraint';\n\treadonly type: string;\n\treadonly '~run': (input: TType, flags: number) => MatcherResult;\n}\n\ntype ConstraintTuple<T> = readonly [BaseConstraint<T>, ...BaseConstraint<T>[]];\n\nexport type SchemaWithConstraint<\n\tTItem extends BaseSchema,\n\tTConstraints extends ConstraintTuple<InferOutput<TItem>>,\n> = TItem & {\n\treadonly constraints: TConstraints;\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const constrain = <\n\tTItem extends BaseSchema,\n\tconst TConstraints extends ConstraintTuple<InferOutput<TItem>>,\n>(\n\tbase: TItem,\n\tconstraints: TConstraints,\n): SchemaWithConstraint<TItem, TConstraints> => {\n\tconst len = constraints.length;\n\n\treturn {\n\t\t...base,\n\t\tconstraints: constraints,\n\t\t'~run'(input, flags) {\n\t\t\tlet result = base['~run'](input, flags);\n\t\t\tlet current: any;\n\n\t\t\tif (result === undefined) {\n\t\t\t\tcurrent = input;\n\t\t\t} else if (result.ok) {\n\t\t\t\tcurrent = result.value;\n\t\t\t} else {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tfor (let idx = 0; idx < len; idx++) {\n\t\t\t\tconst r = constraints[idx]['~run'](current, flags);\n\n\t\t\t\tif (r !== undefined) {\n\t\t\t\t\tif (r.ok) {\n\t\t\t\t\t\tcurrent = r.value;\n\n\t\t\t\t\t\tif (result === undefined || result.ok) {\n\t\t\t\t\t\t\tresult = r;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (flags & FLAG_ABORT_EARLY) {\n\t\t\t\t\t\t\treturn r;\n\t\t\t\t\t\t} else if (result === undefined || result.ok) {\n\t\t\t\t\t\t\tresult = r;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult = joinIssues(result, r);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t};\n};\n\n// #region Base metadata\n\nexport interface BaseMetadata {\n\treadonly kind: 'metadata';\n\treadonly type: string;\n}\n\n// #region Literal schema\n\nexport interface LiteralSchema<T extends Literal = Literal> extends BaseSchema<T> {\n\treadonly type: 'literal';\n\treadonly expected: T;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const literal = <T extends Literal>(value: T): LiteralSchema<T> => {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_literal',\n\t\texpected: [value],\n\t\tmsg() {\n\t\t\treturn `expected ${formatLiteral(value)}`;\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'literal',\n\t\texpected: value,\n\t\t'~run'(input, _flags) {\n\t\t\tif (input !== value) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\nexport interface LiteralEnumSchema<TEnums extends readonly Literal[] = []> extends BaseSchema<\n\tTEnums[number]\n> {\n\treadonly type: 'literal_enum';\n\treadonly expected: TEnums;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const literalEnum = <const TEnums extends readonly Literal[]>(\n\tvalues: TEnums,\n): LiteralEnumSchema<TEnums> => {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_literal',\n\t\texpected: values,\n\t\tmsg() {\n\t\t\treturn `expected ${separatedList(values.map(formatLiteral), 'or')}`;\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'literal_enum',\n\t\texpected: values,\n\t\t'~run'(input, _flags) {\n\t\t\tif (!values.includes(input as any)) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\n// #region Boolean schema\n\nexport interface BooleanSchema extends BaseSchema<boolean> {\n\treadonly type: 'boolean';\n}\n\nconst ISSUE_TYPE_BOOLEAN: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'boolean',\n\tmsg() {\n\t\treturn `expected boolean`;\n\t},\n};\n\nconst BOOLEAN_SCHEMA: BooleanSchema = {\n\tkind: 'schema',\n\ttype: 'boolean',\n\t'~run'(input, _flags) {\n\t\tif (typeof input !== 'boolean') {\n\t\t\treturn ISSUE_TYPE_BOOLEAN;\n\t\t}\n\n\t\treturn undefined;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const boolean = (): BooleanSchema => {\n\treturn BOOLEAN_SCHEMA;\n};\n\n// #region Integer schema\n\nexport interface IntegerSchema extends BaseSchema<number> {\n\treadonly type: 'integer';\n}\n\nconst ISSUE_TYPE_INTEGER: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'integer',\n\tmsg() {\n\t\treturn `expected integer`;\n\t},\n};\n\nconst INTEGER_SCHEMA: IntegerSchema = {\n\tkind: 'schema',\n\ttype: 'integer',\n\t'~run'(input, _flags) {\n\t\tif (typeof input !== 'number') {\n\t\t\treturn ISSUE_TYPE_INTEGER;\n\t\t}\n\n\t\tif (input < 0 || !Number.isSafeInteger(input)) {\n\t\t\treturn ISSUE_TYPE_INTEGER;\n\t\t}\n\n\t\treturn undefined;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const integer = (): IntegerSchema => {\n\treturn INTEGER_SCHEMA;\n};\n\n// #region Integer constraints\n\nexport interface IntegerRangeConstraint<\n\tTMin extends number = number,\n\tTMax extends number = number,\n> extends BaseConstraint<number> {\n\treadonly type: 'integer_range';\n\treadonly min: TMin;\n\treadonly max: TMax;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const integerRange: {\n\t<const TMin extends number>(min: TMin): IntegerRangeConstraint<TMin>;\n\t<const TMin extends number, const TMax extends number>(\n\t\tmin: TMin,\n\t\tmax: TMax,\n\t): IntegerRangeConstraint<TMin, TMax>;\n} = (min: number, max: number = Infinity): IntegerRangeConstraint => {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_integer_range',\n\t\tmin: min,\n\t\tmax: max,\n\t\tmsg() {\n\t\t\tlet message = `expected an integer `;\n\n\t\t\tif (min > 0) {\n\t\t\t\tif (max === min) {\n\t\t\t\t\tmessage += `of exactly ${min}`;\n\t\t\t\t} else if (max !== Infinity) {\n\t\t\t\t\tmessage += `between ${min} and ${max}`;\n\t\t\t\t} else {\n\t\t\t\t\tmessage += `of at least ${min}`;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmessage += `of at most ${max}`;\n\t\t\t}\n\n\t\t\treturn message;\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'constraint',\n\t\ttype: 'integer_range',\n\t\tmin: min,\n\t\tmax: max,\n\t\t'~run'(input, _flags) {\n\t\t\tif (input < min) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\tif (input > max) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t};\n};\n\n// #region String schema\n\nexport interface StringSchema<T extends string = string> extends BaseSchema<T> {\n\treadonly type: 'string';\n\treadonly format: null;\n}\n\nexport interface FormattedStringSchema<\n\tTFormat extends keyof StringFormatMap = keyof StringFormatMap,\n> extends BaseSchema<StringFormatMap[TFormat]> {\n\treadonly type: 'string';\n\treadonly format: TFormat;\n}\n\nconst ISSUE_TYPE_STRING: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'string',\n\tmsg() {\n\t\treturn `expected string`;\n\t},\n};\n\nconst STRING_SINGLETON: StringSchema = {\n\tkind: 'schema',\n\ttype: 'string',\n\tformat: null,\n\t'~run'(input, _flags) {\n\t\tif (typeof input !== 'string') {\n\t\t\treturn ISSUE_TYPE_STRING;\n\t\t}\n\n\t\treturn undefined;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const string = <T extends string = string>(): StringSchema<T> => {\n\treturn STRING_SINGLETON as StringSchema<T>;\n};\n\n// #__NO_SIDE_EFFECTS__\nconst _formattedString = <TFormat extends keyof StringFormatMap>(\n\tformat: TFormat,\n\tvalidate: (input: string) => boolean,\n) => {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_string_format',\n\t\texpected: format,\n\t\tmsg() {\n\t\t\treturn `expected a ${format} formatted string`;\n\t\t},\n\t};\n\n\tconst schema: FormattedStringSchema<TFormat> = {\n\t\tkind: 'schema',\n\t\ttype: 'string',\n\t\tformat: format,\n\t\t'~run'(input, _flags) {\n\t\t\tif (typeof input !== 'string') {\n\t\t\t\treturn ISSUE_TYPE_STRING;\n\t\t\t}\n\n\t\t\tif (!validate(input)) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n\n\treturn () => schema;\n};\n\n// prettier-ignore\nexport const actorIdentifierString = /*#__PURE__*/ _formattedString('at-identifier', syntax.isActorIdentifier);\nexport const resourceUriString = /*#__PURE__*/ _formattedString('at-uri', syntax.isResourceUri);\nexport const cidString = /*#__PURE__*/ _formattedString('cid', syntax.isCid);\nexport const datetimeString = /*#__PURE__*/ _formattedString('datetime', syntax.isDatetime);\nexport const didString = /*#__PURE__*/ _formattedString('did', syntax.isDid);\nexport const handleString = /*#__PURE__*/ _formattedString('handle', syntax.isHandle);\nexport const languageCodeString = /*#__PURE__*/ _formattedString('language', syntax.isLanguageCode);\nexport const nsidString = /*#__PURE__*/ _formattedString('nsid', syntax.isNsid);\nexport const recordKeyString = /*#__PURE__*/ _formattedString('record-key', syntax.isRecordKey);\nexport const tidString = /*#__PURE__*/ _formattedString('tid', syntax.isTid);\nexport const genericUriString = /*#__PURE__*/ _formattedString('uri', syntax.isGenericUri);\n\n// #region String constraints\n\nexport interface StringLengthConstraint<\n\tTMinLength extends number = number,\n\tTMaxLength extends number = number,\n> extends BaseConstraint<string> {\n\treadonly type: 'string_length';\n\treadonly minLength: TMinLength;\n\treadonly maxLength: TMaxLength;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const stringLength: {\n\t<const TMinLength extends number>(min: TMinLength): StringLengthConstraint<TMinLength>;\n\t<const TMinLength extends number, const TMaxLength extends number>(\n\t\tmin: TMinLength,\n\t\tmax: TMaxLength,\n\t): StringLengthConstraint<TMinLength, TMaxLength>;\n} = (minLength: number, maxLength: number = Infinity): StringLengthConstraint => {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_string_length',\n\t\tminLength: minLength,\n\t\tmaxLength: maxLength,\n\t\tmsg() {\n\t\t\treturn formatRangeMessage('a string', 'character', minLength, maxLength);\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'constraint',\n\t\ttype: 'string_length',\n\t\tminLength: minLength,\n\t\tmaxLength: maxLength,\n\t\t'~run'(input, _flags) {\n\t\t\tif (!isUtf8LengthInRange(input, minLength, maxLength)) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t};\n};\n\nexport interface StringGraphemesConstraint<\n\tTMinGraphemes extends number = number,\n\tTMaxGraphemes extends number = number,\n> extends BaseConstraint<string> {\n\treadonly type: 'string_graphemes';\n\treadonly minGraphemes: TMinGraphemes;\n\treadonly maxGraphemes: TMaxGraphemes;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const stringGraphemes: {\n\t<const TMinGraphemes extends number>(min: TMinGraphemes): StringGraphemesConstraint<TMinGraphemes>;\n\t<const TMinGraphemes extends number, const TMaxGraphemes extends number>(\n\t\tmin: TMinGraphemes,\n\t\tmax: TMaxGraphemes,\n\t): StringGraphemesConstraint<TMinGraphemes, TMaxGraphemes>;\n} = (minGraphemes: number, maxGraphemes: number = Infinity): StringGraphemesConstraint => {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_string_graphemes',\n\t\tminGraphemes: minGraphemes,\n\t\tmaxGraphemes: maxGraphemes,\n\t\tmsg() {\n\t\t\treturn formatRangeMessage('a string', 'grapheme', minGraphemes, maxGraphemes);\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'constraint',\n\t\ttype: 'string_graphemes',\n\t\tminGraphemes: minGraphemes,\n\t\tmaxGraphemes: maxGraphemes,\n\t\t'~run'(input, _flags) {\n\t\t\tif (!isGraphemeLengthInRange(input, minGraphemes, maxGraphemes)) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t};\n};\n\n// #region Blob schema\n\nexport interface BlobSchema extends BaseSchema<interfaces.Blob | interfaces.LegacyBlob, interfaces.Blob> {\n\treadonly type: 'blob';\n}\n\nconst ISSUE_EXPECTED_BLOB: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'blob',\n\tmsg() {\n\t\treturn `expected blob`;\n\t},\n};\n\nconst BLOB_SCHEMA: BlobSchema = {\n\tkind: 'schema',\n\ttype: 'blob',\n\t'~run'(input, _flags) {\n\t\tif (typeof input !== 'object' || input === null) {\n\t\t\treturn ISSUE_EXPECTED_BLOB;\n\t\t}\n\n\t\tif (interfaces.isBlob(input)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (interfaces.isLegacyBlob(input)) {\n\t\t\tconst blob: interfaces.Blob = {\n\t\t\t\t$type: 'blob',\n\t\t\t\tmimeType: input.mimeType,\n\t\t\t\tref: { $link: input.cid },\n\t\t\t\tsize: -1,\n\t\t\t};\n\n\t\t\treturn ok(blob);\n\t\t}\n\n\t\treturn ISSUE_EXPECTED_BLOB;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const blob = (): BlobSchema => {\n\treturn BLOB_SCHEMA;\n};\n\n// #region IPLD bytes schema\n\nexport interface BytesSchema extends BaseSchema<interfaces.Bytes, interfaces.Bytes> {\n\treadonly type: 'bytes';\n}\n\nconst ISSUE_EXPECTED_BYTES: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'bytes',\n\tmsg() {\n\t\treturn `expected bytes`;\n\t},\n};\n\nconst BYTES_SCHEMA: BytesSchema = {\n\tkind: 'schema',\n\ttype: 'bytes',\n\t'~run'(input, _flags) {\n\t\tif (!interfaces.isBytes(input)) {\n\t\t\treturn ISSUE_EXPECTED_BYTES;\n\t\t}\n\n\t\treturn undefined;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const bytes = (): BytesSchema => {\n\treturn BYTES_SCHEMA;\n};\n\n// #region IPLD bytes constraint\nexport interface BytesSizeConstraint<\n\tTMinLength extends number = number,\n\tTMaxLength extends number = number,\n> extends BaseConstraint<interfaces.Bytes> {\n\treadonly type: 'bytes_size';\n\treadonly minSize: TMinLength;\n\treadonly maxSize: TMaxLength;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const bytesSize: {\n\t<const TMinLength extends number>(min: TMinLength): BytesSizeConstraint<TMinLength>;\n\t<const TMinLength extends number, const TMaxLength extends number>(\n\t\tmin: TMinLength,\n\t\tmax: TMaxLength,\n\t): BytesSizeConstraint<TMinLength, TMaxLength>;\n} = (minSize: number, maxSize: number = Infinity): BytesSizeConstraint => {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_bytes_size',\n\t\tminSize: minSize,\n\t\tmaxSize: maxSize,\n\t\tmsg() {\n\t\t\treturn formatRangeMessage('a byte array', 'byte', minSize, maxSize);\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'constraint',\n\t\ttype: 'bytes_size',\n\t\tminSize: minSize,\n\t\tmaxSize: maxSize,\n\t\t'~run'(input, _flags) {\n\t\t\tlet size: number;\n\n\t\t\tif (_isBytesWrapper(input)) {\n\t\t\t\tsize = input.buf.length;\n\t\t\t} else {\n\t\t\t\tconst str = input.$bytes;\n\t\t\t\tlet bytes = str.length;\n\n\t\t\t\tif (str.charCodeAt(bytes - 1) === 0x3d) {\n\t\t\t\t\tbytes--;\n\t\t\t\t}\n\t\t\t\tif (bytes > 1 && str.charCodeAt(bytes - 1) === 0x3d) {\n\t\t\t\t\tbytes--;\n\t\t\t\t}\n\n\t\t\t\tsize = (bytes * 3) >>> 2;\n\t\t\t}\n\n\t\t\tif (size < minSize) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\tif (size > maxSize) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t};\n};\n\n// #region IPLD CID type schema\n\nexport interface CidLinkSchema extends BaseSchema<interfaces.CidLink, interfaces.CidLink> {\n\treadonly type: 'cid_link';\n}\n\nconst ISSUE_EXPECTED_CID_LINK: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'cid-link',\n\tmsg() {\n\t\treturn `expected cid-link`;\n\t},\n};\n\nconst CID_LINK_SCHEMA: CidLinkSchema = {\n\tkind: 'schema',\n\ttype: 'cid_link',\n\t'~run'(input, _flags) {\n\t\tif (!interfaces.isCidLink(input)) {\n\t\t\treturn ISSUE_EXPECTED_CID_LINK;\n\t\t}\n\n\t\treturn undefined;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const cidLink = (): CidLinkSchema => {\n\treturn CID_LINK_SCHEMA;\n};\n\n// #region Nullable schema\n\nexport interface NullableSchema<TItem extends BaseSchema = BaseSchema> extends BaseSchema<\n\tInferInput<TItem> | null,\n\tInferOutput<TItem> | null\n> {\n\treadonly type: 'nullable';\n\treadonly wrapped: TItem;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const nullable = <TItem extends BaseSchema>(wrapped: TItem): NullableSchema<TItem> => {\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'nullable',\n\t\twrapped: wrapped,\n\t\t'~run'(input, flags) {\n\t\t\tif (input === null) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn wrapped['~run'](input, flags);\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\n// #region Optional schema\n\nexport type DefaultValue<TItem extends BaseSchema> =\n\t| InferOutput<TItem>\n\t| (() => InferOutput<TItem>)\n\t| undefined;\n\nexport type InferOptionalOutput<\n\tTItem extends BaseSchema,\n\tTDefault extends DefaultValue<TItem>,\n> = undefined extends TDefault ? InferOutput<TItem> | undefined : InferOutput<TItem>;\n\nexport interface OptionalSchema<\n\tTItem extends BaseSchema = BaseSchema,\n\tTDefault extends DefaultValue<TItem> = DefaultValue<TItem>,\n> extends BaseSchema<InferInput<TItem> | undefined, InferOptionalOutput<TItem, TDefault>> {\n\treadonly type: 'optional';\n\treadonly wrapped: TItem;\n\treadonly default: TDefault;\n}\n\ntype MaybeOptional<TItem extends BaseSchema> = TItem | OptionalSchema<TItem, undefined>;\n\n// #__NO_SIDE_EFFECTS__\nexport const optional: {\n\t<TItem extends BaseSchema>(wrapped: TItem): OptionalSchema<TItem, undefined>;\n\t<TItem extends BaseSchema, TDefault extends DefaultValue<TItem>>(\n\t\twrapped: TItem,\n\t\tdefaultValue: TDefault,\n\t): OptionalSchema<TItem, TDefault>;\n} = (wrapped: BaseSchema, defaultValue?: any): OptionalSchema<any, any> => {\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'optional',\n\t\twrapped: wrapped,\n\t\tdefault: defaultValue,\n\t\t'~run'(input, flags) {\n\t\t\tif (input === undefined) {\n\t\t\t\tif (defaultValue === undefined) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tconst value = typeof defaultValue === 'function' ? defaultValue() : defaultValue;\n\n\t\t\t\treturn ok(value);\n\t\t\t}\n\n\t\t\treturn wrapped['~run'](input, flags);\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\nconst isOptionalSchema = (schema: BaseSchema): schema is OptionalSchema<any, unknown> => {\n\treturn schema.type === 'optional';\n};\n\n// #region Array schema\n\nexport interface ArraySchema<TItem extends BaseSchema = BaseSchema> extends BaseSchema<unknown[], unknown[]> {\n\treadonly type: 'array';\n\treadonly item: TItem;\n\n\treadonly [kType]?: { in: InferInput<TItem>[]; out: InferOutput<TItem>[] };\n}\n\nconst ISSUE_TYPE_ARRAY: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'array',\n\tmsg() {\n\t\treturn `expected array`;\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const array = <TItem extends BaseSchema>(item: TItem | (() => TItem)): ArraySchema<TItem> => {\n\tconst resolvedShape = lazy(() => {\n\t\treturn typeof item === 'function' ? item() : item;\n\t});\n\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'array',\n\t\tget item() {\n\t\t\treturn lazyProperty(this, 'item', resolvedShape.value);\n\t\t},\n\t\tget '~run'() {\n\t\t\tconst shape = resolvedShape.value;\n\n\t\t\tconst matcher: Matcher = (input, flags) => {\n\t\t\t\tif (!isArray(input)) {\n\t\t\t\t\treturn ISSUE_TYPE_ARRAY;\n\t\t\t\t}\n\n\t\t\t\tlet issues: IssueTree | undefined;\n\t\t\t\tlet output: any[] | undefined;\n\n\t\t\t\tfor (let idx = 0, len = input.length; idx < len; idx++) {\n\t\t\t\t\tconst val = input[idx];\n\t\t\t\t\tconst r = shape['~run'](val, flags);\n\n\t\t\t\t\tif (r !== undefined) {\n\t\t\t\t\t\tif (r.ok) {\n\t\t\t\t\t\t\tif (output === undefined) {\n\t\t\t\t\t\t\t\toutput = input.slice();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\toutput[idx] = r.value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tissues = joinIssues(issues, prependPath(idx, r));\n\n\t\t\t\t\t\t\tif (flags & FLAG_ABORT_EARLY) {\n\t\t\t\t\t\t\t\treturn issues;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (issues !== undefined) {\n\t\t\t\t\treturn issues;\n\t\t\t\t}\n\n\t\t\t\tif (output !== undefined) {\n\t\t\t\t\treturn ok(output);\n\t\t\t\t}\n\n\t\t\t\treturn undefined;\n\t\t\t};\n\n\t\t\treturn lazyProperty(this, '~run', matcher);\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\n// #region Array constraints\n\nexport interface ArrayLengthConstraint<\n\tTMinLength extends number = number,\n\tTMaxLength extends number = number,\n> extends BaseConstraint<unknown[]> {\n\treadonly type: 'array_length';\n\treadonly minLength: TMinLength;\n\treadonly maxLength: TMaxLength;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const arrayLength: {\n\t<const TMinLength extends number>(min: TMinLength): ArrayLengthConstraint<TMinLength>;\n\t<const TMinLength extends number, const TMaxLength extends number>(\n\t\tmin: TMinLength,\n\t\tmax: TMaxLength,\n\t): ArrayLengthConstraint<TMinLength, TMaxLength>;\n} = (minLength: number, maxLength: number = Infinity): ArrayLengthConstraint => {\n\tconst issue: IssueLeaf = {\n\t\tok: false,\n\t\tcode: 'invalid_array_length',\n\t\tminLength: minLength,\n\t\tmaxLength: maxLength,\n\t\tmsg() {\n\t\t\treturn formatRangeMessage('an array', 'item', minLength, maxLength);\n\t\t},\n\t};\n\n\treturn {\n\t\tkind: 'constraint',\n\t\ttype: 'array_length',\n\t\tminLength: minLength,\n\t\tmaxLength: maxLength,\n\t\t'~run'(input, _flags) {\n\t\t\tconst length = input.length;\n\n\t\t\tif (length < minLength) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\tif (length > maxLength) {\n\t\t\t\treturn issue;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t};\n};\n\n// #region Object schema\n\n// `ObjectSchema` accepts a `LooseObjectShape` instead of `ObjectShape` to allow\n// for circular references, and this means preventing TypeScript from attempting\n// to eagerly evaluate the shape, unfortunate that this means we can't throw a\n// type issue if you add a non-schema value into the shape though\n\nexport type LooseObjectShape = Record<string, any>;\nexport type ObjectShape = Record<string, BaseSchema>;\n\nexport type OptionalObjectInputKeys<TShape extends ObjectShape> = {\n\t[Key in keyof TShape]: TShape[Key] extends OptionalSchema<any, any> ? Key : never;\n}[keyof TShape];\n\nexport type OptionalObjectOutputKeys<TShape extends ObjectShape> = {\n\t[Key in keyof TShape]: TShape[Key] extends OptionalSchema<any, infer Default>\n\t\t? undefined extends Default\n\t\t\t? Key\n\t\t\t: never\n\t\t: never;\n}[keyof TShape];\n\ntype InferObjectInput<TShape extends ObjectShape> = Flatten<\n\t{\n\t\t-readonly [Key in keyof TShape as Key extends OptionalObjectInputKeys<TShape> ? never : Key]: InferInput<\n\t\t\tTShape[Key]\n\t\t>;\n\t} & {\n\t\t-readonly [Key in keyof TShape as Key extends OptionalObjectInputKeys<TShape> ? Key : never]?: InferInput<\n\t\t\tTShape[Key]\n\t\t>;\n\t}\n>;\n\ntype InferObjectOutput<TShape extends ObjectShape> = Flatten<\n\t{\n\t\t-readonly [Key in keyof TShape as Key extends OptionalObjectOutputKeys<TShape>\n\t\t\t? never\n\t\t\t: Key]: InferOutput<TShape[Key]>;\n\t} & {\n\t\t-readonly [Key in keyof TShape as Key extends OptionalObjectOutputKeys<TShape>\n\t\t\t? Key\n\t\t\t: never]?: InferOutput<TShape[Key]>;\n\t}\n>;\n\nexport interface ObjectSchema<TShape extends LooseObjectShape = LooseObjectShape> extends BaseSchema<\n\tRecord<string, unknown>\n> {\n\treadonly type: 'object';\n\treadonly shape: Readonly<TShape>;\n\n\t// passing `InferObjectX` into `extends BaseSchema<...>` eagerly evaluates the\n\t// shape, however, passing it as a property means that it's only evaluated if\n\t// you attempt to grab the value.\n\treadonly [kType]?: { in: InferObjectInput<TShape>; out: InferObjectOutput<TShape> };\n}\n\ninterface ObjectEntry {\n\tkey: string;\n\tschema: BaseSchema;\n\toptional: boolean;\n\tmissing: IssueTree;\n}\n\nconst ISSUE_TYPE_OBJECT: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'object',\n\tmsg() {\n\t\treturn `expected object`;\n\t},\n};\n\nconst ISSUE_MISSING: IssueLeaf = {\n\tok: false,\n\tcode: 'missing_value',\n\tmsg() {\n\t\treturn `missing value`;\n\t},\n};\n\nconst set = (obj: Record<string, unknown>, key: string, value: unknown): void => {\n\tif (key === '__proto__') {\n\t\tObject.defineProperty(obj, key, { value });\n\t} else {\n\t\tobj[key] = value;\n\t}\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const object = <TShape extends LooseObjectShape>(shape: TShape): ObjectSchema<TShape> => {\n\tconst resolvedEntries = lazy(() => {\n\t\tconst resolved: ObjectEntry[] = [];\n\n\t\tfor (const key in shape) {\n\t\t\tconst schema = shape[key];\n\n\t\t\tresolved.push({\n\t\t\t\tkey: key,\n\t\t\t\tschema: schema,\n\t\t\t\toptional: isOptionalSchema(schema),\n\t\t\t\tmissing: prependPath(key, ISSUE_MISSING),\n\t\t\t});\n\t\t}\n\n\t\treturn resolved;\n\t});\n\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'object',\n\t\tget shape() {\n\t\t\t// if we just return the shape as is then it wouldn't be the same exact\n\t\t\t// shape when getters are present.\n\t\t\tconst resolved = resolvedEntries.value;\n\t\t\tconst obj: any = {};\n\n\t\t\tfor (const entry of resolved) {\n\t\t\t\tobj[entry.key] = entry.schema;\n\t\t\t}\n\n\t\t\treturn lazyProperty(this, 'shape', obj as TShape);\n\t\t},\n\t\tget '~run'() {\n\t\t\tconst shape = resolvedEntries.value;\n\t\t\tconst len = shape.length;\n\n\t\t\tconst generateFastpass = (): Matcher => {\n\t\t\t\tconst fields: [string, any][] = [\n\t\t\t\t\t['$ok', ok],\n\t\t\t\t\t['$joinIssues', joinIssues],\n\t\t\t\t\t['$prependPath', prependPath],\n\t\t\t\t];\n\n\t\t\t\tlet doc = `let $iss,$out;`;\n\n\t\t\t\tfor (let idx = 0; idx < len; idx++) {\n\t\t\t\t\tconst entry = shape[idx];\n\n\t\t\t\t\tconst key = entry.key;\n\t\t\t\t\tconst esckey = JSON.stringify(key);\n\n\t\t\t\t\tconst id = `_${idx}`;\n\n\t\t\t\t\tdoc += `{const $val=$in[${esckey}];`;\n\n\t\t\t\t\tif (entry.optional) {\n\t\t\t\t\t\tdoc += `if($val!==undefined){`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdoc += `if($val!==undefined||${esckey} in $in){`;\n\t\t\t\t\t}\n\n\t\t\t\t\tdoc += `const $res=${id}$schema[\"~run\"]($val,$flags);if($res!==undefined)if($res.ok)${key !== '__proto__' ? `($out??={...$in})[${esckey}]=$res.value` : `Object.defineProperty($out??={...$in},${esckey},{value:$res.value})`};else if((($iss=$joinIssues($iss,$prependPath(${esckey},$res))),$flags&${FLAG_ABORT_EARLY}))return $iss;}`;\n\n\t\t\t\t\tif (entry.optional) {\n\t\t\t\t\t\tconst schema = entry.schema as OptionalSchema;\n\t\t\t\t\t\tconst innerSchema = schema.wrapped;\n\t\t\t\t\t\tconst defaultValue = schema.default;\n\n\t\t\t\t\t\tfields.push([`${id}$schema`, innerSchema]);\n\n\t\t\t\t\t\tif (defaultValue !== undefined) {\n\t\t\t\t\t\t\tconst calls = typeof defaultValue === 'function' ? `${id}$default()` : `${id}$default`;\n\n\t\t\t\t\t\t\tfields.push([`${id}$default`, defaultValue]);\n\n\t\t\t\t\t\t\tdoc +=\n\t\t\t\t\t\t\t\tkey !== '__proto__'\n\t\t\t\t\t\t\t\t\t? `else($out??={...$in})[${esckey}]=${calls};`\n\t\t\t\t\t\t\t\t\t: `else Object.defineProperty($out??={...$in},${esckey},{value:${calls}});`;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfields.push([`${id}$schema`, entry.schema]);\n\t\t\t\t\t\tfields.push([`${id}$missing`, entry.missing]);\n\n\t\t\t\t\t\tdoc += `else if((($iss=$joinIssues($iss,${id}$missing)),$flags&${FLAG_ABORT_EARLY}))return $iss;`;\n\t\t\t\t\t}\n\n\t\t\t\t\tdoc += `}`;\n\t\t\t\t}\n\n\t\t\t\tdoc += `if($iss!==undefined)return $iss;if($out!==undefined)return $ok($out);`;\n\n\t\t\t\tconst fn = new Function(\n\t\t\t\t\t`[${fields.map(([id]) => id).join(',')}]`,\n\t\t\t\t\t`return function matcher($in,$flags){${doc}}`,\n\t\t\t\t);\n\n\t\t\t\treturn fn(fields.map(([, field]) => field));\n\t\t\t};\n\n\t\t\tif (allowsEval.value) {\n\t\t\t\tconst fastpass = generateFastpass();\n\n\t\t\t\tconst matcher: Matcher = (input, flags) => {\n\t\t\t\t\tif (!isObject(input)) {\n\t\t\t\t\t\treturn ISSUE_TYPE_OBJECT;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn fastpass(input, flags);\n\t\t\t\t};\n\n\t\t\t\treturn lazyProperty(this, '~run', matcher);\n\t\t\t}\n\n\t\t\tconst matcher: Matcher = (input, flags) => {\n\t\t\t\tif (!isObject(input)) {\n\t\t\t\t\treturn ISSUE_TYPE_OBJECT;\n\t\t\t\t}\n\n\t\t\t\tlet issues: IssueTree | undefined;\n\t\t\t\tlet output: Record<string, unknown> | undefined;\n\n\t\t\t\tfor (let idx = 0; idx < len; idx++) {\n\t\t\t\t\tconst entry = shape[idx];\n\n\t\t\t\t\tconst key = entry.key;\n\t\t\t\t\tconst value = input[key];\n\n\t\t\t\t\tif (!entry.optional && value === undefined && !(key in input)) {\n\t\t\t\t\t\tissues = joinIssues(issues, entry.missing);\n\n\t\t\t\t\t\tif (flags & FLAG_ABORT_EARLY) {\n\t\t\t\t\t\t\treturn issues;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst r = entry.schema['~run'](value, flags);\n\n\t\t\t\t\tif (r !== undefined) {\n\t\t\t\t\t\tif (r.ok) {\n\t\t\t\t\t\t\tif (output === undefined) {\n\t\t\t\t\t\t\t\toutput = { ...input };\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t/*#__INLINE__*/ set(output, key, r.value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tissues = joinIssues(issues, prependPath(key, r));\n\n\t\t\t\t\t\t\tif (flags & FLAG_ABORT_EARLY) {\n\t\t\t\t\t\t\t\treturn issues;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (issues !== undefined) {\n\t\t\t\t\treturn issues;\n\t\t\t\t}\n\n\t\t\t\tif (output !== undefined) {\n\t\t\t\t\treturn ok(output);\n\t\t\t\t}\n\n\t\t\t\treturn undefined;\n\t\t\t};\n\n\t\t\treturn lazyProperty(this, '~run', matcher);\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\n// #region Record schema\n//\n// unfortunately, adapting for circular references has meant that we can't have\n// TypeScript check the object against a particular shape ($type field required)\n\nexport type RecordObjectShape = {\n\t$type: LiteralSchema<syntax.Nsid>;\n\t[key: string]: BaseSchema;\n};\n\nexport type RecordKeySchema = StringSchema | FormattedStringSchema | LiteralSchema<string>;\nexport type RecordObjectSchema = ObjectSchema<RecordObjectShape>;\n\nexport interface RecordSchema<TObject extends ObjectSchema, TKey extends RecordKeySchema> extends BaseSchema<\n\tRecord<string, unknown>\n> {\n\treadonly type: 'record';\n\treadonly key: TKey;\n\treadonly object: TObject;\n\n\treadonly [kType]?: { in: InferInput<TObject>; out: InferOutput<TObject> };\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const record = <TKey extends RecordKeySchema, TObject extends ObjectSchema>(\n\tkey: TKey,\n\tobject: TObject,\n): RecordSchema<TObject, TKey> => {\n\tconst validatedObject = lazy((): TObject => {\n\t\tconst shape = object.shape;\n\n\t\tlet t = shape.$type as MaybeOptional<LiteralSchema<syntax.Nsid>> | undefined;\n\n\t\tassert(t !== undefined, `expected $type in record to be defined`);\n\t\tif (t.type === 'optional') {\n\t\t\tt = t.wrapped;\n\t\t}\n\n\t\tassert(t.type === 'literal' && typeof t.expected === 'string', `expected $type to be a string literal`);\n\n\t\treturn object;\n\t});\n\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'record',\n\t\tkey: key,\n\t\tget object() {\n\t\t\treturn lazyProperty(this, 'object', validatedObject.value);\n\t\t},\n\t\t'~run'(input, flags) {\n\t\t\treturn lazyProperty(this, '~run', validatedObject.value['~run'])(input, flags);\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\n// #region Variant schema\n\ntype VariantTuple = readonly ObjectSchema<any>[];\n\ntype InferVariantInput<TMembers extends VariantTuple> = $type.enforce<InferInput<TMembers[number]>>;\n\ntype InferVariantOutput<TMembers extends VariantTuple> = $type.enforce<InferOutput<TMembers[number]>>;\n\nexport interface VariantSchema<\n\tTMembers extends VariantTuple = VariantTuple,\n\tTClosed extends boolean = boolean,\n> extends BaseSchema<Record<string, unknown>> {\n\treadonly type: 'variant';\n\treadonly members: TMembers;\n\treadonly closed: TClosed;\n\n\treadonly [kType]?: { in: InferVariantInput<TMembers>; out: InferVariantOutput<TMembers> };\n}\n\nconst ISSUE_VARIANT_MISSING = /*#__PURE__*/ prependPath('$type', ISSUE_MISSING);\n\nconst ISSUE_VARIANT_TYPE = /*#__PURE__*/ prependPath('$type', ISSUE_TYPE_STRING);\n\n// #__NO_SIDE_EFFECTS__\nexport const variant: {\n\t<const TMembers extends VariantTuple>(members: TMembers): VariantSchema<TMembers>;\n\t<const TMembers extends VariantTuple, TClosed extends boolean>(\n\t\tmembers: TMembers,\n\t\tclosed: TClosed,\n\t): VariantSchema<TMembers, TClosed>;\n} = (members: ObjectSchema[], closed: boolean = false): VariantSchema<any, any> => {\n\treturn {\n\t\tkind: 'schema',\n\t\ttype: 'variant',\n\t\tmembers: members,\n\t\tclosed: closed,\n\t\tget '~run'() {\n\t\t\tconst types: string[] = [];\n\t\t\tconst schemas: ObjectSchema[] = [];\n\n\t\t\tfor (let idx = 0, len = members.length; idx < len; idx++) {\n\t\t\t\tconst member = members[idx]!;\n\t\t\t\tconst shape = member.shape;\n\n\t\t\t\tlet t = shape.$type as MaybeOptional<LiteralSchema<syntax.Nsid>> | undefined;\n\n\t\t\t\tassert(t !== undefined, `expected $type in variant member #${idx} to be defined`);\n\t\t\t\tif (t.type === 'optional') {\n\t\t\t\t\tt = t.wrapped;\n\t\t\t\t}\n\n\t\t\t\tassert(\n\t\t\t\t\tt.type === 'literal' && typeof t.expected === 'string',\n\t\t\t\t\t`expected $type in variant member #${idx} to be a string literal`,\n\t\t\t\t);\n\n\t\t\t\ttypes.push(t.expected);\n\t\t\t\tschemas.push(member);\n\t\t\t}\n\n\t\t\tconst issue: IssueLeaf = {\n\t\t\t\tok: false,\n\t\t\t\tcode: 'invalid_variant',\n\t\t\t\texpected: types,\n\t\t\t\tmsg() {\n\t\t\t\t\treturn `expected ${separatedList(types, 'or')}`;\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst matcher: Matcher = (input, flags) => {\n\t\t\t\tif (!isObject(input)) {\n\t\t\t\t\treturn ISSUE_TYPE_OBJECT;\n\t\t\t\t}\n\n\t\t\t\tconst type = input.$type;\n\n\t\t\t\tif (type === undefined && !('$type' in input)) {\n\t\t\t\t\treturn ISSUE_VARIANT_MISSING;\n\t\t\t\t}\n\n\t\t\t\tif (typeof type !== 'string') {\n\t\t\t\t\treturn closed ? issue : ISSUE_VARIANT_TYPE;\n\t\t\t\t}\n\n\t\t\t\tfor (let idx = 0, len = types.length; idx < len; idx++) {\n\t\t\t\t\tif (types[idx] === type) {\n\t\t\t\t\t\treturn schemas[idx]!['~run'](input, flags);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (closed) {\n\t\t\t\t\treturn issue;\n\t\t\t\t}\n\n\t\t\t\treturn undefined;\n\t\t\t};\n\n\t\t\treturn lazyProperty(this, '~run', matcher);\n\t\t},\n\t\tget '~standard'() {\n\t\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t\t},\n\t};\n};\n\n// #region Unknown schema\n\nexport interface UnknownSchema extends BaseSchema<Record<string, unknown>> {\n\treadonly type: 'unknown';\n}\n\nconst ISSUE_TYPE_UNKNOWN: IssueLeaf = {\n\tok: false,\n\tcode: 'invalid_type',\n\texpected: 'unknown',\n\tmsg() {\n\t\treturn `expected unknown`;\n\t},\n};\n\nconst UNKNOWN_SCHEMA: UnknownSchema = {\n\tkind: 'schema',\n\ttype: 'unknown',\n\t'~run'(input, _flags) {\n\t\tif (typeof input !== 'object' || input === null) {\n\t\t\treturn ISSUE_TYPE_UNKNOWN;\n\t\t}\n\n\t\treturn undefined;\n\t},\n\tget '~standard'() {\n\t\treturn lazyProperty(this, '~standard', toStandardSchema(this));\n\t},\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const unknown = (): UnknownSchema => {\n\treturn UNKNOWN_SCHEMA;\n};\n\n// #region XRPC types\n\nexport interface XRPCLexBodyParam<\n\tTSchema extends ObjectSchema | VariantSchema = ObjectSchema | VariantSchema,\n> {\n\treadonly type: 'lex';\n\treadonly schema: TSchema;\n}\n\nexport interface XRPCBlobBodyParam {\n\treadonly type: 'blob';\n\treadonly encoding?: string[];\n}\n\nexport type XRPCBodyParam = XRPCLexBodyParam | XRPCBlobBodyParam | null;\n\nexport type InferXRPCBodyInput<T extends XRPCBodyParam> =\n\tT extends XRPCLexBodyParam<infer Schema>\n\t\t? InferInput<Schema>\n\t\t: T extends XRPCBlobBodyParam\n\t\t\t? Blob\n\t\t\t: T extends null\n\t\t\t\t? void\n\t\t\t\t: never;\n\nexport type InferXRPCBodyOutput<T extends XRPCBodyParam> =\n\tT extends XRPCLexBodyParam<infer Schema>\n\t\t? InferOutput<Schema>\n\t\t: T extends XRPCBlobBodyParam\n\t\t\t? Blob\n\t\t\t: T extends null\n\t\t\t\t? void\n\t\t\t\t: never;\n\n// #region XRPC procedure metadata\n\nexport interface XRPCProcedureMetadata<\n\tTParams extends ObjectSchema | null = ObjectSchema | null,\n\tTInput extends XRPCBodyParam = XRPCBodyParam,\n\tTOutput extends XRPCBodyParam = XRPCBodyParam,\n\tTNsid extends syntax.Nsid = syntax.Nsid,\n> extends BaseMetadata {\n\treadonly type: 'xrpc_procedure';\n\treadonly nsid: TNsid;\n\treadonly params: TParams;\n\treadonly input: TInput;\n\treadonly output: TOutput;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const procedure = <\n\tTNsid extends syntax.Nsid,\n\tTParams extends ObjectSchema | null,\n\tTInput extends XRPCBodyParam,\n\tTOutput extends XRPCBodyParam,\n>(\n\tnsid: TNsid,\n\toptions: {\n\t\tparams: TParams;\n\t\tinput: TInput;\n\t\toutput: TOutput;\n\t},\n): XRPCProcedureMetadata<TParams, TInput, TOutput, TNsid> => {\n\t// `schema` can be a getter, and we'd have to resolve that getter.\n\n\txrpcSchemaGenerated = true;\n\n\treturn {\n\t\tkind: 'metadata',\n\t\ttype: 'xrpc_procedure',\n\t\tnsid: nsid,\n\t\tparams: options.params,\n\t\tget input() {\n\t\t\tlet val = options.input;\n\n\t\t\tswitch (val?.type) {\n\t\t\t\tcase 'lex': {\n\t\t\t\t\tval = {\n\t\t\t\t\t\ttype: 'lex',\n\t\t\t\t\t\tschema: val.schema,\n\t\t\t\t\t} as TInput;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn lazyProperty(this, 'input', val);\n\t\t},\n\t\tget output() {\n\t\t\tlet val = options.output;\n\n\t\t\tswitch (val?.type) {\n\t\t\t\tcase 'lex': {\n\t\t\t\t\tval = {\n\t\t\t\t\t\ttype: 'lex',\n\t\t\t\t\t\tschema: val.schema,\n\t\t\t\t\t} as TOutput;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn lazyProperty(this, 'output', val);\n\t\t},\n\t};\n};\n\n// #region XRPC query metadata\n\nexport interface XRPCQueryMetadata<\n\tTParams extends ObjectSchema | null = ObjectSchema | null,\n\tTOutput extends XRPCBodyParam = XRPCBodyParam,\n\tTNsid extends syntax.Nsid = syntax.Nsid,\n> extends BaseMetadata {\n\treadonly type: 'xrpc_query';\n\treadonly nsid: TNsid;\n\treadonly params: TParams;\n\treadonly output: TOutput;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const query = <\n\tTNsid extends syntax.Nsid,\n\tTParams extends ObjectSchema | null,\n\tTOutput extends XRPCBodyParam,\n>(\n\tnsid: TNsid,\n\toptions: {\n\t\tparams: TParams;\n\t\toutput: TOutput;\n\t},\n): XRPCQueryMetadata<TParams, TOutput, TNsid> => {\n\t// `schema` can be a getter, and we'd have to resolve that getter.\n\n\txrpcSchemaGenerated = true;\n\n\treturn {\n\t\tkind: 'metadata',\n\t\ttype: 'xrpc_query',\n\t\tnsid: nsid,\n\t\tparams: options.params,\n\t\tget output() {\n\t\t\tlet val = options.output;\n\n\t\t\tswitch (val?.type) {\n\t\t\t\tcase 'lex': {\n\t\t\t\t\tval = {\n\t\t\t\t\t\ttype: 'lex',\n\t\t\t\t\t\tschema: val.schema,\n\t\t\t\t\t} as TOutput;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn lazyProperty(this, 'output', val);\n\t\t},\n\t};\n};\n\n// #region XRPC subscription metadata\n\nexport interface XRPCSubscriptionMetadata<\n\tTParams extends ObjectSchema | null = ObjectSchema | null,\n\tTMessage extends ObjectSchema<any> | VariantSchema<any, any> | null =\n\t\t| ObjectSchema<any>\n\t\t| VariantSchema<any, any>\n\t\t| null,\n\tTNsid extends syntax.Nsid = syntax.Nsid,\n> extends BaseMetadata {\n\treadonly type: 'xrpc_subscription';\n\treadonly nsid: TNsid;\n\treadonly params: TParams;\n\treadonly message: TMessage;\n}\n\n// #__NO_SIDE_EFFECTS__\nexport const subscription = <\n\tTNsid extends syntax.Nsid,\n\tTParams extends ObjectSchema | null,\n\tTMessage extends ObjectSchema<any> | VariantSchema<any, any> | null,\n>(\n\tnsid: TNsid,\n\toptions: {\n\t\tparams: TParams;\n\t\treadonly message: TMessage;\n\t},\n): XRPCSubscriptionMetadata<TParams, TMessage, TNsid> => {\n\t// `message` can be a getter, and we'd have to resolve that getter.\n\n\treturn {\n\t\tkind: 'metadata',\n\t\ttype: 'xrpc_subscription',\n\t\tnsid: nsid,\n\t\tparams: options.params,\n\t\tget message() {\n\t\t\treturn lazyProperty(this, 'message', options.message);\n\t\t},\n\t};\n};\n","const segmenter = new Intl.Segmenter();\n\nconst isAsciiWithoutCr = (text: string): boolean => {\n\tconst len = text.length;\n\tlet idx = 0;\n\n\twhile (idx + 3 < len) {\n\t\tconst a = text.charCodeAt(idx);\n\t\tconst b = text.charCodeAt(idx + 1);\n\t\tconst c = text.charCodeAt(idx + 2);\n\t\tconst d = text.charCodeAt(idx + 3);\n\n\t\tif ((a | b | c | d) > 0x7f || a === 0x0d || b === 0x0d || c === 0x0d || d === 0x0d) {\n\t\t\treturn false;\n\t\t}\n\n\t\tidx += 4;\n\t}\n\n\twhile (idx < len) {\n\t\tconst code = text.charCodeAt(idx);\n\t\tif (code > 0x7f || code === 0x0d) {\n\t\t\treturn false;\n\t\t}\n\n\t\tidx++;\n\t}\n\n\treturn true;\n};\n\n/**\n * returns the grapheme length of a string\n * @param text string to count graphemes in\n * @returns grapheme count\n */\nexport const getGraphemeLength = (text: string): number => {\n\tif (isAsciiWithoutCr(text)) {\n\t\treturn text.length;\n\t}\n\n\tconst iterator = segmenter.segment(text)[Symbol.iterator]();\n\tlet count = 0;\n\n\twhile (!iterator.next().done) {\n\t\tcount++;\n\t}\n\n\treturn count;\n};\n\n/**\n * checks if the grapheme length of a string is within the specified range\n * @param text string to check\n * @param min minimum grapheme length (inclusive)\n * @param max maximum grapheme length (inclusive)\n * @returns true if the grapheme length is within range\n */\nexport const isGraphemeLengthInRange = (text: string, min: number, max: number): boolean => {\n\tconst utf16Len = text.length;\n\n\t// UTF-16 length < min means grapheme count < min\n\tif (utf16Len < min) {\n\t\treturn false;\n\t}\n\n\t// if there's no minimum constraint and UTF-16 length is within max,\n\t// grapheme count is definitely within max\n\tif (min === 0 && utf16Len <= max) {\n\t\treturn true;\n\t}\n\n\tif (isAsciiWithoutCr(text)) {\n\t\treturn utf16Len <= max;\n\t}\n\n\t// count graphemes with early termination\n\tconst iterator = segmenter.segment(text)[Symbol.iterator]();\n\tlet count = 0;\n\n\twhile (!iterator.next().done) {\n\t\tcount++;\n\t\tif (count > max) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn count >= min;\n};\n","/**\n * represents an object containing raw binary data encoded as a base64 string\n */\nexport interface Bytes {\n\t$bytes: string;\n}\n\nconst BYTES_SYMBOL = Symbol.for('@atcute/bytes-wrapper');\n\n/**\n * this should match with {@link file://./../../../../utilities/cbor/lib/bytes.ts}\n * @internal\n */\nexport interface _BytesWrapper {\n\treadonly [BYTES_SYMBOL]: true;\n\n\treadonly buf: Uint8Array;\n\treadonly $bytes: string;\n\n\ttoJSON(): Bytes;\n}\n\n/**\n * @internal\n */\n// #__NO_SIDE_EFFECTS__\nexport const _isBytesWrapper = (input: unknown): input is _BytesWrapper => {\n\treturn typeof input === 'object' && input !== null && BYTES_SYMBOL in input;\n};\n\nconst BASE64_RE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}(?:==)?|[A-Za-z0-9+/]{3}=?)?$/;\nconst isBase64 = (input: unknown): input is string => {\n\tif (typeof input !== 'string') {\n\t\treturn false;\n\t}\n\n\treturn BASE64_RE.test(input);\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const isBytes = (input: unknown): input is Bytes => {\n\tconst v = input as any;\n\n\treturn (\n\t\ttypeof v === 'object' &&\n\t\tv !== null &&\n\t\t(BYTES_SYMBOL in v || (isBase64(v.$bytes) && Object.keys(v).length === 1))\n\t);\n};\n","export { isBlob, isLegacyBlob, type Blob, type LegacyBlob } from './blob.ts';\nexport { isBytes, type Bytes } from './bytes.ts';\nexport { isCidLink, type CidLink } from './cid-link.ts';\n","import type { Cid } from '../syntax/cid.ts';\n\nimport { isCidLink, type CidLink } from './cid-link.ts';\n\n/**\n * represents a reference to a data blob\n */\nexport interface Blob<TMime extends string = string> {\n\t$type: 'blob';\n\tmimeType: TMime;\n\tref: CidLink;\n\tsize: number;\n}\n\nexport const isBlob = (input: unknown): input is Blob => {\n\tconst v = input as any;\n\n\treturn (\n\t\ttypeof v === 'object' &&\n\t\tv !== null &&\n\t\tv.$type === 'blob' &&\n\t\ttypeof v.mimeType === 'string' &&\n\t\tNumber.isSafeInteger(v.size) &&\n\t\tisCidLink(v.ref) &&\n\t\tObject.keys(v).length === 4\n\t);\n};\n\n/**\n * deprecated interface representing an interface to a data blob\n */\nexport interface LegacyBlob<TMime extends string = string> {\n\tcid: Cid;\n\tmimeType: TMime;\n}\n\nexport const isLegacyBlob = (input: unknown): input is LegacyBlob => {\n\tconst v = input as any;\n\n\treturn (\n\t\ttypeof v === 'object' &&\n\t\tv !== null &&\n\t\ttypeof v.cid === 'string' &&\n\t\ttypeof v.mimeType === 'string' &&\n\t\tObject.keys(v).length === 2\n\t);\n};\n","import { isCid, type Cid } from '../syntax/cid.ts';\n\n/**\n * represents a content identifier (CID) reference\n */\nexport interface CidLink {\n\t$link: Cid;\n}\n\nconst CID_LINK_SYMBOL = Symbol.for('@atcute/cid-link-wrapper');\n\n/**\n * this should match with {@link file://./../../../../utilities/cid/lib/cid-link.ts}\n * @internal\n */\nexport interface _CidLinkWrapper {\n\treadonly [CID_LINK_SYMBOL]: true;\n\n\treadonly bytes: Uint8Array;\n\treadonly $link: string;\n\n\ttoJSON(): CidLink;\n}\n\n/**\n * @internal\n */\nexport const _isCidLinkWrapper = (input: unknown): input is _CidLinkWrapper => {\n\treturn typeof input === 'object' && input !== null && CID_LINK_SYMBOL in input;\n};\n\nexport const isCidLink = (input: unknown): input is CidLink => {\n\tconst v = input as any;\n\n\treturn typeof v === 'object' && v !== null && (CID_LINK_SYMBOL in v || isCid(v.$link));\n};\n","// #__NO_SIDE_EFFECTS__\nexport const lazyProperty = <T>(obj: object, prop: string | number | symbol, value: T): T => {\n\tObject.defineProperty(obj, prop, { value });\n\treturn value;\n};\n\n// #__NO_SIDE_EFFECTS__\nexport const lazy = <T>(getter: () => T): { readonly value: T } => {\n\treturn {\n\t\tget value() {\n\t\t\tconst value = getter();\n\t\t\treturn lazyProperty(this, 'value', value);\n\t\t},\n\t};\n};\n\nexport const isArray = Array.isArray;\n\n// #__NO_SIDE_EFFECTS__\nexport const isObject = (input: unknown): input is Record<string, unknown> => {\n\treturn typeof input === 'object' && input !== null && !isArray(input);\n};\n\nexport const allowsEval = /*#__PURE__*/ lazy((): boolean => {\n\tif (typeof navigator !== 'undefined' && navigator?.userAgent?.includes('Cloudflare')) {\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tconst F = Function;\n\t\t// oxlint-disable-next-line no-new -- intentional check for Function constructor availability\n\t\tnew F('');\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n});\n","/** fetch handler function */\nexport type FetchHandler = (pathname: string, init: RequestInit) => Promise<Response>;\n\n/** fetch handler in an object */\nexport interface FetchHandlerObject {\n\thandle(this: FetchHandlerObject, pathname: string, init: RequestInit): Promise<Response>;\n}\n\nexport const buildFetchHandler = (handler: FetchHandler | FetchHandlerObject): FetchHandler => {\n\tif (typeof handler === 'object') {\n\t\treturn handler.handle.bind(handler);\n\t}\n\n\treturn handler;\n};\n\nexport interface SimpleFetchHandlerOptions {\n\tservice: string | URL;\n\tfetch?: typeof globalThis.fetch;\n}\n\nexport const simpleFetchHandler = ({\n\tservice,\n\tfetch: _fetch = fetch,\n}: SimpleFetchHandlerOptions): FetchHandler => {\n\treturn async (pathname, init) => {\n\t\tconst url = new URL(pathname, service);\n\t\treturn await _fetch(url.href, init);\n\t};\n};\n","import { getPdsEndpoint, type DidDocument } from '@atcute/identity';\nimport type { Did } from '@atcute/lexicons';\n\nimport type { ComAtprotoServerCreateSession } from '@atcute/atproto';\n\nimport { Client, ClientResponseError, isXRPCErrorPayload, ok } from './client.js';\nimport { simpleFetchHandler, type FetchHandlerObject } from './fetch-handler.js';\n\nimport { decodeJwt } from './utils/jwt.js';\n\n/**\n * represents the decoded access token, for convenience\n * @deprecated\n */\nexport interface AtpAccessJwt {\n\t/** access token scope */\n\tscope:\n\t\t| 'com.atproto.access'\n\t\t| 'com.atproto.appPass'\n\t\t| 'com.atproto.appPassPrivileged'\n\t\t| 'com.atproto.signupQueued'\n\t\t| 'com.atproto.takendown';\n\t/** account DID */\n\tsub: Did;\n\t/** expiration time in Unix seconds */\n\texp: number;\n\t/** token issued time in Unix seconds */\n\tiat: number;\n}\n\n/**\n * represents the the decoded refresh token, for convenience\n * @deprecated\n */\nexport interface AtpRefreshJwt {\n\t/** refresh token scope */\n\tscope: 'com.atproto.refresh';\n\t/** unique identifier for this session */\n\tjti: string;\n\t/** account DID */\n\tsub: Did;\n\t/** intended audience of this refresh token, in DID */\n\taud: Did;\n\t/** token expiration time in seconds */\n\texp: number;\n\t/** token issued time in seconds */\n\tiat: number;\n}\n\n/** session data, can be persisted and reused */\nexport interface AtpSessionData {\n\t/** refresh token */\n\trefreshJwt: string;\n\t/** access token */\n\taccessJwt: string;\n\t/** account handle */\n\thandle: string;\n\t/** account DID */\n\tdid: Did;\n\t/** PDS endpoint found in the DID document, this will be used as the service URI if provided */\n\tpdsUri?: string;\n\t/** email address of the account, might not be available if on app password */\n\temail?: string;\n\t/** whether the email address has been confirmed or not */\n\temailConfirmed?: boolean;\n\t/** whether the account has email-based two-factor authentication enabled */\n\temailAuthFactor?: boolean;\n\t/** whether the account is active (not deactivated, taken down, or suspended) */\n\tactive: boolean;\n\t/** possible reason for why the account is inactive */\n\tinactiveStatus?: string;\n}\n\nexport interface CredentialManagerOptions {\n\t/** PDS server URL */\n\tservice: string;\n\n\t/** custom fetch function */\n\tfetch?: typeof fetch;\n\n\t/** function called when the session expires and can't be refreshed */\n\tonExpired?: (session: AtpSessionData) => void;\n\t/** function called after a successful session refresh */\n\tonRefresh?: (session: AtpSessionData) => void;\n\t/** function called whenever the session object is updated (login, resume, refresh) */\n\tonSessionUpdate?: (session: AtpSessionData) => void;\n}\n\nexport class CredentialManager implements FetchHandlerObject {\n\t/** service URL to make authentication requests with */\n\treadonly serviceUrl: string;\n\t/** fetch implementation */\n\tfetch: typeof fetch;\n\n\t/** internal client instance for making authentication requests */\n\t#server: Client;\n\t/** holds a promise for the current refresh operation, used for debouncing */\n\t#refreshSessionPromise: Promise<void> | undefined;\n\n\t/** callback for session expiration */\n\t#onExpired: CredentialManagerOptions['onExpired'];\n\t/** callback for successful session refresh */\n\t#onRefresh: CredentialManagerOptions['onRefresh'];\n\t/** callback for session updates */\n\t#onSessionUpdate: CredentialManagerOptions['onSessionUpdate'];\n\n\t/** current active session, undefined if not authenticated */\n\tsession?: AtpSessionData;\n\n\tconstructor({\n\t\tservice,\n\t\tonExpired,\n\t\tonRefresh,\n\t\tonSessionUpdate,\n\t\tfetch: _fetch = fetch,\n\t}: CredentialManagerOptions) {\n\t\tthis.serviceUrl = service;\n\t\tthis.fetch = _fetch;\n\n\t\tthis.#server = new Client({ handler: simpleFetchHandler({ service, fetch: _fetch }) });\n\n\t\tthis.#onRefresh = onRefresh;\n\t\tthis.#onExpired = onExpired;\n\t\tthis.#onSessionUpdate = onSessionUpdate;\n\t}\n\n\t/** service URL to make actual API requests with */\n\tget dispatchUrl() {\n\t\treturn this.session?.pdsUri ?? this.serviceUrl;\n\t}\n\n\tasync handle(pathname: string, init: RequestInit): Promise<Response> {\n\t\tawait this.#refreshSessionPromise;\n\n\t\tconst url = new URL(pathname, this.dispatchUrl);\n\t\tconst headers = new Headers(init.headers);\n\n\t\tif (!this.session || headers.has('authorization')) {\n\t\t\treturn (0, this.fetch)(url, init);\n\t\t}\n\n\t\tconst initialToken = this.session.accessJwt;\n\t\theaders.set('authorization', `Bearer ${initialToken}`);\n\n\t\tconst initialResponse = await (0, this.fetch)(url, { ...init, headers });\n\n\t\tif (initialResponse.status !== 401 && !(await isExpiredTokenResponse(initialResponse))) {\n\t\t\treturn initialResponse;\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.#refreshSession();\n\t\t} catch {\n\t\t\treturn initialResponse;\n\t\t}\n\n\t\t// return initial response if:\n\t\t// - request was aborted\n\t\t// - refresh failed and cleared the session\n\t\t// - token didn't actually change (refresh failed silently)\n\t\t// - request body was a stream (can't be resent)\n\t\tconst updatedToken = this.session?.accessJwt;\n\t\tif (\n\t\t\tinit.signal?.aborted ||\n\t\t\t!updatedToken ||\n\t\t\tupdatedToken === initialToken ||\n\t\t\tinit.body instanceof ReadableStream\n\t\t) {\n\t\t\treturn initialResponse;\n\t\t}\n\n\t\t// cancel initial response to avoid resource leaks (Node.js)\n\t\tawait initialResponse.body?.cancel();\n\n\t\theaders.set('authorization', `Bearer ${updatedToken}`);\n\t\treturn await (0, this.fetch)(url, { ...init, headers });\n\t}\n\n\t#refreshSession() {\n\t\treturn (this.#refreshSessionPromise ||= this.#refreshSessionInner().finally(\n\t\t\t() => (this.#refreshSessionPromise = undefined),\n\t\t));\n\t}\n\n\tasync #refreshSessionInner(): Promise<void> {\n\t\tconst currentSession = this.session;\n\t\tif (!currentSession) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst response = await this.#server.post('com.atproto.server.refreshSession', {\n\t\t\theaders: {\n\t\t\t\tauthorization: `Bearer ${currentSession.refreshJwt}`,\n\t\t\t},\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst isExpired =\n\t\t\t\tresponse.status === 401 ||\n\t\t\t\tresponse.data.error === 'ExpiredToken' ||\n\t\t\t\tresponse.data.error === 'InvalidToken';\n\n\t\t\tif (isExpired) {\n\t\t\t\tthis.session = undefined;\n\t\t\t\tthis.#onExpired?.(currentSession);\n\t\t\t}\n\n\t\t\tthrow new ClientResponseError(response);\n\t\t}\n\n\t\t// DID must not change during refresh\n\t\tif (response.data.did !== currentSession.did) {\n\t\t\tthis.session = undefined;\n\t\t\tthis.#onExpired?.(currentSession);\n\t\t\tthrow new ClientResponseError({ status: 401, data: { error: 'InvalidDID' } });\n\t\t}\n\n\t\t// protect against concurrent session updates\n\t\tif (this.session !== currentSession) {\n\t\t\tthrow new Error('concurrent session update detected');\n\t\t}\n\n\t\tthis.#updateSession({ ...currentSession, ...response.data });\n\t\tthis.#onRefresh?.(this.session!);\n\t}\n\n\t#updateSession(raw: ComAtprotoServerCreateSession.$output): AtpSessionData {\n\t\tconst didDoc = raw.didDoc as DidDocument | undefined;\n\n\t\tlet pdsUri: string | undefined;\n\t\tif (didDoc) {\n\t\t\tpdsUri = getPdsEndpoint(didDoc);\n\t\t}\n\n\t\tconst newSession: AtpSessionData = {\n\t\t\taccessJwt: raw.accessJwt,\n\t\t\trefreshJwt: raw.refreshJwt,\n\t\t\thandle: raw.handle,\n\t\t\tdid: raw.did,\n\t\t\tpdsUri: pdsUri,\n\t\t\temail: raw.email,\n\t\t\temailConfirmed: raw.emailConfirmed,\n\t\t\temailAuthFactor: raw.emailAuthFactor,\n\t\t\tactive: raw.active ?? true,\n\t\t\tinactiveStatus: raw.status,\n\t\t};\n\n\t\tthis.session = newSession;\n\t\tthis.#onSessionUpdate?.(newSession);\n\n\t\treturn newSession;\n\t}\n\n\t/**\n\t * resume from a persisted session\n\t * @param session session data, taken from `AtpAuth#session` after login\n\t */\n\tasync resume(session: AtpSessionData): Promise<AtpSessionData> {\n\t\t// protect against concurrent resume of the same session\n\t\tif (session.refreshJwt === this.session?.refreshJwt) {\n\t\t\tawait this.#refreshSessionPromise;\n\t\t\tif (!this.session || session.did !== this.session.did) {\n\t\t\t\tthrow new ClientResponseError({ status: 401, data: { error: 'InvalidToken' } });\n\t\t\t}\n\t\t\treturn this.session;\n\t\t}\n\n\t\tconst now = Date.now() / 1_000 + 60 * 5;\n\n\t\tconst refreshToken = decodeJwt(session.refreshJwt) as AtpRefreshJwt;\n\t\tif (now >= refreshToken.exp || refreshToken.sub !== session.did) {\n\t\t\tthrow new ClientResponseError({ status: 401, data: { error: 'InvalidToken' } });\n\t\t}\n\n\t\tconst accessToken = decodeJwt(session.accessJwt) as AtpAccessJwt;\n\t\tif (accessToken.sub !== session.did) {\n\t\t\tthrow new ClientResponseError({ status: 401, data: { error: 'InvalidToken' } });\n\t\t}\n\n\t\t// set the session and clear any stale refresh promise\n\t\tthis.session = session;\n\t\tthis.#refreshSessionPromise = undefined;\n\n\t\tif (now >= accessToken.exp) {\n\t\t\t// access token expired, need to refresh\n\t\t\tawait this.#refreshSession();\n\t\t} else {\n\t\t\t// access token still valid, fetch session info in background\n\t\t\tconst promise = ok(\n\t\t\t\tthis.#server.get('com.atproto.server.getSession', {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tauthorization: `Bearer ${session.accessJwt}`,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tpromise.then(\n\t\t\t\t(next) => {\n\t\t\t\t\tconst existing = this.session;\n\t\t\t\t\tif (!existing || existing.did !== next.did) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.#updateSession({ ...existing, ...next });\n\t\t\t\t},\n\t\t\t\t(_err) => {\n\t\t\t\t\t// ignore error\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tif (!this.session) {\n\t\t\tthrow new ClientResponseError({ status: 401, data: { error: 'InvalidToken' } });\n\t\t}\n\n\t\treturn this.session;\n\t}\n\n\t/**\n\t * sign in to an account\n\t * @param options credential options\n\t * @returns session data\n\t */\n\tasync login(options: AuthLoginOptions): Promise<AtpSessionData> {\n\t\t// reset the session\n\t\tthis.session = undefined;\n\t\tthis.#refreshSessionPromise = undefined;\n\n\t\tconst session = await ok(\n\t\t\tthis.#server.post('com.atproto.server.createSession', {\n\t\t\t\tinput: {\n\t\t\t\t\tidentifier: options.identifier,\n\t\t\t\t\tpassword: options.password,\n\t\t\t\t\tauthFactorToken: options.code,\n\t\t\t\t\tallowTakendown: options.allowTakendown,\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\treturn this.#updateSession(session);\n\t}\n\n\t/**\n\t * sign out of the current session, invalidating it server-side\n\t */\n\tasync logout(): Promise<void> {\n\t\tconst currentSession = this.session;\n\t\tif (!currentSession) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.session = undefined;\n\t\tthis.#refreshSessionPromise = undefined;\n\n\t\ttry {\n\t\t\tawait this.#server.post('com.atproto.server.deleteSession', {\n\t\t\t\tas: null,\n\t\t\t\theaders: {\n\t\t\t\t\tauthorization: `Bearer ${currentSession.refreshJwt}`,\n\t\t\t\t},\n\t\t\t});\n\t\t} catch {\n\t\t\t// ignore errors - session is already cleared locally\n\t\t}\n\t}\n}\n\n/** credentials */\nexport interface AuthLoginOptions {\n\t/** what account to login as, this could be domain handle, DID, or email address */\n\tidentifier: string;\n\t/** account password */\n\tpassword: string;\n\t/** two-factor authentication code, if email TOTP is enabled */\n\tcode?: string;\n\t/** allow signing in even if the account has been taken down */\n\tallowTakendown?: boolean;\n}\n\nconst isExpiredTokenResponse = async (response: Response): Promise<boolean> => {\n\tif (response.status !== 400) {\n\t\treturn false;\n\t}\n\n\tif (extractContentType(response.headers) !== 'application/json') {\n\t\treturn false;\n\t}\n\n\t// this is nasty as it relies heavily on what the PDS returns, but avoiding\n\t// cloning and reading the request as much as possible is better.\n\n\t// {\"error\":\"ExpiredToken\",\"message\":\"Token has expired\"}\n\t// {\"error\":\"ExpiredToken\",\"message\":\"Token is expired\"}\n\tif (extractContentLength(response.headers) > 54 * 1.5) {\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tconst data = await response.clone().json();\n\t\tif (isXRPCErrorPayload(data)) {\n\t\t\treturn data.error === 'ExpiredToken';\n\t\t}\n\t} catch {}\n\n\treturn false;\n};\n\nconst extractContentType = (headers: Headers) => {\n\treturn headers.get('content-type')?.split(';')[0]?.trim();\n};\nconst extractContentLength = (headers: Headers) => {\n\treturn Number(headers.get('content-length') ?? ';');\n};\n","/**\n * @module\n * JWT decoding utilities for session resumption checks.\n * This module is exported for convenience and is no way part of public API,\n * it can be removed at any time.\n */\n\n/**\n * Decodes a JWT token\n * @param token The token string\n * @returns JSON object from the token\n */\nexport const decodeJwt = (token: string): unknown => {\n\tconst pos = 1;\n\tconst part = token.split('.')[1];\n\n\tlet decoded: string;\n\n\tif (typeof part !== 'string') {\n\t\tthrow new Error('invalid token: missing part ' + (pos + 1));\n\t}\n\n\ttry {\n\t\tdecoded = base64UrlDecode(part);\n\t} catch (e) {\n\t\tthrow new Error('invalid token: invalid b64 for part ' + (pos + 1) + ' (' + (e as Error).message + ')');\n\t}\n\n\ttry {\n\t\treturn JSON.parse(decoded);\n\t} catch (e) {\n\t\tthrow new Error('invalid token: invalid json for part ' + (pos + 1) + ' (' + (e as Error).message + ')');\n\t}\n};\n\n/**\n * Decodes a URL-safe Base64 string\n * @param str URL-safe Base64 that needed to be decoded\n * @returns The actual string\n */\nexport const base64UrlDecode = (str: string): string => {\n\tlet output = str.replace(/-/g, '+').replace(/_/g, '/');\n\n\tswitch (output.length % 4) {\n\t\tcase 0:\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\toutput += '==';\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\toutput += '=';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error('base64 string is not of the correct length');\n\t}\n\n\ttry {\n\t\treturn b64DecodeUnicode(output);\n\t} catch {\n\t\treturn atob(output);\n\t}\n};\n\nconst b64DecodeUnicode = (str: string): string => {\n\treturn decodeURIComponent(\n\t\tatob(str).replace(/(.)/g, (_m, p) => {\n\t\t\tlet code = p.charCodeAt(0).toString(16).toUpperCase();\n\n\t\t\tif (code.length < 2) {\n\t\t\t\tcode = '0' + code;\n\t\t\t}\n\n\t\t\treturn '%' + code;\n\t\t}),\n\t);\n};\n"],"mappings":"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","names":["signal","headers","ok","ok"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-KDXZLVT6.js.map"}
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-LCPZEHDQ.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-LCPZEHDQ.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-LCPZEHDQ.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-LCPZEHDQ.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-MFHNNEAP.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-MFHNNEAP.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-MFHNNEAP.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-MFHNNEAP.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-NCFHYTLD.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-NCFHYTLD.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-NCFHYTLD.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-NCFHYTLD.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-OFPH7GQJ.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-OFPH7GQJ.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-OFPH7GQJ.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-OFPH7GQJ.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-P3M4HQTD.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-P3M4HQTD.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-P3M4HQTD.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-P3M4HQTD.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-P5REK7TQ.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-P5REK7TQ.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-P5REK7TQ.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-P5REK7TQ.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-PJWFBDSG.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-PJWFBDSG.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-PJWFBDSG.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-PJWFBDSG.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-PUHBIZRM.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-PUHBIZRM.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-PUHBIZRM.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-PUHBIZRM.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-Q6XDYZUX.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-Q6XDYZUX.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-Q6XDYZUX.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-Q6XDYZUX.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-QQ2VIQZY.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-QQ2VIQZY.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-QQ2VIQZY.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-QQ2VIQZY.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-R276HM24.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-R276HM24.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-R276HM24.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-R276HM24.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-R65OZ4FV.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-R65OZ4FV.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-R65OZ4FV.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-R65OZ4FV.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-RG36R2PW.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-RG36R2PW.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-RG36R2PW.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-RG36R2PW.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-RSBJ77HU.js
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-RSBJ77HU.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-RSBJ77HU.js.map
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/chunk-RSBJ77HU.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-SM64ECST.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-SM64ECST.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-SM64ECST.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-SM64ECST.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-SSTS6DW7.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-SSTS6DW7.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-SSTS6DW7.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-SSTS6DW7.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-TI6SX5NQ.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-TI6SX5NQ.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-TI6SX5NQ.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-TI6SX5NQ.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-TP5GZFTO.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-TP5GZFTO.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-TP5GZFTO.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-TP5GZFTO.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-UGE3FKYA.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-UGE3FKYA.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-UGE3FKYA.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-UGE3FKYA.js.map
+530
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-VCQFSS6B.js
··· 1 + import { 2 + NAME 3 + } from "./chunk-Y27UCZCZ.js"; 4 + import { 5 + NAME as NAME2 6 + } from "./chunk-KDXZLVT6.js"; 7 + import { 8 + A, 9 + DiffuseElement, 10 + query 11 + } from "./chunk-TI6SX5NQ.js"; 12 + import { 13 + signal 14 + } from "./chunk-IZOBPV2S.js"; 15 + import { 16 + __name, 17 + init_Buffer, 18 + init_process 19 + } from "./chunk-FZQXS3RE.js"; 20 + 21 + // themes/webamp/configurators/output/element.js 22 + init_Buffer(); 23 + init_process(); 24 + var OutputConfig = class extends DiffuseElement { 25 + static { 26 + __name(this, "OutputConfig"); 27 + } 28 + constructor() { 29 + super(); 30 + this.attachShadow({ mode: "open" }); 31 + } 32 + // SIGNALS 33 + $output = signal( 34 + /** @type {OutputElement | OutputConfiguratorElement<VariousOutputElements> | undefined} */ 35 + void 0 36 + ); 37 + $atproto = signal( 38 + /** @type {ATProtoOutputElement | null} */ 39 + null 40 + ); 41 + $s3 = signal( 42 + /** @type {S3OutputElement | null} */ 43 + null 44 + ); 45 + $tab = signal("overview"); 46 + // LIFECYCLE 47 + /** @override */ 48 + async connectedCallback() { 49 + super.connectedCallback(); 50 + const output = query(this, "output-selector"); 51 + await customElements.whenDefined(output.localName); 52 + this.$output.value = output; 53 + const atproto = output.root().querySelector(NAME2); 54 + if (atproto) { 55 + this.$atproto.value = /** @type {ATProtoOutputElement} */ 56 + atproto; 57 + } 58 + const s3 = output.root().querySelector(NAME); 59 + if (s3) { 60 + this.$s3.value = /** @type {S3OutputElement} */ 61 + s3; 62 + } 63 + } 64 + // EVENTS 65 + /** @param {Event} event */ 66 + #handleAtprotoLogin = /* @__PURE__ */ __name(async (event) => { 67 + event.preventDefault(); 68 + const input = this.root().querySelector("#atproto-handle"); 69 + const handle = input?.value?.trim(); 70 + if (!handle) return; 71 + const atproto = this.$atproto.value; 72 + if (!atproto) return; 73 + const button = this.root().querySelector("#atproto-submit"); 74 + if (button) button.disabled = true; 75 + await atproto.login(handle); 76 + }, "#handleAtprotoLogin"); 77 + #handleAtprotoLogout = /* @__PURE__ */ __name(async () => { 78 + const atproto = this.$atproto.value; 79 + if (!atproto) return; 80 + await atproto.logout(); 81 + }, "#handleAtprotoLogout"); 82 + #handleAtprotoActivate = /* @__PURE__ */ __name(async () => { 83 + const output = this.$output.value; 84 + if (!output || !("select" in output)) return; 85 + const atproto = this.$atproto.value; 86 + if (!atproto) return; 87 + const option = (await output.options()).find( 88 + (o) => o.label === "AT Protocol" 89 + ); 90 + if (option) await output.select(option.id); 91 + }, "#handleAtprotoActivate"); 92 + /** 93 + * @param {Event} event 94 + */ 95 + #handleS3SetBucket = /* @__PURE__ */ __name(async (event) => { 96 + event.preventDefault(); 97 + const s3 = this.$s3.value; 98 + if (!s3) return; 99 + const button = this.root().querySelector("#s3-submit"); 100 + if (button) button.disabled = true; 101 + const accessKey = ( 102 + /** @type {HTMLInputElement | null} */ 103 + this.root().querySelector( 104 + "#s3-access-key" 105 + )?.value 106 + ); 107 + const bucketName = ( 108 + /** @type {HTMLInputElement | null} */ 109 + this.root().querySelector( 110 + "#s3-bucket-name" 111 + )?.value 112 + ); 113 + const host = ( 114 + /** @type {HTMLInputElement | null} */ 115 + this.root().querySelector( 116 + "#s3-host" 117 + )?.value 118 + ); 119 + const path = ( 120 + /** @type {HTMLInputElement | null} */ 121 + this.root().querySelector( 122 + "#s3-path" 123 + )?.value 124 + ); 125 + const region = ( 126 + /** @type {HTMLInputElement | null} */ 127 + this.root().querySelector( 128 + "#s3-region" 129 + )?.value 130 + ); 131 + const secretKey = ( 132 + /** @type {HTMLInputElement | null} */ 133 + this.root().querySelector( 134 + "#s3-secret-key" 135 + )?.value 136 + ); 137 + if (!accessKey || !bucketName || !secretKey) return; 138 + const bucket = { 139 + accessKey, 140 + bucketName, 141 + host: host?.length ? host : "s3.amazonaws.com", 142 + path: path?.length ? path : "/", 143 + region: region?.length ? region : "us-east-1", 144 + secretKey 145 + }; 146 + await s3.setBucket(bucket); 147 + if (button) button.disabled = false; 148 + }, "#handleS3SetBucket"); 149 + #handleS3Unset = /* @__PURE__ */ __name(async () => { 150 + const s3 = this.$s3.value; 151 + if (!s3) return; 152 + await s3.unsetBucket(); 153 + }, "#handleS3Unset"); 154 + #handleS3Activate = /* @__PURE__ */ __name(async () => { 155 + const output = this.$output.value; 156 + if (!output || !("select" in output)) return; 157 + const s3 = this.$s3.value; 158 + if (!s3) return; 159 + const option = (await output.options()).find((o) => o.label === "S3"); 160 + if (option) await output.select(option.id); 161 + }, "#handleS3Activate"); 162 + #handleDeactivate = /* @__PURE__ */ __name(async () => { 163 + const output = this.$output.value; 164 + if (!output || !("deselect" in output)) return; 165 + await output.deselect(); 166 + }, "#handleDeactivate"); 167 + // RENDER 168 + /** 169 + * @param {RenderArg} _ 170 + */ 171 + render({ html }) { 172 + return html` 173 + <link rel="stylesheet" href="styles/vendor/98.css" /> 174 + <link rel="stylesheet" href="themes/webamp/98-extra.css" /> 175 + 176 + <style> 177 + @import "./themes/webamp/98-vars.css"; 178 + 179 + .button-row { 180 + display: inline-flex; 181 + gap: var(--grouped-button-spacing); 182 + } 183 + 184 + #tabbed { 185 + display: flex; 186 + flex-direction: column; 187 + height: 100%; 188 + } 189 + 190 + .window { 191 + flex: 1; 192 + overflow-y: auto; 193 + } 194 + 195 + /* TABS */ 196 + 197 + menu[role="tablist"] { 198 + padding-top: 2px; 199 + 200 + li > label { 201 + cursor: pointer; 202 + display: block; 203 + padding: var(--radio-label-spacing); 204 + } 205 + 206 + li[aria-selected="true"] { 207 + padding-bottom: 2px; 208 + margin-top: -2px; 209 + background-color: var(--surface); 210 + position: relative; 211 + z-index: 8; 212 + margin-left: -3px; 213 + } 214 + } 215 + </style> 216 + 217 + <div id="tabbed"> 218 + <menu role="tablist" class="multirows"> 219 + <li role="tab" aria-selected="${this.$tab.value === "overview"}"> 220 + <label @click="${() => this.$tab.value = "overview"}"> 221 + <span>Overview</span> 222 + </label> 223 + </li> 224 + <li role="tab" aria-selected="${this.$tab.value === "atproto"}"> 225 + <label @click="${() => this.$tab.value = "atproto"}"> 226 + <span>AT Protocol</span> 227 + </label> 228 + </li> 229 + <li role="tab" aria-selected="${this.$tab.value === "s3"}"> 230 + <label @click="${() => this.$tab.value = "s3"}"> 231 + <span>S3</span> 232 + </label> 233 + </li> 234 + </menu> 235 + 236 + <div class="window" role="tabpanel"> 237 + ${this.#renderTab(html)} 238 + </div> 239 + </div> 240 + `; 241 + } 242 + /** 243 + * @param {RenderArg["html"]} html 244 + */ 245 + #renderTab(html) { 246 + switch (this.$tab.value) { 247 + case "overview": 248 + return this.#renderOverviewTab(html); 249 + case "atproto": 250 + return this.#renderAtprotoTab(html); 251 + case "s3": 252 + return this.#renderS3Tab(html); 253 + default: 254 + return A; 255 + } 256 + } 257 + /** 258 + * @param {RenderArg["html"]} html 259 + */ 260 + #renderOverviewTab(html) { 261 + const selectedOutput = this.$output.value && "selectedOutput" in this.$output.value ? this.$output.value.selectedOutput() : void 0; 262 + return html` 263 + <div class="window-body"> 264 + <fieldset> 265 + <span class="with-icon with-icon--large"> 266 + <img 267 + src="images/icons/windows_98/computer_user_pencil-0.png" 268 + width="24" 269 + /> 270 + <span>Here you can configure where to keep your user data.<br />Each 271 + storage method comes with its pros and cons.<br />By default your data 272 + is only kept locally here in the browser. 273 + </span> 274 + </span> 275 + </fieldset> 276 + 277 + <fieldset> 278 + <span class="with-icon with-icon--large"> 279 + <img 280 + src="images/icons/windows_98/msg_information-0.png" 281 + width="24" 282 + /> 283 + <span> 284 + Data does not transfer across storage methods!<br />You can however 285 + merge data between them though, if you wish to do so. 286 + </span> 287 + </span> 288 + </fieldset> 289 + 290 + <fieldset> 291 + <legend>Active storage method</legend> 292 + <div class="with-icon with-icon--large"> 293 + <img 294 + src="images/icons/windows_98/${selectedOutput ? `directory_channels-2.png` : `msg_warning-0.png`}" 295 + width="24" 296 + /> 297 + <div> 298 + ${this.$output.value && "selectedOutput" in this.$output.value ? selectedOutput ? html` 299 + <p> 300 + Selected output: 301 + <strong>${selectedOutput.label}</strong><br /> 302 + </p> 303 + <p> 304 + <button @click="${this.#handleDeactivate}">Deactivate</button> 305 + </p> 306 + ` : this.#defaultOutputMessage : this.#defaultOutputMessage} 307 + </div> 308 + </div> 309 + </fieldset> 310 + </div> 311 + `; 312 + } 313 + /** 314 + * @param {RenderArg["html"]} html 315 + */ 316 + #renderAtprotoTab(html) { 317 + const did = this.$atproto.value?.did() ?? null; 318 + const selectedOutput = this.$output.value && "selectedOutput" in this.$output.value ? this.$output.value.selectedOutput() : void 0; 319 + const authenticated = /* @__PURE__ */ __name(() => { 320 + return html` 321 + <fieldset> 322 + <span class="with-icon with-icon--large"> 323 + <img src="images/icons/windows_98/computer_user_pencil-0.png" width="24" /> 324 + <span>Signed in as <strong>${did}</strong></span> 325 + </span> 326 + </fieldset> 327 + 328 + <p class="button-row"> 329 + <button @click="${this.#handleAtprotoLogout}">Sign out</button> 330 + ${this.#renderAtprotoActivation(html, selectedOutput)} 331 + </p> 332 + `; 333 + }, "authenticated"); 334 + const unauthenticated = /* @__PURE__ */ __name(() => { 335 + return html` 336 + <fieldset> 337 + <span class="with-icon with-icon--large"> 338 + <img src="images/icons/windows_98/computer_user_pencil-0.png" width="24" /> 339 + <span> 340 + Store your user data on the storage associated with your AT Protocol 341 + identity. 342 + </span> 343 + </span> 344 + </fieldset> 345 + 346 + <form @submit="${this.#handleAtprotoLogin}"> 347 + <fieldset> 348 + <div class="field-row"> 349 + <label for="atproto-handle">Your internet handle:</label> 350 + <input 351 + id="atproto-handle" 352 + type="text" 353 + required 354 + placeholder="you.bsky.social" 355 + /> 356 + </div> 357 + </fieldset> 358 + 359 + <p> 360 + <button type="submit" id="atproto-submit">Sign in</button> 361 + ${this.#renderAtprotoActivation(html, selectedOutput)} 362 + </p> 363 + </form> 364 + `; 365 + }, "unauthenticated"); 366 + return html` 367 + <div class="window-body"> 368 + ${did ? authenticated() : unauthenticated()} 369 + </div> 370 + `; 371 + } 372 + /** 373 + * @param {RenderArg["html"]} html 374 + */ 375 + #renderS3Tab(html) { 376 + const s3 = this.$s3.value; 377 + const ready = s3?.ready() ?? false; 378 + const selectedOutput = this.$output.value && "selectedOutput" in this.$output.value ? this.$output.value.selectedOutput() : void 0; 379 + const configured = /* @__PURE__ */ __name(() => { 380 + const bucket = s3?.bucket(); 381 + return html` 382 + <fieldset> 383 + <div class="with-icon with-icon--large"> 384 + <img src="images/icons/windows_98/computer_user_pencil-0.png" width="24" /> 385 + <div> 386 + Bucket configured: 387 + <ul 388 + style="margin-bottom: 0; padding-left: 0; list-style-position: inside;" 389 + > 390 + <li>Name: <strong>${bucket?.bucketName}</strong></li> 391 + <li>Host: ${bucket?.host}</li> 392 + <li>Access key: ${bucket?.accessKey}</li> 393 + </ul> 394 + </div> 395 + </div> 396 + </fieldset> 397 + 398 + <fieldset> 399 + <span class="with-icon with-icon--large"> 400 + <img 401 + src="images/icons/windows_98/msg_information-0.png" 402 + width="24" 403 + /> 404 + <span> 405 + Make sure the bucket has CORS configured properly. 406 + </span> 407 + </span> 408 + </fieldset> 409 + 410 + <p class="button-row"> 411 + <button id="s3-unset-bucket" @click="${this.#handleS3Unset}"> 412 + Remove bucket configuration 413 + </button> 414 + ${this.#renderS3Activation(html, selectedOutput)} 415 + </p> 416 + `; 417 + }, "configured"); 418 + const unconfigured = /* @__PURE__ */ __name(() => { 419 + return html` 420 + <fieldset> 421 + <span class="with-icon with-icon--large"> 422 + <img src="images/icons/windows_98/computer_user_pencil-0.png" width="24" /> 423 + <span> 424 + Store your user data on an S3-compatible storage service. 425 + </span> 426 + </span> 427 + </fieldset> 428 + 429 + <form @submit="${this.#handleS3SetBucket}"> 430 + <fieldset> 431 + <legend>Bucket details</legend> 432 + 433 + <div class="field-row"> 434 + <label for="s3-access-key">Access Key:*</label> 435 + <input type="text" id="s3-access-key" required /> 436 + </div> 437 + 438 + <div class="field-row"> 439 + <label for="s3-secret-key">Secret Key:*</label> 440 + <input type="password" id="s3-secret-key" required /> 441 + </div> 442 + 443 + <div class="field-row"> 444 + <label for="s3-bucket-name">Bucket Name:*</label> 445 + <input type="text" id="s3-bucket-name" required /> 446 + </div> 447 + 448 + <div class="field-row"> 449 + <label for="s3-host">Host:</label> 450 + <input 451 + type="text" 452 + id="s3-host" 453 + placeholder="s3.amazonaws.com" 454 + /> 455 + </div> 456 + 457 + <div class="field-row"> 458 + <label for="s3-region">Region:</label> 459 + <input 460 + type="text" 461 + id="s3-region" 462 + placeholder="us-east-1" 463 + /> 464 + </div> 465 + 466 + <div class="field-row"> 467 + <label for="s3-path">Path:</label> 468 + <input type="text" id="s3-path" /> 469 + </div> 470 + 471 + <p> 472 + * are required fields. 473 + </p> 474 + </fieldset> 475 + 476 + <p> 477 + <button type="submit" id="s3-submit">Set bucket</button> 478 + ${this.#renderS3Activation(html, selectedOutput)} 479 + </p> 480 + </form> 481 + `; 482 + }, "unconfigured"); 483 + return html` 484 + <div class="window-body"> 485 + ${ready ? configured() : unconfigured()} 486 + </div> 487 + `; 488 + } 489 + /** 490 + * @param {RenderArg['html']} html 491 + * @param {VariousOutputElements | null | undefined} selectedOutput 492 + */ 493 + #renderAtprotoActivation(html, selectedOutput) { 494 + const output = this.$output.value; 495 + if (!output || !("select" in output)) return A; 496 + const isActive = selectedOutput?.label === "AT Protocol"; 497 + return isActive ? html` 498 + <button @click="${this.#handleDeactivate}">Deactivate</button> 499 + ` : html` 500 + <button @click="${this.#handleAtprotoActivate}">Activate this storage</button> 501 + `; 502 + } 503 + /** 504 + * @param {RenderArg['html']} html 505 + * @param {VariousOutputElements | null | undefined} selectedOutput 506 + */ 507 + #renderS3Activation(html, selectedOutput) { 508 + const output = this.$output.value; 509 + if (!output || !("select" in output)) return A; 510 + const isActive = selectedOutput?.label === "S3"; 511 + return isActive ? html` 512 + <button @click="${this.#handleDeactivate}">Deactivate</button> 513 + ` : html` 514 + <button @click="${this.#handleS3Activate}">Activate this storage</button> 515 + `; 516 + } 517 + #defaultOutputMessage = "Storing data locally in the browser without any backup or syncing enabled."; 518 + }; 519 + var element_default = OutputConfig; 520 + var CLASS = OutputConfig; 521 + var NAME3 = "dtw-output-config"; 522 + customElements.define(NAME3, CLASS); 523 + 524 + export { 525 + element_default, 526 + CLASS, 527 + NAME3 as NAME 528 + }; 529 + 530 + //# sourceMappingURL=./chunk-VCQFSS6B.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-VCQFSS6B.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\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, OutputOption} from \"@components/configurator/output/types.d.ts\"\n * @import {OutputFallbackConfiguratorElement} from \"@components/configurator/output-fallback/types.d.ts\"\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 $s3 = signal(\n /** @type {S3OutputElement | null} */ (null),\n );\n\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 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) button.disabled = true;\n\n await atproto.login(handle);\n };\n\n #handleAtprotoLogout = async () => {\n const atproto = this.$atproto.value;\n if (!atproto) return;\n\n await atproto.logout();\n };\n\n #handleAtprotoActivate = async () => {\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 : \"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 #handleS3Activate = async () => {\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 && \"selectedOutput\" in this.$output.value\n ? this.$output.value.selectedOutput()\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 \"selectedOutput\" 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 && \"selectedOutput\" in this.$output.value\n ? this.$output.value.selectedOutput()\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 <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 <form @submit=\"${this.#handleAtprotoLogin}\">\n <fieldset>\n <div 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 </div>\n </fieldset>\n\n <p>\n <button type=\"submit\" id=\"atproto-submit\">Sign in</button>\n ${this.#renderAtprotoActivation(html, selectedOutput)}\n </p>\n </form>\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 && \"selectedOutput\" in this.$output.value\n ? this.$output.value.selectedOutput()\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 * @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-VCQFSS6B.js.map"}
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-WM2QH5TD.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-WM2QH5TD.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-WM2QH5TD.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-WM2QH5TD.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-WRBBFTZV.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-WRBBFTZV.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-WRBBFTZV.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-WRBBFTZV.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-XPKGXYQJ.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-XPKGXYQJ.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-XPKGXYQJ.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-XPKGXYQJ.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-XRMR4X7K.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-XRMR4X7K.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-XRMR4X7K.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-XRMR4X7K.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-XRZB5Q7N.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-XRZB5Q7N.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-XRZB5Q7N.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-XRZB5Q7N.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-XTBOWHKN.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-XTBOWHKN.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-XTBOWHKN.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-XTBOWHKN.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-XXGFKU7I.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-XXGFKU7I.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-XXGFKU7I.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/chunk-XXGFKU7I.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-XZNUL47A.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-XZNUL47A.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-XZNUL47A.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-XZNUL47A.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-Y27UCZCZ.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-Y27UCZCZ.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-Y27UCZCZ.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-Y27UCZCZ.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-ZZYF4BQN.js
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-ZZYF4BQN.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/chunk-ZZYF4BQN.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/chunk-ZZYF4BQN.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/cid.js
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/cid.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/cid.js.map
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/cid.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/element.js
··· 1 + ../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/common/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/element.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/element.js.map
+68
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/facets/foundation.js
··· 1 + import { 2 + GROUP, 3 + config, 4 + findExistingOrAdd, 5 + foundation_default 6 + } from "../../chunk-P5REK7TQ.js"; 7 + import "../../chunk-2RWEBKV5.js"; 8 + import "../../chunk-MFHNNEAP.js"; 9 + import "../../chunk-33YSHWBQ.js"; 10 + import "../../chunk-6FINJPVD.js"; 11 + import "../../chunk-7HCR4FJB.js"; 12 + import "../../chunk-CPS76EE2.js"; 13 + import "../../chunk-XRMR4X7K.js"; 14 + import "../../chunk-7DBAGGP4.js"; 15 + import "../../chunk-Q6XDYZUX.js"; 16 + import "../../chunk-ET5MSOLB.js"; 17 + import "../../chunk-EXQ7VALC.js"; 18 + import "../../chunk-R65OZ4FV.js"; 19 + import "../../chunk-XTBOWHKN.js"; 20 + import "../../chunk-P3M4HQTD.js"; 21 + import "../../chunk-Y27UCZCZ.js"; 22 + import "../../chunk-KDXZLVT6.js"; 23 + import "../../chunk-CHYBYJZ3.js"; 24 + import "../../chunk-77ZY4GQV.js"; 25 + import "../../chunk-XRZB5Q7N.js"; 26 + import "../../chunk-5UTOUDDD.js"; 27 + import "../../chunk-5EMZ3NAI.js"; 28 + import "../../chunk-HVHVAQ4N.js"; 29 + import "../../chunk-F22BR7N4.js"; 30 + import "../../chunk-LCPZEHDQ.js"; 31 + import "../../chunk-7U6IWNID.js"; 32 + import "../../chunk-AISBWLUT.js"; 33 + import "../../chunk-JBHW662S.js"; 34 + import "../../chunk-GX3WPNEX.js"; 35 + import "../../chunk-IGROFVGC.js"; 36 + import "../../chunk-SSTS6DW7.js"; 37 + import "../../chunk-HN4F5JEZ.js"; 38 + import "../../chunk-B5LLSFSV.js"; 39 + import "../../chunk-SM64ECST.js"; 40 + import "../../chunk-ZZYF4BQN.js"; 41 + import "../../chunk-WRBBFTZV.js"; 42 + import "../../chunk-EEUCFWD4.js"; 43 + import "../../chunk-6DRHTH2U.js"; 44 + import "../../chunk-CW32SP4O.js"; 45 + import "../../chunk-4XWBI3QC.js"; 46 + import "../../chunk-EEVL24MR.js"; 47 + import "../../chunk-5F2TCUTS.js"; 48 + import "../../chunk-K5K7YTT4.js"; 49 + import "../../chunk-HBALNHVO.js"; 50 + import "../../chunk-J7PU3ISY.js"; 51 + import "../../chunk-R276HM24.js"; 52 + import "../../chunk-TI6SX5NQ.js"; 53 + import "../../chunk-G56PUJUJ.js"; 54 + import "../../chunk-IZOBPV2S.js"; 55 + import "../../chunk-XZNUL47A.js"; 56 + import "../../chunk-TP5GZFTO.js"; 57 + import "../../chunk-NCFHYTLD.js"; 58 + import "../../chunk-DUCTMCPX.js"; 59 + import "../../chunk-UGE3FKYA.js"; 60 + import "../../chunk-FZQXS3RE.js"; 61 + export { 62 + GROUP, 63 + config, 64 + foundation_default as default, 65 + findExistingOrAdd 66 + }; 67 + 68 + //# sourceMappingURL=./foundation.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/facets/foundation.js.map
··· 1 + ../../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/common/facets/foundation.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/facets/utils.js
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/facets/utils.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/facets/utils.js.map
··· 1 + ../../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/common/facets/utils.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/playlist.js
··· 1 + ../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/common/playlist.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/playlist.js.map
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/playlist.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/signal.js
··· 1 + ../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/common/signal.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/signal.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/signal.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/themes/utils.js
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/themes/utils.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/themes/utils.js.map
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/themes/utils.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/utils.js
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/utils.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/utils.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/utils.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/worker.js
··· 1 + ../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/common/worker.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/worker.js.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/worker.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/worker/rpc.js
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/common/worker/rpc.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/common/worker/rpc.js.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/common/worker/rpc.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/configurator/input/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/configurator/input/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/configurator/input/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/configurator/input/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/configurator/input/worker.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/configurator/input/worker.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/configurator/input/worker.js.map
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/configurator/input/worker.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/configurator/output-fallback/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/configurator/output-fallback/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/configurator/output-fallback/element.js.map
··· 1 + ../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/configurator/output-fallback/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/configurator/output/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/configurator/output/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/configurator/output/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/configurator/output/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/engine/audio/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/engine/audio/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/engine/audio/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/engine/audio/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/engine/queue/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/engine/queue/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/engine/queue/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/engine/queue/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/engine/queue/worker.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/engine/queue/worker.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/engine/queue/worker.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/engine/queue/worker.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/engine/repeat-shuffle/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/engine/repeat-shuffle/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/engine/repeat-shuffle/element.js.map
··· 1 + ../../../../bafybeia4lo67fqia3emjf54vzbrvfyao6fwndoc4rnqpav4yezowfg4j6e/components/engine/repeat-shuffle/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/engine/scope/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/engine/scope/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/engine/scope/element.js.map
··· 1 + ../../../../bafybeihr4brahqptxmxcdksktdfgs4hyl64odwx524vqmmitjvmn57sklq/components/engine/scope/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/common.js
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/common.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/common.js.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/common.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/https/common.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/https/common.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/https/common.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/https/common.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/https/constants.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/https/constants.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/https/constants.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/https/constants.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/https/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/input/https/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/https/element.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/https/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/https/worker.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/input/https/worker.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/https/worker.js.map
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/input/https/worker.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/opensubsonic/class.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/opensubsonic/class.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/opensubsonic/class.js.map
··· 1 + ../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/components/input/opensubsonic/class.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/opensubsonic/common.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/input/opensubsonic/common.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/opensubsonic/common.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/opensubsonic/common.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/opensubsonic/constants.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/opensubsonic/constants.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/opensubsonic/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/opensubsonic/constants.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/opensubsonic/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/input/opensubsonic/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/opensubsonic/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/opensubsonic/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/opensubsonic/worker.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/input/opensubsonic/worker.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/opensubsonic/worker.js.map
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/input/opensubsonic/worker.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/s3/common.js
··· 1 + ../../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/input/s3/common.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/s3/common.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/s3/common.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/s3/constants.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/input/s3/constants.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/s3/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/s3/constants.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/s3/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/input/s3/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/s3/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/input/s3/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/s3/worker.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/input/s3/worker.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/input/s3/worker.js.map
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/input/s3/worker.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/auto-queue/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/orchestrator/auto-queue/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/auto-queue/element.js.map
··· 1 + ../../../../bafybeia4lo67fqia3emjf54vzbrvfyao6fwndoc4rnqpav4yezowfg4j6e/components/orchestrator/auto-queue/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/favourites/common.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/orchestrator/favourites/common.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/favourites/common.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/orchestrator/favourites/common.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/favourites/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/orchestrator/favourites/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/favourites/element.js.map
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/orchestrator/favourites/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/favourites/worker.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/orchestrator/favourites/worker.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/favourites/worker.js.map
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/orchestrator/favourites/worker.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/input/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/orchestrator/input/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/input/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/input/element.js.map
+36
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/output/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../chunk-7DBAGGP4.js"; 6 + import "../../../chunk-Q6XDYZUX.js"; 7 + import "../../../chunk-ET5MSOLB.js"; 8 + import "../../../chunk-EXQ7VALC.js"; 9 + import "../../../chunk-R65OZ4FV.js"; 10 + import "../../../chunk-XTBOWHKN.js"; 11 + import "../../../chunk-P3M4HQTD.js"; 12 + import "../../../chunk-Y27UCZCZ.js"; 13 + import "../../../chunk-KDXZLVT6.js"; 14 + import "../../../chunk-CHYBYJZ3.js"; 15 + import "../../../chunk-77ZY4GQV.js"; 16 + import "../../../chunk-XRZB5Q7N.js"; 17 + import "../../../chunk-5UTOUDDD.js"; 18 + import "../../../chunk-JBHW662S.js"; 19 + import "../../../chunk-5F2TCUTS.js"; 20 + import "../../../chunk-K5K7YTT4.js"; 21 + import "../../../chunk-TI6SX5NQ.js"; 22 + import "../../../chunk-G56PUJUJ.js"; 23 + import "../../../chunk-IZOBPV2S.js"; 24 + import "../../../chunk-XZNUL47A.js"; 25 + import "../../../chunk-TP5GZFTO.js"; 26 + import "../../../chunk-NCFHYTLD.js"; 27 + import "../../../chunk-DUCTMCPX.js"; 28 + import "../../../chunk-UGE3FKYA.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/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/output/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/output/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/process-tracks/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/orchestrator/process-tracks/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/process-tracks/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/process-tracks/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/process-tracks/worker.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/orchestrator/process-tracks/worker.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/process-tracks/worker.js.map
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/orchestrator/process-tracks/worker.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/queue-audio/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/orchestrator/queue-audio/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/queue-audio/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/queue-audio/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/scoped-tracks/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/orchestrator/scoped-tracks/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/scoped-tracks/element.js.map
··· 1 + ../../../../bafybeihr4brahqptxmxcdksktdfgs4hyl64odwx524vqmmitjvmn57sklq/components/orchestrator/scoped-tracks/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/scoped-tracks/worker.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/orchestrator/scoped-tracks/worker.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/scoped-tracks/worker.js.map
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/orchestrator/scoped-tracks/worker.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/sources/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/orchestrator/sources/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/orchestrator/sources/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/orchestrator/sources/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/bytes/automerge-repo-server/element.js
··· 1 + ../../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/output/bytes/automerge-repo-server/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/bytes/automerge-repo-server/element.js.map
··· 1 + ../../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/output/bytes/automerge-repo-server/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/bytes/s3/constants.js
··· 1 + ../../../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/bytes/s3/constants.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/bytes/s3/constants.js.map
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/output/bytes/s3/constants.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/bytes/s3/element.js
··· 1 + ../../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/output/bytes/s3/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/bytes/s3/element.js.map
··· 1 + ../../../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/output/bytes/s3/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/bytes/s3/worker.js
··· 1 + ../../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/output/bytes/s3/worker.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/bytes/s3/worker.js.map
··· 1 + ../../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/output/bytes/s3/worker.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/common.js
··· 1 + ../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/output/common.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/common.js.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/output/common.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/polymorphic/indexed-db/constants.js
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/output/polymorphic/indexed-db/constants.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/polymorphic/indexed-db/constants.js.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/output/polymorphic/indexed-db/constants.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/polymorphic/indexed-db/element.js
··· 1 + ../../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/output/polymorphic/indexed-db/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/polymorphic/indexed-db/element.js.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/output/polymorphic/indexed-db/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/polymorphic/indexed-db/worker.js
··· 1 + ../../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/output/polymorphic/indexed-db/worker.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/polymorphic/indexed-db/worker.js.map
··· 1 + ../../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/output/polymorphic/indexed-db/worker.js.map
+22
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/raw/atproto/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../../chunk-KDXZLVT6.js"; 6 + import "../../../../chunk-CHYBYJZ3.js"; 7 + import "../../../../chunk-77ZY4GQV.js"; 8 + import "../../../../chunk-5UTOUDDD.js"; 9 + import "../../../../chunk-TI6SX5NQ.js"; 10 + import "../../../../chunk-G56PUJUJ.js"; 11 + import "../../../../chunk-IZOBPV2S.js"; 12 + import "../../../../chunk-XZNUL47A.js"; 13 + import "../../../../chunk-TP5GZFTO.js"; 14 + import "../../../../chunk-NCFHYTLD.js"; 15 + import "../../../../chunk-FZQXS3RE.js"; 16 + export { 17 + CLASS, 18 + NAME, 19 + element_default as default 20 + }; 21 + 22 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/raw/atproto/element.js.map
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/output/raw/atproto/element.js.map
+16
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/raw/atproto/oauth.js
··· 1 + import { 2 + OAuthUserAgent, 3 + login, 4 + logout, 5 + restoreOrFinalize 6 + } from "../../../../chunk-CHYBYJZ3.js"; 7 + import "../../../../chunk-77ZY4GQV.js"; 8 + import "../../../../chunk-FZQXS3RE.js"; 9 + export { 10 + OAuthUserAgent, 11 + login, 12 + logout, 13 + restoreOrFinalize 14 + }; 15 + 16 + //# sourceMappingURL=./oauth.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/output/raw/atproto/oauth.js.map
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/output/raw/atproto/oauth.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/processor/artwork/constants.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/processor/artwork/constants.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/processor/artwork/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/artwork/constants.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/processor/artwork/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/processor/artwork/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/processor/artwork/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/artwork/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/processor/artwork/worker.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/processor/artwork/worker.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/processor/artwork/worker.js.map
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/processor/artwork/worker.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/processor/metadata/common.js
··· 1 + ../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/components/processor/metadata/common.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/processor/metadata/common.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/metadata/common.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/processor/metadata/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/processor/metadata/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/processor/metadata/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/metadata/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/processor/metadata/worker.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/processor/metadata/worker.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/processor/metadata/worker.js.map
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/processor/metadata/worker.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/processor/search/constants.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/processor/search/constants.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/processor/search/constants.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/search/constants.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/processor/search/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/processor/search/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/processor/search/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/processor/search/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/processor/search/worker.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/processor/search/worker.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/processor/search/worker.js.map
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/processor/search/worker.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/transformer/output/base.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/transformer/output/base.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/transformer/output/base.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/transformer/output/base.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/transformer/output/bytes/automerge/constants.js
··· 1 + ../../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/transformer/output/bytes/automerge/constants.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/transformer/output/bytes/automerge/constants.js.map
··· 1 + ../../../../../../bafybeieo3vdz7hmuriods6ueueg5yt6xctzjqrmqdasqr4plalwojiwvou/components/transformer/output/bytes/automerge/constants.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/transformer/output/bytes/automerge/element.js
··· 1 + ../../../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/transformer/output/bytes/automerge/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/transformer/output/bytes/automerge/element.js.map
··· 1 + ../../../../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/components/transformer/output/bytes/automerge/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/transformer/output/bytes/automerge/utils.js
··· 1 + ../../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/transformer/output/bytes/automerge/utils.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/transformer/output/bytes/automerge/utils.js.map
··· 1 + ../../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/components/transformer/output/bytes/automerge/utils.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/transformer/output/bytes/json/element.js
··· 1 + ../../../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/transformer/output/bytes/json/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/transformer/output/bytes/json/element.js.map
··· 1 + ../../../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/transformer/output/bytes/json/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/transformer/output/refiner/default/element.js
··· 1 + ../../../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/transformer/output/refiner/default/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/transformer/output/refiner/default/element.js.map
··· 1 + ../../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/transformer/output/refiner/default/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/transformer/output/string/json/element.js
··· 1 + ../../../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/components/transformer/output/string/json/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/components/transformer/output/string/json/element.js.map
··· 1 + ../../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/components/transformer/output/string/json/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/definitions/index.ts
··· 1 + ../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/definitions/index.ts
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/definitions/output/facet.json
··· 1 + ../../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/definitions/output/facet.json
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/definitions/output/playlist.json
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/definitions/output/playlist.json
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/definitions/output/theme.json
··· 1 + ../../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/definitions/output/theme.json
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/definitions/output/track.json
··· 1 + ../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/definitions/output/track.json
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/facets/examples/generate-playlist.html.txt
··· 1 + ../../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/facets/examples/generate-playlist.html.txt
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/facets/examples/now-playing.html.txt
··· 1 + ../../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/facets/examples/now-playing.html.txt
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/facets/index.html
··· 1 + ../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/facets/index.html
+332
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/facets/index.js
··· 1 + import { 2 + EditorView, 3 + autocompletion, 4 + basicSetup, 5 + css, 6 + html, 7 + javascript 8 + } from "../chunk-WM2QH5TD.js"; 9 + import { 10 + foundation_default 11 + } from "../chunk-P5REK7TQ.js"; 12 + import "../chunk-2RWEBKV5.js"; 13 + import "../chunk-MFHNNEAP.js"; 14 + import "../chunk-33YSHWBQ.js"; 15 + import "../chunk-6FINJPVD.js"; 16 + import "../chunk-7HCR4FJB.js"; 17 + import "../chunk-CPS76EE2.js"; 18 + import "../chunk-XRMR4X7K.js"; 19 + import "../chunk-7DBAGGP4.js"; 20 + import "../chunk-Q6XDYZUX.js"; 21 + import "../chunk-ET5MSOLB.js"; 22 + import "../chunk-EXQ7VALC.js"; 23 + import "../chunk-R65OZ4FV.js"; 24 + import "../chunk-XTBOWHKN.js"; 25 + import "../chunk-P3M4HQTD.js"; 26 + import "../chunk-Y27UCZCZ.js"; 27 + import "../chunk-KDXZLVT6.js"; 28 + import "../chunk-CHYBYJZ3.js"; 29 + import "../chunk-77ZY4GQV.js"; 30 + import "../chunk-XRZB5Q7N.js"; 31 + import "../chunk-5UTOUDDD.js"; 32 + import "../chunk-5EMZ3NAI.js"; 33 + import "../chunk-HVHVAQ4N.js"; 34 + import "../chunk-F22BR7N4.js"; 35 + import "../chunk-LCPZEHDQ.js"; 36 + import "../chunk-7U6IWNID.js"; 37 + import "../chunk-AISBWLUT.js"; 38 + import "../chunk-JBHW662S.js"; 39 + import "../chunk-GX3WPNEX.js"; 40 + import "../chunk-IGROFVGC.js"; 41 + import "../chunk-SSTS6DW7.js"; 42 + import "../chunk-HN4F5JEZ.js"; 43 + import "../chunk-B5LLSFSV.js"; 44 + import "../chunk-SM64ECST.js"; 45 + import "../chunk-ZZYF4BQN.js"; 46 + import "../chunk-WRBBFTZV.js"; 47 + import "../chunk-EEUCFWD4.js"; 48 + import "../chunk-6DRHTH2U.js"; 49 + import "../chunk-CW32SP4O.js"; 50 + import "../chunk-4XWBI3QC.js"; 51 + import "../chunk-EEVL24MR.js"; 52 + import "../chunk-5F2TCUTS.js"; 53 + import "../chunk-K5K7YTT4.js"; 54 + import "../chunk-HBALNHVO.js"; 55 + import "../chunk-J7PU3ISY.js"; 56 + import "../chunk-R276HM24.js"; 57 + import { 58 + B, 59 + T 60 + } from "../chunk-TI6SX5NQ.js"; 61 + import "../chunk-G56PUJUJ.js"; 62 + import { 63 + effect, 64 + signal 65 + } from "../chunk-IZOBPV2S.js"; 66 + import "../chunk-XZNUL47A.js"; 67 + import "../chunk-TP5GZFTO.js"; 68 + import "../chunk-NCFHYTLD.js"; 69 + import "../chunk-DUCTMCPX.js"; 70 + import "../chunk-UGE3FKYA.js"; 71 + import { 72 + facetFromUrl 73 + } from "../chunk-QQ2VIQZY.js"; 74 + import { 75 + qi 76 + } from "../chunk-PUHBIZRM.js"; 77 + import { 78 + create 79 + } from "../chunk-4YB6QUPN.js"; 80 + import { 81 + __name, 82 + init_Buffer, 83 + init_process 84 + } from "../chunk-FZQXS3RE.js"; 85 + 86 + // facets/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 url = target.closest("li")?.getAttribute("data-url"); 102 + if (!url) return; 103 + const name = target.closest("li")?.getAttribute("data-name"); 104 + if (!name) return; 105 + switch (rel) { 106 + case "fork": { 107 + const facet = await facetFromUrl({ name, url }, { fetchHTML: true }); 108 + editFacet(facet); 109 + document.querySelector("#build")?.scrollIntoView(); 110 + break; 111 + } 112 + case "save": { 113 + const facet = await facetFromUrl({ name, url }, { fetchHTML: false }); 114 + const out = foundation_default.orchestrator.output(); 115 + out.facets.save([ 116 + ...out.facets.collection(), 117 + facet 118 + ]); 119 + break; 120 + } 121 + } 122 + } 123 + ); 124 + var listEl = document.querySelector("#list"); 125 + if (!listEl) throw new Error("List element not found"); 126 + var output = foundation_default.orchestrator.output(); 127 + listEl.innerHTML = ""; 128 + effect(() => { 129 + const col = output.facets.collection().sort((a, b) => { 130 + return a.name.toLocaleLowerCase().localeCompare(b.name.toLocaleLowerCase()); 131 + }); 132 + const state = output.facets.state(); 133 + const h = col.length && state === "loaded" ? T` 134 + <ul> 135 + ${col.map( 136 + (c) => T` 137 + <li> 138 + <div style="position: relative;"> 139 + <a href="facets/l/?id=${c.id}"> 140 + ${c.name} 141 + </a> 142 + <button 143 + class="button--fixed button--transparent" 144 + popovertarget="facet-menu-col-${c.id}" 145 + style="anchor-name: --facet-anchor-col-${c.id}; position: absolute; right: 0; top: 50%; transform: translateY(-50%);" 146 + > 147 + <i class="ph-fill ph-dots-three-circle"></i> 148 + </button> 149 + </div> 150 + <div class="list-description"> 151 + ${c.url && !c.html ? T` 152 + <span class="with-icon"> 153 + <i class="ph-fill ph-binoculars"></i> 154 + <span>Tracking the original <a href="${c.url}">URL</a></span> 155 + </span> 156 + ` : T` 157 + <span class="with-icon"> 158 + <i class="ph-fill ph-code"></i> 159 + <span>Custom code</span> 160 + </span> 161 + `} 162 + </div> 163 + 164 + <!-- Dropdown Menu --> 165 + <div 166 + id="facet-menu-col-${c.id}" 167 + class="dropdown" 168 + style="position-anchor: --facet-anchor-col-${c.id}" 169 + popover 170 + > 171 + <a href="facets/l/?id=${c.id}"> 172 + <span class="with-icon"> 173 + <i class="ph-fill ph-globe"></i> Open 174 + </span> 175 + </a> 176 + <a @click="${() => editFacet(c)}"> 177 + <span class="with-icon"> 178 + <i class="ph-fill ph-cursor-text"></i> Edit 179 + </span> 180 + </a> 181 + <a @click="${deleteFacet({ id: c.id })}"> 182 + <span class="with-icon"> 183 + <i class="ph-fill ph-eraser"></i> Delete 184 + </span> 185 + </a> 186 + </div> 187 + </li> 188 + ` 189 + )} 190 + </ul> 191 + ` : state === "loaded" ? emptyFacetsList : T` 192 + <div class="with-icon" style="font-size: var(--fs-sm);"> 193 + <i class="ph-bold ph-spinner-gap"></i> 194 + Loading items 195 + </div> 196 + `; 197 + B(h, listEl); 198 + }); 199 + var emptyFacetsList = T` 200 + <p style="margin-bottom: 0;"> 201 + <i class="ph-fill ph-info"></i> You have not saved any facets yet. 202 + </p> 203 + `; 204 + function deleteFacet({ id }) { 205 + return () => { 206 + const c = confirm("Are you sure you want to delete this facet?"); 207 + if (!c) return; 208 + output.facets.save( 209 + output.facets.collection().filter((c2) => !(c2.id === id)) 210 + ); 211 + }; 212 + } 213 + __name(deleteFacet, "deleteFacet"); 214 + var $editingFacet = signal( 215 + /** @type {Facet | null} */ 216 + null 217 + ); 218 + var editorContainer = document.body.querySelector("#html-input-container"); 219 + if (!editorContainer) throw new Error("Editor container not found"); 220 + var editor = new EditorView({ 221 + parent: editorContainer, 222 + doc: ` 223 + <main> 224 + <h1 id="now-playing"> 225 + Waiting on tracks &amp; queue to load ... 226 + </h1> 227 + </main> 228 + 229 + <style> 230 + @import "./styles/base.css"; 231 + @import "./styles/diffuse/page.css"; 232 + </style> 233 + 234 + <script type="module"> 235 + import foundation from "./common/facets/foundation.js"; 236 + import { effect } from "./common/signal.js"; 237 + 238 + const components = foundation.features.fillQueueAutomatically(); 239 + const myHtmlElement = document.querySelector("#now-playing"); 240 + 241 + effect(() => { 242 + const currentlyPlaying = components.engine.queue.now(); 243 + if (currentlyPlaying && myHtmlElement) { 244 + myHtmlElement.innerText = \`\${currentlyPlaying.tags.artist} - \${currentlyPlaying.tags.title}\`; 245 + } 246 + }) 247 + <\/script> 248 + `.trim(), 249 + extensions: [ 250 + basicSetup, 251 + html(), 252 + css(), 253 + javascript(), 254 + autocompletion() 255 + ] 256 + }); 257 + document.querySelector("#build-form")?.addEventListener( 258 + "submit", 259 + onBuildSubmit 260 + ); 261 + async function onBuildSubmit(event) { 262 + event.preventDefault(); 263 + const nameEl = ( 264 + /** @type {HTMLInputElement | null} */ 265 + document.querySelector( 266 + "#name-input" 267 + ) 268 + ); 269 + const html2 = editor.state.doc.toString(); 270 + const cid = await create(85, new TextEncoder().encode(html2)); 271 + const name = nameEl?.value ?? "nameless"; 272 + const facet = $editingFacet.value ? { 273 + ...$editingFacet.value, 274 + cid, 275 + html: html2, 276 + name 277 + } : { 278 + $type: "sh.diffuse.output.facet", 279 + id: crypto.randomUUID(), 280 + cid, 281 + html: html2, 282 + name 283 + }; 284 + switch ( 285 + /** @type {any} */ 286 + event.submitter.name 287 + ) { 288 + case "save": 289 + await saveFacet(facet); 290 + break; 291 + case "save+open": 292 + await saveFacet(facet); 293 + globalThis.open(`./facets/l/?id=${facet.id}`, "blank"); 294 + break; 295 + } 296 + } 297 + __name(onBuildSubmit, "onBuildSubmit"); 298 + async function editFacet(ogFacet) { 299 + const facet = { ...ogFacet }; 300 + const nameEl = ( 301 + /** @type {HTMLInputElement | null} */ 302 + document.querySelector( 303 + "#name-input" 304 + ) 305 + ); 306 + if (!nameEl) return; 307 + document.querySelector("#build")?.scrollIntoView(); 308 + if (!facet.html && facet.url) { 309 + const html2 = await fetch(facet.url).then((res) => res.text()); 310 + const cid = await create(85, new TextEncoder().encode(html2)); 311 + facet.html = html2; 312 + facet.cid = cid; 313 + } 314 + $editingFacet.value = facet; 315 + nameEl.value = facet.name; 316 + editor.dispatch({ 317 + changes: { from: 0, to: editor.state.doc.length, insert: facet.html } 318 + }); 319 + } 320 + __name(editFacet, "editFacet"); 321 + async function saveFacet(facet) { 322 + const col = output.facets.collection(); 323 + const colWithoutId = col.filter((c) => c.id !== facet.id); 324 + const timestamp = qi.Now.zonedDateTimeISO().toString(); 325 + await output.facets.save([...colWithoutId, { 326 + ...facet, 327 + updatedAt: timestamp 328 + }]); 329 + } 330 + __name(saveFacet, "saveFacet"); 331 + 332 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/facets/index.js.map
··· 1 + ../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/facets/index.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/facets/l/index.html
··· 1 + ../../../bafybeibpmqpxuvey34kzaxj3yyprwbkgvhbuz3xpxb74jpk7nxgxu2yr74/facets/l/index.html
+126
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/facets/l/index.js
··· 1 + import { 2 + foundation_default 3 + } from "../../chunk-P5REK7TQ.js"; 4 + import "../../chunk-2RWEBKV5.js"; 5 + import "../../chunk-MFHNNEAP.js"; 6 + import "../../chunk-33YSHWBQ.js"; 7 + import "../../chunk-6FINJPVD.js"; 8 + import "../../chunk-7HCR4FJB.js"; 9 + import "../../chunk-CPS76EE2.js"; 10 + import "../../chunk-XRMR4X7K.js"; 11 + import "../../chunk-7DBAGGP4.js"; 12 + import "../../chunk-Q6XDYZUX.js"; 13 + import "../../chunk-ET5MSOLB.js"; 14 + import "../../chunk-EXQ7VALC.js"; 15 + import "../../chunk-R65OZ4FV.js"; 16 + import "../../chunk-XTBOWHKN.js"; 17 + import "../../chunk-P3M4HQTD.js"; 18 + import "../../chunk-Y27UCZCZ.js"; 19 + import "../../chunk-KDXZLVT6.js"; 20 + import "../../chunk-CHYBYJZ3.js"; 21 + import "../../chunk-77ZY4GQV.js"; 22 + import "../../chunk-XRZB5Q7N.js"; 23 + import "../../chunk-5UTOUDDD.js"; 24 + import "../../chunk-5EMZ3NAI.js"; 25 + import "../../chunk-HVHVAQ4N.js"; 26 + import "../../chunk-F22BR7N4.js"; 27 + import "../../chunk-LCPZEHDQ.js"; 28 + import "../../chunk-7U6IWNID.js"; 29 + import "../../chunk-AISBWLUT.js"; 30 + import "../../chunk-JBHW662S.js"; 31 + import "../../chunk-GX3WPNEX.js"; 32 + import "../../chunk-IGROFVGC.js"; 33 + import "../../chunk-SSTS6DW7.js"; 34 + import "../../chunk-HN4F5JEZ.js"; 35 + import "../../chunk-B5LLSFSV.js"; 36 + import "../../chunk-SM64ECST.js"; 37 + import "../../chunk-ZZYF4BQN.js"; 38 + import "../../chunk-WRBBFTZV.js"; 39 + import "../../chunk-EEUCFWD4.js"; 40 + import "../../chunk-6DRHTH2U.js"; 41 + import "../../chunk-CW32SP4O.js"; 42 + import "../../chunk-4XWBI3QC.js"; 43 + import "../../chunk-EEVL24MR.js"; 44 + import "../../chunk-5F2TCUTS.js"; 45 + import "../../chunk-K5K7YTT4.js"; 46 + import "../../chunk-HBALNHVO.js"; 47 + import "../../chunk-J7PU3ISY.js"; 48 + import "../../chunk-R276HM24.js"; 49 + import "../../chunk-TI6SX5NQ.js"; 50 + import "../../chunk-G56PUJUJ.js"; 51 + import { 52 + effect 53 + } from "../../chunk-IZOBPV2S.js"; 54 + import "../../chunk-XZNUL47A.js"; 55 + import "../../chunk-TP5GZFTO.js"; 56 + import "../../chunk-NCFHYTLD.js"; 57 + import "../../chunk-DUCTMCPX.js"; 58 + import "../../chunk-UGE3FKYA.js"; 59 + import { 60 + create 61 + } from "../../chunk-4YB6QUPN.js"; 62 + import { 63 + __name, 64 + init_Buffer, 65 + init_process 66 + } from "../../chunk-FZQXS3RE.js"; 67 + 68 + // facets/l/index.js 69 + init_Buffer(); 70 + init_process(); 71 + var output = foundation_default.orchestrator.output(); 72 + var docUrl = new URL(document.location.href); 73 + var id = docUrl.searchParams.get("id"); 74 + var cid = docUrl.searchParams.get("cid"); 75 + var name = docUrl.searchParams.get("name"); 76 + var url = docUrl.searchParams.get("url"); 77 + var containerNull = document.querySelector("#container"); 78 + if (!containerNull) throw new Error("Container not found"); 79 + var container = ( 80 + /** @type {HTMLDivElement} */ 81 + containerNull 82 + ); 83 + var loadedCid = null; 84 + effect(async () => { 85 + const collection = output.facets.collection(); 86 + if (output.facets.state() !== "loaded") return; 87 + let facet; 88 + if (id) { 89 + facet = collection.find((c) => c.id === id); 90 + } else if (cid) { 91 + facet = collection.find((c) => c.cid === cid); 92 + } else if (name) { 93 + facet = collection.find((c) => c.name === name); 94 + } else if (url) { 95 + const c = { 96 + $type: "sh.diffuse.output.facet", 97 + id: crypto.randomUUID(), 98 + name: "tryout", 99 + url 100 + }; 101 + facet = c; 102 + } 103 + if (!facet) { 104 + console.error("Facet not found"); 105 + return; 106 + } 107 + if (!facet.html && facet.url) { 108 + const html = await fetch(facet.url).then((res) => res.text()); 109 + const cid2 = await create(85, new TextEncoder().encode(html)); 110 + facet.html = html; 111 + facet.cid = cid2; 112 + } 113 + if (facet.cid === loadedCid) return; 114 + loadedCid = facet.cid ?? null; 115 + loadIntoContainer(facet); 116 + }); 117 + function loadIntoContainer(facet) { 118 + const range = document.createRange(); 119 + range.selectNode(container); 120 + const documentFragment = range.createContextualFragment(facet.html ?? ""); 121 + container.innerHTML = ""; 122 + container.append(documentFragment); 123 + } 124 + __name(loadIntoContainer, "loadIntoContainer"); 125 + 126 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/facets/l/index.js.map
··· 1 + ../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/facets/l/index.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/facets/tools/auto-queue.html.txt
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/facets/tools/auto-queue.html.txt
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/facets/tools/v3-import.html.txt
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/facets/tools/v3-import.html.txt
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/favicon-16x16.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/favicon-16x16.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/favicon-32x32.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/favicon-32x32.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/favicon.ico
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/favicon.ico
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/fonts/CommitMonoVariable.woff2
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/fonts/CommitMonoVariable.woff2
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/fonts/InterVariable-Italic.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/fonts/InterVariable-Italic.woff2
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/fonts/InterVariable.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/fonts/InterVariable.woff2
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/fonts/ms_sans_serif.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif.woff2
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/fonts/ms_sans_serif_bold.woff2
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif_bold.woff2
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/1.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/1.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/10.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/10.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/11.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/11.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/12.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/12.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/13.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/13.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/14.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/14.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/15.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/15.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/16.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/16.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/17.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/17.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/18.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/18.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/19.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/19.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/2.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/2.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/20.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/20.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/21.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/21.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/22.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/22.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/23.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/23.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/24.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/24.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/25.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/25.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/26.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/26.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/27.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/27.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/28.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/28.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/29.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/29.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/3.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/3.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/30.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/30.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/4.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/4.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/5.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/5.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/6.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/6.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/7.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/7.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/8.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/8.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/9.jpg
··· 1 + ../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/9.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/1.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/1.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/10.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/10.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/11.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/11.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/12.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/12.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/13.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/13.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/14.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/14.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/15.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/15.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/16.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/16.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/17.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/17.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/18.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/18.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/19.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/19.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/2.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/2.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/20.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/20.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/21.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/21.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/22.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/22.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/23.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/23.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/24.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/24.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/25.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/25.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/26.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/26.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/27.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/27.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/28.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/28.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/29.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/29.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/3.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/3.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/30.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/30.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/4.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/4.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/5.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/5.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/6.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/6.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/7.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/7.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/8.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/8.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/background/thumbnails/9.jpg
··· 1 + ../../../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/Background/Thumbnails/9.jpg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/diffuse-current.svg
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/diffuse-current.svg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/diffuse-dark.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse-dark.svg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/diffuse-grey.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse-grey.svg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/diffuse-light.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse-light.svg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/diffuse__icon-dark.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse__icon-dark.svg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/diffuse__icon-grey.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse__icon-grey.svg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/diffuse__icon-light.svg
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/diffuse__icon-light.svg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icon-square-ws.png
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/icon-square-ws.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icon-square.png
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/icon-square.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icon.png
··· 1 + ../../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/images/icon.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/catalog-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/catalog-1.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/cd_audio_cd_a-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/cd_audio_cd_a-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-2.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/cd_audio_cd_a-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-3.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/cd_audio_cd_a-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_audio_cd_a-4.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/cd_drive-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_drive-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/cd_drive_purple-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/cd_drive_purple-3.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/channels-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/channels-2.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/check-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/check-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/computer_sound-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/computer_sound-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/computer_user_pencil-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/computer_user_pencil-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/connected_world-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/connected_world-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/directory_admin_tools-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_admin_tools-3.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/directory_admin_tools-5.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_admin_tools-5.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/directory_channels-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_channels-2.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/directory_channels-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_channels-3.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/directory_closed-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_closed-3.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/directory_closed-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_closed-4.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/directory_control_panel-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_control_panel-2.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/directory_control_panel-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_control_panel-3.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/directory_explorer-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_explorer-4.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/directory_explorer-5.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_explorer-5.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/directory_favorites-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_favorites-2.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/directory_favorites-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_favorites-4.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/directory_net_web-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_net_web-3.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/directory_net_web-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_net_web-4.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/directory_network_conn-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_network_conn-3.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/directory_network_conn-5.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/directory_network_conn-5.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/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/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/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/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/gears-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/gears-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/globe_map-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/globe_map-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/help_book_big-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/help_book_big-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/installer-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/installer-3.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/installer_generic_old-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/installer_generic_old-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/loudspeaker_wave-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/loudspeaker_wave-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/magnifying_glass-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/magnifying_glass-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/magnifying_glass_4-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/magnifying_glass_4-1.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/media_player-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/media_player-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/media_player_stream_no.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/media_player_stream_no.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/ms_dos-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/ms_dos-1.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/msg_error-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_error-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/msg_information-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_information-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/msg_question-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_question-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/msg_warning-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/msg_warning-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/multimedia-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/multimedia-4.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/network_drive_world-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/network_drive_world-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/no-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/no-1.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/restrict-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/restrict-1.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/search_computer-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/search_computer-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/search_server-1.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/search_server-1.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/search_web-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/search_web-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/settings_gear-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/settings_gear-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/settings_gear-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/settings_gear-2.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/tip.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/tip.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/utopia_smiley.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/utopia_smiley.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/winamp2-32x32.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/winamp2-32x32.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/windows-0.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/windows-0.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/world-2.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/world-2.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/world-4.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/world-4.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/images/icons/windows_98/world_network_directories-3.png
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/images/icons/windows_98/world_network_directories-3.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/index.html
··· 1 + ../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/index.html
+143
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/index.js
··· 1 + import { 2 + GROUP 3 + } from "./chunk-P5REK7TQ.js"; 4 + import "./chunk-2RWEBKV5.js"; 5 + import { 6 + element_default as element_default4 7 + } from "./chunk-MFHNNEAP.js"; 8 + import "./chunk-33YSHWBQ.js"; 9 + import "./chunk-6FINJPVD.js"; 10 + import "./chunk-7HCR4FJB.js"; 11 + import "./chunk-CPS76EE2.js"; 12 + import "./chunk-XRMR4X7K.js"; 13 + import { 14 + element_default as element_default3 15 + } from "./chunk-7DBAGGP4.js"; 16 + import "./chunk-Q6XDYZUX.js"; 17 + import "./chunk-ET5MSOLB.js"; 18 + import "./chunk-EXQ7VALC.js"; 19 + import "./chunk-R65OZ4FV.js"; 20 + import "./chunk-XTBOWHKN.js"; 21 + import "./chunk-P3M4HQTD.js"; 22 + import "./chunk-Y27UCZCZ.js"; 23 + import "./chunk-KDXZLVT6.js"; 24 + import "./chunk-CHYBYJZ3.js"; 25 + import "./chunk-77ZY4GQV.js"; 26 + import "./chunk-XRZB5Q7N.js"; 27 + import "./chunk-5UTOUDDD.js"; 28 + import { 29 + element_default as element_default5 30 + } from "./chunk-5EMZ3NAI.js"; 31 + import "./chunk-HVHVAQ4N.js"; 32 + import "./chunk-F22BR7N4.js"; 33 + import "./chunk-LCPZEHDQ.js"; 34 + import { 35 + element_default as element_default2 36 + } from "./chunk-7U6IWNID.js"; 37 + import "./chunk-AISBWLUT.js"; 38 + import "./chunk-JBHW662S.js"; 39 + import "./chunk-GX3WPNEX.js"; 40 + import "./chunk-IGROFVGC.js"; 41 + import "./chunk-SSTS6DW7.js"; 42 + import "./chunk-HN4F5JEZ.js"; 43 + import "./chunk-B5LLSFSV.js"; 44 + import "./chunk-SM64ECST.js"; 45 + import "./chunk-ZZYF4BQN.js"; 46 + import "./chunk-WRBBFTZV.js"; 47 + import "./chunk-EEUCFWD4.js"; 48 + import "./chunk-6DRHTH2U.js"; 49 + import "./chunk-CW32SP4O.js"; 50 + import { 51 + element_default 52 + } from "./chunk-4XWBI3QC.js"; 53 + import "./chunk-EEVL24MR.js"; 54 + import "./chunk-5F2TCUTS.js"; 55 + import "./chunk-K5K7YTT4.js"; 56 + import "./chunk-HBALNHVO.js"; 57 + import "./chunk-J7PU3ISY.js"; 58 + import "./chunk-R276HM24.js"; 59 + import "./chunk-TI6SX5NQ.js"; 60 + import "./chunk-G56PUJUJ.js"; 61 + import "./chunk-IZOBPV2S.js"; 62 + import "./chunk-XZNUL47A.js"; 63 + import "./chunk-TP5GZFTO.js"; 64 + import "./chunk-NCFHYTLD.js"; 65 + import "./chunk-DUCTMCPX.js"; 66 + import "./chunk-UGE3FKYA.js"; 67 + import { 68 + __name, 69 + init_Buffer, 70 + init_process 71 + } from "./chunk-FZQXS3RE.js"; 72 + 73 + // index.js 74 + init_Buffer(); 75 + init_process(); 76 + var s3 = new element_default2(); 77 + var input = new element_default(); 78 + input.setAttribute("group", GROUP); 79 + input.append(s3); 80 + var output = new element_default3(); 81 + output.setAttribute("group", GROUP); 82 + var metadataProcessor = new element_default4(); 83 + metadataProcessor.setAttribute("group", GROUP); 84 + document.body.append(input, output, metadataProcessor); 85 + var pto = new element_default5(); 86 + pto.setAttribute("group", GROUP); 87 + pto.setAttribute("input-selector", input.selector); 88 + pto.setAttribute("output-selector", output.selector); 89 + pto.setAttribute("metadata-processor-selector", metadataProcessor.selector); 90 + document.body.append(pto); 91 + var addDemoBtn = document.querySelector("#add-sample-content"); 92 + async function addSampleContent() { 93 + if (!addDemoBtn) return; 94 + addDemoBtn.setAttribute("disabled", ""); 95 + addDemoBtn.innerHTML = `<span> 96 + <i class="ph-fill ph-hourglass-medium"></i> 97 + Adding source 98 + </span>`; 99 + const demo = await s3.demo(); 100 + const tracks = output.tracks.collection(); 101 + await output.tracks.save([...tracks, demo.track]); 102 + addDemoBtn.innerHTML = `<span> 103 + <i class="ph-fill ph-hourglass-medium"></i> 104 + Processing source 105 + </span>`; 106 + await pto.process(); 107 + addDemoBtn.innerHTML = `<span> 108 + <i class="ph-fill ph-check-fat"></i> Added 109 + </span>`; 110 + } 111 + __name(addSampleContent, "addSampleContent"); 112 + addDemoBtn?.addEventListener("click", addSampleContent); 113 + if (document.location.hostname.endsWith("diffuse.sh")) { 114 + document.querySelectorAll("#status").forEach(async (status) => { 115 + const versionOrCid = document.location.pathname.slice(1).split("/")[0]?.toLowerCase() ?? ""; 116 + const usesCid = versionOrCid.startsWith("bafy"); 117 + const { default: artifacts } = await import(`${document.location.origin}/artifacts.json`, { with: { type: "json" } }); 118 + const lastArtifact = Object.values(artifacts).reverse()[0]; 119 + const isLatest = usesCid ? versionOrCid === lastArtifact.cid : versionOrCid === lastArtifact.version; 120 + status.querySelectorAll(".ph-spinner").forEach((icon) => { 121 + icon.parentElement?.classList.add("hidden"); 122 + setTimeout(() => { 123 + icon.parentElement?.classList.remove("animate-spin"); 124 + icon.classList.remove("ph-spinner"); 125 + icon.classList.add("ph-arrow-fat-lines-up"); 126 + }, 500); 127 + }); 128 + status.querySelectorAll(`[href="/latest/"]`).forEach((a) => { 129 + if (usesCid) a.setAttribute("href", "/latest/hash/"); 130 + if (!isLatest) { 131 + setTimeout(() => { 132 + a.classList.remove("hidden"); 133 + }, 750); 134 + } 135 + }); 136 + }); 137 + } else { 138 + document.querySelectorAll("#status").forEach((status) => { 139 + status.remove(); 140 + }); 141 + } 142 + 143 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/index.js.map
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/index.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/mstile-150x150.png
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/mstile-150x150.png
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/node_crypto-QYMDOTAM.js
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/node_crypto-QYMDOTAM.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/node_crypto-QYMDOTAM.js.map
··· 1 + ../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/node_crypto-QYMDOTAM.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/oauth-client-metadata.json
··· 1 + ../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/oauth-client-metadata.json
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/safari-pinned-tab.svg
··· 1 + ../bafybeickgtv5nqyo2wizj323e6jy4mlcrmchzyfsgjgngl5kbzv6coqhk4/safari-pinned-tab.svg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/animations.css
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/animations.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/animations.css.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/animations.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/base.css
··· 1 + ../../bafybeiftdd7dlfoayxlckoz7nnnoun5ggr2p2biwnbnfn3zflg2drlkmca/styles/base.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/base.css.map
··· 1 + ../../bafybeiftdd7dlfoayxlckoz7nnnoun5ggr2p2biwnbnfn3zflg2drlkmca/styles/base.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/diffuse/colors.css
··· 1 + ../../../bafybeiftdd7dlfoayxlckoz7nnnoun5ggr2p2biwnbnfn3zflg2drlkmca/styles/diffuse/colors.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/diffuse/colors.css.map
··· 1 + ../../../bafybeiftdd7dlfoayxlckoz7nnnoun5ggr2p2biwnbnfn3zflg2drlkmca/styles/diffuse/colors.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/diffuse/fonts.css
··· 1 + ../../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/diffuse/fonts.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/diffuse/fonts.css.map
··· 1 + ../../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/diffuse/fonts.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/diffuse/page.css
··· 1 + ../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/styles/diffuse/page.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/diffuse/page.css.map
··· 1 + ../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/styles/diffuse/page.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/font-faces.css
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/font-faces.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/font-faces.css.map
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/font-faces.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/reset.css
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/reset.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/reset.css.map
··· 1 + ../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/reset.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/variables.css
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/variables.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/variables.css.map
··· 1 + ../../bafybeiezh4rgv7gk73o5dalfyilv5nfopezyvshtj5j7hrn23r4n27k7da/styles/variables.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/vendor/98.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/98.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/vendor/98.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/98.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/vendor/ms_sans_serif.woff2
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif.woff2
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/vendor/ms_sans_serif_bold.woff2
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/ms_sans_serif_bold.woff2
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/vendor/phosphor/bold/Phosphor-Bold.svg
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/Phosphor-Bold.svg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/vendor/phosphor/bold/Phosphor-Bold.ttf
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/Phosphor-Bold.ttf
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/vendor/phosphor/bold/Phosphor-Bold.woff
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/Phosphor-Bold.woff
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/vendor/phosphor/bold/Phosphor-Bold.woff2
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/Phosphor-Bold.woff2
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/vendor/phosphor/bold/style.css
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/style.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/vendor/phosphor/bold/style.css.map
··· 1 + ../../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/styles/vendor/phosphor/bold/style.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/vendor/phosphor/fill/Phosphor-Fill.svg
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.svg
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/vendor/phosphor/fill/Phosphor-Fill.ttf
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.ttf
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/vendor/phosphor/fill/Phosphor-Fill.woff
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.woff
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/vendor/phosphor/fill/Phosphor-Fill.woff2
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/Phosphor-Fill.woff2
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/vendor/phosphor/fill/style.css
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/style.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/vendor/phosphor/fill/style.css.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/styles/vendor/phosphor/fill/style.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/wireframe/ui.css
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/wireframe/ui.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/styles/wireframe/ui.css.map
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/styles/wireframe/ui.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/testing/index.html
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/testing/index.html
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/testing/output.js
··· 1 + ../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/testing/output.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/testing/output.js.map
··· 1 + ../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/testing/output.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/testing/output/index.html
··· 1 + ../../../bafybeic6tj6wx4iomrjs54m3je4e7lmq4jgcn7zqegufxtvqijffq32zkm/testing/output/index.html
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/testing/sample/tracks.js
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/testing/sample/tracks.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/testing/sample/tracks.js.map
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/testing/sample/tracks.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/blur/artwork-controller/element.css
··· 1 + ../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/themes/blur/artwork-controller/element.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/blur/artwork-controller/element.css.map
··· 1 + ../../../../bafybeidxl54c4ymomv6kytxqps6b5di34hgltpvyomx52g65lplv6dosxy/themes/blur/artwork-controller/element.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/blur/artwork-controller/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/themes/blur/artwork-controller/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/blur/artwork-controller/element.js.map
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/themes/blur/artwork-controller/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/blur/artwork-controller/facet.html.txt
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/blur/artwork-controller/facet.html.txt
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/blur/index.css
··· 1 + ../../../bafybeihr4brahqptxmxcdksktdfgs4hyl64odwx524vqmmitjvmn57sklq/themes/blur/index.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/blur/index.css.map
··· 1 + ../../../bafybeihr4brahqptxmxcdksktdfgs4hyl64odwx524vqmmitjvmn57sklq/themes/blur/index.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/blur/index.html
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/index.html
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/blur/index.js
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/blur/index.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/blur/index.js.map
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/blur/index.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/blur/variables.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/variables.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/blur/variables.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/blur/variables.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/index.html
··· 1 + ../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/themes/index.html
+305
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/index.js
··· 1 + import { 2 + EditorView, 3 + autocompletion, 4 + basicSetup, 5 + css, 6 + html, 7 + javascript 8 + } from "../chunk-WM2QH5TD.js"; 9 + import { 10 + foundation_default 11 + } from "../chunk-P5REK7TQ.js"; 12 + import "../chunk-2RWEBKV5.js"; 13 + import "../chunk-MFHNNEAP.js"; 14 + import "../chunk-33YSHWBQ.js"; 15 + import "../chunk-6FINJPVD.js"; 16 + import "../chunk-7HCR4FJB.js"; 17 + import "../chunk-CPS76EE2.js"; 18 + import "../chunk-XRMR4X7K.js"; 19 + import "../chunk-7DBAGGP4.js"; 20 + import "../chunk-Q6XDYZUX.js"; 21 + import "../chunk-ET5MSOLB.js"; 22 + import "../chunk-EXQ7VALC.js"; 23 + import "../chunk-R65OZ4FV.js"; 24 + import "../chunk-XTBOWHKN.js"; 25 + import "../chunk-P3M4HQTD.js"; 26 + import "../chunk-Y27UCZCZ.js"; 27 + import "../chunk-KDXZLVT6.js"; 28 + import "../chunk-CHYBYJZ3.js"; 29 + import "../chunk-77ZY4GQV.js"; 30 + import "../chunk-XRZB5Q7N.js"; 31 + import "../chunk-5UTOUDDD.js"; 32 + import "../chunk-5EMZ3NAI.js"; 33 + import "../chunk-HVHVAQ4N.js"; 34 + import "../chunk-F22BR7N4.js"; 35 + import "../chunk-LCPZEHDQ.js"; 36 + import "../chunk-7U6IWNID.js"; 37 + import "../chunk-AISBWLUT.js"; 38 + import "../chunk-JBHW662S.js"; 39 + import "../chunk-GX3WPNEX.js"; 40 + import "../chunk-IGROFVGC.js"; 41 + import "../chunk-SSTS6DW7.js"; 42 + import "../chunk-HN4F5JEZ.js"; 43 + import "../chunk-B5LLSFSV.js"; 44 + import "../chunk-SM64ECST.js"; 45 + import "../chunk-ZZYF4BQN.js"; 46 + import "../chunk-WRBBFTZV.js"; 47 + import "../chunk-EEUCFWD4.js"; 48 + import "../chunk-6DRHTH2U.js"; 49 + import "../chunk-CW32SP4O.js"; 50 + import "../chunk-4XWBI3QC.js"; 51 + import "../chunk-EEVL24MR.js"; 52 + import "../chunk-5F2TCUTS.js"; 53 + import "../chunk-K5K7YTT4.js"; 54 + import "../chunk-HBALNHVO.js"; 55 + import "../chunk-J7PU3ISY.js"; 56 + import "../chunk-R276HM24.js"; 57 + import { 58 + B, 59 + T 60 + } from "../chunk-TI6SX5NQ.js"; 61 + import "../chunk-G56PUJUJ.js"; 62 + import { 63 + effect, 64 + signal 65 + } from "../chunk-IZOBPV2S.js"; 66 + import "../chunk-XZNUL47A.js"; 67 + import "../chunk-TP5GZFTO.js"; 68 + import "../chunk-NCFHYTLD.js"; 69 + import "../chunk-DUCTMCPX.js"; 70 + import "../chunk-UGE3FKYA.js"; 71 + import { 72 + themeFromUrl 73 + } from "../chunk-G2ZO6QIY.js"; 74 + import { 75 + qi 76 + } from "../chunk-PUHBIZRM.js"; 77 + import { 78 + create 79 + } from "../chunk-4YB6QUPN.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 url = target.closest("li")?.getAttribute("data-url"); 102 + if (!url) return; 103 + const name = target.closest("li")?.getAttribute("data-name"); 104 + if (!name) return; 105 + switch (rel) { 106 + case "fork": { 107 + const theme = await themeFromUrl({ name, url }, { fetchHTML: true }); 108 + editTheme(theme); 109 + document.querySelector("#build")?.scrollIntoView(); 110 + break; 111 + } 112 + case "save": { 113 + const theme = await themeFromUrl({ name, url }, { 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) => T` 137 + <li> 138 + <div style="position: relative;"> 139 + <a href="themes/l/?id=${c.id}"> 140 + ${c.name} 141 + </a> 142 + <button 143 + class="button--fixed button--transparent" 144 + popovertarget="theme-menu-col-${c.id}" 145 + style="anchor-name: --theme-anchor-col-${c.id}; position: absolute; right: 0; top: 50%; transform: translateY(-50%);" 146 + > 147 + <i class="ph-fill ph-dots-three-circle"></i> 148 + </button> 149 + </div> 150 + <div class="list-description"> 151 + ${c.url && !c.html ? T` 152 + <span class="with-icon"> 153 + <i class="ph-fill ph-binoculars"></i> 154 + <span>Tracking the original <a href="${c.url}">URL</a></span> 155 + </span> 156 + ` : T` 157 + <span class="with-icon"> 158 + <i class="ph-fill ph-code"></i> 159 + <span>Custom code</span> 160 + </span> 161 + `} 162 + </div> 163 + 164 + <!-- Dropdown Menu --> 165 + <div 166 + id="theme-menu-col-${c.id}" 167 + class="dropdown" 168 + style="position-anchor: --theme-anchor-col-${c.id}" 169 + popover 170 + > 171 + <a href="themes/l/?id=${c.id}"> 172 + <span class="with-icon"> 173 + <i class="ph-fill ph-globe"></i> Open 174 + </span> 175 + </a> 176 + <a @click="${() => editTheme(c)}"> 177 + <span class="with-icon"> 178 + <i class="ph-fill ph-cursor-text"></i> Edit 179 + </span> 180 + </a> 181 + <a @click="${deleteTheme({ id: c.id })}"> 182 + <span class="with-icon"> 183 + <i class="ph-fill ph-eraser"></i> Delete 184 + </span> 185 + </a> 186 + </div> 187 + </li> 188 + ` 189 + )} 190 + </ul> 191 + ` : state === "loaded" ? emptyThemesList : T` 192 + <div class="with-icon" style="font-size: var(--fs-sm);"> 193 + <i class="ph-bold ph-spinner-gap"></i> 194 + Loading items 195 + </div> 196 + `; 197 + B(h, listEl); 198 + }); 199 + var emptyThemesList = T` 200 + <p style="margin-bottom: 0;"> 201 + <i class="ph-fill ph-info"></i> You have not saved any themes yet. 202 + </p> 203 + `; 204 + function deleteTheme({ id }) { 205 + return () => { 206 + const c = confirm("Are you sure you want to delete this theme?"); 207 + if (!c) return; 208 + output.themes.save( 209 + output.themes.collection().filter((c2) => !(c2.id === id)) 210 + ); 211 + }; 212 + } 213 + __name(deleteTheme, "deleteTheme"); 214 + var $editingTheme = signal( 215 + /** @type {Theme | null} */ 216 + null 217 + ); 218 + var editorContainer = document.body.querySelector("#html-input-container"); 219 + if (!editorContainer) throw new Error("Editor container not found"); 220 + var editor = new EditorView({ 221 + parent: editorContainer, 222 + doc: ``.trim(), 223 + extensions: [ 224 + basicSetup, 225 + html(), 226 + css(), 227 + javascript(), 228 + autocompletion() 229 + ] 230 + }); 231 + document.querySelector("#build-form")?.addEventListener( 232 + "submit", 233 + onBuildSubmit 234 + ); 235 + async function onBuildSubmit(event) { 236 + event.preventDefault(); 237 + const nameEl = ( 238 + /** @type {HTMLInputElement | null} */ 239 + document.querySelector( 240 + "#name-input" 241 + ) 242 + ); 243 + const html2 = editor.state.doc.toString(); 244 + const cid = await create(85, new TextEncoder().encode(html2)); 245 + const name = nameEl?.value ?? "nameless"; 246 + const theme = $editingTheme.value ? { 247 + ...$editingTheme.value, 248 + cid, 249 + html: html2, 250 + name 251 + } : { 252 + $type: "sh.diffuse.output.theme", 253 + id: crypto.randomUUID(), 254 + cid, 255 + html: html2, 256 + name 257 + }; 258 + switch ( 259 + /** @type {any} */ 260 + event.submitter.name 261 + ) { 262 + case "save": 263 + await saveTheme(theme); 264 + break; 265 + case "save+open": 266 + await saveTheme(theme); 267 + globalThis.open(`./themes/l/?id=${theme.id}`, "blank"); 268 + break; 269 + } 270 + } 271 + __name(onBuildSubmit, "onBuildSubmit"); 272 + async function editTheme(ogTheme) { 273 + const theme = { ...ogTheme }; 274 + const nameEl = ( 275 + /** @type {HTMLInputElement | null} */ 276 + document.querySelector( 277 + "#name-input" 278 + ) 279 + ); 280 + if (!nameEl) return; 281 + if (!theme.html && theme.url) { 282 + const html2 = await fetch(theme.url).then((res) => res.text()); 283 + const cid = await create(85, new TextEncoder().encode(html2)); 284 + theme.html = html2; 285 + theme.cid = cid; 286 + } 287 + $editingTheme.value = theme; 288 + nameEl.value = theme.name; 289 + editor.dispatch({ 290 + changes: { from: 0, to: editor.state.doc.length, insert: theme.html } 291 + }); 292 + } 293 + __name(editTheme, "editTheme"); 294 + async function saveTheme(theme) { 295 + const col = output.themes.collection(); 296 + const colWithoutId = col.filter((c) => c.id !== theme.id); 297 + const timestamp = qi.Now.zonedDateTimeISO().toString(); 298 + await output.themes.save([...colWithoutId, { 299 + ...theme, 300 + updatedAt: timestamp 301 + }]); 302 + } 303 + __name(saveTheme, "saveTheme"); 304 + 305 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/index.js.map
··· 1 + ../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/themes/index.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/l/index.css
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/l/index.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/l/index.css.map
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/l/index.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/l/index.html
··· 1 + ../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/l/index.html
+116
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/l/index.js
··· 1 + import { 2 + foundation_default 3 + } from "../../chunk-P5REK7TQ.js"; 4 + import "../../chunk-2RWEBKV5.js"; 5 + import "../../chunk-MFHNNEAP.js"; 6 + import "../../chunk-33YSHWBQ.js"; 7 + import "../../chunk-6FINJPVD.js"; 8 + import "../../chunk-7HCR4FJB.js"; 9 + import "../../chunk-CPS76EE2.js"; 10 + import "../../chunk-XRMR4X7K.js"; 11 + import "../../chunk-7DBAGGP4.js"; 12 + import "../../chunk-Q6XDYZUX.js"; 13 + import "../../chunk-ET5MSOLB.js"; 14 + import "../../chunk-EXQ7VALC.js"; 15 + import "../../chunk-R65OZ4FV.js"; 16 + import "../../chunk-XTBOWHKN.js"; 17 + import "../../chunk-P3M4HQTD.js"; 18 + import "../../chunk-Y27UCZCZ.js"; 19 + import "../../chunk-KDXZLVT6.js"; 20 + import "../../chunk-CHYBYJZ3.js"; 21 + import "../../chunk-77ZY4GQV.js"; 22 + import "../../chunk-XRZB5Q7N.js"; 23 + import "../../chunk-5UTOUDDD.js"; 24 + import "../../chunk-5EMZ3NAI.js"; 25 + import "../../chunk-HVHVAQ4N.js"; 26 + import "../../chunk-F22BR7N4.js"; 27 + import "../../chunk-LCPZEHDQ.js"; 28 + import "../../chunk-7U6IWNID.js"; 29 + import "../../chunk-AISBWLUT.js"; 30 + import "../../chunk-JBHW662S.js"; 31 + import "../../chunk-GX3WPNEX.js"; 32 + import "../../chunk-IGROFVGC.js"; 33 + import "../../chunk-SSTS6DW7.js"; 34 + import "../../chunk-HN4F5JEZ.js"; 35 + import "../../chunk-B5LLSFSV.js"; 36 + import "../../chunk-SM64ECST.js"; 37 + import "../../chunk-ZZYF4BQN.js"; 38 + import "../../chunk-WRBBFTZV.js"; 39 + import "../../chunk-EEUCFWD4.js"; 40 + import "../../chunk-6DRHTH2U.js"; 41 + import "../../chunk-CW32SP4O.js"; 42 + import "../../chunk-4XWBI3QC.js"; 43 + import "../../chunk-EEVL24MR.js"; 44 + import "../../chunk-5F2TCUTS.js"; 45 + import "../../chunk-K5K7YTT4.js"; 46 + import "../../chunk-HBALNHVO.js"; 47 + import "../../chunk-J7PU3ISY.js"; 48 + import "../../chunk-R276HM24.js"; 49 + import "../../chunk-TI6SX5NQ.js"; 50 + import "../../chunk-G56PUJUJ.js"; 51 + import { 52 + effect 53 + } from "../../chunk-IZOBPV2S.js"; 54 + import "../../chunk-XZNUL47A.js"; 55 + import "../../chunk-TP5GZFTO.js"; 56 + import "../../chunk-NCFHYTLD.js"; 57 + import "../../chunk-DUCTMCPX.js"; 58 + import "../../chunk-UGE3FKYA.js"; 59 + import { 60 + create 61 + } from "../../chunk-4YB6QUPN.js"; 62 + import { 63 + __name, 64 + init_Buffer, 65 + init_process 66 + } from "../../chunk-FZQXS3RE.js"; 67 + 68 + // themes/l/index.js 69 + init_Buffer(); 70 + init_process(); 71 + var output = foundation_default.orchestrator.output(); 72 + var docUrl = new URL(document.location.href); 73 + var id = docUrl.searchParams.get("id"); 74 + var cid = docUrl.searchParams.get("cid"); 75 + var name = docUrl.searchParams.get("name"); 76 + var url = docUrl.searchParams.get("url"); 77 + var loadedCid = null; 78 + effect(async () => { 79 + const collection = output.themes.collection(); 80 + if (output.themes.state() !== "loaded") return; 81 + let theme; 82 + if (id) { 83 + theme = collection.find((t) => t.id === id); 84 + } else if (cid) { 85 + theme = collection.find((t) => t.cid === cid); 86 + } else if (name) { 87 + theme = collection.find((t) => t.name === name); 88 + } else if (url) { 89 + const t = { 90 + $type: "sh.diffuse.output.theme", 91 + id: crypto.randomUUID(), 92 + name: "tryout", 93 + url 94 + }; 95 + theme = t; 96 + } 97 + if (!theme) return; 98 + if (!theme.html && theme.url) { 99 + const html = await fetch(theme.url).then((res) => res.text()); 100 + const cid2 = await create(85, new TextEncoder().encode(html)); 101 + theme.html = html; 102 + theme.cid = cid2; 103 + } 104 + if (theme.cid === loadedCid) return; 105 + loadedCid = theme.cid ?? null; 106 + loadIntoContainer(theme); 107 + }); 108 + function loadIntoContainer(theme) { 109 + const iframe = document.createElement("iframe"); 110 + iframe.srcdoc = theme.html ?? ""; 111 + document.body.innerHTML = ""; 112 + document.body.append(iframe); 113 + } 114 + __name(loadIntoContainer, "loadIntoContainer"); 115 + 116 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/l/index.js.map
··· 1 + ../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/themes/l/index.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/98-extra.css
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/98-extra.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/98-extra.css.map
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/98-extra.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/98-vars.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/98-vars.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/98-vars.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/98-vars.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/browser/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/themes/webamp/browser/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/browser/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/browser/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/browser/facet.html.txt
··· 1 + ../../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/browser/facet.html.txt
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/common/ui.js
··· 1 + ../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/webamp/common/ui.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/common/ui.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/common/ui.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/configurators/input/element.js
··· 1 + ../../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/themes/webamp/configurators/input/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/configurators/input/element.js.map
··· 1 + ../../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/configurators/input/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/configurators/input/facet.html.txt
··· 1 + ../../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/themes/webamp/configurators/input/facet.html.txt
+25
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/configurators/output/element.js
··· 1 + import { 2 + CLASS, 3 + NAME, 4 + element_default 5 + } from "../../../../chunk-VCQFSS6B.js"; 6 + import "../../../../chunk-Y27UCZCZ.js"; 7 + import "../../../../chunk-KDXZLVT6.js"; 8 + import "../../../../chunk-CHYBYJZ3.js"; 9 + import "../../../../chunk-77ZY4GQV.js"; 10 + import "../../../../chunk-5UTOUDDD.js"; 11 + import "../../../../chunk-JBHW662S.js"; 12 + import "../../../../chunk-TI6SX5NQ.js"; 13 + import "../../../../chunk-G56PUJUJ.js"; 14 + import "../../../../chunk-IZOBPV2S.js"; 15 + import "../../../../chunk-XZNUL47A.js"; 16 + import "../../../../chunk-TP5GZFTO.js"; 17 + import "../../../../chunk-NCFHYTLD.js"; 18 + import "../../../../chunk-FZQXS3RE.js"; 19 + export { 20 + CLASS, 21 + NAME, 22 + element_default as default 23 + }; 24 + 25 + //# sourceMappingURL=./element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/configurators/output/element.js.map
··· 1 + ../../../../../bafybeidalhvzpez6rklon4cuqrh44f47s6iw34tgqzocr5c3mdhxbkwtsu/themes/webamp/configurators/output/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/configurators/output/facet.html.txt
··· 1 + ../../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/themes/webamp/configurators/output/facet.html.txt
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/facet.css
··· 1 + ../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/themes/webamp/facet.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/facet.css.map
··· 1 + ../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/themes/webamp/facet.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/fonts.css
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/fonts.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/fonts.css.map
··· 1 + ../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/fonts.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/index.css
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/index.css
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/index.css.map
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/index.css.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/index.html
··· 1 + ../../../bafybeify7k4tyvqdlraa7y7zga5wrnzetljpvtvgy2fkwui4wz4beq4fzy/themes/webamp/index.html
+185
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/index.js
··· 1 + import "../../chunk-4XM4KNLF.js"; 2 + import "../../chunk-5LCUNSRQ.js"; 3 + import "../../chunk-3CXPPL5Z.js"; 4 + import "../../chunk-VCQFSS6B.js"; 5 + import { 6 + element_default 7 + } from "../../chunk-2E662X3X.js"; 8 + import { 9 + element_default as element_default2 10 + } from "../../chunk-2K4IS7RU.js"; 11 + import "../../chunk-XPKGXYQJ.js"; 12 + import "../../chunk-MFHNNEAP.js"; 13 + import { 14 + element_exports as element_exports3 15 + } from "../../chunk-33YSHWBQ.js"; 16 + import { 17 + element_exports as element_exports4 18 + } from "../../chunk-6FINJPVD.js"; 19 + import "../../chunk-XRMR4X7K.js"; 20 + import "../../chunk-7DBAGGP4.js"; 21 + import "../../chunk-Q6XDYZUX.js"; 22 + import "../../chunk-ET5MSOLB.js"; 23 + import "../../chunk-EXQ7VALC.js"; 24 + import "../../chunk-R65OZ4FV.js"; 25 + import "../../chunk-XTBOWHKN.js"; 26 + import "../../chunk-P3M4HQTD.js"; 27 + import "../../chunk-Y27UCZCZ.js"; 28 + import "../../chunk-KDXZLVT6.js"; 29 + import "../../chunk-CHYBYJZ3.js"; 30 + import "../../chunk-77ZY4GQV.js"; 31 + import "../../chunk-XRZB5Q7N.js"; 32 + import "../../chunk-5UTOUDDD.js"; 33 + import "../../chunk-5EMZ3NAI.js"; 34 + import "../../chunk-F22BR7N4.js"; 35 + import "../../chunk-7U6IWNID.js"; 36 + import "../../chunk-AISBWLUT.js"; 37 + import "../../chunk-JBHW662S.js"; 38 + import "../../chunk-GX3WPNEX.js"; 39 + import "../../chunk-IGROFVGC.js"; 40 + import "../../chunk-SSTS6DW7.js"; 41 + import "../../chunk-HN4F5JEZ.js"; 42 + import "../../chunk-SM64ECST.js"; 43 + import "../../chunk-ZZYF4BQN.js"; 44 + import "../../chunk-WRBBFTZV.js"; 45 + import "../../chunk-EEUCFWD4.js"; 46 + import "../../chunk-6DRHTH2U.js"; 47 + import { 48 + element_exports as element_exports2 49 + } from "../../chunk-4XWBI3QC.js"; 50 + import "../../chunk-EEVL24MR.js"; 51 + import "../../chunk-5F2TCUTS.js"; 52 + import "../../chunk-K5K7YTT4.js"; 53 + import { 54 + element_exports 55 + } from "../../chunk-R276HM24.js"; 56 + import { 57 + component 58 + } from "../../chunk-TI6SX5NQ.js"; 59 + import "../../chunk-G56PUJUJ.js"; 60 + import { 61 + effect, 62 + untracked 63 + } from "../../chunk-IZOBPV2S.js"; 64 + import "../../chunk-XZNUL47A.js"; 65 + import "../../chunk-TP5GZFTO.js"; 66 + import "../../chunk-NCFHYTLD.js"; 67 + import "../../chunk-DUCTMCPX.js"; 68 + import "../../chunk-UGE3FKYA.js"; 69 + import { 70 + __name, 71 + init_Buffer, 72 + init_process 73 + } from "../../chunk-FZQXS3RE.js"; 74 + 75 + // themes/webamp/index.js 76 + init_Buffer(); 77 + init_process(); 78 + var input = component(element_exports2); 79 + var queue = component(element_exports); 80 + var search = component(element_exports3); 81 + var scopedTracks = component(element_exports4); 82 + var output = document.querySelector("#output"); 83 + if (!output) throw new Error("Missing output element"); 84 + globalThis.queue = queue; 85 + globalThis.output = output; 86 + var index = {}; 87 + var initiatedPlaylist = false; 88 + var ampElement = document.querySelector("dtw-webamp"); 89 + if (ampElement instanceof element_default === false) { 90 + throw new Error("Missing webamp element"); 91 + } 92 + var amp = ampElement.amp; 93 + var loadFromUrl = amp.media.loadFromUrl.bind(amp.media); 94 + async function loadOverride(uri, autoPlay) { 95 + if (uri.startsWith("blob:")) { 96 + return await loadFromUrl(uri, autoPlay); 97 + } 98 + const resp = await input.resolve({ method: "GET", uri }); 99 + if (!resp) throw new Error("Failed to resolve URI"); 100 + if (resp && "stream" in resp) { 101 + throw new Error("Webamp does not support playing streams."); 102 + } 103 + return await loadFromUrl(resp.url, autoPlay); 104 + } 105 + __name(loadOverride, "loadOverride"); 106 + amp.media.loadFromUrl = loadOverride.bind(amp.media); 107 + effect(() => { 108 + const past = untracked(() => queue.past()); 109 + const now = untracked(() => queue.now()); 110 + const future = queue.future(); 111 + const list = [...past, ...now ? [now] : [], ...future]; 112 + const newIdx = {}; 113 + const idMap = {}; 114 + list.forEach((item) => { 115 + newIdx[item.id] = (newIdx[item.id] ?? 0) + 1; 116 + idMap[item.id] = item; 117 + }); 118 + const tracksToAdd = []; 119 + Object.entries(newIdx).forEach(([id, n]) => { 120 + const x = index[id] ?? 0; 121 + if (n > x) { 122 + tracksToAdd.push(idMap[id]); 123 + index[id] = x + 1; 124 + } 125 + }); 126 + tracksToAdd.forEach((t) => ampElement.addTrack(t)); 127 + if (!initiatedPlaylist && tracksToAdd.length) { 128 + initiatedPlaylist = true; 129 + amp.store.dispatch({ type: "BUFFER_TRACK", id: 0 }); 130 + } 131 + }); 132 + effect(() => { 133 + queue.supply({ tracks: scopedTracks.tracks() }); 134 + }); 135 + var tracksPromise = Promise.withResolvers(); 136 + effect(() => { 137 + const state = output.tracks.state(); 138 + if (state !== "loaded") return; 139 + const fingerprintSearch = search.supplyFingerprint(); 140 + if (fingerprintSearch === void 0) return; 141 + const fingerprintQueue = queue.supplyFingerprint(); 142 + if (fingerprintQueue === void 0) return; 143 + tracksPromise.resolve("loaded"); 144 + }); 145 + document.body.querySelectorAll(".desktop__item").forEach((element) => { 146 + if (element instanceof HTMLElement) { 147 + element.addEventListener("dblclick", () => { 148 + const f = element.querySelector("label")?.getAttribute("for"); 149 + if (f) return windowManager()?.toggleWindow(f); 150 + }); 151 + } 152 + }); 153 + document.body.querySelector("#desktop-batch")?.addEventListener( 154 + "dblclick", 155 + () => { 156 + tracksPromise.promise.then(() => { 157 + addBatch(); 158 + }); 159 + } 160 + ); 161 + var winampIsShown = true; 162 + document.body.querySelector("#desktop-winamp")?.addEventListener( 163 + "dblclick", 164 + () => { 165 + if (winampIsShown) { 166 + amp.close(); 167 + } else { 168 + amp.reopen(); 169 + winampIsShown = true; 170 + } 171 + } 172 + ); 173 + amp.onClose(() => winampIsShown = false); 174 + async function addBatch() { 175 + await queue.fill({ augment: true, amount: 50, shuffled: true }); 176 + } 177 + __name(addBatch, "addBatch"); 178 + function windowManager() { 179 + const w = document.body.querySelector("dtw-window-manager"); 180 + if (w instanceof element_default2) return w; 181 + return null; 182 + } 183 + __name(windowManager, "windowManager"); 184 + 185 + //# sourceMappingURL=./index.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/index.js.map
··· 1 + ../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/themes/webamp/index.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/webamp/element.js
··· 1 + ../../../../bafybeibuoq45hezn7mr3y6f4xuwibelfe5wregg2fwu7laxs4uxot4alrq/themes/webamp/webamp/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/webamp/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/webamp/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/window-manager/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/themes/webamp/window-manager/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/window-manager/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/window-manager/element.js.map
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/window/element.js
··· 1 + ../../../../bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie/themes/webamp/window/element.js
+1
artifacts/bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie/themes/webamp/window/element.js.map
··· 1 + ../../../../bafybeib3wlfzxqunhpofk5mpfpyoqpd42bsj43o3vzxnpjbahimyjjyq54/themes/webamp/window/element.js.map
+2 -2
artifacts/versions.json
··· 5 5 "version": "3.5.0" 6 6 }, 7 7 "4.0.0-alpha": { 8 - "cid": "bafybeicokklzc7qrdyz7qaho5jskzgdhzi7o2ihwvbbalw6c5p75fsyfie", 9 - "createdAt": "2026-02-18T18:40:23.511Z", 8 + "cid": "bafybeidzc5abrqzw2vf4cjh3gv7cgwbzaweuqmq3g7swvnwg5n333ot6ie", 9 + "createdAt": "2026-02-18T19:11:40.462Z", 10 10 "version": "4.0.0-alpha" 11 11 } 12 12 }