diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..8ab102ee --- /dev/null +++ b/.dockerignore @@ -0,0 +1,30 @@ +* + +!docker + +!adventure +!backgrounds +!bestiary +!book +!characters +!charcreationoptions +!classes +!conditionsdiseases +!covers +!decks +!deities +!dmscreen +!feats +!items +!languages +!objects +!pdf +!plutonium +!races +!recipes +!spells +!traps +!variantrules +!vehicles + +!*.webp diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..d7860326 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,7 @@ +[*] +charset=utf-8 +end_of_line=lf +trim_trailing_whitespace=true +insert_final_newline=true +indent_style=tab +indent_size=3 diff --git a/.gitattributes b/.gitattributes index e19e8991..3c37f599 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,26 @@ -*.webp -text -*.pdf -text \ No newline at end of file +*.js text eol=lf +*.cjs text eol=lf +*.mjs text eol=lf +*.json text eol=lf +*.html text eol=lf +*.scss text eol=lf +*.md text eol=lf +*.yml text eol=lf +*.sh text eol=lf +*.css text eol=lf +*.xml text eol=lf +*.svg text eol=lf +*.hbs text eol=lf +*.txt text eol=lf + +.dockerignore text eol=lf +.editorconfig text eol=lf +.gitattributes text eol=lf +.gitignore text eol=lf +.eslintignore text eol=lf +.eslintrc.cjs text eol=lf +.gitmodules text eol=lf +.node-version text eol=lf +manifest.webmanifest text eol=lf +docker/*.conf text eol=lf +Dockerfile text eol=lf diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 00000000..aad7bfa7 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,74 @@ +name: Build and Upload Release + +on: + push: + tags: + - 'v**' + + # Allow running manually from the actions tab + workflow_dispatch: + +env: + # See: https://docs.github.com/en/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions#upgrading-a-workflow-that-accesses-ghcrio + IMAGE_NAME: 5etools-img + +concurrency: + group: "release" + cancel-in-progress: true + +jobs: + create-release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + + - name: Archive Images + run: | + rm -rf docker Dockerfile + mkdir -p img + ls | grep -v img | xargs mv -t img + zip -r -s 500m img-${{ github.ref_name }}.zip img/ + + - name: Upload Release + # Add the files one-by-one in an effort to avoid timeouts + # Sleep between creating the release and adding files, as the release takes time to be created (?) + run: | + gh release create "${{github.ref_name}}" --title "${{github.ref_name}}" --notes "Version ${{ github.ref_name }}" + sleep 10 + for f in $(find . -name 'img-${{ github.ref_name }}.*' -print); do gh release upload ${{ github.ref_name }} $f; done + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + create-image: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + + # See: https://stackoverflow.com/a/58178121 + - name: Set Env + run: | + IMAGE_VERSION=${{ github.ref_name }} + # Strip "v" prefix from tag name + [[ "${{ github.ref }}" == "refs/tags/"* ]] && IMAGE_VERSION=$(echo $IMAGE_VERSION | sed -e 's/^v//') + echo "IMAGE_VERSION=$IMAGE_VERSION" >> $GITHUB_ENV + + echo "IMAGE_ID=$(echo ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME | tr '[A-Z]' '[a-z]')" >> $GITHUB_ENV + + # region See: https://docs.github.com/en/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions#upgrading-a-workflow-that-accesses-ghcrio + - name: Build Image + run: | + docker build -t $IMAGE_NAME . + + - name: Log In to Registry + run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin + + - name: Push Image + run: | + echo IMAGE_ID=$IMAGE_ID + echo IMAGE_VERSION=$IMAGE_VERSION + docker tag $IMAGE_NAME $IMAGE_ID:$IMAGE_VERSION + # Always tag latest when pushing a tag, as we don't expect to ever merge old tags + [[ "${{ github.ref }}" == "refs/tags/"* ]] && docker tag $IMAGE_NAME $IMAGE_ID:latest + docker push $IMAGE_ID:$IMAGE_VERSION + docker push $IMAGE_ID:latest + # endregion diff --git a/.gitignore b/.gitignore index 7b90a491..8b5a8d8c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,28 @@ +desktop.ini +node_modules +img + +# IntelliJ project files .idea/ *.iml -desktop.ini + +# Visual Studio Code project files +.vscode/ + +# Misc dev/scripting files +trash +trash_in +node_ + +# Generated files +sitemap.xml +*.DS_Store +Thumbs.db +.rsync-filter + +# Generated service worker files +sw.js +sw-injector.js + +# Log files +*.log diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..32b45ea1 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +FROM alpine + +RUN apk update && apk add lighttpd rsync + +CMD [ "lighttpd", "-D", "-f", "/etc/lighttpd/lighttpd.conf" ] +EXPOSE 80 + +WORKDIR /var/www/localhost/htdocs + +COPY . img/ + +RUN mv img/docker/lighttpd.conf img/docker/mime-types.conf /etc/lighttpd/ && rm -rf img/docker/ diff --git a/docker/lighttpd.conf b/docker/lighttpd.conf new file mode 100644 index 00000000..15d4fdaa --- /dev/null +++ b/docker/lighttpd.conf @@ -0,0 +1,10 @@ +server.document-root = "/var/www/localhost/htdocs" + +server.port = 80 + +server.username = "lighttpd" +server.groupname = "lighttpd" + +include "/etc/lighttpd/mime-types.conf" + +index-file.names = ("index.html") diff --git a/docker/mime-types.conf b/docker/mime-types.conf new file mode 100644 index 00000000..6daffd6e --- /dev/null +++ b/docker/mime-types.conf @@ -0,0 +1,1369 @@ +# created by create-mime.conf.pl + +####################################################################### +## +## MimeType handling +## ------------------- +## +## https://redmine.lighttpd.net/projects/lighttpd/wiki/Mimetype_assignDetails + +## +## mimetype.xattr-name +## Set the extended file attribute name used to obtain mime type +## (must also set mimetype.use-xattr = "enable") +## +## Default value is "Content-Type" +## +## freedesktop.org Shared MIME-info Database specification suggests +## user-defined value ("user.mime_type") as name for extended file attribute +#mimetype.xattr-name = "user.mime_type" + +## +## Use extended attribute named in mimetype.xattr-name (default "Content-Type") +## to obtain mime type if possible +## +## Disabled by default +## +#mimetype.use-xattr = "enable" + +## +## mimetype ("Content-Type" HTTP header) mapping for static file handling +## +## The first matching suffix is used. If no mapping is found +## 'application/octet-stream' is used, and caching (etag/last-modified handling) +## is disabled to prevent clients from caching "unknown" mime types. +## +## Therefore the last mapping is: +## "" => "application/octet-stream" +## This matches all extensions and acts as default mime type, and enables +## caching for those. +mimetype.assign = ( + ".sarif.json" => "application/sarif+json", + ".sarif-external-properties.json" => "application/sarif-external-properties+json", + ".1905.1" => "application/vnd.ieee.1905", + ".tar.bz2" => "application/x-gtar-compressed", + ".tar.gz" => "application/x-gtar-compressed", + ".a2l" => "application/A2L", + ".aml" => "application/AML", + ".atf" => "application/ATF", + ".atfx" => "application/ATFX", + ".atxml" => "application/ATXML", + ".cdfx" => "application/CDFX+XML", + ".cea" => "application/CEA", + ".dcd" => "application/DCD", + ".dii" => "application/DII", + ".dit" => "application/DIT", + ".lxf" => "application/LXF", + ".mf4" => "application/MF4", + ".oda" => "application/ODA", + ".odx" => "application/ODX", + ".pdx" => "application/PDX", + ".ez" => "application/andrew-inset", + ".atom" => "application/atom+xml", + ".atomcat" => "application/atomcat+xml", + ".atomdeleted" => "application/atomdeleted+xml", + ".atomsvc" => "application/atomsvc+xml", + ".dwd" => "application/atsc-dwd+xml", + ".held" => "application/atsc-held+xml", + ".rsat" => "application/atsc-rsat+xml", + ".apxml" => "application/auth-policy+xml", + ".xdd" => "application/bacnet-xdd+zip", + ".xcs" => "application/calendar+xml", + ".cbor" => "application/cbor", + ".c3ex" => "application/cccex", + ".ccmp" => "application/ccmp+xml", + ".ccxml" => "application/ccxml+xml", + ".cdmia" => "application/cdmi-capability", + ".cdmic" => "application/cdmi-container", + ".cdmid" => "application/cdmi-domain", + ".cdmio" => "application/cdmi-object", + ".cdmiq" => "application/cdmi-queue", + ".cellml" => "application/cellml+xml", + ".cml" => "application/cellml+xml", + ".1clr" => "application/clr", + ".cmsc" => "application/cms", + ".cpl" => "application/cpl+xml", + ".csrattrs" => "application/csrattrs", + ".mpd" => "application/dash+xml", + ".mpdd" => "application/dashdelta", + ".davmount" => "application/davmount+xml", + ".dcm" => "application/dicom", + ".xmls" => "application/dskpp+xml", + ".dssc" => "application/dssc+der", + ".xdssc" => "application/dssc+xml", + ".dvc" => "application/dvcs", + ".es" => "application/ecmascript", + ".efi" => "application/efi", + ".emma" => "application/emma+xml", + ".emotionml" => "application/emotionml+xml", + ".epub" => "application/epub+zip", + ".exi" => "application/exi", + ".finf" => "application/fastinfoset", + ".fdt" => "application/fdt+xml", + ".pfr" => "application/font-tdpfr", + ".geojson" => "application/geo+json", + ".gpkg" => "application/geopackage+sqlite3", + ".glbin" => "application/gltf-buffer", + ".glbuf" => "application/gltf-buffer", + ".gml" => "application/gml+xml", + ".gz" => "application/gzip", + ".tgz" => "application/gzip", + ".stk" => "application/hyperstudio", + ".ink" => "application/inkml+xml", + ".inkml" => "application/inkml+xml", + ".ipfix" => "application/ipfix", + ".its" => "application/its+xml", + ".jrd" => "application/jrd+json", + ".json" => "application/json", + ".json-patch" => "application/json-patch+json", + ".jsonld" => "application/ld+json", + ".lgr" => "application/lgr+xml", + ".wlnk" => "application/link-format", + ".lostxml" => "application/lost+xml", + ".lostsyncxml" => "application/lostsync+xml", + ".lpf" => "application/lpf+zip", + ".hqx" => "application/mac-binhex40", + ".cpt" => "application/mac-compactpro", + ".mads" => "application/mads+xml", + ".mrc" => "application/marc", + ".mrcx" => "application/marcxml+xml", + ".ma" => "application/mathematica", + ".mb" => "application/mathematica", + ".nb" => "application/mathematica", + ".mml" => "application/mathml+xml", + ".mbox" => "application/mbox", + ".metalink" => "application/metalink+xml", + ".meta4" => "application/metalink4+xml", + ".mets" => "application/mets+xml", + ".h5" => "application/mipc", + ".maei" => "application/mmt-aei+xml", + ".musd" => "application/mmt-usd+xml", + ".mods" => "application/mods+xml", + ".m21" => "application/mp21", + ".mp21" => "application/mp21", + ".doc" => "application/msword", + ".mxf" => "application/mxf", + ".nq" => "application/n-quads", + ".nt" => "application/n-triples", + ".orq" => "application/ocsp-request", + ".ors" => "application/ocsp-response", + ".bin" => "application/octet-stream", + ".class" => "application/octet-stream", + ".dll" => "application/octet-stream", + ".exe" => "application/octet-stream", + ".img" => "application/octet-stream", + ".iso" => "application/octet-stream", + ".lha" => "application/octet-stream", + ".lzh" => "application/octet-stream", + ".so" => "application/octet-stream", + ".opf" => "application/oebps-package+xml", + ".ogx" => "application/ogg", + ".owx" => "application/owl+xml", + ".oxps" => "application/oxps", + ".relo" => "application/p2p-overlay+xml", + ".pdf" => "application/pdf", + ".pem" => "application/pem-certificate-chain", + ".pgp" => "application/pgp-encrypted", + ".sig" => "application/pgp-signature", + ".p10" => "application/pkcs10", + ".p12" => "application/pkcs12", + ".pfx" => "application/pkcs12", + ".p7c" => "application/pkcs7-mime", + ".p7m" => "application/pkcs7-mime", + ".p7s" => "application/pkcs7-signature", + ".p8" => "application/pkcs8", + ".p8e" => "application/pkcs8-encrypted", + ".cer" => "application/pkix-cert", + ".crl" => "application/pkix-crl", + ".pkipath" => "application/pkix-pkipath", + ".pki" => "application/pkixcmp", + ".pls" => "application/pls+xml", + ".ai" => "application/postscript", + ".eps" => "application/postscript", + ".ps" => "application/postscript", + ".provx" => "application/provenance+xml", + ".cw" => "application/prs.cww", + ".cww" => "application/prs.cww", + ".hpub" => "application/prs.hpub+zip", + ".rct" => "application/prs.nprend", + ".rnd" => "application/prs.nprend", + ".rdf-crypt" => "application/prs.rdf-xml-crypt", + ".xsf" => "application/prs.xsf+xml", + ".pskcxml" => "application/pskc+xml", + ".rdf" => "application/rdf+xml", + ".rif" => "application/reginfo+xml", + ".rnc" => "application/relax-ng-compact-syntax", + ".rl" => "application/resource-lists+xml", + ".rld" => "application/resource-lists-diff+xml", + ".rfcxml" => "application/rfc+xml", + ".rs" => "application/rls-services+xml", + ".rapd" => "application/route-apd+xml", + ".sls" => "application/route-s-tsid+xml", + ".rusd" => "application/route-usd+xml", + ".gbr" => "application/rpki-ghostbusters", + ".mft" => "application/rpki-manifest", + ".roa" => "application/rpki-roa", + ".rss" => "application/rss+xml", + ".rtf" => "application/rtf", + ".sarif" => "application/sarif+json", + ".sarif-external-properties" => "application/sarif-external-properties+json", + ".scim" => "application/scim+json", + ".scq" => "application/scvp-cv-request", + ".scs" => "application/scvp-cv-response", + ".spq" => "application/scvp-vp-request", + ".spp" => "application/scvp-vp-response", + ".sdp" => "application/sdp", + ".senmlc" => "application/senml+cbor", + ".senml" => "application/senml+json", + ".senmlx" => "application/senml+xml", + ".senml-etchc" => "application/senml-etch+cbor", + ".senml-etchj" => "application/senml-etch+json", + ".senmle" => "application/senml-exi", + ".sensmlc" => "application/sensml+cbor", + ".sensml" => "application/sensml+json", + ".sensmlx" => "application/sensml+xml", + ".sensmle" => "application/sensml-exi", + ".soc" => "application/sgml-open-catalog", + ".shf" => "application/shf+xml", + ".sieve" => "application/sieve", + ".siv" => "application/sieve", + ".cl" => "application/simple-filter+xml", + ".smi" => "application/smil+xml", + ".smil" => "application/smil+xml", + ".sml" => "application/smil+xml", + ".rq" => "application/sparql-query", + ".srx" => "application/sparql-results+xml", + ".sql" => "application/sql", + ".gram" => "application/srgs", + ".grxml" => "application/srgs+xml", + ".sru" => "application/sru+xml", + ".ssml" => "application/ssml+xml", + ".stix" => "application/stix+json", + ".swidtag" => "application/swid+xml", + ".tau" => "application/tamp-apex-update", + ".auc" => "application/tamp-apex-update-confirm", + ".tcu" => "application/tamp-community-update", + ".cuc" => "application/tamp-community-update-confirm", + ".ter" => "application/tamp-error", + ".tsa" => "application/tamp-sequence-adjust", + ".sac" => "application/tamp-sequence-adjust-confirm", + ".tur" => "application/tamp-update", + ".tuc" => "application/tamp-update-confirm", + ".jsontd" => "application/td+json", + ".odd" => "application/tei+xml", + ".tei" => "application/tei+xml", + ".teiCorpus" => "application/tei+xml", + ".tfi" => "application/thraud+xml", + ".tsq" => "application/timestamp-query", + ".tsr" => "application/timestamp-reply", + ".tsd" => "application/timestamped-data", + ".trig" => "application/trig", + ".ttml" => "application/ttml+xml", + ".gsheet" => "application/urc-grpsheet+xml", + ".rsheet" => "application/urc-ressheet+xml", + ".td" => "application/urc-targetdesc+xml", + ".uis" => "application/urc-uisocketdesc+xml", + ".vxml" => "application/voicexml+xml", + ".vcj" => "application/voucher-cms+json", + ".wasm" => "application/wasm", + ".wif" => "application/watcherinfo+xml", + ".wgt" => "application/widget", + ".wsdl" => "application/wsdl+xml", + ".wspolicy" => "application/wspolicy+xml", + ".xav" => "application/xcap-att+xml", + ".xca" => "application/xcap-caps+xml", + ".xdf" => "application/xcap-diff+xml", + ".xel" => "application/xcap-el+xml", + ".xer" => "application/xcap-error+xml", + ".xns" => "application/xcap-ns+xml", + ".xht" => "application/xhtml+xml", + ".xhtm" => "application/xhtml+xml", + ".xhtml" => "application/xhtml+xml", + ".xlf" => "application/xliff+xml", + ".dtd" => "application/xml-dtd", + ".xop" => "application/xop+xml", + ".xsl" => "application/xslt+xml", + ".xslt" => "application/xslt+xml", + ".mxml" => "application/xv+xml", + ".xhvml" => "application/xv+xml", + ".xvm" => "application/xv+xml", + ".xvml" => "application/xv+xml", + ".yang" => "application/yang", + ".yin" => "application/yin+xml", + ".zip" => "application/zip", + ".zst" => "application/zstd", + ".1km" => "application/vnd.1000minds.decision-model+xml", + ".pwn" => "application/vnd.3M.Post-it-Notes", + ".plb" => "application/vnd.3gpp.pic-bw-large", + ".psb" => "application/vnd.3gpp.pic-bw-small", + ".pvb" => "application/vnd.3gpp.pic-bw-var", + ".sms" => "application/vnd.3gpp2.sms", + ".tcap" => "application/vnd.3gpp2.tcap", + ".imgcal" => "application/vnd.3lightssoftware.imagescal", + ".gph" => "application/vnd.FloGraphIt", + ".zmm" => "application/vnd.HandHeld-Entertainment+xml", + ".kne" => "application/vnd.Kinar", + ".knp" => "application/vnd.Kinar", + ".sdf" => "application/vnd.Kinar", + ".mwf" => "application/vnd.MFER", + ".daf" => "application/vnd.Mobius.DAF", + ".dis" => "application/vnd.Mobius.DIS", + ".mbk" => "application/vnd.Mobius.MBK", + ".mqy" => "application/vnd.Mobius.MQY", + ".msl" => "application/vnd.Mobius.MSL", + ".plc" => "application/vnd.Mobius.PLC", + ".txf" => "application/vnd.Mobius.TXF", + ".qwd" => "application/vnd.Quark.QuarkXPress", + ".qwt" => "application/vnd.Quark.QuarkXPress", + ".qxb" => "application/vnd.Quark.QuarkXPress", + ".qxd" => "application/vnd.Quark.QuarkXPress", + ".qxl" => "application/vnd.Quark.QuarkXPress", + ".qxt" => "application/vnd.Quark.QuarkXPress", + ".twd" => "application/vnd.SimTech-MindMapper", + ".twds" => "application/vnd.SimTech-MindMapper", + ".aso" => "application/vnd.accpac.simply.aso", + ".imp" => "application/vnd.accpac.simply.imp", + ".acu" => "application/vnd.acucobol", + ".acutc" => "application/vnd.acucorp", + ".atc" => "application/vnd.acucorp", + ".swf" => "application/vnd.adobe.flash.movie", + ".fcdt" => "application/vnd.adobe.formscentral.fcdt", + ".fxp" => "application/vnd.adobe.fxp", + ".fxpl" => "application/vnd.adobe.fxp", + ".xdp" => "application/vnd.adobe.xdp+xml", + ".xfdf" => "application/vnd.adobe.xfdf", + ".afp" => "application/vnd.afpc.modca", + ".list3820" => "application/vnd.afpc.modca", + ".listafp" => "application/vnd.afpc.modca", + ".pseg3820" => "application/vnd.afpc.modca", + ".ovl" => "application/vnd.afpc.modca-overlay", + ".psg" => "application/vnd.afpc.modca-pagesegment", + ".ahead" => "application/vnd.ahead.space", + ".azf" => "application/vnd.airzip.filesecure.azf", + ".azs" => "application/vnd.airzip.filesecure.azs", + ".azw3" => "application/vnd.amazon.mobi8-ebook", + ".acc" => "application/vnd.americandynamics.acc", + ".ami" => "application/vnd.amiga.ami", + ".ota" => "application/vnd.android.ota", + ".apk" => "application/vnd.android.package-archive", + ".apkg" => "application/vnd.anki", + ".cii" => "application/vnd.anser-web-certificate-issue-initiation", + ".fti" => "application/vnd.anser-web-funds-transfer-initiation", + ".dist" => "application/vnd.apple.installer+xml", + ".distz" => "application/vnd.apple.installer+xml", + ".mpkg" => "application/vnd.apple.installer+xml", + ".pkg" => "application/vnd.apple.installer+xml", + ".keynote" => "application/vnd.apple.keynote", + ".m3u8" => "application/vnd.apple.mpegurl", + ".numbers" => "application/vnd.apple.numbers", + ".pages" => "application/vnd.apple.pages", + ".swi" => "application/vnd.aristanetworks.swi", + ".artisan" => "application/vnd.artisan+json", + ".iota" => "application/vnd.astraea-software.iota", + ".aep" => "application/vnd.audiograph", + ".package" => "application/vnd.autopackage", + ".bmml" => "application/vnd.balsamiq.bmml+xml", + ".bmpr" => "application/vnd.balsamiq.bmpr", + ".ac2" => "application/vnd.banana-accounting", + ".mpm" => "application/vnd.blueice.multipass", + ".ep" => "application/vnd.bluetooth.ep.oob", + ".le" => "application/vnd.bluetooth.le.oob", + ".bmi" => "application/vnd.bmi", + ".rep" => "application/vnd.businessobjects", + ".tlclient" => "application/vnd.cendio.thinlinc.clientconf", + ".cdxml" => "application/vnd.chemdraw+xml", + ".pgn" => "application/vnd.chess-pgn", + ".mmd" => "application/vnd.chipnuts.karaoke-mmd", + ".cdy" => "application/vnd.cinderella", + ".csl" => "application/vnd.citationstyles.style+xml", + ".cla" => "application/vnd.claymore", + ".rp9" => "application/vnd.cloanto.rp9", + ".c4d" => "application/vnd.clonk.c4group", + ".c4f" => "application/vnd.clonk.c4group", + ".c4g" => "application/vnd.clonk.c4group", + ".c4p" => "application/vnd.clonk.c4group", + ".c4u" => "application/vnd.clonk.c4group", + ".c11amc" => "application/vnd.cluetrust.cartomobile-config", + ".c11amz" => "application/vnd.cluetrust.cartomobile-config-pkg", + ".coffee" => "application/vnd.coffeescript", + ".xodt" => "application/vnd.collabio.xodocuments.document", + ".xott" => "application/vnd.collabio.xodocuments.document-template", + ".xodp" => "application/vnd.collabio.xodocuments.presentation", + ".xotp" => "application/vnd.collabio.xodocuments.presentation-template", + ".xods" => "application/vnd.collabio.xodocuments.spreadsheet", + ".xots" => "application/vnd.collabio.xodocuments.spreadsheet-template", + ".cbz" => "application/vnd.comicbook+zip", + ".cbr" => "application/vnd.comicbook-rar", + ".ic0" => "application/vnd.commerce-battelle", + ".ic1" => "application/vnd.commerce-battelle", + ".ic2" => "application/vnd.commerce-battelle", + ".ic3" => "application/vnd.commerce-battelle", + ".ic4" => "application/vnd.commerce-battelle", + ".ic5" => "application/vnd.commerce-battelle", + ".ic6" => "application/vnd.commerce-battelle", + ".ic7" => "application/vnd.commerce-battelle", + ".ic8" => "application/vnd.commerce-battelle", + ".ica" => "application/vnd.commerce-battelle", + ".icd" => "application/vnd.commerce-battelle", + ".icf" => "application/vnd.commerce-battelle", + ".csp" => "application/vnd.commonspace", + ".cst" => "application/vnd.commonspace", + ".cdbcmsg" => "application/vnd.contact.cmsg", + ".ign" => "application/vnd.coreos.ignition+json", + ".ignition" => "application/vnd.coreos.ignition+json", + ".cmc" => "application/vnd.cosmocaller", + ".clkx" => "application/vnd.crick.clicker", + ".clkk" => "application/vnd.crick.clicker.keyboard", + ".clkp" => "application/vnd.crick.clicker.palette", + ".clkt" => "application/vnd.crick.clicker.template", + ".clkw" => "application/vnd.crick.clicker.wordbank", + ".wbs" => "application/vnd.criticaltools.wbs+xml", + ".ssvc" => "application/vnd.crypto-shade-file", + ".c9r" => "application/vnd.cryptomator.encrypted", + ".c9s" => "application/vnd.cryptomator.encrypted", + ".cryptomator" => "application/vnd.cryptomator.vault", + ".pml" => "application/vnd.ctc-posml", + ".ppd" => "application/vnd.cups-ppd", + ".curl" => "application/vnd.curl", + ".dart" => "application/vnd.dart", + ".rdz" => "application/vnd.data-vision.rdz", + ".dbf" => "application/vnd.dbf", + ".deb" => "application/vnd.debian.binary-package", + ".udeb" => "application/vnd.debian.binary-package", + ".uvd" => "application/vnd.dece.data", + ".uvf" => "application/vnd.dece.data", + ".uvvd" => "application/vnd.dece.data", + ".uvvf" => "application/vnd.dece.data", + ".uvt" => "application/vnd.dece.ttml+xml", + ".uvvt" => "application/vnd.dece.ttml+xml", + ".uvvx" => "application/vnd.dece.unspecified", + ".uvx" => "application/vnd.dece.unspecified", + ".uvvz" => "application/vnd.dece.zip", + ".uvz" => "application/vnd.dece.zip", + ".dsm" => "application/vnd.desmume.movie", + ".dna" => "application/vnd.dna", + ".docjson" => "application/vnd.document+json", + ".scld" => "application/vnd.doremir.scorecloud-binary-document", + ".dpg" => "application/vnd.dpgraph", + ".dpgraph" => "application/vnd.dpgraph", + ".mwc" => "application/vnd.dpgraph", + ".dfac" => "application/vnd.dreamfactory", + ".fla" => "application/vnd.dtg.local.flash", + ".ait" => "application/vnd.dvb.ait", + ".svc" => "application/vnd.dvb.service", + ".geo" => "application/vnd.dynageo", + ".dzr" => "application/vnd.dzr", + ".mag" => "application/vnd.ecowin.chart", + ".nml" => "application/vnd.enliven", + ".esf" => "application/vnd.epson.esf", + ".msf" => "application/vnd.epson.msf", + ".qam" => "application/vnd.epson.quickanime", + ".slt" => "application/vnd.epson.salt", + ".ssf" => "application/vnd.epson.ssf", + ".qca" => "application/vnd.ericsson.quickcall", + ".qcall" => "application/vnd.ericsson.quickcall", + ".espass" => "application/vnd.espass-espass+zip", + ".es3" => "application/vnd.eszigno3+xml", + ".et3" => "application/vnd.eszigno3+xml", + ".asice" => "application/vnd.etsi.asic-e+zip", + ".sce" => "application/vnd.etsi.asic-e+zip", + ".asics" => "application/vnd.etsi.asic-s+zip", + ".tst" => "application/vnd.etsi.timestamp-token", + ".ecigprofile" => "application/vnd.evolv.ecig.profile", + ".ecig" => "application/vnd.evolv.ecig.settings", + ".ecigtheme" => "application/vnd.evolv.ecig.theme", + ".mpw" => "application/vnd.exstream-empower+zip", + ".pub" => "application/vnd.exstream-package", + ".ez2" => "application/vnd.ezpix-album", + ".ez3" => "application/vnd.ezpix-package", + ".dim" => "application/vnd.fastcopy-disk-image", + ".fdf" => "application/vnd.fdf", + ".msd" => "application/vnd.fdsn.mseed", + ".mseed" => "application/vnd.fdsn.mseed", + ".dataless" => "application/vnd.fdsn.seed", + ".seed" => "application/vnd.fdsn.seed", + ".flb" => "application/vnd.ficlab.flb+zip", + ".zfc" => "application/vnd.filmit.zfc", + ".ftc" => "application/vnd.fluxtime.clip", + ".sfd" => "application/vnd.font-fontforge-sfd", + ".fm" => "application/vnd.framemaker", + ".fnc" => "application/vnd.frogans.fnc", + ".ltf" => "application/vnd.frogans.ltf", + ".fsc" => "application/vnd.fsc.weblaunch", + ".oas" => "application/vnd.fujitsu.oasys", + ".oa2" => "application/vnd.fujitsu.oasys2", + ".oa3" => "application/vnd.fujitsu.oasys3", + ".fg5" => "application/vnd.fujitsu.oasysgp", + ".bh2" => "application/vnd.fujitsu.oasysprs", + ".ddd" => "application/vnd.fujixerox.ddd", + ".xdw" => "application/vnd.fujixerox.docuworks", + ".xbd" => "application/vnd.fujixerox.docuworks.binder", + ".xct" => "application/vnd.fujixerox.docuworks.container", + ".fzs" => "application/vnd.fuzzysheet", + ".txd" => "application/vnd.genomatix.tuxedo", + ".ggb" => "application/vnd.geogebra.file", + ".ggs" => "application/vnd.geogebra.slides", + ".ggt" => "application/vnd.geogebra.tool", + ".gex" => "application/vnd.geometry-explorer", + ".gre" => "application/vnd.geometry-explorer", + ".gxt" => "application/vnd.geonext", + ".g2w" => "application/vnd.geoplan", + ".g3w" => "application/vnd.geospace", + ".gmx" => "application/vnd.gmx", + ".kml" => "application/vnd.google-earth.kml+xml", + ".kmz" => "application/vnd.google-earth.kmz", + ".gqf" => "application/vnd.grafeq", + ".gqs" => "application/vnd.grafeq", + ".gac" => "application/vnd.groove-account", + ".ghf" => "application/vnd.groove-help", + ".gim" => "application/vnd.groove-identity-message", + ".grv" => "application/vnd.groove-injector", + ".gtm" => "application/vnd.groove-tool-message", + ".tpl" => "application/vnd.groove-tool-template", + ".vcg" => "application/vnd.groove-vcard", + ".hal" => "application/vnd.hal+xml", + ".bpd" => "application/vnd.hbci", + ".hbc" => "application/vnd.hbci", + ".hbci" => "application/vnd.hbci", + ".kom" => "application/vnd.hbci", + ".pkd" => "application/vnd.hbci", + ".upa" => "application/vnd.hbci", + ".hdt" => "application/vnd.hdt", + ".les" => "application/vnd.hhe.lesson-player", + ".hpgl" => "application/vnd.hp-HPGL", + ".pcl" => "application/vnd.hp-PCL", + ".hpi" => "application/vnd.hp-hpid", + ".hpid" => "application/vnd.hp-hpid", + ".hps" => "application/vnd.hp-hps", + ".jlt" => "application/vnd.hp-jlyt", + ".sfd-hdstx" => "application/vnd.hydrostatix.sof-data", + ".x3d" => "application/vnd.hzn-3d-crossword", + ".mpy" => "application/vnd.ibm.MiniPay", + ".emm" => "application/vnd.ibm.electronic-media", + ".irm" => "application/vnd.ibm.rights-management", + ".sc" => "application/vnd.ibm.secure-container", + ".icc" => "application/vnd.iccprofile", + ".icm" => "application/vnd.iccprofile", + ".igl" => "application/vnd.igloader", + ".imf" => "application/vnd.imagemeter.folder+zip", + ".imi" => "application/vnd.imagemeter.image+zip", + ".ivp" => "application/vnd.immervision-ivp", + ".ivu" => "application/vnd.immervision-ivu", + ".imscc" => "application/vnd.ims.imsccv1p1", + ".igm" => "application/vnd.insors.igm", + ".xpw" => "application/vnd.intercon.formnet", + ".xpx" => "application/vnd.intercon.formnet", + ".i2g" => "application/vnd.intergeo", + ".qbo" => "application/vnd.intu.qbo", + ".qfx" => "application/vnd.intu.qfx", + ".rcprofile" => "application/vnd.ipunplugged.rcprofile", + ".irp" => "application/vnd.irepository.package+xml", + ".xpr" => "application/vnd.is-xpr", + ".fcs" => "application/vnd.isac.fcs", + ".jam" => "application/vnd.jam", + ".rms" => "application/vnd.jcp.javame.midlet-rms", + ".jisp" => "application/vnd.jisp", + ".joda" => "application/vnd.joost.joda-archive", + ".ktr" => "application/vnd.kahootz", + ".ktz" => "application/vnd.kahootz", + ".karbon" => "application/vnd.kde.karbon", + ".chrt" => "application/vnd.kde.kchart", + ".kfo" => "application/vnd.kde.kformula", + ".flw" => "application/vnd.kde.kivio", + ".kon" => "application/vnd.kde.kontour", + ".kpr" => "application/vnd.kde.kpresenter", + ".kpt" => "application/vnd.kde.kpresenter", + ".ksp" => "application/vnd.kde.kspread", + ".kwd" => "application/vnd.kde.kword", + ".kwt" => "application/vnd.kde.kword", + ".htke" => "application/vnd.kenameaapp", + ".kia" => "application/vnd.kidspiration", + ".skd" => "application/vnd.koan", + ".skm" => "application/vnd.koan", + ".skp" => "application/vnd.koan", + ".skt" => "application/vnd.koan", + ".sse" => "application/vnd.kodak-descriptor", + ".las" => "application/vnd.las", + ".lasjson" => "application/vnd.las.las+json", + ".lasxml" => "application/vnd.las.las+xml", + ".lbd" => "application/vnd.llamagraphics.life-balance.desktop", + ".lbe" => "application/vnd.llamagraphics.life-balance.exchange+xml", + ".lca" => "application/vnd.logipipe.circuit+zip", + ".lcs" => "application/vnd.logipipe.circuit+zip", + ".loom" => "application/vnd.loom", + ".123" => "application/vnd.lotus-1-2-3", + ".wk1" => "application/vnd.lotus-1-2-3", + ".wk3" => "application/vnd.lotus-1-2-3", + ".wk4" => "application/vnd.lotus-1-2-3", + ".apr" => "application/vnd.lotus-approach", + ".vew" => "application/vnd.lotus-approach", + ".pre" => "application/vnd.lotus-freelance", + ".prz" => "application/vnd.lotus-freelance", + ".ndl" => "application/vnd.lotus-notes", + ".ns2" => "application/vnd.lotus-notes", + ".ns3" => "application/vnd.lotus-notes", + ".ns4" => "application/vnd.lotus-notes", + ".nsf" => "application/vnd.lotus-notes", + ".nsg" => "application/vnd.lotus-notes", + ".nsh" => "application/vnd.lotus-notes", + ".ntf" => "application/vnd.lotus-notes", + ".or2" => "application/vnd.lotus-organizer", + ".or3" => "application/vnd.lotus-organizer", + ".org" => "application/vnd.lotus-organizer", + ".scm" => "application/vnd.lotus-screencam", + ".lwp" => "application/vnd.lotus-wordpro", + ".sam" => "application/vnd.lotus-wordpro", + ".portpkg" => "application/vnd.macports.portpkg", + ".mvt" => "application/vnd.mapbox-vector-tile", + ".mdc" => "application/vnd.marlin.drm.mdcf", + ".mmdb" => "application/vnd.maxmind.maxmind-db", + ".mcd" => "application/vnd.mcd", + ".mc1" => "application/vnd.medcalcdata", + ".cdkey" => "application/vnd.mediastation.cdkey", + ".mfm" => "application/vnd.mfmp", + ".flo" => "application/vnd.micrografx.flo", + ".igx" => "application/vnd.micrografx.igx", + ".mif" => "application/vnd.mif", + ".mpn" => "application/vnd.mophun.application", + ".mpc" => "application/vnd.mophun.certificate", + ".xul" => "application/vnd.mozilla.xul+xml", + ".3mf" => "application/vnd.ms-3mfdocument", + ".cil" => "application/vnd.ms-artgalry", + ".asf" => "application/vnd.ms-asf", + ".cab" => "application/vnd.ms-cab-compressed", + ".xla" => "application/vnd.ms-excel", + ".xlc" => "application/vnd.ms-excel", + ".xlm" => "application/vnd.ms-excel", + ".xls" => "application/vnd.ms-excel", + ".xlt" => "application/vnd.ms-excel", + ".xlw" => "application/vnd.ms-excel", + ".xlam" => "application/vnd.ms-excel.addin.macroEnabled.12", + ".xlsb" => "application/vnd.ms-excel.sheet.binary.macroEnabled.12", + ".xlsm" => "application/vnd.ms-excel.sheet.macroEnabled.12", + ".xltm" => "application/vnd.ms-excel.template.macroEnabled.12", + ".eot" => "application/vnd.ms-fontobject", + ".chm" => "application/vnd.ms-htmlhelp", + ".ims" => "application/vnd.ms-ims", + ".lrm" => "application/vnd.ms-lrm", + ".thmx" => "application/vnd.ms-officetheme", + ".pot" => "application/vnd.ms-powerpoint", + ".pps" => "application/vnd.ms-powerpoint", + ".ppt" => "application/vnd.ms-powerpoint", + ".ppam" => "application/vnd.ms-powerpoint.addin.macroEnabled.12", + ".pptm" => "application/vnd.ms-powerpoint.presentation.macroEnabled.12", + ".sldm" => "application/vnd.ms-powerpoint.slide.macroEnabled.12", + ".ppsm" => "application/vnd.ms-powerpoint.slideshow.macroEnabled.12", + ".potm" => "application/vnd.ms-powerpoint.template.macroEnabled.12", + ".mpp" => "application/vnd.ms-project", + ".mpt" => "application/vnd.ms-project", + ".tnef" => "application/vnd.ms-tnef", + ".tnf" => "application/vnd.ms-tnef", + ".docm" => "application/vnd.ms-word.document.macroEnabled.12", + ".dotm" => "application/vnd.ms-word.template.macroEnabled.12", + ".wcm" => "application/vnd.ms-works", + ".wdb" => "application/vnd.ms-works", + ".wks" => "application/vnd.ms-works", + ".wps" => "application/vnd.ms-works", + ".wpl" => "application/vnd.ms-wpl", + ".xps" => "application/vnd.ms-xpsdocument", + ".msa" => "application/vnd.msa-disk-image", + ".mseq" => "application/vnd.mseq", + ".crtr" => "application/vnd.multiad.creator", + ".cif" => "application/vnd.multiad.creator.cif", + ".mus" => "application/vnd.musician", + ".msty" => "application/vnd.muvee.style", + ".taglet" => "application/vnd.mynfc", + ".line" => "application/vnd.nebumind.line", + ".nebul" => "application/vnd.nebumind.line", + ".bkm" => "application/vnd.nervana", + ".entity" => "application/vnd.nervana", + ".kcm" => "application/vnd.nervana", + ".request" => "application/vnd.nervana", + ".nlu" => "application/vnd.neurolanguage.nlu", + ".nimn" => "application/vnd.nimn", + ".nds" => "application/vnd.nintendo.nitro.rom", + ".sfc" => "application/vnd.nintendo.snes.rom", + ".smc" => "application/vnd.nintendo.snes.rom", + ".nitf" => "application/vnd.nitf", + ".nnd" => "application/vnd.noblenet-directory", + ".nns" => "application/vnd.noblenet-sealer", + ".nnw" => "application/vnd.noblenet-web", + ".ac" => "application/vnd.nokia.n-gage.ac+xml", + ".ngdat" => "application/vnd.nokia.n-gage.data", + ".n-gage" => "application/vnd.nokia.n-gage.symbian.install", + ".rpst" => "application/vnd.nokia.radio-preset", + ".rpss" => "application/vnd.nokia.radio-presets", + ".edm" => "application/vnd.novadigm.EDM", + ".edx" => "application/vnd.novadigm.EDX", + ".ext" => "application/vnd.novadigm.EXT", + ".odc" => "application/vnd.oasis.opendocument.chart", + ".otc" => "application/vnd.oasis.opendocument.chart-template", + ".odb" => "application/vnd.oasis.opendocument.database", + ".odf" => "application/vnd.oasis.opendocument.formula", + ".odg" => "application/vnd.oasis.opendocument.graphics", + ".otg" => "application/vnd.oasis.opendocument.graphics-template", + ".odi" => "application/vnd.oasis.opendocument.image", + ".oti" => "application/vnd.oasis.opendocument.image-template", + ".odp" => "application/vnd.oasis.opendocument.presentation", + ".otp" => "application/vnd.oasis.opendocument.presentation-template", + ".ods" => "application/vnd.oasis.opendocument.spreadsheet", + ".ots" => "application/vnd.oasis.opendocument.spreadsheet-template", + ".odt" => "application/vnd.oasis.opendocument.text", + ".odm" => "application/vnd.oasis.opendocument.text-master", + ".ott" => "application/vnd.oasis.opendocument.text-template", + ".oth" => "application/vnd.oasis.opendocument.text-web", + ".xo" => "application/vnd.olpc-sugar", + ".dd" => "application/vnd.oma.dd+xml", + ".dd2" => "application/vnd.oma.dd2+xml", + ".dcf" => "application/vnd.oma.drm.content", + ".o4a" => "application/vnd.oma.drm.dcf", + ".o4v" => "application/vnd.oma.drm.dcf", + ".dm" => "application/vnd.oma.drm.message", + ".drc" => "application/vnd.oma.drm.rights+wbxml", + ".dr" => "application/vnd.oma.drm.rights+xml", + ".tam" => "application/vnd.onepager", + ".tamp" => "application/vnd.onepagertamp", + ".tamx" => "application/vnd.onepagertamx", + ".tat" => "application/vnd.onepagertat", + ".tatp" => "application/vnd.onepagertatp", + ".tatx" => "application/vnd.onepagertatx", + ".obgx" => "application/vnd.openblox.game+xml", + ".obg" => "application/vnd.openblox.game-binary", + ".oeb" => "application/vnd.openeye.oeb", + ".oxt" => "application/vnd.openofficeorg.extension", + ".osm" => "application/vnd.openstreetmap.data+xml", + ".pptx" => "application/vnd.openxmlformats-officedocument.presentationml.presentation", + ".sldx" => "application/vnd.openxmlformats-officedocument.presentationml.slide", + ".ppsx" => "application/vnd.openxmlformats-officedocument.presentationml.slideshow", + ".potx" => "application/vnd.openxmlformats-officedocument.presentationml.template", + ".xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + ".xltx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.template", + ".docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + ".dotx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.template", + ".ndc" => "application/vnd.osa.netdeploy", + ".mgp" => "application/vnd.osgeo.mapguide.package", + ".dp" => "application/vnd.osgi.dp", + ".esa" => "application/vnd.osgi.subsystem", + ".oxlicg" => "application/vnd.oxli.countgraph", + ".oprc" => "application/vnd.palm", + ".pdb" => "application/vnd.palm", + ".pqa" => "application/vnd.palm", + ".prc" => "application/vnd.palm", + ".plp" => "application/vnd.panoply", + ".dive" => "application/vnd.patentdive", + ".paw" => "application/vnd.pawaafile", + ".str" => "application/vnd.pg.format", + ".ei6" => "application/vnd.pg.osasli", + ".pil" => "application/vnd.piaccess.application-licence", + ".efif" => "application/vnd.picsel", + ".wg" => "application/vnd.pmi.widget", + ".plf" => "application/vnd.pocketlearn", + ".pbd" => "application/vnd.powerbuilder6", + ".preminet" => "application/vnd.preminet", + ".box" => "application/vnd.previewsystems.box", + ".vbox" => "application/vnd.previewsystems.box", + ".mgz" => "application/vnd.proteus.magazine", + ".psfs" => "application/vnd.psfs", + ".qps" => "application/vnd.publishare-delta-tree", + ".ptid" => "application/vnd.pvi.ptid1", + ".bar" => "application/vnd.qualcomm.brew-app-res", + ".quiz" => "application/vnd.quobject-quoxdocument", + ".quox" => "application/vnd.quobject-quoxdocument", + ".tree" => "application/vnd.rainstor.data", + ".rar" => "application/vnd.rar", + ".bed" => "application/vnd.realvnc.bed", + ".mxl" => "application/vnd.recordare.musicxml", + ".cryptonote" => "application/vnd.rig.cryptonote", + ".link66" => "application/vnd.route66.link66+xml", + ".st" => "application/vnd.sailingtracker.track", + ".SAR" => "application/vnd.sar", + ".scd" => "application/vnd.scribus", + ".sla" => "application/vnd.scribus", + ".slaz" => "application/vnd.scribus", + ".s3df" => "application/vnd.sealed.3df", + ".scsf" => "application/vnd.sealed.csf", + ".s1w" => "application/vnd.sealed.doc", + ".sdo" => "application/vnd.sealed.doc", + ".sdoc" => "application/vnd.sealed.doc", + ".sem" => "application/vnd.sealed.eml", + ".seml" => "application/vnd.sealed.eml", + ".smh" => "application/vnd.sealed.mht", + ".smht" => "application/vnd.sealed.mht", + ".s1p" => "application/vnd.sealed.ppt", + ".sppt" => "application/vnd.sealed.ppt", + ".stif" => "application/vnd.sealed.tiff", + ".s1e" => "application/vnd.sealed.xls", + ".sxl" => "application/vnd.sealed.xls", + ".sxls" => "application/vnd.sealed.xls", + ".s1h" => "application/vnd.sealedmedia.softseal.html", + ".stml" => "application/vnd.sealedmedia.softseal.html", + ".s1a" => "application/vnd.sealedmedia.softseal.pdf", + ".spd" => "application/vnd.sealedmedia.softseal.pdf", + ".spdf" => "application/vnd.sealedmedia.softseal.pdf", + ".see" => "application/vnd.seemail", + ".sema" => "application/vnd.sema", + ".semd" => "application/vnd.semd", + ".semf" => "application/vnd.semf", + ".ssv" => "application/vnd.shade-save-file", + ".ifm" => "application/vnd.shana.informed.formdata", + ".itp" => "application/vnd.shana.informed.formtemplate", + ".iif" => "application/vnd.shana.informed.interchange", + ".ipk" => "application/vnd.shana.informed.package", + ".shp" => "application/vnd.shp", + ".shx" => "application/vnd.shx", + ".sr" => "application/vnd.sigrok.session", + ".mmf" => "application/vnd.smaf", + ".notebook" => "application/vnd.smart.notebook", + ".teacher" => "application/vnd.smart.teacher", + ".pt" => "application/vnd.snesdev-page-table", + ".ptrom" => "application/vnd.snesdev-page-table", + ".fo" => "application/vnd.software602.filler.form+xml", + ".zfo" => "application/vnd.software602.filler.form-xml-zip", + ".sdkd" => "application/vnd.solent.sdkm+xml", + ".sdkm" => "application/vnd.solent.sdkm+xml", + ".dxp" => "application/vnd.spotfire.dxp", + ".sfs" => "application/vnd.spotfire.sfs", + ".sqlite" => "application/vnd.sqlite3", + ".sqlite3" => "application/vnd.sqlite3", + ".smzip" => "application/vnd.stepmania.package", + ".sm" => "application/vnd.stepmania.stepchart", + ".wadl" => "application/vnd.sun.wadl+xml", + ".sxc" => "application/vnd.sun.xml.calc", + ".stc" => "application/vnd.sun.xml.calc.template", + ".sxd" => "application/vnd.sun.xml.draw", + ".std" => "application/vnd.sun.xml.draw.template", + ".sxi" => "application/vnd.sun.xml.impress", + ".sti" => "application/vnd.sun.xml.impress.template", + ".sxm" => "application/vnd.sun.xml.math", + ".sxw" => "application/vnd.sun.xml.writer", + ".sxg" => "application/vnd.sun.xml.writer.global", + ".stw" => "application/vnd.sun.xml.writer.template", + ".sus" => "application/vnd.sus-calendar", + ".susp" => "application/vnd.sus-calendar", + ".scl" => "application/vnd.sycle+xml", + ".sis" => "application/vnd.symbian.install", + ".xsm" => "application/vnd.syncml+xml", + ".bdm" => "application/vnd.syncml.dm+wbxml", + ".xdm" => "application/vnd.syncml.dm+xml", + ".ddf" => "application/vnd.syncml.dmddf+xml", + ".tao" => "application/vnd.tao.intent-module-archive", + ".cap" => "application/vnd.tcpdump.pcap", + ".dmp" => "application/vnd.tcpdump.pcap", + ".pcap" => "application/vnd.tcpdump.pcap", + ".qvd" => "application/vnd.theqvd", + ".ppttc" => "application/vnd.think-cell.ppttc+json", + ".vfr" => "application/vnd.tml", + ".viaframe" => "application/vnd.tml", + ".tmo" => "application/vnd.tmobile-livetv", + ".tpt" => "application/vnd.trid.tpt", + ".mxs" => "application/vnd.triscape.mxs", + ".tra" => "application/vnd.trueapp", + ".frm" => "application/vnd.ufdl", + ".ufd" => "application/vnd.ufdl", + ".ufdl" => "application/vnd.ufdl", + ".utz" => "application/vnd.uiq.theme", + ".umj" => "application/vnd.umajin", + ".unityweb" => "application/vnd.unity", + ".uo" => "application/vnd.uoml+xml", + ".uoml" => "application/vnd.uoml+xml", + ".urim" => "application/vnd.uri-map", + ".urimap" => "application/vnd.uri-map", + ".vmt" => "application/vnd.valve.source.material", + ".vcx" => "application/vnd.vcx", + ".model-inter" => "application/vnd.vd-study", + ".mxi" => "application/vnd.vd-study", + ".study-inter" => "application/vnd.vd-study", + ".vwx" => "application/vnd.vectorworks", + ".istc" => "application/vnd.veryant.thin", + ".isws" => "application/vnd.veryant.thin", + ".VES" => "application/vnd.ves.encrypted", + ".vsc" => "application/vnd.vidsoft.vidconference", + ".vsd" => "application/vnd.visio", + ".vss" => "application/vnd.visio", + ".vst" => "application/vnd.visio", + ".vsw" => "application/vnd.visio", + ".vis" => "application/vnd.visionary", + ".vsf" => "application/vnd.vsf", + ".mms" => "application/vnd.wap.mms-message", + ".sic" => "application/vnd.wap.sic", + ".slc" => "application/vnd.wap.slc", + ".wbxml" => "application/vnd.wap.wbxml", + ".wmlc" => "application/vnd.wap.wmlc", + ".wmlsc" => "application/vnd.wap.wmlscriptc", + ".wtb" => "application/vnd.webturbo", + ".p2p" => "application/vnd.wfa.p2p", + ".wsc" => "application/vnd.wfa.wsc", + ".wmc" => "application/vnd.wmc", + ".m" => "application/vnd.wolfram.mathematica.package", + ".nbp" => "application/vnd.wolfram.player", + ".wpd" => "application/vnd.wordperfect", + ".wqd" => "application/vnd.wqd", + ".stf" => "application/vnd.wt.stf", + ".wv" => "application/vnd.wv.csp+wbxml", + ".xar" => "application/vnd.xara", + ".xfd" => "application/vnd.xfdl", + ".xfdl" => "application/vnd.xfdl", + ".cpkg" => "application/vnd.xmpie.cpkg", + ".dpkg" => "application/vnd.xmpie.dpkg", + ".ppkg" => "application/vnd.xmpie.ppkg", + ".xlim" => "application/vnd.xmpie.xlim", + ".hvd" => "application/vnd.yamaha.hv-dic", + ".hvs" => "application/vnd.yamaha.hv-script", + ".hvp" => "application/vnd.yamaha.hv-voice", + ".osf" => "application/vnd.yamaha.openscoreformat", + ".saf" => "application/vnd.yamaha.smaf-audio", + ".spf" => "application/vnd.yamaha.smaf-phrase", + ".yme" => "application/vnd.yaoweme", + ".cmp" => "application/vnd.yellowriver-custom-menu", + ".zir" => "application/vnd.zul", + ".zirz" => "application/vnd.zul", + ".zaz" => "application/vnd.zzazz.deck+xml", + ".anx" => "application/x-annodex", + ".bcpio" => "application/x-bcpio", + ".torrent" => "application/x-bittorrent", + ".bz2" => "application/x-bzip2", + ".vcd" => "application/x-cdlink", + ".crx" => "application/x-chrome-extension", + ".cpio" => "application/x-cpio", + ".csh" => "application/x-csh", + ".dcr" => "application/x-director", + ".dir" => "application/x-director", + ".dxr" => "application/x-director", + ".dvi" => "application/x-dvi", + ".spl" => "application/x-futuresplash", + ".gtar" => "application/x-gtar", + ".tbz" => "application/x-gtar-compressed", + ".hdf" => "application/x-hdf", + ".jar" => "application/x-java-archive", + ".jnlp" => "application/x-java-jnlp-file", + ".pack" => "application/x-java-pack200", + ".kil" => "application/x-killustrator", + ".latex" => "application/x-latex", + ".cdf" => "application/x-netcdf", + ".nc" => "application/x-netcdf", + ".pl" => "application/x-perl", + ".rpm" => "application/x-rpm", + ".sh" => "application/x-sh", + ".shar" => "application/x-shar", + ".sit" => "application/x-stuffit", + ".sv4cpio" => "application/x-sv4cpio", + ".sv4crc" => "application/x-sv4crc", + ".tar" => "application/x-tar", + ".tcl" => "application/x-tcl", + ".tex" => "application/x-tex", + ".texi" => "application/x-texinfo", + ".texinfo" => "application/x-texinfo", + ".1" => "application/x-troff-man", + ".2" => "application/x-troff-man", + ".3" => "application/x-troff-man", + ".4" => "application/x-troff-man", + ".5" => "application/x-troff-man", + ".6" => "application/x-troff-man", + ".7" => "application/x-troff-man", + ".8" => "application/x-troff-man", + ".man" => "application/x-troff-man", + ".me" => "application/x-troff-me", + ".ms" => "application/x-troff-ms", + ".ustar" => "application/x-ustar", + ".src" => "application/x-wais-source", + ".xpi" => "application/x-xpinstall", + ".xspf" => "application/x-xspf+xml", + ".xz" => "application/x-xz", + ".726" => "audio/32kadpcm", + ".amr" => "audio/AMR", + ".awb" => "audio/AMR-WB", + ".aal" => "audio/ATRAC-ADVANCED-LOSSLESS", + ".atx" => "audio/ATRAC-X", + ".aa3" => "audio/ATRAC3", + ".at3" => "audio/ATRAC3", + ".omg" => "audio/ATRAC3", + ".evc" => "audio/EVRC", + ".evb" => "audio/EVRCB", + ".enw" => "audio/EVRCNW", + ".evw" => "audio/EVRCWB", + ".l16" => "audio/L16", + ".qcp" => "audio/QCELP", + ".smv" => "audio/SMV", + ".aac" => "audio/aac", + ".adts" => "audio/aac", + ".ass" => "audio/aac", + ".ac3" => "audio/ac3", + ".acn" => "audio/asc", + ".au" => "audio/basic", + ".snd" => "audio/basic", + ".dls" => "audio/dls", + ".lbc" => "audio/iLBC", + ".mhas" => "audio/mhas", + ".kar" => "audio/midi", + ".mid" => "audio/midi", + ".midi" => "audio/midi", + ".mxmf" => "audio/mobile-xmf", + ".m4a" => "audio/mp4", + ".mp1" => "audio/mpeg", + ".mp2" => "audio/mpeg", + ".mp3" => "audio/mpeg", + ".mpga" => "audio/mpeg", + ".oga" => "audio/ogg", + ".ogg" => "audio/ogg", + ".opus" => "audio/ogg", + ".spx" => "audio/ogg", + ".psid" => "audio/prs.sid", + ".sid" => "audio/prs.sid", + ".sofa" => "audio/sofa", + ".loas" => "audio/usac", + ".xhe" => "audio/usac", + ".koz" => "audio/vnd.audiokoz", + ".uva" => "audio/vnd.dece.audio", + ".uvva" => "audio/vnd.dece.audio", + ".eol" => "audio/vnd.digital-winds", + ".mlp" => "audio/vnd.dolby.mlp", + ".dts" => "audio/vnd.dts", + ".dtshd" => "audio/vnd.dts.hd", + ".plj" => "audio/vnd.everad.plj", + ".lvp" => "audio/vnd.lucent.voice", + ".pya" => "audio/vnd.ms-playready.media.pya", + ".vbk" => "audio/vnd.nortel.vbk", + ".ecelp4800" => "audio/vnd.nuera.ecelp4800", + ".ecelp7470" => "audio/vnd.nuera.ecelp7470", + ".ecelp9600" => "audio/vnd.nuera.ecelp9600", + ".multitrack" => "audio/vnd.presonus.multitrack", + ".rip" => "audio/vnd.rip", + ".s1m" => "audio/vnd.sealedmedia.softseal.mpeg", + ".smp" => "audio/vnd.sealedmedia.softseal.mpeg", + ".smp3" => "audio/vnd.sealedmedia.softseal.mpeg", + ".aif" => "audio/x-aiff", + ".aifc" => "audio/x-aiff", + ".aiff" => "audio/x-aiff", + ".axa" => "audio/x-annodex", + ".flac" => "audio/x-flac", + ".mka" => "audio/x-matroska", + ".669" => "audio/x-mod", + ".m15" => "audio/x-mod", + ".med" => "audio/x-mod", + ".mod" => "audio/x-mod", + ".mtm" => "audio/x-mod", + ".ult" => "audio/x-mod", + ".uni" => "audio/x-mod", + ".m3u" => "audio/x-mpegurl", + ".wax" => "audio/x-ms-wax", + ".wma" => "audio/x-ms-wma", + ".ram" => "audio/x-pn-realaudio", + ".rm" => "audio/x-pn-realaudio", + ".ra" => "audio/x-realaudio", + ".s3m" => "audio/x-s3m", + ".stm" => "audio/x-stm", + ".wav" => "audio/x-wav", + ".xyz" => "chemical/x-xyz", + ".ttc" => "font/collection", + ".otf" => "font/otf", + ".ttf" => "font/ttf", + ".woff" => "font/woff", + ".woff2" => "font/woff2", + ".exr" => "image/aces", + ".avci" => "image/avci", + ".avcs" => "image/avcs", + ".avif" => "image/avif", + ".hif" => "image/avif", + ".bmp" => "image/bmp", + ".dib" => "image/bmp", + ".cgm" => "image/cgm", + ".drle" => "image/dicom-rle", + ".emf" => "image/emf", + ".fit" => "image/fits", + ".fits" => "image/fits", + ".fts" => "image/fits", + ".gif" => "image/gif", + ".heic" => "image/heic", + ".heics" => "image/heic-sequence", + ".heif" => "image/heif", + ".heifs" => "image/heif-sequence", + ".hej2" => "image/hej2k", + ".hsj2" => "image/hsj2", + ".ief" => "image/ief", + ".jls" => "image/jls", + ".jp2" => "image/jp2", + ".jpg2" => "image/jp2", + ".jfif" => "image/jpeg", + ".jpe" => "image/jpeg", + ".jpeg" => "image/jpeg", + ".jpg" => "image/jpeg", + ".jph" => "image/jph", + ".jhc" => "image/jphc", + ".jpgm" => "image/jpm", + ".jpm" => "image/jpm", + ".jpf" => "image/jpx", + ".jpx" => "image/jpx", + ".jxl" => "image/jxl", + ".jxr" => "image/jxr", + ".jxra" => "image/jxrA", + ".jxrs" => "image/jxrS", + ".jxs" => "image/jxs", + ".jxsc" => "image/jxsc", + ".jxsi" => "image/jxsi", + ".jxss" => "image/jxss", + ".ktx" => "image/ktx", + ".ktx2" => "image/ktx2", + ".png" => "image/png", + ".btf" => "image/prs.btif", + ".btif" => "image/prs.btif", + ".pti" => "image/prs.pti", + ".svg" => "image/svg+xml", + ".svgz" => "image/svg+xml", + ".t38" => "image/t38", + ".tif" => "image/tiff", + ".tiff" => "image/tiff", + ".tfx" => "image/tiff-fx", + ".webp" => "image/webp", + ".wmf" => "image/wmf", + ".psd" => "image/vnd.adobe.photoshop", + ".azv" => "image/vnd.airzip.accelerator.azv", + ".uvg" => "image/vnd.dece.graphic", + ".uvi" => "image/vnd.dece.graphic", + ".uvvg" => "image/vnd.dece.graphic", + ".uvvi" => "image/vnd.dece.graphic", + ".djv" => "image/vnd.djvu", + ".djvu" => "image/vnd.djvu", + ".dwg" => "image/vnd.dwg", + ".dxf" => "image/vnd.dxf", + ".fbs" => "image/vnd.fastbidsheet", + ".fpx" => "image/vnd.fpx", + ".fst" => "image/vnd.fst", + ".mmr" => "image/vnd.fujixerox.edmics-mmr", + ".rlc" => "image/vnd.fujixerox.edmics-rlc", + ".pgb" => "image/vnd.globalgraphics.pgb", + ".ico" => "image/vnd.microsoft.icon", + ".apng" => "image/vnd.mozilla.apng", + ".mdi" => "image/vnd.ms-modi", + ".b16" => "image/vnd.pco.b16", + ".hdr" => "image/vnd.radiance", + ".rgbe" => "image/vnd.radiance", + ".xyze" => "image/vnd.radiance", + ".s1n" => "image/vnd.sealed.png", + ".spn" => "image/vnd.sealed.png", + ".spng" => "image/vnd.sealed.png", + ".s1g" => "image/vnd.sealedmedia.softseal.gif", + ".sgi" => "image/vnd.sealedmedia.softseal.gif", + ".sgif" => "image/vnd.sealedmedia.softseal.gif", + ".s1j" => "image/vnd.sealedmedia.softseal.jpg", + ".sjp" => "image/vnd.sealedmedia.softseal.jpg", + ".sjpg" => "image/vnd.sealedmedia.softseal.jpg", + ".tap" => "image/vnd.tencent.tap", + ".vtf" => "image/vnd.valve.source.texture", + ".wbmp" => "image/vnd.wap.wbmp", + ".xif" => "image/vnd.xiff", + ".pcx" => "image/vnd.zbrush.pcx", + ".ras" => "image/x-cmu-raster", + ".pnm" => "image/x-portable-anymap", + ".pbm" => "image/x-portable-bitmap", + ".pgm" => "image/x-portable-graymap", + ".ppm" => "image/x-portable-pixmap", + ".rgb" => "image/x-rgb", + ".tga" => "image/x-targa", + ".xbm" => "image/x-xbitmap", + ".xpm" => "image/x-xpixmap", + ".xwd" => "image/x-xwindowdump", + ".u8msg" => "message/global", + ".u8dsn" => "message/global-delivery-status", + ".u8mdn" => "message/global-disposition-notification", + ".u8hdr" => "message/global-headers", + ".art" => "message/rfc822", + ".eml" => "message/rfc822", + ".mail" => "message/rfc822", + ".gltf" => "model/gltf+json", + ".glb" => "model/gltf-binary", + ".iges" => "model/iges", + ".igs" => "model/iges", + ".mesh" => "model/mesh", + ".msh" => "model/mesh", + ".silo" => "model/mesh", + ".mtl" => "model/mtl", + ".obj" => "model/obj", + ".stl" => "model/stl", + ".vrml" => "model/vrml", + ".wrl" => "model/vrml", + ".x3db" => "model/x3d+xml", + ".x3dv" => "model/x3d-vrml", + ".x3dvz" => "model/x3d-vrml", + ".dae" => "model/vnd.collada+xml", + ".dwf" => "model/vnd.dwf", + ".dor" => "model/vnd.gdl", + ".gdl" => "model/vnd.gdl", + ".gsm" => "model/vnd.gdl", + ".ism" => "model/vnd.gdl", + ".lmp" => "model/vnd.gdl", + ".msm" => "model/vnd.gdl", + ".rsm" => "model/vnd.gdl", + ".win" => "model/vnd.gdl", + ".gtw" => "model/vnd.gtw", + ".moml" => "model/vnd.moml+xml", + ".mts" => "model/vnd.mts", + ".ogex" => "model/vnd.opengex", + ".pyo" => "model/vnd.pytha.pyox", + ".pyox" => "model/vnd.pytha.pyox", + ".vds" => "model/vnd.sap.vds", + ".usdz" => "model/vnd.usdz+zip", + ".bsp" => "model/vnd.valve.source.compiled-map", + ".vtu" => "model/vnd.vtu", + ".vpm" => "multipart/voice-message", + ".bmed" => "multipart/vnd.bint.med-plus", + ".sgm" => "text/SGML", + ".sgml" => "text/SGML", + ".appcache" => "text/cache-manifest", + ".manifest" => "text/cache-manifest", + ".ics" => "text/calendar", + ".ifb" => "text/calendar", + ".CQL" => "text/cql", + ".css" => "text/css;charset=utf-8", + ".csv" => "text/csv;charset=utf-8", + ".csvs" => "text/csv-schema", + ".soa" => "text/dns", + ".zone" => "text/dns", + ".gff3" => "text/gff3", + ".htm" => "text/html", + ".html" => "text/html", + ".sandboxed" => "text/html-sandboxed", + ".js" => "text/javascript", + ".mjs" => "text/javascript", + ".cnd" => "text/jcr-cnd", + ".markdown" => "text/markdown;charset=utf-8", + ".md" => "text/markdown;charset=utf-8", + ".miz" => "text/mizar", + ".n3" => "text/n3", + ".asc" => "text/plain;charset=utf-8", + ".c" => "text/plain;charset=utf-8", + ".cc" => "text/plain;charset=utf-8", + ".conf" => "text/plain;charset=utf-8", + ".cxx" => "text/plain;charset=utf-8", + ".el" => "text/plain;charset=utf-8", + ".f90" => "text/plain;charset=utf-8", + ".h" => "text/plain;charset=utf-8", + ".hh" => "text/plain;charset=utf-8", + ".hxx" => "text/plain;charset=utf-8", + ".log" => "text/plain;charset=utf-8", + ".pm" => "text/plain;charset=utf-8", + ".spec" => "text/plain;charset=utf-8", + ".text" => "text/plain;charset=utf-8", + ".txt" => "text/plain;charset=utf-8", + ".provn" => "text/provenance-notation", + ".rst" => "text/prs.fallenstein.rst", + ".dsc" => "text/prs.lines.tag", + ".tag" => "text/prs.lines.tag", + ".rtx" => "text/richtext", + ".shaclc" => "text/shaclc", + ".shc" => "text/shaclc", + ".spdx" => "text/spdx", + ".tsv" => "text/tab-separated-values", + ".roff" => "text/troff", + ".t" => "text/troff", + ".tr" => "text/troff", + ".ttl" => "text/turtle", + ".uri" => "text/uri-list", + ".uris" => "text/uri-list", + ".vcard" => "text/vcard", + ".vcf" => "text/vcard", + ".vtt" => "text/vtt", + ".rng" => "text/xml", + ".xml" => "text/xml", + ".xsd" => "text/xml", + ".ent" => "text/xml-external-parsed-entity", + ".dms" => "text/vnd.DMClientScript", + ".a" => "text/vnd.a", + ".abc" => "text/vnd.abc", + ".ascii" => "text/vnd.ascii-art", + ".copyright" => "text/vnd.debian.copyright", + ".sub" => "text/vnd.dvb.subtitle", + ".jtd" => "text/vnd.esmertec.theme-descriptor", + ".flt" => "text/vnd.ficlab.flt", + ".fly" => "text/vnd.fly", + ".flx" => "text/vnd.fmi.flexstor", + ".dot" => "text/vnd.graphviz", + ".gv" => "text/vnd.graphviz", + ".hans" => "text/vnd.hans", + ".hgl" => "text/vnd.hgl", + ".3dm" => "text/vnd.in3d.3dml", + ".3dml" => "text/vnd.in3d.3dml", + ".spo" => "text/vnd.in3d.spot", + ".spot" => "text/vnd.in3d.spot", + ".mpf" => "text/vnd.ms-mediapackage", + ".ccc" => "text/vnd.net2phone.commcenter.command", + ".mc2" => "text/vnd.senx.warpscript", + ".uric" => "text/vnd.si.uricatalogue", + ".sos" => "text/vnd.sosi", + ".jad" => "text/vnd.sun.j2me.app-descriptor", + ".ts" => "text/vnd.trolltech.linguist", + ".si" => "text/vnd.wap.si", + ".sl" => "text/vnd.wap.sl", + ".wml" => "text/vnd.wap.wml", + ".wmls" => "text/vnd.wap.wmlscript", + ".pod" => "text/x-pod", + ".etx" => "text/x-setext", + ".3gp" => "video/3gpp", + ".3gpp" => "video/3gpp", + ".3g2" => "video/3gpp2", + ".3gpp2" => "video/3gpp2", + ".m4s" => "video/iso.segment", + ".mj2" => "video/mj2", + ".mjp2" => "video/mj2", + ".m4v" => "video/mp4", + ".mp4" => "video/mp4", + ".mpg4" => "video/mp4", + ".m1v" => "video/mpeg", + ".m2v" => "video/mpeg", + ".mpe" => "video/mpeg", + ".mpeg" => "video/mpeg", + ".mpg" => "video/mpeg", + ".ogv" => "video/ogg", + ".mov" => "video/quicktime", + ".qt" => "video/quicktime", + ".webm" => "video/webm", + ".uvh" => "video/vnd.dece.hd", + ".uvvh" => "video/vnd.dece.hd", + ".uvm" => "video/vnd.dece.mobile", + ".uvvm" => "video/vnd.dece.mobile", + ".uvu" => "video/vnd.dece.mp4", + ".uvvu" => "video/vnd.dece.mp4", + ".uvp" => "video/vnd.dece.pd", + ".uvvp" => "video/vnd.dece.pd", + ".uvs" => "video/vnd.dece.sd", + ".uvvs" => "video/vnd.dece.sd", + ".uvv" => "video/vnd.dece.video", + ".uvvv" => "video/vnd.dece.video", + ".dvb" => "video/vnd.dvb.file", + ".fvt" => "video/vnd.fvt", + ".m4u" => "video/vnd.mpegurl", + ".mxu" => "video/vnd.mpegurl", + ".pyv" => "video/vnd.ms-playready.media.pyv", + ".nim" => "video/vnd.nokia.interleaved-multimedia", + ".bik" => "video/vnd.radgamettools.bink", + ".bk2" => "video/vnd.radgamettools.bink", + ".smk" => "video/vnd.radgamettools.smacker", + ".s11" => "video/vnd.sealed.mpeg1", + ".smpg" => "video/vnd.sealed.mpeg1", + ".s14" => "video/vnd.sealed.mpeg4", + ".ssw" => "video/vnd.sealed.swf", + ".sswf" => "video/vnd.sealed.swf", + ".s1q" => "video/vnd.sealedmedia.softseal.mov", + ".smo" => "video/vnd.sealedmedia.softseal.mov", + ".smov" => "video/vnd.sealedmedia.softseal.mov", + ".viv" => "video/vnd.vivo", + ".yt" => "video/vnd.youtube.yt", + ".axv" => "video/x-annodex", + ".flv" => "video/x-flv", + ".fxm" => "video/x-javafx", + ".mkv" => "video/x-matroska", + ".mk3d" => "video/x-matroska-3d", + ".asx" => "video/x-ms-asf", + ".wm" => "video/x-ms-wm", + ".wmv" => "video/x-ms-wmv", + ".wmx" => "video/x-ms-wmx", + ".wvx" => "video/x-ms-wvx", + ".avi" => "video/x-msvideo", + ".movie" => "video/x-sgi-movie", + ".ice" => "x-conference/x-cooltalk", + ".sisx" => "x-epoc/x-sisx-app", + "README" => "text/plain;charset=utf-8", + "Makefile" => "text/x-makefile;charset=utf-8", + + # enable caching for unknown mime types: + "" => "application/octet-stream" +)