solid-ui 5.0.2-0 → 5.0.2-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.esm.js +1 -2
- package/dist/_virtual/~icons/app/solid-emblem.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/book-user.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/chevron-down.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/circle-user.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/circle-x.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/folder-open.cjs.js +2 -0
- package/dist/_virtual/~icons/lucide/folder-open.cjs.js.map +1 -0
- package/dist/_virtual/~icons/lucide/folder-open.esm.js +10 -0
- package/dist/_virtual/~icons/lucide/folder-open.esm.js.map +1 -0
- package/dist/_virtual/~icons/lucide/folder.cjs.js +2 -0
- package/dist/_virtual/~icons/lucide/folder.cjs.js.map +1 -0
- package/dist/_virtual/~icons/lucide/folder.esm.js +10 -0
- package/dist/_virtual/~icons/lucide/folder.esm.js.map +1 -0
- package/dist/_virtual/~icons/lucide/globe.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/link.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/log-in.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/log-out.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/square-arrow-out-up-right.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/triangle-alert.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/user-round.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/user.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/users.esm.js +1 -2
- package/dist/_virtual/~icons/lucide/x.esm.js +1 -2
- package/dist/_virtual/~icons/svg-spinners/180-ring.esm.js +1 -2
- package/dist/_virtual/~icons/svg-spinners/3-dots-fade.esm.js +1 -2
- package/dist/acl/access-controller.esm.js +1 -2
- package/dist/acl/access-groups.esm.js +1 -2
- package/dist/acl/acl-control.esm.js +1 -2
- package/dist/acl/acl.esm.js +1 -2
- package/dist/acl/add-agent-buttons.esm.js +1 -2
- package/dist/acl/index.esm.js +1 -2
- package/dist/chat/bookmarks.esm.js +1 -2
- package/dist/chat/chatLogic.esm.js +1 -2
- package/dist/chat/dateFolder.esm.js +1 -2
- package/dist/chat/infinite.cjs.js +1 -1
- package/dist/chat/infinite.cjs.js.map +1 -1
- package/dist/chat/infinite.esm.js +2 -3
- package/dist/chat/infinite.esm.js.map +1 -1
- package/dist/chat/keys.esm.js +1 -2
- package/dist/chat/message.esm.js +1 -2
- package/dist/chat/messageTools.esm.js +1 -2
- package/dist/chat/signature.esm.js +0 -1
- package/dist/chunks/{DialogProvider-B7oVYKJO.js → DialogProvider-C89v7x0r.js} +5 -8
- package/dist/chunks/{DialogProvider-B7oVYKJO.js.map → DialogProvider-C89v7x0r.js.map} +1 -1
- package/dist/chunks/{access-control-modal-eOv2-U27.js → access-control-modal-Dcg6-f4V.js} +924 -540
- package/dist/chunks/access-control-modal-Dcg6-f4V.js.map +1 -0
- package/dist/chunks/{account-DpmYJEd-.js → account-D6JK-n7u.js} +16 -21
- package/dist/chunks/{account-DpmYJEd-.js.map → account-D6JK-n7u.js.map} +1 -1
- package/dist/chunks/{auth-Hp8M6TQf.js → auth-B_abPDvH.js} +28 -31
- package/dist/chunks/auth-B_abPDvH.js.map +1 -0
- package/dist/chunks/{avatar-D5rcw6gN.js → avatar-BR3COVSQ.js} +6 -9
- package/dist/chunks/{avatar-D5rcw6gN.js.map → avatar-BR3COVSQ.js.map} +1 -1
- package/dist/chunks/{button-lol95DqR.js → button-D6qO2idW.js} +5 -8
- package/dist/chunks/{button-lol95DqR.js.map → button-D6qO2idW.js.map} +1 -1
- package/dist/chunks/{chevron-down-ujxRg3MD.js → chevron-down-CqUEolao.js} +2 -3
- package/dist/chunks/chevron-down-CqUEolao.js.map +1 -0
- package/dist/chunks/{chunk.UEBQI7VV-OBPERnuy.js → chunk.UEBQI7VV-lcP-fpUk.js} +14 -23
- package/dist/chunks/{chunk.UEBQI7VV-OBPERnuy.js.map → chunk.UEBQI7VV-lcP-fpUk.js.map} +1 -1
- package/dist/chunks/{combobox-Dmv-TZtI.js → combobox-fSTp9qoT.js} +11 -15
- package/dist/chunks/combobox-fSTp9qoT.js.map +1 -0
- package/dist/chunks/{combobox-option-B-Hksiq2.js → combobox-option-DOtGuKel.js} +4 -6
- package/dist/chunks/{combobox-option-B-Hksiq2.js.map → combobox-option-DOtGuKel.js.map} +1 -1
- package/dist/chunks/{components-Bdqizu8x.js → components-C8c2Ucm5.js} +17 -33
- package/dist/chunks/{components-Bdqizu8x.js.map → components-C8c2Ucm5.js.map} +1 -1
- package/dist/chunks/{dialog-DYgcCurb.js → dialog-CgYK767T.js} +8 -10
- package/dist/chunks/{dialog-DYgcCurb.js.map → dialog-CgYK767T.js.map} +1 -1
- package/dist/chunks/{dialog-content-jx08y2Oa.js → dialog-content-DjwRH1ci.js} +4 -6
- package/dist/chunks/{dialog-content-jx08y2Oa.js.map → dialog-content-DjwRH1ci.js.map} +1 -1
- package/dist/chunks/{dialog-footer-Bhl8k1PX.js → dialog-footer-GQWi8lfB.js} +4 -6
- package/dist/chunks/{dialog-footer-Bhl8k1PX.js.map → dialog-footer-GQWi8lfB.js.map} +1 -1
- package/dist/chunks/{dialog-header-Dn6PQzFB.js → dialog-header-c3qOMQfb.js} +4 -6
- package/dist/chunks/{dialog-header-Dn6PQzFB.js.map → dialog-header-c3qOMQfb.js.map} +1 -1
- package/dist/chunks/{dialogs-B6TfxrPt.js → dialogs-BmtLjMzg.js} +5 -7
- package/dist/chunks/{dialogs-B6TfxrPt.js.map → dialogs-BmtLjMzg.js.map} +1 -1
- package/dist/chunks/{dialogs-root-Qiucjj9u.js → dialogs-root-BcQo2XMF.js} +6 -8
- package/dist/chunks/{dialogs-root-Qiucjj9u.js.map → dialogs-root-BcQo2XMF.js.map} +1 -1
- package/dist/chunks/{error-state-DK1x-kNd.js → error-state-BD4_Wrkz.js} +6 -8
- package/dist/chunks/{error-state-DK1x-kNd.js.map → error-state-BD4_Wrkz.js.map} +1 -1
- package/dist/chunks/{guard-FbhNrJGh.js → guard-bTeM7wd7.js} +5 -7
- package/dist/chunks/{guard-FbhNrJGh.js.map → guard-bTeM7wd7.js.map} +1 -1
- package/dist/chunks/{index.esm-N8NHgFUj.js → index.esm-CECfD0e9.js} +3256 -3083
- package/dist/chunks/index.esm-CECfD0e9.js.map +1 -0
- package/dist/chunks/{input-lpqx_k53.js → input-Bz3l514j.js} +5 -7
- package/dist/chunks/{input-lpqx_k53.js.map → input-Bz3l514j.js.map} +1 -1
- package/dist/chunks/{jsonld-Djw57WRt.js → jsonld-CnfzCyCn.js} +4 -5
- package/dist/chunks/{jsonld-Djw57WRt.js.map → jsonld-CnfzCyCn.js.map} +1 -1
- package/dist/chunks/{login-button-DCq4Gi3_.js → login-button-Div4ZT4J.js} +6 -8
- package/dist/chunks/{login-button-DCq4Gi3_.js.map → login-button-Div4ZT4J.js.map} +1 -1
- package/dist/chunks/{logout-button-D3dJrsV4.js → logout-button-D3lqlnCX.js} +6 -8
- package/dist/chunks/{logout-button-D3dJrsV4.js.map → logout-button-D3lqlnCX.js.map} +1 -1
- package/dist/chunks/{menu-RJklqKQE.js → menu-D0k2fkiE.js} +22 -39
- package/dist/chunks/{menu-RJklqKQE.js.map → menu-D0k2fkiE.js.map} +1 -1
- package/dist/chunks/{menu-item-C2e0qj-v.js → menu-item-nfPpH4dN.js} +5 -7
- package/dist/chunks/{menu-item-C2e0qj-v.js.map → menu-item-nfPpH4dN.js.map} +1 -1
- package/dist/chunks/{photo-capture-DEMQNmzb.js → photo-capture-hJaJm4TM.js} +6 -8
- package/dist/chunks/{photo-capture-DEMQNmzb.js.map → photo-capture-hJaJm4TM.js.map} +1 -1
- package/dist/chunks/{photo-capture-modal-C7oESDQq.js → photo-capture-modal-BsHv6wmh.js} +9 -11
- package/dist/chunks/{photo-capture-modal-C7oESDQq.js.map → photo-capture-modal-BsHv6wmh.js.map} +1 -1
- package/dist/chunks/{provider-D9UgRI4G.js → provider-Dcd1NPYx.js} +7 -9
- package/dist/chunks/{provider-D9UgRI4G.js.map → provider-Dcd1NPYx.js.map} +1 -1
- package/dist/chunks/{query-BYu9q8lA.js → query-DjAOg-tk.js} +3 -5
- package/dist/chunks/{query-BYu9q8lA.js.map → query-DjAOg-tk.js.map} +1 -1
- package/dist/chunks/{rdf-form-BLgKdXP2.js → rdf-form-CmPnHKR-.js} +23 -25
- package/dist/chunks/{rdf-form-BLgKdXP2.js.map → rdf-form-CmPnHKR-.js.map} +1 -1
- package/dist/chunks/{rdf-input-DWnDpkXy.js → rdf-input-3AgoeCkJ.js} +48 -51
- package/dist/chunks/{rdf-input-DWnDpkXy.js.map → rdf-input-3AgoeCkJ.js.map} +1 -1
- package/dist/chunks/{select-CnkJMo_K.js → select-ClPkDkGl.js} +7 -10
- package/dist/chunks/{select-CnkJMo_K.js.map → select-ClPkDkGl.js.map} +1 -1
- package/dist/chunks/{select-option-B9HSZiTp.js → select-option-DQan7rcB.js} +4 -6
- package/dist/chunks/{select-option-B9HSZiTp.js.map → select-option-DQan7rcB.js.map} +1 -1
- package/dist/chunks/{show-dialog-eEW5yRBv.js → show-dialog-DAmFslrf.js} +2 -3
- package/dist/chunks/{show-dialog-eEW5yRBv.js.map → show-dialog-DAmFslrf.js.map} +1 -1
- package/dist/chunks/{signup-button-BQ4AWem2.js → signup-button-2fAoS0Nv.js} +6 -8
- package/dist/chunks/{signup-button-BQ4AWem2.js.map → signup-button-2fAoS0Nv.js.map} +1 -1
- package/dist/chunks/{solid-emblem-DNjQSX1z.js → solid-emblem-DwLdkGuO.js} +5 -8
- package/dist/chunks/{solid-emblem-DNjQSX1z.js.map → solid-emblem-DwLdkGuO.js.map} +1 -1
- package/dist/chunks/{src-DQMZZG1B.js → src-Dx7k_VIe.js} +2732 -2782
- package/dist/chunks/src-Dx7k_VIe.js.map +1 -0
- package/dist/chunks/{style-ChFDDB1c.js → style-w0Fl0xnd.js} +25 -29
- package/dist/chunks/{style-ChFDDB1c.js.map → style-w0Fl0xnd.js.map} +1 -1
- package/dist/chunks/{widgets-CVLwnfkU.js → widgets-BWpm5CPx.js} +694 -715
- package/dist/chunks/widgets-BWpm5CPx.js.map +1 -0
- package/dist/chunks/{x-BRRkraZN.js → x-D1JUUSOS.js} +2 -3
- package/dist/chunks/x-D1JUUSOS.js.map +1 -0
- package/dist/components/access-control-modal/AccessControlAddAccess.cjs.js +11 -5
- package/dist/components/access-control-modal/AccessControlAddAccess.cjs.js.map +1 -1
- package/dist/components/access-control-modal/AccessControlAddAccess.d.ts +1 -0
- package/dist/components/access-control-modal/AccessControlAddAccess.d.ts.map +1 -1
- package/dist/components/access-control-modal/AccessControlAddAccess.esm.js +75 -57
- package/dist/components/access-control-modal/AccessControlAddAccess.esm.js.map +1 -1
- package/dist/components/access-control-modal/AccessControlAddAccess.styles.cjs.js +1 -1
- package/dist/components/access-control-modal/AccessControlAddAccess.styles.cjs.js.map +1 -1
- package/dist/components/access-control-modal/AccessControlAddAccess.styles.esm.js +2 -3
- package/dist/components/access-control-modal/AccessControlAddAccess.styles.esm.js.map +1 -1
- package/dist/components/access-control-modal/AccessControlErrors.cjs.js +3 -2
- package/dist/components/access-control-modal/AccessControlErrors.cjs.js.map +1 -1
- package/dist/components/access-control-modal/AccessControlErrors.d.ts +1 -0
- package/dist/components/access-control-modal/AccessControlErrors.d.ts.map +1 -1
- package/dist/components/access-control-modal/AccessControlErrors.esm.js +6 -3
- package/dist/components/access-control-modal/AccessControlErrors.esm.js.map +1 -1
- package/dist/components/access-control-modal/AccessControlErrors.styles.esm.js +1 -2
- package/dist/components/access-control-modal/AccessControlGeneralAccess.cjs.js +5 -3
- package/dist/components/access-control-modal/AccessControlGeneralAccess.cjs.js.map +1 -1
- package/dist/components/access-control-modal/AccessControlGeneralAccess.d.ts +1 -0
- package/dist/components/access-control-modal/AccessControlGeneralAccess.d.ts.map +1 -1
- package/dist/components/access-control-modal/AccessControlGeneralAccess.esm.js +57 -45
- package/dist/components/access-control-modal/AccessControlGeneralAccess.esm.js.map +1 -1
- package/dist/components/access-control-modal/AccessControlGeneralAccess.styles.esm.js +1 -2
- package/dist/components/access-control-modal/AccessControlModal.cjs.js +112 -6
- package/dist/components/access-control-modal/AccessControlModal.cjs.js.map +1 -1
- package/dist/components/access-control-modal/AccessControlModal.d.ts +27 -0
- package/dist/components/access-control-modal/AccessControlModal.d.ts.map +1 -1
- package/dist/components/access-control-modal/AccessControlModal.esm.js +411 -127
- package/dist/components/access-control-modal/AccessControlModal.esm.js.map +1 -1
- package/dist/components/access-control-modal/AccessControlModal.styles.cjs.js +1 -1
- package/dist/components/access-control-modal/AccessControlModal.styles.cjs.js.map +1 -1
- package/dist/components/access-control-modal/AccessControlModal.styles.esm.js +2 -3
- package/dist/components/access-control-modal/AccessControlModal.styles.esm.js.map +1 -1
- package/dist/components/access-control-modal/AccessControlSharedAccess.cjs.js +6 -5
- package/dist/components/access-control-modal/AccessControlSharedAccess.cjs.js.map +1 -1
- package/dist/components/access-control-modal/AccessControlSharedAccess.d.ts +1 -0
- package/dist/components/access-control-modal/AccessControlSharedAccess.d.ts.map +1 -1
- package/dist/components/access-control-modal/AccessControlSharedAccess.esm.js +71 -55
- package/dist/components/access-control-modal/AccessControlSharedAccess.esm.js.map +1 -1
- package/dist/components/access-control-modal/AccessControlSharedAccess.styles.esm.js +1 -2
- package/dist/components/access-control-modal/accessGrantDrafts.cjs.js +1 -1
- package/dist/components/access-control-modal/accessGrantDrafts.cjs.js.map +1 -1
- package/dist/components/access-control-modal/accessGrantDrafts.d.ts.map +1 -1
- package/dist/components/access-control-modal/accessGrantDrafts.esm.js +6 -7
- package/dist/components/access-control-modal/accessGrantDrafts.esm.js.map +1 -1
- package/dist/components/access-control-modal/accessTargetResolver.cjs.js +1 -1
- package/dist/components/access-control-modal/accessTargetResolver.cjs.js.map +1 -1
- package/dist/components/access-control-modal/accessTargetResolver.d.ts +1 -0
- package/dist/components/access-control-modal/accessTargetResolver.d.ts.map +1 -1
- package/dist/components/access-control-modal/accessTargetResolver.esm.js +92 -46
- package/dist/components/access-control-modal/accessTargetResolver.esm.js.map +1 -1
- package/dist/components/access-control-modal/applyAccessChanges.cjs.js +1 -1
- package/dist/components/access-control-modal/applyAccessChanges.cjs.js.map +1 -1
- package/dist/components/access-control-modal/applyAccessChanges.d.ts +4 -2
- package/dist/components/access-control-modal/applyAccessChanges.d.ts.map +1 -1
- package/dist/components/access-control-modal/applyAccessChanges.esm.js +23 -15
- package/dist/components/access-control-modal/applyAccessChanges.esm.js.map +1 -1
- package/dist/components/access-control-modal/buildAccessChanges.esm.js +1 -2
- package/dist/components/access-control-modal/helpers.esm.js +1 -2
- package/dist/components/access-control-modal/index.esm.js +1 -2
- package/dist/components/access-control-modal/types.d.ts +6 -1
- package/dist/components/access-control-modal/types.d.ts.map +1 -1
- package/dist/components/access-control-modal.js +1 -1
- package/dist/components/account/Account.esm.js +1 -2
- package/dist/components/account/Account.styles.esm.js +1 -2
- package/dist/components/account/index.esm.js +1 -2
- package/dist/components/account.js +1 -1
- package/dist/components/avatar/Avatar.esm.js +1 -2
- package/dist/components/avatar/Avatar.styles.esm.js +1 -2
- package/dist/components/avatar/index.esm.js +1 -2
- package/dist/components/avatar.js +1 -1
- package/dist/components/button/Button.esm.js +1 -2
- package/dist/components/button/Button.styles.esm.js +1 -2
- package/dist/components/button/index.esm.js +1 -2
- package/dist/components/button.js +1 -1
- package/dist/components/combobox/Combobox.cjs.js +1 -0
- package/dist/components/combobox/Combobox.cjs.js.map +1 -1
- package/dist/components/combobox/Combobox.d.ts.map +1 -1
- package/dist/components/combobox/Combobox.esm.js +2 -2
- package/dist/components/combobox/Combobox.esm.js.map +1 -1
- package/dist/components/combobox/Combobox.styles.esm.js +1 -2
- package/dist/components/combobox/index.esm.js +1 -2
- package/dist/components/combobox-option/ComboboxOption.esm.js +1 -2
- package/dist/components/combobox-option/index.esm.js +1 -2
- package/dist/components/combobox-option.js +1 -1
- package/dist/components/combobox.js +1 -1
- package/dist/components/dialog/Dialog.esm.js +1 -2
- package/dist/components/dialog/Dialog.styles.esm.js +1 -2
- package/dist/components/dialog/index.esm.js +1 -2
- package/dist/components/dialog-content/DialogContent.esm.js +1 -2
- package/dist/components/dialog-content/DialogContent.styles.esm.js +1 -2
- package/dist/components/dialog-content/index.esm.js +1 -2
- package/dist/components/dialog-content.js +1 -1
- package/dist/components/dialog-footer/DialogFooter.esm.js +1 -2
- package/dist/components/dialog-footer/DialogFooter.styles.esm.js +1 -2
- package/dist/components/dialog-footer/index.esm.js +1 -2
- package/dist/components/dialog-footer.js +1 -1
- package/dist/components/dialog-header/DialogHeader.esm.js +1 -2
- package/dist/components/dialog-header/DialogHeader.styles.esm.js +1 -2
- package/dist/components/dialog-header/index.esm.js +1 -2
- package/dist/components/dialog-header.js +1 -1
- package/dist/components/dialog-provider/DialogProvider.esm.js +1 -2
- package/dist/components/dialog-provider/index.esm.js +1 -2
- package/dist/components/dialog-provider.js +2 -3
- package/dist/components/dialog.js +1 -1
- package/dist/components/dialogs-root/DialogsRoot.esm.js +1 -2
- package/dist/components/dialogs-root/index.esm.js +1 -2
- package/dist/components/dialogs-root.js +1 -1
- package/dist/components/error-state/ErrorState.esm.js +1 -2
- package/dist/components/error-state/ErrorState.styles.esm.js +1 -2
- package/dist/components/error-state.js +1 -1
- package/dist/components/guard/Guard.esm.js +1 -2
- package/dist/components/guard/index.esm.js +1 -2
- package/dist/components/guard.js +1 -1
- package/dist/components/input/Input.esm.js +1 -2
- package/dist/components/input/Input.styles.esm.js +1 -2
- package/dist/components/input/index.esm.js +1 -2
- package/dist/components/input.js +1 -1
- package/dist/components/login-button/LoginButton.esm.js +1 -2
- package/dist/components/login-button/index.esm.js +1 -2
- package/dist/components/login-button.js +1 -1
- package/dist/components/login-modal/LoginModal.esm.js +1 -2
- package/dist/components/login-modal/LoginModal.styles.esm.js +1 -2
- package/dist/components/login-modal/index.esm.js +1 -2
- package/dist/components/login-modal.js +1 -1
- package/dist/components/logout-button/LogoutButton.esm.js +1 -2
- package/dist/components/logout-button/index.esm.js +1 -2
- package/dist/components/logout-button.js +1 -1
- package/dist/components/menu/Menu.esm.js +1 -2
- package/dist/components/menu/Menu.styles.esm.js +1 -2
- package/dist/components/menu/index.esm.js +1 -2
- package/dist/components/menu-item/MenuItem.esm.js +1 -2
- package/dist/components/menu-item/MenuItem.styles.esm.js +1 -2
- package/dist/components/menu-item/index.esm.js +1 -2
- package/dist/components/menu-item.js +1 -1
- package/dist/components/menu.js +1 -1
- package/dist/components/photo-capture/PhotoCapture.esm.js +1 -2
- package/dist/components/photo-capture/index.esm.js +1 -2
- package/dist/components/photo-capture-modal/PhotoCaptureModal.cjs.js +1 -1
- package/dist/components/photo-capture-modal/PhotoCaptureModal.cjs.js.map +1 -1
- package/dist/components/photo-capture-modal/PhotoCaptureModal.esm.js +2 -3
- package/dist/components/photo-capture-modal/PhotoCaptureModal.esm.js.map +1 -1
- package/dist/components/photo-capture-modal/PhotoCaptureModal.styles.esm.js +1 -2
- package/dist/components/photo-capture-modal/index.esm.js +1 -2
- package/dist/components/photo-capture-modal.js +1 -1
- package/dist/components/photo-capture.js +1 -1
- package/dist/components/provider/Provider.esm.js +1 -2
- package/dist/components/provider/index.esm.js +1 -2
- package/dist/components/provider.js +1 -1
- package/dist/components/rdf-form/RDFForm.esm.js +1 -2
- package/dist/components/rdf-form/index.esm.js +1 -2
- package/dist/components/rdf-form.js +1 -1
- package/dist/components/rdf-input/RDFInput.esm.js +1 -2
- package/dist/components/rdf-input/index.esm.js +1 -2
- package/dist/components/rdf-input.js +1 -1
- package/dist/components/select/Select.esm.js +1 -2
- package/dist/components/select/Select.styles.esm.js +1 -2
- package/dist/components/select/index.esm.js +1 -2
- package/dist/components/select-option/SelectOption.esm.js +1 -2
- package/dist/components/select-option/index.esm.js +1 -2
- package/dist/components/select-option.js +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/signup-button/SignupButton.esm.js +1 -2
- package/dist/components/signup-button/index.esm.js +1 -2
- package/dist/components/signup-button.js +1 -1
- package/dist/components/solid-emblem/SolidEmblem.esm.js +1 -2
- package/dist/components/solid-emblem/SolidEmblem.styles.esm.js +1 -2
- package/dist/components/solid-emblem/index.esm.js +1 -2
- package/dist/components/solid-emblem.js +1 -1
- package/dist/components.js +28 -28
- package/dist/create/create.esm.js +1 -2
- package/dist/create/index.esm.js +1 -2
- package/dist/create/types.esm.js +1 -2
- package/dist/footer/index.esm.js +1 -2
- package/dist/header/empty-profile.esm.js +1 -2
- package/dist/header/index.esm.js +1 -2
- package/dist/index.esm.js +1 -2
- package/dist/index.js +8 -8
- package/dist/lib/auth/Account.esm.js +1 -2
- package/dist/lib/auth/NoopAuth.esm.js +1 -2
- package/dist/lib/auth/SolidAuth.esm.js +1 -2
- package/dist/lib/auth/context.esm.js +1 -2
- package/dist/lib/code-editor/CodeEditor.esm.js +1 -2
- package/dist/lib/components/decorators.esm.js +1 -2
- package/dist/lib/components/dialog-component/DialogComponent.esm.js +1 -2
- package/dist/lib/components/form-control-component/FormControlComponent.esm.js +1 -2
- package/dist/lib/components/ids.esm.js +1 -2
- package/dist/lib/components/traits/DialogTrait.esm.js +1 -2
- package/dist/lib/components/traits/FormControlTrait.esm.js +1 -2
- package/dist/lib/components/web-component/WebComponent.esm.js +1 -2
- package/dist/lib/components/web-component/WebComponent.styles.esm.js +1 -2
- package/dist/lib/debug.esm.js +1 -2
- package/dist/lib/dialogs/Dialog.esm.js +1 -2
- package/dist/lib/dialogs/context.esm.js +1 -2
- package/dist/lib/dialogs/events/close-dialog.esm.js +1 -2
- package/dist/lib/dialogs/events/show-dialog.esm.js +1 -2
- package/dist/lib/dialogs/helpers.esm.js +1 -2
- package/dist/lib/file-explorer/context.esm.js +1 -2
- package/dist/lib/forms/fieldParams.esm.js +1 -2
- package/dist/lib/forms/rdfFormsHelper.esm.js +1 -2
- package/dist/lib/forms/store/NoopStore.esm.js +1 -2
- package/dist/lib/forms/store/StoreContext.esm.js +1 -2
- package/dist/lib/iconBase.esm.js +1 -2
- package/dist/lib/log.esm.js +1 -2
- package/dist/lib/messageArea.esm.js +1 -2
- package/dist/lib/newperson.esm.js +1 -2
- package/dist/lib/ns.esm.js +1 -2
- package/dist/lib/pad.esm.js +1 -2
- package/dist/lib/participation.esm.js +1 -2
- package/dist/lib/preferences.esm.js +1 -2
- package/dist/lib/style.esm.js +1 -2
- package/dist/lib/styleConstants.esm.js +1 -2
- package/dist/lib/style_multiSelect.esm.js +1 -2
- package/dist/lib/table.esm.js +1 -2
- package/dist/lib/tabs.esm.js +1 -2
- package/dist/lib/timing.esm.js +1 -2
- package/dist/lib/values.esm.js +1 -2
- package/dist/loader.js +8 -8
- package/dist/login/login.esm.js +1 -2
- package/dist/matrix/index.esm.js +1 -2
- package/dist/matrix/matrix.esm.js +1 -2
- package/dist/media/index.esm.js +1 -2
- package/dist/media/media-capture.esm.js +1 -2
- package/dist/signup/config-default.esm.js +1 -2
- package/dist/signup/signup.esm.js +1 -2
- package/dist/solid-ui.js +243 -126
- package/dist/solid-ui.min.js +243 -126
- package/dist/solid-ui.min.js.map +1 -1
- package/dist/utils/headerFooterHelpers.esm.js +1 -2
- package/dist/utils/index.esm.js +1 -2
- package/dist/utils/keyHelpers/accessData.esm.js +1 -2
- package/dist/utils/keyHelpers/acl.esm.js +1 -2
- package/dist/utils/keyHelpers/otherHelpers.esm.js +1 -2
- package/dist/utils/label.esm.js +1 -2
- package/dist/widgets/buttons/iconLinks.esm.js +1 -2
- package/dist/widgets/buttons.esm.js +1 -2
- package/dist/widgets/dragAndDrop.esm.js +1 -2
- package/dist/widgets/error.esm.js +1 -2
- package/dist/widgets/forms/autocomplete/autocompleteBar.esm.js +1 -2
- package/dist/widgets/forms/autocomplete/autocompleteField.esm.js +1 -2
- package/dist/widgets/forms/autocomplete/autocompletePicker.cjs.js +1 -1
- package/dist/widgets/forms/autocomplete/autocompletePicker.cjs.js.map +1 -1
- package/dist/widgets/forms/autocomplete/autocompletePicker.esm.js +2 -3
- package/dist/widgets/forms/autocomplete/autocompletePicker.esm.js.map +1 -1
- package/dist/widgets/forms/autocomplete/language.esm.js +1 -2
- package/dist/widgets/forms/autocomplete/publicData.esm.js +1 -2
- package/dist/widgets/forms/basic.esm.js +1 -2
- package/dist/widgets/forms/fieldFunction.esm.js +1 -2
- package/dist/widgets/forms/fieldParams.esm.js +1 -2
- package/dist/widgets/forms/formStyle.esm.js +1 -2
- package/dist/widgets/forms.esm.js +1 -2
- package/dist/widgets/index.esm.js +1 -2
- package/dist/widgets/multiSelect.esm.js +1 -2
- package/dist/widgets/peoplePicker.esm.js +1 -2
- package/dist/widgets/widgetHelpers.esm.js +1 -2
- package/package.json +2 -2
- package/dist/chunks/access-control-modal-eOv2-U27.js.map +0 -1
- package/dist/chunks/auth-Hp8M6TQf.js.map +0 -1
- package/dist/chunks/chevron-down-ujxRg3MD.js.map +0 -1
- package/dist/chunks/combobox-Dmv-TZtI.js.map +0 -1
- package/dist/chunks/index.esm-N8NHgFUj.js.map +0 -1
- package/dist/chunks/src-DQMZZG1B.js.map +0 -1
- package/dist/chunks/widgets-CVLwnfkU.js.map +0 -1
- package/dist/chunks/x-BRRkraZN.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widgets-BWpm5CPx.js","names":["log","args","console","warn","error","trace","debug","mime","style","makeDropTarget","ele","droppedURIHandler","droppedFileHandler","normalizeDroppedUris","uriText","split","map","uri","trim","filter","dragoverListener","e","preventDefault","stopPropagation","dataTransfer","dropEffect","dragenterListener","log","localStyle","savedStyle","dragEvent","dragleaveListener","dropEvent","dropListener","types","join","uris","text","t","length","type","getData","files","i","f","name","size","lastModifiedDate","toLocaleDateString","trimmedText","slice","restoreStyle","addTargetListeners","addEventListener","makeDraggable","tr","obj","setAttribute","fontWeight","setData","outerHTML","uploadFiles","fetcher","fileBase","imageBase","successHandler","describeUploadFailure","destURI","error","status","response","message","String","prefix","reader","FileReader","onload","theFile","data","target","result","suffix","byteLength","contentType","lookup","msg","alert","Error","extension","endsWith","folderName","startsWith","encodeURIComponent","webOperation","then","_response","readAsArrayBuffer","style","cancelButton","style","styleConstants","errorMessageBlock","dom","err","backgroundColor","err2","div","createElement","errorObject","Error","console","error","stack","textContent","message","appendChild","parentNode","removeChild","errorCancelButton","setAttribute","errorMessageBlockStyle","defaultErrorBackgroundColor","style","styleConstants","log","iconsOnGithub","icons","module","scriptURI","iconBase","slice","lastIndexOf","originalIconBase","$SolidTestEnvironment","iconBase","escape","v4","uuidv4","rdf","debug","makeDropTarget","errorMessageBlock","iconBase","ns","solidLogicSingleton","kb","store","PeoplePicker","constructor","element","typeIndex","groupPickedCb","options","selectedgroup","onSelectGroup","bind","render","container","document","createElement","style","maxWidth","minHeight","outline","display","flexDirection","selectedGroup","Group","changeGroupButton","textContent","addEventListener","_event","appendChild","findAddressBook","then","book","chooseExistingGroupButton","margin","GroupPicker","createNewGroupButton","createNewGroup","defaultNewGroupName","group","GroupBuilder","catch","errorBody","innerHTML","err","Promise","resolve","reject","fetcher","nowOrWhenFetched","ok","bookRegistration","any","solid","vcard","Error","load","_xhr","errr","groupIndex","groupContainer","indexes","sym","uri","slice","name","patchPromises","doc","map","typeStatement","st","nameStatement","includesGroupStatement","toIns","equals","patch","forEach","add","all","log","xhr","responseURL","loadGroups","groups","groupButton","handleClickGroup","each","getWithDefault","value","doneBuildingCb","groupChangedCb","onGroupChanged","changeType","agent","refresh","dropContainer","uris","groupNameInput","type","event","setGroupName","target","groupNameLabel","match","statement","webIdNode","object","personDiv","Person","handleRemove","copy","doneBuildingButton","webId","namedNode","rdfClass","foaf","holdsStatement","why","toDel","remove","errorMessage","updatePromises","namedGraph","oldNameStatements","newNameStatement","literal","_solidResponse","removeStatements","imgSrc","profileImg","src","width","height","nameSpan","flexGrow","removeButton","subject","predicate","defaultValue","url","updater","update","success","dir","kb","solidLogicSingleton","escape","ns","rdf.sym","uuidv4","rdf.st","rdf.namedNode","rdf.literal","iconBase","style","wrapDivInATR","dom","div","obj","tr","createElement","td","appendChild","subject","addClickListenerToElement","onClickFunction","addEventListener","createImageDiv","image","imageDiv","setAttribute","imageDivStyle","style","linkIcon","dom","subject","iconURI","anchor","createElement","setAttribute","uri","startsWith","img","appendChild","icon","createLinkForURI","linkDiv","obj","iconLink","classList","add","st","sym","uri","Util","icons","ns","style","debug","info","uploadFiles","makeDraggable","makeDropTarget","store","utils","newPersonIconDataURI","errorMessageBlock","addClickListenerToElement","createImageDiv","wrapDivInATR","linkIcon","createLinkForURI","iconBase","cancelIconURI","checkIconURI","getStatusArea","context","box","statusArea","div","dom","document","body","getElementsByTagName","createElement","insertBefore","firstElementChild","complain","err","ele","log","appendChild","alert","clearElement","firstChild","removeChild","extractLogURI","fullURI","logPos","search","rulPos","substring","shortDate","str","noTime","month","nowZ","Date","toISOString","slice","parseInt","e","formatDateTime","date","format","split","map","s","k","width","Milliseconds","FullYear","d","Month","join","timestamp","shortTime","setName","element","x","kb","findName","name","any","vcard","foaf","value","sameTerm","textContent","label","fetcher","Error","nowOrWhenFetched","doc","undefined","_ok","imagesOf","each","sioc","concat","iconForClass","tempSite","p","indexOf","q","findImageFromURI","iconDir","length","startsWith","findImage","thing","rdf","image","trySetImage","iconForClassMap","explitImage","setAttribute","typeIcon","classIconStyle","schemeIcon","types","findTypeURIs","typeURI","setImage","pref","id","theClass","iconRef","happy","ok","faviconOrDefault","iconStyle","isOrigin","parts","res","renderDeleteConfirmPopup","refererenceElement","prompt","deleteFunction","restoreFocus","removePopup","remove","removePopupAndDoDeletion","result","then","popup","cssText","confirmPopupStyle","position","top","display","gridTemplateColumns","affirm","gridColumn","gridRow","cancel","xButton","cancelButton","cancelPrompt","buttonStyle","affirmIcon","button","sureButtonElt","addEventListener","deleteButtonWithCheck","container","noun","confirmationContainer","createPopup","focusableSelector","focusScopes","ancestor","parentElement","controls","Array","from","querySelectorAll","push","index","deleteButton","isConnected","focus","scope","Math","min","max","survivingScope","find","tabIndex","querySelector","minusIconURI","smallButtonStyle","float","title","classList","add","event","key","preventDefault","click","iconURI","text","handler","options","buttonColor","needsBorder","img","toLocaleUpperCase","onmouseover","secondaryButtonNoBorderHover","secondaryButtonHover","primaryButtonNoBorderHover","primaryButtonHover","onmouseout","secondaryButtonNoBorder","secondaryButton","primaryButtonNoBorder","primaryButton","b","opacity","continueButton","askName","predicate","Promise","resolve","_reject","form","namefield","textInputStyle","select","gotName","parentNode","trim","keyCode","_event","personTR","renderAsRow","pred","obj","tr","td1","td2","td3","nameLine","nameText","renderNameSuffix","inlineInfo","nameSuffix","renderSupportingInfo","supportingInfo","supportingLine","link","anchor","draggable","subject","createNameDiv","nameDiv","createLinkDiv","linkDiv","linkDivStyle","renderAsDiv","renderAsDivStyle","clickable","onClickFunction","wrapInATR","refreshTree","root","refresh","i","children","attachmentList","docsWaitingForRowRefresh","Set","hasAsyncEnrichedRowOptions","refreshOnDocumentLoad","deleteAttachment","target","updater","update","errorBody","_xhr","createNewRow","theTarget","opt","targetDoc","requestState","requested","shouldWaitForFetch","has","delete","modify","things","sort","syncTableToArray","attachmentTable","row","replacement","droppedURIHandler","uris","ins","forEach","u","droppedFileHandler","files","uploadFolder","theFile","destURI","promptIcon","wf","attachmentOuter","attachmentOne","attachmentLeft","attachmentRight","paperclip","fhandler","paperclipImage","buttonDiv","fileUploadButtonDiv","openHrefInOutlineMode","stopPropagation","getTarget","getAttribute","window","outlineManager","GotoSubject","panes","getOutliner","defaultAnnotationStore","hash","slash","lastIndexOf","allClassURIs","set","statementsMatching","object","rdfs","c","propertyTriage","possibleProperties","dp","op","no","nd","nu","pi","predicateIndex","termType","ps","toNT","linkButton","removeButton","selectorPanel","type","inverse","possible","callbackFunction","linkCallback","selectorPanelRefresh","list","style0","selected","innerHTML","refreshItem","item","setStyle","already","iconDiv","connectIcon","f","twoLine","widgetForClass","nav","a","twoLineDefault","twoLineWidgetForClass","widget","sup","findSuperClassesNT","cl","fromNT","twoLineTransaction","failed","enc","y","qu","escapeForXML","twoLineTrip","dc","cal","addStyleSheet","href","links","isAudio","file","isImage","isVideo","kind","dcCLasses","audio","video","what","typeURIs","prefix","mediaTypeClass","t","input","buttonElt","line","store","ns","utils.label","newPersonIconDataURI","style","uri.join","sym","utils.getTarget","debug.log","utils.escapeForXML","Util.mediaTypeClass","ns","style","fieldParams","ui","uri","size","type","dt","pattern","namedNode","uriPrefix","formGroupStyle","element","commentStyle","formHeadingStyle","ns","style","solidLogicSingleton","debug","errorMessageBlock","store","field","mostSpecificClassURI","x","kb","ft","findTypeURIs","bot","bottomTypeURIs","bots","b","push","fieldFunction","dom","fieldInQuestion","uri","fun","dom2","container","box","appendChild","store","solidLogicSingleton","ns","store","fieldParams","mostSpecificClassURI","STYLE_URI_PREFIX","setFieldStyle","ele","field","classUri","params","style","any","ui","setAttribute","termType","value","sts","statementsMatching","doc","forEach","st","predicate","uri","startsWith","cssAttribute","slice","length","object","_err","console","warn","tagName","store","ns","Literal","st","solidLogicSingleton","ns","style","styleConstants","label","errorMessageBlock","mostSpecificClassURI","fieldParams","store","renderNameValuePair","dom","kb","box","form","display","flexDirection","lhs","appendChild","createElement","width","formFieldNameBoxWidth","rhs","setAttribute","formFieldNameBoxStyle","createTextNode","any","ui","fieldLabel","property","fieldInQuestion","lab","undefined","anchor","uri","textContent","fieldStore","subject","predicate","def","sts","statementsMatching","length","updater","Error","why","value","editable","sym","basicField","container","already","doc","callbackFunction","formDoc","suppressEmptyUneditable","anyJS","params","paramStyle","inputStyle","textInputStyle","field","type","fieldType","getAttribute","toLowerCase","deferWhileFocused","size","textInputSize","maxLength","basicMaxLength","obj","uriPrefix","decodeURIComponent","replace","readOnly","textInputStyleUneditable","addEventListener","_e","pattern","match","activeElement","dataset","deferredChange","disabledForSave","disabled","ds","result","namedNode","encodeURIComponent","dt","trim","xsd","is","map","statement","updateMany","callback","docs","forEach","includes","push","update","pop","is1","filter","is2","ds1","ds2","ok","body","event","Event","bubbles","dispatchEvent","solidLogicSingleton","styleConstants","style","ns","debug","authn","store","ns","languageCodeURIBase","defaultPreferredLanguages","addDefaults","array","concat","filter","code","includes","getPreferredLanguagesFor","person","doc","fetcher","load","list","any","schema","languageCodeArray","elements","forEach","item","lang","solid","console","warn","value","startsWith","error","slice","length","push","log","join","getPreferredLanguages","me","currentUser","solidLanguagePrefs","navigator","languages","map","longForm","split","language","filterByLanguage","bindings","languagePrefs","uris","binding","uri","subject","languagePrefs2","reverse","slimmed","u","sortMe","name","index","indexOf","pair","sort","store","ns","authn","Literal","parse","store","debug","ns","defaultPreferredLanguages","getPreferredLanguages","AUTOCOMPLETE_LIMIT","subjectRegexp","wikidataClasses","Corporation","EducationalOrganization","GovernmentOrganization","MedicalOrganization","MusicGroup","NGO","Occupation","Project","ResearchOrganization","SportsOrganization","instituteDetailsWikidataQuery","fetcherOptionsJsonPublicData","credentials","headers","Headers","Accept","escoParameters","label","logo","sym","searchByNameURI","dbpediaParameters","searchByNameQuery","endpoint","dbPediaTypeMap","AcademicInsitution","wikidataOutgoingClassMap","Enterprise","Business","CharitableOrganization","Insitute","wikidataParameters","limit","insitituteDetailsQuery","wikidataIncomingClassMap","schema","variableNameToPredicateMap","targetClass","rdf","sealImage","shortName","foaf","subsidiary","city","vcard","state","country","homepage","lat","long","bindingToTerm","item","typ","type","toLowerCase","value","Error","loadFromBindings","kb","solidSubject","bindings","doc","predMap","results","log","forEach","binding","key","result","combined","JSON","stringify","Set","add","values","obj","language","datatype","warn","regexp","match","exec","float","xsd","latitude","longitude","pred","ESCOResultToBindings","json","_embedded","map","name","title","uri","subject","queryESCODataByName","filter","theClass","queryTarget","queryURI","replace","toNT","response","fetcher","webOperation","text","responseText","slice","length","fixWikidataJSON","str","syntaxProblem","indexOf","goodness","lastIndexOf","queryPublicDataByName","languages","substituteStrings","template","u1","languagePrefs","sparql","queryPublicDataSelect","err","status","text2","alert","myUrlWithParams","URL","searchParams","append","href","options","queryPublicDataConstruct","pubicId","report","loadPublicDataThing","publicDataID","startsWith","getDbpediaDetails","getWikidataDetails","iDToFetch","load","subjRegexp","getWikidataDetailsOld","getWikidataLocation","store","ns","debug","style","styleConstants","widgets","store","queryPublicDataByName","bindingToTerm","AUTOCOMPLETE_LIMIT","filterByLanguage","getPreferredLanguages","defaultPreferredLanguages","AUTOCOMPLETE_THRESHOLD","AUTOCOMPLETE_ROWS","AUTOCOMPLETE_ROWS_STRETCH","setVisible","element","visible","display","renderAutoComplete","dom","acOptions","decoration","callback","complain","message","errorRow","table","appendChild","createElement","log","err","Error","errorMessageBlock","setStyle","padding","finish","object","name","termType","queryParams","objectURIBase","sym","value","clearList","gotIt","acceptButton","disbaled","searchInput","foundName","foundObject","cancelButton","acceptButtonHandler","_event","cancelButtonHandler","permanent","initialize","div","parentNode","removeChild","nameMatch","filter","candidate","parts","split","j","length","word","toLowerCase","indexOf","children","lastChild","inputEventHHandler","refreshList","loadBindingsAndFilterByLanguage","languagePrefs","bindings","targetClass","inputEventHandlerLock","loadedEnough","lastFilter","undefined","slimmed","filterByName","binding","rowForBinding","row","setAttribute","color","allDisplayed","textContent","subject","nameTerm","addEventListener","compareBindingsByName","self","other","trim","numberOfRows","startsWith","lastBindings","displayable","slice","sort","currentObject","currentName","deleteButton","editButton","head","cell","size","textInputSize","searchInputStyle","textInputStyle","event","keyCode","widgets.errorMessageBlock","store","styleConstants","style","ns","icons","store","widgets","utils","renderAutoComplete","setVisible","WEBID_NOUN","GREEN_PLUS","iconBase","SEARCH_ICON","EDIT_ICON","renderAutocompleteControl","dom","person","barOptions","acOptions","addOneIdAndRefresh","deleteOne","autoCompleteDone","object","name","permanent","editButton","acceptButton","cancelButton","removeDecorated","greenButtonHandler","_event","webid","askName","creationArea","vcard","undefined","decoratedAutocomplete","removeChild","displayAutocomplete","createElement","setAttribute","appendChild","decoration","deleteButtonContainer","searchButtonHandler","droppedURIHandler","uris","continueButton","noun","targetClass","label","deleteButton","deleteButtonWithCheck","button","editing","syncEditingStatus","style","display","flexDirection","currentObject","editable","width","manualURIEntry","plus","idNoun","makeDropTarget","dbLookup","cancelButton","widgets.askName","store","ns","widgets.continueButton","widgets.cancelButton","utils.label","widgets.deleteButtonWithCheck","widgets.button","ns","store","widgets","style","renderAutocompleteControl","st","autocompleteField","dom","container","already","subject","form","doc","callbackFunction","addOneIdAndRefresh","result","name","Error","oldValue","kb","the","property","oldName","any","labelProperty","equals","sameTerm","deletables","statementsMatching","concat","insertables","updater","updateMany","err","box","appendChild","errorMessageBlock","deleteOne","_result","_name","e2","termType","formDoc","createElement","lhs","setAttribute","formFieldNameBoxStyle","rhs","ui","schema","dataSource","queryParams","label","anyJS","logo","targetClass","objectURIBase","undefined","endpoint","searchByNameQuery","insitituteDetailsQuery","searchByNameURI","suppressEmptyUneditable","editable","uri","autocompleteOptions","permanent","size","obj","currentObject","currentName","display","fieldLabel","barOptions","dbLookup","then","control","widgets.errorMessageBlock","store","style","ns","widgets.fieldLabel","style","multiselect__container","multiselect__wrapper","multiselect__clear_btn","multiselect__options","multiselect__options_visible","multiselect__options_ul","multiselect__options_ul_li","multiselect__options_ul_li_hover","multiselect__options_ul_p_multiselect__options_no_results","multiselect__options_ul_p_multiselect__options_no_data","multiselect__options_ul_li_multiselect__options_selected","multiselect__options_ul_li_multiselect__options_selected_hover","multiselect__options_ul_li_arrow_selected","multiselect__selected","multiselect__selected_multiselect__remove_btn","multiselect__input","setStyle","ele","styleName","style","IconicMultiSelect","_data","_domElements","_event","_itemTemplate","_multiselect","_noData","_noResults","_options","_placeholder","_select","_selectContainer","_selectedOptions","_tagTemplate","_textField","_valueField","_cross","constructor","data","itemTemplate","noData","noResults","placeholder","select","container","tagTemplate","textField","valueField","init","nodeName","length","Error","_getDataFromSettings","_getDataFromSelectTag","_renderMultiselect","_renderOptionsList","clear","querySelector","input","optionsContainer","optionsContainerList","options","list","querySelectorAll","find","callbackFn","i","node","undefined","some","_enableEventListenners","_initSelectedList","subscribe","callback","_addOptionToList","option","index","html","multiselect__selected","value","_processTemplate","text","multiselect__remove_btn","insertAdjacentHTML","lastElementChild","removeBtn","addEventListener","target","el","dataset","_handleOption","_clearSelection","classList","remove","setAttribute","multiselect__options","_removeOptionFromList","_handleClearSelectionBtn","_handlePlaceholder","_dispatchEvent","action","selection","_closeList","_filterOptions","_removeAllArrowSelected","event","document","contains","add","multiselect__options_visible","e","_handleArrows","_handleBackspace","_handleEnter","isOpen","valueLowerCase","toLowerCase","textContent","substring","appendChild","parentNode","removeChild","hasResults","_showNoResults","_generateId","result","characters","charactersLength","charAt","Math","floor","random","arr","item","push","selected","hasAttribute","isValueFieldValid","isTextFieldValid","keyCode","preventDefault","firstElementChild","multiselect__options_ul_li_arrow_selected","scrollIntoView","ArrowUp","Up","ArrowDown","Down","multiselect__options_ul_li","key","children","_scrollIntoView","lastSelectedOption","targetLastSelectedOption","display","dispatchEvent","splice","multiselect__options_selected","hasItemsSelected","template","processedTemplate","objAttr","match","map","replace","attr","className","optionDom","multiselect__options_ul","join","_showNoData","id","createElement","multiselect__container","multiselect__wrapper","multiselect__input","multiselect__clear_btn","innerHTML","parent","child","rectParent","getBoundingClientRect","rectChild","top","bottom","offsetHeight","scrollTop","clientHeight","offsetTop","condition","multiselect__options_ul_p_multiselect__options_no_data","dom","multiselect__options_ul_p_multiselect__options_no_results","buttons","fieldParams","field","mostSpecificClassURI","fieldFunction","setFieldStyle","debug","errorMessageBlock","basicField","fieldLabel","fieldStore","renderNameValuePair","autocompleteField","style","styleConstants","icons","log","ns","$rdf","store","utils","IconicMultiSelect","widgets","checkMarkCharacter","cancelCharacter","dashCharacter","kb","ui","uri","refreshOpionsSubfieldinGroup","dom","already","subject","dataDoc","callbackFunction","groupDiv","subfields","eles","children","j","length","t","optionsRender","newOne","insertBefore","removeChild","container","form","box","createElement","appendChild","key","toNT","createTextNode","already2","x","formDoc","doc","weight0","any","weight","Number","value","setAttribute","formGroupStyle","display","flexDirection","class","parts","elements","each","sortBySequence","i","subFieldFunction","itemChanged","ok","body","widget","change","dependingOn","rdf","cases","values","sameTerm","Object","keys","findTypeURIs","map","sym","c","tests","match","test","termType","the","appendForm","debugString","toString","slice","join","addItem","object","newThing","ordered","createListIfNecessary","list","push","saveListThenRefresh","toBeInserted","reverse","st","property","updater","update","err","msg","error","refresh","renderItem","deleteThisItem","splice","holds","del","message","subField","moveThisItem","event","upwards","alert","itemDone","fn","element","editable","deleteButtonWithCheck","multipleUIlabel","frame","gridTemplateColumns","gridTemplateRows","moveUpButton","button","iconBase","moveDownButton","shim","gridColumn","gridRow","padding","gridRowStart","plusIconURI","orderedNode","Node","toJS","anyJS","label","min","tail","img","title","prompt","textContent","addEventListener","_eventNotUsed","Collection","add","fetcher","putBack","vals","li","sort","syncTableToArrayReOrdered","asyncStuff","extra","then","left","width","formFieldNameBoxWidth","right","text","suppressEmptyUneditable","makeDescription","booleanField","tristate","errorBlock","lab","state","undefined","ins","buildCheckboxForm","category","checkOptions","outerBox","labelDiv","selectBox","selectElement","makeSelectForNestedCategory","querySelectorAll","selects","forEach","select","readOnly","textInputStyleUneditable","p","lhs","rhs","uiFrom","subForm","opts","disambiguate","getSelectorOptions","dataSource","possible","possibleProperties","findMembersNT","fromNT","rdfs","allClassURIs","propertyTriage","op","dp","owl","mint","multiSelect","selector","selectedOptions","possibleOptions","sortByLabel","makeSelectForChoice","innerHTML","multiSelectDiv","placeholder","selected","textField","valueField","init","subscribe","action","filter","stringValue","includes","newObject","is","addSubFormChoice","success","errorBody","selectDiv","_callbackFunction","contents","params","suppressIfUneditable","editFormButton","b","_e","ff","parentNode","propertiesForClass","explicit","dc","foaf","members","used","statementsMatching","predicate","result","findClosest","cla","prop","agenda","shift","lists","supers","formsFor","t1","bottom","bottomTypeURIs","candidates","concat","k","a","pair","toLowerCase","newButton","theClass","promptForNew","outlineManager","GotoSubject","formBorderColor","formFunction","gotButton","insertMe","linkDone","linkButton","info","f","rb","removeButton","AJAR_subject","group","desc","rows","split","cols","multilineTextInputStyle","v","saveChange","submit","disabled","color","textInputColorPending","ds","textInputColor","continueButton","visibility","float","backgroundColor","textInputBackgroundColorUneditable","makeSelectForClassifierOptions","options","n","uris","sub","warn","actual","getActual","onChange","removeValue","opt","AJAR_mint","mintClass","thisForm","mintStatementsFun","AJAR_uri","currentURI","sel","subSelect","superSelect","doneNew","_body","formSelectStyle","multiple","option","labelWithOntology","firstChild","nullLabel","makeSelectForOptions","makeSelectForCategory","du","subs","child","input","colorCarrier","checkboxInputStyle","fix","why","Array","Error","holdsAll","missing","displayState","negation","defa","true","false","null","isUpdating","boxHandler","didFinishUpdate","finishUpdate","showUpdateError","newState","toDelete","toInsert","updateResult","hmmm","catch","finally","now","Date","getTime","inputPossibleOptions","optionsFromClassUIfrom","isEmpty","createDefaultSelectOptionText","firstSelectOptionText","createDefaultSelectOption","hidden","lastChild","createOption","newSelectedOptions","addValue","existingValues","containsObject","removeAttribute","obj","thisClass","quad","len2","len4","m","pred","ref1","ref2","ref3","ref4","ref5","u","seeds","ref","transitiveClosure","rdfFactory","namedNode","len","l","len1","q","len3","store","ns","style","$rdf.sym","$rdf.st","buttons.button","utils.label","$rdf.Collection","styleConstants","buttons.allClassURIs","buttons.propertyTriage","buttons.linkButton","buttons.removeButton","widgets.continueButton","utils.labelWithOntology","widgets.errorMessageBlock","label","publicData","st","parse","__esmMin","node_default","literal","ns_default","Collection","join","Literal","__toCommonJS","__exportAll","__toESM","c","namedNode","__commonJSMin","k","D","mediaTypeClass","getTarget","syncTableToArrayReOrdered","debug","escapeForXML","styleConstants_default","labelWithOntology","info","syncTableToArray","style$1","label","log","args","warn","error","trace","require_escape_html","matchHtmlRegExp","escapeHtml","str","string","match","escape","html","index","lastIndex","byteToHex","i","unsafeStringify","arr","offset","rnds8","rng","v4","buf","options","_v4","rnds","db_exports","db_default","init_db","\"source\"","\"charset\"","\"compressible\"","\"extensions\"","require_mime_db","require_path_browserify","assertPath","path","normalizeStringPosix","res","lastSegmentLength","lastSlash","dots","code","lastSlashIndex","allowAboveRoot","_format","dir","pathObject","base","sep","posix","resolvedPath","resolvedAbsolute","cwd","isAbsolute","trailingSeparator","joined","arg","from","to","fromStart","fromEnd","fromLen","toStart","toLen","length","lastCommonSep","fromCode","out","hasRoot","end","matchedSlash","ext","start","extIdx","firstNonSlashEnd","startDot","startPart","preDotState","ret","require_mimeScore","FACET_SCORES","SOURCE_SCORES","TYPE_SCORES","mimeType","type","subtype","facetScore","sourceScore","source","typeScore","lengthScore","import_mime_types","db","extname","mimeScore","EXTRACT_TYPE_REGEXP","TEXT_TYPE_REGEXP","charset","contentType","extension","lookup","populateMaps","exports","mime","exts","_preferredType","types","legacyType","_preferredTypeLegacy","type0","type1","SOURCE_RANK","score0","score1","makeDropTarget","normalizeDroppedUris","uriText","uri","dragoverListener","dragenterListener","dragleaveListener","dropListener","uris","text","droppedFileHandler","files","f","trimmedText","droppedURIHandler","ele","makeDraggable","tr","e","obj","uploadFiles","describeUploadFailure","status","message","prefix","destURI","reader","data","suffix","theFile","msg","folderName","imageBase","fileBase","successHandler","errorMessageBlock","div","dom","errorObject","err2","err","cancelButton","backgroundColor","iconsOnGithub","icons","iconBase$1","import_escape_html","kb$1","PeoplePicker","element","typeIndex","groupPickedCb","container","selectedGroup","Group","changeGroupButton","chooseExistingGroupButton","GroupPicker","book","createNewGroupButton","GroupBuilder","group","errorBody","ok","reject","bookRegistration","resolve","errr","indexes","groupContainer","name","defaultNewGroupName","patchPromises","groupIndex","typeStatement","doc","nameStatement","includesGroupStatement","toIns","patch","onSelectGroup","groups","groupButton","getWithDefault","groupChangedCb","changeType","agent","doneBuildingCb","dropContainer","groupNameInput","event","groupNameLabel","webIdNode","statement","personDiv","Person","copy","doneBuildingButton","webId","rdfClass","errorMessage","updatePromises","oldNameStatements","namedGraph","newNameStatement","handleRemove","imgSrc","profileImg","nameSpan","removeButton","object","subject","predicate","defaultValue","toDel","success","newperson_default","wrapDivInATR","addClickListenerToElement","onClickFunction","createImageDiv","imageDiv","image","iconlucidesquarearrowoutupright","linkIcon","anchor","iconURI","img","icon","createLinkForURI","iconLink","linkDiv","cancelIconURI","iconBase","checkIconURI","getStatusArea","box","context","body","complain","clearElement","extractLogURI","logPos","fullURI","rulPos","shortDate","month","nowZ","noTime","formatDateTime","format","s","date","timestamp","shortTime","setName","kb","findName","x","imagesOf","iconForClass","tempSite","p","q","findImageFromURI","iconDir","findImage","thing","trySetImage","explitImage","typeIcon","iconForClassMap","schemeIcon","typeURI","setImage","pref","id","theClass","iconRef","faviconOrDefault","parts","renderDeleteConfirmPopup","removePopup","refererenceElement","restoreFocus","removePopupAndDoDeletion","result","deleteFunction","popup","affirm","cancel","xButton","cancelPrompt","affirmIcon","button","sureButtonElt","prompt","deleteButtonWithCheck","createPopup","focusableSelector","focusScopes","confirmationContainer","ancestor","controls","deleteButton","scope","survivingScope","minusIconURI","noun","handler","b","continueButton","askName","form","namefield","gotName","personTR","renderAsRow","td1","td2","td3","nameLine","nameText","inlineInfo","nameSuffix","supportingInfo","supportingLine","createNameDiv","nameDiv","title","createLinkDiv","renderAsDiv","refreshTree","root","attachmentList","docsWaitingForRowRefresh","hasAsyncEnrichedRowOptions","refreshOnDocumentLoad","deleteAttachment","updater","target","refresh","createNewRow","theTarget","opt","targetDoc","requestState","shouldWaitForFetch","modify","things","attachmentTable","ins","u","promptIcon","attachmentOuter","attachmentOne","attachmentLeft","paperclip","fhandler","paperclipImage","buttonDiv","fileUploadButtonDiv","openHrefInOutlineMode","defaultAnnotationStore","hash","slash","allClassURIs","set","propertyTriage","possibleProperties","dp","op","no","nd","nu","pi","ps","linkButton","selectorPanel","selectorPanelRefresh","inverse","possible","callbackFunction","linkCallback","style0","selected","refreshItem","item","setStyle","already","iconDiv","nav","a","list","twoLineDefault","twoLineWidgetForClass","widget","sup","cl","twoLineTransaction","failed","enc","y","twoLineTrip","addStyleSheet","links","href","link","isAudio","isImage","file","isVideo","dcCLasses","what","kind","typeURIs","t","input","fieldParams","store$1","field","mostSpecificClassURI","ft","bot","bots","fieldFunction","fieldInQuestion","fun","dom2","STYLE_URI_PREFIX","setFieldStyle","params","style","cssAttribute","store","renderNameValuePair","lhs","rhs","fieldLabel","lab","property","fieldStore","sts","def","basicField","formDoc","suppressEmptyUneditable","paramStyle","inputStyle","fieldType","deferWhileFocused","size","maxLength","disabledForSave","ds","is","updateMany","docs","callback","is1","is2","ds1","ds2","language_exports","addDefaults","defaultPreferredLanguages","filterByLanguage","getPreferredLanguages","getPreferredLanguagesFor","languageCodeURIBase","array","person","languageCodeArray","lang","me","solidLanguagePrefs","longForm","binding","languagePrefs2","languagePrefs","slimmed","sortMe","bindings","publicData_exports","ESCOResultToBindings","bindingToTerm","dbPediaTypeMap","dbpediaParameters","escoParameters","fetcherOptionsJsonPublicData","getDbpediaDetails","getWikidataDetails","getWikidataDetailsOld","getWikidataLocation","instituteDetailsWikidataQuery","loadFromBindings","loadPublicDataThing","queryESCODataByName","queryPublicDataByName","queryPublicDataConstruct","queryPublicDataSelect","variableNameToPredicateMap","wikidataClasses","wikidataIncomingClassMap","wikidataOutgoingClassMap","wikidataParameters","subjectRegexp","typ","results","solidSubject","key","combined","values","value","float","latitude","longitude","pred","predMap","json","queryTarget","limit","queryURI","filter","fixWikidataJSON","syntaxProblem","goodness","substituteStrings","template","language","sparql","response","text2","myUrlWithParams","headers","pubicId","publicDataID","iDToFetch","AUTOCOMPLETE_THRESHOLD","AUTOCOMPLETE_ROWS","AUTOCOMPLETE_ROWS_STRETCH","setVisible","visible","renderAutoComplete","errorRow","table","finish","acOptions","clearList","gotIt","decoration","acceptButtonHandler","foundName","searchInput","foundObject","cancelButtonHandler","initialize","nameMatch","j","word","candidate","inputEventHHandler","refreshList","loadBindingsAndFilterByLanguage","targetClass","lastFilter","loadedEnough","filterByName","rowForBinding","row","allDisplayed","nameTerm","compareBindingsByName","other","self","inputEventHandlerLock","lastBindings","numberOfRows","displayable","head","searchInputStyle","WEBID_NOUN","GREEN_PLUS","SEARCH_ICON","EDIT_ICON","renderAutocompleteControl","autoCompleteDone","editButton","acceptButton","cancelButton$1","removeDecorated","addOneIdAndRefresh","greenButtonHandler","webid","creationArea","decoratedAutocomplete","displayAutocomplete","deleteButtonContainer","searchButtonHandler","deleteOne","editing","syncEditingStatus","barOptions","autocompleteField","oldValue","oldName","labelProperty","deletables","insertables","e2","dataSource","queryParams","endpoint","searchByNameURI","editable","autocompleteOptions","control","styleName","IconicMultiSelect","itemTemplate","noData","noResults","placeholder","select","tagTemplate","textField","valueField","node","callbackFn","option","removeBtn","el","isOpen","valueLowerCase","hasResults","isValueFieldValid","isTextFieldValid","optionsContainerList","action","lastSelectedOption","targetLastSelectedOption","dispatchEvent","hasItemsSelected","processedTemplate","objAttr","attr","className","optionDom","rectParent","parent","rectChild","child","condition","checkMarkCharacter","cancelCharacter","dashCharacter","refreshOpionsSubfieldinGroup","eles","groupDiv","subfields","newOne","dataDoc","ui","already2","weight0","weight","sortBySequence","subFieldFunction","dependingOn","cases","tests","test","debugString","addItem","newThing","ordered","createListIfNecessary","saveListThenRefresh","toBeInserted","reverse","renderItem","deleteThisItem","del","subField","moveThisItem","upwards","itemDone","multipleUIlabel","frame","moveUpButton","moveDownButton","shim","plusIconURI","orderedNode","min","tail","vals","li","asyncStuff","extra","left","right","makeDescription","booleanField","errorBlock","state","buildCheckboxForm","tristate","category","checkOptions","outerBox","labelDiv","selectBox","selectElement","makeSelectForNestedCategory","selects","uiFrom","subForm","opts","getSelectorOptions","findMembersNT","multiSelect","selector","selectedOptions","possibleOptions","sortByLabel","makeSelectForChoice","multiSelectDiv","newObject","addSubFormChoice","selectDiv","contents","suppressIfUneditable","editFormButton","appendForm","propertiesForClass","explicit","members","used","findClosest","agenda","cla","lists","prop","supers","formsFor","t1","bottom","candidates","pair","newButton","promptForNew","formFunction","gotButton","insertMe","linkDone","desc","v","saveChange","submit","makeSelectForClassifierOptions","n","sub","actual","getActual","onChange","removeValue","thisForm","sel","doneNew","mint","makeSelectForOptions","makeSelectForCategory","du","subs","multiple","update","colorCarrier","fix","holdsAll","displayState","negation","defa","isUpdating","didFinishUpdate","finishUpdate","showUpdateError","toDelete","toInsert","updateResult","now","optionsFromClassUIfrom","inputPossibleOptions","createDefaultSelectOptionText","firstSelectOptionText","createDefaultSelectOption","createOption","newSelectedOptions","addValue","existingValues","containsObject","label$1","len2","len4","m","ref1","ref2","ref3","ref4","ref5","seeds","thisClass","ref","quad","len","l","len1","len3","widgets_exports"],"sources":["../../src/lib/debug.ts","../../node_modules/escape-html/index.js","../../node_modules/uuid/dist/stringify.js","../../node_modules/uuid/dist/rng.js","../../node_modules/uuid/dist/v4.js","../../node_modules/mime-db/db.json","../../node_modules/mime-db/index.js","../../node_modules/path-browserify/index.js","../../node_modules/mime-types/mimeScore.js","../../node_modules/mime-types/index.js","../../src/widgets/dragAndDrop.js","../../src/widgets/error.ts","../../src/lib/iconBase.ts","../../src/widgets/peoplePicker.js","../../src/lib/newperson.js","../../src/widgets/widgetHelpers.ts","../../src/widgets/buttons/iconLinks.ts","../../src/widgets/buttons.ts","../../src/widgets/forms/fieldParams.ts","../../src/widgets/forms/fieldFunction.ts","../../src/widgets/forms/formStyle.ts","../../src/widgets/forms/basic.ts","../../src/widgets/forms/autocomplete/language.ts","../../src/widgets/forms/autocomplete/publicData.ts","../../src/widgets/forms/autocomplete/autocompletePicker.ts","../../src/widgets/forms/autocomplete/autocompleteBar.ts","../../src/widgets/forms/autocomplete/autocompleteField.ts","../../src/lib/style_multiSelect.js","../../src/widgets/multiSelect.js","../../src/widgets/forms.js","../../src/widgets/index.js"],"sourcesContent":["export function log (...args: any[]) {\n console.log(...args)\n}\n\nexport function warn (...args: any[]) {\n console.warn(...args)\n}\n\nexport function error (...args: any[]) {\n console.error(...args)\n}\n\nexport function trace (...args: any[]) {\n console.trace(...args)\n}\n","/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","const rnds8 = new Uint8Array(16);\nexport default function rng() {\n return crypto.getRandomValues(rnds8);\n}\n","import rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (!buf && !options && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return _v4(options, buf, offset);\n}\nfunction _v4(options, buf, offset) {\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n","{\n \"application/1d-interleaved-parityfec\": {\n \"source\": \"iana\"\n },\n \"application/3gpdash-qoe-report+xml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true\n },\n \"application/3gpp-ims+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/3gpphal+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/3gpphalforms+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/a2l\": {\n \"source\": \"iana\"\n },\n \"application/ace+cbor\": {\n \"source\": \"iana\"\n },\n \"application/ace+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/ace-groupcomm+cbor\": {\n \"source\": \"iana\"\n },\n \"application/ace-trl+cbor\": {\n \"source\": \"iana\"\n },\n \"application/activemessage\": {\n \"source\": \"iana\"\n },\n \"application/activity+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/aif+cbor\": {\n \"source\": \"iana\"\n },\n \"application/aif+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-cdni+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-cdnifilter+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-costmap+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-costmapfilter+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-directory+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-endpointcost+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-endpointcostparams+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-endpointprop+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-endpointpropparams+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-error+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-networkmap+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-networkmapfilter+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-propmap+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-propmapparams+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-tips+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-tipsparams+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-updatestreamcontrol+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-updatestreamparams+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/aml\": {\n \"source\": \"iana\"\n },\n \"application/andrew-inset\": {\n \"source\": \"iana\",\n \"extensions\": [\"ez\"]\n },\n \"application/appinstaller\": {\n \"compressible\": false,\n \"extensions\": [\"appinstaller\"]\n },\n \"application/applefile\": {\n \"source\": \"iana\"\n },\n \"application/applixware\": {\n \"source\": \"apache\",\n \"extensions\": [\"aw\"]\n },\n \"application/appx\": {\n \"compressible\": false,\n \"extensions\": [\"appx\"]\n },\n \"application/appxbundle\": {\n \"compressible\": false,\n \"extensions\": [\"appxbundle\"]\n },\n \"application/at+jwt\": {\n \"source\": \"iana\"\n },\n \"application/atf\": {\n \"source\": \"iana\"\n },\n \"application/atfx\": {\n \"source\": \"iana\"\n },\n \"application/atom+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"atom\"]\n },\n \"application/atomcat+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"atomcat\"]\n },\n \"application/atomdeleted+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"atomdeleted\"]\n },\n \"application/atomicmail\": {\n \"source\": \"iana\"\n },\n \"application/atomsvc+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"atomsvc\"]\n },\n \"application/atsc-dwd+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"dwd\"]\n },\n \"application/atsc-dynamic-event-message\": {\n \"source\": \"iana\"\n },\n \"application/atsc-held+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"held\"]\n },\n \"application/atsc-rdt+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/atsc-rsat+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"rsat\"]\n },\n \"application/atxml\": {\n \"source\": \"iana\"\n },\n \"application/auth-policy+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/automationml-aml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"aml\"]\n },\n \"application/automationml-amlx+zip\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"amlx\"]\n },\n \"application/bacnet-xdd+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/batch-smtp\": {\n \"source\": \"iana\"\n },\n \"application/bdoc\": {\n \"compressible\": false,\n \"extensions\": [\"bdoc\"]\n },\n \"application/beep+xml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true\n },\n \"application/bufr\": {\n \"source\": \"iana\"\n },\n \"application/c2pa\": {\n \"source\": \"iana\"\n },\n \"application/calendar+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/calendar+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xcs\"]\n },\n \"application/call-completion\": {\n \"source\": \"iana\"\n },\n \"application/cals-1840\": {\n \"source\": \"iana\"\n },\n \"application/captive+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/cbor\": {\n \"source\": \"iana\"\n },\n \"application/cbor-seq\": {\n \"source\": \"iana\"\n },\n \"application/cccex\": {\n \"source\": \"iana\"\n },\n \"application/ccmp+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/ccxml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"ccxml\"]\n },\n \"application/cda+xml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true\n },\n \"application/cdfx+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"cdfx\"]\n },\n \"application/cdmi-capability\": {\n \"source\": \"iana\",\n \"extensions\": [\"cdmia\"]\n },\n \"application/cdmi-container\": {\n \"source\": \"iana\",\n \"extensions\": [\"cdmic\"]\n },\n \"application/cdmi-domain\": {\n \"source\": \"iana\",\n \"extensions\": [\"cdmid\"]\n },\n \"application/cdmi-object\": {\n \"source\": \"iana\",\n \"extensions\": [\"cdmio\"]\n },\n \"application/cdmi-queue\": {\n \"source\": \"iana\",\n \"extensions\": [\"cdmiq\"]\n },\n \"application/cdni\": {\n \"source\": \"iana\"\n },\n \"application/ce+cbor\": {\n \"source\": \"iana\"\n },\n \"application/cea\": {\n \"source\": \"iana\"\n },\n \"application/cea-2018+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/cellml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/cfw\": {\n \"source\": \"iana\"\n },\n \"application/cid-edhoc+cbor-seq\": {\n \"source\": \"iana\"\n },\n \"application/city+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/city+json-seq\": {\n \"source\": \"iana\"\n },\n \"application/clr\": {\n \"source\": \"iana\"\n },\n \"application/clue+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/clue_info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/cms\": {\n \"source\": \"iana\"\n },\n \"application/cnrp+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/coap-eap\": {\n \"source\": \"iana\"\n },\n \"application/coap-group+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/coap-payload\": {\n \"source\": \"iana\"\n },\n \"application/commonground\": {\n \"source\": \"iana\"\n },\n \"application/concise-problem-details+cbor\": {\n \"source\": \"iana\"\n },\n \"application/conference-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/cose\": {\n \"source\": \"iana\"\n },\n \"application/cose-key\": {\n \"source\": \"iana\"\n },\n \"application/cose-key-set\": {\n \"source\": \"iana\"\n },\n \"application/cose-x509\": {\n \"source\": \"iana\"\n },\n \"application/cpl+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"cpl\"]\n },\n \"application/csrattrs\": {\n \"source\": \"iana\"\n },\n \"application/csta+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/cstadata+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/csvm+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/cu-seeme\": {\n \"source\": \"apache\",\n \"extensions\": [\"cu\"]\n },\n \"application/cwl\": {\n \"source\": \"iana\",\n \"extensions\": [\"cwl\"]\n },\n \"application/cwl+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/cwl+yaml\": {\n \"source\": \"iana\"\n },\n \"application/cwt\": {\n \"source\": \"iana\"\n },\n \"application/cybercash\": {\n \"source\": \"iana\"\n },\n \"application/dart\": {\n \"compressible\": true\n },\n \"application/dash+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"mpd\"]\n },\n \"application/dash-patch+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"mpp\"]\n },\n \"application/dashdelta\": {\n \"source\": \"iana\"\n },\n \"application/davmount+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"davmount\"]\n },\n \"application/dca-rft\": {\n \"source\": \"iana\"\n },\n \"application/dcd\": {\n \"source\": \"iana\"\n },\n \"application/dec-dx\": {\n \"source\": \"iana\"\n },\n \"application/dialog-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/dicom\": {\n \"source\": \"iana\",\n \"extensions\": [\"dcm\"]\n },\n \"application/dicom+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/dicom+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/dii\": {\n \"source\": \"iana\"\n },\n \"application/dit\": {\n \"source\": \"iana\"\n },\n \"application/dns\": {\n \"source\": \"iana\"\n },\n \"application/dns+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/dns-message\": {\n \"source\": \"iana\"\n },\n \"application/docbook+xml\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"dbk\"]\n },\n \"application/dots+cbor\": {\n \"source\": \"iana\"\n },\n \"application/dpop+jwt\": {\n \"source\": \"iana\"\n },\n \"application/dskpp+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/dssc+der\": {\n \"source\": \"iana\",\n \"extensions\": [\"dssc\"]\n },\n \"application/dssc+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xdssc\"]\n },\n \"application/dvcs\": {\n \"source\": \"iana\"\n },\n \"application/eat+cwt\": {\n \"source\": \"iana\"\n },\n \"application/eat+jwt\": {\n \"source\": \"iana\"\n },\n \"application/eat-bun+cbor\": {\n \"source\": \"iana\"\n },\n \"application/eat-bun+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/eat-ucs+cbor\": {\n \"source\": \"iana\"\n },\n \"application/eat-ucs+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/ecmascript\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"ecma\"]\n },\n \"application/edhoc+cbor-seq\": {\n \"source\": \"iana\"\n },\n \"application/edi-consent\": {\n \"source\": \"iana\"\n },\n \"application/edi-x12\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/edifact\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/efi\": {\n \"source\": \"iana\"\n },\n \"application/elm+json\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true\n },\n \"application/elm+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/emergencycalldata.cap+xml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true\n },\n \"application/emergencycalldata.comment+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/emergencycalldata.control+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/emergencycalldata.deviceinfo+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/emergencycalldata.ecall.msd\": {\n \"source\": \"iana\"\n },\n \"application/emergencycalldata.legacyesn+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/emergencycalldata.providerinfo+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/emergencycalldata.serviceinfo+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/emergencycalldata.subscriberinfo+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/emergencycalldata.veds+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/emma+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"emma\"]\n },\n \"application/emotionml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"emotionml\"]\n },\n \"application/encaprtp\": {\n \"source\": \"iana\"\n },\n \"application/entity-statement+jwt\": {\n \"source\": \"iana\"\n },\n \"application/epp+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/epub+zip\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"epub\"]\n },\n \"application/eshop\": {\n \"source\": \"iana\"\n },\n \"application/exi\": {\n \"source\": \"iana\",\n \"extensions\": [\"exi\"]\n },\n \"application/expect-ct-report+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/express\": {\n \"source\": \"iana\",\n \"extensions\": [\"exp\"]\n },\n \"application/fastinfoset\": {\n \"source\": \"iana\"\n },\n \"application/fastsoap\": {\n \"source\": \"iana\"\n },\n \"application/fdf\": {\n \"source\": \"iana\",\n \"extensions\": [\"fdf\"]\n },\n \"application/fdt+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"fdt\"]\n },\n \"application/fhir+json\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true\n },\n \"application/fhir+xml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true\n },\n \"application/fido.trusted-apps+json\": {\n \"compressible\": true\n },\n \"application/fits\": {\n \"source\": \"iana\"\n },\n \"application/flexfec\": {\n \"source\": \"iana\"\n },\n \"application/font-sfnt\": {\n \"source\": \"iana\"\n },\n \"application/font-tdpfr\": {\n \"source\": \"iana\",\n \"extensions\": [\"pfr\"]\n },\n \"application/font-woff\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/framework-attributes+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/geo+json\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"geojson\"]\n },\n \"application/geo+json-seq\": {\n \"source\": \"iana\"\n },\n \"application/geopackage+sqlite3\": {\n \"source\": \"iana\"\n },\n \"application/geopose+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/geoxacml+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/geoxacml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/gltf-buffer\": {\n \"source\": \"iana\"\n },\n \"application/gml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"gml\"]\n },\n \"application/gnap-binding-jws\": {\n \"source\": \"iana\"\n },\n \"application/gnap-binding-jwsd\": {\n \"source\": \"iana\"\n },\n \"application/gnap-binding-rotation-jws\": {\n \"source\": \"iana\"\n },\n \"application/gnap-binding-rotation-jwsd\": {\n \"source\": \"iana\"\n },\n \"application/gpx+xml\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"gpx\"]\n },\n \"application/grib\": {\n \"source\": \"iana\"\n },\n \"application/gxf\": {\n \"source\": \"apache\",\n \"extensions\": [\"gxf\"]\n },\n \"application/gzip\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"gz\"]\n },\n \"application/h224\": {\n \"source\": \"iana\"\n },\n \"application/held+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/hjson\": {\n \"extensions\": [\"hjson\"]\n },\n \"application/hl7v2+xml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true\n },\n \"application/http\": {\n \"source\": \"iana\"\n },\n \"application/hyperstudio\": {\n \"source\": \"iana\",\n \"extensions\": [\"stk\"]\n },\n \"application/ibe-key-request+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/ibe-pkg-reply+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/ibe-pp-data\": {\n \"source\": \"iana\"\n },\n \"application/iges\": {\n \"source\": \"iana\"\n },\n \"application/im-iscomposing+xml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true\n },\n \"application/index\": {\n \"source\": \"iana\"\n },\n \"application/index.cmd\": {\n \"source\": \"iana\"\n },\n \"application/index.obj\": {\n \"source\": \"iana\"\n },\n \"application/index.response\": {\n \"source\": \"iana\"\n },\n \"application/index.vnd\": {\n \"source\": \"iana\"\n },\n \"application/inkml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"ink\",\"inkml\"]\n },\n \"application/iotp\": {\n \"source\": \"iana\"\n },\n \"application/ipfix\": {\n \"source\": \"iana\",\n \"extensions\": [\"ipfix\"]\n },\n \"application/ipp\": {\n \"source\": \"iana\"\n },\n \"application/isup\": {\n \"source\": \"iana\"\n },\n \"application/its+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"its\"]\n },\n \"application/java-archive\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"jar\",\"war\",\"ear\"]\n },\n \"application/java-serialized-object\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"ser\"]\n },\n \"application/java-vm\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"class\"]\n },\n \"application/javascript\": {\n \"source\": \"apache\",\n \"charset\": \"UTF-8\",\n \"compressible\": true,\n \"extensions\": [\"js\"]\n },\n \"application/jf2feed+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/jose\": {\n \"source\": \"iana\"\n },\n \"application/jose+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/jrd+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/jscalendar+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/jscontact+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/json\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true,\n \"extensions\": [\"json\",\"map\"]\n },\n \"application/json-patch+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/json-seq\": {\n \"source\": \"iana\"\n },\n \"application/json5\": {\n \"extensions\": [\"json5\"]\n },\n \"application/jsonml+json\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"jsonml\"]\n },\n \"application/jsonpath\": {\n \"source\": \"iana\"\n },\n \"application/jwk+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/jwk-set+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/jwk-set+jwt\": {\n \"source\": \"iana\"\n },\n \"application/jwt\": {\n \"source\": \"iana\"\n },\n \"application/kpml-request+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/kpml-response+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/ld+json\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"jsonld\"]\n },\n \"application/lgr+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"lgr\"]\n },\n \"application/link-format\": {\n \"source\": \"iana\"\n },\n \"application/linkset\": {\n \"source\": \"iana\"\n },\n \"application/linkset+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/load-control+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/logout+jwt\": {\n \"source\": \"iana\"\n },\n \"application/lost+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"lostxml\"]\n },\n \"application/lostsync+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/lpf+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/lxf\": {\n \"source\": \"iana\"\n },\n \"application/mac-binhex40\": {\n \"source\": \"iana\",\n \"extensions\": [\"hqx\"]\n },\n \"application/mac-compactpro\": {\n \"source\": \"apache\",\n \"extensions\": [\"cpt\"]\n },\n \"application/macwriteii\": {\n \"source\": \"iana\"\n },\n \"application/mads+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"mads\"]\n },\n \"application/manifest+json\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true,\n \"extensions\": [\"webmanifest\"]\n },\n \"application/marc\": {\n \"source\": \"iana\",\n \"extensions\": [\"mrc\"]\n },\n \"application/marcxml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"mrcx\"]\n },\n \"application/mathematica\": {\n \"source\": \"iana\",\n \"extensions\": [\"ma\",\"nb\",\"mb\"]\n },\n \"application/mathml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"mathml\"]\n },\n \"application/mathml-content+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/mathml-presentation+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/mbms-associated-procedure-description+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/mbms-deregister+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/mbms-envelope+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/mbms-msk+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/mbms-msk-response+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/mbms-protection-description+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/mbms-reception-report+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/mbms-register+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/mbms-register-response+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/mbms-schedule+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/mbms-user-service-description+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/mbox\": {\n \"source\": \"iana\",\n \"extensions\": [\"mbox\"]\n },\n \"application/media-policy-dataset+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"mpf\"]\n },\n \"application/media_control+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/mediaservercontrol+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"mscml\"]\n },\n \"application/merge-patch+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/metalink+xml\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"metalink\"]\n },\n \"application/metalink4+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"meta4\"]\n },\n \"application/mets+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"mets\"]\n },\n \"application/mf4\": {\n \"source\": \"iana\"\n },\n \"application/mikey\": {\n \"source\": \"iana\"\n },\n \"application/mipc\": {\n \"source\": \"iana\"\n },\n \"application/missing-blocks+cbor-seq\": {\n \"source\": \"iana\"\n },\n \"application/mmt-aei+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"maei\"]\n },\n \"application/mmt-usd+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"musd\"]\n },\n \"application/mods+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"mods\"]\n },\n \"application/moss-keys\": {\n \"source\": \"iana\"\n },\n \"application/moss-signature\": {\n \"source\": \"iana\"\n },\n \"application/mosskey-data\": {\n \"source\": \"iana\"\n },\n \"application/mosskey-request\": {\n \"source\": \"iana\"\n },\n \"application/mp21\": {\n \"source\": \"iana\",\n \"extensions\": [\"m21\",\"mp21\"]\n },\n \"application/mp4\": {\n \"source\": \"iana\",\n \"extensions\": [\"mp4\",\"mpg4\",\"mp4s\",\"m4p\"]\n },\n \"application/mpeg4-generic\": {\n \"source\": \"iana\"\n },\n \"application/mpeg4-iod\": {\n \"source\": \"iana\"\n },\n \"application/mpeg4-iod-xmt\": {\n \"source\": \"iana\"\n },\n \"application/mrb-consumer+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/mrb-publish+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/msc-ivr+xml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true\n },\n \"application/msc-mixer+xml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true\n },\n \"application/msix\": {\n \"compressible\": false,\n \"extensions\": [\"msix\"]\n },\n \"application/msixbundle\": {\n \"compressible\": false,\n \"extensions\": [\"msixbundle\"]\n },\n \"application/msword\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"doc\",\"dot\"]\n },\n \"application/mud+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/multipart-core\": {\n \"source\": \"iana\"\n },\n \"application/mxf\": {\n \"source\": \"iana\",\n \"extensions\": [\"mxf\"]\n },\n \"application/n-quads\": {\n \"source\": \"iana\",\n \"extensions\": [\"nq\"]\n },\n \"application/n-triples\": {\n \"source\": \"iana\",\n \"extensions\": [\"nt\"]\n },\n \"application/nasdata\": {\n \"source\": \"iana\"\n },\n \"application/news-checkgroups\": {\n \"source\": \"iana\",\n \"charset\": \"US-ASCII\"\n },\n \"application/news-groupinfo\": {\n \"source\": \"iana\",\n \"charset\": \"US-ASCII\"\n },\n \"application/news-transmission\": {\n \"source\": \"iana\"\n },\n \"application/nlsml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/node\": {\n \"source\": \"iana\",\n \"extensions\": [\"cjs\"]\n },\n \"application/nss\": {\n \"source\": \"iana\"\n },\n \"application/oauth-authz-req+jwt\": {\n \"source\": \"iana\"\n },\n \"application/oblivious-dns-message\": {\n \"source\": \"iana\"\n },\n \"application/ocsp-request\": {\n \"source\": \"iana\"\n },\n \"application/ocsp-response\": {\n \"source\": \"iana\"\n },\n \"application/octet-stream\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"bin\",\"dms\",\"lrf\",\"mar\",\"so\",\"dist\",\"distz\",\"pkg\",\"bpk\",\"dump\",\"elc\",\"deploy\",\"exe\",\"dll\",\"deb\",\"dmg\",\"iso\",\"img\",\"msi\",\"msp\",\"msm\",\"buffer\"]\n },\n \"application/oda\": {\n \"source\": \"iana\",\n \"extensions\": [\"oda\"]\n },\n \"application/odm+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/odx\": {\n \"source\": \"iana\"\n },\n \"application/oebps-package+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"opf\"]\n },\n \"application/ogg\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"ogx\"]\n },\n \"application/ohttp-keys\": {\n \"source\": \"iana\"\n },\n \"application/omdoc+xml\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"omdoc\"]\n },\n \"application/onenote\": {\n \"source\": \"apache\",\n \"extensions\": [\"onetoc\",\"onetoc2\",\"onetmp\",\"onepkg\",\"one\",\"onea\"]\n },\n \"application/opc-nodeset+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/oscore\": {\n \"source\": \"iana\"\n },\n \"application/oxps\": {\n \"source\": \"iana\",\n \"extensions\": [\"oxps\"]\n },\n \"application/p21\": {\n \"source\": \"iana\"\n },\n \"application/p21+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/p2p-overlay+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"relo\"]\n },\n \"application/parityfec\": {\n \"source\": \"iana\"\n },\n \"application/passport\": {\n \"source\": \"iana\"\n },\n \"application/patch-ops-error+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xer\"]\n },\n \"application/pdf\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"pdf\"]\n },\n \"application/pdx\": {\n \"source\": \"iana\"\n },\n \"application/pem-certificate-chain\": {\n \"source\": \"iana\"\n },\n \"application/pgp-encrypted\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"pgp\"]\n },\n \"application/pgp-keys\": {\n \"source\": \"iana\",\n \"extensions\": [\"asc\"]\n },\n \"application/pgp-signature\": {\n \"source\": \"iana\",\n \"extensions\": [\"sig\",\"asc\"]\n },\n \"application/pics-rules\": {\n \"source\": \"apache\",\n \"extensions\": [\"prf\"]\n },\n \"application/pidf+xml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true\n },\n \"application/pidf-diff+xml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true\n },\n \"application/pkcs10\": {\n \"source\": \"iana\",\n \"extensions\": [\"p10\"]\n },\n \"application/pkcs12\": {\n \"source\": \"iana\"\n },\n \"application/pkcs7-mime\": {\n \"source\": \"iana\",\n \"extensions\": [\"p7m\",\"p7c\"]\n },\n \"application/pkcs7-signature\": {\n \"source\": \"iana\",\n \"extensions\": [\"p7s\"]\n },\n \"application/pkcs8\": {\n \"source\": \"iana\",\n \"extensions\": [\"p8\"]\n },\n \"application/pkcs8-encrypted\": {\n \"source\": \"iana\"\n },\n \"application/pkix-attr-cert\": {\n \"source\": \"iana\",\n \"extensions\": [\"ac\"]\n },\n \"application/pkix-cert\": {\n \"source\": \"iana\",\n \"extensions\": [\"cer\"]\n },\n \"application/pkix-crl\": {\n \"source\": \"iana\",\n \"extensions\": [\"crl\"]\n },\n \"application/pkix-pkipath\": {\n \"source\": \"iana\",\n \"extensions\": [\"pkipath\"]\n },\n \"application/pkixcmp\": {\n \"source\": \"iana\",\n \"extensions\": [\"pki\"]\n },\n \"application/pls+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"pls\"]\n },\n \"application/poc-settings+xml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true\n },\n \"application/postscript\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"ai\",\"eps\",\"ps\"]\n },\n \"application/ppsp-tracker+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/private-token-issuer-directory\": {\n \"source\": \"iana\"\n },\n \"application/private-token-request\": {\n \"source\": \"iana\"\n },\n \"application/private-token-response\": {\n \"source\": \"iana\"\n },\n \"application/problem+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/problem+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/provenance+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"provx\"]\n },\n \"application/provided-claims+jwt\": {\n \"source\": \"iana\"\n },\n \"application/prs.alvestrand.titrax-sheet\": {\n \"source\": \"iana\"\n },\n \"application/prs.cww\": {\n \"source\": \"iana\",\n \"extensions\": [\"cww\"]\n },\n \"application/prs.cyn\": {\n \"source\": \"iana\",\n \"charset\": \"7-BIT\"\n },\n \"application/prs.hpub+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/prs.implied-document+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/prs.implied-executable\": {\n \"source\": \"iana\"\n },\n \"application/prs.implied-object+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/prs.implied-object+json-seq\": {\n \"source\": \"iana\"\n },\n \"application/prs.implied-object+yaml\": {\n \"source\": \"iana\"\n },\n \"application/prs.implied-structure\": {\n \"source\": \"iana\"\n },\n \"application/prs.mayfile\": {\n \"source\": \"iana\"\n },\n \"application/prs.nprend\": {\n \"source\": \"iana\"\n },\n \"application/prs.plucker\": {\n \"source\": \"iana\"\n },\n \"application/prs.rdf-xml-crypt\": {\n \"source\": \"iana\"\n },\n \"application/prs.vcfbzip2\": {\n \"source\": \"iana\"\n },\n \"application/prs.xsf+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xsf\"]\n },\n \"application/pskc+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"pskcxml\"]\n },\n \"application/pvd+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/qsig\": {\n \"source\": \"iana\"\n },\n \"application/raml+yaml\": {\n \"compressible\": true,\n \"extensions\": [\"raml\"]\n },\n \"application/raptorfec\": {\n \"source\": \"iana\"\n },\n \"application/rdap+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/rdf+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"rdf\",\"owl\"]\n },\n \"application/reginfo+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"rif\"]\n },\n \"application/relax-ng-compact-syntax\": {\n \"source\": \"iana\",\n \"extensions\": [\"rnc\"]\n },\n \"application/remote-printing\": {\n \"source\": \"apache\"\n },\n \"application/reputon+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/resolve-response+jwt\": {\n \"source\": \"iana\"\n },\n \"application/resource-lists+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"rl\"]\n },\n \"application/resource-lists-diff+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"rld\"]\n },\n \"application/rfc+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/riscos\": {\n \"source\": \"iana\"\n },\n \"application/rlmi+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/rls-services+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"rs\"]\n },\n \"application/route-apd+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"rapd\"]\n },\n \"application/route-s-tsid+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"sls\"]\n },\n \"application/route-usd+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"rusd\"]\n },\n \"application/rpki-checklist\": {\n \"source\": \"iana\"\n },\n \"application/rpki-ghostbusters\": {\n \"source\": \"iana\",\n \"extensions\": [\"gbr\"]\n },\n \"application/rpki-manifest\": {\n \"source\": \"iana\",\n \"extensions\": [\"mft\"]\n },\n \"application/rpki-publication\": {\n \"source\": \"iana\"\n },\n \"application/rpki-roa\": {\n \"source\": \"iana\",\n \"extensions\": [\"roa\"]\n },\n \"application/rpki-signed-tal\": {\n \"source\": \"iana\"\n },\n \"application/rpki-updown\": {\n \"source\": \"iana\"\n },\n \"application/rsd+xml\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"rsd\"]\n },\n \"application/rss+xml\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"rss\"]\n },\n \"application/rtf\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"rtf\"]\n },\n \"application/rtploopback\": {\n \"source\": \"iana\"\n },\n \"application/rtx\": {\n \"source\": \"iana\"\n },\n \"application/samlassertion+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/samlmetadata+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/sarif+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/sarif-external-properties+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/sbe\": {\n \"source\": \"iana\"\n },\n \"application/sbml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"sbml\"]\n },\n \"application/scaip+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/scim+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/scvp-cv-request\": {\n \"source\": \"iana\",\n \"extensions\": [\"scq\"]\n },\n \"application/scvp-cv-response\": {\n \"source\": \"iana\",\n \"extensions\": [\"scs\"]\n },\n \"application/scvp-vp-request\": {\n \"source\": \"iana\",\n \"extensions\": [\"spq\"]\n },\n \"application/scvp-vp-response\": {\n \"source\": \"iana\",\n \"extensions\": [\"spp\"]\n },\n \"application/sdp\": {\n \"source\": \"iana\",\n \"extensions\": [\"sdp\"]\n },\n \"application/secevent+jwt\": {\n \"source\": \"iana\"\n },\n \"application/senml+cbor\": {\n \"source\": \"iana\"\n },\n \"application/senml+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/senml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"senmlx\"]\n },\n \"application/senml-etch+cbor\": {\n \"source\": \"iana\"\n },\n \"application/senml-etch+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/senml-exi\": {\n \"source\": \"iana\"\n },\n \"application/sensml+cbor\": {\n \"source\": \"iana\"\n },\n \"application/sensml+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/sensml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"sensmlx\"]\n },\n \"application/sensml-exi\": {\n \"source\": \"iana\"\n },\n \"application/sep+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/sep-exi\": {\n \"source\": \"iana\"\n },\n \"application/session-info\": {\n \"source\": \"iana\"\n },\n \"application/set-payment\": {\n \"source\": \"iana\"\n },\n \"application/set-payment-initiation\": {\n \"source\": \"iana\",\n \"extensions\": [\"setpay\"]\n },\n \"application/set-registration\": {\n \"source\": \"iana\"\n },\n \"application/set-registration-initiation\": {\n \"source\": \"iana\",\n \"extensions\": [\"setreg\"]\n },\n \"application/sgml\": {\n \"source\": \"iana\"\n },\n \"application/sgml-open-catalog\": {\n \"source\": \"iana\"\n },\n \"application/shf+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"shf\"]\n },\n \"application/sieve\": {\n \"source\": \"iana\",\n \"extensions\": [\"siv\",\"sieve\"]\n },\n \"application/simple-filter+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/simple-message-summary\": {\n \"source\": \"iana\"\n },\n \"application/simplesymbolcontainer\": {\n \"source\": \"iana\"\n },\n \"application/sipc\": {\n \"source\": \"iana\"\n },\n \"application/slate\": {\n \"source\": \"iana\"\n },\n \"application/smil\": {\n \"source\": \"apache\"\n },\n \"application/smil+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"smi\",\"smil\"]\n },\n \"application/smpte336m\": {\n \"source\": \"iana\"\n },\n \"application/soap+fastinfoset\": {\n \"source\": \"iana\"\n },\n \"application/soap+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/sparql-query\": {\n \"source\": \"iana\",\n \"extensions\": [\"rq\"]\n },\n \"application/sparql-results+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"srx\"]\n },\n \"application/spdx+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/spirits-event+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/sql\": {\n \"source\": \"iana\",\n \"extensions\": [\"sql\"]\n },\n \"application/srgs\": {\n \"source\": \"iana\",\n \"extensions\": [\"gram\"]\n },\n \"application/srgs+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"grxml\"]\n },\n \"application/sru+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"sru\"]\n },\n \"application/ssdl+xml\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"ssdl\"]\n },\n \"application/sslkeylogfile\": {\n \"source\": \"iana\"\n },\n \"application/ssml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"ssml\"]\n },\n \"application/st2110-41\": {\n \"source\": \"iana\"\n },\n \"application/stix+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/stratum\": {\n \"source\": \"iana\"\n },\n \"application/swid+cbor\": {\n \"source\": \"iana\"\n },\n \"application/swid+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"swidtag\"]\n },\n \"application/tamp-apex-update\": {\n \"source\": \"iana\"\n },\n \"application/tamp-apex-update-confirm\": {\n \"source\": \"iana\"\n },\n \"application/tamp-community-update\": {\n \"source\": \"iana\"\n },\n \"application/tamp-community-update-confirm\": {\n \"source\": \"iana\"\n },\n \"application/tamp-error\": {\n \"source\": \"iana\"\n },\n \"application/tamp-sequence-adjust\": {\n \"source\": \"iana\"\n },\n \"application/tamp-sequence-adjust-confirm\": {\n \"source\": \"iana\"\n },\n \"application/tamp-status-query\": {\n \"source\": \"iana\"\n },\n \"application/tamp-status-response\": {\n \"source\": \"iana\"\n },\n \"application/tamp-update\": {\n \"source\": \"iana\"\n },\n \"application/tamp-update-confirm\": {\n \"source\": \"iana\"\n },\n \"application/tar\": {\n \"compressible\": true\n },\n \"application/taxii+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/td+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/tei+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"tei\",\"teicorpus\"]\n },\n \"application/tetra_isi\": {\n \"source\": \"iana\"\n },\n \"application/thraud+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"tfi\"]\n },\n \"application/timestamp-query\": {\n \"source\": \"iana\"\n },\n \"application/timestamp-reply\": {\n \"source\": \"iana\"\n },\n \"application/timestamped-data\": {\n \"source\": \"iana\",\n \"extensions\": [\"tsd\"]\n },\n \"application/tlsrpt+gzip\": {\n \"source\": \"iana\"\n },\n \"application/tlsrpt+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/tm+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/tnauthlist\": {\n \"source\": \"iana\"\n },\n \"application/toc+cbor\": {\n \"source\": \"iana\"\n },\n \"application/token-introspection+jwt\": {\n \"source\": \"iana\"\n },\n \"application/toml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"toml\"]\n },\n \"application/trickle-ice-sdpfrag\": {\n \"source\": \"iana\"\n },\n \"application/trig\": {\n \"source\": \"iana\",\n \"extensions\": [\"trig\"]\n },\n \"application/trust-chain+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/trust-mark+jwt\": {\n \"source\": \"iana\"\n },\n \"application/trust-mark-delegation+jwt\": {\n \"source\": \"iana\"\n },\n \"application/ttml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"ttml\"]\n },\n \"application/tve-trigger\": {\n \"source\": \"iana\"\n },\n \"application/tzif\": {\n \"source\": \"iana\"\n },\n \"application/tzif-leap\": {\n \"source\": \"iana\"\n },\n \"application/ubjson\": {\n \"compressible\": false,\n \"extensions\": [\"ubj\"]\n },\n \"application/uccs+cbor\": {\n \"source\": \"iana\"\n },\n \"application/ujcs+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/ulpfec\": {\n \"source\": \"iana\"\n },\n \"application/urc-grpsheet+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/urc-ressheet+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"rsheet\"]\n },\n \"application/urc-targetdesc+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"td\"]\n },\n \"application/urc-uisocketdesc+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vc\": {\n \"source\": \"iana\"\n },\n \"application/vc+cose\": {\n \"source\": \"iana\"\n },\n \"application/vc+jwt\": {\n \"source\": \"iana\"\n },\n \"application/vcard+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vcard+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vemmi\": {\n \"source\": \"iana\"\n },\n \"application/vividence.scriptfile\": {\n \"source\": \"apache\"\n },\n \"application/vnd.1000minds.decision-model+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"1km\"]\n },\n \"application/vnd.1ob\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp-prose+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp-prose-pc3a+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp-prose-pc3ach+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp-prose-pc3ch+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp-prose-pc8+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp-v2x-local-service-information\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.5gnas\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.5gsa2x\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.5gsa2x-local-service-information\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.5gsv2x\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.5gsv2x-local-service-information\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.access-transfer-events+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.bsf+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.crs+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.current-location-discovery+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.gmop+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.gtpc\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.interworking-data\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.lpp\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.mc-signalling-ear\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.mcdata-affiliation-command+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcdata-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcdata-msgstore-ctrl-request+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcdata-payload\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.mcdata-regroup+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcdata-service-config+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcdata-signalling\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.mcdata-ue-config+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcdata-user-profile+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcptt-affiliation-command+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcptt-floor-request+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcptt-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcptt-location-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcptt-mbms-usage-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcptt-regroup+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcptt-service-config+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcptt-signed+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcptt-ue-config+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcptt-ue-init-config+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcptt-user-profile+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcvideo-affiliation-command+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcvideo-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcvideo-location-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcvideo-mbms-usage-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcvideo-regroup+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcvideo-service-config+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcvideo-transmission-request+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcvideo-ue-config+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mcvideo-user-profile+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.mid-call+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.ngap\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.pfcp\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.pic-bw-large\": {\n \"source\": \"iana\",\n \"extensions\": [\"plb\"]\n },\n \"application/vnd.3gpp.pic-bw-small\": {\n \"source\": \"iana\",\n \"extensions\": [\"psb\"]\n },\n \"application/vnd.3gpp.pic-bw-var\": {\n \"source\": \"iana\",\n \"extensions\": [\"pvb\"]\n },\n \"application/vnd.3gpp.pinapp-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.s1ap\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.seal-group-doc+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.seal-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.seal-location-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.seal-mbms-usage-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.seal-network-qos-management-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.seal-ue-config-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.seal-unicast-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.seal-user-profile-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.sms\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.sms+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.srvcc-ext+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.srvcc-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.state-and-event-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.ussd+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp.v2x\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.vae-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp2.bcmcsinfo+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.3gpp2.sms\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp2.tcap\": {\n \"source\": \"iana\",\n \"extensions\": [\"tcap\"]\n },\n \"application/vnd.3lightssoftware.imagescal\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3m.post-it-notes\": {\n \"source\": \"iana\",\n \"extensions\": [\"pwn\"]\n },\n \"application/vnd.accpac.simply.aso\": {\n \"source\": \"iana\",\n \"extensions\": [\"aso\"]\n },\n \"application/vnd.accpac.simply.imp\": {\n \"source\": \"iana\",\n \"extensions\": [\"imp\"]\n },\n \"application/vnd.acm.addressxfer+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.acm.chatbot+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.acucobol\": {\n \"source\": \"iana\",\n \"extensions\": [\"acu\"]\n },\n \"application/vnd.acucorp\": {\n \"source\": \"iana\",\n \"extensions\": [\"atc\",\"acutc\"]\n },\n \"application/vnd.adobe.air-application-installer-package+zip\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"air\"]\n },\n \"application/vnd.adobe.flash.movie\": {\n \"source\": \"iana\"\n },\n \"application/vnd.adobe.formscentral.fcdt\": {\n \"source\": \"iana\",\n \"extensions\": [\"fcdt\"]\n },\n \"application/vnd.adobe.fxp\": {\n \"source\": \"iana\",\n \"extensions\": [\"fxp\",\"fxpl\"]\n },\n \"application/vnd.adobe.partial-upload\": {\n \"source\": \"iana\"\n },\n \"application/vnd.adobe.xdp+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xdp\"]\n },\n \"application/vnd.adobe.xfdf\": {\n \"source\": \"apache\",\n \"extensions\": [\"xfdf\"]\n },\n \"application/vnd.aether.imp\": {\n \"source\": \"iana\"\n },\n \"application/vnd.afpc.afplinedata\": {\n \"source\": \"iana\"\n },\n \"application/vnd.afpc.afplinedata-pagedef\": {\n \"source\": \"iana\"\n },\n \"application/vnd.afpc.cmoca-cmresource\": {\n \"source\": \"iana\"\n },\n \"application/vnd.afpc.foca-charset\": {\n \"source\": \"iana\"\n },\n \"application/vnd.afpc.foca-codedfont\": {\n \"source\": \"iana\"\n },\n \"application/vnd.afpc.foca-codepage\": {\n \"source\": \"iana\"\n },\n \"application/vnd.afpc.modca\": {\n \"source\": \"iana\"\n },\n \"application/vnd.afpc.modca-cmtable\": {\n \"source\": \"iana\"\n },\n \"application/vnd.afpc.modca-formdef\": {\n \"source\": \"iana\"\n },\n \"application/vnd.afpc.modca-mediummap\": {\n \"source\": \"iana\"\n },\n \"application/vnd.afpc.modca-objectcontainer\": {\n \"source\": \"iana\"\n },\n \"application/vnd.afpc.modca-overlay\": {\n \"source\": \"iana\"\n },\n \"application/vnd.afpc.modca-pagesegment\": {\n \"source\": \"iana\"\n },\n \"application/vnd.age\": {\n \"source\": \"iana\",\n \"extensions\": [\"age\"]\n },\n \"application/vnd.ah-barcode\": {\n \"source\": \"apache\"\n },\n \"application/vnd.ahead.space\": {\n \"source\": \"iana\",\n \"extensions\": [\"ahead\"]\n },\n \"application/vnd.airzip.filesecure.azf\": {\n \"source\": \"iana\",\n \"extensions\": [\"azf\"]\n },\n \"application/vnd.airzip.filesecure.azs\": {\n \"source\": \"iana\",\n \"extensions\": [\"azs\"]\n },\n \"application/vnd.amadeus+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.amazon.ebook\": {\n \"source\": \"apache\",\n \"extensions\": [\"azw\"]\n },\n \"application/vnd.amazon.mobi8-ebook\": {\n \"source\": \"iana\"\n },\n \"application/vnd.americandynamics.acc\": {\n \"source\": \"iana\",\n \"extensions\": [\"acc\"]\n },\n \"application/vnd.amiga.ami\": {\n \"source\": \"iana\",\n \"extensions\": [\"ami\"]\n },\n \"application/vnd.amundsen.maze+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.android.ota\": {\n \"source\": \"iana\"\n },\n \"application/vnd.android.package-archive\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"apk\"]\n },\n \"application/vnd.anki\": {\n \"source\": \"iana\"\n },\n \"application/vnd.anser-web-certificate-issue-initiation\": {\n \"source\": \"iana\",\n \"extensions\": [\"cii\"]\n },\n \"application/vnd.anser-web-funds-transfer-initiation\": {\n \"source\": \"apache\",\n \"extensions\": [\"fti\"]\n },\n \"application/vnd.antix.game-component\": {\n \"source\": \"iana\",\n \"extensions\": [\"atx\"]\n },\n \"application/vnd.apache.arrow.file\": {\n \"source\": \"iana\"\n },\n \"application/vnd.apache.arrow.stream\": {\n \"source\": \"iana\"\n },\n \"application/vnd.apache.parquet\": {\n \"source\": \"iana\"\n },\n \"application/vnd.apache.thrift.binary\": {\n \"source\": \"iana\"\n },\n \"application/vnd.apache.thrift.compact\": {\n \"source\": \"iana\"\n },\n \"application/vnd.apache.thrift.json\": {\n \"source\": \"iana\"\n },\n \"application/vnd.apexlang\": {\n \"source\": \"iana\"\n },\n \"application/vnd.api+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.aplextor.warrp+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.apothekende.reservation+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.apple.installer+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"mpkg\"]\n },\n \"application/vnd.apple.keynote\": {\n \"source\": \"iana\",\n \"extensions\": [\"key\"]\n },\n \"application/vnd.apple.mpegurl\": {\n \"source\": \"iana\",\n \"extensions\": [\"m3u8\"]\n },\n \"application/vnd.apple.numbers\": {\n \"source\": \"iana\",\n \"extensions\": [\"numbers\"]\n },\n \"application/vnd.apple.pages\": {\n \"source\": \"iana\",\n \"extensions\": [\"pages\"]\n },\n \"application/vnd.apple.pkpass\": {\n \"compressible\": false,\n \"extensions\": [\"pkpass\"]\n },\n \"application/vnd.arastra.swi\": {\n \"source\": \"apache\"\n },\n \"application/vnd.aristanetworks.swi\": {\n \"source\": \"iana\",\n \"extensions\": [\"swi\"]\n },\n \"application/vnd.artisan+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.artsquare\": {\n \"source\": \"iana\"\n },\n \"application/vnd.astraea-software.iota\": {\n \"source\": \"iana\",\n \"extensions\": [\"iota\"]\n },\n \"application/vnd.audiograph\": {\n \"source\": \"iana\",\n \"extensions\": [\"aep\"]\n },\n \"application/vnd.autodesk.fbx\": {\n \"extensions\": [\"fbx\"]\n },\n \"application/vnd.autopackage\": {\n \"source\": \"iana\"\n },\n \"application/vnd.avalon+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.avistar+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.balsamiq.bmml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"bmml\"]\n },\n \"application/vnd.balsamiq.bmpr\": {\n \"source\": \"iana\"\n },\n \"application/vnd.banana-accounting\": {\n \"source\": \"iana\"\n },\n \"application/vnd.bbf.usp.error\": {\n \"source\": \"iana\"\n },\n \"application/vnd.bbf.usp.msg\": {\n \"source\": \"iana\"\n },\n \"application/vnd.bbf.usp.msg+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.bekitzur-stech+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.belightsoft.lhzd+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/vnd.belightsoft.lhzl+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/vnd.bint.med-content\": {\n \"source\": \"iana\"\n },\n \"application/vnd.biopax.rdf+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.blink-idb-value-wrapper\": {\n \"source\": \"iana\"\n },\n \"application/vnd.blueice.multipass\": {\n \"source\": \"iana\",\n \"extensions\": [\"mpm\"]\n },\n \"application/vnd.bluetooth.ep.oob\": {\n \"source\": \"iana\"\n },\n \"application/vnd.bluetooth.le.oob\": {\n \"source\": \"iana\"\n },\n \"application/vnd.bmi\": {\n \"source\": \"iana\",\n \"extensions\": [\"bmi\"]\n },\n \"application/vnd.bpf\": {\n \"source\": \"iana\"\n },\n \"application/vnd.bpf3\": {\n \"source\": \"iana\"\n },\n \"application/vnd.businessobjects\": {\n \"source\": \"iana\",\n \"extensions\": [\"rep\"]\n },\n \"application/vnd.byu.uapi+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.bzip3\": {\n \"source\": \"iana\"\n },\n \"application/vnd.c3voc.schedule+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.cab-jscript\": {\n \"source\": \"iana\"\n },\n \"application/vnd.canon-cpdl\": {\n \"source\": \"iana\"\n },\n \"application/vnd.canon-lips\": {\n \"source\": \"iana\"\n },\n \"application/vnd.capasystems-pg+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.cendio.thinlinc.clientconf\": {\n \"source\": \"iana\"\n },\n \"application/vnd.century-systems.tcp_stream\": {\n \"source\": \"iana\"\n },\n \"application/vnd.chemdraw+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"cdxml\"]\n },\n \"application/vnd.chess-pgn\": {\n \"source\": \"iana\"\n },\n \"application/vnd.chipnuts.karaoke-mmd\": {\n \"source\": \"iana\",\n \"extensions\": [\"mmd\"]\n },\n \"application/vnd.ciedi\": {\n \"source\": \"iana\"\n },\n \"application/vnd.cinderella\": {\n \"source\": \"iana\",\n \"extensions\": [\"cdy\"]\n },\n \"application/vnd.cirpack.isdn-ext\": {\n \"source\": \"iana\"\n },\n \"application/vnd.citationstyles.style+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"csl\"]\n },\n \"application/vnd.claymore\": {\n \"source\": \"iana\",\n \"extensions\": [\"cla\"]\n },\n \"application/vnd.cloanto.rp9\": {\n \"source\": \"iana\",\n \"extensions\": [\"rp9\"]\n },\n \"application/vnd.clonk.c4group\": {\n \"source\": \"iana\",\n \"extensions\": [\"c4g\",\"c4d\",\"c4f\",\"c4p\",\"c4u\"]\n },\n \"application/vnd.cluetrust.cartomobile-config\": {\n \"source\": \"iana\",\n \"extensions\": [\"c11amc\"]\n },\n \"application/vnd.cluetrust.cartomobile-config-pkg\": {\n \"source\": \"iana\",\n \"extensions\": [\"c11amz\"]\n },\n \"application/vnd.cncf.helm.chart.content.v1.tar+gzip\": {\n \"source\": \"iana\"\n },\n \"application/vnd.cncf.helm.chart.provenance.v1.prov\": {\n \"source\": \"iana\"\n },\n \"application/vnd.cncf.helm.config.v1+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.coffeescript\": {\n \"source\": \"iana\"\n },\n \"application/vnd.collabio.xodocuments.document\": {\n \"source\": \"iana\"\n },\n \"application/vnd.collabio.xodocuments.document-template\": {\n \"source\": \"iana\"\n },\n \"application/vnd.collabio.xodocuments.presentation\": {\n \"source\": \"iana\"\n },\n \"application/vnd.collabio.xodocuments.presentation-template\": {\n \"source\": \"iana\"\n },\n \"application/vnd.collabio.xodocuments.spreadsheet\": {\n \"source\": \"iana\"\n },\n \"application/vnd.collabio.xodocuments.spreadsheet-template\": {\n \"source\": \"iana\"\n },\n \"application/vnd.collection+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.collection.doc+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.collection.next+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.comicbook+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/vnd.comicbook-rar\": {\n \"source\": \"iana\"\n },\n \"application/vnd.commerce-battelle\": {\n \"source\": \"iana\"\n },\n \"application/vnd.commonspace\": {\n \"source\": \"iana\",\n \"extensions\": [\"csp\"]\n },\n \"application/vnd.contact.cmsg\": {\n \"source\": \"iana\",\n \"extensions\": [\"cdbcmsg\"]\n },\n \"application/vnd.coreos.ignition+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.cosmocaller\": {\n \"source\": \"iana\",\n \"extensions\": [\"cmc\"]\n },\n \"application/vnd.crick.clicker\": {\n \"source\": \"iana\",\n \"extensions\": [\"clkx\"]\n },\n \"application/vnd.crick.clicker.keyboard\": {\n \"source\": \"iana\",\n \"extensions\": [\"clkk\"]\n },\n \"application/vnd.crick.clicker.palette\": {\n \"source\": \"iana\",\n \"extensions\": [\"clkp\"]\n },\n \"application/vnd.crick.clicker.template\": {\n \"source\": \"iana\",\n \"extensions\": [\"clkt\"]\n },\n \"application/vnd.crick.clicker.wordbank\": {\n \"source\": \"iana\",\n \"extensions\": [\"clkw\"]\n },\n \"application/vnd.criticaltools.wbs+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"wbs\"]\n },\n \"application/vnd.cryptii.pipe+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.crypto-shade-file\": {\n \"source\": \"iana\"\n },\n \"application/vnd.cryptomator.encrypted\": {\n \"source\": \"iana\"\n },\n \"application/vnd.cryptomator.vault\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ctc-posml\": {\n \"source\": \"iana\",\n \"extensions\": [\"pml\"]\n },\n \"application/vnd.ctct.ws+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.cups-pdf\": {\n \"source\": \"iana\"\n },\n \"application/vnd.cups-postscript\": {\n \"source\": \"iana\"\n },\n \"application/vnd.cups-ppd\": {\n \"source\": \"iana\",\n \"extensions\": [\"ppd\"]\n },\n \"application/vnd.cups-raster\": {\n \"source\": \"iana\"\n },\n \"application/vnd.cups-raw\": {\n \"source\": \"iana\"\n },\n \"application/vnd.curl\": {\n \"source\": \"iana\"\n },\n \"application/vnd.curl.car\": {\n \"source\": \"apache\",\n \"extensions\": [\"car\"]\n },\n \"application/vnd.curl.pcurl\": {\n \"source\": \"apache\",\n \"extensions\": [\"pcurl\"]\n },\n \"application/vnd.cyan.dean.root+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.cybank\": {\n \"source\": \"iana\"\n },\n \"application/vnd.cyclonedx+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.cyclonedx+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.d2l.coursepackage1p0+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/vnd.d3m-dataset\": {\n \"source\": \"iana\"\n },\n \"application/vnd.d3m-problem\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dart\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"dart\"]\n },\n \"application/vnd.data-vision.rdz\": {\n \"source\": \"iana\",\n \"extensions\": [\"rdz\"]\n },\n \"application/vnd.datalog\": {\n \"source\": \"iana\"\n },\n \"application/vnd.datapackage+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.dataresource+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.dbf\": {\n \"source\": \"iana\",\n \"extensions\": [\"dbf\"]\n },\n \"application/vnd.dcmp+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"dcmp\"]\n },\n \"application/vnd.debian.binary-package\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dece.data\": {\n \"source\": \"iana\",\n \"extensions\": [\"uvf\",\"uvvf\",\"uvd\",\"uvvd\"]\n },\n \"application/vnd.dece.ttml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"uvt\",\"uvvt\"]\n },\n \"application/vnd.dece.unspecified\": {\n \"source\": \"iana\",\n \"extensions\": [\"uvx\",\"uvvx\"]\n },\n \"application/vnd.dece.zip\": {\n \"source\": \"iana\",\n \"extensions\": [\"uvz\",\"uvvz\"]\n },\n \"application/vnd.denovo.fcselayout-link\": {\n \"source\": \"iana\",\n \"extensions\": [\"fe_launch\"]\n },\n \"application/vnd.desmume.movie\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dir-bi.plate-dl-nosuffix\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dm.delegation+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.dna\": {\n \"source\": \"iana\",\n \"extensions\": [\"dna\"]\n },\n \"application/vnd.document+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.dolby.mlp\": {\n \"source\": \"apache\",\n \"extensions\": [\"mlp\"]\n },\n \"application/vnd.dolby.mobile.1\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dolby.mobile.2\": {\n \"source\": \"iana\"\n },\n \"application/vnd.doremir.scorecloud-binary-document\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dpgraph\": {\n \"source\": \"iana\",\n \"extensions\": [\"dpg\"]\n },\n \"application/vnd.dreamfactory\": {\n \"source\": \"iana\",\n \"extensions\": [\"dfac\"]\n },\n \"application/vnd.drive+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.ds-keypoint\": {\n \"source\": \"apache\",\n \"extensions\": [\"kpxx\"]\n },\n \"application/vnd.dtg.local\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dtg.local.flash\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dtg.local.html\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.ait\": {\n \"source\": \"iana\",\n \"extensions\": [\"ait\"]\n },\n \"application/vnd.dvb.dvbisl+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.dvb.dvbj\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.esgcontainer\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.ipdcdftnotifaccess\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.ipdcesgaccess\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.ipdcesgaccess2\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.ipdcesgpdd\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.ipdcroaming\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.iptv.alfec-base\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.iptv.alfec-enhancement\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.notif-aggregate-root+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.dvb.notif-container+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.dvb.notif-generic+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.dvb.notif-ia-msglist+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.dvb.notif-ia-registration-request+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.dvb.notif-ia-registration-response+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.dvb.notif-init+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.dvb.pfr\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.service\": {\n \"source\": \"iana\",\n \"extensions\": [\"svc\"]\n },\n \"application/vnd.dxr\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dynageo\": {\n \"source\": \"iana\",\n \"extensions\": [\"geo\"]\n },\n \"application/vnd.dzr\": {\n \"source\": \"iana\"\n },\n \"application/vnd.easykaraoke.cdgdownload\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ecdis-update\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ecip.rlp\": {\n \"source\": \"iana\"\n },\n \"application/vnd.eclipse.ditto+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.ecowin.chart\": {\n \"source\": \"iana\",\n \"extensions\": [\"mag\"]\n },\n \"application/vnd.ecowin.filerequest\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ecowin.fileupdate\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ecowin.series\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ecowin.seriesrequest\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ecowin.seriesupdate\": {\n \"source\": \"iana\"\n },\n \"application/vnd.efi.img\": {\n \"source\": \"iana\"\n },\n \"application/vnd.efi.iso\": {\n \"source\": \"iana\"\n },\n \"application/vnd.eln+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/vnd.emclient.accessrequest+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.enliven\": {\n \"source\": \"iana\",\n \"extensions\": [\"nml\"]\n },\n \"application/vnd.enphase.envoy\": {\n \"source\": \"iana\"\n },\n \"application/vnd.eprints.data+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.epson.esf\": {\n \"source\": \"iana\",\n \"extensions\": [\"esf\"]\n },\n \"application/vnd.epson.msf\": {\n \"source\": \"iana\",\n \"extensions\": [\"msf\"]\n },\n \"application/vnd.epson.quickanime\": {\n \"source\": \"iana\",\n \"extensions\": [\"qam\"]\n },\n \"application/vnd.epson.salt\": {\n \"source\": \"iana\",\n \"extensions\": [\"slt\"]\n },\n \"application/vnd.epson.ssf\": {\n \"source\": \"iana\",\n \"extensions\": [\"ssf\"]\n },\n \"application/vnd.ericsson.quickcall\": {\n \"source\": \"iana\"\n },\n \"application/vnd.erofs\": {\n \"source\": \"iana\"\n },\n \"application/vnd.espass-espass+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/vnd.eszigno3+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"es3\",\"et3\"]\n },\n \"application/vnd.etsi.aoc+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.etsi.asic-e+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/vnd.etsi.asic-s+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/vnd.etsi.cug+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.etsi.iptvcommand+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.etsi.iptvdiscovery+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.etsi.iptvprofile+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.etsi.iptvsad-bc+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.etsi.iptvsad-cod+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.etsi.iptvsad-npvr+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.etsi.iptvservice+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.etsi.iptvsync+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.etsi.iptvueprofile+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.etsi.mcid+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.etsi.mheg5\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.overload-control-policy-dataset+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.etsi.pstn+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.etsi.sci+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.etsi.simservs+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.etsi.timestamp-token\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.tsl+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.etsi.tsl.der\": {\n \"source\": \"iana\"\n },\n \"application/vnd.eu.kasparian.car+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.eudora.data\": {\n \"source\": \"iana\"\n },\n \"application/vnd.evolv.ecig.profile\": {\n \"source\": \"iana\"\n },\n \"application/vnd.evolv.ecig.settings\": {\n \"source\": \"iana\"\n },\n \"application/vnd.evolv.ecig.theme\": {\n \"source\": \"iana\"\n },\n \"application/vnd.exstream-empower+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/vnd.exstream-package\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ezpix-album\": {\n \"source\": \"iana\",\n \"extensions\": [\"ez2\"]\n },\n \"application/vnd.ezpix-package\": {\n \"source\": \"iana\",\n \"extensions\": [\"ez3\"]\n },\n \"application/vnd.f-secure.mobile\": {\n \"source\": \"iana\"\n },\n \"application/vnd.familysearch.gedcom+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/vnd.fastcopy-disk-image\": {\n \"source\": \"iana\"\n },\n \"application/vnd.fdf\": {\n \"source\": \"apache\",\n \"extensions\": [\"fdf\"]\n },\n \"application/vnd.fdsn.mseed\": {\n \"source\": \"iana\",\n \"extensions\": [\"mseed\"]\n },\n \"application/vnd.fdsn.seed\": {\n \"source\": \"iana\",\n \"extensions\": [\"seed\",\"dataless\"]\n },\n \"application/vnd.fdsn.stationxml+xml\": {\n \"source\": \"iana\",\n \"charset\": \"XML-BASED\",\n \"compressible\": true\n },\n \"application/vnd.ffsns\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ficlab.flb+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/vnd.filmit.zfc\": {\n \"source\": \"iana\"\n },\n \"application/vnd.fints\": {\n \"source\": \"iana\"\n },\n \"application/vnd.firemonkeys.cloudcell\": {\n \"source\": \"iana\"\n },\n \"application/vnd.flographit\": {\n \"source\": \"iana\",\n \"extensions\": [\"gph\"]\n },\n \"application/vnd.fluxtime.clip\": {\n \"source\": \"iana\",\n \"extensions\": [\"ftc\"]\n },\n \"application/vnd.font-fontforge-sfd\": {\n \"source\": \"iana\"\n },\n \"application/vnd.framemaker\": {\n \"source\": \"iana\",\n \"extensions\": [\"fm\",\"frame\",\"maker\",\"book\"]\n },\n \"application/vnd.freelog.comic\": {\n \"source\": \"iana\"\n },\n \"application/vnd.frogans.fnc\": {\n \"source\": \"apache\",\n \"extensions\": [\"fnc\"]\n },\n \"application/vnd.frogans.ltf\": {\n \"source\": \"apache\",\n \"extensions\": [\"ltf\"]\n },\n \"application/vnd.fsc.weblaunch\": {\n \"source\": \"iana\",\n \"extensions\": [\"fsc\"]\n },\n \"application/vnd.fujifilm.fb.docuworks\": {\n \"source\": \"iana\"\n },\n \"application/vnd.fujifilm.fb.docuworks.binder\": {\n \"source\": \"iana\"\n },\n \"application/vnd.fujifilm.fb.docuworks.container\": {\n \"source\": \"iana\"\n },\n \"application/vnd.fujifilm.fb.jfi+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.fujitsu.oasys\": {\n \"source\": \"iana\",\n \"extensions\": [\"oas\"]\n },\n \"application/vnd.fujitsu.oasys2\": {\n \"source\": \"iana\",\n \"extensions\": [\"oa2\"]\n },\n \"application/vnd.fujitsu.oasys3\": {\n \"source\": \"iana\",\n \"extensions\": [\"oa3\"]\n },\n \"application/vnd.fujitsu.oasysgp\": {\n \"source\": \"iana\",\n \"extensions\": [\"fg5\"]\n },\n \"application/vnd.fujitsu.oasysprs\": {\n \"source\": \"iana\",\n \"extensions\": [\"bh2\"]\n },\n \"application/vnd.fujixerox.art-ex\": {\n \"source\": \"iana\"\n },\n \"application/vnd.fujixerox.art4\": {\n \"source\": \"iana\"\n },\n \"application/vnd.fujixerox.ddd\": {\n \"source\": \"iana\",\n \"extensions\": [\"ddd\"]\n },\n \"application/vnd.fujixerox.docuworks\": {\n \"source\": \"iana\",\n \"extensions\": [\"xdw\"]\n },\n \"application/vnd.fujixerox.docuworks.binder\": {\n \"source\": \"iana\",\n \"extensions\": [\"xbd\"]\n },\n \"application/vnd.fujixerox.docuworks.container\": {\n \"source\": \"iana\"\n },\n \"application/vnd.fujixerox.hbpl\": {\n \"source\": \"iana\"\n },\n \"application/vnd.fut-misnet\": {\n \"source\": \"iana\"\n },\n \"application/vnd.futoin+cbor\": {\n \"source\": \"iana\"\n },\n \"application/vnd.futoin+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.fuzzysheet\": {\n \"source\": \"iana\",\n \"extensions\": [\"fzs\"]\n },\n \"application/vnd.ga4gh.passport+jwt\": {\n \"source\": \"iana\"\n },\n \"application/vnd.genomatix.tuxedo\": {\n \"source\": \"iana\",\n \"extensions\": [\"txd\"]\n },\n \"application/vnd.genozip\": {\n \"source\": \"iana\"\n },\n \"application/vnd.gentics.grd+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.gentoo.catmetadata+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.gentoo.ebuild\": {\n \"source\": \"iana\"\n },\n \"application/vnd.gentoo.eclass\": {\n \"source\": \"iana\"\n },\n \"application/vnd.gentoo.gpkg\": {\n \"source\": \"iana\"\n },\n \"application/vnd.gentoo.manifest\": {\n \"source\": \"iana\"\n },\n \"application/vnd.gentoo.pkgmetadata+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.gentoo.xpak\": {\n \"source\": \"iana\"\n },\n \"application/vnd.geo+json\": {\n \"source\": \"apache\",\n \"compressible\": true\n },\n \"application/vnd.geocube+xml\": {\n \"source\": \"apache\",\n \"compressible\": true\n },\n \"application/vnd.geogebra.file\": {\n \"source\": \"iana\",\n \"extensions\": [\"ggb\"]\n },\n \"application/vnd.geogebra.pinboard\": {\n \"source\": \"iana\"\n },\n \"application/vnd.geogebra.slides\": {\n \"source\": \"iana\",\n \"extensions\": [\"ggs\"]\n },\n \"application/vnd.geogebra.tool\": {\n \"source\": \"iana\",\n \"extensions\": [\"ggt\"]\n },\n \"application/vnd.geometry-explorer\": {\n \"source\": \"iana\",\n \"extensions\": [\"gex\",\"gre\"]\n },\n \"application/vnd.geonext\": {\n \"source\": \"iana\",\n \"extensions\": [\"gxt\"]\n },\n \"application/vnd.geoplan\": {\n \"source\": \"iana\",\n \"extensions\": [\"g2w\"]\n },\n \"application/vnd.geospace\": {\n \"source\": \"iana\",\n \"extensions\": [\"g3w\"]\n },\n \"application/vnd.gerber\": {\n \"source\": \"iana\"\n },\n \"application/vnd.globalplatform.card-content-mgt\": {\n \"source\": \"iana\"\n },\n \"application/vnd.globalplatform.card-content-mgt-response\": {\n \"source\": \"iana\"\n },\n \"application/vnd.gmx\": {\n \"source\": \"iana\",\n \"extensions\": [\"gmx\"]\n },\n \"application/vnd.gnu.taler.exchange+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.gnu.taler.merchant+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.google-apps.audio\": {},\n \"application/vnd.google-apps.document\": {\n \"compressible\": false,\n \"extensions\": [\"gdoc\"]\n },\n \"application/vnd.google-apps.drawing\": {\n \"compressible\": false,\n \"extensions\": [\"gdraw\"]\n },\n \"application/vnd.google-apps.drive-sdk\": {\n \"compressible\": false\n },\n \"application/vnd.google-apps.file\": {},\n \"application/vnd.google-apps.folder\": {\n \"compressible\": false\n },\n \"application/vnd.google-apps.form\": {\n \"compressible\": false,\n \"extensions\": [\"gform\"]\n },\n \"application/vnd.google-apps.fusiontable\": {},\n \"application/vnd.google-apps.jam\": {\n \"compressible\": false,\n \"extensions\": [\"gjam\"]\n },\n \"application/vnd.google-apps.mail-layout\": {},\n \"application/vnd.google-apps.map\": {\n \"compressible\": false,\n \"extensions\": [\"gmap\"]\n },\n \"application/vnd.google-apps.photo\": {},\n \"application/vnd.google-apps.presentation\": {\n \"compressible\": false,\n \"extensions\": [\"gslides\"]\n },\n \"application/vnd.google-apps.script\": {\n \"compressible\": false,\n \"extensions\": [\"gscript\"]\n },\n \"application/vnd.google-apps.shortcut\": {},\n \"application/vnd.google-apps.site\": {\n \"compressible\": false,\n \"extensions\": [\"gsite\"]\n },\n \"application/vnd.google-apps.spreadsheet\": {\n \"compressible\": false,\n \"extensions\": [\"gsheet\"]\n },\n \"application/vnd.google-apps.unknown\": {},\n \"application/vnd.google-apps.video\": {},\n \"application/vnd.google-earth.kml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"kml\"]\n },\n \"application/vnd.google-earth.kmz\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"kmz\"]\n },\n \"application/vnd.gov.sk.e-form+xml\": {\n \"source\": \"apache\",\n \"compressible\": true\n },\n \"application/vnd.gov.sk.e-form+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/vnd.gov.sk.xmldatacontainer+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xdcf\"]\n },\n \"application/vnd.gpxsee.map+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.grafeq\": {\n \"source\": \"iana\",\n \"extensions\": [\"gqf\",\"gqs\"]\n },\n \"application/vnd.gridmp\": {\n \"source\": \"iana\"\n },\n \"application/vnd.groove-account\": {\n \"source\": \"iana\",\n \"extensions\": [\"gac\"]\n },\n \"application/vnd.groove-help\": {\n \"source\": \"iana\",\n \"extensions\": [\"ghf\"]\n },\n \"application/vnd.groove-identity-message\": {\n \"source\": \"iana\",\n \"extensions\": [\"gim\"]\n },\n \"application/vnd.groove-injector\": {\n \"source\": \"iana\",\n \"extensions\": [\"grv\"]\n },\n \"application/vnd.groove-tool-message\": {\n \"source\": \"iana\",\n \"extensions\": [\"gtm\"]\n },\n \"application/vnd.groove-tool-template\": {\n \"source\": \"iana\",\n \"extensions\": [\"tpl\"]\n },\n \"application/vnd.groove-vcard\": {\n \"source\": \"iana\",\n \"extensions\": [\"vcg\"]\n },\n \"application/vnd.hal+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.hal+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"hal\"]\n },\n \"application/vnd.handheld-entertainment+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"zmm\"]\n },\n \"application/vnd.hbci\": {\n \"source\": \"iana\",\n \"extensions\": [\"hbci\"]\n },\n \"application/vnd.hc+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.hcl-bireports\": {\n \"source\": \"iana\"\n },\n \"application/vnd.hdt\": {\n \"source\": \"iana\"\n },\n \"application/vnd.heroku+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.hhe.lesson-player\": {\n \"source\": \"iana\",\n \"extensions\": [\"les\"]\n },\n \"application/vnd.hp-hpgl\": {\n \"source\": \"iana\",\n \"extensions\": [\"hpgl\"]\n },\n \"application/vnd.hp-hpid\": {\n \"source\": \"iana\",\n \"extensions\": [\"hpid\"]\n },\n \"application/vnd.hp-hps\": {\n \"source\": \"iana\",\n \"extensions\": [\"hps\"]\n },\n \"application/vnd.hp-jlyt\": {\n \"source\": \"iana\",\n \"extensions\": [\"jlt\"]\n },\n \"application/vnd.hp-pcl\": {\n \"source\": \"iana\",\n \"extensions\": [\"pcl\"]\n },\n \"application/vnd.hp-pclxl\": {\n \"source\": \"iana\",\n \"extensions\": [\"pclxl\"]\n },\n \"application/vnd.hsl\": {\n \"source\": \"iana\"\n },\n \"application/vnd.httphone\": {\n \"source\": \"iana\"\n },\n \"application/vnd.hydrostatix.sof-data\": {\n \"source\": \"iana\",\n \"extensions\": [\"sfd-hdstx\"]\n },\n \"application/vnd.hyper+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.hyper-item+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.hyperdrive+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.hzn-3d-crossword\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ibm.afplinedata\": {\n \"source\": \"apache\"\n },\n \"application/vnd.ibm.electronic-media\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ibm.minipay\": {\n \"source\": \"iana\",\n \"extensions\": [\"mpy\"]\n },\n \"application/vnd.ibm.modcap\": {\n \"source\": \"apache\",\n \"extensions\": [\"afp\",\"listafp\",\"list3820\"]\n },\n \"application/vnd.ibm.rights-management\": {\n \"source\": \"iana\",\n \"extensions\": [\"irm\"]\n },\n \"application/vnd.ibm.secure-container\": {\n \"source\": \"iana\",\n \"extensions\": [\"sc\"]\n },\n \"application/vnd.iccprofile\": {\n \"source\": \"iana\",\n \"extensions\": [\"icc\",\"icm\"]\n },\n \"application/vnd.ieee.1905\": {\n \"source\": \"iana\"\n },\n \"application/vnd.igloader\": {\n \"source\": \"iana\",\n \"extensions\": [\"igl\"]\n },\n \"application/vnd.imagemeter.folder+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/vnd.imagemeter.image+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/vnd.immervision-ivp\": {\n \"source\": \"iana\",\n \"extensions\": [\"ivp\"]\n },\n \"application/vnd.immervision-ivu\": {\n \"source\": \"iana\",\n \"extensions\": [\"ivu\"]\n },\n \"application/vnd.ims.imsccv1p1\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ims.imsccv1p2\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ims.imsccv1p3\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ims.lis.v2.result+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.ims.lti.v2.toolconsumerprofile+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.ims.lti.v2.toolproxy+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.ims.lti.v2.toolproxy.id+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.ims.lti.v2.toolsettings+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.ims.lti.v2.toolsettings.simple+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.informedcontrol.rms+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.informix-visionary\": {\n \"source\": \"apache\"\n },\n \"application/vnd.infotech.project\": {\n \"source\": \"iana\"\n },\n \"application/vnd.infotech.project+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.innopath.wamp.notification\": {\n \"source\": \"iana\"\n },\n \"application/vnd.insors.igm\": {\n \"source\": \"iana\",\n \"extensions\": [\"igm\"]\n },\n \"application/vnd.intercon.formnet\": {\n \"source\": \"iana\",\n \"extensions\": [\"xpw\",\"xpx\"]\n },\n \"application/vnd.intergeo\": {\n \"source\": \"iana\",\n \"extensions\": [\"i2g\"]\n },\n \"application/vnd.intertrust.digibox\": {\n \"source\": \"iana\"\n },\n \"application/vnd.intertrust.nncp\": {\n \"source\": \"iana\"\n },\n \"application/vnd.intu.qbo\": {\n \"source\": \"iana\",\n \"extensions\": [\"qbo\"]\n },\n \"application/vnd.intu.qfx\": {\n \"source\": \"iana\",\n \"extensions\": [\"qfx\"]\n },\n \"application/vnd.ipfs.ipns-record\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ipld.car\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ipld.dag-cbor\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ipld.dag-json\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ipld.raw\": {\n \"source\": \"iana\"\n },\n \"application/vnd.iptc.g2.catalogitem+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.iptc.g2.conceptitem+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.iptc.g2.knowledgeitem+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.iptc.g2.newsitem+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.iptc.g2.newsmessage+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.iptc.g2.packageitem+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.iptc.g2.planningitem+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.ipunplugged.rcprofile\": {\n \"source\": \"iana\",\n \"extensions\": [\"rcprofile\"]\n },\n \"application/vnd.irepository.package+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"irp\"]\n },\n \"application/vnd.is-xpr\": {\n \"source\": \"iana\",\n \"extensions\": [\"xpr\"]\n },\n \"application/vnd.isac.fcs\": {\n \"source\": \"iana\",\n \"extensions\": [\"fcs\"]\n },\n \"application/vnd.iso11783-10+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/vnd.jam\": {\n \"source\": \"iana\",\n \"extensions\": [\"jam\"]\n },\n \"application/vnd.japannet-directory-service\": {\n \"source\": \"iana\"\n },\n \"application/vnd.japannet-jpnstore-wakeup\": {\n \"source\": \"iana\"\n },\n \"application/vnd.japannet-payment-wakeup\": {\n \"source\": \"iana\"\n },\n \"application/vnd.japannet-registration\": {\n \"source\": \"iana\"\n },\n \"application/vnd.japannet-registration-wakeup\": {\n \"source\": \"iana\"\n },\n \"application/vnd.japannet-setstore-wakeup\": {\n \"source\": \"iana\"\n },\n \"application/vnd.japannet-verification\": {\n \"source\": \"iana\"\n },\n \"application/vnd.japannet-verification-wakeup\": {\n \"source\": \"iana\"\n },\n \"application/vnd.jcp.javame.midlet-rms\": {\n \"source\": \"iana\",\n \"extensions\": [\"rms\"]\n },\n \"application/vnd.jisp\": {\n \"source\": \"iana\",\n \"extensions\": [\"jisp\"]\n },\n \"application/vnd.joost.joda-archive\": {\n \"source\": \"iana\",\n \"extensions\": [\"joda\"]\n },\n \"application/vnd.jsk.isdn-ngn\": {\n \"source\": \"iana\"\n },\n \"application/vnd.kahootz\": {\n \"source\": \"iana\",\n \"extensions\": [\"ktz\",\"ktr\"]\n },\n \"application/vnd.kde.karbon\": {\n \"source\": \"iana\",\n \"extensions\": [\"karbon\"]\n },\n \"application/vnd.kde.kchart\": {\n \"source\": \"iana\",\n \"extensions\": [\"chrt\"]\n },\n \"application/vnd.kde.kformula\": {\n \"source\": \"iana\",\n \"extensions\": [\"kfo\"]\n },\n \"application/vnd.kde.kivio\": {\n \"source\": \"iana\",\n \"extensions\": [\"flw\"]\n },\n \"application/vnd.kde.kontour\": {\n \"source\": \"iana\",\n \"extensions\": [\"kon\"]\n },\n \"application/vnd.kde.kpresenter\": {\n \"source\": \"iana\",\n \"extensions\": [\"kpr\",\"kpt\"]\n },\n \"application/vnd.kde.kspread\": {\n \"source\": \"iana\",\n \"extensions\": [\"ksp\"]\n },\n \"application/vnd.kde.kword\": {\n \"source\": \"iana\",\n \"extensions\": [\"kwd\",\"kwt\"]\n },\n \"application/vnd.kdl\": {\n \"source\": \"iana\"\n },\n \"application/vnd.kenameaapp\": {\n \"source\": \"iana\",\n \"extensions\": [\"htke\"]\n },\n \"application/vnd.keyman.kmp+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/vnd.keyman.kmx\": {\n \"source\": \"iana\"\n },\n \"application/vnd.kidspiration\": {\n \"source\": \"iana\",\n \"extensions\": [\"kia\"]\n },\n \"application/vnd.kinar\": {\n \"source\": \"iana\",\n \"extensions\": [\"kne\",\"knp\"]\n },\n \"application/vnd.koan\": {\n \"source\": \"iana\",\n \"extensions\": [\"skp\",\"skd\",\"skt\",\"skm\"]\n },\n \"application/vnd.kodak-descriptor\": {\n \"source\": \"iana\",\n \"extensions\": [\"sse\"]\n },\n \"application/vnd.las\": {\n \"source\": \"iana\"\n },\n \"application/vnd.las.las+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.las.las+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"lasxml\"]\n },\n \"application/vnd.laszip\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ldev.productlicensing\": {\n \"source\": \"iana\"\n },\n \"application/vnd.leap+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.liberty-request+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.llamagraphics.life-balance.desktop\": {\n \"source\": \"iana\",\n \"extensions\": [\"lbd\"]\n },\n \"application/vnd.llamagraphics.life-balance.exchange+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"lbe\"]\n },\n \"application/vnd.logipipe.circuit+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/vnd.loom\": {\n \"source\": \"iana\"\n },\n \"application/vnd.lotus-1-2-3\": {\n \"source\": \"iana\",\n \"extensions\": [\"123\"]\n },\n \"application/vnd.lotus-approach\": {\n \"source\": \"iana\",\n \"extensions\": [\"apr\"]\n },\n \"application/vnd.lotus-freelance\": {\n \"source\": \"iana\",\n \"extensions\": [\"pre\"]\n },\n \"application/vnd.lotus-notes\": {\n \"source\": \"iana\",\n \"extensions\": [\"nsf\"]\n },\n \"application/vnd.lotus-organizer\": {\n \"source\": \"iana\",\n \"extensions\": [\"org\"]\n },\n \"application/vnd.lotus-screencam\": {\n \"source\": \"iana\",\n \"extensions\": [\"scm\"]\n },\n \"application/vnd.lotus-wordpro\": {\n \"source\": \"iana\",\n \"extensions\": [\"lwp\"]\n },\n \"application/vnd.macports.portpkg\": {\n \"source\": \"iana\",\n \"extensions\": [\"portpkg\"]\n },\n \"application/vnd.mapbox-vector-tile\": {\n \"source\": \"iana\",\n \"extensions\": [\"mvt\"]\n },\n \"application/vnd.marlin.drm.actiontoken+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.marlin.drm.conftoken+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.marlin.drm.license+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.marlin.drm.mdcf\": {\n \"source\": \"iana\"\n },\n \"application/vnd.mason+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.maxar.archive.3tz+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/vnd.maxmind.maxmind-db\": {\n \"source\": \"iana\"\n },\n \"application/vnd.mcd\": {\n \"source\": \"iana\",\n \"extensions\": [\"mcd\"]\n },\n \"application/vnd.mdl\": {\n \"source\": \"iana\"\n },\n \"application/vnd.mdl-mbsdf\": {\n \"source\": \"iana\"\n },\n \"application/vnd.medcalcdata\": {\n \"source\": \"iana\",\n \"extensions\": [\"mc1\"]\n },\n \"application/vnd.mediastation.cdkey\": {\n \"source\": \"iana\",\n \"extensions\": [\"cdkey\"]\n },\n \"application/vnd.medicalholodeck.recordxr\": {\n \"source\": \"iana\"\n },\n \"application/vnd.meridian-slingshot\": {\n \"source\": \"iana\"\n },\n \"application/vnd.mermaid\": {\n \"source\": \"iana\"\n },\n \"application/vnd.mfer\": {\n \"source\": \"iana\",\n \"extensions\": [\"mwf\"]\n },\n \"application/vnd.mfmp\": {\n \"source\": \"iana\",\n \"extensions\": [\"mfm\"]\n },\n \"application/vnd.micro+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.micrografx.flo\": {\n \"source\": \"iana\",\n \"extensions\": [\"flo\"]\n },\n \"application/vnd.micrografx.igx\": {\n \"source\": \"iana\",\n \"extensions\": [\"igx\"]\n },\n \"application/vnd.microsoft.portable-executable\": {\n \"source\": \"iana\"\n },\n \"application/vnd.microsoft.windows.thumbnail-cache\": {\n \"source\": \"iana\"\n },\n \"application/vnd.miele+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.mif\": {\n \"source\": \"iana\",\n \"extensions\": [\"mif\"]\n },\n \"application/vnd.minisoft-hp3000-save\": {\n \"source\": \"iana\"\n },\n \"application/vnd.mitsubishi.misty-guard.trustweb\": {\n \"source\": \"iana\"\n },\n \"application/vnd.mobius.daf\": {\n \"source\": \"iana\",\n \"extensions\": [\"daf\"]\n },\n \"application/vnd.mobius.dis\": {\n \"source\": \"iana\",\n \"extensions\": [\"dis\"]\n },\n \"application/vnd.mobius.mbk\": {\n \"source\": \"iana\",\n \"extensions\": [\"mbk\"]\n },\n \"application/vnd.mobius.mqy\": {\n \"source\": \"iana\",\n \"extensions\": [\"mqy\"]\n },\n \"application/vnd.mobius.msl\": {\n \"source\": \"iana\",\n \"extensions\": [\"msl\"]\n },\n \"application/vnd.mobius.plc\": {\n \"source\": \"iana\",\n \"extensions\": [\"plc\"]\n },\n \"application/vnd.mobius.txf\": {\n \"source\": \"iana\",\n \"extensions\": [\"txf\"]\n },\n \"application/vnd.modl\": {\n \"source\": \"iana\"\n },\n \"application/vnd.mophun.application\": {\n \"source\": \"iana\",\n \"extensions\": [\"mpn\"]\n },\n \"application/vnd.mophun.certificate\": {\n \"source\": \"iana\",\n \"extensions\": [\"mpc\"]\n },\n \"application/vnd.motorola.flexsuite\": {\n \"source\": \"iana\"\n },\n \"application/vnd.motorola.flexsuite.adsi\": {\n \"source\": \"iana\"\n },\n \"application/vnd.motorola.flexsuite.fis\": {\n \"source\": \"iana\"\n },\n \"application/vnd.motorola.flexsuite.gotap\": {\n \"source\": \"iana\"\n },\n \"application/vnd.motorola.flexsuite.kmr\": {\n \"source\": \"iana\"\n },\n \"application/vnd.motorola.flexsuite.ttc\": {\n \"source\": \"iana\"\n },\n \"application/vnd.motorola.flexsuite.wem\": {\n \"source\": \"iana\"\n },\n \"application/vnd.motorola.iprm\": {\n \"source\": \"iana\"\n },\n \"application/vnd.mozilla.xul+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xul\"]\n },\n \"application/vnd.ms-3mfdocument\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-artgalry\": {\n \"source\": \"iana\",\n \"extensions\": [\"cil\"]\n },\n \"application/vnd.ms-asf\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-cab-compressed\": {\n \"source\": \"iana\",\n \"extensions\": [\"cab\"]\n },\n \"application/vnd.ms-color.iccprofile\": {\n \"source\": \"apache\"\n },\n \"application/vnd.ms-excel\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"xls\",\"xlm\",\"xla\",\"xlc\",\"xlt\",\"xlw\"]\n },\n \"application/vnd.ms-excel.addin.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"xlam\"]\n },\n \"application/vnd.ms-excel.sheet.binary.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"xlsb\"]\n },\n \"application/vnd.ms-excel.sheet.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"xlsm\"]\n },\n \"application/vnd.ms-excel.template.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"xltm\"]\n },\n \"application/vnd.ms-fontobject\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"eot\"]\n },\n \"application/vnd.ms-htmlhelp\": {\n \"source\": \"iana\",\n \"extensions\": [\"chm\"]\n },\n \"application/vnd.ms-ims\": {\n \"source\": \"iana\",\n \"extensions\": [\"ims\"]\n },\n \"application/vnd.ms-lrm\": {\n \"source\": \"iana\",\n \"extensions\": [\"lrm\"]\n },\n \"application/vnd.ms-office.activex+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.ms-officetheme\": {\n \"source\": \"iana\",\n \"extensions\": [\"thmx\"]\n },\n \"application/vnd.ms-opentype\": {\n \"source\": \"apache\",\n \"compressible\": true\n },\n \"application/vnd.ms-outlook\": {\n \"compressible\": false,\n \"extensions\": [\"msg\"]\n },\n \"application/vnd.ms-package.obfuscated-opentype\": {\n \"source\": \"apache\"\n },\n \"application/vnd.ms-pki.seccat\": {\n \"source\": \"apache\",\n \"extensions\": [\"cat\"]\n },\n \"application/vnd.ms-pki.stl\": {\n \"source\": \"apache\",\n \"extensions\": [\"stl\"]\n },\n \"application/vnd.ms-playready.initiator+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.ms-powerpoint\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"ppt\",\"pps\",\"pot\"]\n },\n \"application/vnd.ms-powerpoint.addin.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"ppam\"]\n },\n \"application/vnd.ms-powerpoint.presentation.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"pptm\"]\n },\n \"application/vnd.ms-powerpoint.slide.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"sldm\"]\n },\n \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"ppsm\"]\n },\n \"application/vnd.ms-powerpoint.template.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"potm\"]\n },\n \"application/vnd.ms-printdevicecapabilities+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.ms-printing.printticket+xml\": {\n \"source\": \"apache\",\n \"compressible\": true\n },\n \"application/vnd.ms-printschematicket+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.ms-project\": {\n \"source\": \"iana\",\n \"extensions\": [\"mpp\",\"mpt\"]\n },\n \"application/vnd.ms-tnef\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-visio.viewer\": {\n \"extensions\": [\"vdx\"]\n },\n \"application/vnd.ms-windows.devicepairing\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-windows.nwprinting.oob\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-windows.printerpairing\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-windows.wsd.oob\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-wmdrm.lic-chlg-req\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-wmdrm.lic-resp\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-wmdrm.meter-chlg-req\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-wmdrm.meter-resp\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-word.document.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"docm\"]\n },\n \"application/vnd.ms-word.template.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"dotm\"]\n },\n \"application/vnd.ms-works\": {\n \"source\": \"iana\",\n \"extensions\": [\"wps\",\"wks\",\"wcm\",\"wdb\"]\n },\n \"application/vnd.ms-wpl\": {\n \"source\": \"iana\",\n \"extensions\": [\"wpl\"]\n },\n \"application/vnd.ms-xpsdocument\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"xps\"]\n },\n \"application/vnd.msa-disk-image\": {\n \"source\": \"iana\"\n },\n \"application/vnd.mseq\": {\n \"source\": \"iana\",\n \"extensions\": [\"mseq\"]\n },\n \"application/vnd.msgpack\": {\n \"source\": \"iana\"\n },\n \"application/vnd.msign\": {\n \"source\": \"iana\"\n },\n \"application/vnd.multiad.creator\": {\n \"source\": \"iana\"\n },\n \"application/vnd.multiad.creator.cif\": {\n \"source\": \"iana\"\n },\n \"application/vnd.music-niff\": {\n \"source\": \"iana\"\n },\n \"application/vnd.musician\": {\n \"source\": \"iana\",\n \"extensions\": [\"mus\"]\n },\n \"application/vnd.muvee.style\": {\n \"source\": \"iana\",\n \"extensions\": [\"msty\"]\n },\n \"application/vnd.mynfc\": {\n \"source\": \"iana\",\n \"extensions\": [\"taglet\"]\n },\n \"application/vnd.nacamar.ybrid+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.nato.bindingdataobject+cbor\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nato.bindingdataobject+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.nato.bindingdataobject+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"bdo\"]\n },\n \"application/vnd.nato.openxmlformats-package.iepd+zip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/vnd.ncd.control\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ncd.reference\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nearst.inv+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.nebumind.line\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nervana\": {\n \"source\": \"iana\"\n },\n \"application/vnd.netfpx\": {\n \"source\": \"iana\"\n },\n \"application/vnd.neurolanguage.nlu\": {\n \"source\": \"iana\",\n \"extensions\": [\"nlu\"]\n },\n \"application/vnd.nimn\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nintendo.nitro.rom\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nintendo.snes.rom\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nitf\": {\n \"source\": \"iana\",\n \"extensions\": [\"ntf\",\"nitf\"]\n },\n \"application/vnd.noblenet-directory\": {\n \"source\": \"iana\",\n \"extensions\": [\"nnd\"]\n },\n \"application/vnd.noblenet-sealer\": {\n \"source\": \"iana\",\n \"extensions\": [\"nns\"]\n },\n \"application/vnd.noblenet-web\": {\n \"source\": \"iana\",\n \"extensions\": [\"nnw\"]\n },\n \"application/vnd.nokia.catalogs\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nokia.conml+wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nokia.conml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.nokia.iptv.config+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.nokia.isds-radio-presets\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nokia.landmark+wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nokia.landmark+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.nokia.landmarkcollection+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.nokia.n-gage.ac+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"ac\"]\n },\n \"application/vnd.nokia.n-gage.data\": {\n \"source\": \"iana\",\n \"extensions\": [\"ngdat\"]\n },\n \"application/vnd.nokia.n-gage.symbian.install\": {\n \"source\": \"apache\",\n \"extensions\": [\"n-gage\"]\n },\n \"application/vnd.nokia.ncd\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nokia.pcd+wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nokia.pcd+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.nokia.radio-preset\": {\n \"source\": \"iana\",\n \"extensions\": [\"rpst\"]\n },\n \"application/vnd.nokia.radio-presets\": {\n \"source\": \"iana\",\n \"extensions\": [\"rpss\"]\n },\n \"application/vnd.novadigm.edm\": {\n \"source\": \"iana\",\n \"extensions\": [\"edm\"]\n },\n \"application/vnd.novadigm.edx\": {\n \"source\": \"iana\",\n \"extensions\": [\"edx\"]\n },\n \"application/vnd.novadigm.ext\": {\n \"source\": \"iana\",\n \"extensions\": [\"ext\"]\n },\n \"application/vnd.ntt-local.content-share\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ntt-local.file-transfer\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ntt-local.ogw_remote-access\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ntt-local.sip-ta_remote\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ntt-local.sip-ta_tcp_stream\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oai.workflows\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oai.workflows+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oai.workflows+yaml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oasis.opendocument.base\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oasis.opendocument.chart\": {\n \"source\": \"iana\",\n \"extensions\": [\"odc\"]\n },\n \"application/vnd.oasis.opendocument.chart-template\": {\n \"source\": \"iana\",\n \"extensions\": [\"otc\"]\n },\n \"application/vnd.oasis.opendocument.database\": {\n \"source\": \"apache\",\n \"extensions\": [\"odb\"]\n },\n \"application/vnd.oasis.opendocument.formula\": {\n \"source\": \"iana\",\n \"extensions\": [\"odf\"]\n },\n \"application/vnd.oasis.opendocument.formula-template\": {\n \"source\": \"iana\",\n \"extensions\": [\"odft\"]\n },\n \"application/vnd.oasis.opendocument.graphics\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"odg\"]\n },\n \"application/vnd.oasis.opendocument.graphics-template\": {\n \"source\": \"iana\",\n \"extensions\": [\"otg\"]\n },\n \"application/vnd.oasis.opendocument.image\": {\n \"source\": \"iana\",\n \"extensions\": [\"odi\"]\n },\n \"application/vnd.oasis.opendocument.image-template\": {\n \"source\": \"iana\",\n \"extensions\": [\"oti\"]\n },\n \"application/vnd.oasis.opendocument.presentation\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"odp\"]\n },\n \"application/vnd.oasis.opendocument.presentation-template\": {\n \"source\": \"iana\",\n \"extensions\": [\"otp\"]\n },\n \"application/vnd.oasis.opendocument.spreadsheet\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"ods\"]\n },\n \"application/vnd.oasis.opendocument.spreadsheet-template\": {\n \"source\": \"iana\",\n \"extensions\": [\"ots\"]\n },\n \"application/vnd.oasis.opendocument.text\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"odt\"]\n },\n \"application/vnd.oasis.opendocument.text-master\": {\n \"source\": \"iana\",\n \"extensions\": [\"odm\"]\n },\n \"application/vnd.oasis.opendocument.text-master-template\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oasis.opendocument.text-template\": {\n \"source\": \"iana\",\n \"extensions\": [\"ott\"]\n },\n \"application/vnd.oasis.opendocument.text-web\": {\n \"source\": \"iana\",\n \"extensions\": [\"oth\"]\n },\n \"application/vnd.obn\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ocf+cbor\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oci.image.manifest.v1+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oftn.l10n+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oipf.contentaccessdownload+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oipf.contentaccessstreaming+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oipf.cspg-hexbinary\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oipf.dae.svg+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oipf.dae.xhtml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oipf.mippvcontrolmessage+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oipf.pae.gem\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oipf.spdiscovery+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oipf.spdlist+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oipf.ueprofile+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oipf.userprofile+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.olpc-sugar\": {\n \"source\": \"iana\",\n \"extensions\": [\"xo\"]\n },\n \"application/vnd.oma-scws-config\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma-scws-http-request\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma-scws-http-response\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.bcast.associated-procedure-parameter+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.bcast.drm-trigger+xml\": {\n \"source\": \"apache\",\n \"compressible\": true\n },\n \"application/vnd.oma.bcast.imd+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.bcast.ltkm\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.bcast.notification+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.bcast.provisioningtrigger\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.bcast.sgboot\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.bcast.sgdd+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.bcast.sgdu\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.bcast.simple-symbol-container\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.bcast.smartcard-trigger+xml\": {\n \"source\": \"apache\",\n \"compressible\": true\n },\n \"application/vnd.oma.bcast.sprov+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.bcast.stkm\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.cab-address-book+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.cab-feature-handler+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.cab-pcc+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.cab-subs-invite+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.cab-user-prefs+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.dcd\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.dcdc\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.dd2+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"dd2\"]\n },\n \"application/vnd.oma.drm.risd+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.group-usage-list+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.lwm2m+cbor\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.lwm2m+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.lwm2m+tlv\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.pal+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.poc.detailed-progress-report+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.poc.final-report+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.poc.groups+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.poc.invocation-descriptor+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.poc.optimized-progress-report+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.push\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.scidm.messages+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oma.xcap-directory+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.omads-email+xml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true\n },\n \"application/vnd.omads-file+xml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true\n },\n \"application/vnd.omads-folder+xml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true\n },\n \"application/vnd.omaloc-supl-init\": {\n \"source\": \"iana\"\n },\n \"application/vnd.onepager\": {\n \"source\": \"iana\"\n },\n \"application/vnd.onepagertamp\": {\n \"source\": \"iana\"\n },\n \"application/vnd.onepagertamx\": {\n \"source\": \"iana\"\n },\n \"application/vnd.onepagertat\": {\n \"source\": \"iana\"\n },\n \"application/vnd.onepagertatp\": {\n \"source\": \"iana\"\n },\n \"application/vnd.onepagertatx\": {\n \"source\": \"iana\"\n },\n \"application/vnd.onvif.metadata\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openblox.game+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"obgx\"]\n },\n \"application/vnd.openblox.game-binary\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openeye.oeb\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openofficeorg.extension\": {\n \"source\": \"apache\",\n \"extensions\": [\"oxt\"]\n },\n \"application/vnd.openstreetmap.data+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"osm\"]\n },\n \"application/vnd.opentimestamps.ots\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openvpi.dspx+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.custom-properties+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.customxmlproperties+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.drawing+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.drawingml.chart+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.extended-properties+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.comments+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"pptx\"]\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.slide\": {\n \"source\": \"iana\",\n \"extensions\": [\"sldx\"]\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.slide+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\": {\n \"source\": \"iana\",\n \"extensions\": [\"ppsx\"]\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.tags+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.template\": {\n \"source\": \"iana\",\n \"extensions\": [\"potx\"]\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"xlsx\"]\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\": {\n \"source\": \"iana\",\n \"extensions\": [\"xltx\"]\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.theme+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.themeoverride+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.vmldrawing\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"docx\"]\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\": {\n \"source\": \"iana\",\n \"extensions\": [\"dotx\"]\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-package.core-properties+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.openxmlformats-package.relationships+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oracle.resource+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.orange.indata\": {\n \"source\": \"iana\"\n },\n \"application/vnd.osa.netdeploy\": {\n \"source\": \"iana\"\n },\n \"application/vnd.osgeo.mapguide.package\": {\n \"source\": \"iana\",\n \"extensions\": [\"mgp\"]\n },\n \"application/vnd.osgi.bundle\": {\n \"source\": \"iana\"\n },\n \"application/vnd.osgi.dp\": {\n \"source\": \"iana\",\n \"extensions\": [\"dp\"]\n },\n \"application/vnd.osgi.subsystem\": {\n \"source\": \"iana\",\n \"extensions\": [\"esa\"]\n },\n \"application/vnd.otps.ct-kip+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oxli.countgraph\": {\n \"source\": \"iana\"\n },\n \"application/vnd.pagerduty+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.palm\": {\n \"source\": \"iana\",\n \"extensions\": [\"pdb\",\"pqa\",\"oprc\"]\n },\n \"application/vnd.panoply\": {\n \"source\": \"iana\"\n },\n \"application/vnd.paos.xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.patentdive\": {\n \"source\": \"iana\"\n },\n \"application/vnd.patientecommsdoc\": {\n \"source\": \"iana\"\n },\n \"application/vnd.pawaafile\": {\n \"source\": \"iana\",\n \"extensions\": [\"paw\"]\n },\n \"application/vnd.pcos\": {\n \"source\": \"iana\"\n },\n \"application/vnd.pg.format\": {\n \"source\": \"iana\",\n \"extensions\": [\"str\"]\n },\n \"application/vnd.pg.osasli\": {\n \"source\": \"iana\",\n \"extensions\": [\"ei6\"]\n },\n \"application/vnd.piaccess.application-licence\": {\n \"source\": \"iana\"\n },\n \"application/vnd.picsel\": {\n \"source\": \"iana\",\n \"extensions\": [\"efif\"]\n },\n \"application/vnd.pmi.widget\": {\n \"source\": \"iana\",\n \"extensions\": [\"wg\"]\n },\n \"application/vnd.poc.group-advertisement+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.pocketlearn\": {\n \"source\": \"iana\",\n \"extensions\": [\"plf\"]\n },\n \"application/vnd.powerbuilder6\": {\n \"source\": \"iana\",\n \"extensions\": [\"pbd\"]\n },\n \"application/vnd.powerbuilder6-s\": {\n \"source\": \"iana\"\n },\n \"application/vnd.powerbuilder7\": {\n \"source\": \"iana\"\n },\n \"application/vnd.powerbuilder7-s\": {\n \"source\": \"iana\"\n },\n \"application/vnd.powerbuilder75\": {\n \"source\": \"iana\"\n },\n \"application/vnd.powerbuilder75-s\": {\n \"source\": \"iana\"\n },\n \"application/vnd.preminet\": {\n \"source\": \"iana\"\n },\n \"application/vnd.previewsystems.box\": {\n \"source\": \"iana\",\n \"extensions\": [\"box\"]\n },\n \"application/vnd.procrate.brushset\": {\n \"extensions\": [\"brushset\"]\n },\n \"application/vnd.procreate.brush\": {\n \"extensions\": [\"brush\"]\n },\n \"application/vnd.procreate.dream\": {\n \"extensions\": [\"drm\"]\n },\n \"application/vnd.proteus.magazine\": {\n \"source\": \"iana\",\n \"extensions\": [\"mgz\"]\n },\n \"application/vnd.psfs\": {\n \"source\": \"iana\"\n },\n \"application/vnd.pt.mundusmundi\": {\n \"source\": \"iana\"\n },\n \"application/vnd.publishare-delta-tree\": {\n \"source\": \"iana\",\n \"extensions\": [\"qps\"]\n },\n \"application/vnd.pvi.ptid1\": {\n \"source\": \"iana\",\n \"extensions\": [\"ptid\"]\n },\n \"application/vnd.pwg-multiplexed\": {\n \"source\": \"iana\"\n },\n \"application/vnd.pwg-xhtml-print+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xhtm\"]\n },\n \"application/vnd.qualcomm.brew-app-res\": {\n \"source\": \"iana\"\n },\n \"application/vnd.quarantainenet\": {\n \"source\": \"iana\"\n },\n \"application/vnd.quark.quarkxpress\": {\n \"source\": \"iana\",\n \"extensions\": [\"qxd\",\"qxt\",\"qwd\",\"qwt\",\"qxl\",\"qxb\"]\n },\n \"application/vnd.quobject-quoxdocument\": {\n \"source\": \"iana\"\n },\n \"application/vnd.radisys.moml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.radisys.msml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.radisys.msml-audit+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.radisys.msml-audit-conf+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.radisys.msml-audit-conn+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.radisys.msml-audit-dialog+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.radisys.msml-audit-stream+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.radisys.msml-conf+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.radisys.msml-dialog+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.radisys.msml-dialog-base+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.radisys.msml-dialog-fax-detect+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.radisys.msml-dialog-fax-sendrecv+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.radisys.msml-dialog-group+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.radisys.msml-dialog-speech+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.radisys.msml-dialog-transform+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.rainstor.data\": {\n \"source\": \"iana\"\n },\n \"application/vnd.rapid\": {\n \"source\": \"iana\"\n },\n \"application/vnd.rar\": {\n \"source\": \"iana\",\n \"extensions\": [\"rar\"]\n },\n \"application/vnd.realvnc.bed\": {\n \"source\": \"iana\",\n \"extensions\": [\"bed\"]\n },\n \"application/vnd.recordare.musicxml\": {\n \"source\": \"iana\",\n \"extensions\": [\"mxl\"]\n },\n \"application/vnd.recordare.musicxml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"musicxml\"]\n },\n \"application/vnd.relpipe\": {\n \"source\": \"iana\"\n },\n \"application/vnd.renlearn.rlprint\": {\n \"source\": \"iana\"\n },\n \"application/vnd.resilient.logic\": {\n \"source\": \"iana\"\n },\n \"application/vnd.restful+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.rig.cryptonote\": {\n \"source\": \"iana\",\n \"extensions\": [\"cryptonote\"]\n },\n \"application/vnd.rim.cod\": {\n \"source\": \"apache\",\n \"extensions\": [\"cod\"]\n },\n \"application/vnd.rn-realmedia\": {\n \"source\": \"apache\",\n \"extensions\": [\"rm\"]\n },\n \"application/vnd.rn-realmedia-vbr\": {\n \"source\": \"apache\",\n \"extensions\": [\"rmvb\"]\n },\n \"application/vnd.route66.link66+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"link66\"]\n },\n \"application/vnd.rs-274x\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ruckus.download\": {\n \"source\": \"iana\"\n },\n \"application/vnd.s3sms\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sailingtracker.track\": {\n \"source\": \"iana\",\n \"extensions\": [\"st\"]\n },\n \"application/vnd.sar\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sbm.cid\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sbm.mid2\": {\n \"source\": \"iana\"\n },\n \"application/vnd.scribus\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealed.3df\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealed.csf\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealed.doc\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealed.eml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealed.mht\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealed.net\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealed.ppt\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealed.tiff\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealed.xls\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealedmedia.softseal.html\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealedmedia.softseal.pdf\": {\n \"source\": \"iana\"\n },\n \"application/vnd.seemail\": {\n \"source\": \"iana\",\n \"extensions\": [\"see\"]\n },\n \"application/vnd.seis+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.sema\": {\n \"source\": \"iana\",\n \"extensions\": [\"sema\"]\n },\n \"application/vnd.semd\": {\n \"source\": \"iana\",\n \"extensions\": [\"semd\"]\n },\n \"application/vnd.semf\": {\n \"source\": \"iana\",\n \"extensions\": [\"semf\"]\n },\n \"application/vnd.shade-save-file\": {\n \"source\": \"iana\"\n },\n \"application/vnd.shana.informed.formdata\": {\n \"source\": \"iana\",\n \"extensions\": [\"ifm\"]\n },\n \"application/vnd.shana.informed.formtemplate\": {\n \"source\": \"iana\",\n \"extensions\": [\"itp\"]\n },\n \"application/vnd.shana.informed.interchange\": {\n \"source\": \"iana\",\n \"extensions\": [\"iif\"]\n },\n \"application/vnd.shana.informed.package\": {\n \"source\": \"iana\",\n \"extensions\": [\"ipk\"]\n },\n \"application/vnd.shootproof+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.shopkick+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.shp\": {\n \"source\": \"iana\"\n },\n \"application/vnd.shx\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sigrok.session\": {\n \"source\": \"iana\"\n },\n \"application/vnd.simtech-mindmapper\": {\n \"source\": \"iana\",\n \"extensions\": [\"twd\",\"twds\"]\n },\n \"application/vnd.siren+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.sketchometry\": {\n \"source\": \"iana\"\n },\n \"application/vnd.smaf\": {\n \"source\": \"iana\",\n \"extensions\": [\"mmf\"]\n },\n \"application/vnd.smart.notebook\": {\n \"source\": \"iana\"\n },\n \"application/vnd.smart.teacher\": {\n \"source\": \"iana\",\n \"extensions\": [\"teacher\"]\n },\n \"application/vnd.smintio.portals.archive\": {\n \"source\": \"iana\"\n },\n \"application/vnd.snesdev-page-table\": {\n \"source\": \"iana\"\n },\n \"application/vnd.software602.filler.form+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"fo\"]\n },\n \"application/vnd.software602.filler.form-xml-zip\": {\n \"source\": \"iana\"\n },\n \"application/vnd.solent.sdkm+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"sdkm\",\"sdkd\"]\n },\n \"application/vnd.spotfire.dxp\": {\n \"source\": \"iana\",\n \"extensions\": [\"dxp\"]\n },\n \"application/vnd.spotfire.sfs\": {\n \"source\": \"iana\",\n \"extensions\": [\"sfs\"]\n },\n \"application/vnd.sqlite3\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sss-cod\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sss-dtf\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sss-ntf\": {\n \"source\": \"iana\"\n },\n \"application/vnd.stardivision.calc\": {\n \"source\": \"apache\",\n \"extensions\": [\"sdc\"]\n },\n \"application/vnd.stardivision.draw\": {\n \"source\": \"apache\",\n \"extensions\": [\"sda\"]\n },\n \"application/vnd.stardivision.impress\": {\n \"source\": \"apache\",\n \"extensions\": [\"sdd\"]\n },\n \"application/vnd.stardivision.math\": {\n \"source\": \"apache\",\n \"extensions\": [\"smf\"]\n },\n \"application/vnd.stardivision.writer\": {\n \"source\": \"apache\",\n \"extensions\": [\"sdw\",\"vor\"]\n },\n \"application/vnd.stardivision.writer-global\": {\n \"source\": \"apache\",\n \"extensions\": [\"sgl\"]\n },\n \"application/vnd.stepmania.package\": {\n \"source\": \"iana\",\n \"extensions\": [\"smzip\"]\n },\n \"application/vnd.stepmania.stepchart\": {\n \"source\": \"iana\",\n \"extensions\": [\"sm\"]\n },\n \"application/vnd.street-stream\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sun.wadl+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"wadl\"]\n },\n \"application/vnd.sun.xml.calc\": {\n \"source\": \"apache\",\n \"extensions\": [\"sxc\"]\n },\n \"application/vnd.sun.xml.calc.template\": {\n \"source\": \"apache\",\n \"extensions\": [\"stc\"]\n },\n \"application/vnd.sun.xml.draw\": {\n \"source\": \"apache\",\n \"extensions\": [\"sxd\"]\n },\n \"application/vnd.sun.xml.draw.template\": {\n \"source\": \"apache\",\n \"extensions\": [\"std\"]\n },\n \"application/vnd.sun.xml.impress\": {\n \"source\": \"apache\",\n \"extensions\": [\"sxi\"]\n },\n \"application/vnd.sun.xml.impress.template\": {\n \"source\": \"apache\",\n \"extensions\": [\"sti\"]\n },\n \"application/vnd.sun.xml.math\": {\n \"source\": \"apache\",\n \"extensions\": [\"sxm\"]\n },\n \"application/vnd.sun.xml.writer\": {\n \"source\": \"apache\",\n \"extensions\": [\"sxw\"]\n },\n \"application/vnd.sun.xml.writer.global\": {\n \"source\": \"apache\",\n \"extensions\": [\"sxg\"]\n },\n \"application/vnd.sun.xml.writer.template\": {\n \"source\": \"apache\",\n \"extensions\": [\"stw\"]\n },\n \"application/vnd.sus-calendar\": {\n \"source\": \"iana\",\n \"extensions\": [\"sus\",\"susp\"]\n },\n \"application/vnd.svd\": {\n \"source\": \"iana\",\n \"extensions\": [\"svd\"]\n },\n \"application/vnd.swiftview-ics\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sybyl.mol2\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sycle+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.syft+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.symbian.install\": {\n \"source\": \"apache\",\n \"extensions\": [\"sis\",\"sisx\"]\n },\n \"application/vnd.syncml+xml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true,\n \"extensions\": [\"xsm\"]\n },\n \"application/vnd.syncml.dm+wbxml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"extensions\": [\"bdm\"]\n },\n \"application/vnd.syncml.dm+xml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true,\n \"extensions\": [\"xdm\"]\n },\n \"application/vnd.syncml.dm.notification\": {\n \"source\": \"iana\"\n },\n \"application/vnd.syncml.dmddf+wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.syncml.dmddf+xml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true,\n \"extensions\": [\"ddf\"]\n },\n \"application/vnd.syncml.dmtnds+wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.syncml.dmtnds+xml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true\n },\n \"application/vnd.syncml.ds.notification\": {\n \"source\": \"iana\"\n },\n \"application/vnd.tableschema+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.tao.intent-module-archive\": {\n \"source\": \"iana\",\n \"extensions\": [\"tao\"]\n },\n \"application/vnd.tcpdump.pcap\": {\n \"source\": \"iana\",\n \"extensions\": [\"pcap\",\"cap\",\"dmp\"]\n },\n \"application/vnd.think-cell.ppttc+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.tmd.mediaflex.api+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.tml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.tmobile-livetv\": {\n \"source\": \"iana\",\n \"extensions\": [\"tmo\"]\n },\n \"application/vnd.tri.onesource\": {\n \"source\": \"iana\"\n },\n \"application/vnd.trid.tpt\": {\n \"source\": \"iana\",\n \"extensions\": [\"tpt\"]\n },\n \"application/vnd.triscape.mxs\": {\n \"source\": \"iana\",\n \"extensions\": [\"mxs\"]\n },\n \"application/vnd.trueapp\": {\n \"source\": \"iana\",\n \"extensions\": [\"tra\"]\n },\n \"application/vnd.truedoc\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ubisoft.webplayer\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ufdl\": {\n \"source\": \"iana\",\n \"extensions\": [\"ufd\",\"ufdl\"]\n },\n \"application/vnd.uic.osdm+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.uiq.theme\": {\n \"source\": \"iana\",\n \"extensions\": [\"utz\"]\n },\n \"application/vnd.umajin\": {\n \"source\": \"iana\",\n \"extensions\": [\"umj\"]\n },\n \"application/vnd.unity\": {\n \"source\": \"iana\",\n \"extensions\": [\"unityweb\"]\n },\n \"application/vnd.uoml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"uoml\",\"uo\"]\n },\n \"application/vnd.uplanet.alert\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.alert-wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.bearer-choice\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.bearer-choice-wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.cacheop\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.cacheop-wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.channel\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.channel-wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.list\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.list-wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.listcmd\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.listcmd-wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.signal\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uri-map\": {\n \"source\": \"iana\"\n },\n \"application/vnd.valve.source.material\": {\n \"source\": \"iana\"\n },\n \"application/vnd.vcx\": {\n \"source\": \"iana\",\n \"extensions\": [\"vcx\"]\n },\n \"application/vnd.vd-study\": {\n \"source\": \"iana\"\n },\n \"application/vnd.vectorworks\": {\n \"source\": \"iana\"\n },\n \"application/vnd.vel+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.veraison.tsm-report+cbor\": {\n \"source\": \"iana\"\n },\n \"application/vnd.veraison.tsm-report+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.verimatrix.vcas\": {\n \"source\": \"iana\"\n },\n \"application/vnd.veritone.aion+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.veryant.thin\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ves.encrypted\": {\n \"source\": \"iana\"\n },\n \"application/vnd.vidsoft.vidconference\": {\n \"source\": \"iana\"\n },\n \"application/vnd.visio\": {\n \"source\": \"iana\",\n \"extensions\": [\"vsd\",\"vst\",\"vss\",\"vsw\",\"vsdx\",\"vtx\"]\n },\n \"application/vnd.visionary\": {\n \"source\": \"iana\",\n \"extensions\": [\"vis\"]\n },\n \"application/vnd.vividence.scriptfile\": {\n \"source\": \"iana\"\n },\n \"application/vnd.vocalshaper.vsp4\": {\n \"source\": \"iana\"\n },\n \"application/vnd.vsf\": {\n \"source\": \"iana\",\n \"extensions\": [\"vsf\"]\n },\n \"application/vnd.wap.sic\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wap.slc\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wap.wbxml\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"extensions\": [\"wbxml\"]\n },\n \"application/vnd.wap.wmlc\": {\n \"source\": \"iana\",\n \"extensions\": [\"wmlc\"]\n },\n \"application/vnd.wap.wmlscriptc\": {\n \"source\": \"iana\",\n \"extensions\": [\"wmlsc\"]\n },\n \"application/vnd.wasmflow.wafl\": {\n \"source\": \"iana\"\n },\n \"application/vnd.webturbo\": {\n \"source\": \"iana\",\n \"extensions\": [\"wtb\"]\n },\n \"application/vnd.wfa.dpp\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wfa.p2p\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wfa.wsc\": {\n \"source\": \"iana\"\n },\n \"application/vnd.windows.devicepairing\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wmc\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wmf.bootstrap\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wolfram.mathematica\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wolfram.mathematica.package\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wolfram.player\": {\n \"source\": \"iana\",\n \"extensions\": [\"nbp\"]\n },\n \"application/vnd.wordlift\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wordperfect\": {\n \"source\": \"iana\",\n \"extensions\": [\"wpd\"]\n },\n \"application/vnd.wqd\": {\n \"source\": \"iana\",\n \"extensions\": [\"wqd\"]\n },\n \"application/vnd.wrq-hp3000-labelled\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wt.stf\": {\n \"source\": \"iana\",\n \"extensions\": [\"stf\"]\n },\n \"application/vnd.wv.csp+wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wv.csp+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.wv.ssp+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.xacml+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.xara\": {\n \"source\": \"iana\",\n \"extensions\": [\"xar\"]\n },\n \"application/vnd.xarin.cpj\": {\n \"source\": \"iana\"\n },\n \"application/vnd.xecrets-encrypted\": {\n \"source\": \"iana\"\n },\n \"application/vnd.xfdl\": {\n \"source\": \"iana\",\n \"extensions\": [\"xfdl\"]\n },\n \"application/vnd.xfdl.webform\": {\n \"source\": \"iana\"\n },\n \"application/vnd.xmi+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.xmpie.cpkg\": {\n \"source\": \"iana\"\n },\n \"application/vnd.xmpie.dpkg\": {\n \"source\": \"iana\"\n },\n \"application/vnd.xmpie.plan\": {\n \"source\": \"iana\"\n },\n \"application/vnd.xmpie.ppkg\": {\n \"source\": \"iana\"\n },\n \"application/vnd.xmpie.xlim\": {\n \"source\": \"iana\"\n },\n \"application/vnd.yamaha.hv-dic\": {\n \"source\": \"iana\",\n \"extensions\": [\"hvd\"]\n },\n \"application/vnd.yamaha.hv-script\": {\n \"source\": \"iana\",\n \"extensions\": [\"hvs\"]\n },\n \"application/vnd.yamaha.hv-voice\": {\n \"source\": \"iana\",\n \"extensions\": [\"hvp\"]\n },\n \"application/vnd.yamaha.openscoreformat\": {\n \"source\": \"iana\",\n \"extensions\": [\"osf\"]\n },\n \"application/vnd.yamaha.openscoreformat.osfpvg+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"osfpvg\"]\n },\n \"application/vnd.yamaha.remote-setup\": {\n \"source\": \"iana\"\n },\n \"application/vnd.yamaha.smaf-audio\": {\n \"source\": \"iana\",\n \"extensions\": [\"saf\"]\n },\n \"application/vnd.yamaha.smaf-phrase\": {\n \"source\": \"iana\",\n \"extensions\": [\"spf\"]\n },\n \"application/vnd.yamaha.through-ngn\": {\n \"source\": \"iana\"\n },\n \"application/vnd.yamaha.tunnel-udpencap\": {\n \"source\": \"iana\"\n },\n \"application/vnd.yaoweme\": {\n \"source\": \"iana\"\n },\n \"application/vnd.yellowriver-custom-menu\": {\n \"source\": \"iana\",\n \"extensions\": [\"cmp\"]\n },\n \"application/vnd.zul\": {\n \"source\": \"iana\",\n \"extensions\": [\"zir\",\"zirz\"]\n },\n \"application/vnd.zzazz.deck+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"zaz\"]\n },\n \"application/voicexml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"vxml\"]\n },\n \"application/voucher-cms+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/voucher-jws+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vp\": {\n \"source\": \"iana\"\n },\n \"application/vp+cose\": {\n \"source\": \"iana\"\n },\n \"application/vp+jwt\": {\n \"source\": \"iana\"\n },\n \"application/vq-rtcpxr\": {\n \"source\": \"iana\"\n },\n \"application/wasm\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"wasm\"]\n },\n \"application/watcherinfo+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"wif\"]\n },\n \"application/webpush-options+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/whoispp-query\": {\n \"source\": \"iana\"\n },\n \"application/whoispp-response\": {\n \"source\": \"iana\"\n },\n \"application/widget\": {\n \"source\": \"iana\",\n \"extensions\": [\"wgt\"]\n },\n \"application/winhlp\": {\n \"source\": \"apache\",\n \"extensions\": [\"hlp\"]\n },\n \"application/wita\": {\n \"source\": \"iana\"\n },\n \"application/wordperfect5.1\": {\n \"source\": \"iana\"\n },\n \"application/wsdl+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"wsdl\"]\n },\n \"application/wspolicy+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"wspolicy\"]\n },\n \"application/x-7z-compressed\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"7z\"]\n },\n \"application/x-abiword\": {\n \"source\": \"apache\",\n \"extensions\": [\"abw\"]\n },\n \"application/x-ace-compressed\": {\n \"source\": \"apache\",\n \"extensions\": [\"ace\"]\n },\n \"application/x-amf\": {\n \"source\": \"apache\"\n },\n \"application/x-apple-diskimage\": {\n \"source\": \"apache\",\n \"extensions\": [\"dmg\"]\n },\n \"application/x-arj\": {\n \"compressible\": false,\n \"extensions\": [\"arj\"]\n },\n \"application/x-authorware-bin\": {\n \"source\": \"apache\",\n \"extensions\": [\"aab\",\"x32\",\"u32\",\"vox\"]\n },\n \"application/x-authorware-map\": {\n \"source\": \"apache\",\n \"extensions\": [\"aam\"]\n },\n \"application/x-authorware-seg\": {\n \"source\": \"apache\",\n \"extensions\": [\"aas\"]\n },\n \"application/x-bcpio\": {\n \"source\": \"apache\",\n \"extensions\": [\"bcpio\"]\n },\n \"application/x-bdoc\": {\n \"compressible\": false,\n \"extensions\": [\"bdoc\"]\n },\n \"application/x-bittorrent\": {\n \"source\": \"apache\",\n \"extensions\": [\"torrent\"]\n },\n \"application/x-blender\": {\n \"extensions\": [\"blend\"]\n },\n \"application/x-blorb\": {\n \"source\": \"apache\",\n \"extensions\": [\"blb\",\"blorb\"]\n },\n \"application/x-bzip\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"bz\"]\n },\n \"application/x-bzip2\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"bz2\",\"boz\"]\n },\n \"application/x-cbr\": {\n \"source\": \"apache\",\n \"extensions\": [\"cbr\",\"cba\",\"cbt\",\"cbz\",\"cb7\"]\n },\n \"application/x-cdlink\": {\n \"source\": \"apache\",\n \"extensions\": [\"vcd\"]\n },\n \"application/x-cfs-compressed\": {\n \"source\": \"apache\",\n \"extensions\": [\"cfs\"]\n },\n \"application/x-chat\": {\n \"source\": \"apache\",\n \"extensions\": [\"chat\"]\n },\n \"application/x-chess-pgn\": {\n \"source\": \"apache\",\n \"extensions\": [\"pgn\"]\n },\n \"application/x-chrome-extension\": {\n \"extensions\": [\"crx\"]\n },\n \"application/x-cocoa\": {\n \"source\": \"nginx\",\n \"extensions\": [\"cco\"]\n },\n \"application/x-compress\": {\n \"source\": \"apache\"\n },\n \"application/x-compressed\": {\n \"extensions\": [\"rar\"]\n },\n \"application/x-conference\": {\n \"source\": \"apache\",\n \"extensions\": [\"nsc\"]\n },\n \"application/x-cpio\": {\n \"source\": \"apache\",\n \"extensions\": [\"cpio\"]\n },\n \"application/x-csh\": {\n \"source\": \"apache\",\n \"extensions\": [\"csh\"]\n },\n \"application/x-deb\": {\n \"compressible\": false\n },\n \"application/x-debian-package\": {\n \"source\": \"apache\",\n \"extensions\": [\"deb\",\"udeb\"]\n },\n \"application/x-dgc-compressed\": {\n \"source\": \"apache\",\n \"extensions\": [\"dgc\"]\n },\n \"application/x-director\": {\n \"source\": \"apache\",\n \"extensions\": [\"dir\",\"dcr\",\"dxr\",\"cst\",\"cct\",\"cxt\",\"w3d\",\"fgd\",\"swa\"]\n },\n \"application/x-doom\": {\n \"source\": \"apache\",\n \"extensions\": [\"wad\"]\n },\n \"application/x-dtbncx+xml\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"ncx\"]\n },\n \"application/x-dtbook+xml\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"dtb\"]\n },\n \"application/x-dtbresource+xml\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"res\"]\n },\n \"application/x-dvi\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"dvi\"]\n },\n \"application/x-envoy\": {\n \"source\": \"apache\",\n \"extensions\": [\"evy\"]\n },\n \"application/x-eva\": {\n \"source\": \"apache\",\n \"extensions\": [\"eva\"]\n },\n \"application/x-font-bdf\": {\n \"source\": \"apache\",\n \"extensions\": [\"bdf\"]\n },\n \"application/x-font-dos\": {\n \"source\": \"apache\"\n },\n \"application/x-font-framemaker\": {\n \"source\": \"apache\"\n },\n \"application/x-font-ghostscript\": {\n \"source\": \"apache\",\n \"extensions\": [\"gsf\"]\n },\n \"application/x-font-libgrx\": {\n \"source\": \"apache\"\n },\n \"application/x-font-linux-psf\": {\n \"source\": \"apache\",\n \"extensions\": [\"psf\"]\n },\n \"application/x-font-pcf\": {\n \"source\": \"apache\",\n \"extensions\": [\"pcf\"]\n },\n \"application/x-font-snf\": {\n \"source\": \"apache\",\n \"extensions\": [\"snf\"]\n },\n \"application/x-font-speedo\": {\n \"source\": \"apache\"\n },\n \"application/x-font-sunos-news\": {\n \"source\": \"apache\"\n },\n \"application/x-font-type1\": {\n \"source\": \"apache\",\n \"extensions\": [\"pfa\",\"pfb\",\"pfm\",\"afm\"]\n },\n \"application/x-font-vfont\": {\n \"source\": \"apache\"\n },\n \"application/x-freearc\": {\n \"source\": \"apache\",\n \"extensions\": [\"arc\"]\n },\n \"application/x-futuresplash\": {\n \"source\": \"apache\",\n \"extensions\": [\"spl\"]\n },\n \"application/x-gca-compressed\": {\n \"source\": \"apache\",\n \"extensions\": [\"gca\"]\n },\n \"application/x-glulx\": {\n \"source\": \"apache\",\n \"extensions\": [\"ulx\"]\n },\n \"application/x-gnumeric\": {\n \"source\": \"apache\",\n \"extensions\": [\"gnumeric\"]\n },\n \"application/x-gramps-xml\": {\n \"source\": \"apache\",\n \"extensions\": [\"gramps\"]\n },\n \"application/x-gtar\": {\n \"source\": \"apache\",\n \"extensions\": [\"gtar\"]\n },\n \"application/x-gzip\": {\n \"source\": \"apache\"\n },\n \"application/x-hdf\": {\n \"source\": \"apache\",\n \"extensions\": [\"hdf\"]\n },\n \"application/x-httpd-php\": {\n \"compressible\": true,\n \"extensions\": [\"php\"]\n },\n \"application/x-install-instructions\": {\n \"source\": \"apache\",\n \"extensions\": [\"install\"]\n },\n \"application/x-ipynb+json\": {\n \"compressible\": true,\n \"extensions\": [\"ipynb\"]\n },\n \"application/x-iso9660-image\": {\n \"source\": \"apache\",\n \"extensions\": [\"iso\"]\n },\n \"application/x-iwork-keynote-sffkey\": {\n \"extensions\": [\"key\"]\n },\n \"application/x-iwork-numbers-sffnumbers\": {\n \"extensions\": [\"numbers\"]\n },\n \"application/x-iwork-pages-sffpages\": {\n \"extensions\": [\"pages\"]\n },\n \"application/x-java-archive-diff\": {\n \"source\": \"nginx\",\n \"extensions\": [\"jardiff\"]\n },\n \"application/x-java-jnlp-file\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"jnlp\"]\n },\n \"application/x-javascript\": {\n \"compressible\": true\n },\n \"application/x-keepass2\": {\n \"extensions\": [\"kdbx\"]\n },\n \"application/x-latex\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"latex\"]\n },\n \"application/x-lua-bytecode\": {\n \"extensions\": [\"luac\"]\n },\n \"application/x-lzh-compressed\": {\n \"source\": \"apache\",\n \"extensions\": [\"lzh\",\"lha\"]\n },\n \"application/x-makeself\": {\n \"source\": \"nginx\",\n \"extensions\": [\"run\"]\n },\n \"application/x-mie\": {\n \"source\": \"apache\",\n \"extensions\": [\"mie\"]\n },\n \"application/x-mobipocket-ebook\": {\n \"source\": \"apache\",\n \"extensions\": [\"prc\",\"mobi\"]\n },\n \"application/x-mpegurl\": {\n \"compressible\": false\n },\n \"application/x-ms-application\": {\n \"source\": \"apache\",\n \"extensions\": [\"application\"]\n },\n \"application/x-ms-shortcut\": {\n \"source\": \"apache\",\n \"extensions\": [\"lnk\"]\n },\n \"application/x-ms-wmd\": {\n \"source\": \"apache\",\n \"extensions\": [\"wmd\"]\n },\n \"application/x-ms-wmz\": {\n \"source\": \"apache\",\n \"extensions\": [\"wmz\"]\n },\n \"application/x-ms-xbap\": {\n \"source\": \"apache\",\n \"extensions\": [\"xbap\"]\n },\n \"application/x-msaccess\": {\n \"source\": \"apache\",\n \"extensions\": [\"mdb\"]\n },\n \"application/x-msbinder\": {\n \"source\": \"apache\",\n \"extensions\": [\"obd\"]\n },\n \"application/x-mscardfile\": {\n \"source\": \"apache\",\n \"extensions\": [\"crd\"]\n },\n \"application/x-msclip\": {\n \"source\": \"apache\",\n \"extensions\": [\"clp\"]\n },\n \"application/x-msdos-program\": {\n \"extensions\": [\"exe\"]\n },\n \"application/x-msdownload\": {\n \"source\": \"apache\",\n \"extensions\": [\"exe\",\"dll\",\"com\",\"bat\",\"msi\"]\n },\n \"application/x-msmediaview\": {\n \"source\": \"apache\",\n \"extensions\": [\"mvb\",\"m13\",\"m14\"]\n },\n \"application/x-msmetafile\": {\n \"source\": \"apache\",\n \"extensions\": [\"wmf\",\"wmz\",\"emf\",\"emz\"]\n },\n \"application/x-msmoney\": {\n \"source\": \"apache\",\n \"extensions\": [\"mny\"]\n },\n \"application/x-mspublisher\": {\n \"source\": \"apache\",\n \"extensions\": [\"pub\"]\n },\n \"application/x-msschedule\": {\n \"source\": \"apache\",\n \"extensions\": [\"scd\"]\n },\n \"application/x-msterminal\": {\n \"source\": \"apache\",\n \"extensions\": [\"trm\"]\n },\n \"application/x-mswrite\": {\n \"source\": \"apache\",\n \"extensions\": [\"wri\"]\n },\n \"application/x-netcdf\": {\n \"source\": \"apache\",\n \"extensions\": [\"nc\",\"cdf\"]\n },\n \"application/x-ns-proxy-autoconfig\": {\n \"compressible\": true,\n \"extensions\": [\"pac\"]\n },\n \"application/x-nzb\": {\n \"source\": \"apache\",\n \"extensions\": [\"nzb\"]\n },\n \"application/x-perl\": {\n \"source\": \"nginx\",\n \"extensions\": [\"pl\",\"pm\"]\n },\n \"application/x-pilot\": {\n \"source\": \"nginx\",\n \"extensions\": [\"prc\",\"pdb\"]\n },\n \"application/x-pkcs12\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"p12\",\"pfx\"]\n },\n \"application/x-pkcs7-certificates\": {\n \"source\": \"apache\",\n \"extensions\": [\"p7b\",\"spc\"]\n },\n \"application/x-pkcs7-certreqresp\": {\n \"source\": \"apache\",\n \"extensions\": [\"p7r\"]\n },\n \"application/x-pki-message\": {\n \"source\": \"iana\"\n },\n \"application/x-rar-compressed\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"rar\"]\n },\n \"application/x-redhat-package-manager\": {\n \"source\": \"nginx\",\n \"extensions\": [\"rpm\"]\n },\n \"application/x-research-info-systems\": {\n \"source\": \"apache\",\n \"extensions\": [\"ris\"]\n },\n \"application/x-sea\": {\n \"source\": \"nginx\",\n \"extensions\": [\"sea\"]\n },\n \"application/x-sh\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"sh\"]\n },\n \"application/x-shar\": {\n \"source\": \"apache\",\n \"extensions\": [\"shar\"]\n },\n \"application/x-shockwave-flash\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"swf\"]\n },\n \"application/x-silverlight-app\": {\n \"source\": \"apache\",\n \"extensions\": [\"xap\"]\n },\n \"application/x-sql\": {\n \"source\": \"apache\",\n \"extensions\": [\"sql\"]\n },\n \"application/x-stuffit\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"sit\"]\n },\n \"application/x-stuffitx\": {\n \"source\": \"apache\",\n \"extensions\": [\"sitx\"]\n },\n \"application/x-subrip\": {\n \"source\": \"apache\",\n \"extensions\": [\"srt\"]\n },\n \"application/x-sv4cpio\": {\n \"source\": \"apache\",\n \"extensions\": [\"sv4cpio\"]\n },\n \"application/x-sv4crc\": {\n \"source\": \"apache\",\n \"extensions\": [\"sv4crc\"]\n },\n \"application/x-t3vm-image\": {\n \"source\": \"apache\",\n \"extensions\": [\"t3\"]\n },\n \"application/x-tads\": {\n \"source\": \"apache\",\n \"extensions\": [\"gam\"]\n },\n \"application/x-tar\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"tar\"]\n },\n \"application/x-tcl\": {\n \"source\": \"apache\",\n \"extensions\": [\"tcl\",\"tk\"]\n },\n \"application/x-tex\": {\n \"source\": \"apache\",\n \"extensions\": [\"tex\"]\n },\n \"application/x-tex-tfm\": {\n \"source\": \"apache\",\n \"extensions\": [\"tfm\"]\n },\n \"application/x-texinfo\": {\n \"source\": \"apache\",\n \"extensions\": [\"texinfo\",\"texi\"]\n },\n \"application/x-tgif\": {\n \"source\": \"apache\",\n \"extensions\": [\"obj\"]\n },\n \"application/x-ustar\": {\n \"source\": \"apache\",\n \"extensions\": [\"ustar\"]\n },\n \"application/x-virtualbox-hdd\": {\n \"compressible\": true,\n \"extensions\": [\"hdd\"]\n },\n \"application/x-virtualbox-ova\": {\n \"compressible\": true,\n \"extensions\": [\"ova\"]\n },\n \"application/x-virtualbox-ovf\": {\n \"compressible\": true,\n \"extensions\": [\"ovf\"]\n },\n \"application/x-virtualbox-vbox\": {\n \"compressible\": true,\n \"extensions\": [\"vbox\"]\n },\n \"application/x-virtualbox-vbox-extpack\": {\n \"compressible\": false,\n \"extensions\": [\"vbox-extpack\"]\n },\n \"application/x-virtualbox-vdi\": {\n \"compressible\": true,\n \"extensions\": [\"vdi\"]\n },\n \"application/x-virtualbox-vhd\": {\n \"compressible\": true,\n \"extensions\": [\"vhd\"]\n },\n \"application/x-virtualbox-vmdk\": {\n \"compressible\": true,\n \"extensions\": [\"vmdk\"]\n },\n \"application/x-wais-source\": {\n \"source\": \"apache\",\n \"extensions\": [\"src\"]\n },\n \"application/x-web-app-manifest+json\": {\n \"compressible\": true,\n \"extensions\": [\"webapp\"]\n },\n \"application/x-www-form-urlencoded\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/x-x509-ca-cert\": {\n \"source\": \"iana\",\n \"extensions\": [\"der\",\"crt\",\"pem\"]\n },\n \"application/x-x509-ca-ra-cert\": {\n \"source\": \"iana\"\n },\n \"application/x-x509-next-ca-cert\": {\n \"source\": \"iana\"\n },\n \"application/x-xfig\": {\n \"source\": \"apache\",\n \"extensions\": [\"fig\"]\n },\n \"application/x-xliff+xml\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"xlf\"]\n },\n \"application/x-xpinstall\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"xpi\"]\n },\n \"application/x-xz\": {\n \"source\": \"apache\",\n \"extensions\": [\"xz\"]\n },\n \"application/x-zip-compressed\": {\n \"extensions\": [\"zip\"]\n },\n \"application/x-zmachine\": {\n \"source\": \"apache\",\n \"extensions\": [\"z1\",\"z2\",\"z3\",\"z4\",\"z5\",\"z6\",\"z7\",\"z8\"]\n },\n \"application/x400-bp\": {\n \"source\": \"iana\"\n },\n \"application/xacml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/xaml+xml\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"xaml\"]\n },\n \"application/xcap-att+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xav\"]\n },\n \"application/xcap-caps+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xca\"]\n },\n \"application/xcap-diff+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xdf\"]\n },\n \"application/xcap-el+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xel\"]\n },\n \"application/xcap-error+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/xcap-ns+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xns\"]\n },\n \"application/xcon-conference-info+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/xcon-conference-info-diff+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/xenc+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xenc\"]\n },\n \"application/xfdf\": {\n \"source\": \"iana\",\n \"extensions\": [\"xfdf\"]\n },\n \"application/xhtml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xhtml\",\"xht\"]\n },\n \"application/xhtml-voice+xml\": {\n \"source\": \"apache\",\n \"compressible\": true\n },\n \"application/xliff+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xlf\"]\n },\n \"application/xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xml\",\"xsl\",\"xsd\",\"rng\"]\n },\n \"application/xml-dtd\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"dtd\"]\n },\n \"application/xml-external-parsed-entity\": {\n \"source\": \"iana\"\n },\n \"application/xml-patch+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/xmpp+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/xop+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xop\"]\n },\n \"application/xproc+xml\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"xpl\"]\n },\n \"application/xslt+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xsl\",\"xslt\"]\n },\n \"application/xspf+xml\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"xspf\"]\n },\n \"application/xv+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"mxml\",\"xhvml\",\"xvml\",\"xvm\"]\n },\n \"application/yaml\": {\n \"source\": \"iana\"\n },\n \"application/yang\": {\n \"source\": \"iana\",\n \"extensions\": [\"yang\"]\n },\n \"application/yang-data+cbor\": {\n \"source\": \"iana\"\n },\n \"application/yang-data+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/yang-data+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/yang-patch+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/yang-patch+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/yang-sid+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/yin+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"yin\"]\n },\n \"application/zip\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"zip\"]\n },\n \"application/zip+dotlottie\": {\n \"extensions\": [\"lottie\"]\n },\n \"application/zlib\": {\n \"source\": \"iana\"\n },\n \"application/zstd\": {\n \"source\": \"iana\"\n },\n \"audio/1d-interleaved-parityfec\": {\n \"source\": \"iana\"\n },\n \"audio/32kadpcm\": {\n \"source\": \"iana\"\n },\n \"audio/3gpp\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"3gpp\"]\n },\n \"audio/3gpp2\": {\n \"source\": \"iana\"\n },\n \"audio/aac\": {\n \"source\": \"iana\",\n \"extensions\": [\"adts\",\"aac\"]\n },\n \"audio/ac3\": {\n \"source\": \"iana\"\n },\n \"audio/adpcm\": {\n \"source\": \"apache\",\n \"extensions\": [\"adp\"]\n },\n \"audio/amr\": {\n \"source\": \"iana\",\n \"extensions\": [\"amr\"]\n },\n \"audio/amr-wb\": {\n \"source\": \"iana\"\n },\n \"audio/amr-wb+\": {\n \"source\": \"iana\"\n },\n \"audio/aptx\": {\n \"source\": \"iana\"\n },\n \"audio/asc\": {\n \"source\": \"iana\"\n },\n \"audio/atrac-advanced-lossless\": {\n \"source\": \"iana\"\n },\n \"audio/atrac-x\": {\n \"source\": \"iana\"\n },\n \"audio/atrac3\": {\n \"source\": \"iana\"\n },\n \"audio/basic\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"au\",\"snd\"]\n },\n \"audio/bv16\": {\n \"source\": \"iana\"\n },\n \"audio/bv32\": {\n \"source\": \"iana\"\n },\n \"audio/clearmode\": {\n \"source\": \"iana\"\n },\n \"audio/cn\": {\n \"source\": \"iana\"\n },\n \"audio/dat12\": {\n \"source\": \"iana\"\n },\n \"audio/dls\": {\n \"source\": \"iana\"\n },\n \"audio/dsr-es201108\": {\n \"source\": \"iana\"\n },\n \"audio/dsr-es202050\": {\n \"source\": \"iana\"\n },\n \"audio/dsr-es202211\": {\n \"source\": \"iana\"\n },\n \"audio/dsr-es202212\": {\n \"source\": \"iana\"\n },\n \"audio/dv\": {\n \"source\": \"iana\"\n },\n \"audio/dvi4\": {\n \"source\": \"iana\"\n },\n \"audio/eac3\": {\n \"source\": \"iana\"\n },\n \"audio/encaprtp\": {\n \"source\": \"iana\"\n },\n \"audio/evrc\": {\n \"source\": \"iana\"\n },\n \"audio/evrc-qcp\": {\n \"source\": \"iana\"\n },\n \"audio/evrc0\": {\n \"source\": \"iana\"\n },\n \"audio/evrc1\": {\n \"source\": \"iana\"\n },\n \"audio/evrcb\": {\n \"source\": \"iana\"\n },\n \"audio/evrcb0\": {\n \"source\": \"iana\"\n },\n \"audio/evrcb1\": {\n \"source\": \"iana\"\n },\n \"audio/evrcnw\": {\n \"source\": \"iana\"\n },\n \"audio/evrcnw0\": {\n \"source\": \"iana\"\n },\n \"audio/evrcnw1\": {\n \"source\": \"iana\"\n },\n \"audio/evrcwb\": {\n \"source\": \"iana\"\n },\n \"audio/evrcwb0\": {\n \"source\": \"iana\"\n },\n \"audio/evrcwb1\": {\n \"source\": \"iana\"\n },\n \"audio/evs\": {\n \"source\": \"iana\"\n },\n \"audio/flac\": {\n \"source\": \"iana\"\n },\n \"audio/flexfec\": {\n \"source\": \"iana\"\n },\n \"audio/fwdred\": {\n \"source\": \"iana\"\n },\n \"audio/g711-0\": {\n \"source\": \"iana\"\n },\n \"audio/g719\": {\n \"source\": \"iana\"\n },\n \"audio/g722\": {\n \"source\": \"iana\"\n },\n \"audio/g7221\": {\n \"source\": \"iana\"\n },\n \"audio/g723\": {\n \"source\": \"iana\"\n },\n \"audio/g726-16\": {\n \"source\": \"iana\"\n },\n \"audio/g726-24\": {\n \"source\": \"iana\"\n },\n \"audio/g726-32\": {\n \"source\": \"iana\"\n },\n \"audio/g726-40\": {\n \"source\": \"iana\"\n },\n \"audio/g728\": {\n \"source\": \"iana\"\n },\n \"audio/g729\": {\n \"source\": \"iana\"\n },\n \"audio/g7291\": {\n \"source\": \"iana\"\n },\n \"audio/g729d\": {\n \"source\": \"iana\"\n },\n \"audio/g729e\": {\n \"source\": \"iana\"\n },\n \"audio/gsm\": {\n \"source\": \"iana\"\n },\n \"audio/gsm-efr\": {\n \"source\": \"iana\"\n },\n \"audio/gsm-hr-08\": {\n \"source\": \"iana\"\n },\n \"audio/ilbc\": {\n \"source\": \"iana\"\n },\n \"audio/ip-mr_v2.5\": {\n \"source\": \"iana\"\n },\n \"audio/isac\": {\n \"source\": \"apache\"\n },\n \"audio/l16\": {\n \"source\": \"iana\"\n },\n \"audio/l20\": {\n \"source\": \"iana\"\n },\n \"audio/l24\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"audio/l8\": {\n \"source\": \"iana\"\n },\n \"audio/lpc\": {\n \"source\": \"iana\"\n },\n \"audio/matroska\": {\n \"source\": \"iana\"\n },\n \"audio/melp\": {\n \"source\": \"iana\"\n },\n \"audio/melp1200\": {\n \"source\": \"iana\"\n },\n \"audio/melp2400\": {\n \"source\": \"iana\"\n },\n \"audio/melp600\": {\n \"source\": \"iana\"\n },\n \"audio/mhas\": {\n \"source\": \"iana\"\n },\n \"audio/midi\": {\n \"source\": \"apache\",\n \"extensions\": [\"mid\",\"midi\",\"kar\",\"rmi\"]\n },\n \"audio/midi-clip\": {\n \"source\": \"iana\"\n },\n \"audio/mobile-xmf\": {\n \"source\": \"iana\",\n \"extensions\": [\"mxmf\"]\n },\n \"audio/mp3\": {\n \"compressible\": false,\n \"extensions\": [\"mp3\"]\n },\n \"audio/mp4\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"m4a\",\"mp4a\",\"m4b\"]\n },\n \"audio/mp4a-latm\": {\n \"source\": \"iana\"\n },\n \"audio/mpa\": {\n \"source\": \"iana\"\n },\n \"audio/mpa-robust\": {\n \"source\": \"iana\"\n },\n \"audio/mpeg\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"mpga\",\"mp2\",\"mp2a\",\"mp3\",\"m2a\",\"m3a\"]\n },\n \"audio/mpeg4-generic\": {\n \"source\": \"iana\"\n },\n \"audio/musepack\": {\n \"source\": \"apache\"\n },\n \"audio/ogg\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"oga\",\"ogg\",\"spx\",\"opus\"]\n },\n \"audio/opus\": {\n \"source\": \"iana\"\n },\n \"audio/parityfec\": {\n \"source\": \"iana\"\n },\n \"audio/pcma\": {\n \"source\": \"iana\"\n },\n \"audio/pcma-wb\": {\n \"source\": \"iana\"\n },\n \"audio/pcmu\": {\n \"source\": \"iana\"\n },\n \"audio/pcmu-wb\": {\n \"source\": \"iana\"\n },\n \"audio/prs.sid\": {\n \"source\": \"iana\"\n },\n \"audio/qcelp\": {\n \"source\": \"iana\"\n },\n \"audio/raptorfec\": {\n \"source\": \"iana\"\n },\n \"audio/red\": {\n \"source\": \"iana\"\n },\n \"audio/rtp-enc-aescm128\": {\n \"source\": \"iana\"\n },\n \"audio/rtp-midi\": {\n \"source\": \"iana\"\n },\n \"audio/rtploopback\": {\n \"source\": \"iana\"\n },\n \"audio/rtx\": {\n \"source\": \"iana\"\n },\n \"audio/s3m\": {\n \"source\": \"apache\",\n \"extensions\": [\"s3m\"]\n },\n \"audio/scip\": {\n \"source\": \"iana\"\n },\n \"audio/silk\": {\n \"source\": \"apache\",\n \"extensions\": [\"sil\"]\n },\n \"audio/smv\": {\n \"source\": \"iana\"\n },\n \"audio/smv-qcp\": {\n \"source\": \"iana\"\n },\n \"audio/smv0\": {\n \"source\": \"iana\"\n },\n \"audio/sofa\": {\n \"source\": \"iana\"\n },\n \"audio/sp-midi\": {\n \"source\": \"iana\"\n },\n \"audio/speex\": {\n \"source\": \"iana\"\n },\n \"audio/t140c\": {\n \"source\": \"iana\"\n },\n \"audio/t38\": {\n \"source\": \"iana\"\n },\n \"audio/telephone-event\": {\n \"source\": \"iana\"\n },\n \"audio/tetra_acelp\": {\n \"source\": \"iana\"\n },\n \"audio/tetra_acelp_bb\": {\n \"source\": \"iana\"\n },\n \"audio/tone\": {\n \"source\": \"iana\"\n },\n \"audio/tsvcis\": {\n \"source\": \"iana\"\n },\n \"audio/uemclip\": {\n \"source\": \"iana\"\n },\n \"audio/ulpfec\": {\n \"source\": \"iana\"\n },\n \"audio/usac\": {\n \"source\": \"iana\"\n },\n \"audio/vdvi\": {\n \"source\": \"iana\"\n },\n \"audio/vmr-wb\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.3gpp.iufp\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.4sb\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.audiokoz\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.celp\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.cisco.nse\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.cmles.radio-events\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.cns.anp1\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.cns.inf1\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dece.audio\": {\n \"source\": \"iana\",\n \"extensions\": [\"uva\",\"uvva\"]\n },\n \"audio/vnd.digital-winds\": {\n \"source\": \"iana\",\n \"extensions\": [\"eol\"]\n },\n \"audio/vnd.dlna.adts\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dolby.heaac.1\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dolby.heaac.2\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dolby.mlp\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dolby.mps\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dolby.pl2\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dolby.pl2x\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dolby.pl2z\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dolby.pulse.1\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dra\": {\n \"source\": \"iana\",\n \"extensions\": [\"dra\"]\n },\n \"audio/vnd.dts\": {\n \"source\": \"iana\",\n \"extensions\": [\"dts\"]\n },\n \"audio/vnd.dts.hd\": {\n \"source\": \"iana\",\n \"extensions\": [\"dtshd\"]\n },\n \"audio/vnd.dts.uhd\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dvb.file\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.everad.plj\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.hns.audio\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.lucent.voice\": {\n \"source\": \"iana\",\n \"extensions\": [\"lvp\"]\n },\n \"audio/vnd.ms-playready.media.pya\": {\n \"source\": \"iana\",\n \"extensions\": [\"pya\"]\n },\n \"audio/vnd.nokia.mobile-xmf\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.nortel.vbk\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.nuera.ecelp4800\": {\n \"source\": \"iana\",\n \"extensions\": [\"ecelp4800\"]\n },\n \"audio/vnd.nuera.ecelp7470\": {\n \"source\": \"iana\",\n \"extensions\": [\"ecelp7470\"]\n },\n \"audio/vnd.nuera.ecelp9600\": {\n \"source\": \"iana\",\n \"extensions\": [\"ecelp9600\"]\n },\n \"audio/vnd.octel.sbc\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.presonus.multitrack\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.qcelp\": {\n \"source\": \"apache\"\n },\n \"audio/vnd.rhetorex.32kadpcm\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.rip\": {\n \"source\": \"iana\",\n \"extensions\": [\"rip\"]\n },\n \"audio/vnd.rn-realaudio\": {\n \"compressible\": false\n },\n \"audio/vnd.sealedmedia.softseal.mpeg\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.vmx.cvsd\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.wave\": {\n \"compressible\": false\n },\n \"audio/vorbis\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"audio/vorbis-config\": {\n \"source\": \"iana\"\n },\n \"audio/wav\": {\n \"compressible\": false,\n \"extensions\": [\"wav\"]\n },\n \"audio/wave\": {\n \"compressible\": false,\n \"extensions\": [\"wav\"]\n },\n \"audio/webm\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"weba\"]\n },\n \"audio/x-aac\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"aac\"]\n },\n \"audio/x-aiff\": {\n \"source\": \"apache\",\n \"extensions\": [\"aif\",\"aiff\",\"aifc\"]\n },\n \"audio/x-caf\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"caf\"]\n },\n \"audio/x-flac\": {\n \"source\": \"apache\",\n \"extensions\": [\"flac\"]\n },\n \"audio/x-m4a\": {\n \"source\": \"nginx\",\n \"extensions\": [\"m4a\"]\n },\n \"audio/x-matroska\": {\n \"source\": \"apache\",\n \"extensions\": [\"mka\"]\n },\n \"audio/x-mpegurl\": {\n \"source\": \"apache\",\n \"extensions\": [\"m3u\"]\n },\n \"audio/x-ms-wax\": {\n \"source\": \"apache\",\n \"extensions\": [\"wax\"]\n },\n \"audio/x-ms-wma\": {\n \"source\": \"apache\",\n \"extensions\": [\"wma\"]\n },\n \"audio/x-pn-realaudio\": {\n \"source\": \"apache\",\n \"extensions\": [\"ram\",\"ra\"]\n },\n \"audio/x-pn-realaudio-plugin\": {\n \"source\": \"apache\",\n \"extensions\": [\"rmp\"]\n },\n \"audio/x-realaudio\": {\n \"source\": \"nginx\",\n \"extensions\": [\"ra\"]\n },\n \"audio/x-tta\": {\n \"source\": \"apache\"\n },\n \"audio/x-wav\": {\n \"source\": \"apache\",\n \"extensions\": [\"wav\"]\n },\n \"audio/xm\": {\n \"source\": \"apache\",\n \"extensions\": [\"xm\"]\n },\n \"chemical/x-cdx\": {\n \"source\": \"apache\",\n \"extensions\": [\"cdx\"]\n },\n \"chemical/x-cif\": {\n \"source\": \"apache\",\n \"extensions\": [\"cif\"]\n },\n \"chemical/x-cmdf\": {\n \"source\": \"apache\",\n \"extensions\": [\"cmdf\"]\n },\n \"chemical/x-cml\": {\n \"source\": \"apache\",\n \"extensions\": [\"cml\"]\n },\n \"chemical/x-csml\": {\n \"source\": \"apache\",\n \"extensions\": [\"csml\"]\n },\n \"chemical/x-pdb\": {\n \"source\": \"apache\"\n },\n \"chemical/x-xyz\": {\n \"source\": \"apache\",\n \"extensions\": [\"xyz\"]\n },\n \"font/collection\": {\n \"source\": \"iana\",\n \"extensions\": [\"ttc\"]\n },\n \"font/otf\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"otf\"]\n },\n \"font/sfnt\": {\n \"source\": \"iana\"\n },\n \"font/ttf\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"ttf\"]\n },\n \"font/woff\": {\n \"source\": \"iana\",\n \"extensions\": [\"woff\"]\n },\n \"font/woff2\": {\n \"source\": \"iana\",\n \"extensions\": [\"woff2\"]\n },\n \"image/aces\": {\n \"source\": \"iana\",\n \"extensions\": [\"exr\"]\n },\n \"image/apng\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"apng\"]\n },\n \"image/avci\": {\n \"source\": \"iana\",\n \"extensions\": [\"avci\"]\n },\n \"image/avcs\": {\n \"source\": \"iana\",\n \"extensions\": [\"avcs\"]\n },\n \"image/avif\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"avif\"]\n },\n \"image/bmp\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"bmp\",\"dib\"]\n },\n \"image/cgm\": {\n \"source\": \"iana\",\n \"extensions\": [\"cgm\"]\n },\n \"image/dicom-rle\": {\n \"source\": \"iana\",\n \"extensions\": [\"drle\"]\n },\n \"image/dpx\": {\n \"source\": \"iana\",\n \"extensions\": [\"dpx\"]\n },\n \"image/emf\": {\n \"source\": \"iana\",\n \"extensions\": [\"emf\"]\n },\n \"image/fits\": {\n \"source\": \"iana\",\n \"extensions\": [\"fits\"]\n },\n \"image/g3fax\": {\n \"source\": \"iana\",\n \"extensions\": [\"g3\"]\n },\n \"image/gif\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"gif\"]\n },\n \"image/heic\": {\n \"source\": \"iana\",\n \"extensions\": [\"heic\"]\n },\n \"image/heic-sequence\": {\n \"source\": \"iana\",\n \"extensions\": [\"heics\"]\n },\n \"image/heif\": {\n \"source\": \"iana\",\n \"extensions\": [\"heif\"]\n },\n \"image/heif-sequence\": {\n \"source\": \"iana\",\n \"extensions\": [\"heifs\"]\n },\n \"image/hej2k\": {\n \"source\": \"iana\",\n \"extensions\": [\"hej2\"]\n },\n \"image/ief\": {\n \"source\": \"iana\",\n \"extensions\": [\"ief\"]\n },\n \"image/j2c\": {\n \"source\": \"iana\"\n },\n \"image/jaii\": {\n \"source\": \"iana\",\n \"extensions\": [\"jaii\"]\n },\n \"image/jais\": {\n \"source\": \"iana\",\n \"extensions\": [\"jais\"]\n },\n \"image/jls\": {\n \"source\": \"iana\",\n \"extensions\": [\"jls\"]\n },\n \"image/jp2\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"jp2\",\"jpg2\"]\n },\n \"image/jpeg\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"jpg\",\"jpeg\",\"jpe\"]\n },\n \"image/jph\": {\n \"source\": \"iana\",\n \"extensions\": [\"jph\"]\n },\n \"image/jphc\": {\n \"source\": \"iana\",\n \"extensions\": [\"jhc\"]\n },\n \"image/jpm\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"jpm\",\"jpgm\"]\n },\n \"image/jpx\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"jpx\",\"jpf\"]\n },\n \"image/jxl\": {\n \"source\": \"iana\",\n \"extensions\": [\"jxl\"]\n },\n \"image/jxr\": {\n \"source\": \"iana\",\n \"extensions\": [\"jxr\"]\n },\n \"image/jxra\": {\n \"source\": \"iana\",\n \"extensions\": [\"jxra\"]\n },\n \"image/jxrs\": {\n \"source\": \"iana\",\n \"extensions\": [\"jxrs\"]\n },\n \"image/jxs\": {\n \"source\": \"iana\",\n \"extensions\": [\"jxs\"]\n },\n \"image/jxsc\": {\n \"source\": \"iana\",\n \"extensions\": [\"jxsc\"]\n },\n \"image/jxsi\": {\n \"source\": \"iana\",\n \"extensions\": [\"jxsi\"]\n },\n \"image/jxss\": {\n \"source\": \"iana\",\n \"extensions\": [\"jxss\"]\n },\n \"image/ktx\": {\n \"source\": \"iana\",\n \"extensions\": [\"ktx\"]\n },\n \"image/ktx2\": {\n \"source\": \"iana\",\n \"extensions\": [\"ktx2\"]\n },\n \"image/naplps\": {\n \"source\": \"iana\"\n },\n \"image/pjpeg\": {\n \"compressible\": false,\n \"extensions\": [\"jfif\"]\n },\n \"image/png\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"png\"]\n },\n \"image/prs.btif\": {\n \"source\": \"iana\",\n \"extensions\": [\"btif\",\"btf\"]\n },\n \"image/prs.pti\": {\n \"source\": \"iana\",\n \"extensions\": [\"pti\"]\n },\n \"image/pwg-raster\": {\n \"source\": \"iana\"\n },\n \"image/sgi\": {\n \"source\": \"apache\",\n \"extensions\": [\"sgi\"]\n },\n \"image/svg+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"svg\",\"svgz\"]\n },\n \"image/t38\": {\n \"source\": \"iana\",\n \"extensions\": [\"t38\"]\n },\n \"image/tiff\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"tif\",\"tiff\"]\n },\n \"image/tiff-fx\": {\n \"source\": \"iana\",\n \"extensions\": [\"tfx\"]\n },\n \"image/vnd.adobe.photoshop\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"psd\"]\n },\n \"image/vnd.airzip.accelerator.azv\": {\n \"source\": \"iana\",\n \"extensions\": [\"azv\"]\n },\n \"image/vnd.clip\": {\n \"source\": \"iana\"\n },\n \"image/vnd.cns.inf2\": {\n \"source\": \"iana\"\n },\n \"image/vnd.dece.graphic\": {\n \"source\": \"iana\",\n \"extensions\": [\"uvi\",\"uvvi\",\"uvg\",\"uvvg\"]\n },\n \"image/vnd.djvu\": {\n \"source\": \"iana\",\n \"extensions\": [\"djvu\",\"djv\"]\n },\n \"image/vnd.dvb.subtitle\": {\n \"source\": \"iana\",\n \"extensions\": [\"sub\"]\n },\n \"image/vnd.dwg\": {\n \"source\": \"iana\",\n \"extensions\": [\"dwg\"]\n },\n \"image/vnd.dxf\": {\n \"source\": \"iana\",\n \"extensions\": [\"dxf\"]\n },\n \"image/vnd.fastbidsheet\": {\n \"source\": \"iana\",\n \"extensions\": [\"fbs\"]\n },\n \"image/vnd.fpx\": {\n \"source\": \"iana\",\n \"extensions\": [\"fpx\"]\n },\n \"image/vnd.fst\": {\n \"source\": \"iana\",\n \"extensions\": [\"fst\"]\n },\n \"image/vnd.fujixerox.edmics-mmr\": {\n \"source\": \"iana\",\n \"extensions\": [\"mmr\"]\n },\n \"image/vnd.fujixerox.edmics-rlc\": {\n \"source\": \"iana\",\n \"extensions\": [\"rlc\"]\n },\n \"image/vnd.globalgraphics.pgb\": {\n \"source\": \"iana\"\n },\n \"image/vnd.microsoft.icon\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"ico\"]\n },\n \"image/vnd.mix\": {\n \"source\": \"iana\"\n },\n \"image/vnd.mozilla.apng\": {\n \"source\": \"iana\"\n },\n \"image/vnd.ms-dds\": {\n \"compressible\": true,\n \"extensions\": [\"dds\"]\n },\n \"image/vnd.ms-modi\": {\n \"source\": \"iana\",\n \"extensions\": [\"mdi\"]\n },\n \"image/vnd.ms-photo\": {\n \"source\": \"apache\",\n \"extensions\": [\"wdp\"]\n },\n \"image/vnd.net-fpx\": {\n \"source\": \"iana\",\n \"extensions\": [\"npx\"]\n },\n \"image/vnd.pco.b16\": {\n \"source\": \"iana\",\n \"extensions\": [\"b16\"]\n },\n \"image/vnd.radiance\": {\n \"source\": \"iana\"\n },\n \"image/vnd.sealed.png\": {\n \"source\": \"iana\"\n },\n \"image/vnd.sealedmedia.softseal.gif\": {\n \"source\": \"iana\"\n },\n \"image/vnd.sealedmedia.softseal.jpg\": {\n \"source\": \"iana\"\n },\n \"image/vnd.svf\": {\n \"source\": \"iana\"\n },\n \"image/vnd.tencent.tap\": {\n \"source\": \"iana\",\n \"extensions\": [\"tap\"]\n },\n \"image/vnd.valve.source.texture\": {\n \"source\": \"iana\",\n \"extensions\": [\"vtf\"]\n },\n \"image/vnd.wap.wbmp\": {\n \"source\": \"iana\",\n \"extensions\": [\"wbmp\"]\n },\n \"image/vnd.xiff\": {\n \"source\": \"iana\",\n \"extensions\": [\"xif\"]\n },\n \"image/vnd.zbrush.pcx\": {\n \"source\": \"iana\",\n \"extensions\": [\"pcx\"]\n },\n \"image/webp\": {\n \"source\": \"iana\",\n \"extensions\": [\"webp\"]\n },\n \"image/wmf\": {\n \"source\": \"iana\",\n \"extensions\": [\"wmf\"]\n },\n \"image/x-3ds\": {\n \"source\": \"apache\",\n \"extensions\": [\"3ds\"]\n },\n \"image/x-adobe-dng\": {\n \"extensions\": [\"dng\"]\n },\n \"image/x-cmu-raster\": {\n \"source\": \"apache\",\n \"extensions\": [\"ras\"]\n },\n \"image/x-cmx\": {\n \"source\": \"apache\",\n \"extensions\": [\"cmx\"]\n },\n \"image/x-emf\": {\n \"source\": \"iana\"\n },\n \"image/x-freehand\": {\n \"source\": \"apache\",\n \"extensions\": [\"fh\",\"fhc\",\"fh4\",\"fh5\",\"fh7\"]\n },\n \"image/x-icon\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"ico\"]\n },\n \"image/x-jng\": {\n \"source\": \"nginx\",\n \"extensions\": [\"jng\"]\n },\n \"image/x-mrsid-image\": {\n \"source\": \"apache\",\n \"extensions\": [\"sid\"]\n },\n \"image/x-ms-bmp\": {\n \"source\": \"nginx\",\n \"compressible\": true,\n \"extensions\": [\"bmp\"]\n },\n \"image/x-pcx\": {\n \"source\": \"apache\",\n \"extensions\": [\"pcx\"]\n },\n \"image/x-pict\": {\n \"source\": \"apache\",\n \"extensions\": [\"pic\",\"pct\"]\n },\n \"image/x-portable-anymap\": {\n \"source\": \"apache\",\n \"extensions\": [\"pnm\"]\n },\n \"image/x-portable-bitmap\": {\n \"source\": \"apache\",\n \"extensions\": [\"pbm\"]\n },\n \"image/x-portable-graymap\": {\n \"source\": \"apache\",\n \"extensions\": [\"pgm\"]\n },\n \"image/x-portable-pixmap\": {\n \"source\": \"apache\",\n \"extensions\": [\"ppm\"]\n },\n \"image/x-rgb\": {\n \"source\": \"apache\",\n \"extensions\": [\"rgb\"]\n },\n \"image/x-tga\": {\n \"source\": \"apache\",\n \"extensions\": [\"tga\"]\n },\n \"image/x-wmf\": {\n \"source\": \"iana\"\n },\n \"image/x-xbitmap\": {\n \"source\": \"apache\",\n \"extensions\": [\"xbm\"]\n },\n \"image/x-xcf\": {\n \"compressible\": false\n },\n \"image/x-xpixmap\": {\n \"source\": \"apache\",\n \"extensions\": [\"xpm\"]\n },\n \"image/x-xwindowdump\": {\n \"source\": \"apache\",\n \"extensions\": [\"xwd\"]\n },\n \"message/bhttp\": {\n \"source\": \"iana\"\n },\n \"message/cpim\": {\n \"source\": \"iana\"\n },\n \"message/delivery-status\": {\n \"source\": \"iana\"\n },\n \"message/disposition-notification\": {\n \"source\": \"iana\",\n \"extensions\": [\n \"disposition-notification\"\n ]\n },\n \"message/external-body\": {\n \"source\": \"iana\"\n },\n \"message/feedback-report\": {\n \"source\": \"iana\"\n },\n \"message/global\": {\n \"source\": \"iana\",\n \"extensions\": [\"u8msg\"]\n },\n \"message/global-delivery-status\": {\n \"source\": \"iana\",\n \"extensions\": [\"u8dsn\"]\n },\n \"message/global-disposition-notification\": {\n \"source\": \"iana\",\n \"extensions\": [\"u8mdn\"]\n },\n \"message/global-headers\": {\n \"source\": \"iana\",\n \"extensions\": [\"u8hdr\"]\n },\n \"message/http\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"message/imdn+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"message/mls\": {\n \"source\": \"iana\"\n },\n \"message/news\": {\n \"source\": \"apache\"\n },\n \"message/ohttp-req\": {\n \"source\": \"iana\"\n },\n \"message/ohttp-res\": {\n \"source\": \"iana\"\n },\n \"message/partial\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"message/rfc822\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"eml\",\"mime\",\"mht\",\"mhtml\"]\n },\n \"message/s-http\": {\n \"source\": \"apache\"\n },\n \"message/sip\": {\n \"source\": \"iana\"\n },\n \"message/sipfrag\": {\n \"source\": \"iana\"\n },\n \"message/tracking-status\": {\n \"source\": \"iana\"\n },\n \"message/vnd.si.simp\": {\n \"source\": \"apache\"\n },\n \"message/vnd.wfa.wsc\": {\n \"source\": \"iana\",\n \"extensions\": [\"wsc\"]\n },\n \"model/3mf\": {\n \"source\": \"iana\",\n \"extensions\": [\"3mf\"]\n },\n \"model/e57\": {\n \"source\": \"iana\"\n },\n \"model/gltf+json\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"gltf\"]\n },\n \"model/gltf-binary\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"glb\"]\n },\n \"model/iges\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"igs\",\"iges\"]\n },\n \"model/jt\": {\n \"source\": \"iana\",\n \"extensions\": [\"jt\"]\n },\n \"model/mesh\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"msh\",\"mesh\",\"silo\"]\n },\n \"model/mtl\": {\n \"source\": \"iana\",\n \"extensions\": [\"mtl\"]\n },\n \"model/obj\": {\n \"source\": \"iana\",\n \"extensions\": [\"obj\"]\n },\n \"model/prc\": {\n \"source\": \"iana\",\n \"extensions\": [\"prc\"]\n },\n \"model/step\": {\n \"source\": \"iana\",\n \"extensions\": [\"step\",\"stp\",\"stpnc\",\"p21\",\"210\"]\n },\n \"model/step+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"stpx\"]\n },\n \"model/step+zip\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"stpz\"]\n },\n \"model/step-xml+zip\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"stpxz\"]\n },\n \"model/stl\": {\n \"source\": \"iana\",\n \"extensions\": [\"stl\"]\n },\n \"model/u3d\": {\n \"source\": \"iana\",\n \"extensions\": [\"u3d\"]\n },\n \"model/vnd.bary\": {\n \"source\": \"iana\",\n \"extensions\": [\"bary\"]\n },\n \"model/vnd.cld\": {\n \"source\": \"iana\",\n \"extensions\": [\"cld\"]\n },\n \"model/vnd.collada+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"dae\"]\n },\n \"model/vnd.dwf\": {\n \"source\": \"iana\",\n \"extensions\": [\"dwf\"]\n },\n \"model/vnd.flatland.3dml\": {\n \"source\": \"iana\"\n },\n \"model/vnd.gdl\": {\n \"source\": \"iana\",\n \"extensions\": [\"gdl\"]\n },\n \"model/vnd.gs-gdl\": {\n \"source\": \"apache\"\n },\n \"model/vnd.gs.gdl\": {\n \"source\": \"iana\"\n },\n \"model/vnd.gtw\": {\n \"source\": \"iana\",\n \"extensions\": [\"gtw\"]\n },\n \"model/vnd.moml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"model/vnd.mts\": {\n \"source\": \"iana\",\n \"extensions\": [\"mts\"]\n },\n \"model/vnd.opengex\": {\n \"source\": \"iana\",\n \"extensions\": [\"ogex\"]\n },\n \"model/vnd.parasolid.transmit.binary\": {\n \"source\": \"iana\",\n \"extensions\": [\"x_b\"]\n },\n \"model/vnd.parasolid.transmit.text\": {\n \"source\": \"iana\",\n \"extensions\": [\"x_t\"]\n },\n \"model/vnd.pytha.pyox\": {\n \"source\": \"iana\",\n \"extensions\": [\"pyo\",\"pyox\"]\n },\n \"model/vnd.rosette.annotated-data-model\": {\n \"source\": \"iana\"\n },\n \"model/vnd.sap.vds\": {\n \"source\": \"iana\",\n \"extensions\": [\"vds\"]\n },\n \"model/vnd.usda\": {\n \"source\": \"iana\",\n \"extensions\": [\"usda\"]\n },\n \"model/vnd.usdz+zip\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"usdz\"]\n },\n \"model/vnd.valve.source.compiled-map\": {\n \"source\": \"iana\",\n \"extensions\": [\"bsp\"]\n },\n \"model/vnd.vtu\": {\n \"source\": \"iana\",\n \"extensions\": [\"vtu\"]\n },\n \"model/vrml\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"wrl\",\"vrml\"]\n },\n \"model/x3d+binary\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"x3db\",\"x3dbz\"]\n },\n \"model/x3d+fastinfoset\": {\n \"source\": \"iana\",\n \"extensions\": [\"x3db\"]\n },\n \"model/x3d+vrml\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"x3dv\",\"x3dvz\"]\n },\n \"model/x3d+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"x3d\",\"x3dz\"]\n },\n \"model/x3d-vrml\": {\n \"source\": \"iana\",\n \"extensions\": [\"x3dv\"]\n },\n \"multipart/alternative\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"multipart/appledouble\": {\n \"source\": \"iana\"\n },\n \"multipart/byteranges\": {\n \"source\": \"iana\"\n },\n \"multipart/digest\": {\n \"source\": \"iana\"\n },\n \"multipart/encrypted\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"multipart/form-data\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"multipart/header-set\": {\n \"source\": \"iana\"\n },\n \"multipart/mixed\": {\n \"source\": \"iana\"\n },\n \"multipart/multilingual\": {\n \"source\": \"iana\"\n },\n \"multipart/parallel\": {\n \"source\": \"iana\"\n },\n \"multipart/related\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"multipart/report\": {\n \"source\": \"iana\"\n },\n \"multipart/signed\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"multipart/vnd.bint.med-plus\": {\n \"source\": \"iana\"\n },\n \"multipart/voice-message\": {\n \"source\": \"iana\"\n },\n \"multipart/x-mixed-replace\": {\n \"source\": \"iana\"\n },\n \"text/1d-interleaved-parityfec\": {\n \"source\": \"iana\"\n },\n \"text/cache-manifest\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"appcache\",\"manifest\"]\n },\n \"text/calendar\": {\n \"source\": \"iana\",\n \"extensions\": [\"ics\",\"ifb\"]\n },\n \"text/calender\": {\n \"compressible\": true\n },\n \"text/cmd\": {\n \"compressible\": true\n },\n \"text/coffeescript\": {\n \"extensions\": [\"coffee\",\"litcoffee\"]\n },\n \"text/cql\": {\n \"source\": \"iana\"\n },\n \"text/cql-expression\": {\n \"source\": \"iana\"\n },\n \"text/cql-identifier\": {\n \"source\": \"iana\"\n },\n \"text/css\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true,\n \"extensions\": [\"css\"]\n },\n \"text/csv\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"csv\"]\n },\n \"text/csv-schema\": {\n \"source\": \"iana\"\n },\n \"text/directory\": {\n \"source\": \"iana\"\n },\n \"text/dns\": {\n \"source\": \"iana\"\n },\n \"text/ecmascript\": {\n \"source\": \"apache\"\n },\n \"text/encaprtp\": {\n \"source\": \"iana\"\n },\n \"text/enriched\": {\n \"source\": \"iana\"\n },\n \"text/fhirpath\": {\n \"source\": \"iana\"\n },\n \"text/flexfec\": {\n \"source\": \"iana\"\n },\n \"text/fwdred\": {\n \"source\": \"iana\"\n },\n \"text/gff3\": {\n \"source\": \"iana\"\n },\n \"text/grammar-ref-list\": {\n \"source\": \"iana\"\n },\n \"text/hl7v2\": {\n \"source\": \"iana\"\n },\n \"text/html\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"html\",\"htm\",\"shtml\"]\n },\n \"text/jade\": {\n \"extensions\": [\"jade\"]\n },\n \"text/javascript\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true,\n \"extensions\": [\"js\",\"mjs\"]\n },\n \"text/jcr-cnd\": {\n \"source\": \"iana\"\n },\n \"text/jsx\": {\n \"compressible\": true,\n \"extensions\": [\"jsx\"]\n },\n \"text/less\": {\n \"compressible\": true,\n \"extensions\": [\"less\"]\n },\n \"text/markdown\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"md\",\"markdown\"]\n },\n \"text/mathml\": {\n \"source\": \"nginx\",\n \"extensions\": [\"mml\"]\n },\n \"text/mdx\": {\n \"compressible\": true,\n \"extensions\": [\"mdx\"]\n },\n \"text/mizar\": {\n \"source\": \"iana\"\n },\n \"text/n3\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true,\n \"extensions\": [\"n3\"]\n },\n \"text/parameters\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\"\n },\n \"text/parityfec\": {\n \"source\": \"iana\"\n },\n \"text/plain\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"txt\",\"text\",\"conf\",\"def\",\"list\",\"log\",\"in\",\"ini\"]\n },\n \"text/provenance-notation\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\"\n },\n \"text/prs.fallenstein.rst\": {\n \"source\": \"iana\"\n },\n \"text/prs.lines.tag\": {\n \"source\": \"iana\",\n \"extensions\": [\"dsc\"]\n },\n \"text/prs.prop.logic\": {\n \"source\": \"iana\"\n },\n \"text/prs.texi\": {\n \"source\": \"iana\"\n },\n \"text/raptorfec\": {\n \"source\": \"iana\"\n },\n \"text/red\": {\n \"source\": \"iana\"\n },\n \"text/rfc822-headers\": {\n \"source\": \"iana\"\n },\n \"text/richtext\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"rtx\"]\n },\n \"text/rtf\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"rtf\"]\n },\n \"text/rtp-enc-aescm128\": {\n \"source\": \"iana\"\n },\n \"text/rtploopback\": {\n \"source\": \"iana\"\n },\n \"text/rtx\": {\n \"source\": \"iana\"\n },\n \"text/sgml\": {\n \"source\": \"iana\",\n \"extensions\": [\"sgml\",\"sgm\"]\n },\n \"text/shaclc\": {\n \"source\": \"iana\"\n },\n \"text/shex\": {\n \"source\": \"iana\",\n \"extensions\": [\"shex\"]\n },\n \"text/slim\": {\n \"extensions\": [\"slim\",\"slm\"]\n },\n \"text/spdx\": {\n \"source\": \"iana\",\n \"extensions\": [\"spdx\"]\n },\n \"text/strings\": {\n \"source\": \"iana\"\n },\n \"text/stylus\": {\n \"extensions\": [\"stylus\",\"styl\"]\n },\n \"text/t140\": {\n \"source\": \"iana\"\n },\n \"text/tab-separated-values\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"tsv\"]\n },\n \"text/troff\": {\n \"source\": \"iana\",\n \"extensions\": [\"t\",\"tr\",\"roff\",\"man\",\"me\",\"ms\"]\n },\n \"text/turtle\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"extensions\": [\"ttl\"]\n },\n \"text/ulpfec\": {\n \"source\": \"iana\"\n },\n \"text/uri-list\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"uri\",\"uris\",\"urls\"]\n },\n \"text/vcard\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"vcard\"]\n },\n \"text/vnd.a\": {\n \"source\": \"iana\"\n },\n \"text/vnd.abc\": {\n \"source\": \"iana\"\n },\n \"text/vnd.ascii-art\": {\n \"source\": \"iana\"\n },\n \"text/vnd.curl\": {\n \"source\": \"iana\",\n \"extensions\": [\"curl\"]\n },\n \"text/vnd.curl.dcurl\": {\n \"source\": \"apache\",\n \"extensions\": [\"dcurl\"]\n },\n \"text/vnd.curl.mcurl\": {\n \"source\": \"apache\",\n \"extensions\": [\"mcurl\"]\n },\n \"text/vnd.curl.scurl\": {\n \"source\": \"apache\",\n \"extensions\": [\"scurl\"]\n },\n \"text/vnd.debian.copyright\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\"\n },\n \"text/vnd.dmclientscript\": {\n \"source\": \"iana\"\n },\n \"text/vnd.dvb.subtitle\": {\n \"source\": \"iana\",\n \"extensions\": [\"sub\"]\n },\n \"text/vnd.esmertec.theme-descriptor\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\"\n },\n \"text/vnd.exchangeable\": {\n \"source\": \"iana\"\n },\n \"text/vnd.familysearch.gedcom\": {\n \"source\": \"iana\",\n \"extensions\": [\"ged\"]\n },\n \"text/vnd.ficlab.flt\": {\n \"source\": \"iana\"\n },\n \"text/vnd.fly\": {\n \"source\": \"iana\",\n \"extensions\": [\"fly\"]\n },\n \"text/vnd.fmi.flexstor\": {\n \"source\": \"iana\",\n \"extensions\": [\"flx\"]\n },\n \"text/vnd.gml\": {\n \"source\": \"iana\"\n },\n \"text/vnd.graphviz\": {\n \"source\": \"iana\",\n \"extensions\": [\"gv\"]\n },\n \"text/vnd.hans\": {\n \"source\": \"iana\"\n },\n \"text/vnd.hgl\": {\n \"source\": \"iana\"\n },\n \"text/vnd.in3d.3dml\": {\n \"source\": \"iana\",\n \"extensions\": [\"3dml\"]\n },\n \"text/vnd.in3d.spot\": {\n \"source\": \"iana\",\n \"extensions\": [\"spot\"]\n },\n \"text/vnd.iptc.newsml\": {\n \"source\": \"iana\"\n },\n \"text/vnd.iptc.nitf\": {\n \"source\": \"iana\"\n },\n \"text/vnd.latex-z\": {\n \"source\": \"iana\"\n },\n \"text/vnd.motorola.reflex\": {\n \"source\": \"iana\"\n },\n \"text/vnd.ms-mediapackage\": {\n \"source\": \"iana\"\n },\n \"text/vnd.net2phone.commcenter.command\": {\n \"source\": \"iana\"\n },\n \"text/vnd.radisys.msml-basic-layout\": {\n \"source\": \"iana\"\n },\n \"text/vnd.senx.warpscript\": {\n \"source\": \"iana\"\n },\n \"text/vnd.si.uricatalogue\": {\n \"source\": \"apache\"\n },\n \"text/vnd.sosi\": {\n \"source\": \"iana\"\n },\n \"text/vnd.sun.j2me.app-descriptor\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"extensions\": [\"jad\"]\n },\n \"text/vnd.trolltech.linguist\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\"\n },\n \"text/vnd.vcf\": {\n \"source\": \"iana\"\n },\n \"text/vnd.wap.si\": {\n \"source\": \"iana\"\n },\n \"text/vnd.wap.sl\": {\n \"source\": \"iana\"\n },\n \"text/vnd.wap.wml\": {\n \"source\": \"iana\",\n \"extensions\": [\"wml\"]\n },\n \"text/vnd.wap.wmlscript\": {\n \"source\": \"iana\",\n \"extensions\": [\"wmls\"]\n },\n \"text/vnd.zoo.kcl\": {\n \"source\": \"iana\"\n },\n \"text/vtt\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true,\n \"extensions\": [\"vtt\"]\n },\n \"text/wgsl\": {\n \"source\": \"iana\",\n \"extensions\": [\"wgsl\"]\n },\n \"text/x-asm\": {\n \"source\": \"apache\",\n \"extensions\": [\"s\",\"asm\"]\n },\n \"text/x-c\": {\n \"source\": \"apache\",\n \"extensions\": [\"c\",\"cc\",\"cxx\",\"cpp\",\"h\",\"hh\",\"dic\"]\n },\n \"text/x-component\": {\n \"source\": \"nginx\",\n \"extensions\": [\"htc\"]\n },\n \"text/x-fortran\": {\n \"source\": \"apache\",\n \"extensions\": [\"f\",\"for\",\"f77\",\"f90\"]\n },\n \"text/x-gwt-rpc\": {\n \"compressible\": true\n },\n \"text/x-handlebars-template\": {\n \"extensions\": [\"hbs\"]\n },\n \"text/x-java-source\": {\n \"source\": \"apache\",\n \"extensions\": [\"java\"]\n },\n \"text/x-jquery-tmpl\": {\n \"compressible\": true\n },\n \"text/x-lua\": {\n \"extensions\": [\"lua\"]\n },\n \"text/x-markdown\": {\n \"compressible\": true,\n \"extensions\": [\"mkd\"]\n },\n \"text/x-nfo\": {\n \"source\": \"apache\",\n \"extensions\": [\"nfo\"]\n },\n \"text/x-opml\": {\n \"source\": \"apache\",\n \"extensions\": [\"opml\"]\n },\n \"text/x-org\": {\n \"compressible\": true,\n \"extensions\": [\"org\"]\n },\n \"text/x-pascal\": {\n \"source\": \"apache\",\n \"extensions\": [\"p\",\"pas\"]\n },\n \"text/x-processing\": {\n \"compressible\": true,\n \"extensions\": [\"pde\"]\n },\n \"text/x-sass\": {\n \"extensions\": [\"sass\"]\n },\n \"text/x-scss\": {\n \"extensions\": [\"scss\"]\n },\n \"text/x-setext\": {\n \"source\": \"apache\",\n \"extensions\": [\"etx\"]\n },\n \"text/x-sfv\": {\n \"source\": \"apache\",\n \"extensions\": [\"sfv\"]\n },\n \"text/x-suse-ymp\": {\n \"compressible\": true,\n \"extensions\": [\"ymp\"]\n },\n \"text/x-uuencode\": {\n \"source\": \"apache\",\n \"extensions\": [\"uu\"]\n },\n \"text/x-vcalendar\": {\n \"source\": \"apache\",\n \"extensions\": [\"vcs\"]\n },\n \"text/x-vcard\": {\n \"source\": \"apache\",\n \"extensions\": [\"vcf\"]\n },\n \"text/xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xml\"]\n },\n \"text/xml-external-parsed-entity\": {\n \"source\": \"iana\"\n },\n \"text/yaml\": {\n \"compressible\": true,\n \"extensions\": [\"yaml\",\"yml\"]\n },\n \"video/1d-interleaved-parityfec\": {\n \"source\": \"iana\"\n },\n \"video/3gpp\": {\n \"source\": \"iana\",\n \"extensions\": [\"3gp\",\"3gpp\"]\n },\n \"video/3gpp-tt\": {\n \"source\": \"iana\"\n },\n \"video/3gpp2\": {\n \"source\": \"iana\",\n \"extensions\": [\"3g2\"]\n },\n \"video/av1\": {\n \"source\": \"iana\"\n },\n \"video/bmpeg\": {\n \"source\": \"iana\"\n },\n \"video/bt656\": {\n \"source\": \"iana\"\n },\n \"video/celb\": {\n \"source\": \"iana\"\n },\n \"video/dv\": {\n \"source\": \"iana\"\n },\n \"video/encaprtp\": {\n \"source\": \"iana\"\n },\n \"video/evc\": {\n \"source\": \"iana\"\n },\n \"video/ffv1\": {\n \"source\": \"iana\"\n },\n \"video/flexfec\": {\n \"source\": \"iana\"\n },\n \"video/h261\": {\n \"source\": \"iana\",\n \"extensions\": [\"h261\"]\n },\n \"video/h263\": {\n \"source\": \"iana\",\n \"extensions\": [\"h263\"]\n },\n \"video/h263-1998\": {\n \"source\": \"iana\"\n },\n \"video/h263-2000\": {\n \"source\": \"iana\"\n },\n \"video/h264\": {\n \"source\": \"iana\",\n \"extensions\": [\"h264\"]\n },\n \"video/h264-rcdo\": {\n \"source\": \"iana\"\n },\n \"video/h264-svc\": {\n \"source\": \"iana\"\n },\n \"video/h265\": {\n \"source\": \"iana\"\n },\n \"video/h266\": {\n \"source\": \"iana\"\n },\n \"video/iso.segment\": {\n \"source\": \"iana\",\n \"extensions\": [\"m4s\"]\n },\n \"video/jpeg\": {\n \"source\": \"iana\",\n \"extensions\": [\"jpgv\"]\n },\n \"video/jpeg2000\": {\n \"source\": \"iana\"\n },\n \"video/jpm\": {\n \"source\": \"apache\",\n \"extensions\": [\"jpm\",\"jpgm\"]\n },\n \"video/jxsv\": {\n \"source\": \"iana\"\n },\n \"video/lottie+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"video/matroska\": {\n \"source\": \"iana\"\n },\n \"video/matroska-3d\": {\n \"source\": \"iana\"\n },\n \"video/mj2\": {\n \"source\": \"iana\",\n \"extensions\": [\"mj2\",\"mjp2\"]\n },\n \"video/mp1s\": {\n \"source\": \"iana\"\n },\n \"video/mp2p\": {\n \"source\": \"iana\"\n },\n \"video/mp2t\": {\n \"source\": \"iana\",\n \"extensions\": [\"ts\",\"m2t\",\"m2ts\",\"mts\"]\n },\n \"video/mp4\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"mp4\",\"mp4v\",\"mpg4\"]\n },\n \"video/mp4v-es\": {\n \"source\": \"iana\"\n },\n \"video/mpeg\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"mpeg\",\"mpg\",\"mpe\",\"m1v\",\"m2v\"]\n },\n \"video/mpeg4-generic\": {\n \"source\": \"iana\"\n },\n \"video/mpv\": {\n \"source\": \"iana\"\n },\n \"video/nv\": {\n \"source\": \"iana\"\n },\n \"video/ogg\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"ogv\"]\n },\n \"video/parityfec\": {\n \"source\": \"iana\"\n },\n \"video/pointer\": {\n \"source\": \"iana\"\n },\n \"video/quicktime\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"qt\",\"mov\"]\n },\n \"video/raptorfec\": {\n \"source\": \"iana\"\n },\n \"video/raw\": {\n \"source\": \"iana\"\n },\n \"video/rtp-enc-aescm128\": {\n \"source\": \"iana\"\n },\n \"video/rtploopback\": {\n \"source\": \"iana\"\n },\n \"video/rtx\": {\n \"source\": \"iana\"\n },\n \"video/scip\": {\n \"source\": \"iana\"\n },\n \"video/smpte291\": {\n \"source\": \"iana\"\n },\n \"video/smpte292m\": {\n \"source\": \"iana\"\n },\n \"video/ulpfec\": {\n \"source\": \"iana\"\n },\n \"video/vc1\": {\n \"source\": \"iana\"\n },\n \"video/vc2\": {\n \"source\": \"iana\"\n },\n \"video/vnd.cctv\": {\n \"source\": \"iana\"\n },\n \"video/vnd.dece.hd\": {\n \"source\": \"iana\",\n \"extensions\": [\"uvh\",\"uvvh\"]\n },\n \"video/vnd.dece.mobile\": {\n \"source\": \"iana\",\n \"extensions\": [\"uvm\",\"uvvm\"]\n },\n \"video/vnd.dece.mp4\": {\n \"source\": \"iana\"\n },\n \"video/vnd.dece.pd\": {\n \"source\": \"iana\",\n \"extensions\": [\"uvp\",\"uvvp\"]\n },\n \"video/vnd.dece.sd\": {\n \"source\": \"iana\",\n \"extensions\": [\"uvs\",\"uvvs\"]\n },\n \"video/vnd.dece.video\": {\n \"source\": \"iana\",\n \"extensions\": [\"uvv\",\"uvvv\"]\n },\n \"video/vnd.directv.mpeg\": {\n \"source\": \"iana\"\n },\n \"video/vnd.directv.mpeg-tts\": {\n \"source\": \"iana\"\n },\n \"video/vnd.dlna.mpeg-tts\": {\n \"source\": \"iana\"\n },\n \"video/vnd.dvb.file\": {\n \"source\": \"iana\",\n \"extensions\": [\"dvb\"]\n },\n \"video/vnd.fvt\": {\n \"source\": \"iana\",\n \"extensions\": [\"fvt\"]\n },\n \"video/vnd.hns.video\": {\n \"source\": \"iana\"\n },\n \"video/vnd.iptvforum.1dparityfec-1010\": {\n \"source\": \"iana\"\n },\n \"video/vnd.iptvforum.1dparityfec-2005\": {\n \"source\": \"iana\"\n },\n \"video/vnd.iptvforum.2dparityfec-1010\": {\n \"source\": \"iana\"\n },\n \"video/vnd.iptvforum.2dparityfec-2005\": {\n \"source\": \"iana\"\n },\n \"video/vnd.iptvforum.ttsavc\": {\n \"source\": \"iana\"\n },\n \"video/vnd.iptvforum.ttsmpeg2\": {\n \"source\": \"iana\"\n },\n \"video/vnd.motorola.video\": {\n \"source\": \"iana\"\n },\n \"video/vnd.motorola.videop\": {\n \"source\": \"iana\"\n },\n \"video/vnd.mpegurl\": {\n \"source\": \"iana\",\n \"extensions\": [\"mxu\",\"m4u\"]\n },\n \"video/vnd.ms-playready.media.pyv\": {\n \"source\": \"iana\",\n \"extensions\": [\"pyv\"]\n },\n \"video/vnd.nokia.interleaved-multimedia\": {\n \"source\": \"iana\"\n },\n \"video/vnd.nokia.mp4vr\": {\n \"source\": \"iana\"\n },\n \"video/vnd.nokia.videovoip\": {\n \"source\": \"iana\"\n },\n \"video/vnd.objectvideo\": {\n \"source\": \"iana\"\n },\n \"video/vnd.planar\": {\n \"source\": \"iana\"\n },\n \"video/vnd.radgamettools.bink\": {\n \"source\": \"iana\"\n },\n \"video/vnd.radgamettools.smacker\": {\n \"source\": \"apache\"\n },\n \"video/vnd.sealed.mpeg1\": {\n \"source\": \"iana\"\n },\n \"video/vnd.sealed.mpeg4\": {\n \"source\": \"iana\"\n },\n \"video/vnd.sealed.swf\": {\n \"source\": \"iana\"\n },\n \"video/vnd.sealedmedia.softseal.mov\": {\n \"source\": \"iana\"\n },\n \"video/vnd.uvvu.mp4\": {\n \"source\": \"iana\",\n \"extensions\": [\"uvu\",\"uvvu\"]\n },\n \"video/vnd.vivo\": {\n \"source\": \"iana\",\n \"extensions\": [\"viv\"]\n },\n \"video/vnd.youtube.yt\": {\n \"source\": \"iana\"\n },\n \"video/vp8\": {\n \"source\": \"iana\"\n },\n \"video/vp9\": {\n \"source\": \"iana\"\n },\n \"video/webm\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"webm\"]\n },\n \"video/x-f4v\": {\n \"source\": \"apache\",\n \"extensions\": [\"f4v\"]\n },\n \"video/x-fli\": {\n \"source\": \"apache\",\n \"extensions\": [\"fli\"]\n },\n \"video/x-flv\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"flv\"]\n },\n \"video/x-m4v\": {\n \"source\": \"apache\",\n \"extensions\": [\"m4v\"]\n },\n \"video/x-matroska\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"mkv\",\"mk3d\",\"mks\"]\n },\n \"video/x-mng\": {\n \"source\": \"apache\",\n \"extensions\": [\"mng\"]\n },\n \"video/x-ms-asf\": {\n \"source\": \"apache\",\n \"extensions\": [\"asf\",\"asx\"]\n },\n \"video/x-ms-vob\": {\n \"source\": \"apache\",\n \"extensions\": [\"vob\"]\n },\n \"video/x-ms-wm\": {\n \"source\": \"apache\",\n \"extensions\": [\"wm\"]\n },\n \"video/x-ms-wmv\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"wmv\"]\n },\n \"video/x-ms-wmx\": {\n \"source\": \"apache\",\n \"extensions\": [\"wmx\"]\n },\n \"video/x-ms-wvx\": {\n \"source\": \"apache\",\n \"extensions\": [\"wvx\"]\n },\n \"video/x-msvideo\": {\n \"source\": \"apache\",\n \"extensions\": [\"avi\"]\n },\n \"video/x-sgi-movie\": {\n \"source\": \"apache\",\n \"extensions\": [\"movie\"]\n },\n \"video/x-smv\": {\n \"source\": \"apache\",\n \"extensions\": [\"smv\"]\n },\n \"x-conference/x-cooltalk\": {\n \"source\": \"apache\",\n \"extensions\": [\"ice\"]\n },\n \"x-shader/x-fragment\": {\n \"compressible\": true\n },\n \"x-shader/x-vertex\": {\n \"compressible\": true\n }\n}\n","/*!\n * mime-db\n * Copyright(c) 2014 Jonathan Ong\n * Copyright(c) 2015-2022 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n/**\n * Module exports.\n */\n\nmodule.exports = require('./db.json')\n","// 'path' module extracted from Node.js v8.11.1 (only the posix part)\n// transplited with Babel\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nfunction assertPath(path) {\n if (typeof path !== 'string') {\n throw new TypeError('Path must be a string. Received ' + JSON.stringify(path));\n }\n}\n\n// Resolves . and .. elements in a path with directory names\nfunction normalizeStringPosix(path, allowAboveRoot) {\n var res = '';\n var lastSegmentLength = 0;\n var lastSlash = -1;\n var dots = 0;\n var code;\n for (var i = 0; i <= path.length; ++i) {\n if (i < path.length)\n code = path.charCodeAt(i);\n else if (code === 47 /*/*/)\n break;\n else\n code = 47 /*/*/;\n if (code === 47 /*/*/) {\n if (lastSlash === i - 1 || dots === 1) {\n // NOOP\n } else if (lastSlash !== i - 1 && dots === 2) {\n if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 /*.*/ || res.charCodeAt(res.length - 2) !== 46 /*.*/) {\n if (res.length > 2) {\n var lastSlashIndex = res.lastIndexOf('/');\n if (lastSlashIndex !== res.length - 1) {\n if (lastSlashIndex === -1) {\n res = '';\n lastSegmentLength = 0;\n } else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf('/');\n }\n lastSlash = i;\n dots = 0;\n continue;\n }\n } else if (res.length === 2 || res.length === 1) {\n res = '';\n lastSegmentLength = 0;\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n if (res.length > 0)\n res += '/..';\n else\n res = '..';\n lastSegmentLength = 2;\n }\n } else {\n if (res.length > 0)\n res += '/' + path.slice(lastSlash + 1, i);\n else\n res = path.slice(lastSlash + 1, i);\n lastSegmentLength = i - lastSlash - 1;\n }\n lastSlash = i;\n dots = 0;\n } else if (code === 46 /*.*/ && dots !== -1) {\n ++dots;\n } else {\n dots = -1;\n }\n }\n return res;\n}\n\nfunction _format(sep, pathObject) {\n var dir = pathObject.dir || pathObject.root;\n var base = pathObject.base || (pathObject.name || '') + (pathObject.ext || '');\n if (!dir) {\n return base;\n }\n if (dir === pathObject.root) {\n return dir + base;\n }\n return dir + sep + base;\n}\n\nvar posix = {\n // path.resolve([from ...], to)\n resolve: function resolve() {\n var resolvedPath = '';\n var resolvedAbsolute = false;\n var cwd;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path;\n if (i >= 0)\n path = arguments[i];\n else {\n if (cwd === undefined)\n cwd = process.cwd();\n path = cwd;\n }\n\n assertPath(path);\n\n // Skip empty entries\n if (path.length === 0) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charCodeAt(0) === 47 /*/*/;\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute);\n\n if (resolvedAbsolute) {\n if (resolvedPath.length > 0)\n return '/' + resolvedPath;\n else\n return '/';\n } else if (resolvedPath.length > 0) {\n return resolvedPath;\n } else {\n return '.';\n }\n },\n\n normalize: function normalize(path) {\n assertPath(path);\n\n if (path.length === 0) return '.';\n\n var isAbsolute = path.charCodeAt(0) === 47 /*/*/;\n var trailingSeparator = path.charCodeAt(path.length - 1) === 47 /*/*/;\n\n // Normalize the path\n path = normalizeStringPosix(path, !isAbsolute);\n\n if (path.length === 0 && !isAbsolute) path = '.';\n if (path.length > 0 && trailingSeparator) path += '/';\n\n if (isAbsolute) return '/' + path;\n return path;\n },\n\n isAbsolute: function isAbsolute(path) {\n assertPath(path);\n return path.length > 0 && path.charCodeAt(0) === 47 /*/*/;\n },\n\n join: function join() {\n if (arguments.length === 0)\n return '.';\n var joined;\n for (var i = 0; i < arguments.length; ++i) {\n var arg = arguments[i];\n assertPath(arg);\n if (arg.length > 0) {\n if (joined === undefined)\n joined = arg;\n else\n joined += '/' + arg;\n }\n }\n if (joined === undefined)\n return '.';\n return posix.normalize(joined);\n },\n\n relative: function relative(from, to) {\n assertPath(from);\n assertPath(to);\n\n if (from === to) return '';\n\n from = posix.resolve(from);\n to = posix.resolve(to);\n\n if (from === to) return '';\n\n // Trim any leading backslashes\n var fromStart = 1;\n for (; fromStart < from.length; ++fromStart) {\n if (from.charCodeAt(fromStart) !== 47 /*/*/)\n break;\n }\n var fromEnd = from.length;\n var fromLen = fromEnd - fromStart;\n\n // Trim any leading backslashes\n var toStart = 1;\n for (; toStart < to.length; ++toStart) {\n if (to.charCodeAt(toStart) !== 47 /*/*/)\n break;\n }\n var toEnd = to.length;\n var toLen = toEnd - toStart;\n\n // Compare paths to find the longest common path from root\n var length = fromLen < toLen ? fromLen : toLen;\n var lastCommonSep = -1;\n var i = 0;\n for (; i <= length; ++i) {\n if (i === length) {\n if (toLen > length) {\n if (to.charCodeAt(toStart + i) === 47 /*/*/) {\n // We get here if `from` is the exact base path for `to`.\n // For example: from='/foo/bar'; to='/foo/bar/baz'\n return to.slice(toStart + i + 1);\n } else if (i === 0) {\n // We get here if `from` is the root\n // For example: from='/'; to='/foo'\n return to.slice(toStart + i);\n }\n } else if (fromLen > length) {\n if (from.charCodeAt(fromStart + i) === 47 /*/*/) {\n // We get here if `to` is the exact base path for `from`.\n // For example: from='/foo/bar/baz'; to='/foo/bar'\n lastCommonSep = i;\n } else if (i === 0) {\n // We get here if `to` is the root.\n // For example: from='/foo'; to='/'\n lastCommonSep = 0;\n }\n }\n break;\n }\n var fromCode = from.charCodeAt(fromStart + i);\n var toCode = to.charCodeAt(toStart + i);\n if (fromCode !== toCode)\n break;\n else if (fromCode === 47 /*/*/)\n lastCommonSep = i;\n }\n\n var out = '';\n // Generate the relative path based on the path difference between `to`\n // and `from`\n for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {\n if (i === fromEnd || from.charCodeAt(i) === 47 /*/*/) {\n if (out.length === 0)\n out += '..';\n else\n out += '/..';\n }\n }\n\n // Lastly, append the rest of the destination (`to`) path that comes after\n // the common path parts\n if (out.length > 0)\n return out + to.slice(toStart + lastCommonSep);\n else {\n toStart += lastCommonSep;\n if (to.charCodeAt(toStart) === 47 /*/*/)\n ++toStart;\n return to.slice(toStart);\n }\n },\n\n _makeLong: function _makeLong(path) {\n return path;\n },\n\n dirname: function dirname(path) {\n assertPath(path);\n if (path.length === 0) return '.';\n var code = path.charCodeAt(0);\n var hasRoot = code === 47 /*/*/;\n var end = -1;\n var matchedSlash = true;\n for (var i = path.length - 1; i >= 1; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n\n if (end === -1) return hasRoot ? '/' : '.';\n if (hasRoot && end === 1) return '//';\n return path.slice(0, end);\n },\n\n basename: function basename(path, ext) {\n if (ext !== undefined && typeof ext !== 'string') throw new TypeError('\"ext\" argument must be a string');\n assertPath(path);\n\n var start = 0;\n var end = -1;\n var matchedSlash = true;\n var i;\n\n if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {\n if (ext.length === path.length && ext === path) return '';\n var extIdx = ext.length - 1;\n var firstNonSlashEnd = -1;\n for (i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else {\n if (firstNonSlashEnd === -1) {\n // We saw the first non-path separator, remember this index in case\n // we need it if the extension ends up not matching\n matchedSlash = false;\n firstNonSlashEnd = i + 1;\n }\n if (extIdx >= 0) {\n // Try to match the explicit extension\n if (code === ext.charCodeAt(extIdx)) {\n if (--extIdx === -1) {\n // We matched the extension, so mark this as the end of our path\n // component\n end = i;\n }\n } else {\n // Extension does not match, so our result is the entire path\n // component\n extIdx = -1;\n end = firstNonSlashEnd;\n }\n }\n }\n }\n\n if (start === end) end = firstNonSlashEnd;else if (end === -1) end = path.length;\n return path.slice(start, end);\n } else {\n for (i = path.length - 1; i >= 0; --i) {\n if (path.charCodeAt(i) === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // path component\n matchedSlash = false;\n end = i + 1;\n }\n }\n\n if (end === -1) return '';\n return path.slice(start, end);\n }\n },\n\n extname: function extname(path) {\n assertPath(path);\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n for (var i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1)\n startDot = i;\n else if (preDotState !== 1)\n preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n return '';\n }\n return path.slice(startDot, end);\n },\n\n format: function format(pathObject) {\n if (pathObject === null || typeof pathObject !== 'object') {\n throw new TypeError('The \"pathObject\" argument must be of type Object. Received type ' + typeof pathObject);\n }\n return _format('/', pathObject);\n },\n\n parse: function parse(path) {\n assertPath(path);\n\n var ret = { root: '', dir: '', base: '', ext: '', name: '' };\n if (path.length === 0) return ret;\n var code = path.charCodeAt(0);\n var isAbsolute = code === 47 /*/*/;\n var start;\n if (isAbsolute) {\n ret.root = '/';\n start = 1;\n } else {\n start = 0;\n }\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n var i = path.length - 1;\n\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n\n // Get non-dir info\n for (; i >= start; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1) startDot = i;else if (preDotState !== 1) preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n if (end !== -1) {\n if (startPart === 0 && isAbsolute) ret.base = ret.name = path.slice(1, end);else ret.base = ret.name = path.slice(startPart, end);\n }\n } else {\n if (startPart === 0 && isAbsolute) {\n ret.name = path.slice(1, startDot);\n ret.base = path.slice(1, end);\n } else {\n ret.name = path.slice(startPart, startDot);\n ret.base = path.slice(startPart, end);\n }\n ret.ext = path.slice(startDot, end);\n }\n\n if (startPart > 0) ret.dir = path.slice(0, startPart - 1);else if (isAbsolute) ret.dir = '/';\n\n return ret;\n },\n\n sep: '/',\n delimiter: ':',\n win32: null,\n posix: null\n};\n\nposix.posix = posix;\n\nmodule.exports = posix;\n","// 'mime-score' back-ported to CommonJS\n\n// Score RFC facets (see https://tools.ietf.org/html/rfc6838#section-3)\nvar FACET_SCORES = {\n 'prs.': 100,\n 'x-': 200,\n 'x.': 300,\n 'vnd.': 400,\n default: 900\n}\n\n// Score mime source (Logic originally from `jshttp/mime-types` module)\nvar SOURCE_SCORES = {\n nginx: 10,\n apache: 20,\n iana: 40,\n default: 30 // definitions added by `jshttp/mime-db` project?\n}\n\nvar TYPE_SCORES = {\n // prefer application/xml over text/xml\n // prefer application/rtf over text/rtf\n application: 1,\n\n // prefer font/woff over application/font-woff\n font: 2,\n\n // prefer video/mp4 over audio/mp4 over application/mp4\n // See https://www.rfc-editor.org/rfc/rfc4337.html#section-2\n audio: 2,\n video: 3,\n\n default: 0\n}\n\n/**\n * Get each component of the score for a mime type. The sum of these is the\n * total score. The higher the score, the more \"official\" the type.\n */\nmodule.exports = function mimeScore (mimeType, source = 'default') {\n if (mimeType === 'application/octet-stream') {\n return 0\n }\n\n const [type, subtype] = mimeType.split('/')\n\n const facet = subtype.replace(/(\\.|x-).*/, '$1')\n\n const facetScore = FACET_SCORES[facet] || FACET_SCORES.default\n const sourceScore = SOURCE_SCORES[source] || SOURCE_SCORES.default\n const typeScore = TYPE_SCORES[type] || TYPE_SCORES.default\n\n // All else being equal prefer shorter types\n const lengthScore = 1 - mimeType.length / 100\n\n return facetScore + sourceScore + typeScore + lengthScore\n}\n","/*!\n * mime-types\n * Copyright(c) 2014 Jonathan Ong\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n'use strict'\n\n/**\n * Module dependencies.\n * @private\n */\n\nvar db = require('mime-db')\nvar extname = require('path').extname\nvar mimeScore = require('./mimeScore')\n\n/**\n * Module variables.\n * @private\n */\n\nvar EXTRACT_TYPE_REGEXP = /^\\s*([^;\\s]*)(?:;|\\s|$)/\nvar TEXT_TYPE_REGEXP = /^text\\//i\n\n/**\n * Module exports.\n * @public\n */\n\nexports.charset = charset\nexports.charsets = { lookup: charset }\nexports.contentType = contentType\nexports.extension = extension\nexports.extensions = Object.create(null)\nexports.lookup = lookup\nexports.types = Object.create(null)\nexports._extensionConflicts = []\n\n// Populate the extensions/types maps\npopulateMaps(exports.extensions, exports.types)\n\n/**\n * Get the default charset for a MIME type.\n *\n * @param {string} type\n * @return {false|string}\n */\n\nfunction charset (type) {\n if (!type || typeof type !== 'string') {\n return false\n }\n\n // TODO: use media-typer\n var match = EXTRACT_TYPE_REGEXP.exec(type)\n var mime = match && db[match[1].toLowerCase()]\n\n if (mime && mime.charset) {\n return mime.charset\n }\n\n // default text/* to utf-8\n if (match && TEXT_TYPE_REGEXP.test(match[1])) {\n return 'UTF-8'\n }\n\n return false\n}\n\n/**\n * Create a full Content-Type header given a MIME type or extension.\n *\n * @param {string} str\n * @return {false|string}\n */\n\nfunction contentType (str) {\n // TODO: should this even be in this module?\n if (!str || typeof str !== 'string') {\n return false\n }\n\n var mime = str.indexOf('/') === -1 ? exports.lookup(str) : str\n\n if (!mime) {\n return false\n }\n\n // TODO: use content-type or other module\n if (mime.indexOf('charset') === -1) {\n var charset = exports.charset(mime)\n if (charset) mime += '; charset=' + charset.toLowerCase()\n }\n\n return mime\n}\n\n/**\n * Get the default extension for a MIME type.\n *\n * @param {string} type\n * @return {false|string}\n */\n\nfunction extension (type) {\n if (!type || typeof type !== 'string') {\n return false\n }\n\n // TODO: use media-typer\n var match = EXTRACT_TYPE_REGEXP.exec(type)\n\n // get extensions\n var exts = match && exports.extensions[match[1].toLowerCase()]\n\n if (!exts || !exts.length) {\n return false\n }\n\n return exts[0]\n}\n\n/**\n * Lookup the MIME type for a file path/extension.\n *\n * @param {string} path\n * @return {false|string}\n */\n\nfunction lookup (path) {\n if (!path || typeof path !== 'string') {\n return false\n }\n\n // get the extension (\"ext\" or \".ext\" or full path)\n var extension = extname('x.' + path)\n .toLowerCase()\n .slice(1)\n\n if (!extension) {\n return false\n }\n\n return exports.types[extension] || false\n}\n\n/**\n * Populate the extensions and types maps.\n * @private\n */\n\nfunction populateMaps (extensions, types) {\n Object.keys(db).forEach(function forEachMimeType (type) {\n var mime = db[type]\n var exts = mime.extensions\n\n if (!exts || !exts.length) {\n return\n }\n\n // mime -> extensions\n extensions[type] = exts\n\n // extension -> mime\n for (var i = 0; i < exts.length; i++) {\n var extension = exts[i]\n types[extension] = _preferredType(extension, types[extension], type)\n\n // DELETE (eventually): Capture extension->type maps that change as a\n // result of switching to mime-score. This is just to help make reviewing\n // PR #119 easier, and can be removed once that PR is approved.\n const legacyType = _preferredTypeLegacy(\n extension,\n types[extension],\n type\n )\n if (legacyType !== types[extension]) {\n exports._extensionConflicts.push([extension, legacyType, types[extension]])\n }\n }\n })\n}\n\n// Resolve type conflict using mime-score\nfunction _preferredType (ext, type0, type1) {\n var score0 = type0 ? mimeScore(type0, db[type0].source) : 0\n var score1 = type1 ? mimeScore(type1, db[type1].source) : 0\n\n return score0 > score1 ? type0 : type1\n}\n\n// Resolve type conflict using pre-mime-score logic\nfunction _preferredTypeLegacy (ext, type0, type1) {\n var SOURCE_RANK = ['nginx', 'apache', undefined, 'iana']\n\n var score0 = type0 ? SOURCE_RANK.indexOf(db[type0].source) : 0\n var score1 = type1 ? SOURCE_RANK.indexOf(db[type1].source) : 0\n\n if (\n exports.types[extension] !== 'application/octet-stream' &&\n (score0 > score1 ||\n (score0 === score1 &&\n exports.types[extension]?.slice(0, 12) === 'application/'))\n ) {\n return type0\n }\n\n return score0 > score1 ? type0 : type1\n}\n","/* Drag and drop common functionality\n *\n * It is easy to make something draggable, or to make it a drag target!\n * Just call the functions below. In a Solid world, any part of the UI which\n * represents one thing which has a URI, should be made draggable using makeDraggable.\n * Any list of things should typically allow you to drag new members of the list\n * onto it.\n * The file upload function, uploadFiles, is provided as often as someone drags a file from the computer\n * desktop. You may want to upload it into the pod.\n */\nimport * as debug from '../lib/debug'\nimport * as mime from 'mime-types'\nimport { style } from '../lib/style'\n\n/* global FileReader alert */\n\nexport function makeDropTarget (ele, droppedURIHandler, droppedFileHandler) {\n const normalizeDroppedUris = function (uriText) {\n return uriText\n .split('\\n')\n .map(uri => uri.trim())\n .filter(uri => uri && uri[0] !== '#')\n }\n\n const dragoverListener = function (e) {\n e.preventDefault() // Need this; otherwise, drop does not work.\n e.stopPropagation()\n e.dataTransfer.dropEffect = 'copy'\n }\n\n const dragenterListener = function (e) {\n e.preventDefault()\n e.stopPropagation()\n debug.log('dragenter event dropEffect: ' + e.dataTransfer.dropEffect)\n if (this.localStyle) {\n // necessary not sure when\n if (!this.savedStyle) {\n this.savedStyle = style.dragEvent\n }\n }\n\n e.dataTransfer.dropEffect = 'link'\n debug.log('dragenter event dropEffect 2: ' + e.dataTransfer.dropEffect)\n }\n const dragleaveListener = function (e) {\n e.stopPropagation()\n debug.log('dragleave event dropEffect: ' + e.dataTransfer.dropEffect)\n if (this.savedStyle) {\n this.localStyle = this.savedStyle\n } else {\n this.localStyle = style.dropEvent\n }\n }\n\n const dropListener = function (e) {\n if (e.preventDefault) e.preventDefault() // stops the browser from redirecting off to the text.\n if (e.stopPropagation) e.stopPropagation()\n debug.log('Drop event. dropEffect: ' + e.dataTransfer.dropEffect)\n debug.log(\n 'Drop event. types: ' +\n (e.dataTransfer.types ? e.dataTransfer.types.join(', ') : 'NOPE')\n )\n\n let uris = null\n let text\n if (e.dataTransfer.types) {\n for (let t = 0; t < e.dataTransfer.types.length; t++) {\n const type = e.dataTransfer.types[t]\n if (type === 'text/uri-list') {\n uris = normalizeDroppedUris(e.dataTransfer.getData(type))\n debug.log('Dropped text/uri-list: ' + uris)\n } else if (type === 'text/plain') {\n text = e.dataTransfer.getData(type)\n } else if (type === 'Files' && droppedFileHandler) {\n const files = e.dataTransfer.files // FileList object.\n for (let i = 0; files[i]; i++) {\n const f = files[i]\n debug.log(\n 'Filename: ' +\n f.name +\n ', type: ' +\n (f.type || 'n/a') +\n ' size: ' +\n f.size +\n ' bytes, last modified: ' +\n (f.lastModifiedDate\n ? f.lastModifiedDate.toLocaleDateString()\n : 'n/a')\n )\n }\n droppedFileHandler(files)\n }\n }\n const trimmedText = text ? text.trim() : ''\n if (uris === null && trimmedText && trimmedText.slice(0, 4) === 'http') {\n uris = [trimmedText]\n debug.log('Warning: Poor man\\'s drop: using text for URI') // chrome disables text/uri-list??\n }\n } else {\n // ... however, if we're IE, we don't have the .types property, so we'll just get the Text value\n uris = normalizeDroppedUris(e.dataTransfer.getData('Text'))\n debug.log('WARNING non-standard drop event: ' + uris[0])\n }\n debug.log('Dropped URI list (2): ' + uris)\n if (uris) {\n droppedURIHandler(uris)\n }\n this.localStyle = style.restoreStyle // restore style\n return false\n } // dropListener\n\n const addTargetListeners = function (ele) {\n if (!ele) {\n debug.log('@@@ addTargetListeners: ele ' + ele)\n }\n ele.addEventListener('dragover', dragoverListener)\n ele.addEventListener('dragenter', dragenterListener)\n ele.addEventListener('dragleave', dragleaveListener)\n ele.addEventListener('drop', dropListener)\n }\n addTargetListeners(ele, droppedURIHandler)\n} // listen for dropped URIs\n\n// Make an HTML element draggable as a URI-identified thing\n//\n// Possibly later set the drag image too?\n//\nexport function makeDraggable (tr, obj) {\n tr.setAttribute('draggable', 'true') // Stop the image being dragged instead - just the TR\n\n tr.addEventListener(\n 'dragstart',\n function (e) {\n tr.style.fontWeight = 'bold'\n e.dataTransfer.setData('text/uri-list', obj.uri)\n e.dataTransfer.setData('text/plain', obj.uri)\n e.dataTransfer.setData('text/html', tr.outerHTML)\n debug.log(\n 'Dragstart: ' + tr + ' -> ' + obj + 'de: ' + e.dataTransfer.dropEffect\n )\n },\n false\n )\n\n tr.addEventListener(\n 'drag',\n function (e) {\n e.preventDefault()\n e.stopPropagation()\n // debug.log('Drag: dropEffect: ' + e.dataTransfer.dropEffect)\n },\n false\n )\n\n tr.addEventListener(\n 'dragend',\n function (e) {\n tr.style.fontWeight = 'normal'\n debug.log('Dragend dropeffect: ' + e.dataTransfer.dropEffect)\n debug.log('Dragend: ' + tr + ' -> ' + obj)\n },\n false\n )\n}\n\n/** uploadFiles\n**\n** Generic uploader of local files to the web\n** typically called from dropped file handler\n**\n** @param {Fetcher} fetcher instance of class Fetcher as in kb.fetcher\n** @param {Array<File>} files Array of file objects\n** @param {String} fileBase URI of folder in which to put files (except images) (no trailing slash)\n** @param {String } imageBase URI of folder in which to put images\n** @param successHandler function(file, uploadedURI) Called after EACH success upload\n** With file object an final URI as params\n*/\n\nexport function uploadFiles (fetcher, files, fileBase, imageBase, successHandler) {\n const describeUploadFailure = function (destURI, error) {\n const status = error?.response?.status ?? error?.status\n const message = error?.message || String(error)\n const prefix = `Upload failed while putting ${destURI}`\n\n if (status === 413) {\n return `${prefix}: storage quota was exceeded. ${message}`\n }\n\n return status\n ? `${prefix} (HTTP ${status}). ${message}`\n : `${prefix}. ${message}`\n }\n\n for (let i = 0; files[i]; i++) {\n const f = files[i]\n debug.log(\n ' dropped: Filename: ' +\n f.name +\n ', type: ' +\n (f.type || 'n/a') +\n ' size: ' +\n f.size +\n ' bytes, last modified: ' +\n (f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a')\n ) // See e.g. https://www.html5rocks.com/en/tutorials/file/dndfiles/\n\n // @@ Add: progress bar(s)\n const reader = new FileReader()\n reader.onload = (function (theFile) {\n return function (e) {\n const data = e.target.result\n let suffix = ''\n debug.log(' File read byteLength : ' + data.byteLength)\n let contentType = theFile.type\n if (!theFile.type || theFile.type === '') {\n // Not known by browser\n contentType = mime.lookup(theFile.name)\n if (!contentType) {\n const msg =\n 'Filename needs to have an extension which gives a type we know: ' +\n theFile.name\n debug.log(msg)\n alert(msg)\n throw new Error(msg)\n }\n } else {\n const extension = mime.extension(theFile.type)\n // Note not simple: eg .mp3 => audio/mpeg; .mpga => audio/mpeg; audio/mp3 => .mp3\n if (extension && extension !== 'false' && !theFile.name.endsWith('.' + extension) && // Not already has preferred extension? and ...\n theFile.type !== mime.lookup(theFile.name)) { // the mime type of this ext is not the right one?\n suffix = '_.' + extension\n // console.log('MIME TYPE MISMATCH: ' + mime.lookup(theFile.name) + ': adding extension: ' + suffix)\n }\n }\n const folderName = theFile.type.startsWith('image/')\n ? imageBase || fileBase\n : fileBase\n const destURI =\n folderName +\n (folderName.endsWith('/') ? '' : '/') +\n encodeURIComponent(theFile.name) +\n suffix\n\n fetcher\n .webOperation('PUT', destURI, {\n data,\n contentType\n })\n .then(\n _response => {\n debug.log(' Upload: put OK: ' + destURI)\n successHandler(theFile, destURI)\n },\n error => {\n const msg = describeUploadFailure(destURI, error)\n debug.log(msg)\n alert(msg)\n throw new Error(msg)\n }\n )\n }\n })(f)\n reader.readAsArrayBuffer(f)\n }\n}\n","/**\n * Create an error message block\n * @param dom The DOM on which dom.createElement will be called\n * @param err The error message string to display (or an error object)\n * @param backgroundColor Background color. Default: '#fee'\n * @param err2 Is the second param is a string, you can put the original Error in here\n * @returns A div element with the err string\n *\n * This will return a DOM element you can put in the UI as a notice for the user\n * Meanwhile the stack is dumped to the console for the developer, so you actually know\n * where it happened!\n */\n\nimport { cancelButton } from '../widgets'\nimport { style } from '../lib/style'\nimport styleConstants from '../lib/styleConstants'\n\nexport function errorMessageBlock (dom: HTMLDocument, err: string | Error, backgroundColor?: string, err2?: Error): HTMLDivElement {\n const div = dom.createElement('div')\n\n /* tslint:disable-next-line */ // Too complex for TS?\n // @ts-ignore\n const errorObject:Error = err2 || err instanceof Error ? err : null\n\n if (errorObject) {\n console.error(`errorMessageBlock: ${errorObject} at: ${errorObject.stack || '??'}`, errorObject) // @@ pick one\n div.textContent = errorObject.message\n } else {\n div.textContent = err as string\n }\n\n div.appendChild(cancelButton(dom, () => { if (div.parentNode) div.parentNode.removeChild(div) }))\n .style = style.errorCancelButton\n\n div.setAttribute('style', style.errorMessageBlockStyle)\n div.style.backgroundColor = (backgroundColor || styleConstants.defaultErrorBackgroundColor)\n return div\n}\n","// Works in FF extension - what about browserify??\n// 2021-04-08 Convert to TS\n\n/* The Firefox case is left for historical record, as we don't currenly\n * have a FF extension for mashlib, but we could. This is sthepoint to\n * hack the place it can find its icons internally\n *\n * The $SolidTestEnvironment is important and is used for\n * example when testing on localhost to specify a place the icons be found\n * in your test set up.\n *\n * You can also use it if you want to just run a mashlib whhich takes its\n * icons seved by other than github.\n */\n\nimport { log } from './debug'\n\ndeclare let $SolidTestEnvironment\n\n// Do not export. Always us this module to find the icons, as they vary\nconst iconsOnGithub = 'https://solidos.github.io/solid-ui/src' // changed org 2022-05\n\nexport const icons = typeof module !== 'undefined' && (module as any).scriptURI // Firefox extension\n ? {\n iconBase:\n (module as any).scriptURI.slice(0, (module as any).scriptURI.lastIndexOf('/')) + '/icons/',\n originalIconBase:\n (module as any).scriptURI.slice(0, (module as any).scriptURI.lastIndexOf('/')) +\n '/originalIcons/'\n }\n : typeof $SolidTestEnvironment !== 'undefined' && $SolidTestEnvironment.iconBase // Test environemnt\n ? {\n iconBase: $SolidTestEnvironment.iconBase,\n originalIconBase: $SolidTestEnvironment.originalIconBase\n }\n : {\n // Normal case:\n iconBase: iconsOnGithub + '/icons/',\n originalIconBase: iconsOnGithub + '/originalIcons/'\n }\n\nlog(' icons.iconBase is set to : ' + icons.iconBase)\n\n// allow tests etc named-import this directly from this module\nexport const iconBase = icons.iconBase\nexport const originalIconBase = icons.originalIconBase\n","/**\n *\n * People Picker Pane\n *\n * This pane offers a mechanism for selecting a set of individuals, groups, or\n * organizations to take some action on.\n *\n * Assumptions\n * - Assumes that the user has a type index entry for vcard:AddressBook. @@ bad assuption\n *\n */\nimport escape from 'escape-html'\nimport { v4 as uuidv4 } from 'uuid'\nimport * as rdf from 'rdflib'\nimport * as debug from '../lib/debug'\n\nimport { makeDropTarget } from './dragAndDrop'\nimport { errorMessageBlock } from './error'\nimport { iconBase } from '../lib/iconBase'\nimport ns from '../lib/ns'\nimport { solidLogicSingleton } from 'solid-logic'\n\nconst kb = solidLogicSingleton.store\n\nexport class PeoplePicker {\n constructor (element, typeIndex, groupPickedCb, options) { // @@ can't expect typeindex to be passed\n this.options = options || {}\n this.element = element\n this.typeIndex = typeIndex\n this.groupPickedCb = groupPickedCb\n this.selectedgroup = this.options.selectedgroup // current selected group if any\n this.onSelectGroup = this.onSelectGroup.bind(this)\n }\n\n render () {\n const container = document.createElement('div')\n container.style.maxWidth = '350px'\n container.style.minHeight = '200px'\n container.style.outline = '1px solid black'\n container.style.display = 'flex'\n\n if (this.selectedgroup) {\n container.style.flexDirection = 'column'\n const selectedGroup = document.createElement('div')\n new Group(selectedGroup, this.selectedgroup).render()\n const changeGroupButton = document.createElement('button')\n changeGroupButton.textContent = escape('Change group')\n changeGroupButton.addEventListener('click', _event => {\n this.selectedgroup = null\n this.render()\n })\n container.appendChild(selectedGroup)\n container.appendChild(changeGroupButton)\n } else {\n this.findAddressBook(this.typeIndex)\n .then(({ book }) => {\n const chooseExistingGroupButton = document.createElement('button')\n chooseExistingGroupButton.textContent = escape(\n 'Pick an existing group'\n )\n chooseExistingGroupButton.style.margin = 'auto'\n chooseExistingGroupButton.addEventListener('click', _event => {\n new GroupPicker(container, book, this.onSelectGroup).render()\n })\n\n const createNewGroupButton = document.createElement('button')\n createNewGroupButton.textContent = escape('Create a new group')\n createNewGroupButton.style.margin = 'auto'\n createNewGroupButton.addEventListener('click', _event => {\n this.createNewGroup(book, this.options.defaultNewGroupName)\n .then(({ group }) => {\n new GroupBuilder(\n this.element,\n book,\n group,\n this.onSelectGroup\n ).render()\n })\n .catch(errorBody => {\n this.element.appendChild(\n errorMessageBlock(\n document,\n escape(`Error creating a new group. (${errorBody})`)\n )\n )\n })\n })\n\n container.appendChild(chooseExistingGroupButton)\n container.appendChild(createNewGroupButton)\n\n this.element.innerHTML = ''\n this.element.appendChild(container)\n })\n .catch(err => {\n this.element.appendChild(\n errorMessageBlock(\n document,\n escape(`Could find your groups. (${err})`)\n )\n )\n })\n }\n\n this.element.innerHTML = ''\n this.element.appendChild(container)\n return this\n }\n\n findAddressBook (typeIndex) {\n return new Promise((resolve, reject) => {\n kb.fetcher.nowOrWhenFetched(typeIndex, (ok, err) => {\n if (!ok) {\n return reject(err)\n }\n const bookRegistration = kb.any(\n null,\n ns.solid('forClass'),\n ns.vcard('AddressBook')\n )\n if (!bookRegistration) {\n return reject(\n new Error(\n 'no address book registered in the solid type index ' + typeIndex\n )\n )\n }\n const book = kb.any(bookRegistration, ns.solid('instance'))\n if (!book) {\n return reject(new Error('incomplete address book registration'))\n }\n kb.fetcher\n .load(book)\n .then(function (_xhr) {\n return resolve({ book })\n })\n .catch(function (errr) {\n return reject(new Error('Could not load address book ' + errr))\n })\n })\n })\n }\n\n createNewGroup (book, defaultNewGroupName) {\n const { groupIndex, groupContainer } = indexes(book)\n const group = rdf.sym(\n `${groupContainer.uri}${uuidv4().slice(0, 8)}.ttl#this`\n )\n const name = defaultNewGroupName || 'Untitled Group'\n\n // NOTE that order matters here. Unfortunately this type of update is\n // non-atomic in that solid requires us to send two PATCHes, either of which\n // might fail.\n const patchPromises = [group.doc(), groupIndex].map(doc => {\n const typeStatement = rdf.st(group, ns.rdf('type'), ns.vcard('Group'), doc)\n const nameStatement = rdf.st(group, ns.vcard('fn'), name, group.doc(), doc)\n const includesGroupStatement = rdf.st(\n book,\n ns.vcard('includesGroup'),\n group,\n doc\n )\n const toIns = doc.equals(groupIndex)\n ? [typeStatement, nameStatement, includesGroupStatement]\n : [typeStatement, nameStatement]\n return patch(doc.uri, { toIns }).then(() => {\n toIns.forEach(st => {\n kb.add(st)\n })\n })\n })\n return Promise.all(patchPromises)\n .then(() => ({ group }))\n .catch(err => {\n debug.log('Could not create new group. PATCH failed ' + err)\n throw new Error(\n `Couldn't create new group. PATCH failed for (${\n err.xhr ? err.xhr.responseURL : ''\n } )`\n )\n })\n }\n\n onSelectGroup (group) {\n this.selectedgroup = group\n this.groupPickedCb(group)\n this.render()\n }\n}\n\nexport class GroupPicker {\n constructor (element, book, onSelectGroup) {\n this.element = element\n this.book = book\n this.onSelectGroup = onSelectGroup\n }\n\n render () {\n this.loadGroups()\n .then(groups => {\n // render the groups\n const container = document.createElement('div')\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n groups.forEach(group => {\n const groupButton = document.createElement('button')\n groupButton.addEventListener('click', this.handleClickGroup(group))\n new Group(groupButton, group).render()\n container.appendChild(groupButton)\n })\n this.element.innerHTML = ''\n this.element.appendChild(container)\n })\n .catch(err => {\n this.element.appendChild(\n errorMessageBlock(\n document,\n escape(`There was an error loading your groups. (${err})`)\n )\n )\n })\n return this\n }\n\n loadGroups () {\n return new Promise((resolve, reject) => {\n const { groupIndex } = indexes(this.book)\n kb.fetcher.nowOrWhenFetched(groupIndex, (ok, err) => {\n if (!ok) {\n return reject(err)\n }\n const groups = kb.each(this.book, ns.vcard('includesGroup'))\n return resolve(groups)\n })\n })\n }\n\n handleClickGroup (group) {\n return _event => {\n this.onSelectGroup(group)\n }\n }\n}\n\nexport class Group {\n constructor (element, group) {\n this.element = element\n this.group = group\n }\n\n render () {\n const container = document.createElement('div')\n container.textContent = escape(\n // @@@@@ need to escape??\n getWithDefault(this.group, ns.vcard('fn'), `[${this.group.value}]`)\n )\n this.element.innerHTML = ''\n this.element.appendChild(container)\n return this\n }\n}\n\nexport class GroupBuilder {\n constructor (element, book, group, doneBuildingCb, groupChangedCb) {\n this.element = element\n this.book = book\n this.group = group\n this.onGroupChanged = (err, changeType, agent) => {\n if (groupChangedCb) {\n groupChangedCb(err, changeType, agent)\n }\n }\n this.groupChangedCb = groupChangedCb\n this.doneBuildingCb = doneBuildingCb\n }\n\n refresh () {\n // TODO: implement\n }\n\n render () {\n const dropContainer = document.createElement('div')\n dropContainer.style.maxWidth = '350px'\n dropContainer.style.minHeight = '200px'\n dropContainer.style.outline = '1px solid black'\n dropContainer.style.display = 'flex'\n dropContainer.style.flexDirection = 'column'\n\n makeDropTarget(dropContainer, uris => {\n uris.forEach(uri => {\n this.add(uri).catch(err => {\n this.element.appendChild(\n errorMessageBlock(\n document,\n escape(`Could not add the given WebId. (${err})`)\n )\n )\n })\n })\n })\n\n const groupNameInput = document.createElement('input')\n groupNameInput.type = 'text'\n groupNameInput.value = getWithDefault(\n this.group,\n ns.vcard('fn'),\n 'Untitled Group'\n )\n groupNameInput.addEventListener('change', event => {\n this.setGroupName(event.target.value).catch(err => {\n this.element.appendChild(\n errorMessageBlock(document, `Error changing group name. (${err})`)\n )\n })\n })\n const groupNameLabel = document.createElement('label')\n groupNameLabel.textContent = escape('Group Name:')\n groupNameLabel.appendChild(groupNameInput)\n dropContainer.appendChild(groupNameLabel)\n\n if (kb.any(this.group, ns.vcard('hasMember'))) {\n kb.match(this.group, ns.vcard('hasMember')).forEach(statement => {\n const webIdNode = statement.object\n const personDiv = document.createElement('div')\n new Person(personDiv, webIdNode, this.handleRemove(webIdNode)).render()\n dropContainer.appendChild(personDiv)\n })\n } else {\n const copy = document.createElement('p')\n copy.textContent = escape`\n To add someone to this group, drag and drop their WebID URL onto the box.\n `\n dropContainer.appendChild(copy)\n }\n\n const doneBuildingButton = document.createElement('button')\n doneBuildingButton.textContent = escape('Done')\n doneBuildingButton.addEventListener('click', _event => {\n this.doneBuildingCb(this.group)\n })\n dropContainer.appendChild(doneBuildingButton)\n\n this.element.innerHTML = ''\n this.element.appendChild(dropContainer)\n return this\n }\n\n add (webId) {\n return new Promise((resolve, reject) => {\n kb.fetcher.nowOrWhenFetched(webId, (ok, err) => {\n if (!ok) {\n this.onGroupChanged(err)\n return reject(err)\n }\n // make sure it's a valid person, group, or entity (for now just handle\n // webId)\n const webIdNode = rdf.namedNode(webId)\n const rdfClass = kb.any(webIdNode, ns.rdf('type'))\n if (!rdfClass || !rdfClass.equals(ns.foaf('Person'))) {\n return reject(\n new Error(\n `Only people supported right now. (tried to add something of type ${rdfClass.value})`\n )\n )\n }\n return resolve(webIdNode)\n })\n }).then(webIdNode => {\n const statement = rdf.st(this.group, ns.vcard('hasMember'), webIdNode)\n if (kb.holdsStatement(statement)) {\n return webIdNode\n }\n return patch(this.group.doc().uri, { toIns: [statement] }).then(() => {\n statement.why = this.group.doc()\n kb.add(statement)\n this.onGroupChanged(null, 'added', webIdNode)\n this.render()\n })\n })\n }\n\n handleRemove (webIdNode) {\n return _event => {\n const statement = rdf.st(this.group, ns.vcard('hasMember'), webIdNode)\n return patch(this.group.doc().uri, { toDel: [statement] })\n .then(() => {\n kb.remove(statement)\n this.onGroupChanged(null, 'removed', webIdNode)\n this.render()\n return true\n })\n .catch(err => {\n const name = kb.any(webIdNode, ns.foaf('name'))\n const errorMessage =\n name && name.value\n ? `Could not remove ${name.value}. (${err})`\n : `Could not remove ${webIdNode.value}. (${err})`\n throw new Error(errorMessage)\n })\n }\n }\n\n setGroupName (name) {\n const { groupIndex } = indexes(this.book)\n const updatePromises = [this.group.doc(), groupIndex].map(namedGraph => {\n const oldNameStatements = kb.match(\n this.group,\n ns.vcard('fn'),\n null,\n namedGraph\n )\n const newNameStatement = rdf.st(\n this.group,\n ns.vcard('fn'),\n rdf.literal(name)\n )\n return patch(namedGraph.value, {\n toDel: oldNameStatements,\n toIns: [newNameStatement]\n }).then(_solidResponse => {\n kb.removeStatements(oldNameStatements)\n newNameStatement.why = namedGraph\n kb.add(newNameStatement)\n })\n })\n return Promise.all(updatePromises)\n }\n}\n// @ignore exporting this only for the unit test\n// @@ TODO maybe I should move this down at end, but for\n// now I will leave it where it was\nexport class Person {\n constructor (element, webIdNode, handleRemove) {\n this.webIdNode = webIdNode\n this.element = element\n this.handleRemove = handleRemove\n }\n\n render () {\n const container = document.createElement('div')\n container.style.display = 'flex'\n\n // TODO: take a look at UI.widgets.setName\n const imgSrc = getWithDefault(\n this.webIdNode,\n ns.foaf('img'),\n iconBase + 'noun_15059.svg'\n )\n const profileImg = document.createElement('img')\n profileImg.src = escape(imgSrc)\n profileImg.width = '50'\n profileImg.height = '50'\n profileImg.style.margin = '5px'\n\n // TODO: take a look at UI.widgets.setImage\n const name = getWithDefault(\n this.webIdNode,\n ns.foaf('name'),\n `[${this.webIdNode}]`\n )\n const nameSpan = document.createElement('span')\n nameSpan.innerHTML = escape(name)\n nameSpan.style.flexGrow = '1'\n nameSpan.style.margin = 'auto 0'\n\n const removeButton = document.createElement('button')\n removeButton.textContent = 'Remove'\n removeButton.addEventListener('click', _event =>\n this.handleRemove().catch(err => {\n this.element.appendChild(errorMessageBlock(document, escape(`${err}`)))\n })\n )\n removeButton.style.margin = '5px'\n\n container.appendChild(profileImg)\n container.appendChild(nameSpan)\n container.appendChild(removeButton)\n\n this.element.innerHTML = ''\n this.element.appendChild(container)\n return this\n }\n}\n\nfunction getWithDefault (subject, predicate, defaultValue) {\n const object = kb.any(subject, predicate)\n return object ? object.value : defaultValue\n}\n\nfunction patch (url, { toDel, toIns }) {\n return new Promise((resolve, reject) => {\n kb.updater.update(toDel, toIns, (uri, success, errorMessage) => {\n if (!success) {\n return reject(\n new Error(`PATCH failed for resource <${uri}>: ${errorMessage}`)\n )\n }\n resolve()\n })\n })\n // return webClient.patch(url, toDel, toIns)\n // .then(solidResponse => {\n // const status = solidResponse.xhr.status\n // if (status < 200 || status >= 400) {\n // const err = new Error(`PATCH failed for resource <${solidResponse.url}>`)\n // err.solidResponse = solidResponse\n // throw err\n // }\n // })\n}\n\nfunction indexes (book) {\n return {\n // bookIndex: book,\n groupIndex: kb.any(book, ns.vcard('groupIndex')),\n groupContainer: kb.sym(book.dir().uri + 'Group/')\n }\n}\n","export default 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEzLjAxNTcgOS4yNzM2M0MxNC4yOTU0IDguMzQwMzEgMTUuMTI4OCA2LjgyOTg0IDE1LjEyODggNS4xMjgyQzE1LjEyODggMi4zMDA1MSAxMi44MjgzIDAgMTAuMDAwNiAwQzcuMTcyODkgMCA0Ljg3MjM4IDIuMzAwNTEgNC44NzIzOCA1LjEyODJDNC44NzIzOCA2LjgyOTg0IDUuNzA1NyA4LjM0MDMxIDYuOTg1NDcgOS4yNzM2M0MzLjgwNDIyIDEwLjQ5MSAxLjUzOTA2IDEzLjU3NTQgMS41MzkwNiAxNy4xNzk1QzEuNTM5MDYgMTguNzM0NyAyLjgwNDM0IDIwIDQuMzU5NTcgMjBIMTUuNjQxNkMxNy4xOTY4IDIwIDE4LjQ2MjEgMTguNzM0NyAxOC40NjIxIDE3LjE3OTVDMTguNDYyMSAxMy41NzU0IDE2LjE5NyAxMC40OTEgMTMuMDE1NyA5LjI3MzYzWk02LjQxMDg2IDUuMTI4MkM2LjQxMDg2IDMuMTQ4ODMgOC4wMjEyMSAxLjUzODQ4IDEwLjAwMDYgMS41Mzg0OEMxMS45OCAxLjUzODQ4IDEzLjU5MDMgMy4xNDg4MyAxMy41OTAzIDUuMTI4MkMxMy41OTAzIDcuMTA3NTggMTEuOTggOC43MTc5NyAxMC4wMDA2IDguNzE3OTdDOC4wMjEyMSA4LjcxNzk3IDYuNDEwODYgNy4xMDc1OCA2LjQxMDg2IDUuMTI4MlpNMTUuNjQxNiAxOC40NjE1SDQuMzU5NTdDMy42NTI2NiAxOC40NjE1IDMuMDc3NTQgMTcuODg2NCAzLjA3NzU0IDE3LjE3OTVDMy4wNzc1NCAxMy4zNjIgNi4xODMxNiAxMC4yNTY0IDEwLjAwMDYgMTAuMjU2NEMxMy44MTgxIDEwLjI1NjQgMTYuOTIzNyAxMy4zNjIgMTYuOTIzNyAxNy4xNzk1QzE2LjkyMzcgMTcuODg2NCAxNi4zNDg2IDE4LjQ2MTUgMTUuNjQxNiAxOC40NjE1WiIgZmlsbD0iIzMxNDE1OCIvPgo8L3N2Zz4K'\n","import { style } from '../lib/style'\n\n/**\n * Wraps a Div in a TR/RD\n *\n * Takes a div and wraps it in a TR/TD to be backwards compatible to the\n * table structure of mashlib\n *\n * @param dom The HTML Document object aka Document Object Model\n * @param div the created widget will be appended to this\n * @param obj not sure what this is used for exactly\n *\n * @returns The HTML widget created\n *\n * @internal exporting this only for unit tests\n */\n\nexport const wrapDivInATR = (dom: HTMLDocument, div: HTMLDivElement, obj: any) => {\n const tr = dom.createElement('tr')\n const td = tr.appendChild(dom.createElement('td'))\n td.appendChild(div)\n ;(tr as any).subject = obj\n return tr\n}\n\n/**\n * Adds a click listener to a div\n *\n * Adds a given function as a click listener on the given div\n *\n * @param dom The HTML Document object aka Document Object Model\n * @param onClickFunction the click function to add to the click listener\n *\n * @returns The HTML widget created\n *\n * @internal exporting this only for unit tests\n */\n\nexport const addClickListenerToElement = (div: HTMLDivElement, onClickFunction: () => void) => {\n div.addEventListener('click', onClickFunction)\n}\n\n/**\n * Wraps a Div in a TR/RD\n *\n * Takes a div and wraps it in a TR/TD to be backwards compatible to the\n * table structure of mashlib\n *\n * @param dom The HTML Document object aka Document Object Model\n * @param div the created widget will be appended to this\n * @param obj not sure what this is used for exactly\n *\n * @returns The HTML widget created\n *\n * @internal exporting this only for unit tests\n */\n\nexport const createImageDiv = (dom: HTMLDocument, div: HTMLDivElement, image: HTMLImageElement | HTMLObjectElement) => {\n const imageDiv = div.appendChild(dom.createElement('div'))\n\n imageDiv.setAttribute('style', style.imageDivStyle)\n imageDiv.appendChild(image)\n image.setAttribute('draggable', 'false') // Stop the image being dragged instead - just the TR\n}\n","import { NamedNode } from 'rdflib'\nimport '~icons/lucide/square-arrow-out-up-right'\n\n/**\n * Creates an anchor tag for a NamedNode\n *\n * Takes a NamedNode and creates an anchor tag for it\n *\n * @param dom The HTML Document object aka Document Object Model\n * @param subject NamedNode the anchor tag is created for\n * @param iconURI? Optional if you have your own icon link\n *\n * @returns The anchor tag for the subject\n *\n */\n\nexport function linkIcon (dom: HTMLDocument, subject: NamedNode, iconURI?: string): HTMLElement {\n const anchor = dom.createElement('a')\n anchor.setAttribute('href', subject.uri)\n if (subject.uri.startsWith('http')) {\n // If diff web page\n anchor.setAttribute('target', '_blank') // open in a new tab or window\n } // as mailboxes and mail messages do not need new browser window\n if (iconURI) {\n const img = anchor.appendChild(dom.createElement('img'))\n img.setAttribute('src', iconURI)\n img.setAttribute('style', 'margin: 0.3em;')\n } else {\n anchor.setAttribute('aria-label', 'Open resource')\n const icon = anchor.appendChild(dom.createElement('icon-lucide-square-arrow-out-up-right'))\n icon.setAttribute('aria-hidden', 'true')\n icon.setAttribute('style', 'display: inline-block; width: 1em; height: 1em; margin: 0.2em; color: var(--color-text-secondary, #4A5565);')\n }\n return anchor\n}\n/**\n * Creates a Link for a URI\n *\n * Takes a div element for a link and attaches the provided linkIcon\n *\n * @param dom The HTML Document object aka Document Object Model\n * @param linkDiv the created link will be appended to this\n * @param obj NamedNode the link needs to be created for\n *\n * @returns The HTML widget created\n *\n */\n\nexport const createLinkForURI = (dom: HTMLDocument, linkDiv: HTMLDivElement, obj: NamedNode) => {\n const iconLink = linkIcon(dom, obj)\n const anchor = linkDiv.appendChild(iconLink)\n anchor.classList.add('HoverControlHide')\n linkDiv.appendChild(dom.createElement('br'))\n}\n","/* Buttons\n*/\nimport { IndexedFormula, NamedNode, st, sym, uri, Util } from 'rdflib'\nimport { icons } from '../lib/iconBase'\nimport ns from '../lib/ns'\nimport { style } from '../lib/style'\nimport * as debug from '../lib/debug'\nimport { info } from '../lib/log'\nimport { uploadFiles, makeDraggable, makeDropTarget } from './dragAndDrop'\nimport { store } from 'solid-logic'\nimport * as utils from '../utils'\nimport newPersonIconDataURI from '../lib/newperson'\nimport { errorMessageBlock } from './error'\nimport { addClickListenerToElement, createImageDiv, wrapDivInATR } from './widgetHelpers'\nimport { linkIcon, createLinkForURI } from './buttons/iconLinks'\n\n/**\n * UI Widgets such as buttons\n * @packageDocumentation\n */\n\n/* global alert */\n\nconst { iconBase } = icons\n\nconst cancelIconURI = iconBase + 'noun_1180156.svg' // black X\nconst checkIconURI = iconBase + 'noun_1180158.svg' // green checkmark; Continue\n\nexport type StatusAreaContext = {\n statusArea?: HTMLElement\n div?: HTMLElement\n dom?: HTMLDocument\n}\nexport type ButtonType = 'Primary' | 'Secondary'\n\nexport type ButtonWidgetOptions = {\n buttonColor?: ButtonType,\n needsBorder?: boolean\n}\n\nexport type RenderAsDivOptions = {\n image?: HTMLImageElement,\n title?: string,\n deleteFunction?: () => void,\n confirmationContainer?: HTMLElement,\n link?: boolean,\n noun?: string,\n draggable?: boolean,\n clickable?: boolean,\n onClickFunction?: () => void,\n wrapInATR?: boolean\n}\n\nexport type AttachmentSupportingInfo = string | HTMLElement | null | undefined\nexport type RenderSupportingInfo = (target: NamedNode, dom: HTMLDocument) => AttachmentSupportingInfo\nexport type AttachmentInlineInfo = string | HTMLElement | null | undefined\nexport type RenderNameSuffix = (target: NamedNode, dom: HTMLDocument) => AttachmentInlineInfo\n\nfunction getStatusArea (context?: StatusAreaContext) {\n let box = (context && context.statusArea) || (context && context.div) || null\n if (box) return box\n let dom = context && context.dom\n if (!dom && typeof document !== 'undefined') {\n dom = document\n }\n if (dom) {\n const body = dom.getElementsByTagName('body')[0]\n box = dom.createElement('div')\n body.insertBefore((box as unknown as HTMLElement), body.firstElementChild)\n if (context) {\n context.statusArea = (box as unknown as HTMLElement)\n }\n return box\n }\n return null\n}\n\n/**\n * Display an error message block\n */\nexport function complain (context?: StatusAreaContext, err?: string) {\n if (!err) return // only if error\n const ele = getStatusArea(context)\n debug.log('Complaint: ' + err)\n if (ele) ele.appendChild(errorMessageBlock((context && context.dom) || document, err))\n else alert(err)\n}\n\n/**\n * Remove all the children of an HTML element\n */\nexport function clearElement (ele: HTMLElement) {\n while (ele.firstChild) {\n ele.removeChild(ele.firstChild)\n }\n return ele\n}\n\n/**\n * To figure out the log URI from the full URI used to invoke the reasoner\n */\nexport function extractLogURI (fullURI) {\n const logPos = fullURI.search(/logFile=/)\n const rulPos = fullURI.search(/&rulesFile=/)\n return fullURI.substring(logPos + 8, rulPos)\n}\n\n/**\n * By default, converts e.g. '2020-02-19T19:35:28.557Z' to '19:35'\n * if today is 19 Feb 2020, and to 'Feb 19' if not.\n * @@@ TODO This needs to be changed to local time\n * @param noTime Return a string like 'Feb 19' even if it's today.\n */\nexport function shortDate (str?: string, noTime?: boolean): string {\n if (!str) return '???'\n const month = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec'\n ]\n try {\n const nowZ = new Date().toISOString()\n // var nowZ = $rdf.term(now).value\n // var n = now.getTimezoneOffset() // Minutes\n if (str.slice(0, 10) === nowZ.slice(0, 10) && !noTime) {\n return str.slice(11, 16)\n }\n if (str.slice(0, 4) === nowZ.slice(0, 4)) {\n return (\n month[parseInt(str.slice(5, 7), 10) - 1] +\n ' ' +\n parseInt(str.slice(8, 10), 10)\n )\n }\n return str.slice(0, 10)\n } catch (e) {\n return 'shortdate:' + e\n }\n}\n\n/**\n * Format a date and time\n * @param date for instance `new Date()`\n * @param format for instance '{FullYear}-{Month}-{Date}T{Hours}:{Minutes}:{Seconds}.{Milliseconds}'\n * @returns for instance '2000-01-15T23:14:23.002'\n */\nexport function formatDateTime (date: Date, format: string): string {\n return format\n .split('{')\n .map(function (s) {\n const k = s.split('}')[0]\n const width = { Milliseconds: 3, FullYear: 4 }\n const d = { Month: 1 }\n return s\n ? ('000' + (date['get' + k]() + (d[k] || 0))).slice(-(width[k] || 2)) + s.split('}')[1]\n : ''\n })\n .join('')\n}\n\n/**\n * Get a string representation of the current time\n * @returns for instance '2000-01-15T23:14:23.002'\n */\nexport function timestamp (): string {\n return formatDateTime(\n new Date(),\n '{FullYear}-{Month}-{Date}T{Hours}:{Minutes}:{Seconds}.{Milliseconds}'\n )\n}\n\n/**\n * Get a short string representation of the current time\n * @returns for instance '23:14:23.002'\n */\nexport function shortTime (): string {\n return formatDateTime(\n new Date(),\n '{Hours}:{Minutes}:{Seconds}.{Milliseconds}'\n )\n}\n\n// ///////////////////// Handy UX widgets\n\n/**\n * Sets the best name we have and looks up a better one\n */\nexport function setName (element: HTMLElement, x: NamedNode) {\n const kb = store\n const findName = function (x) {\n const name =\n kb.any(x, ns.vcard('fn')) ||\n kb.any(x, ns.foaf('name')) ||\n kb.any(x, ns.vcard('organization-name'))\n return name ? name.value : null\n }\n const name = x.sameTerm(ns.foaf('Agent')) ? 'Everyone' : findName(x)\n element.textContent = name || utils.label(x)\n if (!name && x.uri) {\n if (!kb.fetcher) {\n throw new Error('kb has no fetcher')\n }\n // Note this is only a fetch, not a lookUP of all sameAs etc\n kb.fetcher.nowOrWhenFetched(x.doc(), undefined, function (_ok) {\n element.textContent = findName(x) || utils.label(x) // had: (ok ? '' : '? ') +\n })\n }\n}\n\n/**\n * Set of suitable images\n * See also [[findImage]]\n * @param x The thing for which we want to find an image\n * @param kb The RDF store to look in\n * @returns It goes looking for triples in `kb`,\n * `(subject: x), (predicate: see list below) (object: image-url)`\n * to find any image linked from the thing with one of the following\n * predicates (in order):\n * * ns.sioc('avatar')\n * * ns.foaf('img')\n * * ns.vcard('logo')\n * * ns.vcard('hasPhoto')\n * * ns.vcard('photo')\n * * ns.foaf('depiction')\n\n */\nexport function imagesOf (x: NamedNode | null, kb: IndexedFormula): any[] {\n return kb\n .each(x, ns.sioc('avatar'))\n .concat(kb.each(x, ns.foaf('img')))\n .concat(kb.each(x, ns.vcard('logo')))\n .concat(kb.each(x, ns.vcard('hasPhoto')))\n .concat(kb.each(x, ns.vcard('photo')))\n .concat(kb.each(x, ns.foaf('depiction')))\n}\n\n/**\n * Best logo or avatar or photo etc to represent someone or some group etc\n */\nexport const iconForClass = {\n // Potentially extendable by other apps, panes, etc\n // Relative URIs to the iconBase\n 'solid:AppProviderClass': 'noun_144.svg', // @@ classs name should not contain 'Class'\n 'solid:AppProvider': 'noun_15177.svg', // @@\n 'solid:Pod': 'noun_Cabinet_1434380.svg',\n 'vcard:Group': 'noun_339237.svg',\n 'vcard:Organization': 'noun_143899.svg',\n // TEMP HACK: Use locally bundled icon; switch to solid-assets icon mapping soon.\n 'vcard:Individual': newPersonIconDataURI,\n 'schema:Person': newPersonIconDataURI,\n 'foaf:Person': newPersonIconDataURI,\n 'foaf:Agent': 'noun_98053.svg',\n 'acl:AuthenticatedAgent': 'noun_99101.svg',\n 'prov:SoftwareAgent': 'noun_Robot_849764.svg', // Bot\n 'vcard:AddressBook': 'noun_15695.svg',\n 'trip:Trip': 'noun_581629.svg',\n 'meeting:LongChat': 'noun_1689339.svg',\n 'meeting:Meeting': 'noun_66617.svg',\n 'meeting:Project': 'noun_1036577.svg',\n 'ui:Form': 'noun_122196.svg',\n 'rdfs:Class': 'class-rectangle.svg', // For RDF developers\n 'rdf:Property': 'property-diamond.svg',\n 'owl:Ontology': 'noun_classification_1479198.svg',\n 'wf:Tracker': 'noun_122196.svg',\n 'wf:Task': 'noun_17020_gray-tick.svg',\n 'wf:Open': 'noun_17020_sans-tick.svg',\n 'wf:Closed': 'noun_17020.svg'\n}\n\n/**\n * Returns the origin of the URI of a NamedNode\n */\nfunction tempSite (x: NamedNode) {\n // use only while one in rdflib fails with origins 2019\n const str = x.uri.split('#')[0]\n const p = str.indexOf('//')\n if (p < 0) throw new Error('This URI does not have a web site part (origin)')\n const q = str.indexOf('/', p + 2)\n if (q < 0) {\n // no third slash?\n return str.slice(0) + '/' // Add slash to a bare origin\n } else {\n return str.slice(0, q + 1)\n }\n}\n\n/**\n * Find an image for this thing as a class\n */\nexport function findImageFromURI (x: NamedNode | string): string | null {\n const iconDir = iconBase\n\n // Special cases from URI scheme:\n if (typeof x !== 'string' && x.uri) {\n if (\n x.uri.split('/').length === 4 &&\n !x.uri.split('/')[1] &&\n !x.uri.split('/')[3]\n ) {\n return iconDir + 'noun_15177.svg' // App -- this is an origin\n }\n // Non-HTTP URI types imply types\n if (x.uri.startsWith('message:') || x.uri.startsWith('mid:')) {\n // message: is apple bug-- should be mid:\n return iconDir + 'noun_480183.svg' // envelope noun_567486\n }\n if (x.uri.startsWith('mailto:')) {\n return iconDir + 'noun_567486.svg' // mailbox - an email desitination\n }\n // For HTTP(s) documents, we could look at the MIME type if we know it.\n if (x.uri.startsWith('https:') && x.uri.indexOf('#') < 0) {\n return tempSite(x) + 'favicon.ico' // was x.site().uri + ...\n // Todo: make the document icon a fallback for if the favicon does not exist\n // todo: pick up a possible favicon for the web page itself from a link\n // was: return iconDir + 'noun_681601.svg' // document - under solid assumptions\n }\n return null\n }\n\n return iconDir + 'noun_10636_grey.svg' // Grey Circle - some thing\n}\n\n/**\n * Find something we have as explicit image data for the thing\n * See also [[imagesOf]]\n * @param thing The thing for which we want to find an image\n * @returns The URL of a globe icon if thing equals `ns.foaf('Agent')`\n * or `ns.rdf('Resource')`. Otherwise, it goes looking for\n * triples in `store`,\n * `(subject: thing), (predicate: see list below) (object: image-url)`\n * to find any image linked from the thing with one of the following\n * predicates (in order):\n * * ns.sioc('avatar')\n * * ns.foaf('img')\n * * ns.vcard('logo')\n * * ns.vcard('hasPhoto')\n * * ns.vcard('photo')\n * * ns.foaf('depiction')\n */\nexport function findImage (thing: NamedNode): string {\n const kb = store\n const iconDir = iconBase\n if (thing.sameTerm(ns.foaf('Agent')) || thing.sameTerm(ns.rdf('Resource'))) {\n return iconDir + 'noun_98053.svg' // Globe\n }\n const image =\n kb.any(thing, ns.sioc('avatar')) ||\n kb.any(thing, ns.foaf('img')) ||\n kb.any(thing, ns.vcard('logo')) ||\n kb.any(thing, ns.vcard('hasPhoto')) ||\n kb.any(thing, ns.vcard('photo')) ||\n kb.any(thing, ns.foaf('depiction'))\n return image ? (image as any).uri : null as any\n}\n\n/**\n * Do the best you can with the data available\n *\n * @return {Boolean} Are we happy with this icon?\n * Sets src AND STYLE of the image.\n */\nfunction trySetImage (element, thing, iconForClassMap) {\n const kb = store\n\n const explitImage = findImage(thing)\n if (explitImage) {\n element.setAttribute('src', explitImage)\n return true\n }\n // This is one of the classes we know about - the class itself?\n const typeIcon = iconForClassMap[thing.uri]\n if (typeIcon) {\n element.setAttribute('src', typeIcon)\n element.style = style.classIconStyle\n // element.style.border = '0.1em solid green;'\n // element.style.backgroundColor = '#eeffee' // pale green\n return true\n }\n const schemeIcon = findImageFromURI(thing)\n if (schemeIcon) {\n element.setAttribute('src', schemeIcon)\n return true // happy with this -- don't look it up\n }\n\n // Do we have a generic icon for something in any class its in?\n const types = kb.findTypeURIs(thing)\n for (const typeURI in types) {\n if (iconForClassMap[typeURI]) {\n element.setAttribute('src', iconForClassMap[typeURI])\n return false // maybe we can do better\n }\n }\n element.setAttribute('src', iconBase + 'noun_10636_grey.svg') // Grey Circle - some thing\n return false // we can do better\n}\n\n/**\n * ToDo: Also add icons for *properties* like home, work, email, range, domain, comment,\n */\nexport function setImage (element: HTMLElement, thing: NamedNode) { // 20191230a\n const kb = store\n\n const iconForClassMap = {}\n for (const k in iconForClass) {\n const pref = k.split(':')[0]\n const id = k.split(':')[1]\n const theClass = ns[pref](id)\n const iconRef = iconForClass[k]\n /* Temporary hack for a new design icon */\n if (iconRef.startsWith('data:')) {\n iconForClassMap[theClass.uri] = iconRef\n } else {\n iconForClassMap[theClass.uri] = uri.join(iconRef, iconBase)\n }\n }\n\n const happy = trySetImage(element, thing, iconForClassMap)\n if (!happy && thing.uri) {\n if (!kb.fetcher) {\n throw new Error('kb has no fetcher')\n }\n kb.fetcher.nowOrWhenFetched(thing.doc(), undefined, (ok) => {\n if (ok) {\n trySetImage(element, thing, iconForClassMap)\n }\n })\n }\n}\n\n// If a web page, then a favicon, with a fallback to ???\n// See, e.g., http://stackoverflow.com/questions/980855/inputting-a-default-image\nexport function faviconOrDefault (dom: HTMLDocument, x: NamedNode) {\n const image = dom.createElement('img')\n ;(image as any).style = style.iconStyle\n const isOrigin = function (x) {\n if (!x.uri) return false\n const parts = x.uri.split('/')\n return parts.length === 3 || (parts.length === 4 && parts[3] === '')\n }\n image.setAttribute(\n 'src',\n iconBase + (isOrigin(x) ? 'noun_15177.svg' : 'noun_681601.svg') // App symbol vs document\n )\n if (x.uri && x.uri.startsWith('https:') && x.uri.indexOf('#') < 0) {\n const res = dom.createElement('object') // favico with a fallback of a default image if no favicon\n res.setAttribute('data', tempSite(x) + 'favicon.ico')\n res.setAttribute('type', 'image/x-icon')\n res.appendChild(image) // fallback\n return res\n } else {\n setImage(image, x)\n return image\n }\n}\n\n/* Two-option dialog pop-up\n*/\n\nfunction renderDeleteConfirmPopup (dom: HTMLDocument, refererenceElement: HTMLElement, prompt: string, deleteFunction: () => any, restoreFocus: () => void) {\n function removePopup () {\n refererenceElement.remove()\n restoreFocus()\n }\n function removePopupAndDoDeletion () {\n removePopup()\n const result = deleteFunction()\n if (result && typeof result.then === 'function') {\n return result.then(restoreFocus)\n }\n restoreFocus()\n }\n const popup = dom.createElement('div')\n popup.style.cssText = style.confirmPopupStyle\n popup.style.position = 'absolute'\n popup.style.top = '-1em' // try leaving original button clear\n\n popup.style.display = 'grid'\n popup.style.gridTemplateColumns = 'auto auto'\n const affirm = dom.createElement('div')\n affirm.style.gridColumn = '1/2'\n affirm.style.gridRow = '1' // @@ sigh; TS. could pass number in fact\n const cancel = dom.createElement('div')\n cancel.style.gridColumn = '1/2'\n cancel.style.gridRow = '2'\n\n const xButton = cancelButton(dom, removePopup)\n popup.appendChild(xButton)\n xButton.style.gridColumn = '1'\n xButton.style.gridRow = '2'\n\n const cancelPrompt = popup.appendChild(dom.createElement('button'))\n cancelPrompt.style.cssText = style.buttonStyle\n cancelPrompt.style.gridRow = '2'\n cancelPrompt.style.gridColumn = '2'\n cancelPrompt.textContent = 'Cancel' // @@ I18n\n\n const affirmIcon = button(dom, icons.iconBase + 'noun_925021.svg', 'Delete it') // trashcan\n popup.appendChild(affirmIcon)\n affirmIcon.style.gridRow = '1'\n affirmIcon.style.gridColumn = '1'\n\n const sureButtonElt = popup.appendChild(dom.createElement('button'))\n sureButtonElt.style.cssText = style.buttonStyle\n sureButtonElt.style.gridRow = '1'\n sureButtonElt.style.gridColumn = '2'\n sureButtonElt.textContent = prompt\n popup.appendChild(sureButtonElt)\n\n affirmIcon.addEventListener('click', removePopupAndDoDeletion)\n sureButtonElt.addEventListener('click', removePopupAndDoDeletion)\n\n // xButton.addEventListener('click', removePopup)\n cancelPrompt.addEventListener('click', removePopup)\n\n return popup\n}\n/**\n * Delete button with a check you really mean it\n * Return a promise from deleteFunction for focus restoration after asynchronous deletion.\n * @@ Supress check if command key held down?\n */\nexport function deleteButtonWithCheck (\n dom: HTMLDocument,\n container: HTMLElement,\n noun: string,\n deleteFunction: () => any,\n confirmationContainer?: HTMLElement\n) {\n function createPopup () {\n const focusableSelector = 'button:not([disabled]), a[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n const focusScopes: { element: HTMLElement, index: number }[] = []\n if (confirmationContainer) {\n for (let ancestor: HTMLElement | null = container; ancestor; ancestor = ancestor.parentElement) {\n const controls = Array.from(ancestor.querySelectorAll<HTMLElement>(focusableSelector))\n focusScopes.push({ element: ancestor, index: controls.indexOf(deleteButton) })\n }\n }\n function restoreFocus () {\n if (!confirmationContainer) return\n if (deleteButton.isConnected) {\n deleteButton.focus()\n return\n }\n for (const scope of focusScopes) {\n if (!scope.element.isConnected) continue\n const controls = scope.element.querySelectorAll<HTMLElement>(focusableSelector)\n if (controls.length) {\n controls[Math.min(Math.max(scope.index, 0), controls.length - 1)].focus()\n return\n }\n }\n const survivingScope = focusScopes.find(scope => scope.element.isConnected)\n if (survivingScope) {\n survivingScope.element.tabIndex = -1\n survivingScope.element.focus()\n }\n }\n const refererenceElement = dom.createElement('div')\n if (confirmationContainer) {\n confirmationContainer.querySelector(':scope > [data-delete-confirmation]')?.remove()\n refererenceElement.setAttribute('data-delete-confirmation', '')\n refererenceElement.setAttribute('role', 'dialog')\n refererenceElement.setAttribute('aria-label', prompt)\n confirmationContainer.appendChild(refererenceElement)\n } else {\n container.insertBefore(refererenceElement, deleteButton)\n refererenceElement.style.position = 'relative' // Needed as reference for popup\n }\n const popup = renderDeleteConfirmPopup(dom, refererenceElement, prompt, deleteFunction, restoreFocus)\n refererenceElement.appendChild(popup)\n if (confirmationContainer) {\n popup.style.position = 'static'\n popup.style.top = ''\n Array.from(popup.querySelectorAll<HTMLButtonElement>('button'))\n .find(button => button.textContent === 'Cancel')?.focus()\n }\n }\n const minusIconURI = iconBase + 'noun_2188_red.svg' // white minus in red #cc0000 circle\n const deleteButton = dom.createElement('img')\n deleteButton.setAttribute('src', minusIconURI)\n deleteButton.tabIndex = 0\n deleteButton.setAttribute('role', 'button')\n\n deleteButton.setAttribute('style', style.smallButtonStyle) // @@tsc - would set deleteButton.style\n deleteButton.style.float = 'right' // Historically this has alwaus floated right\n\n const prompt = 'Remove this ' + noun\n deleteButton.title = prompt\n deleteButton.setAttribute('aria-label', prompt)\n // @@ In an ideal world, make use of hover an accessibility option\n deleteButton.classList.add('hoverControlHide')\n\n deleteButton.addEventListener('click', createPopup)\n deleteButton.addEventListener('keydown', event => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n deleteButton.click()\n }\n })\n\n container.classList.add('hoverControl')\n container.appendChild(deleteButton)\n deleteButton.setAttribute('data-testid', 'deleteButtonWithCheck')\n return deleteButton // or button div? caller may change size of image\n}\n\n/* Make a button\n *\n * @param dom - the DOM document object\n * @Param iconURI - the URI of the icon to use (if any)\n * @param text - the tooltip text or possibly button contents text\n * @param handler <function> - A handler to called when button is clicked\n *\n * @returns <dDomElement> - the button\n */\nexport function button (dom: HTMLDocument, iconURI: string | undefined, text: string,\n handler?: (_event: any) => void,\n options: ButtonWidgetOptions = { buttonColor: 'Primary', needsBorder: false }) {\n const button = dom.createElement('button')\n button.setAttribute('type', 'button')\n // button.innerHTML = text // later, user preferences may make text preferred for some\n if (iconURI) {\n const img = button.appendChild(dom.createElement('img'))\n img.setAttribute('src', iconURI)\n img.setAttribute('style', 'width: 2em; height: 2em;') // trial and error. 2em disappears\n img.title = text\n button.setAttribute('style', style.buttonStyle)\n } else {\n button.textContent = text.toLocaleUpperCase()\n\n button.onmouseover = function () {\n if (options.buttonColor === 'Secondary') {\n if (options.needsBorder) {\n button.setAttribute('style', style.secondaryButtonNoBorderHover)\n } else {\n button.setAttribute('style', style.secondaryButtonHover)\n }\n } else {\n if (options.needsBorder) {\n button.setAttribute('style', style.primaryButtonNoBorderHover)\n } else {\n button.setAttribute('style', style.primaryButtonHover)\n }\n }\n }\n button.onmouseout = function () {\n if (options.buttonColor === 'Secondary') {\n if (options.needsBorder) {\n button.setAttribute('style', style.secondaryButtonNoBorder)\n } else {\n button.setAttribute('style', style.secondaryButton)\n }\n } else {\n if (options.needsBorder) {\n button.setAttribute('style', style.primaryButtonNoBorder)\n } else {\n button.setAttribute('style', style.primaryButton)\n }\n }\n }\n\n if (options.buttonColor === 'Secondary') {\n if (options.needsBorder) {\n button.setAttribute('style', style.secondaryButtonNoBorder)\n } else {\n button.setAttribute('style', style.secondaryButton)\n }\n } else {\n if (options.needsBorder) {\n button.setAttribute('style', style.primaryButtonNoBorder)\n } else {\n button.setAttribute('style', style.primaryButton)\n }\n }\n }\n\n if (handler) {\n button.addEventListener('click', handler, false)\n }\n return button\n}\n\n/* Make a cancel button\n *\n * @param dom - the DOM document object\n * @param handler <function> - A handler to called when button is clicked\n *\n * @returns <dDomElement> - the button\n */\nexport function cancelButton (dom: HTMLDocument, handler: (_event?: any) => void) {\n const b = button(dom, cancelIconURI, 'Cancel', handler)\n if (b.firstChild) { // sigh for tsc\n (b.firstChild as HTMLElement).style.opacity = '0.3' // Black X is too harsh: current language is grey X\n }\n return b\n}\n\n/* Make a continue button\n *\n * @param dom - the DOM document object\n * @param handler <function> - A handler to called when button is clicked\n *\n * @returns <dDomElement> - the button\n */\nexport function continueButton (dom: HTMLDocument, handler: (_event: any) => void) {\n return button(dom, checkIconURI, 'Continue', handler)\n}\n\n/* Grab a name for a new thing\n *\n * Form to get the name of a new thing before we create it\n * @params theClass Misspelt to avoid clashing with the JavaScript keyword\n * @returns: a promise of (a name or null if cancelled)\n */\nexport function askName (\n dom: HTMLDocument,\n kb: IndexedFormula,\n container: HTMLDivElement,\n predicate?: NamedNode,\n theClass?: NamedNode,\n noun?: string) {\n return new Promise(function (resolve, _reject) {\n const form = dom.createElement('div') // form is broken as HTML behaviour can resurface on js error\n // classLabel = utils.label(ns.vcard('Individual'))\n predicate = predicate || ns.foaf('name') // eg 'name' in user's language\n noun = noun || (theClass ? utils.label(theClass) : ' ') // eg 'folder' in users's language\n const prompt = noun + ' ' + utils.label(predicate) + ': '\n form.appendChild(dom.createElement('p')).textContent = prompt\n const namefield = dom.createElement('input')\n namefield.setAttribute('type', 'text')\n namefield.setAttribute('size', '100')\n namefield.setAttribute('maxLength', '2048') // No arbitrary limits\n namefield.setAttribute('style', style.textInputStyle)\n namefield.select() // focus next user input\n form.appendChild(namefield)\n container.appendChild(form)\n\n // namefield.focus()\n\n function gotName () {\n ((form as HTMLElement).parentNode as HTMLElement).removeChild(form)\n resolve(namefield.value.trim())\n }\n\n namefield.addEventListener('keyup', function (e) {\n if (e.keyCode === 13) {\n gotName()\n }\n }, false)\n\n form.appendChild(dom.createElement('br'))\n\n form.appendChild(cancelButton(dom, function (_event) {\n ((form as HTMLElement).parentNode as HTMLElement).removeChild(form)\n resolve(null)\n }))\n\n form.appendChild(continueButton(dom, function (_event) {\n gotName()\n }))\n namefield.focus()\n }) // Promise\n}\n\n/**\n * A TR to represent a draggable person, etc in a list\n *\n * pred is unused param at the moment\n */\nexport const personTR = renderAsRow // The legacy name is used in a lot of places\n\nexport function renderAsRow (dom: HTMLDocument, pred: NamedNode, obj: NamedNode, options: any): HTMLTableRowElement {\n const tr = dom.createElement('tr')\n options = options || {}\n // tr.predObj = [pred.uri, obj.uri] moved to acl-control\n const td1 = tr.appendChild(dom.createElement('td'))\n const td2 = tr.appendChild(dom.createElement('td'))\n const td3 = tr.appendChild(dom.createElement('td'))\n\n // const image = td1.appendChild(dom.createElement('img'))\n const image = options.image || faviconOrDefault(dom, obj)\n\n td1.setAttribute('style', 'vertical-align: middle; width:2.5em; padding:0.5em; height: 2.5em;')\n td2.setAttribute('style', 'vertical-align: middle; text-align:left;')\n td3.setAttribute('style', 'vertical-align: middle; width:2em; padding:0.5em; height: 4em;')\n td1.appendChild(image)\n\n const nameLine = td2.appendChild(dom.createElement('div'))\n const nameText = nameLine.appendChild(dom.createElement('span'))\n if (options.title) {\n nameText.textContent = options.title\n } else {\n setName(nameText, obj) // This is async\n }\n\n if (typeof options.renderNameSuffix === 'function') {\n const inlineInfo = options.renderNameSuffix(obj, dom)\n if (inlineInfo) {\n const nameSuffix = nameLine.appendChild(dom.createElement('span'))\n nameSuffix.setAttribute('style', 'margin-left: 0.4em; opacity: 0.8;')\n if (typeof inlineInfo === 'string') {\n nameSuffix.textContent = inlineInfo\n } else {\n nameSuffix.appendChild(inlineInfo)\n }\n }\n }\n\n if (typeof options.renderSupportingInfo === 'function') {\n const supportingInfo = options.renderSupportingInfo(obj, dom)\n if (supportingInfo) {\n const supportingLine = td2.appendChild(dom.createElement('div'))\n supportingLine.setAttribute('style', 'font-size: 90%; opacity: 0.8;')\n if (typeof supportingInfo === 'string') {\n supportingLine.textContent = supportingInfo\n } else {\n supportingLine.appendChild(supportingInfo)\n }\n }\n }\n\n if (options.deleteFunction) {\n deleteButtonWithCheck(dom, td3, options.noun || 'one', options.deleteFunction, options.confirmationContainer)\n }\n if (obj.uri) {\n // blank nodes need not apply\n if (options.link !== false) {\n const anchor = td3.appendChild(linkIcon(dom, obj))\n anchor.classList.add('HoverControlHide')\n td3.appendChild(dom.createElement('br'))\n }\n if (options.draggable !== false) {\n // default is on\n image.setAttribute('draggable', 'false') // Stop the image being dragged instead - just the TR\n makeDraggable(tr, obj)\n }\n }\n ;(tr as any).subject = obj\n return tr\n}\n\n/* A helper function for renderAsDiv\n* creates the NameDiv for the person\n* Note: could not move it to the helper file because they call exported functions\n* from buttons\n* @internal exporting this only for unit tests\n*/\nexport function createNameDiv (dom: HTMLDocument, div: HTMLDivElement, title: string | undefined, obj: NamedNode) {\n const nameDiv = div.appendChild(dom.createElement('div'))\n if (title) {\n nameDiv.textContent = title\n } else {\n setName(nameDiv, obj) // This is async\n }\n}\n/* A helper function for renderAsDiv\n* creates the linkDiv for the person\n* Note: could not move it to the helper file because they call exported functions\n* from buttons\n* @internal exporting this only for unit tests\n*/\nexport function createLinkDiv (dom: HTMLDocument, div: HTMLDivElement, obj: NamedNode, options: RenderAsDivOptions) {\n const linkDiv = div.appendChild(dom.createElement('div'))\n linkDiv.setAttribute('style', style.linkDivStyle)\n\n if (options.deleteFunction) {\n deleteButtonWithCheck(dom, linkDiv, options.noun || 'one', options.deleteFunction, options.confirmationContainer)\n }\n\n if (obj.uri) {\n // blank nodes need not apply\n if (options.link !== false) {\n createLinkForURI(dom, linkDiv, obj)\n }\n\n makeDraggable(div, obj)\n }\n}\n/**\n * A Div to represent a draggable person, etc in a list\n * configurable to add an onClick listener\n */\nexport function renderAsDiv (dom: HTMLDocument, obj: NamedNode, options: RenderAsDivOptions): HTMLElement {\n const div = dom.createElement('div')\n div.setAttribute('style', style.renderAsDivStyle)\n\n options = options || {}\n const image = options.image || faviconOrDefault(dom, obj)\n createImageDiv(dom, div, image)\n createNameDiv(dom, div, options.title, obj)\n createLinkDiv(dom, div, obj, options)\n\n if (options.clickable && options.onClickFunction) {\n addClickListenerToElement(div, options.onClickFunction)\n }\n\n // to be compatible with the SolidOS table layout\n if (options.wrapInATR) {\n const tr = wrapDivInATR(dom, div, obj)\n return tr\n }\n return div\n}\n\n/**\n * Refresh a DOM tree recursively\n */\nexport function refreshTree (root: any): void {\n if (root.refresh) {\n root.refresh()\n return\n }\n for (let i = 0; i < root.children.length; i++) {\n refreshTree(root.children[i])\n }\n}\n\n/**\n * Options argument for [[attachmentList]] function\n */\n/* The following options renderSupportingInfo and renderNameSuffix\n were generated by AI Model: GPT-5.3-Codex */\n/* Prompt: Add two options one renderSupportingInfo to allow the caller to add some additional information\n to be displayed below the name. Also add renderNameSuffix to allow the caller to add pronouns or other suffixes to the name. */\nexport type attachmentListOptions = {\n doc?: NamedNode\n modify?: boolean\n promptIcon?: string\n predicate?: NamedNode\n uploadFolder?: NamedNode\n noun?: string\n /** Render delete confirmations here in normal flow, restoring focus to the list when closed. */\n confirmationContainer?: HTMLElement\n renderSupportingInfo?: RenderSupportingInfo\n renderNameSuffix?: RenderNameSuffix\n refreshOnDocumentLoad?: boolean\n}\n\n/**\n * Component that displays a list of resources, for instance\n * the attachments of a message, or the various documents related\n * to a meeting.\n * Accepts dropping URLs onto it to add attachments to it.\n */\nexport function attachmentList (dom: HTMLDocument, subject: NamedNode, div: HTMLElement, options: attachmentListOptions = {}) {\n // options = options || {}\n const docsWaitingForRowRefresh = new Set<string>()\n const hasAsyncEnrichedRowOptions = !!(options.renderSupportingInfo || options.renderNameSuffix)\n // Keep the generic default on for simple consumers: if row decoration depends on\n // linked-profile data arriving later, attachmentList will rerender once that\n // target document finishes loading. Complex callers with their own streaming or\n // batched refresh pipeline can opt out to avoid duplicate whole-list refreshes.\n const refreshOnDocumentLoad = options.refreshOnDocumentLoad ?? true\n\n const deleteAttachment = function (target) {\n const updater = kb.updater\n if (!updater) {\n throw new Error('kb has no updater')\n }\n\n return new Promise<void>(resolve => updater.update(st(subject, predicate, target, doc) as any, [], function (\n uri,\n ok,\n errorBody,\n _xhr\n ) {\n if (ok) {\n refresh()\n } else {\n complain(undefined, 'Error deleting one: ' + errorBody)\n }\n resolve()\n }))\n }\n\n function createNewRow (target) {\n const theTarget = target\n const opt: any = { noun }\n opt.renderSupportingInfo = options.renderSupportingInfo\n opt.renderNameSuffix = options.renderNameSuffix\n opt.confirmationContainer = options.confirmationContainer\n\n if (hasAsyncEnrichedRowOptions && refreshOnDocumentLoad && target?.uri && kb.fetcher) {\n const targetDoc = target.doc()\n const requestState = targetDoc?.uri ? kb.fetcher.requested?.[targetDoc.uri] : undefined\n const shouldWaitForFetch = requestState !== 'done' && requestState !== 'failed'\n if (targetDoc?.uri && shouldWaitForFetch && !docsWaitingForRowRefresh.has(targetDoc.uri)) {\n docsWaitingForRowRefresh.add(targetDoc.uri)\n // The row renderer may need data from the target profile that is not loaded yet.\n // Register one follow-up refresh per target document so simple attachmentList\n // consumers eventually show the enriched row contents without building their own\n // async refresh orchestration.\n kb.fetcher.nowOrWhenFetched(targetDoc, undefined, () => {\n docsWaitingForRowRefresh.delete(targetDoc.uri)\n refresh()\n })\n }\n }\n\n if (modify) {\n opt.deleteFunction = function () {\n return deleteAttachment(theTarget)\n }\n }\n return personTR(dom, predicate, target, opt)\n }\n\n const refresh = function () {\n const things = kb.each(subject, predicate)\n things.sort()\n utils.syncTableToArray(\n attachmentTable,\n things,\n createNewRow,\n hasAsyncEnrichedRowOptions\n ? function (row, thing) {\n // When row content depends on async profile data, recreate matched rows on refresh.\n const replacement = createNewRow(thing)\n return replacement\n }\n : undefined\n )\n }\n\n function droppedURIHandler (uris) {\n const ins: any = []\n uris.forEach(function (u) {\n const target = sym(u) // Attachment needs text label to disinguish I think not icon.\n debug.log('Dropped on attachemnt ' + u) // icon was: iconBase + 'noun_25830.svg'\n ins.push(st(subject, predicate, target, doc))\n })\n if (!kb.updater) {\n throw new Error('kb has no updater')\n }\n\n kb.updater.update([], ins, function (uri, ok, errorBody, _xhr) {\n if (ok) {\n refresh()\n } else {\n complain(undefined, 'Error adding one: ' + errorBody)\n }\n })\n }\n\n function droppedFileHandler (files) {\n uploadFiles(\n kb.fetcher,\n files,\n options.uploadFolder?.uri, // Files\n options.uploadFolder?.uri, // Pictures\n function (theFile, destURI) {\n const ins = [st(subject, predicate, kb.sym(destURI), doc)]\n if (!kb.updater) {\n throw new Error('kb has no updater')\n }\n kb.updater.update([], ins, function (uri, ok, errorBody, _xhr) {\n if (ok) {\n refresh()\n } else {\n complain(undefined, 'Error adding link to uploaded file: ' + errorBody)\n }\n })\n }\n )\n }\n\n const doc = options.doc || subject.doc()\n if (options.modify === undefined) options.modify = true\n const modify = options.modify\n const promptIcon: string = options.promptIcon || (iconBase + 'noun_748003.svg' as string) // target\n // const promptIcon = options.promptIcon || (iconBase + 'noun_25830.svg') // paperclip\n const predicate = options.predicate || ns.wf('attachment')\n const noun = options.noun || 'attachment'\n\n const kb = store\n const attachmentOuter = div.appendChild(dom.createElement('table'))\n attachmentOuter.setAttribute('style', 'margin-top: 1em; margin-bottom: 1em;')\n const attachmentOne = attachmentOuter.appendChild(dom.createElement('tr'))\n const attachmentLeft = attachmentOne.appendChild(dom.createElement('td'))\n const attachmentRight = attachmentOne.appendChild(dom.createElement('td'))\n const attachmentTable = attachmentRight.appendChild(dom.createElement('table'))\n attachmentTable.appendChild(dom.createElement('tr')) // attachmentTableTop\n\n ;(attachmentOuter as any).refresh = refresh // Participate in downstream changes\n // ;(attachmentTable as any).refresh = refresh <- outer should be best?\n\n refresh()\n\n if (modify) {\n // const buttonStyle = 'width; 2em; height: 2em; margin: 0.5em; padding: 0.1em;'\n const paperclip = button(dom, promptIcon, 'Drop attachments here')\n // paperclip.style = buttonStyle // @@ needed? default has white background\n attachmentLeft.appendChild(paperclip)\n const fhandler = options.uploadFolder ? droppedFileHandler : null\n makeDropTarget(paperclip, droppedURIHandler, fhandler) // beware missing the wire of the paparclip!\n const paperclipImage = paperclip.querySelector('img')\n if (paperclipImage) {\n makeDropTarget(paperclipImage, droppedURIHandler, fhandler)\n }\n makeDropTarget(attachmentLeft, droppedURIHandler, fhandler) // just the outer won't do it\n\n if (options.uploadFolder) { // Addd an explicit file upload button as well\n const buttonDiv = fileUploadButtonDiv(dom, droppedFileHandler)\n attachmentLeft.appendChild(buttonDiv)\n // buttonDiv.children[1].style = buttonStyle\n }\n }\n return attachmentOuter\n}\n\n// /////////////////////////////////////////////////////////////////////////////\n\n/**\n * Event Handler for links within solid apps.\n *\n * Note that native links have constraints in Firefox, they\n * don't work with local files for instance (2011)\n */\nexport function openHrefInOutlineMode (e: Event) {\n e.preventDefault()\n e.stopPropagation()\n const target = utils.getTarget(e)\n const uri = target.getAttribute('href')\n if (!uri) return debug.log('openHrefInOutlineMode: No href found!\\n')\n const dom = window.document\n if ((dom as any).outlineManager) {\n // @@ TODO Remove the use of document as a global object\n // TODO fix dependency cycle to solid-panes by calling outlineManager\n ;(dom as any).outlineManager.GotoSubject(store.sym(uri), true, undefined, true, undefined)\n } else if (window && (window as any).panes && (window as any).panes.getOutliner) {\n // @@ TODO Remove the use of window as a global object\n ;(window as any).panes\n .getOutliner()\n .GotoSubject(store.sym(uri), true, undefined, true, undefined)\n } else {\n debug.log('ERROR: Can\\'t access outline manager in this config')\n }\n // dom.outlineManager.GotoSubject(store.sym(uri), true, undefined, true, undefined)\n}\n\n/**\n * Make a URI in the Tabulator.org annotation store out of the URI of the thing to be annotated.\n *\n * @@ Todo: make it a personal preference.\n */\nexport function defaultAnnotationStore (subject:NamedNode):NamedNode | undefined {\n if (subject.uri === undefined) return undefined\n let s = subject.uri\n if (s.slice(0, 7) !== 'http://') return undefined\n s = s.slice(7) // Remove\n const hash = s.indexOf('#')\n if (hash >= 0) s = s.slice(0, hash)\n // Strip trailing\n else {\n const slash = s.lastIndexOf('/')\n if (slash < 0) return undefined\n s = s.slice(0, slash)\n }\n return store.sym('http://tabulator.org/wiki/annnotation/' + s)\n}\n\n/**\n * Retrieve all RDF class URIs from solid-ui's RDF store\n * @returns an object `ret` such that `Object.keys(ret)` is\n * the list of all class URIs.\n */\nexport function allClassURIs (): { [uri: string]: boolean } {\n const set = {}\n store\n .statementsMatching(undefined, ns.rdf('type'), undefined)\n .forEach(function (st) {\n if (st.object.value) set[st.object.value] = true\n })\n store\n .statementsMatching(undefined, ns.rdfs('subClassOf'), undefined)\n .forEach(function (st) {\n if (st.object.value) set[st.object.value] = true\n if (st.subject.value) set[st.subject.value] = true\n })\n store\n .each(undefined, ns.rdf('type'), ns.rdfs('Class'))\n .forEach(function (c) {\n if (c.value) set[c.value] = true\n })\n return set\n}\n\n/**\n * Figuring which properties we know about\n *\n * When the user inputs an RDF property, like for a form field\n * or when specifying the relationship between two arbitrary things,\n * then er can prompt them with properties the session knows about\n *\n * TODO: Look again by catching this somewhere. (On the kb?)\n * TODO: move to diff module? Not really a button.\n * @param {Store} kb The quadstore to be searched.\n */\n\nexport function propertyTriage (kb: IndexedFormula): any {\n const possibleProperties: any = {}\n // if (possibleProperties === undefined) possibleProperties = {}\n // const kb = store\n const dp = {}\n const op = {}\n let no = 0\n let nd = 0\n let nu = 0\n const pi = (kb as any).predicateIndex // One entry for each pred\n for (const p in pi) {\n const object = pi[p][0].object\n if (object.termType === 'Literal') {\n dp[p] = true\n nd++\n } else {\n op[p] = true\n no++\n }\n } // If nothing discovered, then could be either:\n const ps = kb.each(undefined, ns.rdf('type'), ns.rdf('Property'))\n for (let i = 0; i < ps.length; i++) {\n const p = ps[i].toNT()\n if (!op[p] && !dp[p]) {\n dp[p] = true\n op[p] = true\n nu++\n }\n }\n possibleProperties.op = op\n possibleProperties.dp = dp\n info(`propertyTriage: ${no} non-lit, ${nd} literal. ${nu} unknown.`)\n return possibleProperties\n}\n\n/**\n * General purpose widgets\n */\n\n/**\n * A button for jumping\n */\nexport function linkButton (dom: HTMLDocument, object: NamedNode): HTMLElement {\n const b = dom.createElement('button')\n b.setAttribute('type', 'button')\n b.textContent = 'Goto ' + utils.label(object)\n b.addEventListener('click', function (_event) {\n // b.parentNode.removeChild(b)\n // TODO fix dependency cycle to solid-panes by calling outlineManager\n ;(dom as any).outlineManager.GotoSubject(object, true, undefined, true, undefined)\n }, true)\n return b\n}\n\n/**\n * A button to remove some other element from the page\n */\nexport function removeButton (dom: HTMLDocument, element: HTMLElement) {\n const b = dom.createElement('button')\n b.setAttribute('type', 'button')\n b.textContent = '✕' // MULTIPLICATION X\n b.addEventListener('click', function (_event) {\n ;(element as any).parentNode.removeChild(element)\n }, true)\n return b\n}\n\n// Description text area\n//\n// Make a box to demand a description or display existing one\n//\n// @param dom - the document DOM for the user interface\n// @param kb - the graph which is the knowledge base we are working with\n// @param subject - a term, the subject of the statement(s) being edited.\n// @param predicate - a term, the predicate of the statement(s) being edited\n// @param store - The web document being edited\n// @param callbackFunction - takes (boolean ok, string errorBody)\n\n// /////////////////////////////////////// Random I/O widgets /////////////\n\n// //// Column Header Buttons\n//\n// These are for selecting different modes, sources,styles, etc.\n//\n/*\nbuttons.headerButtons = function (dom, kb, name, words) {\n const box = dom.createElement('table')\n var i, word, s = '<tr>'\n box.setAttribute('style', 'width: 90%; height: 1.5em')\n for (i=0; i<words.length; i++) {\n s += '<td><input type=\"radio\" name=\"' + name + '\" id=\"' + words[i] + '\" value='\n }\n box.innerHTML = s + '</tr>'\n\n}\n*/\n// ////////////////////////////////////////////////////////////\n//\n// selectorPanel\n//\n// A vertical panel for selecting connections to left or right.\n//\n// @param inverse means this is the object rather than the subject\n//\nexport function selectorPanel (\n dom: HTMLDocument,\n kb: IndexedFormula,\n type: NamedNode,\n predicate: NamedNode,\n inverse: boolean,\n possible: NamedNode[],\n options: { connectIcon?: string },\n callbackFunction: (_x: NamedNode, _e: Event, _selected: boolean) => void,\n linkCallback: (_x: NamedNode, _e: Event, _inverse: boolean, _setStyleFunction: () => void) => void\n) {\n return selectorPanelRefresh(\n dom.createElement('div'),\n dom,\n kb,\n type,\n predicate,\n inverse,\n possible,\n options,\n callbackFunction,\n linkCallback\n )\n}\n\nexport function selectorPanelRefresh (\n list: HTMLElement,\n dom: HTMLDocument,\n kb: IndexedFormula,\n type: NamedNode,\n predicate: NamedNode,\n inverse: boolean,\n possible: NamedNode[],\n options: { connectIcon?: string },\n callbackFunction: (_x: NamedNode, _e: Event, _selected: boolean) => void,\n linkCallback: (_x: NamedNode, _e: Event, _inverse: boolean, _setStyleFunction: () => void) => void\n) {\n const style0 =\n 'border: 0.1em solid #ddd; border-bottom: none; width: 95%; height: 2em; padding: 0.5em;'\n let selected: any = null\n list.innerHTML = ''\n\n const refreshItem = function (box: HTMLElement, x: NamedNode) {\n // Scope to hold item and x\n let item: any\n // eslint-disable-next-line prefer-const\n let image: HTMLImageElement\n\n const setStyle = function () {\n const already = inverse\n ? kb.each(undefined, predicate, x)\n : kb.each(x, predicate)\n iconDiv.setAttribute('class', already.length === 0 ? 'hideTillHover' : '') // See tabbedtab.css\n image.setAttribute(\n 'src',\n options.connectIcon || iconBase + 'noun_25830.svg'\n )\n image.setAttribute('title', already.length ? already.length : 'attach' as any)\n }\n const f = index.twoLine.widgetForClass(type)\n // eslint-disable-next-line prefer-const\n item = f(dom, x)\n item.setAttribute('style', style0)\n\n const nav = dom.createElement('div')\n nav.setAttribute('class', 'hideTillHover') // See tabbedtab.css\n nav.setAttribute('style', 'float:right; width:10%')\n\n const a = dom.createElement('a')\n a.setAttribute('href', x.uri)\n a.setAttribute('style', 'float:right')\n nav.appendChild(a).textContent = '>'\n box.appendChild(nav)\n\n const iconDiv = dom.createElement('div')\n iconDiv.setAttribute(\n 'style',\n (inverse ? 'float:left;' : 'float:right;') + ' width:30px;'\n )\n image = dom.createElement('img')\n setStyle()\n iconDiv.appendChild(image)\n box.appendChild(iconDiv)\n\n item.addEventListener('click', function (event) {\n if (selected === item) {\n // deselect\n item.setAttribute('style', style0)\n selected = null\n } else {\n if (selected) selected.setAttribute('style', style0)\n item.setAttribute(\n 'style',\n style0 + 'background-color: #ccc; color:black;'\n )\n selected = item\n }\n callbackFunction(x, event, selected === item)\n setStyle()\n }, false)\n\n image.addEventListener('click', function (event) {\n linkCallback(x, event, inverse, setStyle)\n }, false)\n\n box.appendChild(item)\n return box\n }\n\n for (let i = 0; i < possible.length; i++) {\n const box = dom.createElement('div')\n list.appendChild(box)\n refreshItem(box, possible[i])\n }\n return list\n}\n\n// ###########################################################################\n//\n// Small compact views of things\n//\nexport let index: any = {}\n// ///////////////////////////////////////////////////////////////////////////\n// We need these for anything which is a subject of an attachment.\n//\n// These should be moved to type-dependeent UI code. Related panes maybe\n\nfunction twoLineDefault (dom: HTMLDocument, x: NamedNode): HTMLElement {\n // Default\n const box = dom.createElement('div')\n box.textContent = utils.label(x)\n return box\n}\n\n/**\n * Find a function that can create a widget for a given class\n * @param c The RDF class for which we want a widget generator function\n */\nfunction twoLineWidgetForClass (c: NamedNode): (_dom: HTMLDocument, _x: NamedNode) => HTMLElement {\n let widget = index.twoLine[c.uri]\n const kb = store\n if (widget) return widget\n const sup = kb.findSuperClassesNT(c)\n for (const cl in sup) {\n widget = index.twoLine[kb.fromNT(cl).uri]\n if (widget) return widget\n }\n return index.twoLine['']\n}\n\n/**\n * Display a transaction\n * @param x Should have attributes through triples in store:\n * * ns.qu('payee') -> a named node\n * * ns.qu('date) -> a literal\n * * ns.qu('amount') -> a literal\n */\nfunction twoLineTransaction (dom: HTMLDocument, x: NamedNode): HTMLElement {\n let failed = ''\n const enc = function (p) {\n const y = store.any(x, ns.qu(p))\n if (!y) failed += '@@ No value for ' + p + '! '\n return y ? utils.escapeForXML(y.value) : '?' // @@@@\n }\n const box = dom.createElement('table')\n box.innerHTML = `\n <tr>\n <td colspan=\"2\"> ${enc('payee')}</td>\n < /tr>\n < tr >\n <td>${enc('date').slice(0, 10)}</td>\n <td style = \"text-align: right;\">${enc('amount')}</td>\n </tr>`\n if (failed) {\n box.innerHTML = `\n <tr>\n <td><a href=\"${utils.escapeForXML(x.uri)}\">${utils.escapeForXML(failed)}</a></td>\n </tr>`\n }\n return box\n}\n\n/**\n * Display a trip\n * @param x Should have attributes through triples in store:\n * * ns.dc('title') -> a literal\n * * ns.cal('dtstart') -> a literal\n * * ns.cal('dtend') -> a literal\n */\nfunction twoLineTrip (\n dom: HTMLDocument,\n x: NamedNode\n): HTMLElement {\n const enc = function (p) {\n const y = store.any(x, p)\n return y ? utils.escapeForXML(y.value) : '?'\n }\n const box = dom.createElement('table')\n box.innerHTML = `\n <tr>\n <td colspan=\"2\">${enc(ns.dc('title'))}</td>\n </tr>\n <tr style=\"color: #777\">\n <td>${enc(ns.cal('dtstart'))}</td>\n <td>${enc(ns.cal('dtend'))}</td>\n </tr>`\n return box\n}\n\n/**\n * Stick a stylesheet link the document if not already there\n */\nexport function addStyleSheet (dom: HTMLDocument, href: string): void {\n const links = dom.querySelectorAll('link')\n for (let i = 0; i < links.length; i++) {\n if (\n (links[i].getAttribute('rel') || '') === 'stylesheet' &&\n (links[i].getAttribute('href') || '') === href\n ) {\n return\n }\n }\n const link = dom.createElement('link')\n link.setAttribute('rel', 'stylesheet')\n link.setAttribute('type', 'text/css')\n link.setAttribute('href', href)\n dom.getElementsByTagName('head')[0].appendChild(link)\n}\n\n// Figure (or guess) whether this is an image, etc\n//\nexport function isAudio (file?: NamedNode) {\n return isImage(file, 'audio')\n}\nexport function isVideo (file?: NamedNode) {\n return isImage(file, 'video')\n}\n/**\n *\n */\nexport function isImage (file?: NamedNode, kind?: string): boolean {\n const dcCLasses = {\n audio: 'http://purl.org/dc/dcmitype/Sound',\n image: 'http://purl.org/dc/dcmitype/Image',\n video: 'http://purl.org/dc/dcmitype/MovingImage'\n }\n const what = kind || 'image'\n // See https://github.com/linkeddata/rdflib.js/blob/e367d5088c/src/formula.ts#L554\n //\n const typeURIs = store.findTypeURIs(file as any)\n // See https://github.com/linkeddata/rdflib.js/blob/d5000f/src/utils-js.js#L14\n // e.g.'http://www.w3.org/ns/iana/media-types/audio'\n const prefix: string = Util.mediaTypeClass(what + '/*').uri.split('*')[0]\n for (const t in typeURIs) {\n if (t.startsWith(prefix)) return true\n }\n if (dcCLasses[what] in typeURIs) return true\n return false\n}\n\n/**\n * File upload button\n * @param dom The DOM aka document\n * @param droppedFileHandler Same handler function as drop, takes array of file objects\n * @returns {Element} - a div with a button and a inout in it\n * The input is hidden, as it is uglky - the user clicks on the nice icons and fires the input.\n */\n// See https://developer.mozilla.org/en-US/docs/Web/API/File/Using_files_from_web_applications\nexport function fileUploadButtonDiv (\n dom: HTMLDocument,\n droppedFileHandler: (_files: FileList) => void\n) {\n const div = dom.createElement('div')\n const input = div.appendChild(dom.createElement('input'))\n input.setAttribute('type', 'file')\n input.setAttribute('multiple', 'true')\n input.addEventListener(\n 'change',\n (event: any) => {\n debug.log('File drop event: ', event)\n if (event.files) {\n droppedFileHandler(event.files)\n } else if (event.target && event.target.files) {\n droppedFileHandler(event.target.files)\n } else {\n alert('Sorry no files .. internal error?')\n }\n },\n false\n )\n\n ;(input as any).style = 'display:none'\n const buttonElt = div.appendChild(\n button(\n dom,\n iconBase + 'noun_Upload_76574_000000.svg',\n 'Upload files',\n _event => {\n input.click()\n }\n )\n )\n makeDropTarget(buttonElt, null, droppedFileHandler) // Can also just drop on button\n return div\n}\n\nindex = {\n line: { // Approx 80em\n },\n twoLine: { // Approx 40em * 2.4em\n '': twoLineDefault,\n 'http://www.w3.org/2000/10/swap/pim/qif#Transaction': twoLineTransaction,\n 'http://www.w3.org/ns/pim/trip#Trip': twoLineTrip,\n widgetForClass: twoLineWidgetForClass\n }\n}\n","import ns from '../../lib/ns'\nimport { style } from '../../lib/style'\n\nexport type FieldParamsObject = {\n size?: number, // input element size attribute\n type?: string, // input element type attribute. Default: 'text' (not for Comment and Heading)\n element?: string, // element type to use (Comment and Heading only)\n style?: string, // style to use\n dt?: string, // xsd data type for the RDF Literal corresponding to the field value. Default: xsd:string\n uriPrefix?: string, // e.g. 'mailto:', will be removed when displaying value to user. Overrides dt.\n namedNode?: boolean, // if true, field value corresponds to the URI of an RDF NamedNode. Overrides dt and uriPrefix.\n pattern?: RegExp // for client-side input validation; field will go red if violated, green if ok\n}\n\n/**\n * The fieldParams object defines various constants\n * for use in various form fields. Depending on the\n * field in questions, different values may be read\n * from here.\n */\nexport const fieldParams: { [ fieldUri: string ]: FieldParamsObject } = {\n /**\n * Text field\n *\n * For possible date popups see e.g. http://www.dynamicdrive.com/dynamicindex7/jasoncalendar.htm\n * or use HTML5: http://www.w3.org/TR/2011/WD-html-markup-20110113/input.date.html\n */\n [ns.ui('ColorField').uri]: {\n size: 9,\n type: 'color',\n style: 'height: 3em;', // around 1.5em is padding\n dt: 'color',\n pattern: /^\\s*#[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]([0-9a-f][0-9a-f])?\\s*$/\n }, // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/color\n\n [ns.ui('DateField').uri]: {\n size: 20,\n type: 'date',\n dt: 'date',\n pattern: /^\\s*[0-9][0-9][0-9][0-9](-[0-1]?[0-9]-[0-3]?[0-9])?Z?\\s*$/\n },\n\n [ns.ui('DateTimeField').uri]: {\n size: 20,\n type: 'datetime-local', // See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime\n dt: 'dateTime',\n pattern: /^\\s*[0-9][0-9][0-9][0-9](-[0-1]?[0-9]-[0-3]?[0-9])?(T[0-2][0-9]:[0-5][0-9](:[0-5][0-9])?)?Z?\\s*$/\n },\n\n [ns.ui('TimeField').uri]: {\n size: 10,\n type: 'time',\n dt: 'time',\n pattern: /^\\s*([0-2]?[0-9]:[0-5][0-9](:[0-5][0-9])?)\\s*$/\n },\n\n [ns.ui('IntegerField').uri]: {\n size: 12,\n style: 'text-align: right;',\n dt: 'integer',\n pattern: /^\\s*-?[0-9]+\\s*$/\n },\n\n [ns.ui('DecimalField').uri]: {\n size: 12,\n style: 'text-align: right;',\n dt: 'decimal',\n pattern: /^\\s*-?[0-9]*(\\.[0-9]*)?\\s*$/\n },\n\n [ns.ui('FloatField').uri]: {\n size: 12,\n style: 'text-align: right;',\n dt: 'float',\n pattern: /^\\s*-?[0-9]*(\\.[0-9]*)?((e|E)-?[0-9]*)?\\s*$/\n },\n\n [ns.ui('SingleLineTextField').uri]: {\n\n },\n [ns.ui('NamedNodeURIField').uri]: {\n namedNode: true\n },\n [ns.ui('TextField').uri]: {\n\n },\n\n [ns.ui('PhoneField').uri]: {\n size: 20,\n uriPrefix: 'tel:',\n pattern: /^\\+?[\\d-]+[\\d]*$/\n },\n\n [ns.ui('EmailField').uri]: {\n size: 30,\n uriPrefix: 'mailto:',\n pattern: /^\\s*.*@.*\\..*\\s*$/ // @@ Get the right regexp here\n },\n\n [ns.ui('Group').uri]: {\n style: style.formGroupStyle\n },\n\n /**\n * Non-interactive fields\n */\n [ns.ui('Comment').uri]: {\n element: 'p',\n style: style.commentStyle\n },\n [ns.ui('Heading').uri]: {\n element: 'h3',\n style: style.formHeadingStyle\n }\n}\n","import { Node } from 'rdflib'\nimport { solidLogicSingleton } from 'solid-logic'\nimport { debug } from '../../lib/log'\nimport { errorMessageBlock } from '../error'\n\nconst store = solidLogicSingleton.store\n\nexport type FieldFunction = (\n dom: HTMLDocument, // the DOM\n container: HTMLElement | undefined, // if defined, the box will be appended to it\n already: { }, // used to avoid looping in nested forms\n subject: Node, // the thing for which data will be loaded into the form element\n form: Node, // the RDF declaration for what the form should have\n doc: Node, // the online RDF document for data binding (form input values will be read/saved automatically)\n callbackFunction: (ok: boolean, errorMessage: string) => void // this will be called when data changes (TODO: check this with unit tests)\n) => HTMLElement\n\nexport const field: { [classUri: string]: FieldFunction } = {} // Form field functions by URI of field type.\n\n/**\n * Which class of field is this? Relies on http://www.w3.org/2000/01/rdf-schema#subClassOf and\n * https://linkeddata.github.io/rdflib.js/doc/classes/formula.html#bottomtypeuris\n * to find the most specific RDF type if there are multiple.\n *\n * @param x a form field, e.g. `namedNode('https://timbl.com/timbl/Public/Test/Forms/individualForm.ttl#fullNameField')`\n * @returns the URI of the most specific known class, e.g. `http://www.w3.org/ns/ui#SingleLineTextField`\n */\nexport function mostSpecificClassURI (x: Node): string {\n const kb = store\n const ft = kb.findTypeURIs(x as any)\n const bot = kb.bottomTypeURIs(ft) // most specific\n const bots: any[] = []\n for (const b in bot) bots.push(b)\n // if (bots.length > 1) throw \"Didn't expect \"+x+\" to have multiple bottom types: \"+bots\n return bots[0]\n}\n\n/**\n * Returns a function that creates a form widget\n * @param dom unused\n * @param fieldInQuestion the field for which to create a form, e.g. namedNode('https://timbl.com/timbl/Public/Test/Forms/individualForm.ttl#fullNameField')\n */\nexport function fieldFunction (dom: any /* unused */, fieldInQuestion: Node): FieldFunction {\n const uri = mostSpecificClassURI(fieldInQuestion) // What type\n // const uri = field.uri\n const fun = field[uri]\n debug(\n 'paneUtils: Going to implement field ' + fieldInQuestion + ' of type ' + uri\n )\n if (!fun) {\n return function (dom2: HTMLDocument, container?: HTMLElement): HTMLElement {\n const box = errorMessageBlock(\n dom2,\n 'No handler for field ' + fieldInQuestion + ' of type ' + uri\n )\n if (container) container.appendChild(box)\n\n return box\n }\n }\n return fun\n}\n","import ns from '../../lib/ns'\nimport { Node } from 'rdflib'\nimport { store } from 'solid-logic'\nimport { fieldParams } from './fieldParams'\n\nimport { mostSpecificClassURI } from './fieldFunction'\n\nconst STYLE_URI_PREFIX = 'https://www.w3.org/ns/css#'\n\nexport function setFieldStyle (ele:HTMLElement, field:Node) {\n const classUri = mostSpecificClassURI(field)\n const params = fieldParams[classUri] || {}\n\n const style = store.any(field as any, ns.ui('style'))\n if (!style) {\n if (params.style) {\n ele.setAttribute('style', params.style)\n }\n return\n }\n if (style.termType === 'Literal') {\n if (style) ele.setAttribute('style', style.value)\n } else {\n const sts = store.statementsMatching(style as any, null, null, (field as any).doc())\n sts.forEach(st => {\n if (st.predicate.uri && st.predicate.uri.startsWith(STYLE_URI_PREFIX)) {\n const cssAttribute = st.predicate.uri.slice(STYLE_URI_PREFIX.length)\n try {\n ele.style[cssAttribute] = st.object.value\n } catch (_err) {\n console.warn(`setFieldStyle: Error setting element style ${cssAttribute} to \"${st.object.value}\"`)\n console.warn(`setFieldStyle: ... Element tagName was \"${ele.tagName || '???'}\"`)\n }\n }\n })\n }\n}\n","import { BlankNode, Literal, NamedNode, Node, st, Store, Variable } from 'rdflib'\nimport { solidLogicSingleton } from 'solid-logic'\nimport ns from '../../lib/ns'\nimport { style } from '../../lib/style'\nimport styleConstants from '../../lib/styleConstants'\nimport { label } from '../../utils'\nimport { errorMessageBlock } from '../error'\nimport { mostSpecificClassURI } from './fieldFunction'\nimport { fieldParams } from './fieldParams'\n\nconst store = solidLogicSingleton.store\n\n/* Style and create a name, value pair\n*/\nexport function renderNameValuePair (dom: HTMLDocument, kb: Store, box: HTMLElement, form: NamedNode, label?: string):HTMLElement {\n // const property = kb.any(form, ns.ui('property'))\n box.style.display = 'flex'\n box.style.flexDirection = 'row'\n const lhs = box.appendChild(dom.createElement('div'))\n lhs.style.width = styleConstants.formFieldNameBoxWidth\n const rhs = box.appendChild(dom.createElement('div'))\n\n lhs.setAttribute('class', 'formFieldName')\n lhs.setAttribute('style', style.formFieldNameBoxStyle)\n rhs.setAttribute('class', 'formFieldValue')\n if (label) {\n lhs.appendChild(dom.createTextNode(label))\n } else if (kb.any(form, ns.ui('property'))) { // Assume more space for error on right\n lhs.appendChild(fieldLabel(dom, kb.any(form, ns.ui('property')) as NamedNode, form))\n } else {\n rhs.appendChild(errorMessageBlock(dom, 'No property or label given for form field: ' + form))\n lhs.appendChild(dom.createTextNode('???'))\n }\n return rhs\n}\n\n/**\n * Create an anchor element with a label as the anchor text.\n *\n * @param dom The DOM\n * @param property href for the anchor element\n * @param fieldInQuestion field to produce a label for\n *\n * @internal exporting this only for unit tests\n */\nexport function fieldLabel (dom: HTMLDocument, property: NamedNode | undefined, fieldInQuestion: Node): HTMLElement | Text {\n let lab = store.any(fieldInQuestion as any, ns.ui('label'))\n if (!lab) lab = label(property, true) // Init capital\n if (property === undefined) {\n return dom.createTextNode('@@Internal error: undefined property')\n }\n const anchor = dom.createElement('a')\n /* istanbul ignore next */\n if (property.uri) anchor.setAttribute('href', property.uri)\n anchor.setAttribute('style', 'color: #3B5998; text-decoration: none;') // Not too blue and no underline\n anchor.textContent = lab as any\n return anchor\n}\n\n/**\n * Returns the document for the first quad that matches\n * the subject and predicate provided, or default if that\n * store is not editable.\n *\n * @param subject Subject about which we want to find an editable RDF document\n * @param predicate Predicate about which we want to find an editable RDF document\n * @param def default RDF document to return if none found\n *\n * @internal exporting this only for unit tests\n */\nexport function fieldStore (subject: NamedNode | BlankNode | Variable, predicate: NamedNode | Variable, def: NamedNode | undefined): NamedNode | undefined {\n const sts = store.statementsMatching(subject, predicate)\n if (sts.length === 0) return def // can used default as no data yet\n if (!store.updater) {\n throw new Error('Store has no updater')\n }\n if (\n sts.length > 0 &&\n sts[0].why.value &&\n store.updater.editable(sts[0].why.value, store)\n ) {\n return store.sym(sts[0].why.value)\n }\n return def\n}\n\n/**\n * Render a basic form field\n *\n * The same function is used for many similar one-value fields, with different\n * regexps used to validate.\n *\n * @param dom The HTML Document object aka Document Object Model\n * @param container If present, the created widget will be appended to this\n * @param already A hash table of (form, subject) kept to prevent recursive forms looping\n * @param subject The thing about which the form displays/edits data\n * @param form The form or field to be rendered\n * @param doc The web document in which the data is\n * @param callbackFunction Called when data is changed?\n *\n * @returns The HTML widget created\n */\n\nexport function basicField (\n dom: HTMLDocument,\n container: HTMLElement | undefined,\n already,\n subject: NamedNode | BlankNode | Variable,\n form: NamedNode,\n doc: NamedNode | undefined,\n callbackFunction: (_ok: boolean, _errorMessage: string) => void\n): HTMLElement {\n const kb = store\n const formDoc = form.doc ? form.doc() : null // @@ if blank no way to know\n\n const box = dom.createElement('div')\n\n const property = kb.any(form, ns.ui('property'))\n if (container) container.appendChild(box)\n if (!property) {\n return box.appendChild(\n errorMessageBlock(dom, 'Error: No property given for text field: ' + form)\n )\n }\n const rhs = renderNameValuePair(dom, kb, box, form)\n\n // It can be cleaner to just remove empty fields if you can't edit them anyway\n const suppressEmptyUneditable = kb.anyJS(form, ns.ui('suppressEmptyUneditable'), null, formDoc)\n\n const uri = mostSpecificClassURI(form)\n let params = fieldParams[uri]\n if (params === undefined) params = { style: '' } // non-bottom field types can do this\n const paramStyle = params.style || ''\n const inputStyle = style.textInputStyle + paramStyle\n const field = dom.createElement('input')\n ;(field as any).style = inputStyle\n rhs.appendChild(field)\n field.setAttribute('type', params.type ? params.type : 'text')\n const fieldType = (field.getAttribute('type') || '').toLowerCase()\n const deferWhileFocused = fieldType === 'date' || fieldType === 'datetime-local'\n\n const size = kb.anyJS(form, ns.ui('size')) || styleConstants.textInputSize || 20\n field.setAttribute('size', size)\n\n const maxLength = kb.any(form, ns.ui('maxLength'))\n field.setAttribute('maxLength', maxLength ? '' + maxLength : styleConstants.basicMaxLength)\n\n doc = doc || fieldStore(subject, property as any, doc)\n\n let obj = kb.any(subject, property as any, undefined, doc)\n if (!obj) {\n obj = kb.any(form, ns.ui('default'))\n }\n if (obj && obj.value && params.uriPrefix) {\n // eg tel: or mailto:\n field.value = decodeURIComponent(obj.value.replace(params.uriPrefix, '')) // should have no spaces but in case\n .replace(/ /g, '')\n } else if (obj) {\n /* istanbul ignore next */\n field.value = obj.value || obj.value || ''\n }\n field.setAttribute('style', inputStyle)\n if (!kb.updater) {\n throw new Error('kb has no updater')\n }\n if (!kb.updater.editable((doc as NamedNode).uri)) {\n field.readOnly = true // was: disabled. readOnly is better\n ;(field as any).style = style.textInputStyleUneditable + paramStyle\n if (suppressEmptyUneditable && field.value === '') {\n box.style.display = 'none' // clutter\n }\n return box\n }\n\n // read-write:\n field.addEventListener(\n 'keyup',\n function (_e) {\n if (params.pattern) {\n field.setAttribute(\n 'style',\n inputStyle +\n (field.value.match(params.pattern)\n ? 'color: green;'\n : 'color: red;')\n )\n }\n },\n true\n )\n field.addEventListener(\n 'change',\n function (_e) {\n if (deferWhileFocused && dom.activeElement === field) {\n if (field.dataset) {\n field.dataset.deferredChange = 'true'\n }\n return\n }\n // i.e. lose focus with changed data\n if (params.pattern && !field.value.match(params.pattern)) return\n const disabledForSave = !deferWhileFocused\n if (disabledForSave) {\n field.disabled = true // See if this stops getting two dates from fumbling, e.g., the chrome datepicker.\n }\n field.setAttribute('style', inputStyle + 'color: gray;') // pending\n const ds = kb.statementsMatching(subject, property as any) // remove any multiple values\n let result\n if (params.namedNode) {\n result = kb.sym(field.value)\n } else if (params.uriPrefix) {\n result = encodeURIComponent(field.value.replace(/ /g, ''))\n result = kb.sym(params.uriPrefix + field.value)\n } else {\n if (params.dt) {\n result = new Literal(\n field.value.trim(),\n undefined,\n ns.xsd(params.dt)\n )\n } else {\n result = new Literal(field.value)\n }\n }\n let is = ds.map(statement => st(statement.subject, statement.predicate, result, statement.why)) // can include >1 doc\n if (is.length === 0) {\n // or none\n is = [st(subject, property as any, result, doc)]\n }\n\n function updateMany (ds, is: { why: { uri: string } }[], callback) {\n const docs: any[] = []\n is.forEach(st => {\n if (!docs.includes(st.why.uri)) docs.push(st.why.uri)\n })\n ds.forEach(st => {\n /* istanbul ignore next */\n if (!docs.includes(st.why.uri)) docs.push(st.why.uri)\n })\n /* istanbul ignore next */\n if (docs.length === 0) {\n throw new Error('updateMany has no docs to patch')\n }\n if (!kb.updater) {\n throw new Error('kb has no updater')\n }\n if (docs.length === 1) {\n return kb.updater.update(ds, is as any, callback)\n }\n // return kb.updater.update(ds, is, callback)\n\n const doc = docs.pop()\n const is1 = is.filter(st => st.why.uri === doc)\n const is2 = is.filter(st => st.why.uri !== doc)\n const ds1 = ds.filter(st => st.why.uri === doc)\n const ds2 = ds.filter(st => st.why.uri !== doc)\n kb.updater.update(ds1, is1 as any, function (uri, ok, body) {\n if (ok) {\n updateMany(ds2, is2, callback)\n } else {\n callback(uri, ok, body)\n }\n })\n }\n\n updateMany(ds, is as any, function (uri, ok, body) {\n // kb.updater.update(ds, is, function (uri, ok, body) {\n if (ok) {\n if (disabledForSave) {\n field.disabled = false\n }\n field.setAttribute('style', inputStyle)\n } else {\n box.appendChild(errorMessageBlock(dom, body))\n }\n callbackFunction(ok, body)\n })\n },\n true\n )\n field.addEventListener(\n 'blur',\n function (_e) {\n if (\n deferWhileFocused &&\n field.dataset &&\n field.dataset.deferredChange === 'true'\n ) {\n delete field.dataset.deferredChange\n const event = new Event('change', { bubbles: true })\n field.dispatchEvent(event)\n }\n },\n true\n )\n return box\n}\n","/* Logic to access public data stores\n*\n* including filtering resut by natural language etc\n* See https://solidos.solidcommunity.net/public/2021/01%20Building%20Solid%20Apps%20which%20use%20Public%20Data.html\n*/\n\nimport * as debug from '../../../lib/debug'\n// import * as logic from '../index'\n// import { authn } from '../../../authn/index'\nimport { authn, store } from 'solid-logic'\nimport ns from '../../../lib/ns'\nimport { Collection, NamedNode, Node } from 'rdflib'\n// import { Binding } from '../widgets/forms/autocomplete/publicData'\n// import { nativeNameForLanguageCode, englishNameForLanguageCode } from './nativeNameForLanguageCode'\n\n// const { currentUser } = logic.authn\n\nexport interface Binding {\n subject: Node;\n name?: Node\n location?: Node\n coordinates?: Node\n}\n\nexport const languageCodeURIBase = 'https://www.w3.org/ns/iana/language-code/' /// @@ unsupported on the web (2021)\n\nexport const defaultPreferredLanguages = ['en', 'fr', 'de', 'it', 'ar']\n\nexport function addDefaults (array) {\n if (!array) array = []\n return array.concat(defaultPreferredLanguages.filter(code => !array.includes(code)))\n}\n\nexport async function getPreferredLanguagesFor (person: NamedNode) {\n const doc = person.doc()\n await store.fetcher?.load(doc)\n const list = store.any(person, ns.schema('knowsLanguage'), null, doc) as Collection | undefined\n if (!list) {\n // console.log(`User ${person} has not set their languages in their profile.`)\n return defaultPreferredLanguages\n }\n const languageCodeArray: string[] = []\n list.elements.forEach(item => {\n // console.log('@@ item ' + item)\n const lang = store.any(item as any, ns.solid('publicId'), null, doc)\n if (!lang) {\n console.warn('getPreferredLanguages: No publiID of language.')\n return\n }\n if (!lang.value.startsWith(languageCodeURIBase)) {\n console.error(`What should be a language code ${lang.value} does not start with ${languageCodeURIBase}`)\n return\n }\n const code = lang.value.slice(languageCodeURIBase.length)\n languageCodeArray.push(code)\n })\n\n if (languageCodeArray.length > 0) {\n console.log(` User knows languages with codes: \"${languageCodeArray.join(',')}\"`)\n return addDefaults(languageCodeArray)\n }\n return null\n}\n/* Get the preferred langauges for the user\n *\n * Either from solid preferences or browser preferences or default\n */\nexport async function getPreferredLanguages () {\n // In future: cache in the login session for speed, but get from profile and private prefs\n // We append the defaults so if someone's first choice is not available they don't get something very obscure\n // See https://github.com/solidos/solidos/issues/42\n const me = await authn.currentUser() as NamedNode\n if (me) { // If logged in\n const solidLanguagePrefs = await getPreferredLanguagesFor(me)\n if (solidLanguagePrefs) return solidLanguagePrefs\n }\n if (typeof navigator !== 'undefined') { // use browser settings\n if (navigator.languages) {\n return addDefaults(navigator.languages.map(longForm => longForm.split('-')[0]))\n }\n if (navigator.language) {\n return addDefaults([navigator.language.split('-')[0]])\n }\n }\n return defaultPreferredLanguages\n}\n\n/* From an array of bindings with a names for each row,\n * remove dupliacte names for the same thing, leaving the user's\n * preferred language version\n*/\n\nexport function filterByLanguage (bindings, languagePrefs) {\n const uris = {}\n bindings.forEach(binding => { // Organize names by their subject\n const uri = binding.subject.value\n uris[uri] = uris[uri] || []\n uris[uri].push(binding)\n })\n\n const languagePrefs2 = languagePrefs || defaultPreferredLanguages\n languagePrefs2.reverse() // Preferred last\n\n const slimmed = [] as Array<Binding>\n // console.log(` @@ {languagePrefs2 ${languagePrefs2}`)\n for (const u in uris) { // needs hasOwnProperty ?\n const bindings = uris[u]\n const sortMe = bindings.map(binding => {\n const lang = binding.name['xml:lang']\n const index = languagePrefs2.indexOf(lang)\n const pair = [index, binding]\n // console.log(` @@ lang: ${lang}, index: ${index}`)\n return pair\n })\n sortMe.sort() // best at th ebottom\n sortMe.reverse() // best at the top\n // console.debug('@@ sortMe:', sortMe)\n slimmed.push((sortMe[0][1] as any))\n } // map u\n debug.log(` Filter by language: ${bindings.length} -> ${slimmed.length}`)\n return slimmed\n}\n","/* Logic to access public data stores\n*\n* including filtering resut by natural language etc\n* See https://solidos.solidcommunity.net/public/2021/01%20Building%20Solid%20Apps%20which%20use%20Public%20Data.html\n*/\n\nimport { Literal, NamedNode, parse } from 'rdflib'\nimport { store } from 'solid-logic'\nimport * as debug from '../../../lib/debug'\nimport ns from '../../../lib/ns'\nimport { defaultPreferredLanguages, getPreferredLanguages } from './language'\n\nexport const AUTOCOMPLETE_LIMIT = 200 // How many to get from server\n// With 3000 we could exceed the wikidata timeout\n\nconst subjectRegexp = /\\$\\(subject\\)/g\n\ninterface Term {\n type: string;\n value: string\n}\n\nexport interface Binding {\n subject: Term;\n name?: Term\n location?: Term\n coordinates?: Term\n}\n\ntype Bindings = Binding[]\n\nexport type QueryParameters =\n{\n label: string;\n limit?: number;\n logo?: NamedNode;\n searchByNameQuery?: string;\n searchByNameURI?: string;\n insitituteDetailsQuery?: string;\n endpoint?: string;\n objectURIBase?: NamedNode;\n targetClass?: NamedNode,\n}\n\n// Schema.org seems to suggest NGOs are non-profit and Corporaions are for-profit\n// but doesn't have explicit classes\nexport const wikidataClasses = {\n Corporation: 'http://www.wikidata.org/entity/Q6881511', // Enterprise is for-profit\n EducationalOrganization: 'http://www.wikidata.org/entity/Q178706', // insitution\n GovernmentOrganization: 'http://www.wikidata.org/entity/Q327333', // government agency\n MedicalOrganization: 'http://www.wikidata.org/entity/Q4287745',\n MusicGroup: 'http://www.wikidata.org/entity/Q32178211', // music organization\n NGO: 'http://www.wikidata.org/entity/Q163740', // nonprofit organization @@\n Occupation: 'http://www.wikidata.org/entity/Q28640', // Profession\n // Organization: 'http://www.wikidata.org/entity/Q43229',\n Project: 'http://www.wikidata.org/entity/Q170584',\n ResearchOrganization: 'http://www.wikidata.org/entity/Q31855',\n SportsOrganization: 'http://www.wikidata.org/entity/Q4438121'\n}\n\nexport const instituteDetailsWikidataQuery = `prefix vcard: <http://www.w3.org/2006/vcard/ns#>\nCONSTRUCT\n{ wd:Q49108 vcard:fn ?itemLabel.\nwd:Q49108 rdf:type ?klass. ?klass rdfs:label ?klassLabel; rdfs:comment ?klassDescription .\nwd:Q49108 schema:logo ?logo;\n schema:image ?image;\n schema:logo ?sealImage;\n schema:subOrganization ?subsidiary .\n ?subsidiary rdfs:label ?subsidiaryLabel .\n ?supersidiary schema:subOrganization wd:Q49108 .\n ?supersidiary rdfs:label ?supersidiaryLabel .\n wd:Q49108 schema:location ?location .\n ?location schema:elevation ?elevation .\n ?location wdt:P131 ?region . ?region rdfs:label ?regionLabel .\n ?location wdt:P625 ?coordinates .\n ?location schema:country ?country . ?country rdfs:label ?countryLabel .\n}\nWHERE\n{ optional {wd:Q49108 rdfs:label ?itemLabel} .\n optional {wd:Q49108 wdt:P154 ?logo .}\n optional {wd:Q49108 wdt:P31 ?klass .}\n optional {wd:Q49108 wdt:P158 ?sealImage .}\n optional {wd:Q49108 wdt:P18 ?image .}\n\n optional { wd:Q49108 wdt:P355 ?subsidiary . }\n optional { ?supersidiary wdt:P355 wd:Q49108. }\n\n optional { wd:Q49108 wdt:P276 ?location .\n\n optional { ?location schema:eleveation ?elevation }\n optional { ?location wdt:P131 ?region }\n optional { ?location wdt:P625 ?coordinates }\n optional { ?location wdt:P17 ?country }\n }\n SERVICE wikibase:label { bd:serviceParam wikibase:language \"fr,en,de,it\". }\n}`\n\nexport const fetcherOptionsJsonPublicData = {\n credentials: 'omit' as 'include' | 'omit' | undefined, // try to avoid CORS problems. Data is public so no auth\n headers: new Headers({ Accept: 'application/json' })\n}\n\nexport const escoParameters:QueryParameters = {\n label: 'ESCO',\n logo: store.sym('https://ec.europa.eu/esco/portal/static_resource2/images/logo/logo_en.gif'),\n searchByNameURI: 'https://ec.europa.eu/esco/api/search?language=$(language)&type=occupation&text=$(name)'\n // endpoint: undefined\n // returnFormat: 'ESCO',\n // targetClass: {}\n}\n\nexport const dbpediaParameters:QueryParameters = {\n label: 'DBPedia',\n logo: store.sym('https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/DBpediaLogo.svg/263px-DBpediaLogo.svg.png'),\n searchByNameQuery: `select distinct ?subject, ?name where {\n ?subject a $(targetClass); rdfs:label ?name\n FILTER regex(?name, \"$(name)\", \"i\")\n } LIMIT $(limit)`,\n endpoint: 'https://dbpedia.org/sparql/'\n}\n\nexport const dbPediaTypeMap = { AcademicInsitution: 'http://umbel.org/umbel/rc/EducationalOrganization' }\n\nexport const wikidataOutgoingClassMap = {\n AcademicInsitution: 'http://www.wikidata.org/entity/Q4671277',\n Enterprise: 'http://www.wikidata.org/entity/Q6881511',\n Business: 'http://www.wikidata.org/entity/Q4830453',\n NGO: 'http://www.wikidata.org/entity/Q79913',\n CharitableOrganization: 'http://www.wikidata.org/entity/Q708676',\n Insitute: 'http://www.wikidata.org/entity/Q1664720'\n}\n\nexport const wikidataParameters = {\n label: 'WikiData',\n limit: 3000, // Need a high one as very many items, and many languages\n logo: store.sym('https://www.wikimedia.org/static/images/project-logos/wikidatawiki.png'),\n endpoint: 'https://query.wikidata.org/sparql',\n searchByNameQuery: `SELECT ?subject ?name\n WHERE {\n ?klass wdt:P279* $(targetClass) .\n ?subject wdt:P31 ?klass .\n ?subject rdfs:label ?name.\n FILTER regex(?name, \"$(name)\", \"i\")\n } LIMIT $(limit) `, // was SERVICE wikibase:label { bd:serviceParam wikibase:language \"[AUTO_LANGUAGE],en\" }\n\n insitituteDetailsQuery: `CONSTRUCT\n{ wd:Q49108 schema:name ?itemLabel;\n schema:logo ?logo;\n schema:logo ?sealImage;\n schema:subOrganization ?subsidiary .\n ?subsidiary schema:name ?subsidiaryLabel .\n}\nWHERE\n{\n wd:Q49108 # rdfs:label ?itemLabel ;\n wdt:P154 ?logo;\n wdt:P158 ?sealImage ;\n wdt:P355 ?subsidiary .\n # ?subsidiary rdfs:label ?subsidiaryLabel .\n\n SERVICE wikibase:label { bd:serviceParam wikibase:language \"[AUTO_LANGUAGE], fr\". }\n}`\n}\n\nexport const wikidataIncomingClassMap = {\n 'http://www.wikidata.org/entity/Q15936437': ns.schema('CollegeOrUniversity'), // research university\n 'http://www.wikidata.org/entity/Q1664720': ns.schema('EducationalOrganization'), // insitute @@\n 'http://www.wikidata.org/entity/Q43229': ns.schema('Organization'), // research university\n 'http://www.wikidata.org/entity/Q3918': ns.schema('CollegeOrUniversity'), // university\n 'http://www.wikidata.org/entity/Q170584': ns.schema('Project'), // university\n 'http://www.wikidata.org/entity/Q327333': ns.schema('GovernmentOrganization'), // govt agency\n 'http://www.wikidata.org/entity/Q2221906': ns.schema('Place'), // geographic location\n 'http://www.wikidata.org/entity/Q167037': ns.schema('Corporation') // Corporation\n\n}\nexport const variableNameToPredicateMap = { // allow other mappings to be added in theory hence var\n // wikidata:\n targetClass: ns.rdf('type'),\n // logo: ns.schema('logo'),\n sealImage: ns.schema('logo'),\n // image: ns.schema('image'), defaults to shema\n shortName: ns.foaf('nick'),\n subsidiary: ns.schema('subOrganization'),\n // dbpedia - :\n city: ns.vcard('locality'),\n state: ns.vcard('region'),\n country: ns.vcard('country-name'),\n homepage: ns.foaf('homepage'),\n lat: ns.schema('latitude'),\n long: ns.schema('longitude')\n}\n\nexport function bindingToTerm (item) {\n const typ = item.type.toLowerCase()\n if (typ === 'uri' || typ === 'iri') {\n return store.sym(item.value)\n } else if (typ === 'literal') {\n if (item['xml:lang']) {\n return new Literal(item.value, item['xml:lang'])\n } else {\n return new Literal(item.value)\n }\n } else {\n throw new Error(`bindingToTerm: Unexpected type \"${item.type}\" in sparql binding}`)\n }\n}\n\nexport function loadFromBindings (kb, solidSubject:NamedNode, bindings, doc, predMap = variableNameToPredicateMap) {\n const results = {}\n debug.log(`loadFromBindings: subject: ${solidSubject}`)\n debug.log(` doc: ${doc}`)\n bindings.forEach(binding => {\n for (const key in binding) {\n const result = binding[key]\n const combined = JSON.stringify(result) // ( result.type, result.value )\n results[key] = results[key] || new Set()\n results[key].add(combined) // remove duplicates\n }\n })\n for (const key in results) {\n const values = results[key]\n debug.log(` results ${key} -> ${values}`)\n values.forEach(combined => {\n const result = JSON.parse(combined)\n const { type, value } = result\n let obj\n if (type === 'uri') {\n obj = kb.sym(value)\n } else if (type === 'literal') {\n obj = new Literal(value, result.language, result.datatype)\n } else {\n throw new Error(`loadFromBindings: unexpected type: ${type}`)\n }\n if (key === 'type') {\n if (wikidataIncomingClassMap[value]) {\n obj = wikidataIncomingClassMap[value]\n } else {\n debug.warn('Unmapped Wikidata Class: ' + value)\n }\n } else if (key === 'coordinates') {\n // const latlong = value // Like 'Point(-71.106111111 42.375)'\n debug.log(' @@@ hey a point: ' + value)\n // const regexp = /.*\\(([-0-9\\.-]*) ([-0-9\\.-]*)\\)/\n const regexp = /.*\\(([-0-9.-]*) ([-0-9.-]*)\\)/\n const match = regexp.exec(value)\n if (match) {\n const float = ns.xsd('float')\n const latitude = new Literal(match[1], null, float)\n const longitude = new Literal(match[2], null, float)\n kb.add(solidSubject, ns.schema('longitude'), longitude, doc)\n kb.add(solidSubject, ns.schema('latitude'), latitude, doc)\n } else {\n debug.log('Bad coordinates syntax: ' + value)\n }\n } else {\n const pred = predMap[key] || ns.schema(key) // fallback to just using schema.org\n kb.add(solidSubject, pred, obj, doc) // @@ deal with non-string and objects\n debug.log(` public data ${pred} ${obj}.`)\n }\n })\n }\n}\n\n/* ESCO sopecific\n*/\nexport function ESCOResultToBindings (json: Object): Bindings {\n const results = (json as any)._embedded.results // Array\n const bindings = results.map(result => {\n const name = result.title\n const uri = result.uri // like http://data.europa.eu/esco/occupation/57af9090-55b4-4911-b2d0-86db01c00b02\n return { name: { value: name, type: 'literal' }, subject: { type: 'IRI', value: uri } } // simulate SPARQL bindings\n })\n return bindings\n}\n\n/* Query all entities of given class and partially matching name\n*/\nexport async function queryESCODataByName (filter: string, theClass:NamedNode, queryTarget: QueryParameters): Promise<Bindings> {\n if (!queryTarget.searchByNameURI) throw new Error('Missing queryTarget.searchByNameURI on queryESCODataByName')\n const limit = queryTarget.limit || AUTOCOMPLETE_LIMIT\n const queryURI = queryTarget.searchByNameURI\n .replace('$(name)', filter)\n .replace('$(limit)', '' + limit)\n .replace('$(targetClass)', theClass.toNT())\n debug.log('Querying ESCO data - uri: ' + queryURI)\n\n const response = await store.fetcher?.webOperation('GET', queryURI, fetcherOptionsJsonPublicData)\n const text = response?.responseText || ''\n debug.log(' Query result text' + text.slice(0, 500) + '...')\n if (text.length === 0) throw new Error('Wot no text back from ESCO query ' + queryURI)\n const json = JSON.parse(text)\n // console.log('Whole JSON return object', json)\n debug.log(' ESCO Query result JSON' + JSON.stringify(json, null, 4).slice(0, 500) + '...')\n return ESCOResultToBindings(json)\n}\n\n/* Cope ithe syntax probelm in wikidata timeout responses\n*\n* Wikidata bug: https://phabricator.wikimedia.org/T283962\n* This will not be needed whn that WDQS bug fixed.\n* This is aptured in https://github.com/solidos/solid-ui/issues/403\n*/\nfunction fixWikidataJSON (str) {\n const syntaxProblem = str.indexOf('SPARQL-QUERY')\n if (syntaxProblem < 0) return str\n // console.log('@@ fixWikidataJSON FIXING')\n debug.warn(' ### Fixing JSON with wikidata error code injection ' + str.slice(syntaxProblem, syntaxProblem + 200))\n const goodness = str.lastIndexOf('}, {')\n return str.slice(0, goodness) + ' } ] } } ' // Close binding, array, bindings, results, root object\n}\n/* Query all entities of given class and partially matching name\n*/\nexport async function queryPublicDataByName (\n filter: string,\n theClass:NamedNode,\n languages: Array<string>,\n queryTarget: QueryParameters): Promise<Bindings> {\n function substituteStrings (template: string):string {\n const limit = queryTarget.limit || AUTOCOMPLETE_LIMIT\n const u1 = template.replace('$(name)', filter)\n .replace('$(limit)', '' + limit)\n .replace('$(language)', language)\n return u1.replace('$(targetClass)', theClass.toNT())\n }\n\n if (!theClass) {\n throw new Error('queryPublicDataByName: No class provided')\n }\n\n const languagePrefs = await getPreferredLanguages() || defaultPreferredLanguages\n const language = languagePrefs[0] || 'en'\n if (queryTarget.searchByNameQuery) {\n const sparql = substituteStrings(queryTarget.searchByNameQuery)\n debug.log('Querying public data - sparql: ' + sparql)\n return queryPublicDataSelect(sparql, queryTarget)\n } else if (queryTarget.searchByNameURI) { // not sparql - random API\n const queryURI = substituteStrings(queryTarget.searchByNameURI)\n let response\n try {\n response = await store.fetcher?.webOperation('GET', queryURI, fetcherOptionsJsonPublicData)\n } catch (err) {\n throw new Error(`Exception when trying to fetch ${queryURI} \\n ${err}`)\n }\n const text = response.responseText || '' // ts\n if (response.status !== 200) {\n throw new Error(`HTTP error status ${response.status} trying to fetch ${queryURI} `)\n }\n debug.log(' Query result text' + text.slice(0, 500) + '...')\n if (text.length === 0) throw new Error('queryPublicDataByName: No text back from public data query ' + queryURI)\n const text2 = fixWikidataJSON(text) // Kludge: strip of interrupting error message\n const json = JSON.parse(text2)\n debug.log(' API Query result JSON' + JSON.stringify(json, null, 4).slice(0, 500) + '...')\n if ((json as any)._embedded) {\n debug.log(' Looks like ESCO')\n const bindings = ESCOResultToBindings(json)\n return bindings\n } else {\n alert('Code me: unrecognized API return format')\n throw new Error(`*** Need to add code to parse unrecognized API JSON return\\n${JSON.stringify(json, null, 4)}`)\n }\n } else {\n throw new Error('Query source must have either rest API or SPARQL endpoint.')\n }\n}\n\n/* Query a database using SPARQL SELECT\n*/\nexport async function queryPublicDataSelect (sparql: string, queryTarget: QueryParameters): Promise<Bindings> {\n if (!queryTarget.endpoint) throw new Error('Missing queryTarget.endpoint required for queryPublicDataSelect')\n const myUrlWithParams = new URL(queryTarget.endpoint)\n myUrlWithParams.searchParams.append('query', sparql)\n const queryURI = myUrlWithParams.href\n debug.log(' queryPublicDataSelect uri: ' + queryURI)\n const headers = new Headers()\n headers.append('Accept', 'application/json')\n const options = {\n credentials: 'omit' as 'include' | 'omit' | undefined, // CORS - as we know it is public\n headers\n }\n\n const response = await store.fetcher?.webOperation('GET', queryURI, options)\n\n const text = response?.responseText || ''\n if (text.length === 0) throw new Error('No text back from query ' + queryURI)\n const text2 = fixWikidataJSON(text)\n const json = JSON.parse(text2)\n debug.log(' Query result JSON' + JSON.stringify(json, null, 4).slice(0, 100) + '...')\n const bindings = json.results.bindings\n return bindings\n}\n\n/* Load from a database using SPARQL CONSTRUCT\n*/\nexport async function queryPublicDataConstruct (sparql: string, pubicId: NamedNode, queryTarget: QueryParameters): Promise<void> {\n debug.log('queryPublicDataConstruct: sparql:', sparql)\n if (!queryTarget.endpoint) throw new Error('Missing queryTarget.endpoint required for queryPublicDataConstruct')\n const myUrlWithParams = new URL(queryTarget.endpoint)\n myUrlWithParams.searchParams.append('query', sparql)\n const queryURI = myUrlWithParams.href\n debug.log(' queryPublicDataConstruct uri: ' + queryURI)\n const headers = new Headers()\n headers.append('Accept', 'text/turtle')\n const options = {\n credentials: 'omit' as 'include' | 'omit' | undefined, // CORS // @tsc pain\n headers // ({ Accept: 'text/turtle' } as Headers)\n }\n const response = await store.fetcher?.webOperation('GET', queryURI, options)\n const text = response?.responseText || 'No response text?'\n const report = text.length > 500 ? text.slice(0, 200) + ' ... ' + text.slice(-200) : text\n debug.log(' queryPublicDataConstruct result text:' + report)\n if (text.length === 0) throw new Error('queryPublicDataConstruct: No text back from construct query:' + queryURI)\n parse(text, store, pubicId.uri, 'text/turtle')\n}\n\nexport async function loadPublicDataThing (kb, subject: NamedNode, publicDataID: NamedNode) {\n if (publicDataID.uri.startsWith('https://dbpedia.org/resource/')) {\n return getDbpediaDetails(kb, subject, publicDataID)\n } else if (publicDataID.uri.match(/^https?:\\/\\/www\\.wikidata\\.org\\/entity\\/.*/)) {\n // const QId = publicDataID.uri.split('/')[4]\n // const dataURI = `http://www.wikidata.org/wiki/Special:EntityData/${QId}.ttl`\n // In fact loading the data URI gives much too much irrelevant data, from wikidata, so we do a query.\n await getWikidataDetails(kb, subject, publicDataID)\n // await getWikidataLocation(kb, subject, publicDataID) -- should get that in the details query now\n } else {\n const iDToFetch = publicDataID.uri.startsWith('http:')\n ? kb.sym('https:' + publicDataID.uri.slice(5))\n : publicDataID\n const headers = new Headers()\n headers.append('Accept', 'text/turtle')\n return kb.fetcher.load(iDToFetch, {\n credentials: 'omit' as 'include' | 'omit' | undefined,\n headers\n })\n }\n}\n\nexport async function getWikidataDetails (kb, solidSubject:NamedNode, publicDataID:NamedNode) {\n const subjRegexp = /wd:Q49108/g\n const sparql = instituteDetailsWikidataQuery.replace(subjRegexp, publicDataID.toNT())\n await queryPublicDataConstruct(sparql, publicDataID, wikidataParameters)\n debug.log('getWikidataDetails: loaded.', publicDataID)\n}\n\nexport async function getWikidataDetailsOld (kb, solidSubject:NamedNode, publicDataID:NamedNode) {\n const sparql = `select distinct * where {\n optional { $(subject) wdt:P31 ?targetClass } # instance of\n optional { $(subject) wdt:P154 ?logo }\n optional { $(subject) wdt:P158 ?sealImage }\n# optional { $(subject) wdt:P159 ?headquartersLocation }\n\noptional { $(subject) wdt:P17 ?country }\noptional { $(subject) wdt:P18 ?image }\noptional { $(subject) wdt:P1813 ?shortName }\n\noptional { $(subject) wdt:P355 ?subsidiary }\n# SERVICE wikibase:label { bd:serviceParam wikibase:language \"fr,en,de,it\" }\n}`\n .replace(subjectRegexp, publicDataID.toNT())\n const bindings = await queryPublicDataSelect(sparql, wikidataParameters)\n loadFromBindings(kb, publicDataID, bindings, publicDataID.doc()) // arg2 was solidSubject\n}\n\nexport async function getWikidataLocation (kb, solidSubject:NamedNode, publicDataID:NamedNode) {\n const sparql = `select distinct * where {\n\n $(subject) wdt:P276 ?location .\n\n optional { ?location wdt:P2044 ?elevation }\n optional { ?location wdt:P131 ?region }\n optional { ?location wdt:P625 ?coordinates }\noptional { ?location wdt:P17 ?country }\n\n# SERVICE wikibase:label { bd:serviceParam wikibase:language \"fr,en,de,it\" }\n}`.replace(subjectRegexp, publicDataID.toNT())\n debug.log(' location query sparql:' + sparql)\n const bindings = await queryPublicDataSelect(sparql, wikidataParameters)\n debug.log(' location query bindings:', bindings)\n loadFromBindings(kb, publicDataID, bindings, publicDataID.doc()) // was solidSubject\n}\n\nexport async function getDbpediaDetails (kb, solidSubject:NamedNode, publicDataID:NamedNode) {\n// Note below the string form of the named node with <> works in SPARQL\n const sparql = `select distinct ?city, ?state, ?country, ?homepage, ?logo, ?lat, ?long, WHERE {\n OPTIONAL { <${publicDataID}> <http://dbpedia.org/ontology/city> ?city }\n OPTIONAL { ${publicDataID} <http://dbpedia.org/ontology/state> ?state }\n OPTIONAL { ${publicDataID} <http://dbpedia.org/ontology/country> ?country }\n OPTIONAL { ${publicDataID} foaf:homepage ?homepage }\n OPTIONAL { ${publicDataID} foaf:lat ?lat; foaf:long ?long }\n OPTIONAL { ${publicDataID} <http://dbpedia.org/ontology/country> ?country }\n }`\n const bindings = await queryPublicDataSelect(sparql, dbpediaParameters)\n loadFromBindings(kb, publicDataID, bindings, publicDataID.doc())\n debug.log('Finished getDbpediaDetails.')\n}\n","/* Autocomplete Picker: Create and edit data using public data\n**\n** As the data source is passed as a parameter, all kinds of APIa and query services can be used\n**\n*/\nimport * as debug from '../../../lib/debug'\nimport { style } from '../../../lib/style'\nimport styleConstants from '../../../lib/styleConstants'\nimport * as widgets from '../../../widgets'\nimport { store } from 'solid-logic'\nimport { NamedNode, Literal } from 'rdflib'\nimport { queryPublicDataByName, bindingToTerm, AUTOCOMPLETE_LIMIT, QueryParameters } from './publicData'\nimport { filterByLanguage, getPreferredLanguages, defaultPreferredLanguages } from './language'\n\nconst AUTOCOMPLETE_THRESHOLD = 4 // don't check until this many characters typed\nconst AUTOCOMPLETE_ROWS = 20 // 20?\nconst AUTOCOMPLETE_ROWS_STRETCH = 40\n\n/*\nAutocomplete happens in 6 phases:\n 1. The search string is too small to bother\n 2. The search string is big enough, and we have not loaded the array\n 3. The search string is big enough, and we have loaded array up to the limit\n Display them and wait for more user input\n 4. The search string is big enough, and we have loaded array NOT to the limit\n but including all matches. No more fetches.\n If user gets more precise, wait for them to select one - or reduce to a single\n 5. Single one selected. Optionally waiting for accept button to be pressed, OR can change string and go to 5 or 2\n 6. Locked with a value. Press 'edit' button to return to 5\n*/\n\nexport type AutocompleteDecoration = {\n acceptButton?: HTMLElement,\n cancelButton: HTMLElement, // Must have cancel button\n editButton?: HTMLElement,\n deleteButton?: HTMLElement\n}\nexport type AutocompleteOptions = {\n targetClass?: NamedNode,\n currentObject?: NamedNode,\n currentName?: Literal,\n queryParams: QueryParameters,\n size?: number,\n permanent?: boolean\n}\n\ninterface Callback1 {\n (_subject: NamedNode, _name: Literal): any;\n}\n\nexport function setVisible (element:HTMLElement, visible:boolean) {\n element.style.display = visible ? '' : 'none' // Do not use visibility, it holds the real estate\n}\n\n// The core of the autocomplete UI\nexport async function renderAutoComplete (dom: HTMLDocument,\n acOptions:AutocompleteOptions,\n decoration: AutocompleteDecoration,\n callback: Callback1) {\n function complain (message) {\n const errorRow = table.appendChild(dom.createElement('tr'))\n debug.log(message)\n const err = new Error(message)\n errorRow.appendChild(widgets.errorMessageBlock(dom, err, 'pink'))\n // errorMessageBlock will log the stack to the console\n style.setStyle(errorRow, 'autocompleteRowStyle')\n errorRow.style.padding = '1em'\n }\n\n function finish (object, name) {\n debug.log('Auto complete: finish! ' + object)\n if (object.termType === 'Literal' && acOptions.queryParams.objectURIBase) {\n object = store.sym(acOptions.queryParams.objectURIBase.value + object.value)\n }\n // remove(decoration.cancelButton)\n // remove(decoration.acceptButton)\n // remove(div)\n clearList()\n callback(object, name)\n }\n async function gotIt (object:NamedNode | Literal, name: Literal) {\n if (decoration.acceptButton) {\n (decoration.acceptButton as any).disbaled = false\n setVisible(decoration.acceptButton, true) // now wait for confirmation\n searchInput.value = name.value // complete it\n foundName = name\n foundObject = object\n debug.log('Auto complete: name: ' + name)\n debug.log('Auto complete: waiting for accept ' + object)\n clearList() // This may be an option - nice and clean but does not allow change of mind\n return\n }\n setVisible(decoration.cancelButton, true)\n finish(object, name)\n }\n\n async function acceptButtonHandler (_event) {\n if (foundName && searchInput.value === foundName.value) { // still\n finish(foundObject, foundName)\n }\n }\n\n async function cancelButtonHandler (_event) {\n debug.log('Auto complete: Canceled by user! ')\n if (acOptions.permanent) {\n initialize()\n } else {\n if (div.parentNode) {\n div.parentNode.removeChild(div)\n }\n }\n }\n\n function nameMatch (filter:string, candidate: string):boolean {\n const parts = filter.split(' ') // Each name part must be somewhere\n for (let j = 0; j < parts.length; j++) {\n const word = parts[j]\n if (candidate.toLowerCase().indexOf(word) < 0) return false\n }\n return true\n }\n\n function clearList () {\n while (table.children.length > 1) {\n table.removeChild(table.lastChild as Node)\n }\n }\n\n async function inputEventHHandler (_event) {\n // console.log('@@ AC inputEventHHandler called')\n setVisible(decoration.cancelButton, true) // only allow cancel when there is something to cancel\n refreshList() /// @@ debounqce does not work with jest\n /*\n if (runningTimeout) {\n clearTimeout(runningTimeout)\n }\n runningTimeout = setTimeout(refreshList, AUTOCOMPLETE_DEBOUNCE_MS)\n */\n }\n\n async function loadBindingsAndFilterByLanguage (filter, languagePrefs) {\n // console.log('@@ loadBindingsAndFilterByLanguage ' + filter)\n let bindings\n try {\n bindings = await queryPublicDataByName(filter, targetClass as any,\n languagePrefs || defaultPreferredLanguages, acOptions.queryParams)\n } catch (err) {\n complain('Error querying db of organizations: ' + err)\n inputEventHandlerLock = false\n return\n }\n loadedEnough = bindings.length < AUTOCOMPLETE_LIMIT\n if (loadedEnough) {\n lastFilter = filter\n } else {\n lastFilter = undefined\n }\n clearList()\n const slimmed = filterByLanguage(bindings, languagePrefs)\n return slimmed || []\n }\n\n function filterByName (filter, bindings) {\n return (bindings || []).filter(binding => nameMatch(filter, binding.name.value))\n }\n\n async function refreshList () {\n // console.log('@@ refreshList called')\n function rowForBinding (binding) {\n const row = dom.createElement('tr')\n style.setStyle(row, 'autocompleteRowStyle')\n row.setAttribute('style', 'padding: 0.3em;')\n row.style.color = allDisplayed ? '#080' : '#088' // green means 'you should find it here'\n row.textContent = binding.name.value\n const object = bindingToTerm(binding.subject)\n const nameTerm = bindingToTerm(binding.name)\n row.addEventListener('click', async _event => {\n debug.log(' click row textContent: ' + row.textContent)\n debug.log(' click name: ' + nameTerm.value)\n if (object && nameTerm) {\n gotIt(object, nameTerm as Literal)\n }\n })\n return row\n } // rowForBinding\n function compareBindingsByName (self, other) {\n return other.name.value > self.name.value\n ? 1\n : other.name.name < self.name.value ? -1 : 0\n }\n\n if (inputEventHandlerLock) {\n debug.log(`Ignoring \"${searchInput.value}\" because of lock `)\n return\n }\n debug.log(`Setting lock at \"${searchInput.value}\"`)\n\n inputEventHandlerLock = true\n const languagePrefs = await getPreferredLanguages()\n const filter = searchInput.value.trim().toLowerCase()\n if (filter.length < AUTOCOMPLETE_THRESHOLD) { // too small\n clearList()\n // candidatesLoaded = false\n numberOfRows = AUTOCOMPLETE_ROWS\n } else {\n if (!allDisplayed || !lastFilter || !filter.startsWith(lastFilter)) {\n debug.log(` Querying database at \"${filter}\" cf last \"${lastFilter}\".`)\n lastBindings = await loadBindingsAndFilterByLanguage(filter, languagePrefs) || [] // freesh query\n }\n // Trim table as search gets tighter:\n const slimmed = filterByName(filter, lastBindings)\n if (loadedEnough && slimmed.length <= AUTOCOMPLETE_ROWS_STRETCH) {\n numberOfRows = slimmed.length // stretch if it means we get all items\n }\n allDisplayed = loadedEnough && slimmed.length <= numberOfRows\n debug.log(` Filter:\"${filter}\" lastBindings: ${lastBindings.length}, slimmed to ${slimmed.length}; rows: ${numberOfRows}, Enough? ${loadedEnough}, All displayed? ${allDisplayed}`)\n\n const displayable = slimmed.slice(0, numberOfRows)\n\n displayable.sort(compareBindingsByName)\n clearList()\n for (const binding of displayable) {\n table.appendChild(rowForBinding(binding))\n }\n if (slimmed.length === 1) {\n gotIt(bindingToTerm(slimmed[0].subject), bindingToTerm(slimmed[0].name) as Literal)\n }\n } // else\n inputEventHandlerLock = false\n } // refreshList\n\n function initialize () {\n if (acOptions.currentObject) { // If have existing value then jump into the endgame of the autocomplete\n searchInput.value = acOptions.currentName ? acOptions.currentName.value : '??? wot no name for ' + acOptions.currentObject\n foundName = acOptions.currentName\n lastFilter = acOptions.currentName ? acOptions.currentName.value : undefined\n foundObject = acOptions.currentObject\n } else {\n searchInput.value = ''\n lastFilter = undefined\n foundObject = undefined\n }\n if (decoration.deleteButton) {\n setVisible(decoration.deleteButton, !!acOptions.currentObject)\n }\n\n if (decoration.acceptButton) {\n setVisible(decoration.acceptButton, false) // hide until input complete\n }\n if (decoration.editButton) {\n setVisible(decoration.editButton, true)\n }\n if (decoration.cancelButton) {\n setVisible(decoration.cancelButton, false) // only allow cancel when there is something to cancel\n }\n inputEventHandlerLock = false\n clearList()\n } // initialiize\n\n // const queryParams: QueryParameters = acOptions.queryParams\n const targetClass = acOptions.targetClass\n if (!targetClass) throw new Error('renderAutoComplete: missing targetClass')\n // console.log(`renderAutoComplete: targetClass=${targetClass}` )\n if (decoration.acceptButton) {\n decoration.acceptButton.addEventListener('click', acceptButtonHandler, false)\n }\n if (decoration.cancelButton) {\n decoration.cancelButton.addEventListener('click', cancelButtonHandler, false)\n }\n\n // var candidatesLoaded = false\n let lastBindings\n let loadedEnough = false\n let inputEventHandlerLock = false\n let allDisplayed = false\n let lastFilter = undefined as (string | undefined)\n let numberOfRows = AUTOCOMPLETE_ROWS // this gets slimmed down\n const div = dom.createElement('div')\n let foundName = undefined as (Literal | undefined)// once found accepted string must match this\n let foundObject = undefined as (NamedNode | Literal | undefined)\n const table = div.appendChild(dom.createElement('table'))\n table.setAttribute('data-testid', 'autocomplete-table')\n table.setAttribute('style', 'max-width: 30em; margin: 0.5em;')\n const head = table.appendChild(dom.createElement('tr'))\n style.setStyle(head, 'autocompleteRowStyle') // textInputStyle or\n const cell = head.appendChild(dom.createElement('td'))\n const searchInput = cell.appendChild(dom.createElement('input'))\n searchInput.setAttribute('type', 'text')\n\n initialize()\n\n const size = acOptions.size || styleConstants.textInputSize || 20\n searchInput.setAttribute('size', size)\n searchInput.setAttribute('data-testid', 'autocomplete-input')\n\n const searchInputStyle = style.textInputStyle || // searchInputStyle ?\n 'border: 0.1em solid #444; border-radius: 0.5em; width: 100%; font-size: 100%; padding: 0.1em 0.6em' // @\n searchInput.setAttribute('style', searchInputStyle)\n searchInput.addEventListener('keyup', function (event) {\n if (event.keyCode === 13) {\n acceptButtonHandler(event)\n }\n }, false)\n\n searchInput.addEventListener('input', inputEventHHandler)\n // console.log('@@ renderAutoComplete returns ' + div.innerHTML)\n return div\n} // renderAutoComplete\n\n// ENDS\n","/* The Autocomplete Control with decorations\n\nThis control has the buttons which control the state between editing, viewing, searching, accepting\nand so on. See the state diagram in the documentation. The AUtocomplete Picker does the main work.\n\n*/\nimport ns from '../../../lib/ns'\nimport { icons } from '../../../lib/iconBase'\nimport { store } from 'solid-logic'\nimport * as widgets from '../../../widgets'\nimport * as utils from '../../../utils'\n\nimport { renderAutoComplete, AutocompleteDecoration, setVisible } from './autocompletePicker' // dbpediaParameters\n\nimport { NamedNode } from 'rdflib'\n\nconst WEBID_NOUN = 'Solid ID'\n\nconst GREEN_PLUS = icons.iconBase + 'noun_34653_green.svg'\nconst SEARCH_ICON = icons.iconBase + 'noun_Search_875351.svg'\nconst EDIT_ICON = icons.iconBase + 'noun_253504.svg'\n// const DELETE_ICON = icons.iconBase + 'noun_2188_red.svg'\n\nexport async function renderAutocompleteControl (dom:HTMLDocument,\n person:NamedNode,\n barOptions,\n acOptions,\n addOneIdAndRefresh,\n deleteOne): Promise<HTMLElement> {\n async function autoCompleteDone (object, name) {\n if (acOptions.permanent) { // remember to set this in publicid panel\n setVisible(editButton, true)\n setVisible(acceptButton, false)\n setVisible(cancelButton, false)\n } else {\n // console.log('temporary - removed decoratiion')\n removeDecorated()\n }\n return addOneIdAndRefresh(object, name)\n }\n\n async function greenButtonHandler (_event) {\n const webid = await widgets.askName(dom, store, creationArea, ns.vcard('url'), undefined, WEBID_NOUN)\n if (!webid) {\n return // cancelled by user\n }\n return addOneIdAndRefresh(person, webid)\n }\n\n function removeDecorated () {\n if (decoratedAutocomplete) {\n creationArea.removeChild(decoratedAutocomplete)\n decoratedAutocomplete = undefined\n }\n }\n\n async function displayAutocomplete () {\n decoratedAutocomplete = dom.createElement('div') as HTMLElement\n decoratedAutocomplete.setAttribute('style', 'display: flex; flex-flow: wrap;')\n decoratedAutocomplete.appendChild(await renderAutoComplete(dom, acOptions, decoration, autoCompleteDone))\n // console.log('@@ acceptButton', acceptButton)\n decoratedAutocomplete.appendChild(acceptButton)\n // console.log('@@ cancelButton', cancelButton)\n\n decoratedAutocomplete.appendChild(cancelButton)\n // console.log('@@ editButton', editButton)\n\n decoratedAutocomplete.appendChild(editButton)\n // console.log('@@ deleteButtonContainer', deleteButtonContainer)\n\n decoratedAutocomplete.appendChild(deleteButtonContainer)\n creationArea.appendChild(decoratedAutocomplete)\n }\n\n async function searchButtonHandler (_event) {\n if (decoratedAutocomplete) {\n creationArea.removeChild(decoratedAutocomplete)\n decoratedAutocomplete = undefined\n } else {\n await displayAutocomplete()\n }\n }\n\n async function droppedURIHandler (uris) {\n for (const webid of uris) { // normally one but can be more than one\n await addOneIdAndRefresh(person, webid)\n }\n }\n\n const acceptButton = widgets.continueButton(dom)\n acceptButton.setAttribute('data-testid', 'accept-button')\n\n const cancelButton = widgets.cancelButton(dom)\n cancelButton.setAttribute('data-testid', 'cancel-button')\n const deleteButtonContainer = dom.createElement('div')\n const noun = acOptions.targetClass ? utils.label(acOptions.targetClass) : 'item'\n const deleteButton = widgets.deleteButtonWithCheck(dom, deleteButtonContainer, noun, deleteOne) // need to knock out this UI or caller does that\n deleteButton.setAttribute('data-testid', 'delete-button')\n const editButton = widgets.button(dom, EDIT_ICON, 'Edit', _event => {\n editing = !editing\n syncEditingStatus()\n })\n editButton.setAttribute('data-testid', 'edit-button')\n let editing = true\n\n function syncEditingStatus () {\n if (editing) {\n setVisible(editButton, false)\n setVisible(acceptButton, false) // not till got it\n setVisible(cancelButton, false)\n } else {\n setVisible(editButton, true)\n setVisible(acceptButton, false)\n setVisible(cancelButton, false)\n }\n }\n\n const decoration:AutocompleteDecoration = {\n acceptButton, cancelButton, editButton, deleteButton\n }\n\n let decoratedAutocomplete = undefined as HTMLElement | undefined\n\n const creationArea = dom.createElement('div')\n creationArea.style.display = 'flex'\n creationArea.style.flexDirection = 'row'\n\n if (acOptions.permanent || acOptions.currentObject) {\n await displayAutocomplete()\n }\n if (barOptions.editable) {\n // creationArea.appendChild(await renderAutoComplete(dom, barOptions, autoCompleteDone)) wait for searchButton\n creationArea.style.width = '100%'\n if (barOptions.manualURIEntry) {\n const plus = creationArea.appendChild(widgets.button(dom, GREEN_PLUS, barOptions.idNoun, greenButtonHandler))\n widgets.makeDropTarget(plus, droppedURIHandler, undefined)\n }\n if (barOptions.dbLookup && !acOptions.currentObject && !acOptions.permanent) {\n creationArea.appendChild(widgets.button(dom, SEARCH_ICON, barOptions.idNoun, searchButtonHandler))\n }\n }\n syncEditingStatus()\n return creationArea\n} // renderAutocompleteControl\n\n// ends\n","/* Form field for doing autocompleete\n */\nimport ns from '../../../lib/ns'\nimport { store } from 'solid-logic'\nimport * as widgets from '../../../widgets'\nimport { style } from '../../../lib/style'\nimport { renderAutocompleteControl } from './autocompleteBar'\nimport { QueryParameters } from './publicData'\nimport { NamedNode, BlankNode, Literal, Variable, st } from 'rdflib'\nimport { AutocompleteOptions } from './autocompletePicker'\n/**\n * Render a autocomplete form field\n *\n * The autocomplete form searches for an object in a definitive public database,\n * and allows the user to search for it by name, displaying a list of objects whose names match\n * the input to date, and letting the user either click on one of the list,\n * or just go on untill there is only one. The process then returns two values,\n * the URiI of the object and its name.\n *\n * @param dom The HTML Document object aka Document Object Model\n * @param container If present, the created widget will be appended to this\n * @param already A hash table of (form, subject) kept to prevent recursive forms looping\n * @param subject The thing about which the form displays/edits data\n * @param form The form or field to be rendered\n * @param doc The web document in which the data is\n * @param callbackFunction Called when data is changed so other parts can be refreshed.\n *\n * Form properties:\n * @param ui:property The property to store the object itself\n * @param ui:labelProperty The property used to store the name of the object\n * @param ui:category The class of objects to be searched, if fixed (else dep on class of subject)\n *\n * @returns The HTML widget created\n */\n\nexport function autocompleteField (\n dom: HTMLDocument,\n container: HTMLElement | undefined,\n already,\n subject: NamedNode | BlankNode | Variable,\n form: NamedNode,\n doc: NamedNode | undefined,\n callbackFunction: (_ok: boolean, _errorMessage: string) => void\n): HTMLElement {\n async function addOneIdAndRefresh (result:NamedNode | Literal, name: Literal) {\n if (!name) {\n throw new Error('autocompleteField: No name set.')\n }\n const oldValue = kb.the(subject, property as any, null, doc)\n if (oldValue) {\n const oldName = kb.any(oldValue as any, labelProperty as any, null, doc)\n if (oldValue.equals(result) && oldName && oldName.sameTerm(name)) {\n // console.log('No change: same values.')\n return\n }\n }\n const deletables = oldValue\n ? kb.statementsMatching(subject, property as any, oldValue, doc)\n .concat(kb.statementsMatching(oldValue as any, labelProperty as any, null, doc))\n : []\n // console.log('autocompleteField Deletables ' + deletables.map(st => st.toNT()))\n const insertables = [st(subject, property as any, result, doc),\n st(result as any, labelProperty as any, name, doc)] // @@ track the language of the name too!\n // console.log(`AC form: ${deletables.length} to delete and ${insertables.length} to insert`)\n try {\n // console.log('@@@ AC updating ', deletables, insertables)\n await kb.updater?.updateMany(deletables, insertables)\n } catch (err) {\n callbackFunction(false, err)\n box.appendChild(widgets.errorMessageBlock(dom, 'Autocomplete form data update error:' + err, null, err))\n return\n }\n callbackFunction(true, '')\n }\n\n async function deleteOne (_result:NamedNode | Literal, _name: Literal) {\n const oldValue = kb.the(subject, property as any, null, doc)\n if (!oldValue) {\n callbackFunction(false, 'NO data to elete')\n box.appendChild(widgets.errorMessageBlock(dom, 'Autocomplete delete: no old data!'))\n return\n }\n // const oldName = kb.any(oldValue as any, labelProperty as any, null, doc)\n const deletables = kb.statementsMatching(subject, property as any, oldValue, doc)\n .concat(kb.statementsMatching(oldValue as any, labelProperty as any, null, doc))\n // console.log('autocompleteField Deletables ' + deletables.map(st => st.toNT()))\n const insertables = []\n // console.log(`AC form delete: ${deletables.length} to delete and ${insertables.length} to insert`)\n try {\n // console.log('@@@ AC updating ', deletables, insertables)\n await kb.updater?.updateMany(deletables, insertables)\n } catch (err) {\n const e2 = new Error('Autocomplete form data delete error:' + err)\n callbackFunction(false, err)\n box.appendChild(widgets.errorMessageBlock(dom, e2, null, err))\n return\n }\n callbackFunction(true, '') // changed\n }\n\n if (subject.termType !== 'NamedNode') {\n throw new Error('Sorry this field only works on NamedNode subjects (for editable)')\n }\n const kb = store\n const formDoc = form.doc ? form.doc() : null // @@ if blank no way to know\n\n const box = dom.createElement('div')\n if (container) container.appendChild(box)\n const lhs = dom.createElement('div')\n lhs.setAttribute('class', 'formFieldName')\n lhs.setAttribute('style', style.formFieldNameBoxStyle)\n box.appendChild(lhs)\n const rhs = dom.createElement('div')\n rhs.setAttribute('class', 'formFieldValue')\n box.appendChild(rhs)\n\n const property = kb.any(form, ns.ui('property'))\n if (!property) {\n return box.appendChild(\n widgets.errorMessageBlock(dom, 'Error: No property given for autocomplete field: ' + form)\n )\n }\n const labelProperty = kb.any(form, ns.ui('labelProperty')) || ns.schema('name')\n\n // Parse the data source into query options\n\n const dataSource = kb.any(form, ns.ui('dataSource')) as NamedNode | undefined\n if (!dataSource) {\n // console.log('@@ connectedStatements ACF ', kb.connectedStatements(form).map(x => x.toNT()).join('\\n'))\n return box.appendChild(\n widgets.errorMessageBlock(dom, 'Error: No data source given for autocomplete field: ' + form)\n )\n }\n const queryParams:QueryParameters = {\n // targetClass: kb.any(dataSource, ns.ui('targetClass'), null, dataSource.doc()) as NamedNode | undefined,\n label: kb.anyJS(dataSource, ns.schema('name'), null, dataSource.doc()),\n logo: (kb.any(dataSource, ns.schema('logo'), null, dataSource.doc())) as NamedNode | undefined\n }\n\n // @@ Should we pass the target class in from the data source definition or use a current type of the subject\n const targetClass = (kb.any(form, ns.ui('targetClass'), null, form.doc()) || // class in form takes pecedence\n kb.any(dataSource, ns.ui('targetClass'), null, dataSource.doc())) as NamedNode | undefined\n if (targetClass) {\n queryParams.targetClass = targetClass\n }\n\n queryParams.objectURIBase = (kb.any(dataSource, ns.ui('objectURIBase'), null, dataSource.doc()) || undefined) as NamedNode | undefined\n\n /*\n if (!queryParams.targetClass) {\n const klass = kb.any(subject, ns.rdf('type')) as NamedNode | undefined\n // @@ be more selective of which class if many\n // @@ todo: Take ALL classes, and compare them with those the data source knows about\n // with translation where necessary. Find most specific of the classes for the search.\n if (!klass) throw new Error('Autocomplete: No class specified or is current type of' + subject)\n queryParams.targetClass = klass\n }\n */\n const endpoint = kb.anyJS(dataSource, ns.ui('endpoint'), null, dataSource.doc()) as string | undefined\n if (endpoint) { // SPARQL\n queryParams.endpoint = endpoint\n\n queryParams.searchByNameQuery = kb.anyJS(dataSource, ns.ui('searchByNameQuery'), null, dataSource.doc())\n if (!queryParams.searchByNameQuery) {\n return box.appendChild(\n widgets.errorMessageBlock(dom, 'Error: No searchByNameQuery given for endpoint data Source: ' + form))\n }\n queryParams.insitituteDetailsQuery = kb.anyJS(dataSource, ns.ui('insitituteDetailsQuery'), null, dataSource.doc())\n } else {\n // return box.appendChild(\n // widgets.errorMessageBlock(dom, 'Error: No SPARQL endpoint given for autocomplete field: ' + form))\n const searchByNameURI = kb.anyJS(dataSource, ns.ui('searchByNameURI'))\n if (!searchByNameURI) {\n return box.appendChild(\n widgets.errorMessageBlock(dom, 'Error: No searchByNameURI OR sparql endpoint given for dataSource: ' + dataSource)\n )\n }\n queryParams.searchByNameURI = searchByNameURI\n }\n // It can be cleaner to just remove empty fields if you can't edit them anyway\n const suppressEmptyUneditable = kb.anyJS(form, ns.ui('suppressEmptyUneditable'), null, formDoc)\n const editable = kb.updater?.editable((doc as NamedNode).uri)\n\n const autocompleteOptions:AutocompleteOptions = { // cancelButton?: HTMLElement,\n permanent: true,\n targetClass: queryParams.targetClass, // @@ simplify?\n queryParams\n }\n\n autocompleteOptions.size = kb.anyJS(form, ns.ui('size'), null, formDoc) || undefined\n\n let obj = kb.any(subject, property as any, undefined, doc)\n if (!obj) {\n obj = kb.any(form, ns.ui('default'))\n if (obj) {\n autocompleteOptions.currentObject = obj as NamedNode\n autocompleteOptions.currentName = kb.any(autocompleteOptions.currentObject, labelProperty, null, doc) as Literal\n } else { // No data or default. Should we suprress the whole field?\n if (suppressEmptyUneditable && !editable) {\n box.style.display = 'none' // clutter removal\n return box\n }\n }\n } else { // get object and name from target data:\n autocompleteOptions.currentObject = obj as NamedNode\n autocompleteOptions.currentName = kb.any(autocompleteOptions.currentObject, labelProperty, null, doc) as Literal\n }\n\n lhs.appendChild(widgets.fieldLabel(dom, property as any, form))\n\n const barOptions = {\n editable,\n dbLookup: true\n }\n\n renderAutocompleteControl(dom, subject as NamedNode, barOptions, autocompleteOptions, addOneIdAndRefresh, deleteOne).then((control) => {\n rhs.appendChild(control)\n }, (err) => {\n rhs.appendChild(widgets.errorMessageBlock(dom, `Error rendering autocomplete ${form}: ${err}`, '#fee', err)) //\n })\n return box\n}\n\n// ends\n","/*\n * BASED ON:\n * IconicMultiSelect v0.7.0\n * Licence: MIT\n * (c) 2021 Sidney Wimart.\n * repo & configuration: https://github.com/sidneywm/iconic-multiselect\n */\n\n/**\n * @version IconicMultiSelect v0.7.0\n * @licence MIT\n */\nexport const style = {\n\n multiselect__container: `\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n background-color: #fff;\n border-radius: 2px;\n -webkit-box-shadow: 0 1px 3px 0 #d1d1d2, 0 0 0 1px #d1d1d2;\n box-shadow: 0 1px 3px 0 #d1d1d2, 0 0 0 1px #d1d1d2;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n min-height: 36px;\n padding: 4px 8px 0 8px;\n position: relative;\n width: 354px;\n margin-bottom: 5px;\n font-size: 100%\n `,\n\n /*\n multiselect__container:after: `\n content: '';\n min-height:inherit;\n font-size:0;\n `,\n\n multiselect__container > *: `\n color: #656565;\n font-size: 14px;\n `,\n*/\n multiselect__wrapper: `\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n height: 100%;\n width: 100%;\n `,\n\n multiselect__clear_btn: `\n cursor: pointer;\n align-items: center;\n margin-bottom: 4px;\n margin-left: 4px;\n `,\n\n multiselect__options: `\n background-color: #f6f6f6;\n border-radius: 2px;\n left: 0;\n max-height: 0;\n overflow: hidden;\n position: absolute;\n top: calc(100% + 3px);\n z-index: 9999;\n width: 100%;\n opacity: 0;\n transition: max-height 0.1s ease;\n `,\n\n multiselect__options_visible: `\n background-color: #f6f6f6;\n border-radius: 2px;\n left: 0;\n max-height: 0;\n overflow: hidden;\n position: absolute;\n top: calc(100% + 3px);\n z-index: 9999;\n width: 100%;\n opacity: 0;\n transition: max-height 0.1s ease;\n max-height: 200px;\n -webkit-box-shadow: 0 1px 3px 0 #d1d1d2, 0 0 0 1px #d1d1d2;\n box-shadow: 0 1px 3px 0 #d1d1d2, 0 0 0 1px #d1d1d2;\n opacity: 1;\n transition: max-height 0.2s ease;\n `,\n\n multiselect__options_ul: `\n list-style: none;\n margin: 0;\n padding: 2px 0;\n max-height: 200px;\n overflow: auto;\n `,\n\n multiselect__options_ul_li: `\n cursor: pointer;\n padding: 4px 8px;\n `,\n\n // multiselect__options ul li:hover: `\n multiselect__options_ul_li_hover: `\n background-color: #dedede;\n `,\n\n /*\n multiselect__options ul li *: `\n pointer-events: none;\n `,\n*/\n\n multiselect__options_ul_p_multiselect__options_no_results: `\n margin: 0;\n padding: 8px;\n text-align: center;\n `,\n\n multiselect__options_ul_p_multiselect__options_no_data: `\n margin: 0;\n padding: 8px;\n text-align: center;\n `,\n\n // multiselect__options ul li.multiselect__options--selected: `\n multiselect__options_ul_li_multiselect__options_selected: `\n background-color: #656565;\n color: #fff;\n `,\n\n // multiselect__options ul li.multiselect__options--selected:hover: `\n multiselect__options_ul_li_multiselect__options_selected_hover: `\n background-color: #656565;\n `,\n\n // multiselect__options ul li.arrow-selected: `\n multiselect__options_ul_li_arrow_selected: `\n border: 2px solid rgba(101, 101, 101, 0.5);\n `,\n\n multiselect__selected: `\n background-color: #656565;\n border-radius: 2px;\n color: #fff;\n margin-bottom: 4px;\n margin-right: 4px;\n padding: 4px 8px;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n `,\n\n multiselect__selected_multiselect__remove_btn: `\n cursor: pointer;\n display: flex;\n margin-left: 6px;\n `,\n\n multiselect__input: `\n border: none;\n -ms-flex-preferred-size: 40%;\n flex-basis: 40%;\n -webkit-box-flex: 1;\n -ms-flex-positive: 1;\n flex-grow: 1;\n height: 5px; \n margin-bottom: 4px;\n min-width: 40%;\n outline: none; \n `\n}\n\nstyle.setStyle = function setStyle (ele, styleName) {\n ele.style = style[styleName]\n}\n","/*\n * IconicMultiSelect v0.7.0\n * Licence: MIT\n * (c) 2021 Sidney Wimart.\n * repo & configuration: https://github.com/sidneywm/iconic-multiselect\n */\n\n/**\n * @version IconicMultiSelect v0.7.0\n * @licence MIT\n */\nimport { style } from '../lib/style_multiSelect'\n\nexport class IconicMultiSelect {\n _data\n _domElements\n _event = () => {}\n _itemTemplate\n _multiselect\n _noData\n _noResults\n _options = []\n _placeholder\n _select\n _selectContainer\n _selectedOptions = []\n _tagTemplate\n _textField\n _valueField\n _cross = `\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6.2253 4.81108C5.83477 4.42056 5.20161 4.42056 4.81108 4.81108C4.42056 5.20161 4.42056 5.83477 4.81108 6.2253L10.5858 12L4.81114 17.7747C4.42062 18.1652 4.42062 18.7984 4.81114 19.1889C5.20167 19.5794 5.83483 19.5794 6.22535 19.1889L12 13.4142L17.7747 19.1889C18.1652 19.5794 18.7984 19.5794 19.1889 19.1889C19.5794 18.7984 19.5794 18.1652 19.1889 17.7747L13.4142 12L19.189 6.2253C19.5795 5.83477 19.5795 5.20161 19.189 4.81108C18.7985 4.42056 18.1653 4.42056 17.7748 4.81108L12 10.5858L6.2253 4.81108Z\"\n fill=\"currentColor\"\n />\n </svg>\n `\n\n /**\n * Iconic Multiselect constructor.\n * @param { Object[] } data - Array of objects.\n * @param { string } noData - Defines the message when there is no data input.\n * @param { string } noResults - Defines the message when there is no result if options are filtered.\n * @param { string } placeholder - Defines the placeholder's text.\n * @param { string } select - DOM element to be selected. It must be a HTML Select tag - https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select\n * @param { string } textField - Field to select in the object for the text.\n * @param { string } valueField - Field to select in the object for the value.\n */\n constructor ({ data, itemTemplate, noData, noResults, placeholder, select, container, tagTemplate, textField, valueField }) {\n this._data = data ?? []\n this._itemTemplate = itemTemplate ?? null\n this._noData = noData ?? 'No data found.'\n this._noResults = noResults ?? 'No results found.'\n this._placeholder = placeholder ?? 'Select...'\n this._select = select\n // Timea added a container here\n this._selectContainer = container\n this._tagTemplate = tagTemplate ?? null\n this._textField = textField ?? null\n this._valueField = valueField ?? null\n }\n\n /**\n * Initialize the Iconic Multiselect component.\n * @public\n */\n init () {\n // Timea change to use this._select instead of this._selectContainer\n if (this._select && this._select.nodeName === 'SELECT') {\n if (this._itemTemplate && this._data.length === 0) { throw new Error('itemTemplate must be initialized with data from the component settings') }\n if (this._tagTemplate && this._data.length === 0) { throw new Error('tagTemplate must be initialized with data from the component settings') }\n\n this._options = this._data.length > 0 ? this._getDataFromSettings() : this._getDataFromSelectTag()\n\n this._renderMultiselect()\n this._renderOptionsList()\n\n this._domElements = {\n clear: this._multiselect.querySelector('.multiselect__clear-btn'),\n input: this._multiselect.querySelector('.multiselect__input'),\n optionsContainer: this._multiselect.querySelector('.multiselect__options'),\n optionsContainerList: this._multiselect.querySelector('.multiselect__options > ul'),\n options: {\n list: this._multiselect.querySelectorAll('.multiselect__options > ul > li'),\n find: function (callbackFn) {\n for (let i = 0; i < this.list.length; i++) {\n const node = this.list[i]\n if (callbackFn(node)) return node\n }\n return undefined\n },\n some: function (callbackFn) {\n for (let i = 0; i < this.list.length; i++) {\n const node = this.list[i]\n if (callbackFn(node, i)) return true\n }\n return false\n }\n }\n }\n\n this._enableEventListenners()\n this._initSelectedList()\n } else {\n throw new Error(`The selector '${this._select}' did not select any valid select tag.`)\n }\n }\n\n /**\n * Subscribes to the emitted events.\n * @param { Function } callback - Callback function which emits a custom event object.\n * @public\n */\n subscribe (callback) {\n if (typeof callback === 'function') {\n this._event = callback\n } else {\n throw new Error('parameter in the subscribe method is not a function')\n }\n }\n\n /**\n * Add an option to the selection list.\n * @param { Object: { text: string; value: string; }} option\n * @private\n */\n _addOptionToList (option, index) {\n const html = `<span class=\"multiselect__selected\" style=\"${style.multiselect__selected}\" data-value=\"${option.value}\">${\n this._tagTemplate ? this._processTemplate(this._tagTemplate, index) : option.text\n }<span class=\"multiselect__remove-btn\" style=\"${style.multiselect__remove_btn}\">${this._cross}</span></span>`\n\n this._domElements.input.insertAdjacentHTML('beforebegin', html)\n\n const { lastElementChild: removeBtn } = this._multiselect.querySelector(`span[data-value=\"${option.value}\"]`)\n removeBtn.addEventListener('click', () => {\n const target = this._domElements.options.find((el) => el.dataset.value === option.value)\n this._handleOption(target)\n })\n }\n\n /**\n * Clears all selected options.\n * @private\n */\n _clearSelection () {\n for (let i = 0; i < this._selectedOptions.length; i++) {\n const option = this._selectedOptions[i]\n const target = this._domElements.options.find((el) => el.dataset.value === option.value)\n target.classList.remove('multiselect__options--selected')\n target.setAttribute('style', style.multiselect__options)\n this._removeOptionFromList(target.dataset.value)\n }\n this._selectedOptions = []\n this._handleClearSelectionBtn()\n this._handlePlaceholder()\n this._dispatchEvent({\n action: 'CLEAR_ALL_OPTIONS',\n selection: this._selectedOptions\n })\n }\n\n /**\n * Close the options container.\n * @private\n */\n _closeList () {\n this._domElements.input.value = ''\n this._domElements.optionsContainer.classList.remove('visible')\n this._domElements.optionsContainer.setAttribute('style', style.multiselect__options)\n this._filterOptions('')\n this._removeAllArrowSelected()\n }\n\n /**\n * Dispatches new events.\n * @param { object : { action: string; selection: { option: string; text: string; }[]; value?: string; } } event\n * @private\n */\n _dispatchEvent (event) {\n this._event(event)\n }\n\n /**\n * Enables all main event listenners.\n * @private\n */\n _enableEventListenners () {\n document.addEventListener('mouseup', ({ target }) => {\n if (!this._multiselect.contains(target)) {\n this._filterOptions('')\n this._closeList()\n this._handlePlaceholder()\n }\n })\n\n this._domElements.clear.addEventListener('click', () => {\n this._clearSelection()\n })\n\n for (let i = 0; i < this._domElements.options.list.length; i++) {\n const option = this._domElements.options.list[i]\n option.addEventListener('click', ({ target }) => {\n this._handleOption(target)\n this._closeList()\n })\n }\n\n this._domElements.input.addEventListener('focus', () => {\n this._domElements.optionsContainer.classList.add('visible')\n this._domElements.optionsContainer.setAttribute('style', style.multiselect__options_visible)\n })\n\n this._domElements.input.addEventListener('input', ({ target: { value } }) => {\n if (this._domElements.options.list.length > 0) {\n this._filterOptions(value)\n }\n })\n\n this._domElements.input.addEventListener('keydown', (e) => {\n this._handleArrows(e)\n this._handleBackspace(e)\n this._handleEnter(e)\n })\n }\n\n /**\n * Filters user input.\n * @param { string } value\n * @private\n */\n _filterOptions (value) {\n const isOpen = this._domElements.optionsContainer.classList.contains('visible')\n const valueLowerCase = value.toLowerCase()\n\n if (!isOpen && value.length > 0) {\n this._domElements.optionsContainer.classList.add('visible')\n this._domElements.optionsContainer.setAttribute('style', style.multiselect__options_visible)\n }\n\n if (this._domElements.options.list.length > 0) {\n for (let i = 0; i < this._domElements.options.list.length; i++) {\n const el = this._domElements.options.list[i]\n const text = this._itemTemplate ? this._data[i][this._textField] : el.textContent\n\n if (text.toLowerCase().substring(0, valueLowerCase.length) === valueLowerCase) {\n this._domElements.optionsContainerList.appendChild(el)\n } else {\n el.parentNode && el.parentNode.removeChild(el)\n }\n }\n\n const hasResults = this._domElements.options.some(\n (el, index) =>\n (this._itemTemplate ? this._data[index][this._textField] : el.textContent)\n .toLowerCase()\n .substring(0, valueLowerCase.length) === valueLowerCase\n )\n this._showNoResults(!hasResults)\n }\n }\n\n _generateId (length) {\n let result = ''\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n const charactersLength = characters.length\n for (let i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength))\n }\n return result\n }\n\n /**\n * Gets data from select tag.\n * @private\n */\n _getDataFromSelectTag () {\n const arr = []\n const { options } = this._select\n for (let i = 0; i < options.length; i++) {\n const item = options[i]\n arr.push({\n text: item.text,\n value: item.value,\n selected: item.hasAttribute('selected')\n })\n }\n return arr\n }\n\n /**\n * Gets data from settings.\n * @private\n */\n _getDataFromSettings () {\n if (this._data.length > 0 && this._valueField && this._textField) {\n const isValueFieldValid = typeof this._valueField === 'string'\n const isTextFieldValid = typeof this._textField === 'string'\n const arr = []\n\n if (!isValueFieldValid || !isTextFieldValid) {\n throw new Error('textField and valueField must be of type string')\n }\n\n for (let i = 0; i < this._data.length; i++) {\n const item = this._data[i]\n arr.push({\n value: item[this._valueField],\n text: item[this._textField],\n selected: typeof item.selected === 'boolean' ? item.selected : false\n })\n }\n return arr\n } else {\n return null\n }\n }\n\n /**\n * Handles Arrow up & Down. Selection of an option is also possible with these keys.\n * @param { Event } event\n * @private\n */\n _handleArrows (event) {\n if (event.keyCode === 40 || event.keyCode === 38) {\n event.preventDefault()\n const isOpen = this._domElements.optionsContainer.classList.contains('visible')\n // An updated view of the container is needed because of the filtering option\n const optionsContainerList = this._multiselect.querySelector('.multiselect__options > ul')\n\n if (!isOpen) {\n this._domElements.optionsContainer.classList.add('visible')\n this._domElements.optionsContainer.setAttribute('style', style.multiselect__options_visible)\n optionsContainerList.firstElementChild.classList.add('arrow-selected')\n optionsContainerList.firstElementChild.setAttribute('style', style.multiselect__options_ul_li_arrow_selected)\n optionsContainerList.firstElementChild.scrollIntoView(false)\n } else {\n let selected = this._multiselect.querySelector('.multiselect__options ul li.arrow-selected')\n const action = {\n ArrowUp: 'previous',\n Up: 'previous',\n ArrowDown: 'next',\n Down: 'next'\n }\n\n if (!selected) {\n optionsContainerList.firstElementChild.classList.add('arrow-selected')\n optionsContainerList.firstElementChild.setAttribute('style', style.multiselect__options_ul_li_arrow_selected)\n optionsContainerList.firstElementChild.scrollIntoView(false)\n return\n }\n\n selected.classList.remove('arrow-selected')\n selected.setAttribute('style', style.multiselect__options_ul_li)\n\n selected = selected[action[event.key] + 'ElementSibling']\n\n // Go to start or end of the popup list\n if (!selected) {\n selected =\n optionsContainerList.children[action[event.key] === 'next' ? 0 : optionsContainerList.children.length - 1]\n selected.classList.add('arrow-selected')\n selected.setAttribute('style', style.multiselect__options_ul_li_arrow_selected)\n this._scrollIntoView(optionsContainerList, selected)\n return\n }\n\n selected.classList.add('arrow-selected')\n selected.setAttribute('style', style.multiselect__options_ul_li_arrow_selected)\n this._scrollIntoView(optionsContainerList, selected)\n }\n }\n }\n\n /**\n * Handles the backspace key event - Deletes the preceding option in the selection list.\n * @param { Event } e\n * @private\n */\n _handleBackspace (e) {\n if (e.keyCode === 8 && e.target.value === '') {\n const lastSelectedOption =\n this._selectedOptions.length > 0 ? this._selectedOptions[this._selectedOptions.length - 1] : null\n\n if (lastSelectedOption) {\n const targetLastSelectedOption = this._multiselect.querySelector(\n `li[data-value=\"${lastSelectedOption.value}\"]`\n )\n this._handleOption(targetLastSelectedOption)\n\n if (this._selectedOptions.length === 0) {\n this._domElements.optionsContainer.classList.remove('visible')\n this._domElements.optionsContainer.setAttribute('style', style.multiselect__options)\n }\n }\n }\n }\n\n /**\n * Shows clear selection button if some options are selected.\n * @private\n */\n _handleClearSelectionBtn () {\n if (this._selectedOptions.length > 0) {\n this._domElements.clear.style.display = 'flex'\n } else {\n this._domElements.clear.style.display = 'none'\n }\n }\n\n /**\n * Handles the enter key event.\n * @param { Event } event\n * @private\n */\n _handleEnter (event) {\n if (event.keyCode === 13) {\n const selected = this._multiselect.querySelector('.multiselect__options ul li.arrow-selected')\n if (selected) {\n this._handleOption(selected)\n this._closeList()\n }\n }\n }\n\n _handleOption (target, dispatchEvent = true) {\n // Remove\n for (let i = 0; i < this._selectedOptions.length; i++) {\n const el = this._selectedOptions[i]\n if (el.value === target.dataset.value) {\n target.classList.remove('multiselect__options--selected')\n target.setAttribute('style', style.multiselect__options)\n this._selectedOptions.splice(i, 1)\n this._removeOptionFromList(target.dataset.value)\n this._handleClearSelectionBtn()\n this._handlePlaceholder()\n\n return (\n dispatchEvent &&\n this._dispatchEvent({\n action: 'REMOVE_OPTION',\n value: target.dataset.value,\n selection: this._selectedOptions\n })\n )\n }\n }\n\n // Add\n for (let i = 0; i < this._options.length; i++) {\n const option = this._options[i]\n if (option.value === target.dataset.value) {\n target.classList.add('multiselect__options--selected')\n target.setAttribute('style', style.multiselect__options_selected)\n this._selectedOptions = [...this._selectedOptions, option]\n this._addOptionToList(option, i)\n this._handleClearSelectionBtn()\n this._handlePlaceholder()\n\n return (\n dispatchEvent &&\n this._dispatchEvent({\n action: 'ADD_OPTION',\n value: target.dataset.value,\n selection: this._selectedOptions\n })\n )\n }\n }\n }\n\n /**\n * Shows the placeholder if no options are selected.\n * @private\n */\n _handlePlaceholder () {\n this._domElements.input.placeholder = this._placeholder\n }\n\n _initSelectedList () {\n let hasItemsSelected = false\n\n for (let i = 0; i < this._options.length; i++) {\n const option = this._options[i]\n if (option.selected) {\n hasItemsSelected = true\n const target = this._domElements.options.find((el) => el.dataset.value === option.value)\n target.classList.add('multiselect__options--selected')\n target.setAttribute('style', style.multiselect__options_selected)\n this._selectedOptions = [...this._selectedOptions, option]\n this._addOptionToList(option, i)\n }\n }\n\n if (hasItemsSelected) { this._handleClearSelectionBtn() }\n this._handlePlaceholder()\n }\n\n /**\n * Process the custom template.\n * @param { string } template\n * @private\n */\n _processTemplate (template, index) {\n let processedTemplate = template\n const objAttr = template.match(/\\$\\{(\\w+)\\}/g).map((e) => e.replace(/\\$\\{|\\}/g, ''))\n\n for (let i = 0; i < objAttr.length; i++) {\n const attr = objAttr[i]\n // eslint-disable-next-line no-useless-escape\n processedTemplate = processedTemplate.replace(`\\$\\{${attr}\\}`, this._data[index][attr] ?? '')\n }\n\n return processedTemplate\n }\n\n _removeAllArrowSelected () {\n const className = 'arrow-selected'\n const target = this._domElements.options.find((el) => el.classList.contains(className))\n target && target.classList.remove(className) && target.setAttribute('style', style.multiselect__options_ul_li)\n }\n\n /**\n * Removes an option from the list.\n * @param { string } value\n * @private\n */\n _removeOptionFromList (value) {\n const optionDom = this._multiselect.querySelector(`span[data-value=\"${value}\"]`)\n optionDom && optionDom.parentNode && optionDom.parentNode.removeChild(optionDom)\n }\n\n /**\n * Renders the multiselect options list view.\n * @private\n */\n _renderOptionsList () {\n const html = `\n <div class=\"multiselect__options\" style=\"${style.multiselect__options}\">\n <ul style=\"${style.multiselect__options_ul}\">\n ${\n this._options.length > 0 && !this._itemTemplate\n ? this._options\n .map((option) => {\n return `\n <li data-value=\"${option.value}\" style=\"${style.multiselect__options_ul_li}\">${option.text}</li>\n `\n })\n .join('')\n : ''\n }\n\n ${\n this._options.length > 0 && this._itemTemplate\n ? this._options\n .map((option, index) => {\n return `\n <li data-value=\"${option.value}\" style=\"${style.multiselect__options_ul_li}\">${this._processTemplate(this._itemTemplate, index)}</li>\n `\n })\n .join('')\n : ''\n }\n ${this._showNoData(this._options.length === 0)}\n </ul>\n </div>\n `\n\n this._multiselect.insertAdjacentHTML('beforeend', html)\n }\n\n /**\n * Renders the multiselect view.\n * @private\n */\n _renderMultiselect () {\n this._select.style.display = 'none'\n const id = 'iconic-' + this._generateId(20)\n // Timea created dedicated div element because previous code was not rendering\n this._multiselect = document.createElement('div')\n this._multiselect.setAttribute('id', id)\n this._multiselect.setAttribute('class', 'multiselect__container')\n this._multiselect.setAttribute('style', style.multiselect__container)\n const html = `\n <div class=\"multiselect__wrapper\" style=\"${style.multiselect__wrapper}\">\n <input class=\"multiselect__input\" style=\"${style.multiselect__input}\" placeholder=\"${this._placeholder}\" />\n </div>\n <span style=\"display: none;\" class=\"multiselect__clear-btn\" style=\"${style.multiselect__clear_btn}\">${this._cross}</span>\n `\n this._multiselect.innerHTML = html\n this._selectContainer.appendChild(this._multiselect)\n }\n\n /**\n * ScrollIntoView - This small utility reproduces the behavior of .scrollIntoView({ block: \"nearest\", inline: \"nearest\" })\n * This is for IE compatibility without a need of a polyfill\n * @private\n */\n _scrollIntoView (parent, child) {\n const rectParent = parent.getBoundingClientRect()\n const rectChild = child.getBoundingClientRect()\n\n // Detect if not visible at top and then scroll to the top\n if (!(rectParent.top < rectChild.bottom - child.offsetHeight)) {\n parent.scrollTop = child.clientHeight + (child.offsetTop - child.offsetHeight)\n }\n\n // Detect if not visible at bottom and then scroll to the bottom\n if (!(rectParent.bottom > rectChild.top + child.offsetHeight)) {\n parent.scrollTop =\n child.clientHeight +\n (child.offsetTop - child.offsetHeight) -\n (parent.offsetHeight - (child.offsetHeight + (child.offsetHeight - child.clientHeight)))\n }\n }\n\n /**\n * Shows a no data message.\n * @param { boolean } condition\n * @private\n */\n _showNoData (condition) {\n return condition ? `<p class=\"multiselect__options--no-data\" style=\"${style.multiselect__options_ul_p_multiselect__options_no_data}\">${this._noData}</p>` : ''\n }\n\n /**\n * Shows a no results message.\n * @param { boolean } condition\n * @private\n */\n _showNoResults (condition) {\n const dom = this._multiselect.querySelector('.multiselect__options--no-results')\n if (condition) {\n const html = `<p class=\"multiselect__options--no-results\" style=\"${style.multiselect__options_ul_p_multiselect__options_no_results}\">${this._noResults}</p>`\n !dom && this._domElements.optionsContainerList.insertAdjacentHTML('beforeend', html)\n } else {\n dom && dom.parentNode && dom.parentNode.removeChild(dom)\n }\n }\n}\n","/* F O R M S\n *\n * A Vanilla Dom implementation of the form language\n */\n\n/* global alert */\n\nimport * as buttons from './buttons'\nimport { fieldParams } from './forms/fieldParams'\nimport { field, mostSpecificClassURI, fieldFunction } from './forms/fieldFunction'\nimport { setFieldStyle } from './forms/formStyle'\nimport * as debug from '../lib/debug'\nimport { errorMessageBlock } from './error'\nimport { basicField, fieldLabel, fieldStore, renderNameValuePair } from './forms/basic'\nimport { autocompleteField } from './forms/autocomplete/autocompleteField'\nimport { style } from '../lib/style'\nimport styleConstants from '../lib/styleConstants'\n\nimport { icons } from '../lib/iconBase'\nimport * as log from '../lib/log'\nimport ns from '../lib/ns'\nimport * as $rdf from 'rdflib'\nimport { store } from 'solid-logic'\nimport * as utils from '../utils'\nimport { IconicMultiSelect } from './multiSelect'\nimport * as widgets from '../widgets'\nexport { basicField, fieldLabel, fieldStore, renderNameValuePair } from './forms/basic' // Note default export\n\nexport { field, mostSpecificClassURI, fieldFunction } from './forms/fieldFunction'\nexport { fieldParams } from './forms/fieldParams'\n\nconst checkMarkCharacter = '\\u2713'\nconst cancelCharacter = '\\u2715'\nconst dashCharacter = '-'\nconst kb = store\n\nfield[ns.ui('AutocompleteField').uri] = autocompleteField\n\n// ///////////////////////////////////////////////////////////////////////\n\n/* Form Field implementations\n **\n */\n/** Group of different fields\n **\n ** One type of form field is an ordered Group of other fields.\n ** A Form is actually just the same as a group.\n **\n ** @param {Document} dom The HTML Document object aka Document Object Model\n ** @param {Element?} container If present, the created widget will be appended to this\n ** @param {Map} already A hash table of (form, subject) kept to prevent recursive forms looping\n ** @param {Node} subject The thing about which the form displays/edits data\n ** @param {Node} form The form or field to be rendered\n ** @param {Node} dataDoc The web document in which the data is\n ** @param {function(ok, errorMessage)} callbackFunction Called when data is changed?\n **\n ** @returns {Element} The HTML widget created\n */\nfunction refreshOpionsSubfieldinGroup (dom, already, subject, dataDoc, callbackFunction, groupDiv, subfields) {\n const eles = groupDiv.children\n for (let j = 0; j < subfields.length; j++) {\n // This is really messy.\n const field = subfields[j]\n const t = mostSpecificClassURI(field) // Field type\n if (t === ns.ui('Options').uri) {\n const optionsRender = fieldFunction(dom, field)\n const newOne = optionsRender(\n dom,\n null,\n already,\n subject,\n field,\n dataDoc,\n callbackFunction\n )\n debug.log('Refreshing Options field by replacing it.') // better to support actual refresh\n groupDiv.insertBefore(newOne, eles[j])\n groupDiv.removeChild(eles[j + 1]) // Remove the old one\n }\n }\n}\n\nfield[ns.ui('Form').uri] = field[ns.ui('Group').uri] =\n function (dom, container, already, subject, form, dataDoc, callbackFunction) {\n const box = dom.createElement('div')\n const ui = ns.ui\n if (container) container.appendChild(box)\n\n // Prevent loops\n if (!form) return\n const key = subject.toNT() + '|' + form.toNT()\n if (already[key]) {\n // been there done that\n box.appendChild(dom.createTextNode('Group: see above ' + key))\n // TODO fix dependency cycle to solid-panes by calling outlineManager\n // const plist = [$rdf.st(subject, ns.owl('sameAs'), subject)] // @@ need prev subject\n // dom.outlineManager.appendPropertyTRs(box, plist)\n // dom.appendChild(plist)\n return box\n }\n const already2 = {}\n for (const x in already) already2[x] = 1\n already2[key] = 1\n const formDoc = form.doc ? form.doc() : null // @@ if blank no way to know\n const weight0 = kb.any(form, ui('weight'), null, formDoc) // Say 0-3\n const weight = weight0 ? Number(weight0.value) : 1\n if (weight > 3 || weight < 0) return box.appendChild(errorMessageBlock(dom, `Form Group weight ${weight} should be 0-3`))\n\n box.setAttribute('style', style.formGroupStyle[weight]) // Indent a group\n box.style.display = 'flex'\n box.style.flexDirection = 'column'\n box.class = 'form-weight-' + weight\n\n let parts = kb.any(form, ui('parts'), null, formDoc)\n let subfields\n if (parts) {\n subfields = parts.elements\n } else {\n parts = kb.each(form, ui('part'), null, formDoc) // Warning: unordered\n subfields = sortBySequence(parts)\n }\n if (!parts) {\n return box.appendChild(errorMessageBlock(dom, 'No parts to form! '))\n }\n\n for (let i = 0; i < subfields.length; i++) {\n const field = subfields[i]\n const subFieldFunction = fieldFunction(dom, field) //\n\n const itemChanged = function (ok, body) {\n if (ok && body && body.widget && body.widget === 'select') {\n refreshOpionsSubfieldinGroup(dom, already, subject, dataDoc, callbackFunction, box, subfields)\n }\n callbackFunction(ok, { widget: 'group', change: body })\n }\n box.appendChild(subFieldFunction(dom, null, already2, subject, field, dataDoc, itemChanged))\n }\n return box\n }\n\n/** Options field: Select one or more cases\n **\n ** @param {Document} dom The HTML Document object aka Document Object Model\n ** @param {Element?} container If present, the created widget will be appended to this\n ** @param {Map} already A hash table of (form, subject) kept to prevent recursive forms looping\n ** @param {Node} subject The thing about which the form displays/edits data\n ** @param {Node} form The form or field to be rendered\n ** @param {Node} dataDoc The web document in which the data is\n ** @param {function(ok, errorMessage)} callbackFunction Called when data is changed?\n **\n ** @returns {Element} The HTML widget created\n */\n\nfield[ns.ui('Options').uri] = function (\n dom,\n container,\n already,\n subject,\n form,\n dataDoc,\n callbackFunction\n) {\n const kb = store\n const box = dom.createElement('div')\n const formDoc = form.doc ? form.doc() : null // @@ if blank no way to know\n\n const ui = ns.ui\n if (container) container.appendChild(box)\n\n let dependingOn = kb.any(form, ui('dependingOn'))\n if (!dependingOn) {\n dependingOn = ns.rdf('type')\n } // @@ default to type (do we want defaults?)\n const cases = kb.each(form, ui('case'), null, formDoc)\n if (!cases) {\n box.appendChild(errorMessageBlock(dom, 'No cases to Options form. '))\n }\n let values\n if (dependingOn.sameTerm(ns.rdf('type'))) {\n values = Object.keys(kb.findTypeURIs(subject)).map(uri => $rdf.sym(uri)) // Use RDF-S inference\n } else {\n values = kb.each(subject, dependingOn)\n }\n\n for (let i = 0; i < cases.length; i++) {\n const c = cases[i]\n const tests = kb.each(c, ui('for'), null, formDoc) // There can be multiple 'for'\n let match = false\n for (let j = 0; j < tests.length; j++) {\n for (const value of values) {\n const test = tests[j]\n if (value.sameTerm(tests) ||\n (value.termType === test.termType && value.value === test.value)) {\n match = true\n }\n }\n }\n if (match) {\n const field = kb.the(c, ui('use'))\n if (!field) {\n box.appendChild(\n errorMessageBlock(\n dom,\n 'No \"use\" part for case in form ' + form\n )\n )\n return box\n } else {\n appendForm(\n dom,\n box,\n already,\n subject,\n field,\n dataDoc,\n callbackFunction\n )\n }\n break\n }\n }\n // @@ Add box.refresh() to sync fields with values\n return box\n}\n\n/** Multiple field: zero or more similar subFields\n **\n ** @param {Document} dom The HTML Document object aka Document Object Model\n ** @param {Element?} container If present, the created widget will be appended to this\n ** @param {Map} already A hash table of (form, subject) kept to prevent recursive forms looping\n ** @param {Node} subject The thing about which the form displays/edits data\n ** @param {Node} form The form or field to be rendered\n ** @param {Node} dataDoc The web document in which the data is\n ** @param {function(ok, errorMessage)} callbackFunction Called when data is changed?\n **\n ** @returns {Element} The HTML widget created\n **\n ** Form properties:\n ** @param {Boolean} reverse Make e reverse arc in the data OPS not SPO\n ** @param {NamedNode} property The property to be written in the data\n ** @param {Boolean} ordered Is the list an ordered one where the user defined the order\n */\nfield[ns.ui('Multiple').uri] = function (\n dom,\n container,\n already,\n subject,\n form,\n dataDoc,\n callbackFunction\n) {\n /** Diagnostic function\n */\n function debugString (values) {\n return values.map(x => x.toString().slice(-7)).join(', ')\n }\n\n /** Add an item to the local quadstore not the UI or the web\n *\n * @param {Node} object The RDF object to be represented by this item.\n */\n async function addItem () {\n const object = newThing(dataDoc) // by default just add new nodes\n if (ordered) {\n createListIfNecessary() // Sets list and unsavedList\n list.elements.push(object)\n await saveListThenRefresh()\n } else {\n const toBeInserted = reverse ? [$rdf.st(object, property, subject, dataDoc)] : [$rdf.st(subject, property, object, dataDoc)]\n try {\n await kb.updater.update([], toBeInserted)\n } catch (err) {\n const msg = 'Error adding to unordered multiple: ' + err\n box.appendChild(errorMessageBlock(dom, msg))\n debug.error(msg)\n }\n refresh()\n }\n }\n\n /** Make a dom representation for an item\n * @param {Event} anyEvent if used as an event handler\n * @param {Node} object The RDF object to be represented by this item.\n */\n function renderItem (object) {\n async function deleteThisItem () {\n if (ordered) {\n debug.log('pre delete: ' + debugString(list.elements))\n for (let i = 0; i < list.elements.length; i++) {\n if (list.elements[i].sameTerm(object)) {\n list.elements.splice(i, 1)\n await saveListThenRefresh()\n return\n }\n }\n } else {\n // unordered\n if (kb.holds(subject, property, object, dataDoc)) {\n const del = [$rdf.st(subject, property, object, dataDoc)]\n kb.updater.update(del, [], function (uri, ok, message) {\n if (ok) {\n body.removeChild(subField)\n } else {\n body.appendChild(\n errorMessageBlock(\n dom,\n 'Multiple: delete failed: ' + message\n )\n )\n }\n })\n }\n }\n }\n\n /** Move the object up or down in the ordered list\n * @param {Event} anyEvent if used as an event handler\n * @param {Boolean} upwards Move this up (true) or down (false).\n */\n async function moveThisItem (event, upwards) {\n // @@ possibly, allow shift+click to do move to top or bottom?\n debug.log('pre move: ' + debugString(list.elements))\n let i\n for (i = 0; i < list.elements.length; i++) {\n // Find object in array\n if (list.elements[i].sameTerm(object)) {\n break\n }\n }\n if (i === list.elements.length) {\n alert('list move: not found element for ' + object)\n }\n if (upwards) {\n if (i === 0) {\n alert('@@ boop - already at top -temp message') // @@ make boop sound\n return\n }\n list.elements.splice(i - 1, 2, list.elements[i], list.elements[i - 1])\n } else {\n // downwards\n if (i === list.elements.length - 1) {\n alert('@@ boop - already at bottom -temp message') // @@ make boop sound\n return\n }\n list.elements.splice(i, 2, list.elements[i + 1], list.elements[i])\n }\n await saveListThenRefresh()\n }\n /* A subField has been filled in\n *\n * One possibility is to not actually make the link to the thing until\n * this callback happens to avoid widow links\n */\n function itemDone (ok, message) {\n debug.log(`Item done callback for item ${object.toString()}`)\n if (!ok) { // when does this happen? errors typically deal with upstream\n debug.error(' Item done callback: Error: ' + message)\n }\n callbackFunction(ok, message)\n }\n\n log.debug('Multiple: render object: ' + object)\n\n const fn = fieldFunction(dom, element)\n const subField = fn(dom, null, already, object, element, dataDoc, itemDone) // subfields was: body. moving to not passing that\n subField.subject = object // Keep a back pointer between the DOM array and the RDF objects\n\n // delete button and move buttons\n if (kb.updater.editable(dataDoc.uri)) {\n buttons.deleteButtonWithCheck(dom, subField, multipleUIlabel, deleteThisItem)\n if (ordered) { // Add controsl in a frame\n const frame = dom.createElement('div')\n frame.style.display = 'grid'\n frame.style.gridTemplateColumns = 'auto 3em'\n frame.style.gridTemplateRows = '50% 50%'\n const moveUpButton = buttons.button(\n dom, icons.iconBase + 'noun_1369237.svg', 'Move Up',\n async event => moveThisItem(event, true))\n const moveDownButton = buttons.button(\n dom, icons.iconBase + 'noun_1369241.svg', 'Move Down',\n async event => moveThisItem(event, false))\n const shim = dom.createElement('div')\n shim.appendChild(subField) // Subfield has its own layout\n frame.appendChild(shim)\n\n frame.appendChild(moveUpButton)\n frame.appendChild(moveDownButton)\n moveUpButton.style.gridColumn = 2\n moveDownButton.style.gridColumn = 2\n moveUpButton.style.gridRow = 1\n moveDownButton.style.padding = '0em' // don't take too much space\n moveUpButton.style.padding = '0em'\n\n moveDownButton.style.gridRow = 2\n shim.style.gridColumn = 1\n shim.style.gridRowStart = 'span 2' // Cover both rows\n // shim.style.gridRowEnd = 2 // Cover both rows\n return frame\n }\n }\n return subField // unused\n } // renderItem\n\n /// ///////// Body of Multiple form field implementation\n\n const plusIconURI = icons.iconBase + 'noun_19460_green.svg' // white plus in green circle\n\n const kb = store\n const formDoc = form.doc ? form.doc() : null // @@ if blank no way to know\n\n const box = (dom.createElement('div'))\n const shim = box // no shim\n // We don't indent multiple as it is a sort of a prefix of the next field and has contents of one.\n // box.setAttribute('style', 'padding-left: 2em; border: 0.05em solid green;') // Indent a multiple\n const ui = ns.ui\n if (container) container.appendChild(box)\n\n const orderedNode = kb.any(form, ui('ordered'))\n const ordered = orderedNode ? $rdf.Node.toJS(orderedNode) : false\n\n const property = kb.any(form, ui('property'))\n const reverse = kb.anyJS(form, ui('reverse'), null, formDoc)\n if (!property) {\n box.appendChild(\n errorMessageBlock(dom, 'No property to multiple: ' + form)\n ) // used for arcs in the data\n return shim\n }\n let multipleUIlabel = kb.any(form, ui('label'))\n if (!multipleUIlabel) multipleUIlabel = utils.label(property)\n let min = kb.any(form, ui('min')) // This is the minimum number -- default 0\n min = min ? 0 + min.value : 0\n\n const element = kb.any(form, ui('part')) // This is the form to use for each one\n if (!element) {\n box.appendChild(\n errorMessageBlock(dom, 'No part to multiple: ' + form)\n )\n return shim\n }\n\n const body = box.appendChild(dom.createElement('div'))\n body.style.display = 'flex'\n\n body.style.flexDirection = 'column'\n let list // The RDF collection which keeps the ordered version or null\n let values // Initial values - always an array. Even when no list yet.\n values = reverse ? kb.any(null, property, subject, dataDoc) : kb.any(subject, property, null, dataDoc)\n if (ordered) {\n list = reverse ? kb.any(null, property, subject, dataDoc) : kb.any(subject, property, null, dataDoc)\n if (list) {\n values = list.elements\n } else {\n values = []\n }\n } else {\n values = reverse ? kb.each(null, property, subject, dataDoc) : kb.each(subject, property, null, dataDoc)\n list = null\n }\n // Add control on the bottom for adding more items\n if (kb.updater.editable(dataDoc.uri)) {\n const tail = box.appendChild(dom.createElement('div'))\n tail.style.padding = '0.5em'\n const img = tail.appendChild(dom.createElement('img'))\n img.setAttribute('src', plusIconURI) // plus sign\n img.setAttribute('style', 'margin: 0.2em; width: 1.5em; height:1.5em')\n img.title = 'Click to add another ' + multipleUIlabel\n const prompt = dom.createElement('span')\n prompt.textContent =\n (values.length === 0 ? 'Add another ' : 'Add ') +\n multipleUIlabel\n tail.addEventListener('click', async _eventNotUsed => {\n await addItem()\n }, true)\n tail.appendChild(prompt)\n }\n\n function createListIfNecessary () {\n if (!list) {\n list = new $rdf.Collection()\n if (reverse) {\n kb.add(list, property, subject, dataDoc)\n } else {\n kb.add(subject, property, list, dataDoc)\n }\n }\n }\n\n async function saveListThenRefresh () {\n debug.log('save list: ' + debugString(list.elements)) // 20191214\n\n createListIfNecessary()\n try {\n await kb.fetcher.putBack(dataDoc)\n } catch (err) {\n box.appendChild(\n errorMessageBlock(dom, 'Error trying to put back a list: ' + err)\n )\n return\n }\n refresh()\n }\n\n function refresh () {\n let vals\n if (ordered) {\n const li = reverse ? kb.the(null, property, subject, dataDoc) : kb.the(subject, property, null, dataDoc)\n vals = li ? li.elements : []\n } else {\n vals = reverse ? kb.each(null, property, subject, dataDoc) : kb.each(subject, property, null, dataDoc)\n vals.sort() // achieve consistency on each refresh\n }\n utils.syncTableToArrayReOrdered(body, vals, renderItem)\n }\n body.refresh = refresh // Allow live update\n refresh()\n\n async function asyncStuff () {\n const extra = min - values.length\n if (extra > 0) {\n for (let j = 0; j < extra; j++) {\n debug.log('Adding extra: min ' + min)\n await addItem() // Add blanks if less than minimum\n }\n await saveListThenRefresh()\n }\n }\n asyncStuff().then(\n () => { debug.log(' Multiple render: async stuff ok') },\n (err) => { debug.error(' Multiple render: async stuff fails. #### ', err) }\n ) // async\n\n return shim\n} // Multiple\n\n/* Text field\n **\n */\n// For possible date popups see e.g. http://www.dynamicdrive.com/dynamicindex7/jasoncalendar.htm\n// or use HTML5: http://www.w3.org/TR/2011/WD-html-markup-20110113/input.date.html\n//\n\nfield[ns.ui('PhoneField').uri] = basicField\nfield[ns.ui('EmailField').uri] = basicField\nfield[ns.ui('ColorField').uri] = basicField\nfield[ns.ui('DateField').uri] = basicField\nfield[ns.ui('DateTimeField').uri] = basicField\nfield[ns.ui('TimeField').uri] = basicField\nfield[ns.ui('NumericField').uri] = basicField\nfield[ns.ui('IntegerField').uri] = basicField\nfield[ns.ui('DecimalField').uri] = basicField\nfield[ns.ui('FloatField').uri] = basicField\nfield[ns.ui('TextField').uri] = basicField\nfield[ns.ui('SingleLineTextField').uri] = basicField\nfield[ns.ui('NamedNodeURIField').uri] = basicField\n\n/* Multiline Text field\n **\n */\n\nfield[ns.ui('MultiLineTextField').uri] = function (\n dom,\n container,\n already,\n subject,\n form,\n dataDoc,\n callbackFunction\n) {\n const ui = ns.ui\n const kb = store\n const formDoc = form.doc ? form.doc() : null // @@ if blank no way to know\n\n const property = kb.any(form, ui('property'))\n if (!property) {\n return errorMessageBlock(dom, 'No property to text field: ' + form)\n }\n const box = dom.createElement('div')\n box.style.display = 'flex'\n box.style.flexDirection = 'row'\n const left = box.appendChild(dom.createElement('div'))\n left.style.width = styleConstants.formFieldNameBoxWidth\n const right = box.appendChild(dom.createElement('div'))\n\n left.appendChild(fieldLabel(dom, property, form))\n dataDoc = fieldStore(subject, property, dataDoc)\n\n const text = kb.anyJS(subject, property, null, dataDoc) || ''\n const editable = kb.updater.editable(dataDoc.uri)\n const suppressEmptyUneditable = form && kb.anyJS(form, ns.ui('suppressEmptyUneditable'), null, formDoc)\n\n if (!editable && suppressEmptyUneditable && text === '') {\n box.style.display = 'none'\n }\n const field = makeDescription(\n dom,\n kb,\n subject,\n property,\n dataDoc,\n callbackFunction\n )\n right.appendChild(field)\n if (container) container.appendChild(box)\n return box\n}\n\n/* Boolean field and Tri-state version (true/false/null)\n **\n ** @@ todo: remove tristate param\n */\nfunction booleanField (\n dom,\n container,\n already,\n subject,\n form,\n dataDoc,\n callbackFunction,\n tristate\n) {\n const ui = ns.ui\n const kb = store\n const property = kb.any(form, ui('property'))\n if (!property) {\n const errorBlock = errorMessageBlock(\n dom,\n 'No property to boolean field: ' + form\n )\n if (container) container.appendChild(errorBlock)\n return errorBlock\n }\n let lab = kb.any(form, ui('label'))\n if (!lab) lab = utils.label(property, true) // Init capital\n dataDoc = fieldStore(subject, property, dataDoc)\n let state = kb.any(subject, property)\n if (state === undefined) {\n state = false\n } // @@ sure we want that -- or three-state?\n const ins = $rdf.st(subject, property, true, dataDoc)\n const del = $rdf.st(subject, property, false, dataDoc)\n const box = buildCheckboxForm(dom, kb, lab, del, ins, form, dataDoc, tristate)\n if (container) container.appendChild(box)\n return box\n}\nfield[ns.ui('BooleanField').uri] = function (\n dom,\n container,\n already,\n subject,\n form,\n dataDoc,\n callbackFunction\n) {\n return booleanField(\n dom,\n container,\n already,\n subject,\n form,\n dataDoc,\n callbackFunction,\n false\n )\n}\n\nfield[ns.ui('TristateField').uri] = function (\n dom,\n container,\n already,\n subject,\n form,\n dataDoc,\n callbackFunction\n) {\n return booleanField(\n dom,\n container,\n already,\n subject,\n form,\n dataDoc,\n callbackFunction,\n true\n )\n}\n\n/* Classifier field\n **\n ** Nested categories\n **\n ** @@ To do: If a classification changes, then change any dependent Options fields.\n */\n\nfield[ns.ui('Classifier').uri] = function (\n dom,\n container,\n already,\n subject,\n form,\n dataDoc,\n callbackFunction\n) {\n const kb = store\n const ui = ns.ui\n const category = kb.any(form, ui('category'))\n if (!category) {\n return errorMessageBlock(dom, 'No category for classifier: ' + form)\n }\n log.debug('Classifier: dataDoc=' + dataDoc)\n const checkOptions = function (ok, body) {\n if (!ok) return callbackFunction(ok, body)\n return callbackFunction(ok, body)\n }\n // Create container for label and select\n const outerBox = dom.createElement('div')\n outerBox.setAttribute('class', 'classifierBox')\n // Render label\n const labelDiv = dom.createElement('div')\n labelDiv.setAttribute('class', 'formFieldName classifierBox-label')\n // Use fieldLabel to render ui:label if present\n labelDiv.appendChild(fieldLabel(dom, category, form))\n outerBox.appendChild(labelDiv)\n // Render select\n const selectBox = dom.createElement('div')\n selectBox.setAttribute('class', 'formFieldValue classifierBox-selectBox')\n const selectElement = makeSelectForNestedCategory(\n dom,\n kb,\n subject,\n category,\n dataDoc,\n checkOptions\n )\n // Set readonly if not editable\n if (selectElement && selectElement.querySelectorAll) {\n const selects = selectElement.querySelectorAll('select')\n if (selects.length && !kb.updater.editable(dataDoc.uri)) {\n selects.forEach(select => {\n select.readOnly = true\n select.style = style.textInputStyleUneditable\n })\n }\n }\n selectBox.appendChild(selectElement)\n outerBox.appendChild(selectBox)\n if (container) container.appendChild(outerBox)\n return outerBox\n}\n\n/** Choice field\n **\n ** Not nested. Generates a link to something from a given class.\n ** Optional subform for the thing selected.\n ** Generates a subForm based on a ui:use form\n ** Will look like:\n ** <div id=dropDownDiv>\n ** <div id=labelOfDropDown>\n ** <div id=selectDiv>\n ** <select id=dropDownSelect>\n ** <option> ....\n ** <subForm>\n ** Alternative implementatons could be:\n ** -- pop-up menu (as here)\n ** -- radio buttons\n ** -- auto-complete typing\n **\n ** TODO: according to ontology ui:choice can also have ns.ui('default') - this is not implemented yet\n */\n\nfield[ns.ui('Choice').uri] = function (\n dom,\n container,\n already,\n subject,\n form,\n dataDoc,\n callbackFunction\n) {\n const ui = ns.ui\n const kb = store\n const formDoc = form.doc ? form.doc() : null // @@ if blank no way to know\n\n let p\n const box = dom.createElement('div')\n box.setAttribute('class', 'choiceBox')\n // Set flexDirection column?\n if (container) container.appendChild(box)\n const lhs = dom.createElement('div')\n lhs.setAttribute('class', 'formFieldName choiceBox-label')\n box.appendChild(lhs)\n const rhs = dom.createElement('div')\n rhs.setAttribute('class', 'formFieldValue choiceBox-selectBox')\n box.appendChild(rhs)\n const property = kb.any(form, ui('property'))\n if (!property) {\n return box.appendChild(errorMessageBlock(dom, 'No property for Choice: ' + form))\n }\n lhs.appendChild(fieldLabel(dom, property, form))\n const uiFrom = kb.any(form, ui('from'))\n if (!uiFrom) {\n return errorMessageBlock(dom, 'No \\'from\\' for Choice: ' + form)\n }\n const subForm = kb.any(form, ui('use')) // Optional\n // const follow = kb.anyJS(form, ui('follow'), null, formDoc) // data doc moves to new subject?\n\n const opts = { form, subForm, disambiguate: false }\n\n function getSelectorOptions (dataSource) {\n let possible = []\n let possibleProperties\n possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc)\n for (const x in findMembersNT(kb, uiFrom, dataSource)) {\n possible.push(kb.fromNT(x))\n } // Use rdfs\n\n if (uiFrom.sameTerm(ns.rdfs('Class'))) {\n for (p in buttons.allClassURIs()) possible.push(kb.sym(p))\n // log.debug(\"%%% Choice field: possible.length 2 = \"+possible.length)\n } else if (uiFrom.sameTerm(ns.rdf('Property'))) {\n possibleProperties = buttons.propertyTriage(kb)\n for (p in possibleProperties.op) possible.push(kb.fromNT(p))\n for (p in possibleProperties.dp) possible.push(kb.fromNT(p))\n opts.disambiguate = true // This is a big class, and the labels won't be enough.\n } else if (uiFrom.sameTerm(ns.owl('ObjectProperty'))) {\n possibleProperties = buttons.propertyTriage(kb)\n for (p in possibleProperties.op) possible.push(kb.fromNT(p))\n opts.disambiguate = true\n } else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {\n possibleProperties = buttons.propertyTriage(kb)\n for (p in possibleProperties.dp) possible.push(kb.fromNT(p))\n opts.disambiguate = true\n }\n\n return possible\n // return sortByLabel(possible)\n }\n\n // TODO: this checks for any occurrence, regardless of true or false setting\n if (kb.any(form, ui('canMintNew'))) {\n opts.mint = '* Create new *' // @@ could be better\n }\n\n const multiSelect = kb.any(form, ui('multiselect')) // Optional\n if (multiSelect) opts.multiSelect = true\n\n // by default searches the dataDoc graph or optionally the full store\n const dataSource = kb.each(form, ui('search-full-store')).length ? null : dataDoc // optional\n\n let selector\n rhs.refresh = function () {\n // from ui:property\n let selectedOptions = kb.each(subject, property, null, dataDoc).map(object => object.value)\n // from ui:from + ui:property\n let possibleOptions = getSelectorOptions(dataSource)\n possibleOptions.push(selectedOptions)\n possibleOptions = sortByLabel(possibleOptions)\n\n selector = makeSelectForChoice(\n dom,\n rhs,\n kb,\n subject,\n property,\n possibleOptions,\n selectedOptions,\n uiFrom,\n opts,\n dataDoc,\n callbackFunction\n )\n rhs.innerHTML = ''\n rhs.appendChild(selector)\n if (multiSelect) {\n const multiSelectDiv = new IconicMultiSelect({\n placeholder: selector.selected,\n select: selector,\n container: rhs,\n textField: 'textField',\n valueField: 'valueField'\n })\n multiSelectDiv.init()\n multiSelectDiv.subscribe(function (event) {\n if (event.action === 'REMOVE_OPTION') {\n selectedOptions = selectedOptions.filter(function (value) {\n return value !== event.value\n })\n }\n if (event.action === 'CLEAR_ALL_OPTIONS') {\n selectedOptions = []\n }\n if (event.action === 'ADD_OPTION') {\n const stringValue = event.value + ''\n if (stringValue.includes('Create new')) {\n const newObject = newThing(dataDoc)\n const is = []\n is.push($rdf.st(subject, property, kb.sym(newObject), dataDoc))\n if (uiFrom) is.push($rdf.st(newObject, ns.rdf('type'), kb.sym(uiFrom), dataDoc))\n if (subForm) {\n addSubFormChoice(dom, rhs, {}, $rdf.sym(newObject), subForm, dataDoc, function (ok, body) {\n if (ok) {\n kb.updater.update([], is, function (uri, success, errorBody) {\n if (!success) rhs.appendChild(errorMessageBlock(dom, 'Error updating select: ' + errorBody))\n })\n selectedOptions.push(newObject)\n if (callbackFunction) callbackFunction(ok, { widget: 'select', event: 'new' })\n } else {\n rhs.appendChild(errorMessageBlock(dom, 'Error updating data in field of select: ' + body))\n }\n })\n }\n } else selectedOptions.push(event.value)\n }\n selector.update(selectedOptions)\n })\n }\n }\n\n rhs.refresh()\n if (selector && selector.refresh) selector.refresh()\n\n return box\n}\n\nfunction addSubFormChoice (dom, selectDiv, already, subject, subForm, dataDoc, callbackFunction) {\n fieldFunction(dom, subForm)(\n dom,\n selectDiv,\n already,\n subject,\n subForm,\n dataDoc,\n callbackFunction\n )\n}\n\n// Documentation - non-interactive fields\n//\n\nfield[ns.ui('Comment').uri] = field[\n ns.ui('Heading').uri\n] = function (\n dom,\n container,\n already,\n subject,\n form,\n dataDoc,\n _callbackFunction\n) {\n const ui = ns.ui\n const kb = store\n let contents = kb.any(form, ui('contents'))\n if (!contents) contents = 'Error: No contents in comment field.'\n const formDoc = form.doc ? form.doc() : null // @@ if blank no way to know\n\n const uri = mostSpecificClassURI(form)\n const params = fieldParams[uri] || {}\n\n const box = dom.createElement('div')\n if (container) container.appendChild(box)\n const p = box.appendChild(dom.createElement(params.element))\n p.textContent = contents\n\n setFieldStyle(p, form)\n\n // Some headings and prompts are only useful to guide user input\n const suppressIfUneditable = kb.anyJS(form, ns.ui('suppressIfUneditable'), null, formDoc)\n const editable = kb.updater.editable(dataDoc.uri)\n if (suppressIfUneditable && !editable) {\n box.style.display = 'none'\n }\n return box\n}\n\n// A button for editing a form (in place, at the moment)\n//\n// When editing forms, make it yellow, when editing thr form form, pink\n// Help people understand how many levels down they are.\n//\nexport function editFormButton (\n dom,\n container,\n form,\n dataDoc,\n callbackFunction\n) {\n const b = dom.createElement('button')\n b.setAttribute('type', 'button')\n b.innerHTML = 'Edit ' + utils.label(ns.ui('Form'))\n b.addEventListener(\n 'click',\n function (_e) {\n const ff = appendForm(\n dom,\n container,\n {},\n form,\n ns.ui('FormForm'),\n dataDoc,\n callbackFunction\n )\n ff.setAttribute(\n 'style',\n ns.ui('FormForm').sameTerm(form)\n ? 'background-color: #fee;'\n : 'background-color: #ffffe7;'\n )\n b.parentNode.removeChild(b)\n },\n true\n )\n return b\n}\n\nexport function appendForm (\n dom,\n container,\n already,\n subject,\n form,\n dataDoc,\n itemDone\n) {\n return fieldFunction(dom, form)(\n dom,\n container,\n already,\n subject,\n form,\n dataDoc,\n itemDone\n )\n}\n\n/** Find list of properties for class\n//\n// Three possible sources: Those mentioned in schemas, which exludes many\n// those which occur in the data we already have, and those predicates we\n// have come across anywhere and which are not explicitly excluded from\n// being used with this class.\n*/\n\nexport function propertiesForClass (kb, c) {\n const explicit = kb.each(undefined, ns.rdf('range'), c)\n ;[\n ns.rdfs('comment'),\n ns.dc('title'), // Generic things\n ns.foaf('name'),\n ns.foaf('homepage')\n ].forEach(function (x) {\n explicit.push(x)\n })\n let members = kb.each(undefined, ns.rdf('type'), c)\n if (members.length > 60) members = members.slice(0, 60) // Array supports slice?\n const used = {}\n for (let i = 0; i < (members.length > 60 ? 60 : members.length); i++) {\n kb.statementsMatching(members[i], undefined, undefined).forEach(function (st) {\n used[st.predicate.uri] = true\n })\n }\n explicit.forEach(function (p) {\n used[p.uri] = true\n })\n const result = []\n for (const uri in used) {\n result.push(kb.sym(uri))\n }\n return result\n}\n\n/** Find the closest class\n* @param kb The quad store\n* @param cla - the URI of the class\n* @param prop\n*/\nexport function findClosest (kb, cla, prop) {\n const agenda = [kb.sym(cla)] // ordered - this is breadth first search\n while (agenda.length > 0) {\n const c = agenda.shift() // first\n const lists = kb.each(c, prop)\n log.debug('Lists for ' + c + ', ' + prop + ': ' + lists.length)\n if (lists.length !== 0) return lists\n const supers = kb.each(c, ns.rdfs('subClassOf'))\n for (let i = 0; i < supers.length; i++) {\n agenda.push(supers[i])\n log.debug('findClosest: add super: ' + supers[i])\n }\n }\n return []\n}\n\n// Which forms apply to a given existing subject?\n\nexport function formsFor (subject) {\n const kb = store\n\n log.debug('formsFor: subject=' + subject)\n const t = kb.findTypeURIs(subject)\n let t1\n for (t1 in t) {\n log.debug(' type: ' + t1)\n }\n const bottom = kb.bottomTypeURIs(t) // most specific\n let candidates = []\n for (const b in bottom) {\n // Find the most specific\n log.debug('candidatesFor: trying bottom type =' + b)\n candidates = candidates.concat(\n findClosest(kb, b, ns.ui('creationForm'))\n )\n candidates = candidates.concat(\n findClosest(kb, b, ns.ui('annotationForm'))\n )\n }\n return candidates\n}\n\nexport function sortBySequence (list) {\n const subfields = list.map(function (p) {\n const k = kb.any(p, ns.ui('sequence'))\n return [k || 9999, p]\n })\n subfields.sort(function (a, b) {\n return a[0] - b[0]\n })\n return subfields.map(function (pair) {\n return pair[1]\n })\n}\n\nexport function sortByLabel (list) {\n const subfields = list.map(function (p) {\n return [utils.label(p).toLowerCase(), p]\n })\n subfields.sort()\n return subfields.map(function (pair) {\n return pair[1]\n })\n}\n\n/** Button to add a new whatever using a form\n//\n// @param form - optional form , else will look for one\n// @param dataDoc - optional dataDoc else will prompt for one (unimplemented)\n*/\nexport function newButton (\n dom,\n kb,\n subject,\n predicate,\n theClass,\n form,\n dataDoc,\n callbackFunction\n) {\n const b = dom.createElement('button')\n b.setAttribute('type', 'button')\n b.innerHTML = 'New ' + utils.label(theClass)\n b.addEventListener(\n 'click',\n function (_e) {\n b.parentNode.appendChild(\n promptForNew(\n dom,\n kb,\n subject,\n predicate,\n theClass,\n form,\n dataDoc,\n callbackFunction\n )\n )\n },\n false\n )\n return b\n}\n\n/** Prompt for new object of a given class\n//\n// @param dom - the document DOM for the user interface\n// @param kb - the graph which is the knowledge base we are working with\n// @param subject - a term, Thing this should be linked to when made. Optional.\n// @param predicate - a term, the relationship for the subject link. Optional.\n// @param theClass - an RDFS class containng the object about which the new information is.\n// @param form - the form to be used when a new one. null means please find one.\n// @param dataDoc - The web document being edited\n// @param callbackFunction - takes (boolean ok, string errorBody)\n// @returns a dom object with the form DOM\n*/\nexport function promptForNew (\n dom,\n kb,\n subject,\n predicate,\n theClass,\n form,\n dataDoc,\n callbackFunction\n) {\n const box = dom.createElement('form')\n\n if (!form) {\n const lists = findClosest(kb, theClass.uri, ns.ui('creationForm'))\n if (lists.length === 0) {\n const p = box.appendChild(dom.createElement('p'))\n p.textContent =\n 'I am sorry, you need to provide information about a ' +\n utils.label(theClass) +\n ' but I don\\'t know enough information about those to ask you.'\n const b = box.appendChild(dom.createElement('button'))\n b.setAttribute('type', 'button')\n b.setAttribute('style', 'float: right;')\n b.innerHTML = 'Goto ' + utils.label(theClass)\n b.addEventListener(\n 'click',\n // TODO fix dependency cycle to solid-panes by calling outlineManager\n function (_e) {\n dom.outlineManager.GotoSubject(\n theClass,\n true,\n undefined,\n true,\n undefined\n )\n },\n false\n )\n return box\n }\n log.debug('lists[0] is ' + lists[0])\n form = lists[0] // Pick any one\n }\n log.debug('form is ' + form)\n box.setAttribute('style', `border: 0.05em solid ${styleConstants.formBorderColor}; color: ${styleConstants.formBorderColor}`) // @@color?\n box.innerHTML = '<h3>New ' + utils.label(theClass) + '</h3>'\n\n const formFunction = fieldFunction(dom, form)\n const object = newThing(dataDoc)\n let gotButton = false\n const itemDone = function (ok, body) {\n if (!ok) return callbackFunction(ok, body)\n const insertMe = []\n if (subject && !kb.holds(subject, predicate, object, dataDoc)) {\n insertMe.push($rdf.st(subject, predicate, object, dataDoc))\n }\n if (subject && !kb.holds(object, ns.rdf('type'), theClass, dataDoc)) {\n insertMe.push($rdf.st(object, ns.rdf('type'), theClass, dataDoc))\n }\n if (insertMe.length) {\n kb.updater.update([], insertMe, linkDone)\n } else {\n callbackFunction(true, body)\n }\n if (!gotButton) {\n gotButton = box.appendChild(buttons.linkButton(dom, object))\n }\n }\n function linkDone (uri, ok, body) {\n return callbackFunction(ok, body)\n }\n log.info('paneUtils Object is ' + object)\n const f = formFunction(dom, box, {}, object, form, dataDoc, itemDone)\n const rb = buttons.removeButton(dom, f)\n rb.setAttribute('style', 'float: right;')\n box.AJAR_subject = object\n return box\n}\n\nexport function makeDescription (\n dom,\n kb,\n subject,\n predicate,\n dataDoc,\n callbackFunction\n) {\n const group = dom.createElement('div')\n const desc = kb.anyJS(subject, predicate, null, dataDoc) || ''\n\n const field = dom.createElement('textarea')\n group.appendChild(field)\n field.rows = desc ? desc.split('\\n').length + 2 : 2\n field.cols = 80\n\n field.setAttribute('style', style.multilineTextInputStyle)\n if (desc !== null) {\n field.value = desc\n } else {\n // Unless you can make the predicate label disappear with the first click then this is over-cute\n // field.value = utils.label(predicate); // Was\"enter a description here\" @@ possibly: add prompt which disappears\n field.select() // Select it ready for user input -- doesn't work\n }\n\n group.refresh = function () {\n const v = kb.any(subject, predicate, null, dataDoc)\n if (v && v.value !== field.value) {\n field.value = v.value // don't touch widget if no change\n // @@ this is the place to color the field from the user who chanaged it\n }\n }\n function saveChange (_e) {\n submit.disabled = true\n submit.setAttribute('style', 'visibility: hidden; float: right;') // Keep UI clean\n field.disabled = true\n field.style.color = styleConstants.textInputColorPending\n const ds = kb.statementsMatching(subject, predicate, null, dataDoc)\n const is = $rdf.st(subject, predicate, field.value, dataDoc)\n kb.updater.update(ds, is, function (uri, ok, body) {\n if (ok) {\n field.style.color = styleConstants.textInputColor\n field.disabled = false\n } else {\n group.appendChild(\n errorMessageBlock(\n dom,\n 'Error (while saving change to ' + dataDoc.uri + '): ' + body\n )\n )\n }\n if (callbackFunction) {\n callbackFunction(ok, body)\n }\n })\n }\n\n const editable = kb.updater.editable(dataDoc.uri)\n let submit\n if (editable) {\n submit = widgets.continueButton(dom, saveChange)\n submit.disabled = true // until the filled has been modified\n submit.style.visibility = 'hidden'\n submit.style.float = 'right'\n group.appendChild(submit)\n\n field.addEventListener(\n 'keyup',\n function (_e) {\n // Green means has been changed, not saved yet\n field.style.color = 'green' // setAttribute('style', style + 'color: green;')\n if (submit) {\n submit.disabled = false\n submit.style.visibility = '' // Remove visibility: hidden\n }\n },\n true\n )\n field.addEventListener('change', saveChange, true)\n } else {\n field.disabled = true // @@ change color too\n field.style.backgroundColor = styleConstants.textInputBackgroundColorUneditable\n }\n return group\n}\n\n/** Make SELECT element to select options\n//\n// @param subject - a term, the subject of the statement(s) being edited.\n// @param predicate - a term, the predicate of the statement(s) being edited\n// @param possible - a list of terms, the possible value the object can take\n// @param options.multiple - Boolean - Whether more than one at a time is allowed\n// @param options.nullLabel - a string to be displayed as the\n// option for none selected (for non multiple)\n// @param options.mint - User may create thing if this sent to the prompt string eg \"New foo\"\n// @param options.subForm - If mint, then the form to be used for minting the new thing\n// @param dataDoc - The web document being edited\n// @param callbackFunction - takes (boolean ok, string errorBody)\n*/\nexport function makeSelectForClassifierOptions (\n dom,\n kb,\n subject,\n predicate,\n possible,\n options,\n dataDoc,\n callbackFunction\n) {\n log.debug('Select list length now ' + possible.length)\n let n = 0\n const uris = {} // Count them\n const editable = kb.updater.editable(dataDoc.uri)\n\n for (let i = 0; i < possible.length; i++) {\n const sub = possible[i] // @@ Maybe; make this so it works with blank nodes too\n if (!sub.uri) debug.warn(`makeSelectForClassifierOptions: option does not have an uri: ${sub}, with predicate: ${predicate}`)\n if (!sub.uri || sub.uri in uris) continue\n uris[sub.uri] = true\n n++\n } // uris is now the set of possible options\n if (n === 0 && !options.mint) {\n return errorMessageBlock(\n dom,\n 'Can\\'t do selector with no options, subject= ' +\n subject +\n ' property = ' +\n predicate +\n '.'\n )\n }\n\n log.debug('makeSelectForClassifierOptions: dataDoc=' + dataDoc)\n let actual\n const getActual = function () {\n actual = {}\n if (predicate.sameTerm(ns.rdf('type'))) {\n actual = kb.findTypeURIs(subject)\n } else {\n kb.each(subject, predicate, null, dataDoc).forEach(function (x) {\n actual[x.uri] = true\n })\n }\n return actual\n }\n actual = getActual()\n\n const onChange = function (_e) {\n select.disabled = true // until data written back - gives user feedback too\n const ds = []\n let is = []\n const removeValue = function (t) {\n if (kb.holds(subject, predicate, t, dataDoc)) {\n ds.push($rdf.st(subject, predicate, t, dataDoc))\n }\n }\n let newObject\n for (let i = 0; i < select.options.length; i++) {\n const opt = select.options[i]\n if (opt.selected && opt.AJAR_mint) {\n if (options.mintClass) {\n const thisForm = promptForNew(\n dom,\n kb,\n subject,\n predicate,\n options.mintClass,\n null,\n dataDoc,\n function (ok, body) {\n if (!ok) {\n callbackFunction(ok, body, { change: 'new' }) // @@ if ok, need some form of refresh of the select for the new thing\n }\n }\n )\n select.parentNode.appendChild(thisForm)\n newObject = thisForm.AJAR_subject\n } else {\n newObject = newThing(dataDoc)\n }\n is.push($rdf.st(subject, predicate, newObject, dataDoc))\n if (options.mintStatementsFun) {\n is = is.concat(options.mintStatementsFun(newObject))\n }\n }\n if (!opt.AJAR_uri) continue // a prompt or mint\n if (opt.selected && !(opt.AJAR_uri in actual)) {\n // new class\n is.push($rdf.st(subject, predicate, kb.sym(opt.AJAR_uri), dataDoc))\n }\n if (!opt.selected && opt.AJAR_uri in actual) {\n // old class\n removeValue(kb.sym(opt.AJAR_uri))\n }\n if (opt.selected) select.currentURI = opt.AJAR_uri\n }\n let sel = select.subSelect // All subclasses must also go\n while (sel && sel.currentURI) {\n removeValue(kb.sym(sel.currentURI))\n sel = sel.subSelect\n }\n sel = select.superSelect // All superclasses are redundant\n while (sel && sel.currentURI) {\n removeValue(kb.sym(sel.currentURI))\n sel = sel.superSelect\n }\n function doneNew (ok, _body) {\n callbackFunction(ok, { widget: 'select', event: 'new' })\n }\n log.info('makeSelectForClassifierOptions: data doc = ' + dataDoc)\n kb.updater.update(ds, is, function (uri, ok, body) {\n actual = getActual() // refresh\n if (ok) {\n select.disabled = false // data written back\n if (newObject) {\n const fn = fieldFunction(dom, options.subForm)\n fn(\n dom,\n select.parentNode,\n {},\n newObject,\n options.subForm,\n dataDoc,\n doneNew\n )\n }\n } else {\n return select.parentNode.appendChild(errorMessageBlock(dom, 'Error updating data in select: ' + body))\n }\n if (callbackFunction) callbackFunction(ok, { widget: 'select', event: 'change' })\n })\n }\n\n const select = dom.createElement('select')\n select.setAttribute('style', style.formSelectStyle)\n if (options.multiple) select.setAttribute('multiple', 'true')\n select.currentURI = null\n\n select.refresh = function () {\n actual = getActual() // refresh\n for (let i = 0; i < select.children.length; i++) {\n const option = select.children[i]\n if (option.AJAR_uri) {\n option.selected = option.AJAR_uri in actual\n }\n }\n select.disabled = false // unlocked any conflict we had got into\n }\n\n for (const uri in uris) {\n const c = kb.sym(uri)\n const option = dom.createElement('option')\n if (options.disambiguate) {\n option.appendChild(dom.createTextNode(utils.labelWithOntology(c, true))) // Init. cap\n } else {\n option.appendChild(dom.createTextNode(utils.label(c, true))) // Init.\n }\n const backgroundColor = kb.any(\n c,\n kb.sym('http://www.w3.org/ns/ui#backgroundColor')\n )\n if (backgroundColor) {\n option.setAttribute(\n 'style',\n 'background-color: ' + backgroundColor.value + '; '\n )\n }\n option.AJAR_uri = uri\n if (uri in actual) {\n option.setAttribute('selected', 'true')\n select.currentURI = uri\n // dump(\"Already in class: \"+ uri+\"\\n\")\n }\n select.appendChild(option)\n }\n if (editable && options.mint) {\n const mint = dom.createElement('option')\n mint.appendChild(dom.createTextNode(options.mint))\n mint.AJAR_mint = true // Flag it\n select.insertBefore(mint, select.firstChild)\n }\n if (select.currentURI == null && !options.multiple) {\n const prompt = dom.createElement('option')\n prompt.appendChild(dom.createTextNode(options.nullLabel))\n select.insertBefore(prompt, select.firstChild)\n prompt.selected = true\n }\n if (editable) {\n select.addEventListener('change', onChange, false)\n }\n return select\n} // makeSelectForClassifierOptions\n\n/** Make SELECT element to select options\n//\n// @param subject - a term, the subject of the statement(s) being edited.\n// @param predicate - a term, the predicate of the statement(s) being edited\n// @param possible - a list of terms, the possible value the object can take\n// @param options.nullLabel - a string to be displayed as the\n// option for none selected (for non multiple)\n// @param options.subForm - If mint, then the form to be used for minting the new thing\n// @param dataDoc - The web document being edited\n// @param callbackFunction - takes (boolean ok, string errorBody)\n*/\nexport function makeSelectForOptions (\n dom,\n kb,\n subject,\n predicate,\n possible,\n options,\n dataDoc,\n callbackFunction\n) {\n log.debug('Select list length now ' + possible.length)\n let n = 0\n const uris = {} // Count them\n const editable = kb.updater.editable(dataDoc.uri)\n\n for (let i = 0; i < possible.length; i++) {\n const sub = possible[i] // @@ Maybe; make this so it works with blank nodes too\n if (!sub.uri) debug.warn(`makeSelectForOptions: option does not have an uri: ${sub}, with predicate: ${predicate}`)\n if (!sub.uri || sub.uri in uris) continue\n uris[sub.uri] = true\n n++\n } // uris is now the set of possible options\n if (n === 0) {\n return errorMessageBlock(\n dom,\n 'Can\\'t do selector with no options, subject= ' +\n subject +\n ' property = ' +\n predicate +\n '.'\n )\n }\n\n log.debug('makeSelectForOptions: dataDoc=' + dataDoc)\n let actual\n const getActual = function () {\n actual = {}\n if (predicate.sameTerm(ns.rdf('type'))) {\n actual = kb.findTypeURIs(subject)\n } else {\n kb.each(subject, predicate, null, dataDoc).forEach(function (x) {\n if (x.uri) {\n actual[x.uri] = true\n }\n })\n }\n return actual\n }\n actual = getActual()\n\n const onChange = function (_e) {\n select.disabled = true // until data written back - gives user feedback too\n const ds = []\n const is = []\n const removeValue = function (t) {\n if (kb.holds(subject, predicate, t, dataDoc)) {\n ds.push($rdf.st(subject, predicate, t, dataDoc))\n }\n }\n for (let i = 0; i < select.options.length; i++) {\n const opt = select.options[i]\n if (!opt.AJAR_uri) continue // a prompt or mint\n if (opt.selected && !(opt.AJAR_uri in actual)) {\n // new class\n is.push($rdf.st(subject, predicate, kb.sym(opt.AJAR_uri), dataDoc))\n }\n if (!opt.selected && opt.AJAR_uri in actual) {\n // old class\n removeValue(kb.sym(opt.AJAR_uri))\n }\n if (opt.selected) select.currentURI = opt.AJAR_uri\n }\n let sel = select.subSelect // All subclasses must also go\n while (sel && sel.currentURI) {\n removeValue(kb.sym(sel.currentURI))\n sel = sel.subSelect\n }\n sel = select.superSelect // All superclasses are redundant\n while (sel && sel.currentURI) {\n removeValue(kb.sym(sel.currentURI))\n sel = sel.superSelect\n }\n log.info('selectForOptions: data doc = ' + dataDoc)\n kb.updater.update(ds, is, function (uri, ok, body) {\n actual = getActual() // refresh\n if (ok) {\n select.disabled = false // data written back\n } else {\n return select.parentNode.appendChild(errorMessageBlock(dom, 'Error updating data in select: ' + body))\n }\n if (callbackFunction) callbackFunction(ok, { widget: 'select', event: 'change' })\n })\n }\n\n const select = dom.createElement('select')\n select.setAttribute('style', style.formSelectStyle)\n select.currentURI = null\n\n select.refresh = function () {\n actual = getActual() // refresh\n for (let i = 0; i < select.children.length; i++) {\n const option = select.children[i]\n if (option.AJAR_uri) {\n option.selected = option.AJAR_uri in actual\n }\n }\n select.disabled = false // unlocked any conflict we had got into\n }\n\n for (const uri in uris) {\n const c = kb.sym(uri)\n const option = dom.createElement('option')\n if (options.disambiguate) {\n option.appendChild(dom.createTextNode(utils.labelWithOntology(c, true))) // Init. cap\n } else {\n option.appendChild(dom.createTextNode(utils.label(c, true))) // Init.\n }\n const backgroundColor = kb.any(\n c,\n kb.sym('http://www.w3.org/ns/ui#backgroundColor')\n )\n if (backgroundColor) {\n option.setAttribute(\n 'style',\n 'background-color: ' + backgroundColor.value + '; '\n )\n }\n option.AJAR_uri = uri\n if (uri in actual) {\n option.setAttribute('selected', 'true')\n select.currentURI = uri\n // dump(\"Already in class: \"+ uri+\"\\n\")\n }\n select.appendChild(option)\n }\n if (!select.currentURI) {\n const prompt = dom.createElement('option')\n prompt.appendChild(dom.createTextNode(options.nullLabel))\n select.insertBefore(prompt, select.firstChild)\n prompt.selected = true\n }\n if (editable) {\n select.addEventListener('change', onChange, false)\n }\n return select\n} // makeSelectForOptions\n\n// Make SELECT element to select subclasses\n//\n// If there is any disjoint union it will so a mutually exclusive dropdown\n// Failing that it will do a multiple selection of subclasses.\n// Callback takes (boolean ok, string errorBody)\n\nexport function makeSelectForCategory (\n dom,\n kb,\n subject,\n category,\n dataDoc,\n callbackFunction\n) {\n const du = kb.any(category, ns.owl('disjointUnionOf'))\n let subs\n let multiple = false\n if (!du) {\n subs = kb.each(undefined, ns.rdfs('subClassOf'), category)\n multiple = true\n } else {\n subs = du.elements\n }\n log.debug('Select list length ' + subs.length)\n if (subs.length === 0) {\n return errorMessageBlock(\n dom,\n 'Can\\'t do ' +\n (multiple ? 'multiple ' : '') +\n 'selector with no subclasses of category: ' +\n category\n )\n }\n if (subs.length === 1) {\n return errorMessageBlock(\n dom,\n 'Can\\'t do ' +\n (multiple ? 'multiple ' : '') +\n 'selector with only 1 subclass of category: ' +\n category +\n ':' +\n subs[1]\n )\n }\n return makeSelectForClassifierOptions(\n dom,\n kb,\n subject,\n ns.rdf('type'),\n subs,\n { multiple, nullLabel: '* Select type *' },\n dataDoc,\n callbackFunction\n )\n}\n\n/** Make SELECT element to select subclasses recurively\n//\n// It will so a mutually exclusive dropdown, with another if there are nested\n// disjoint unions.\n//\n// @param callbackFunction takes (boolean ok, string errorBody)\n*/\nexport function makeSelectForNestedCategory (\n dom,\n kb,\n subject,\n category,\n dataDoc,\n callbackFunction\n) {\n function update () {\n if (child) {\n container.removeChild(child)\n child = null\n }\n if (\n select.currentURI &&\n kb.any(kb.sym(select.currentURI), ns.owl('disjointUnionOf'))\n ) {\n child = makeSelectForNestedCategory(\n dom,\n kb,\n subject,\n kb.sym(select.currentURI),\n dataDoc,\n callbackFunction\n )\n select.subSelect = child.firstChild\n select.subSelect.superSelect = select\n container.appendChild(child)\n }\n }\n\n const container = dom.createElement('span') // Container\n let child = null\n\n function onChange (ok, body) {\n if (ok) update()\n callbackFunction(ok, body)\n }\n const select = makeSelectForCategory(\n dom,\n kb,\n subject,\n category,\n dataDoc,\n onChange\n )\n container.appendChild(select)\n update()\n return container\n}\n\n/* Build a checkbox from a given statement(s)\n **\n ** If the source document is editable, make the checkbox editable\n **\n ** ins and sel are either statements *or arrays of statements* which should be\n ** made if the checkbox is checed and unchecked respectively.\n ** tristate: Allow ins, or del, or neither\n */\nexport function buildCheckboxForm (dom, kb, lab, del, ins, form, dataDoc, tristate) {\n const box = dom.createElement('div')\n const rhs = renderNameValuePair(dom, kb, box, form, lab)\n const editable = kb.updater.editable(dataDoc.uri)\n\n const input = dom.createElement('button')\n const colorCarrier = input\n input.style = style.checkboxInputStyle\n rhs.appendChild(input)\n\n function fix (x) {\n if (!x) return [] // no statements\n if (x.object) {\n if (!x.why) {\n x.why = dataDoc // be back-compaitible with old code\n }\n return [x] // one statements\n }\n if (x instanceof Array) return x\n throw new Error('buildCheckboxForm: bad param ' + x)\n }\n ins = fix(ins)\n del = fix(del)\n\n function holdsAll (a) {\n const missing = a.filter(\n st => !kb.holds(st.subject, st.predicate, st.object, st.why)\n )\n return missing.length === 0\n }\n function refresh () {\n let state = holdsAll(ins)\n let displayState = state\n if (del.length) {\n const negation = holdsAll(del)\n if (state && negation) {\n box.appendChild(\n widgets.errorMessageBlock(\n dom,\n 'Inconsistent data in dataDoc!\\n' + ins + ' and\\n' + del\n )\n )\n return box\n }\n if (!state && !negation) {\n state = null\n const defa = kb.any(form, ns.ui('default'))\n displayState = defa ? defa.value === '1' : tristate ? null : false\n }\n }\n input.state = state\n input.textContent = {\n true: checkMarkCharacter,\n false: tristate ? cancelCharacter : ' ', // Just use blank when not tristate\n null: dashCharacter\n }[displayState]\n }\n\n refresh()\n if (!editable) return box\n\n let isUpdating = false // Prevent concurrent updates on double-click\n\n const boxHandler = function (_e) {\n if (isUpdating) {\n return // Ignore clicks while update is in progress\n }\n isUpdating = true\n input.disabled = true // Disable button to provide user feedback\n let didFinishUpdate = false\n const finishUpdate = function () {\n if (didFinishUpdate) return false\n didFinishUpdate = true\n isUpdating = false\n input.disabled = false\n return true\n }\n const showUpdateError = function (errorBody) {\n colorCarrier.style.color = '#000'\n colorCarrier.style.backgroundColor = '#fee'\n box.appendChild(\n errorMessageBlock(\n dom,\n `Checkbox: Error updating dataDoc from ${input.state} to ${\n input.newState\n }:\\n\\n${errorBody}`\n )\n )\n }\n colorCarrier.style.color = '#bbb' // grey -- not saved yet\n const toDelete = input.state === true ? ins : input.state === false ? del : []\n input.newState =\n input.state === null\n ? true\n : input.state === true\n ? false\n : tristate\n ? null\n : true\n\n const toInsert =\n input.newState === true ? ins : input.newState === false ? del : []\n debug.log(` Deleting ${toDelete}`)\n debug.log(` Inserting ${toInsert}`)\n try {\n const updateResult = kb.updater.update(toDelete, toInsert, function (\n uri,\n success,\n errorBody\n ) {\n if (!finishUpdate()) return\n if (!success) {\n if (toDelete.why) {\n const hmmm = kb.holds(\n toDelete.subject,\n toDelete.predicate,\n toDelete.object,\n toDelete.why\n )\n if (hmmm) {\n debug.log(' @@@@@ weird if 409 - does hold statement')\n }\n }\n showUpdateError(errorBody)\n } else {\n colorCarrier.style.color = '#000'\n input.state = input.newState\n input.textContent = {\n true: checkMarkCharacter,\n false: cancelCharacter,\n null: dashCharacter\n }[input.state] // @@\n }\n })\n if (updateResult && typeof updateResult.then === 'function') {\n updateResult\n .catch(function (error) {\n if (!finishUpdate()) return\n showUpdateError(error instanceof Error ? error.message : error)\n })\n .finally(function () {\n finishUpdate()\n })\n }\n } catch (error) {\n finishUpdate()\n throw error\n }\n }\n input.addEventListener('click', boxHandler, false)\n return box\n}\n/*\nexport function fieldLabel (dom, property, form) {\n let lab = kb.any(form, ns.ui('label'))\n if (!lab) lab = utils.label(property, true) // Init capital\n if (property === undefined) {\n return dom.createTextNode('@@Internal error: undefined property')\n }\n const anchor = dom.createElement('a')\n if (property.uri) anchor.setAttribute('href', property.uri)\n anchor.setAttribute('style', style.fieldLabelStyle) // Not too blue and no underline\n anchor.textContent = lab\n return anchor\n}\n\nexport function fieldStore (subject, predicate, def) {\n const sts = kb.statementsMatching(subject, predicate)\n if (sts.length === 0) return def // can used default as no data yet\n if (\n sts.length > 0 &&\n sts[0].why.uri &&\n kb.updater.editable(sts[0].why.uri)\n ) {\n return kb.sym(sts[0].why.uri)\n }\n return def\n}\n*/\n/** Mint local ID using timestamp\n * @param {NamedNode} doc - the document in which the ID is to be generated\n */\nexport function newThing (doc) {\n const now = new Date()\n return $rdf.sym(doc.uri + '#' + 'id' + ('' + now.getTime()))\n}\n\n/** Make SELECT element to select options\n//\n// @param subject - a term, the subject of the statement(s) being edited.\n// @param predicate - a term, the predicate of the statement(s) being edited\n// @param possible - a list of terms, the possible value the object can take\n// @param options.mint - User may create thing if this sent to the prompt string eg \"New foo\"\n// @param options.subForm - If mint, then the form to be used for minting the new thing\n// @param dataDoc - The web document being edited\n// @param callbackFunction - takes (boolean ok, string errorBody)\n*/\nexport function makeSelectForChoice (\n dom,\n container,\n kb,\n subject,\n predicate,\n inputPossibleOptions,\n selectedOptions,\n uiFrom,\n options,\n dataDoc,\n callbackFunction\n) {\n const optionsFromClassUIfrom = {} // Count them\n const editable = kb.updater.editable(dataDoc.uri)\n\n for (let i = 0; i < inputPossibleOptions.length; i++) {\n const sub = inputPossibleOptions[i] // @@ Maybe; make this so it works with blank nodes too\n // if (!sub.uri) debug.warn(`makeSelectForChoice: option does not have an uri: ${sub}, with predicate: ${predicate}`)\n if (!sub.uri || sub.uri in optionsFromClassUIfrom) continue\n optionsFromClassUIfrom[sub.uri] = true\n }\n const isEmpty = Object.keys(optionsFromClassUIfrom).length === 0\n if (isEmpty && !options.mint) {\n return errorMessageBlock(\n dom,\n 'Can\\'t do selector with no options, subject= ' +\n subject +\n ' property = ' +\n predicate +\n '.'\n )\n }\n\n log.debug('makeSelectForChoice: dataDoc=' + dataDoc)\n\n function createDefaultSelectOptionText () {\n let firstSelectOptionText = '--- choice ---'\n\n if (predicate && !(predicate.termType === 'BlankNode')) {\n firstSelectOptionText = '* Select for property: ' + utils.label(predicate) + ' *'\n }\n\n if (subject && !(subject.termType === 'BlankNode')) {\n firstSelectOptionText = '* Select for ' + utils.label(subject, true) + ' *'\n }\n return firstSelectOptionText\n }\n\n function createDefaultSelectOption () {\n const option = dom.createElement('option')\n option.appendChild(dom.createTextNode(createDefaultSelectOptionText()))\n option.disabled = true\n option.value = true\n option.hidden = true\n option.selected = true\n\n return option\n }\n\n const onChange = function (_e) {\n container.removeChild(container.lastChild)\n select.refresh()\n }\n\n const select = dom.createElement('select')\n select.setAttribute('style', style.formSelectStyle)\n select.setAttribute('id', 'formSelect')\n select.currentURI = null\n\n for (const uri in optionsFromClassUIfrom) {\n select.appendChild(createOption(uri))\n }\n\n if (editable && options.mint) {\n const mint = dom.createElement('option')\n mint.appendChild(dom.createTextNode(options.mint))\n mint.AJAR_mint = true // Flag it\n select.insertBefore(mint, select.firstChild)\n }\n\n if (select.children.length === 0) select.insertBefore(createDefaultSelectOption(), select.firstChild)\n\n select.update = function (newSelectedOptions) {\n selectedOptions = newSelectedOptions\n const ds = []\n const is = []\n const removeValue = function (t) {\n if (kb.holds(subject, predicate, t, dataDoc)) {\n ds.push($rdf.st(subject, predicate, t, dataDoc))\n }\n }\n\n const addValue = function (t) {\n if (!kb.holds(subject, predicate, t, dataDoc)) {\n is.push($rdf.st(subject, predicate, t, dataDoc))\n // console.log(\"----value added \" + t)\n }\n if (uiFrom && (!kb.holds(t, ns.rdf('type'), kb.sym(uiFrom), dataDoc))) {\n is.push($rdf.st(t, ns.rdf('type'), kb.sym(uiFrom), dataDoc))\n // console.log(\"----added type to value \" + uiFrom)\n }\n }\n\n const existingValues = kb.each(subject, predicate, null, dataDoc).map(object => object.value)\n for (const value of existingValues) {\n if (!containsObject(value, selectedOptions)) removeValue($rdf.sym(value))\n }\n for (const value of selectedOptions) {\n if (!(value in existingValues)) addValue($rdf.sym(value))\n }\n\n kb.updater.update(ds, is, function (uri, ok, body) {\n if (!ok) return select.parentNode.appendChild(errorMessageBlock(dom, 'Error updating data in select: ' + body))\n select.refresh()\n if (callbackFunction) callbackFunction(ok, { widget: 'select', event: 'change' })\n })\n }\n\n select.refresh = function () {\n select.disabled = true // unlocked any conflict we had got into\n let is = []\n\n let newObject\n for (let i = 0; i < select.options.length; i++) {\n const opt = select.options[i]\n if (opt.selected && opt.AJAR_mint) {\n // not sure if this 'if' is used because I cannot find mintClass\n if (options.mintClass) {\n const thisForm = promptForNew(\n dom,\n kb,\n subject,\n predicate,\n uiFrom,\n options.subForm,\n dataDoc,\n function (ok, body) {\n if (!ok) {\n callbackFunction(ok, body, { change: 'new' }) // @@ if ok, need some form of refresh of the select for the new thing\n }\n }\n )\n select.parentNode.appendChild(thisForm)\n newObject = thisForm.AJAR_subject\n } else {\n newObject = newThing(dataDoc)\n }\n is.push($rdf.st(subject, predicate, kb.sym(newObject), dataDoc))\n if (uiFrom) is.push($rdf.st(newObject, ns.rdf('type'), kb.sym(uiFrom), dataDoc))\n\n // not sure if this 'if' is used because I cannot find mintStatementsFun\n if (options.mintStatementsFun) {\n is = is.concat(options.mintStatementsFun(newObject))\n }\n select.currentURI = newObject\n }\n if (!opt.AJAR_uri) continue // a prompt or mint\n if (opt.selected && containsObject(opt.AJAR_uri, selectedOptions)) {\n select.currentURI = opt.AJAR_uri\n }\n if (!containsObject(opt.AJAR_uri, selectedOptions)) opt.removeAttribute('selected')\n if (containsObject(opt.AJAR_uri, selectedOptions)) opt.setAttribute('selected', 'true')\n }\n\n log.info('selectForOptions: data doc = ' + dataDoc)\n\n if (select.currentURI && options.subForm && !options.multiSelect) {\n addSubFormChoice(dom, container, {}, $rdf.sym(select.currentURI), options.subForm, dataDoc, function (ok, body) {\n if (ok) {\n kb.updater.update([], is, function (uri, success, errorBody) {\n if (!success) container.appendChild(errorMessageBlock(dom, 'Error updating select: ' + errorBody))\n })\n if (callbackFunction) callbackFunction(ok, { widget: 'select', event: 'new' })\n } else {\n container.appendChild(errorMessageBlock(dom, 'Error updating data in field of select: ' + body))\n }\n })\n }\n select.disabled = false\n }\n\n function createOption (uri) {\n const option = dom.createElement('option')\n const c = kb.sym(uri)\n let label\n if (options.disambiguate) {\n label = utils.labelWithOntology(c, true) // Init. cap\n } else {\n label = utils.label(c, true)\n }\n option.appendChild(dom.createTextNode(label)) // Init.\n option.setAttribute('value', uri)\n const backgroundColor = kb.any(\n c,\n kb.sym('http://www.w3.org/ns/ui#backgroundColor')\n )\n if (backgroundColor) {\n option.setAttribute(\n 'style',\n 'background-color: ' + backgroundColor.value + '; '\n )\n }\n option.AJAR_uri = uri\n if (containsObject(c.value, selectedOptions)) {\n option.setAttribute('selected', 'true')\n }\n return option\n }\n\n if (editable) {\n select.addEventListener('change', onChange, false)\n }\n\n return select\n} // makeSelectForChoice\n\nfunction containsObject (obj, list) {\n let i\n for (i = 0; i < list.length; i++) {\n if (list[i] === obj) {\n return true\n }\n }\n\n return false\n}\n\n// This functions replaces the findMembersNT (thisClass) from rdflib until we fix: https://github.com/linkeddata/rdflib.js/issues/565\n/**\n * For anything which has thisClass (or any subclass) as its type,\n * or is the object of something which has thisClass (or any subclass) as its range,\n * or subject of something which has thisClass (or any subclass) as its domain\n * We don't bother doing subproperty (yet?) as it doesn't seem to be used\n * much.\n * Get all the Classes of which we can RDFS-infer the subject is a member\n * @return a hash of URIs\n */\nfunction findMembersNT (store, thisClass, quad) {\n let len2\n let len4\n let m\n let pred\n let ref1\n let ref2\n let ref3\n let ref4\n let ref5\n let st\n let u\n const seeds = {}\n seeds[thisClass.toNT()] = true\n const members = {}\n const ref = store.transitiveClosure(seeds, store.rdfFactory.namedNode('http://www.w3.org/2000/01/rdf-schema#subClassOf'), true)\n for (const t in ref) {\n ref1 = store.statementsMatching(null,\n store.rdfFactory.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'),\n store.fromNT(t),\n quad)\n for (let i = 0, len = ref1.length; i < len; i++) {\n st = ref1[i]\n members[st.subject.toNT()] = st\n }\n ref2 = store.each(null,\n store.rdfFactory.namedNode('http://www.w3.org/2000/01/rdf-schema#domain'),\n store.fromNT(t),\n quad)\n for (let l = 0, len1 = ref2.length; l < len1; l++) {\n pred = ref2[l]\n ref3 = store.statementsMatching(null, pred, null, quad)\n for (m = 0, len2 = ref3.length; m < len2; m++) {\n st = ref3[m]\n members[st.subject.toNT()] = st\n }\n }\n ref4 = store.each(null,\n store.rdfFactory.namedNode('http://www.w3.org/2000/01/rdf-schema#range'),\n store.fromNT(t),\n quad)\n for (let q = 0, len3 = ref4.length; q < len3; q++) {\n pred = ref4[q]\n ref5 = store.statementsMatching(null, pred, null, quad)\n for (u = 0, len4 = ref5.length; u < len4; u++) {\n st = ref5[u]\n members[st.object.toNT()] = st\n }\n }\n }\n\n return members\n}\n","/**\n * General purpose utility functions used in the panes\n * oshani@csail.mit.edu\n *\n * Includes form-oriented widgets timbl@w3.org\n *\n * sign-in sign-up widgets are in signin.js\n *\n * Note... For pointers to posssible text-editing code, see\n * http://stackoverflow.com/questions/6756407/what-contenteditable-editors\n */\n\n// Each widget should ideally live in its own file. In order to break up this\n// monolithic widget index over time, we should add new widgets to the\n// 'lib/widgets/' directory, and re-export them by merging the module namespaces:\n//\n// (In order to avoid name collisions, it is safely assumed that modules don't\n// export widgets with the same name)\n\nexport * from './peoplePicker'\nexport * from './dragAndDrop'\nexport * from './buttons'\nexport * from './buttons/iconLinks'\nexport * from './error'\nexport * from './forms'\n\nexport * from './forms/autocomplete/autocompleteBar'\nexport * from './forms/autocomplete/autocompletePicker'\n\nexport * as publicData from './forms/autocomplete/publicData'\n\n/*\nimport * as peoplePicker from './peoplePicker'\nimport * as dragAndDrop from './dragAndDrop'\nimport * as buttons from './buttons'\nimport * as error from './error'\nimport { forms } from './forms'\n\nconst widgets = Object.assign(\n {},\n buttons,\n peoplePicker,\n dragAndDrop,\n error,\n forms\n)\n\n// export default widgets .. Policy is not to use exports default\nmodule.export = widgets // @@ Apparently no way to do this (yet?) in esm\nconsole.log('widgets exported:', widgets)\n*/\n// ends\n"],"ignoreList":[1,2,3,4,5,6,7,8,9],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|