lx-annotate 0.0.1__py3-none-any.whl
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.
- lx_annotate/__init__.py +0 -0
- lx_annotate/admin.py +1 -0
- lx_annotate/apps.py +42 -0
- lx_annotate/asgi.py +40 -0
- lx_annotate/auth_views.py +44 -0
- lx_annotate/file_watcher.py +559 -0
- lx_annotate/keycloak_auth.py +144 -0
- lx_annotate/management/__init__.py +1 -0
- lx_annotate/management/commands/__init__.py +1 -0
- lx_annotate/management/commands/export_route_manifest.py +138 -0
- lx_annotate/management/commands/run_filewatcher.py +30 -0
- lx_annotate/management/commands/start_filewatcher.py +1 -0
- lx_annotate/middleware/__init__.py +23 -0
- lx_annotate/middleware/lookup_tracker.py +122 -0
- lx_annotate/migration_overrides/__init__.py +1 -0
- lx_annotate/migration_overrides/endoreg_db/0001_initial.py +5 -0
- lx_annotate/migration_overrides/endoreg_db/0001_squashed_0001_initial.py +5408 -0
- lx_annotate/migration_overrides/endoreg_db/0002_export_flags.py +5 -0
- lx_annotate/migration_overrides/endoreg_db/0003_patientexaminationreport_report_and_more.py +7 -0
- lx_annotate/migration_overrides/endoreg_db/0004_videofile_uuid.py +48 -0
- lx_annotate/migration_overrides/endoreg_db/0005_rawpdffile_uuid.py +48 -0
- lx_annotate/migration_overrides/endoreg_db/0006_applicationsettings.py +5 -0
- lx_annotate/migration_overrides/endoreg_db/0007_pdfprocessinghistory.py +5 -0
- lx_annotate/migration_overrides/endoreg_db/0008_imageclassificationannotation_upsert_fields.py +15 -0
- lx_annotate/migration_overrides/endoreg_db/0009_patientexamination_draft_updated_at_and_more.py +98 -0
- lx_annotate/migration_overrides/endoreg_db/0010_remove_requirementset_reqset_exam_links_and_more.py +158 -0
- lx_annotate/migration_overrides/endoreg_db/0011_hub_ingest_metadata.py +19 -0
- lx_annotate/migration_overrides/endoreg_db/0012_networknode_transferjob.py +5 -0
- lx_annotate/migration_overrides/endoreg_db/0013_remove_legacy_requirement_models.py +5 -0
- lx_annotate/migration_overrides/endoreg_db/__init__.py +1 -0
- lx_annotate/run_gunicorn.py +29 -0
- lx_annotate/serializers.py +20 -0
- lx_annotate/settings/__init__.py +0 -0
- lx_annotate/settings/config.py +210 -0
- lx_annotate/settings/secret_key.py +40 -0
- lx_annotate/settings/settings_base.py +313 -0
- lx_annotate/settings/settings_dev.py +130 -0
- lx_annotate/settings/settings_prod.py +252 -0
- lx_annotate/settings/settings_test.py +156 -0
- lx_annotate/static/AnnotationDashboard-D35JYvrC.js +1 -0
- lx_annotate/static/AnnotationDashboard-DMZZ8ZMX.css +1 -0
- lx_annotate/static/AnnotationDashboard-OeFWLB-b.js +1 -0
- lx_annotate/static/Anonymization-Bd9LTm0-.js +1 -0
- lx_annotate/static/AnonymizationCorrectionComponent-BPyn1Euk.css +1 -0
- lx_annotate/static/AnonymizationCorrectionComponent-CAO-Cg0B.js +1 -0
- lx_annotate/static/AnonymizationOverview-CGBsqOFg.js +1 -0
- lx_annotate/static/AnonymizationOverview-DUuDRweL.css +1 -0
- lx_annotate/static/AnonymizationValidationComponent-BARZClvg.css +1 -0
- lx_annotate/static/AnonymizationValidationComponent-Bd7Ndg-z.js +1 -0
- lx_annotate/static/Dashboard-DsKQzZNG.js +1 -0
- lx_annotate/static/Examination-CeCEv25w.js +1 -0
- lx_annotate/static/PageOverview-B8gUoFeQ.js +1 -0
- lx_annotate/static/PatientAdder-BlwvntXl.js +1 -0
- lx_annotate/static/PatientAdder-CFDJpfd1.js +1 -0
- lx_annotate/static/PatientAdder-DOhN0oE-.css +1 -0
- lx_annotate/static/PatientOverview-C7XuyKPN.js +1 -0
- lx_annotate/static/PatientOverview-oorWuJjf.css +1 -0
- lx_annotate/static/Profil-lke9QkYz.js +1 -0
- lx_annotate/static/ReportGenerator-DJn6kaoO.js +1 -0
- lx_annotate/static/RequirementGenerator-BC9a09T1.css +1 -0
- lx_annotate/static/RequirementGenerator-CeDfg9J_.js +1 -0
- lx_annotate/static/Timeline-CMheelus.js +1 -0
- lx_annotate/static/Timeline-DA5RpACe.css +1 -0
- lx_annotate/static/UeberUns-DnTs7q1V.js +1 -0
- lx_annotate/static/Validierung-Bobt4Qg1.js +1 -0
- lx_annotate/static/Validierung-u-u0EBv0.css +1 -0
- lx_annotate/static/VideoExamination-B8b7SxA_.js +1 -0
- lx_annotate/static/VideoExamination-DdMsVSAF.css +1 -0
- lx_annotate/static/admin/css/autocomplete.css +279 -0
- lx_annotate/static/admin/css/base.css +1180 -0
- lx_annotate/static/admin/css/changelists.css +343 -0
- lx_annotate/static/admin/css/dark_mode.css +130 -0
- lx_annotate/static/admin/css/dashboard.css +29 -0
- lx_annotate/static/admin/css/forms.css +498 -0
- lx_annotate/static/admin/css/login.css +61 -0
- lx_annotate/static/admin/css/nav_sidebar.css +150 -0
- lx_annotate/static/admin/css/responsive.css +904 -0
- lx_annotate/static/admin/css/responsive_rtl.css +89 -0
- lx_annotate/static/admin/css/rtl.css +293 -0
- lx_annotate/static/admin/css/unusable_password_field.css +19 -0
- lx_annotate/static/admin/css/vendor/select2/LICENSE-SELECT2.md +21 -0
- lx_annotate/static/admin/css/vendor/select2/select2.css +481 -0
- lx_annotate/static/admin/css/vendor/select2/select2.min.css +1 -0
- lx_annotate/static/admin/css/widgets.css +613 -0
- lx_annotate/static/admin/img/LICENSE +20 -0
- lx_annotate/static/admin/img/README.txt +7 -0
- lx_annotate/static/admin/img/calendar-icons.svg +63 -0
- lx_annotate/static/admin/img/gis/move_vertex_off.svg +1 -0
- lx_annotate/static/admin/img/gis/move_vertex_on.svg +1 -0
- lx_annotate/static/admin/img/icon-addlink.svg +3 -0
- lx_annotate/static/admin/img/icon-alert.svg +3 -0
- lx_annotate/static/admin/img/icon-calendar.svg +9 -0
- lx_annotate/static/admin/img/icon-changelink.svg +3 -0
- lx_annotate/static/admin/img/icon-clock.svg +9 -0
- lx_annotate/static/admin/img/icon-deletelink.svg +3 -0
- lx_annotate/static/admin/img/icon-hidelink.svg +3 -0
- lx_annotate/static/admin/img/icon-no.svg +3 -0
- lx_annotate/static/admin/img/icon-unknown-alt.svg +3 -0
- lx_annotate/static/admin/img/icon-unknown.svg +3 -0
- lx_annotate/static/admin/img/icon-viewlink.svg +3 -0
- lx_annotate/static/admin/img/icon-yes.svg +3 -0
- lx_annotate/static/admin/img/inline-delete.svg +3 -0
- lx_annotate/static/admin/img/search.svg +3 -0
- lx_annotate/static/admin/img/selector-icons.svg +34 -0
- lx_annotate/static/admin/img/sorting-icons.svg +19 -0
- lx_annotate/static/admin/img/tooltag-add.svg +3 -0
- lx_annotate/static/admin/img/tooltag-arrowright.svg +3 -0
- lx_annotate/static/admin/js/SelectBox.js +116 -0
- lx_annotate/static/admin/js/SelectFilter2.js +311 -0
- lx_annotate/static/admin/js/actions.js +204 -0
- lx_annotate/static/admin/js/admin/DateTimeShortcuts.js +408 -0
- lx_annotate/static/admin/js/admin/RelatedObjectLookups.js +252 -0
- lx_annotate/static/admin/js/autocomplete.js +33 -0
- lx_annotate/static/admin/js/calendar.js +239 -0
- lx_annotate/static/admin/js/cancel.js +29 -0
- lx_annotate/static/admin/js/change_form.js +16 -0
- lx_annotate/static/admin/js/core.js +184 -0
- lx_annotate/static/admin/js/filters.js +30 -0
- lx_annotate/static/admin/js/inlines.js +359 -0
- lx_annotate/static/admin/js/jquery.init.js +8 -0
- lx_annotate/static/admin/js/nav_sidebar.js +79 -0
- lx_annotate/static/admin/js/popup_response.js +15 -0
- lx_annotate/static/admin/js/prepopulate.js +43 -0
- lx_annotate/static/admin/js/prepopulate_init.js +15 -0
- lx_annotate/static/admin/js/theme.js +51 -0
- lx_annotate/static/admin/js/unusable_password_field.js +29 -0
- lx_annotate/static/admin/js/urlify.js +169 -0
- lx_annotate/static/admin/js/vendor/jquery/LICENSE.txt +20 -0
- lx_annotate/static/admin/js/vendor/jquery/jquery.js +10716 -0
- lx_annotate/static/admin/js/vendor/jquery/jquery.min.js +2 -0
- lx_annotate/static/admin/js/vendor/select2/LICENSE.md +21 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/af.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/ar.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/az.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/bg.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/bn.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/bs.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/ca.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/cs.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/da.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/de.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/dsb.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/el.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/en.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/es.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/et.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/eu.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/fa.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/fi.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/fr.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/gl.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/he.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/hi.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/hr.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/hsb.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/hu.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/hy.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/id.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/is.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/it.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/ja.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/ka.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/km.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/ko.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/lt.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/lv.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/mk.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/ms.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/nb.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/ne.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/nl.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/pl.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/ps.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/pt-BR.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/pt.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/ro.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/ru.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/sk.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/sl.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/sq.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/sr-Cyrl.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/sr.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/sv.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/th.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/tk.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/tr.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/uk.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/vi.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/zh-CN.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/i18n/zh-TW.js +3 -0
- lx_annotate/static/admin/js/vendor/select2/select2.full.js +6820 -0
- lx_annotate/static/admin/js/vendor/select2/select2.full.min.js +2 -0
- lx_annotate/static/admin/js/vendor/xregexp/LICENSE.txt +21 -0
- lx_annotate/static/admin/js/vendor/xregexp/xregexp.js +6126 -0
- lx_annotate/static/admin/js/vendor/xregexp/xregexp.min.js +17 -0
- lx_annotate/static/annotationStore-DEHKjdKh.js +1 -0
- lx_annotate/static/assets/AnnotationDashboard-D35JYvrC.js +1 -0
- lx_annotate/static/assets/AnnotationDashboard-DMZZ8ZMX.css +1 -0
- lx_annotate/static/assets/AnnotationDashboard-OeFWLB-b.js +1 -0
- lx_annotate/static/assets/Anonymization-Bd9LTm0-.js +1 -0
- lx_annotate/static/assets/AnonymizationCorrectionComponent-BPyn1Euk.css +1 -0
- lx_annotate/static/assets/AnonymizationCorrectionComponent-CAO-Cg0B.js +1 -0
- lx_annotate/static/assets/AnonymizationOverview-CGBsqOFg.js +1 -0
- lx_annotate/static/assets/AnonymizationOverview-DUuDRweL.css +1 -0
- lx_annotate/static/assets/AnonymizationValidationComponent-BARZClvg.css +1 -0
- lx_annotate/static/assets/AnonymizationValidationComponent-Bd7Ndg-z.js +1 -0
- lx_annotate/static/assets/Dashboard-DsKQzZNG.js +1 -0
- lx_annotate/static/assets/Examination-CeCEv25w.js +1 -0
- lx_annotate/static/assets/PageOverview-B8gUoFeQ.js +1 -0
- lx_annotate/static/assets/PatientAdder-BlwvntXl.js +1 -0
- lx_annotate/static/assets/PatientAdder-CFDJpfd1.js +1 -0
- lx_annotate/static/assets/PatientAdder-DOhN0oE-.css +1 -0
- lx_annotate/static/assets/PatientOverview-C7XuyKPN.js +1 -0
- lx_annotate/static/assets/PatientOverview-oorWuJjf.css +1 -0
- lx_annotate/static/assets/Profil-lke9QkYz.js +1 -0
- lx_annotate/static/assets/ReportGenerator-DJn6kaoO.js +1 -0
- lx_annotate/static/assets/RequirementGenerator-BC9a09T1.css +1 -0
- lx_annotate/static/assets/RequirementGenerator-CeDfg9J_.js +1 -0
- lx_annotate/static/assets/Timeline-CMheelus.js +1 -0
- lx_annotate/static/assets/Timeline-DA5RpACe.css +1 -0
- lx_annotate/static/assets/UeberUns-DnTs7q1V.js +1 -0
- lx_annotate/static/assets/Validierung-Bobt4Qg1.js +1 -0
- lx_annotate/static/assets/Validierung-u-u0EBv0.css +1 -0
- lx_annotate/static/assets/VideoExamination-B8b7SxA_.js +1 -0
- lx_annotate/static/assets/VideoExamination-DdMsVSAF.css +1 -0
- lx_annotate/static/assets/annotationStore-DEHKjdKh.js +1 -0
- lx_annotate/static/assets/authStore-w8taChNC.js +1 -0
- lx_annotate/static/assets/base.css +86 -0
- lx_annotate/static/assets/css/material-dashboard.css +27935 -0
- lx_annotate/static/assets/css/material-dashboard.css.map +360 -0
- lx_annotate/static/assets/css/material-dashboard.min.css +42 -0
- lx_annotate/static/assets/css/nucleo-icons.css +597 -0
- lx_annotate/static/assets/css/nucleo-svg.css +135 -0
- lx_annotate/static/assets/fonts/nucleo-icons.eot +0 -0
- lx_annotate/static/assets/fonts/nucleo-icons.svg +312 -0
- lx_annotate/static/assets/fonts/nucleo-icons.ttf +0 -0
- lx_annotate/static/assets/fonts/nucleo-icons.woff +0 -0
- lx_annotate/static/assets/fonts/nucleo-icons.woff2 +0 -0
- lx_annotate/static/assets/fonts/nucleo.eot +0 -0
- lx_annotate/static/assets/fonts/nucleo.ttf +0 -0
- lx_annotate/static/assets/fonts/nucleo.woff +0 -0
- lx_annotate/static/assets/fonts/nucleo.woff2 +0 -0
- lx_annotate/static/assets/js/core/bootstrap.bundle.min.js +6 -0
- lx_annotate/static/assets/js/core/bootstrap.min.js +6 -0
- lx_annotate/static/assets/js/core/popper.min.js +4 -0
- lx_annotate/static/assets/js/material-dashboard.js +879 -0
- lx_annotate/static/assets/js/material-dashboard.js.map +1 -0
- lx_annotate/static/assets/js/material-dashboard.min.js +17 -0
- lx_annotate/static/assets/js/plugins/Chart.extension.js +130 -0
- lx_annotate/static/assets/js/plugins/bootstrap-notify.js +432 -0
- lx_annotate/static/assets/js/plugins/chartjs.min.js +13 -0
- lx_annotate/static/assets/js/plugins/countup.min.js +1 -0
- lx_annotate/static/assets/js/plugins/get_annotations.js +49 -0
- lx_annotate/static/assets/js/plugins/perfect-scrollbar.min.js +19 -0
- lx_annotate/static/assets/js/plugins/random-name-generator.js +81 -0
- lx_annotate/static/assets/js/plugins/smooth-scrollbar.min.js +25 -0
- lx_annotate/static/assets/js/plugins/submission-handler.js +73 -0
- lx_annotate/static/assets/js/plugins/world.js +2464 -0
- lx_annotate/static/assets/logo.svg +1 -0
- lx_annotate/static/assets/main-DGGk9Vng.css +37 -0
- lx_annotate/static/assets/main-DethiONo.js +36 -0
- lx_annotate/static/assets/main.css +32 -0
- lx_annotate/static/assets/mediaTypeStore-D6KIykKn.js +1 -0
- lx_annotate/static/assets/nucleo-icons-BgnVbBvX.eot +0 -0
- lx_annotate/static/assets/nucleo-icons-BuEzPWOc.woff +0 -0
- lx_annotate/static/assets/nucleo-icons-C6OFysxg.svg +312 -0
- lx_annotate/static/assets/nucleo-icons-CTnIBWcu.woff2 +0 -0
- lx_annotate/static/assets/nucleo-icons-kNTzvw2K.ttf +0 -0
- lx_annotate/static/assets/patientStore-BazAFCNw.js +1 -0
- lx_annotate/static/assets/scss/material-dashboard/_alert.scss +17 -0
- lx_annotate/static/assets/scss/material-dashboard/_avatars.scss +123 -0
- lx_annotate/static/assets/scss/material-dashboard/_badge.scss +8 -0
- lx_annotate/static/assets/scss/material-dashboard/_breadcrumbs.scss +48 -0
- lx_annotate/static/assets/scss/material-dashboard/_buttons.scss +191 -0
- lx_annotate/static/assets/scss/material-dashboard/_cards.scss +60 -0
- lx_annotate/static/assets/scss/material-dashboard/_dark-version.scss +281 -0
- lx_annotate/static/assets/scss/material-dashboard/_dropdown.scss +292 -0
- lx_annotate/static/assets/scss/material-dashboard/_dropup.scss +41 -0
- lx_annotate/static/assets/scss/material-dashboard/_fixed-plugin.scss +60 -0
- lx_annotate/static/assets/scss/material-dashboard/_footer.scss +17 -0
- lx_annotate/static/assets/scss/material-dashboard/_forms.scss +49 -0
- lx_annotate/static/assets/scss/material-dashboard/_gradients.scss +18 -0
- lx_annotate/static/assets/scss/material-dashboard/_header.scss +25 -0
- lx_annotate/static/assets/scss/material-dashboard/_icons.scss +32 -0
- lx_annotate/static/assets/scss/material-dashboard/_info-areas.scss +178 -0
- lx_annotate/static/assets/scss/material-dashboard/_misc.scss +442 -0
- lx_annotate/static/assets/scss/material-dashboard/_nav.scss +123 -0
- lx_annotate/static/assets/scss/material-dashboard/_navbar-vertical.scss +725 -0
- lx_annotate/static/assets/scss/material-dashboard/_navbar.scss +220 -0
- lx_annotate/static/assets/scss/material-dashboard/_pagination.scss +58 -0
- lx_annotate/static/assets/scss/material-dashboard/_popovers.scss +10 -0
- lx_annotate/static/assets/scss/material-dashboard/_progress.scss +15 -0
- lx_annotate/static/assets/scss/material-dashboard/_ripple.scss +15 -0
- lx_annotate/static/assets/scss/material-dashboard/_rtl.scss +125 -0
- lx_annotate/static/assets/scss/material-dashboard/_social-buttons.scss +42 -0
- lx_annotate/static/assets/scss/material-dashboard/_tables.scss +53 -0
- lx_annotate/static/assets/scss/material-dashboard/_tilt.scss +11 -0
- lx_annotate/static/assets/scss/material-dashboard/_timeline.scss +137 -0
- lx_annotate/static/assets/scss/material-dashboard/_tooltips.scss +9 -0
- lx_annotate/static/assets/scss/material-dashboard/_typography.scss +301 -0
- lx_annotate/static/assets/scss/material-dashboard/_utilities-extend.scss +11 -0
- lx_annotate/static/assets/scss/material-dashboard/_utilities.scss +837 -0
- lx_annotate/static/assets/scss/material-dashboard/_variables.scss +1674 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_accordion.scss +149 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_alert.scss +71 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_badge.scss +38 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_breadcrumb.scss +40 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_button-group.scss +142 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_buttons.scss +207 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_card.scss +234 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_carousel.scss +226 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_close.scss +40 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_containers.scss +41 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_dropdown.scss +249 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_forms.scss +9 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_functions.scss +302 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_grid.scss +33 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_helpers.scss +10 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_images.scss +42 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_list-group.scss +192 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_maps.scss +54 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_mixins.scss +43 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_modal.scss +237 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_nav.scss +172 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_navbar.scss +278 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_offcanvas.scss +144 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_pagination.scss +109 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_placeholders.scss +51 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_popover.scss +196 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_progress.scss +59 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_reboot.scss +610 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_root.scss +73 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_spinners.scss +85 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_tables.scss +164 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_toasts.scss +73 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_tooltip.scss +120 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_transitions.scss +27 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_type.scss +106 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_utilities.scss +647 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/_variables.scss +1634 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/bootstrap-grid.scss +64 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/bootstrap-reboot.scss +9 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/bootstrap-utilities.scss +18 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/bootstrap.scss +51 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/forms/_floating-labels.scss +75 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/forms/_form-check.scss +175 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/forms/_form-control.scss +194 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/forms/_form-range.scss +91 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/forms/_form-select.scss +71 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/forms/_form-text.scss +11 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/forms/_input-group.scss +132 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/forms/_labels.scss +36 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/forms/_validation.scss +12 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_clearfix.scss +3 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_color-bg.scss +10 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_colored-links.scss +12 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_position.scss +36 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_ratio.scss +26 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_stacks.scss +15 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_stretched-link.scss +15 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_text-truncation.scss +7 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_visually-hidden.scss +8 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_vr.scss +8 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_alert.scss +15 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_backdrop.scss +14 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_banner.scss +9 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_border-radius.scss +78 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_box-shadow.scss +18 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_breakpoints.scss +127 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_buttons.scss +70 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_caret.scss +64 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_clearfix.scss +9 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_color-scheme.scss +7 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_container.scss +11 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_deprecate.scss +10 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_forms.scss +152 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_gradients.scss +47 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_grid.scss +151 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_image.scss +16 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_list-group.scss +24 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_lists.scss +7 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_pagination.scss +10 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_reset-text.scss +17 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_resize.scss +6 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_table-variants.scss +24 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_text-truncate.scss +8 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_transition.scss +26 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_utilities.scss +97 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_visually-hidden.scss +29 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/utilities/_api.scss +47 -0
- lx_annotate/static/assets/scss/material-dashboard/bootstrap/vendor/_rfs.scss +354 -0
- lx_annotate/static/assets/scss/material-dashboard/cards/card-background.scss +81 -0
- lx_annotate/static/assets/scss/material-dashboard/cards/card-rotate.scss +148 -0
- lx_annotate/static/assets/scss/material-dashboard/custom/_styles.scss +0 -0
- lx_annotate/static/assets/scss/material-dashboard/custom/_variables.scss +0 -0
- lx_annotate/static/assets/scss/material-dashboard/forms/_form-check.scss +91 -0
- lx_annotate/static/assets/scss/material-dashboard/forms/_form-select.scss +3 -0
- lx_annotate/static/assets/scss/material-dashboard/forms/_form-switch.scss +43 -0
- lx_annotate/static/assets/scss/material-dashboard/forms/_forms.scss +6 -0
- lx_annotate/static/assets/scss/material-dashboard/forms/_input-group.scss +312 -0
- lx_annotate/static/assets/scss/material-dashboard/forms/_inputs.scss +47 -0
- lx_annotate/static/assets/scss/material-dashboard/forms/_labels.scss +21 -0
- lx_annotate/static/assets/scss/material-dashboard/mixins/_badge.scss +12 -0
- lx_annotate/static/assets/scss/material-dashboard/mixins/_buttons.scss +12 -0
- lx_annotate/static/assets/scss/material-dashboard/mixins/_colored-shadows.scss +5 -0
- lx_annotate/static/assets/scss/material-dashboard/mixins/_hover.scss +27 -0
- lx_annotate/static/assets/scss/material-dashboard/mixins/_social-buttons.scss +46 -0
- lx_annotate/static/assets/scss/material-dashboard/mixins/_vendor.scss +58 -0
- lx_annotate/static/assets/scss/material-dashboard/mixins/mixins.scss +6 -0
- lx_annotate/static/assets/scss/material-dashboard/plugins/free/_flatpickr.scss +878 -0
- lx_annotate/static/assets/scss/material-dashboard/plugins/free/_nouislider.scss +298 -0
- lx_annotate/static/assets/scss/material-dashboard/plugins/free/_perfect-scrollbar.scss +116 -0
- lx_annotate/static/assets/scss/material-dashboard/plugins/free/_prism.scss +142 -0
- lx_annotate/static/assets/scss/material-dashboard/plugins/free/plugins.scss +4 -0
- lx_annotate/static/assets/scss/material-dashboard/theme.scss +63 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_animations.scss +45 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_avatars.scss +28 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_badge.scss +40 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_breadcrumb.scss +5 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_cards-extend.scss +28 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_cards.scss +65 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_choices.scss +8 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_dark-version.scss +9 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_dropdowns.scss +53 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_fixed-plugin.scss +7 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_form-switch.scss +3 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_full-calendar.scss +6 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_header.scss +24 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_info-areas.scss +32 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_misc-extend.scss +48 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_misc.scss +59 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_navbar-vertical.scss +65 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_navbar.scss +17 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_pagination.scss +19 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_ripple.scss +32 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_rtl.scss +1 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_social-buttons.scss +28 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_table.scss +19 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_timeline.scss +20 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_utilities-extend.scss +32 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_utilities.scss +195 -0
- lx_annotate/static/assets/scss/material-dashboard/variables/_virtual-reality.scss +5 -0
- lx_annotate/static/assets/scss/material-dashboard.scss +30 -0
- lx_annotate/static/assets/usePollingProtection-5vxQa-Ko.js +1 -0
- lx_annotate/static/assets/videoStore-ClqdABXQ.js +2 -0
- lx_annotate/static/authStore-w8taChNC.js +1 -0
- lx_annotate/static/base.css +86 -0
- lx_annotate/static/css/material-dashboard.css +27935 -0
- lx_annotate/static/css/material-dashboard.css.map +360 -0
- lx_annotate/static/css/material-dashboard.min.css +42 -0
- lx_annotate/static/css/nucleo-icons.css +597 -0
- lx_annotate/static/css/nucleo-svg.css +135 -0
- lx_annotate/static/django_extensions/css/jquery.autocomplete.css +38 -0
- lx_annotate/static/django_extensions/img/indicator.gif +0 -0
- lx_annotate/static/django_extensions/js/jquery.ajaxQueue.js +116 -0
- lx_annotate/static/django_extensions/js/jquery.autocomplete.js +1152 -0
- lx_annotate/static/django_extensions/js/jquery.bgiframe.js +39 -0
- lx_annotate/static/fonts/nucleo-icons.eot +0 -0
- lx_annotate/static/fonts/nucleo-icons.svg +312 -0
- lx_annotate/static/fonts/nucleo-icons.ttf +0 -0
- lx_annotate/static/fonts/nucleo-icons.woff +0 -0
- lx_annotate/static/fonts/nucleo-icons.woff2 +0 -0
- lx_annotate/static/fonts/nucleo.eot +0 -0
- lx_annotate/static/fonts/nucleo.ttf +0 -0
- lx_annotate/static/fonts/nucleo.woff +0 -0
- lx_annotate/static/fonts/nucleo.woff2 +0 -0
- lx_annotate/static/img/ColoReg.png +0 -0
- lx_annotate/static/img/Universitaetsklinikum_Wuerzburg.jpg +0 -0
- lx_annotate/static/img/ag_lux_logo_light_grey.svg +1 -0
- lx_annotate/static/img/apple-icon.png +0 -0
- lx_annotate/static/img/bg-pricing.jpg +0 -0
- lx_annotate/static/img/bg-smart-home-1.jpg +0 -0
- lx_annotate/static/img/bg-smart-home-2.jpg +0 -0
- lx_annotate/static/img/bruce-mars.jpg +0 -0
- lx_annotate/static/img/down-arrow-dark.svg +11 -0
- lx_annotate/static/img/down-arrow-white.svg +1 -0
- lx_annotate/static/img/down-arrow.svg +11 -0
- lx_annotate/static/img/drake.jpg +0 -0
- lx_annotate/static/img/favicon.png +0 -0
- lx_annotate/static/img/frames_demo/frame1.jpg +0 -0
- lx_annotate/static/img/frames_demo/frame2.jpg +0 -0
- lx_annotate/static/img/frames_demo/frame3.jpg +0 -0
- lx_annotate/static/img/frames_demo/frame4.jpg +0 -0
- lx_annotate/static/img/home-decor-1.jpg +0 -0
- lx_annotate/static/img/home-decor-2.jpg +0 -0
- lx_annotate/static/img/home-decor-3.jpg +0 -0
- lx_annotate/static/img/icons/flags/AU.png +0 -0
- lx_annotate/static/img/icons/flags/BR.png +0 -0
- lx_annotate/static/img/icons/flags/DE.png +0 -0
- lx_annotate/static/img/icons/flags/GB.png +0 -0
- lx_annotate/static/img/icons/flags/US.png +0 -0
- lx_annotate/static/img/illustrations/chat.png +0 -0
- lx_annotate/static/img/illustrations/danger-chat-ill.png +0 -0
- lx_annotate/static/img/illustrations/dark-lock-ill.png +0 -0
- lx_annotate/static/img/illustrations/error-404.png +0 -0
- lx_annotate/static/img/illustrations/error-500.png +0 -0
- lx_annotate/static/img/illustrations/illustration-lock.jpg +0 -0
- lx_annotate/static/img/illustrations/illustration-reset.jpg +0 -0
- lx_annotate/static/img/illustrations/illustration-signin.jpg +0 -0
- lx_annotate/static/img/illustrations/illustration-signup.jpg +0 -0
- lx_annotate/static/img/illustrations/illustration-verification.jpg +0 -0
- lx_annotate/static/img/illustrations/lock.png +0 -0
- lx_annotate/static/img/illustrations/pattern-tree.svg +20 -0
- lx_annotate/static/img/illustrations/rocket-white.png +0 -0
- lx_annotate/static/img/ivana-square.jpg +0 -0
- lx_annotate/static/img/ivana-squares.jpg +0 -0
- lx_annotate/static/img/ivancik.jpg +0 -0
- lx_annotate/static/img/kal-visuals-square.jpg +0 -0
- lx_annotate/static/img/logo-ct-dark.png +0 -0
- lx_annotate/static/img/logo-ct.png +0 -0
- lx_annotate/static/img/logos/ag_lux_logo_light_grey.svg +1 -0
- lx_annotate/static/img/logos/ag_lux_logo_white.svg +1 -0
- lx_annotate/static/img/logos/gray-logos/logo-coinbase.svg +16 -0
- lx_annotate/static/img/logos/gray-logos/logo-nasa.svg +9 -0
- lx_annotate/static/img/logos/gray-logos/logo-netflix.svg +9 -0
- lx_annotate/static/img/logos/gray-logos/logo-pinterest.svg +9 -0
- lx_annotate/static/img/logos/gray-logos/logo-spotify.svg +9 -0
- lx_annotate/static/img/logos/gray-logos/logo-vodafone.svg +9 -0
- lx_annotate/static/img/logos/mastercard.png +0 -0
- lx_annotate/static/img/logos/visa.png +0 -0
- lx_annotate/static/img/marie.jpg +0 -0
- lx_annotate/static/img/meeting.jpg +0 -0
- lx_annotate/static/img/office-dark.jpg +0 -0
- lx_annotate/static/img/product-12.jpg +0 -0
- lx_annotate/static/img/products/product-1-min.jpg +0 -0
- lx_annotate/static/img/products/product-11.jpg +0 -0
- lx_annotate/static/img/products/product-2-min.jpg +0 -0
- lx_annotate/static/img/products/product-3-min.jpg +0 -0
- lx_annotate/static/img/products/product-4-min.jpg +0 -0
- lx_annotate/static/img/products/product-5-min.jpg +0 -0
- lx_annotate/static/img/products/product-6-min.jpg +0 -0
- lx_annotate/static/img/products/product-7-min.jpg +0 -0
- lx_annotate/static/img/products/product-details-1.jpg +0 -0
- lx_annotate/static/img/products/product-details-2.jpg +0 -0
- lx_annotate/static/img/products/product-details-3.jpg +0 -0
- lx_annotate/static/img/products/product-details-4.jpg +0 -0
- lx_annotate/static/img/products/product-details-5.jpg +0 -0
- lx_annotate/static/img/shapes/pattern-lines.svg +91 -0
- lx_annotate/static/img/shapes/waves-white.svg +324 -0
- lx_annotate/static/img/small-logos/bootstrap.svg +9 -0
- lx_annotate/static/img/small-logos/creative-tim.svg +7 -0
- lx_annotate/static/img/small-logos/devto.svg +9 -0
- lx_annotate/static/img/small-logos/github.svg +10 -0
- lx_annotate/static/img/small-logos/google-webdev.svg +11 -0
- lx_annotate/static/img/small-logos/icon-bulb.svg +37 -0
- lx_annotate/static/img/small-logos/icon-sun-cloud.png +0 -0
- lx_annotate/static/img/small-logos/logo-asana.svg +16 -0
- lx_annotate/static/img/small-logos/logo-atlassian.svg +16 -0
- lx_annotate/static/img/small-logos/logo-invision.svg +10 -0
- lx_annotate/static/img/small-logos/logo-jira.svg +21 -0
- lx_annotate/static/img/small-logos/logo-slack.svg +12 -0
- lx_annotate/static/img/small-logos/logo-spotify.svg +9 -0
- lx_annotate/static/img/small-logos/logo-xd.svg +11 -0
- lx_annotate/static/img/team-1.jpg +0 -0
- lx_annotate/static/img/team-2.jpg +0 -0
- lx_annotate/static/img/team-3.jpg +0 -0
- lx_annotate/static/img/team-4.jpg +0 -0
- lx_annotate/static/img/team-5.jpg +0 -0
- lx_annotate/static/img/tesla-model-s.png +0 -0
- lx_annotate/static/img/vr-bg.jpg +0 -0
- lx_annotate/static/js/core/bootstrap.bundle.min.js +6 -0
- lx_annotate/static/js/core/bootstrap.min.js +6 -0
- lx_annotate/static/js/core/popper.min.js +4 -0
- lx_annotate/static/js/material-dashboard.js +879 -0
- lx_annotate/static/js/material-dashboard.js.map +1 -0
- lx_annotate/static/js/material-dashboard.min.js +17 -0
- lx_annotate/static/js/plugins/Chart.extension.js +130 -0
- lx_annotate/static/js/plugins/bootstrap-notify.js +432 -0
- lx_annotate/static/js/plugins/chartjs.min.js +13 -0
- lx_annotate/static/js/plugins/countup.min.js +1 -0
- lx_annotate/static/js/plugins/get_annotations.js +49 -0
- lx_annotate/static/js/plugins/perfect-scrollbar.min.js +19 -0
- lx_annotate/static/js/plugins/random-name-generator.js +81 -0
- lx_annotate/static/js/plugins/smooth-scrollbar.min.js +25 -0
- lx_annotate/static/js/plugins/submission-handler.js +73 -0
- lx_annotate/static/js/plugins/world.js +2464 -0
- lx_annotate/static/logo.svg +1 -0
- lx_annotate/static/main-DGGk9Vng.css +37 -0
- lx_annotate/static/main-DethiONo.js +36 -0
- lx_annotate/static/main.css +32 -0
- lx_annotate/static/mediaTypeStore-D6KIykKn.js +1 -0
- lx_annotate/static/modeltranslation/css/tabbed_translation_fields.css +101 -0
- lx_annotate/static/modeltranslation/js/clearable_inputs.js +19 -0
- lx_annotate/static/modeltranslation/js/force_jquery.js +3 -0
- lx_annotate/static/modeltranslation/js/tabbed_translation_fields.js +549 -0
- lx_annotate/static/nucleo-icons-BgnVbBvX.eot +0 -0
- lx_annotate/static/nucleo-icons-BuEzPWOc.woff +0 -0
- lx_annotate/static/nucleo-icons-C6OFysxg.svg +312 -0
- lx_annotate/static/nucleo-icons-CTnIBWcu.woff2 +0 -0
- lx_annotate/static/nucleo-icons-kNTzvw2K.ttf +0 -0
- lx_annotate/static/patientStore-BazAFCNw.js +1 -0
- lx_annotate/static/rest_framework/css/bootstrap-theme.min.css +6 -0
- lx_annotate/static/rest_framework/css/bootstrap-theme.min.css.map +1 -0
- lx_annotate/static/rest_framework/css/bootstrap-tweaks.css +237 -0
- lx_annotate/static/rest_framework/css/bootstrap.min.css +6 -0
- lx_annotate/static/rest_framework/css/bootstrap.min.css.map +1 -0
- lx_annotate/static/rest_framework/css/default.css +82 -0
- lx_annotate/static/rest_framework/css/font-awesome-4.0.3.css +1338 -0
- lx_annotate/static/rest_framework/css/prettify.css +30 -0
- lx_annotate/static/rest_framework/docs/css/base.css +359 -0
- lx_annotate/static/rest_framework/docs/css/highlight.css +125 -0
- lx_annotate/static/rest_framework/docs/css/jquery.json-view.min.css +11 -0
- lx_annotate/static/rest_framework/docs/img/favicon.ico +0 -0
- lx_annotate/static/rest_framework/docs/img/grid.png +0 -0
- lx_annotate/static/rest_framework/docs/js/api.js +315 -0
- lx_annotate/static/rest_framework/docs/js/highlight.pack.js +2 -0
- lx_annotate/static/rest_framework/docs/js/jquery.json-view.min.js +7 -0
- lx_annotate/static/rest_framework/fonts/fontawesome-webfont.eot +0 -0
- lx_annotate/static/rest_framework/fonts/fontawesome-webfont.svg +414 -0
- lx_annotate/static/rest_framework/fonts/fontawesome-webfont.ttf +0 -0
- lx_annotate/static/rest_framework/fonts/fontawesome-webfont.woff +0 -0
- lx_annotate/static/rest_framework/fonts/glyphicons-halflings-regular.eot +0 -0
- lx_annotate/static/rest_framework/fonts/glyphicons-halflings-regular.svg +288 -0
- lx_annotate/static/rest_framework/fonts/glyphicons-halflings-regular.ttf +0 -0
- lx_annotate/static/rest_framework/fonts/glyphicons-halflings-regular.woff +0 -0
- lx_annotate/static/rest_framework/fonts/glyphicons-halflings-regular.woff2 +0 -0
- lx_annotate/static/rest_framework/img/glyphicons-halflings-white.png +0 -0
- lx_annotate/static/rest_framework/img/glyphicons-halflings.png +0 -0
- lx_annotate/static/rest_framework/img/grid.png +0 -0
- lx_annotate/static/rest_framework/js/ajax-form.js +133 -0
- lx_annotate/static/rest_framework/js/bootstrap.min.js +6 -0
- lx_annotate/static/rest_framework/js/coreapi-0.1.1.js +2043 -0
- lx_annotate/static/rest_framework/js/csrf.js +53 -0
- lx_annotate/static/rest_framework/js/default.js +47 -0
- lx_annotate/static/rest_framework/js/jquery-3.7.1.min.js +2 -0
- lx_annotate/static/rest_framework/js/load-ajax-form.js +3 -0
- lx_annotate/static/rest_framework/js/prettify-min.js +28 -0
- lx_annotate/static/scss/material-dashboard/_alert.scss +17 -0
- lx_annotate/static/scss/material-dashboard/_avatars.scss +123 -0
- lx_annotate/static/scss/material-dashboard/_badge.scss +8 -0
- lx_annotate/static/scss/material-dashboard/_breadcrumbs.scss +48 -0
- lx_annotate/static/scss/material-dashboard/_buttons.scss +191 -0
- lx_annotate/static/scss/material-dashboard/_cards.scss +60 -0
- lx_annotate/static/scss/material-dashboard/_dark-version.scss +281 -0
- lx_annotate/static/scss/material-dashboard/_dropdown.scss +292 -0
- lx_annotate/static/scss/material-dashboard/_dropup.scss +41 -0
- lx_annotate/static/scss/material-dashboard/_fixed-plugin.scss +60 -0
- lx_annotate/static/scss/material-dashboard/_footer.scss +17 -0
- lx_annotate/static/scss/material-dashboard/_forms.scss +49 -0
- lx_annotate/static/scss/material-dashboard/_gradients.scss +18 -0
- lx_annotate/static/scss/material-dashboard/_header.scss +25 -0
- lx_annotate/static/scss/material-dashboard/_icons.scss +32 -0
- lx_annotate/static/scss/material-dashboard/_info-areas.scss +178 -0
- lx_annotate/static/scss/material-dashboard/_misc.scss +442 -0
- lx_annotate/static/scss/material-dashboard/_nav.scss +123 -0
- lx_annotate/static/scss/material-dashboard/_navbar-vertical.scss +725 -0
- lx_annotate/static/scss/material-dashboard/_navbar.scss +220 -0
- lx_annotate/static/scss/material-dashboard/_pagination.scss +58 -0
- lx_annotate/static/scss/material-dashboard/_popovers.scss +10 -0
- lx_annotate/static/scss/material-dashboard/_progress.scss +15 -0
- lx_annotate/static/scss/material-dashboard/_ripple.scss +15 -0
- lx_annotate/static/scss/material-dashboard/_rtl.scss +125 -0
- lx_annotate/static/scss/material-dashboard/_social-buttons.scss +42 -0
- lx_annotate/static/scss/material-dashboard/_tables.scss +53 -0
- lx_annotate/static/scss/material-dashboard/_tilt.scss +11 -0
- lx_annotate/static/scss/material-dashboard/_timeline.scss +137 -0
- lx_annotate/static/scss/material-dashboard/_tooltips.scss +9 -0
- lx_annotate/static/scss/material-dashboard/_typography.scss +301 -0
- lx_annotate/static/scss/material-dashboard/_utilities-extend.scss +11 -0
- lx_annotate/static/scss/material-dashboard/_utilities.scss +837 -0
- lx_annotate/static/scss/material-dashboard/_variables.scss +1674 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_accordion.scss +149 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_alert.scss +71 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_badge.scss +38 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_breadcrumb.scss +40 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_button-group.scss +142 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_buttons.scss +207 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_card.scss +234 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_carousel.scss +226 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_close.scss +40 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_containers.scss +41 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_dropdown.scss +249 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_forms.scss +9 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_functions.scss +302 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_grid.scss +33 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_helpers.scss +10 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_images.scss +42 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_list-group.scss +192 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_maps.scss +54 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_mixins.scss +43 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_modal.scss +237 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_nav.scss +172 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_navbar.scss +278 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_offcanvas.scss +144 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_pagination.scss +109 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_placeholders.scss +51 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_popover.scss +196 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_progress.scss +59 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_reboot.scss +610 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_root.scss +73 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_spinners.scss +85 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_tables.scss +164 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_toasts.scss +73 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_tooltip.scss +120 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_transitions.scss +27 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_type.scss +106 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_utilities.scss +647 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/_variables.scss +1634 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/bootstrap-grid.scss +64 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/bootstrap-reboot.scss +9 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/bootstrap-utilities.scss +18 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/bootstrap.scss +51 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/forms/_floating-labels.scss +75 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/forms/_form-check.scss +175 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/forms/_form-control.scss +194 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/forms/_form-range.scss +91 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/forms/_form-select.scss +71 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/forms/_form-text.scss +11 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/forms/_input-group.scss +132 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/forms/_labels.scss +36 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/forms/_validation.scss +12 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_clearfix.scss +3 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_color-bg.scss +10 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_colored-links.scss +12 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_position.scss +36 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_ratio.scss +26 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_stacks.scss +15 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_stretched-link.scss +15 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_text-truncation.scss +7 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_visually-hidden.scss +8 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_vr.scss +8 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_alert.scss +15 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_backdrop.scss +14 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_banner.scss +9 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_border-radius.scss +78 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_box-shadow.scss +18 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_breakpoints.scss +127 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_buttons.scss +70 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_caret.scss +64 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_clearfix.scss +9 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_color-scheme.scss +7 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_container.scss +11 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_deprecate.scss +10 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_forms.scss +152 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_gradients.scss +47 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_grid.scss +151 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_image.scss +16 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_list-group.scss +24 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_lists.scss +7 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_pagination.scss +10 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_reset-text.scss +17 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_resize.scss +6 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_table-variants.scss +24 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_text-truncate.scss +8 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_transition.scss +26 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_utilities.scss +97 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_visually-hidden.scss +29 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/utilities/_api.scss +47 -0
- lx_annotate/static/scss/material-dashboard/bootstrap/vendor/_rfs.scss +354 -0
- lx_annotate/static/scss/material-dashboard/cards/card-background.scss +81 -0
- lx_annotate/static/scss/material-dashboard/cards/card-rotate.scss +148 -0
- lx_annotate/static/scss/material-dashboard/custom/_styles.scss +0 -0
- lx_annotate/static/scss/material-dashboard/custom/_variables.scss +0 -0
- lx_annotate/static/scss/material-dashboard/forms/_form-check.scss +91 -0
- lx_annotate/static/scss/material-dashboard/forms/_form-select.scss +3 -0
- lx_annotate/static/scss/material-dashboard/forms/_form-switch.scss +43 -0
- lx_annotate/static/scss/material-dashboard/forms/_forms.scss +6 -0
- lx_annotate/static/scss/material-dashboard/forms/_input-group.scss +312 -0
- lx_annotate/static/scss/material-dashboard/forms/_inputs.scss +47 -0
- lx_annotate/static/scss/material-dashboard/forms/_labels.scss +21 -0
- lx_annotate/static/scss/material-dashboard/mixins/_badge.scss +12 -0
- lx_annotate/static/scss/material-dashboard/mixins/_buttons.scss +12 -0
- lx_annotate/static/scss/material-dashboard/mixins/_colored-shadows.scss +5 -0
- lx_annotate/static/scss/material-dashboard/mixins/_hover.scss +27 -0
- lx_annotate/static/scss/material-dashboard/mixins/_social-buttons.scss +46 -0
- lx_annotate/static/scss/material-dashboard/mixins/_vendor.scss +58 -0
- lx_annotate/static/scss/material-dashboard/mixins/mixins.scss +6 -0
- lx_annotate/static/scss/material-dashboard/plugins/free/_flatpickr.scss +878 -0
- lx_annotate/static/scss/material-dashboard/plugins/free/_nouislider.scss +298 -0
- lx_annotate/static/scss/material-dashboard/plugins/free/_perfect-scrollbar.scss +116 -0
- lx_annotate/static/scss/material-dashboard/plugins/free/_prism.scss +142 -0
- lx_annotate/static/scss/material-dashboard/plugins/free/plugins.scss +4 -0
- lx_annotate/static/scss/material-dashboard/theme.scss +63 -0
- lx_annotate/static/scss/material-dashboard/variables/_animations.scss +45 -0
- lx_annotate/static/scss/material-dashboard/variables/_avatars.scss +28 -0
- lx_annotate/static/scss/material-dashboard/variables/_badge.scss +40 -0
- lx_annotate/static/scss/material-dashboard/variables/_breadcrumb.scss +5 -0
- lx_annotate/static/scss/material-dashboard/variables/_cards-extend.scss +28 -0
- lx_annotate/static/scss/material-dashboard/variables/_cards.scss +65 -0
- lx_annotate/static/scss/material-dashboard/variables/_choices.scss +8 -0
- lx_annotate/static/scss/material-dashboard/variables/_dark-version.scss +9 -0
- lx_annotate/static/scss/material-dashboard/variables/_dropdowns.scss +53 -0
- lx_annotate/static/scss/material-dashboard/variables/_fixed-plugin.scss +7 -0
- lx_annotate/static/scss/material-dashboard/variables/_form-switch.scss +3 -0
- lx_annotate/static/scss/material-dashboard/variables/_full-calendar.scss +6 -0
- lx_annotate/static/scss/material-dashboard/variables/_header.scss +24 -0
- lx_annotate/static/scss/material-dashboard/variables/_info-areas.scss +32 -0
- lx_annotate/static/scss/material-dashboard/variables/_misc-extend.scss +48 -0
- lx_annotate/static/scss/material-dashboard/variables/_misc.scss +59 -0
- lx_annotate/static/scss/material-dashboard/variables/_navbar-vertical.scss +65 -0
- lx_annotate/static/scss/material-dashboard/variables/_navbar.scss +17 -0
- lx_annotate/static/scss/material-dashboard/variables/_pagination.scss +19 -0
- lx_annotate/static/scss/material-dashboard/variables/_ripple.scss +32 -0
- lx_annotate/static/scss/material-dashboard/variables/_rtl.scss +1 -0
- lx_annotate/static/scss/material-dashboard/variables/_social-buttons.scss +28 -0
- lx_annotate/static/scss/material-dashboard/variables/_table.scss +19 -0
- lx_annotate/static/scss/material-dashboard/variables/_timeline.scss +20 -0
- lx_annotate/static/scss/material-dashboard/variables/_utilities-extend.scss +32 -0
- lx_annotate/static/scss/material-dashboard/variables/_utilities.scss +195 -0
- lx_annotate/static/scss/material-dashboard/variables/_virtual-reality.scss +5 -0
- lx_annotate/static/scss/material-dashboard.scss +30 -0
- lx_annotate/static/silent-check-sso.html +8 -0
- lx_annotate/static/usePollingProtection-5vxQa-Ko.js +1 -0
- lx_annotate/static/videoStore-ClqdABXQ.js +2 -0
- lx_annotate/staticfiles/.vite/manifest.json +502 -0
- lx_annotate/staticfiles/AboutUs.js +1 -0
- lx_annotate/staticfiles/AnnotationDashboard.css +1 -0
- lx_annotate/staticfiles/AnnotationDashboard.js +1 -0
- lx_annotate/staticfiles/AnnotationDashboard2.js +1 -0
- lx_annotate/staticfiles/AnonymizationCorrectionComponent.css +1 -0
- lx_annotate/staticfiles/AnonymizationCorrectionComponent.js +1 -0
- lx_annotate/staticfiles/AnonymizationOverview.css +1 -0
- lx_annotate/staticfiles/AnonymizationOverview.js +1 -0
- lx_annotate/staticfiles/AnonymizationValidationComponent.css +1 -0
- lx_annotate/staticfiles/AnonymizationValidationComponent.js +1 -0
- lx_annotate/staticfiles/ApplicationSettingsPage.css +1 -0
- lx_annotate/staticfiles/ApplicationSettingsPage.js +1 -0
- lx_annotate/staticfiles/CaseResolutionPage.js +1 -0
- lx_annotate/staticfiles/CaseSetupPage.js +1 -0
- lx_annotate/staticfiles/Dashboard.js +1 -0
- lx_annotate/staticfiles/Documentation.css +1 -0
- lx_annotate/staticfiles/Documentation.js +1 -0
- lx_annotate/staticfiles/Examination.js +1 -0
- lx_annotate/staticfiles/Export.css +1 -0
- lx_annotate/staticfiles/Export.js +1 -0
- lx_annotate/staticfiles/FinalizedResultPage.js +1 -0
- lx_annotate/staticfiles/FindingsCapturePage.css +1 -0
- lx_annotate/staticfiles/FindingsCapturePage.js +1 -0
- lx_annotate/staticfiles/FindingsDetail.css +1 -0
- lx_annotate/staticfiles/FindingsDetail.js +1 -0
- lx_annotate/staticfiles/FrameAnnotation.css +1 -0
- lx_annotate/staticfiles/FrameAnnotation.js +1 -0
- lx_annotate/staticfiles/FrameSelectorPage.css +1 -0
- lx_annotate/staticfiles/FrameSelectorPage.js +1 -0
- lx_annotate/staticfiles/LookupStatusPanel.vue_vue_type_script_setup_true_lang.js +1 -0
- lx_annotate/staticfiles/MedicalBlock.css +1 -0
- lx_annotate/staticfiles/MedicalBlock.vue_vue_type_style_index_0_lang.js +1 -0
- lx_annotate/staticfiles/PageOverview.js +1 -0
- lx_annotate/staticfiles/PatientOverview.css +1 -0
- lx_annotate/staticfiles/PatientOverview.js +1 -0
- lx_annotate/staticfiles/Profile.js +1 -0
- lx_annotate/staticfiles/ReportEditorPage.js +4 -0
- lx_annotate/staticfiles/ReportGenerator.css +1 -0
- lx_annotate/staticfiles/ReportGenerator.js +1 -0
- lx_annotate/staticfiles/ReportTemplateBuilderPage.js +7 -0
- lx_annotate/staticfiles/ReportingShell.css +1 -0
- lx_annotate/staticfiles/ReportingShell.js +1 -0
- lx_annotate/staticfiles/ReportingWorklistPage.js +1 -0
- lx_annotate/staticfiles/RequirementGenerator.css +1 -0
- lx_annotate/staticfiles/RequirementGenerator.js +1 -0
- lx_annotate/staticfiles/RequirementIssues.vue_vue_type_script_setup_true_lang.js +1 -0
- lx_annotate/staticfiles/Timeline.css +1 -0
- lx_annotate/staticfiles/Timeline.js +1 -0
- lx_annotate/staticfiles/VideoExamination.css +1 -0
- lx_annotate/staticfiles/VideoExamination.js +1 -0
- lx_annotate/staticfiles/assets/base.css +86 -0
- lx_annotate/staticfiles/assets/css/material-dashboard.css +27935 -0
- lx_annotate/staticfiles/assets/css/material-dashboard.css.map +360 -0
- lx_annotate/staticfiles/assets/css/material-dashboard.min.css +42 -0
- lx_annotate/staticfiles/assets/css/nucleo-icons.css +597 -0
- lx_annotate/staticfiles/assets/css/nucleo-svg.css +135 -0
- lx_annotate/staticfiles/assets/fonts/nucleo-icons.eot +0 -0
- lx_annotate/staticfiles/assets/fonts/nucleo-icons.svg +312 -0
- lx_annotate/staticfiles/assets/fonts/nucleo-icons.ttf +0 -0
- lx_annotate/staticfiles/assets/fonts/nucleo-icons.woff +0 -0
- lx_annotate/staticfiles/assets/fonts/nucleo-icons.woff2 +0 -0
- lx_annotate/staticfiles/assets/fonts/nucleo.eot +0 -0
- lx_annotate/staticfiles/assets/fonts/nucleo.ttf +0 -0
- lx_annotate/staticfiles/assets/fonts/nucleo.woff +0 -0
- lx_annotate/staticfiles/assets/fonts/nucleo.woff2 +0 -0
- lx_annotate/staticfiles/assets/js/core/bootstrap.bundle.min.js +6 -0
- lx_annotate/staticfiles/assets/js/core/bootstrap.min.js +6 -0
- lx_annotate/staticfiles/assets/js/core/popper.min.js +4 -0
- lx_annotate/staticfiles/assets/js/material-dashboard.js +879 -0
- lx_annotate/staticfiles/assets/js/material-dashboard.js.map +1 -0
- lx_annotate/staticfiles/assets/js/material-dashboard.min.js +17 -0
- lx_annotate/staticfiles/assets/js/plugins/Chart.extension.js +130 -0
- lx_annotate/staticfiles/assets/js/plugins/bootstrap-notify.js +432 -0
- lx_annotate/staticfiles/assets/js/plugins/chartjs.min.js +13 -0
- lx_annotate/staticfiles/assets/js/plugins/countup.min.js +1 -0
- lx_annotate/staticfiles/assets/js/plugins/get_annotations.js +49 -0
- lx_annotate/staticfiles/assets/js/plugins/perfect-scrollbar.min.js +19 -0
- lx_annotate/staticfiles/assets/js/plugins/random-name-generator.js +81 -0
- lx_annotate/staticfiles/assets/js/plugins/smooth-scrollbar.min.js +25 -0
- lx_annotate/staticfiles/assets/js/plugins/submission-handler.js +73 -0
- lx_annotate/staticfiles/assets/js/plugins/world.js +2464 -0
- lx_annotate/staticfiles/assets/logo.svg +1 -0
- lx_annotate/staticfiles/assets/main.css +32 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_alert.scss +17 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_avatars.scss +123 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_badge.scss +8 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_breadcrumbs.scss +48 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_buttons.scss +191 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_cards.scss +60 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_dark-version.scss +281 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_dropdown.scss +292 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_dropup.scss +41 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_fixed-plugin.scss +60 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_footer.scss +17 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_forms.scss +49 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_gradients.scss +18 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_header.scss +25 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_icons.scss +32 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_info-areas.scss +178 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_misc.scss +442 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_nav.scss +123 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_navbar-vertical.scss +725 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_navbar.scss +220 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_pagination.scss +58 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_popovers.scss +10 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_progress.scss +15 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_ripple.scss +15 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_rtl.scss +125 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_social-buttons.scss +42 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_tables.scss +53 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_tilt.scss +11 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_timeline.scss +137 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_tooltips.scss +9 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_typography.scss +301 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_utilities-extend.scss +11 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_utilities.scss +837 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/_variables.scss +1674 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_accordion.scss +149 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_alert.scss +71 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_badge.scss +38 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_breadcrumb.scss +40 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_button-group.scss +142 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_buttons.scss +207 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_card.scss +234 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_carousel.scss +226 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_close.scss +40 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_containers.scss +41 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_dropdown.scss +249 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_forms.scss +9 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_functions.scss +302 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_grid.scss +33 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_helpers.scss +10 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_images.scss +42 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_list-group.scss +192 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_maps.scss +54 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_mixins.scss +43 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_modal.scss +237 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_nav.scss +172 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_navbar.scss +278 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_offcanvas.scss +144 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_pagination.scss +109 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_placeholders.scss +51 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_popover.scss +196 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_progress.scss +59 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_reboot.scss +610 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_root.scss +73 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_spinners.scss +85 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_tables.scss +164 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_toasts.scss +73 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_tooltip.scss +120 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_transitions.scss +27 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_type.scss +106 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_utilities.scss +647 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_variables.scss +1634 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/bootstrap-grid.scss +64 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/bootstrap-reboot.scss +9 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/bootstrap-utilities.scss +18 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/bootstrap.scss +51 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/forms/_floating-labels.scss +75 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/forms/_form-check.scss +175 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/forms/_form-control.scss +194 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/forms/_form-range.scss +91 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/forms/_form-select.scss +71 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/forms/_form-text.scss +11 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/forms/_input-group.scss +132 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/forms/_labels.scss +36 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/forms/_validation.scss +12 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_clearfix.scss +3 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_color-bg.scss +10 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_colored-links.scss +12 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_position.scss +36 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_ratio.scss +26 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_stacks.scss +15 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_stretched-link.scss +15 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_text-truncation.scss +7 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_visually-hidden.scss +8 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_vr.scss +8 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_alert.scss +15 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_backdrop.scss +14 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_banner.scss +9 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_border-radius.scss +78 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_box-shadow.scss +18 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_breakpoints.scss +127 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_buttons.scss +70 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_caret.scss +64 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_clearfix.scss +9 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_color-scheme.scss +7 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_container.scss +11 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_deprecate.scss +10 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_forms.scss +152 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_gradients.scss +47 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_grid.scss +151 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_image.scss +16 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_list-group.scss +24 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_lists.scss +7 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_pagination.scss +10 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_reset-text.scss +17 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_resize.scss +6 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_table-variants.scss +24 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_text-truncate.scss +8 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_transition.scss +26 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_utilities.scss +97 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_visually-hidden.scss +29 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/utilities/_api.scss +47 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/vendor/_rfs.scss +354 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/cards/card-background.scss +81 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/cards/card-rotate.scss +148 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/custom/_styles.scss +0 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/custom/_variables.scss +0 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/forms/_form-check.scss +91 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/forms/_form-select.scss +3 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/forms/_form-switch.scss +43 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/forms/_forms.scss +6 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/forms/_input-group.scss +312 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/forms/_inputs.scss +47 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/forms/_labels.scss +21 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/mixins/_badge.scss +12 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/mixins/_buttons.scss +12 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/mixins/_colored-shadows.scss +5 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/mixins/_hover.scss +27 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/mixins/_social-buttons.scss +46 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/mixins/_vendor.scss +58 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/mixins/mixins.scss +6 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/plugins/free/_flatpickr.scss +878 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/plugins/free/_nouislider.scss +298 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/plugins/free/_perfect-scrollbar.scss +116 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/plugins/free/_prism.scss +142 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/plugins/free/plugins.scss +4 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/theme.scss +63 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_animations.scss +45 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_avatars.scss +28 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_badge.scss +40 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_breadcrumb.scss +5 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_cards-extend.scss +28 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_cards.scss +65 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_choices.scss +8 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_dark-version.scss +9 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_dropdowns.scss +53 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_fixed-plugin.scss +7 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_form-switch.scss +3 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_full-calendar.scss +6 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_header.scss +24 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_info-areas.scss +32 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_misc-extend.scss +48 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_misc.scss +59 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_navbar-vertical.scss +65 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_navbar.scss +17 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_pagination.scss +19 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_ripple.scss +32 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_rtl.scss +1 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_social-buttons.scss +28 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_table.scss +19 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_timeline.scss +20 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_utilities-extend.scss +32 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_utilities.scss +195 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_virtual-reality.scss +5 -0
- lx_annotate/staticfiles/assets/scss/material-dashboard.scss +30 -0
- lx_annotate/staticfiles/dateHelpers.js +1 -0
- lx_annotate/staticfiles/examinationStore.js +1 -0
- lx_annotate/staticfiles/findingsApi.js +1 -0
- lx_annotate/staticfiles/img/Universitaetsklinikum_Wuerzburg.jpg +0 -0
- lx_annotate/staticfiles/img/ag_lux_logo_light_grey.svg +1 -0
- lx_annotate/staticfiles/img/apple-icon.png +0 -0
- lx_annotate/staticfiles/img/bg-pricing.jpg +0 -0
- lx_annotate/staticfiles/img/bg-smart-home-1.jpg +0 -0
- lx_annotate/staticfiles/img/bg-smart-home-2.jpg +0 -0
- lx_annotate/staticfiles/img/bruce-mars.jpg +0 -0
- lx_annotate/staticfiles/img/down-arrow-dark.svg +11 -0
- lx_annotate/staticfiles/img/down-arrow-white.svg +1 -0
- lx_annotate/staticfiles/img/down-arrow.svg +11 -0
- lx_annotate/staticfiles/img/drake.jpg +0 -0
- lx_annotate/staticfiles/img/favicon.png +0 -0
- lx_annotate/staticfiles/img/frames_demo/frame1.jpg +0 -0
- lx_annotate/staticfiles/img/frames_demo/frame2.jpg +0 -0
- lx_annotate/staticfiles/img/frames_demo/frame3.jpg +0 -0
- lx_annotate/staticfiles/img/frames_demo/frame4.jpg +0 -0
- lx_annotate/staticfiles/img/home-decor-1.jpg +0 -0
- lx_annotate/staticfiles/img/home-decor-2.jpg +0 -0
- lx_annotate/staticfiles/img/home-decor-3.jpg +0 -0
- lx_annotate/staticfiles/img/icons/flags/AU.png +0 -0
- lx_annotate/staticfiles/img/icons/flags/BR.png +0 -0
- lx_annotate/staticfiles/img/icons/flags/DE.png +0 -0
- lx_annotate/staticfiles/img/icons/flags/GB.png +0 -0
- lx_annotate/staticfiles/img/icons/flags/US.png +0 -0
- lx_annotate/staticfiles/img/illustrations/chat.png +0 -0
- lx_annotate/staticfiles/img/illustrations/danger-chat-ill.png +0 -0
- lx_annotate/staticfiles/img/illustrations/dark-lock-ill.png +0 -0
- lx_annotate/staticfiles/img/illustrations/error-404.png +0 -0
- lx_annotate/staticfiles/img/illustrations/error-500.png +0 -0
- lx_annotate/staticfiles/img/illustrations/illustration-lock.jpg +0 -0
- lx_annotate/staticfiles/img/illustrations/illustration-reset.jpg +0 -0
- lx_annotate/staticfiles/img/illustrations/illustration-signin.jpg +0 -0
- lx_annotate/staticfiles/img/illustrations/illustration-signup.jpg +0 -0
- lx_annotate/staticfiles/img/illustrations/illustration-verification.jpg +0 -0
- lx_annotate/staticfiles/img/illustrations/lock.png +0 -0
- lx_annotate/staticfiles/img/illustrations/pattern-tree.svg +20 -0
- lx_annotate/staticfiles/img/illustrations/rocket-white.png +0 -0
- lx_annotate/staticfiles/img/ivana-square.jpg +0 -0
- lx_annotate/staticfiles/img/ivana-squares.jpg +0 -0
- lx_annotate/staticfiles/img/ivancik.jpg +0 -0
- lx_annotate/staticfiles/img/kal-visuals-square.jpg +0 -0
- lx_annotate/staticfiles/img/logo-ct-dark.png +0 -0
- lx_annotate/staticfiles/img/logo-ct.png +0 -0
- lx_annotate/staticfiles/img/logos/ag_lux_logo_light_grey.svg +1 -0
- lx_annotate/staticfiles/img/logos/ag_lux_logo_white.svg +1 -0
- lx_annotate/staticfiles/img/logos/gray-logos/logo-coinbase.svg +16 -0
- lx_annotate/staticfiles/img/logos/gray-logos/logo-nasa.svg +9 -0
- lx_annotate/staticfiles/img/logos/gray-logos/logo-netflix.svg +9 -0
- lx_annotate/staticfiles/img/logos/gray-logos/logo-pinterest.svg +9 -0
- lx_annotate/staticfiles/img/logos/gray-logos/logo-spotify.svg +9 -0
- lx_annotate/staticfiles/img/logos/gray-logos/logo-vodafone.svg +9 -0
- lx_annotate/staticfiles/img/logos/mastercard.png +0 -0
- lx_annotate/staticfiles/img/logos/visa.png +0 -0
- lx_annotate/staticfiles/img/marie.jpg +0 -0
- lx_annotate/staticfiles/img/meeting.jpg +0 -0
- lx_annotate/staticfiles/img/office-dark.jpg +0 -0
- lx_annotate/staticfiles/img/product-12.jpg +0 -0
- lx_annotate/staticfiles/img/products/product-1-min.jpg +0 -0
- lx_annotate/staticfiles/img/products/product-11.jpg +0 -0
- lx_annotate/staticfiles/img/products/product-2-min.jpg +0 -0
- lx_annotate/staticfiles/img/products/product-3-min.jpg +0 -0
- lx_annotate/staticfiles/img/products/product-4-min.jpg +0 -0
- lx_annotate/staticfiles/img/products/product-5-min.jpg +0 -0
- lx_annotate/staticfiles/img/products/product-6-min.jpg +0 -0
- lx_annotate/staticfiles/img/products/product-7-min.jpg +0 -0
- lx_annotate/staticfiles/img/products/product-details-1.jpg +0 -0
- lx_annotate/staticfiles/img/products/product-details-2.jpg +0 -0
- lx_annotate/staticfiles/img/products/product-details-3.jpg +0 -0
- lx_annotate/staticfiles/img/products/product-details-4.jpg +0 -0
- lx_annotate/staticfiles/img/products/product-details-5.jpg +0 -0
- lx_annotate/staticfiles/img/shapes/pattern-lines.svg +91 -0
- lx_annotate/staticfiles/img/shapes/waves-white.svg +324 -0
- lx_annotate/staticfiles/img/small-logos/bootstrap.svg +9 -0
- lx_annotate/staticfiles/img/small-logos/creative-tim.svg +7 -0
- lx_annotate/staticfiles/img/small-logos/devto.svg +9 -0
- lx_annotate/staticfiles/img/small-logos/github.svg +10 -0
- lx_annotate/staticfiles/img/small-logos/google-webdev.svg +11 -0
- lx_annotate/staticfiles/img/small-logos/icon-bulb.svg +37 -0
- lx_annotate/staticfiles/img/small-logos/icon-sun-cloud.png +0 -0
- lx_annotate/staticfiles/img/small-logos/logo-asana.svg +16 -0
- lx_annotate/staticfiles/img/small-logos/logo-atlassian.svg +16 -0
- lx_annotate/staticfiles/img/small-logos/logo-invision.svg +10 -0
- lx_annotate/staticfiles/img/small-logos/logo-jira.svg +21 -0
- lx_annotate/staticfiles/img/small-logos/logo-slack.svg +12 -0
- lx_annotate/staticfiles/img/small-logos/logo-spotify.svg +9 -0
- lx_annotate/staticfiles/img/small-logos/logo-xd.svg +11 -0
- lx_annotate/staticfiles/img/team-1.jpg +0 -0
- lx_annotate/staticfiles/img/team-2.jpg +0 -0
- lx_annotate/staticfiles/img/team-3.jpg +0 -0
- lx_annotate/staticfiles/img/team-4.jpg +0 -0
- lx_annotate/staticfiles/img/team-5.jpg +0 -0
- lx_annotate/staticfiles/img/tesla-model-s.png +0 -0
- lx_annotate/staticfiles/img/vr-bg.jpg +0 -0
- lx_annotate/staticfiles/index.js +52 -0
- lx_annotate/staticfiles/main.css +37 -0
- lx_annotate/staticfiles/main.js +36 -0
- lx_annotate/staticfiles/mediaTypeStore.js +1 -0
- lx_annotate/staticfiles/nucleo-icons.eot +0 -0
- lx_annotate/staticfiles/nucleo-icons.svg +312 -0
- lx_annotate/staticfiles/nucleo-icons.ttf +0 -0
- lx_annotate/staticfiles/nucleo-icons.woff +0 -0
- lx_annotate/staticfiles/nucleo-icons.woff2 +0 -0
- lx_annotate/staticfiles/patientExaminationStore.js +1 -0
- lx_annotate/staticfiles/patientStore.js +1 -0
- lx_annotate/staticfiles/pdf.js +13 -0
- lx_annotate/staticfiles/pdf.worker.min.js +1 -0
- lx_annotate/staticfiles/pdf.worker.min.mjs +21 -0
- lx_annotate/staticfiles/reportSubmissionUtils.js +1 -0
- lx_annotate/staticfiles/reportTemplatesApi.js +1 -0
- lx_annotate/staticfiles/silent-check-sso.html +8 -0
- lx_annotate/staticfiles/timeHelpers.js +1 -0
- lx_annotate/staticfiles/useDebug.js +1 -0
- lx_annotate/staticfiles/useFindingSelectors.js +1 -0
- lx_annotate/staticfiles/useReportTemplates.css +1 -0
- lx_annotate/staticfiles/useReportTemplates.js +1 -0
- lx_annotate/staticfiles/videoStore.js +1 -0
- lx_annotate/templates/base.html +42 -0
- lx_annotate/urls.py +141 -0
- lx_annotate/wsgi.py +18 -0
- lx_annotate-0.0.1.dist-info/METADATA +236 -0
- lx_annotate-0.0.1.dist-info/RECORD +1188 -0
- lx_annotate-0.0.1.dist-info/WHEEL +4 -0
- lx_annotate-0.0.1.dist-info/licenses/LICENSE +21 -0
lx_annotate/__init__.py
ADDED
|
File without changes
|
lx_annotate/admin.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Register your models here.
|
lx_annotate/apps.py
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from django.apps import AppConfig
|
|
2
|
+
import os
|
|
3
|
+
import sys
|
|
4
|
+
import threading
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class LxAnnotateConfig(AppConfig):
|
|
8
|
+
default_auto_field = "django.db.models.BigAutoField"
|
|
9
|
+
name = "lx_annotate"
|
|
10
|
+
|
|
11
|
+
# This is running in development server only. On luxnix, filewatcher is started via systemd service.
|
|
12
|
+
def ready(self):
|
|
13
|
+
# Only for runserver
|
|
14
|
+
if "runserver" not in sys.argv:
|
|
15
|
+
return
|
|
16
|
+
|
|
17
|
+
# Only in autoreload child, not in the parent
|
|
18
|
+
if os.environ.get("RUN_MAIN") != "true":
|
|
19
|
+
return
|
|
20
|
+
|
|
21
|
+
self.start_file_watcher()
|
|
22
|
+
|
|
23
|
+
def start_file_watcher(self) -> bool:
|
|
24
|
+
def run_watcher():
|
|
25
|
+
try:
|
|
26
|
+
from django.core.management import call_command
|
|
27
|
+
|
|
28
|
+
print("📁 Starting file watcher service...")
|
|
29
|
+
call_command("start_filewatcher", log_level="INFO")
|
|
30
|
+
except Exception as e:
|
|
31
|
+
print(f"⚠️ Failed to start file watcher: {e}")
|
|
32
|
+
return False
|
|
33
|
+
|
|
34
|
+
watcher_thread = threading.Thread(target=run_watcher, daemon=True)
|
|
35
|
+
watcher_thread.start()
|
|
36
|
+
print("✅ File watcher service started in background")
|
|
37
|
+
return True
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# class lxAnonymizerConfig(AppConfig):
|
|
41
|
+
# default_auto_field = 'django.db.models.BigAutoField'
|
|
42
|
+
# name = 'lx-anonymizer'
|
lx_annotate/asgi.py
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ASGI config for lx-annotate project.
|
|
3
|
+
|
|
4
|
+
It exposes the ASGI callable as a module-level variable named ``application``.
|
|
5
|
+
|
|
6
|
+
For more information on this file, see
|
|
7
|
+
https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import os
|
|
11
|
+
|
|
12
|
+
os.environ["DJANGO_SETTINGS_MODULE"] = "lx_annotate.settings.settings_prod"
|
|
13
|
+
from django.core.asgi import get_asgi_application
|
|
14
|
+
from django.core.wsgi import get_wsgi_application
|
|
15
|
+
|
|
16
|
+
from asgiref.wsgi import WsgiToAsgi
|
|
17
|
+
from whitenoise import WhiteNoise
|
|
18
|
+
|
|
19
|
+
import importlib
|
|
20
|
+
import traceback
|
|
21
|
+
import sys
|
|
22
|
+
|
|
23
|
+
print("DJANGO_SETTINGS_MODULE =", os.getenv("DJANGO_SETTINGS_MODULE"))
|
|
24
|
+
print("sys.path[:10] =", sys.path[:10])
|
|
25
|
+
|
|
26
|
+
m = os.getenv("DJANGO_SETTINGS_MODULE", "lx_annotate.settings.settings_prod")
|
|
27
|
+
staticfiles_dir = os.getenv(
|
|
28
|
+
"DJANGO_STATIC_ROOT", os.path.join(os.path.dirname(__file__), "static")
|
|
29
|
+
)
|
|
30
|
+
try:
|
|
31
|
+
importlib.import_module(m)
|
|
32
|
+
print("Imported settings module OK:", m)
|
|
33
|
+
except Exception:
|
|
34
|
+
traceback.print_exc()
|
|
35
|
+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lx_annotate.settings.settings_prod")
|
|
36
|
+
|
|
37
|
+
wsgi_application = get_wsgi_application()
|
|
38
|
+
application = get_asgi_application()
|
|
39
|
+
whitenoise_application = WhiteNoise(wsgi_application, root=staticfiles_dir)
|
|
40
|
+
wsgi_asgi_application = WsgiToAsgi(wsgi_application)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
from rest_framework.decorators import api_view, permission_classes
|
|
2
|
+
from rest_framework.permissions import AllowAny
|
|
3
|
+
from rest_framework.response import Response
|
|
4
|
+
from rest_framework import status
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@api_view(["GET"])
|
|
8
|
+
@permission_classes([AllowAny])
|
|
9
|
+
def user_status(request):
|
|
10
|
+
"""
|
|
11
|
+
Check if user is authenticated via Keycloak
|
|
12
|
+
"""
|
|
13
|
+
if hasattr(request, "user") and request.user.is_authenticated:
|
|
14
|
+
return Response(
|
|
15
|
+
{
|
|
16
|
+
"is_authenticated": True,
|
|
17
|
+
"username": request.user.username,
|
|
18
|
+
"groups": getattr(request.user, "roles", []), # Keycloak uses roles
|
|
19
|
+
}
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
return Response({"is_authenticated": False})
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@api_view(["GET"])
|
|
26
|
+
def current_user(request):
|
|
27
|
+
"""
|
|
28
|
+
Get current authenticated user info
|
|
29
|
+
"""
|
|
30
|
+
if not request.user.is_authenticated:
|
|
31
|
+
return Response(
|
|
32
|
+
{"error": "Not authenticated"}, status=status.HTTP_401_UNAUTHORIZED
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
return Response(
|
|
36
|
+
{
|
|
37
|
+
"id": getattr(request.user, "id", None),
|
|
38
|
+
"username": request.user.username,
|
|
39
|
+
"email": getattr(request.user, "email", ""),
|
|
40
|
+
"groups": getattr(request.user, "roles", []),
|
|
41
|
+
"is_staff": getattr(request.user, "is_staff", False),
|
|
42
|
+
"is_active": getattr(request.user, "is_active", True),
|
|
43
|
+
}
|
|
44
|
+
)
|
|
@@ -0,0 +1,559 @@
|
|
|
1
|
+
"""
|
|
2
|
+
File watcher service packaged with the lx_annotate Django app.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import glob
|
|
8
|
+
import logging
|
|
9
|
+
import os
|
|
10
|
+
import shutil
|
|
11
|
+
import threading
|
|
12
|
+
import time
|
|
13
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Set
|
|
16
|
+
|
|
17
|
+
import requests
|
|
18
|
+
from watchdog.events import FileCreatedEvent, FileMovedEvent, FileSystemEventHandler
|
|
19
|
+
from watchdog.observers import Observer
|
|
20
|
+
|
|
21
|
+
from endoreg_db.models import Center, EndoscopyProcessor
|
|
22
|
+
from endoreg_db.services.hub import process_preanonymized_watcher_file
|
|
23
|
+
from endoreg_db.services.report_import import ReportImportService
|
|
24
|
+
from endoreg_db.services.video_import import VideoImportService
|
|
25
|
+
from endoreg_db.utils.paths import data_paths
|
|
26
|
+
|
|
27
|
+
try:
|
|
28
|
+
from endoreg_db.utils import data_paths as root_data_paths
|
|
29
|
+
|
|
30
|
+
project_root = root_data_paths["project_root"]
|
|
31
|
+
except (ImportError, ModuleNotFoundError, KeyError):
|
|
32
|
+
project_root = Path(__file__).resolve().parent.parent
|
|
33
|
+
|
|
34
|
+
PROJECT_ROOT = Path(project_root)
|
|
35
|
+
RUNTIME_DATA_DIR = Path(
|
|
36
|
+
os.getenv("LX_ANNOTATE_DATA_DIR", os.getenv("DATA_DIR", str(PROJECT_ROOT / "data")))
|
|
37
|
+
)
|
|
38
|
+
LOG_DIR = RUNTIME_DATA_DIR / "logs"
|
|
39
|
+
LOG_DIR.mkdir(parents=True, exist_ok=True)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _setup_ffmpeg() -> None:
|
|
43
|
+
"""Ensure FFmpeg binaries are available in PATH."""
|
|
44
|
+
for binary in ("ffmpeg", "ffprobe"):
|
|
45
|
+
if shutil.which(binary):
|
|
46
|
+
continue
|
|
47
|
+
|
|
48
|
+
for pattern in (
|
|
49
|
+
f"/nix/store/*/bin/{binary}",
|
|
50
|
+
f"/usr/bin/{binary}",
|
|
51
|
+
f"/usr/local/bin/{binary}",
|
|
52
|
+
):
|
|
53
|
+
matches = glob.glob(pattern)
|
|
54
|
+
if not matches:
|
|
55
|
+
continue
|
|
56
|
+
|
|
57
|
+
bin_dir = Path(matches[0]).parent
|
|
58
|
+
current_path = os.environ.get("PATH", "")
|
|
59
|
+
if str(bin_dir) not in current_path:
|
|
60
|
+
os.environ["PATH"] = f"{bin_dir}:{current_path}"
|
|
61
|
+
break
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
_setup_ffmpeg()
|
|
65
|
+
|
|
66
|
+
logging.basicConfig(
|
|
67
|
+
level=getattr(logging, os.getenv("WATCHER_LOG_LEVEL", "INFO")),
|
|
68
|
+
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
|
69
|
+
handlers=[logging.StreamHandler(), logging.FileHandler(LOG_DIR / "file_watcher.log")],
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
logging.getLogger("watchdog").setLevel(logging.WARNING)
|
|
73
|
+
logging.getLogger("watchdog.observers").setLevel(logging.WARNING)
|
|
74
|
+
logging.getLogger("watchdog.observers.inotify_buffer").setLevel(logging.WARNING)
|
|
75
|
+
|
|
76
|
+
logger = logging.getLogger(__name__)
|
|
77
|
+
|
|
78
|
+
video_import_service = VideoImportService()
|
|
79
|
+
report_import_service = ReportImportService()
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def unload_ollama_model(model_name: str = "llama3.2:1b") -> None:
|
|
83
|
+
"""Request Ollama to unload the model immediately."""
|
|
84
|
+
try:
|
|
85
|
+
requests.post(
|
|
86
|
+
"http://localhost:11434/api/chat",
|
|
87
|
+
json={"model": model_name, "keep_alive": 0},
|
|
88
|
+
timeout=2,
|
|
89
|
+
)
|
|
90
|
+
logger.info("Requested immediate VRAM release for model: %s", model_name)
|
|
91
|
+
except Exception as exc:
|
|
92
|
+
logger.warning("Failed to unload Ollama model (VRAM might not be freed): %s", exc)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def should_ignore_file(file_path: str | Path) -> bool:
|
|
96
|
+
"""Skip internal/temporary files and quarantine paths."""
|
|
97
|
+
p = Path(file_path)
|
|
98
|
+
if p.suffix == ".lock":
|
|
99
|
+
return True
|
|
100
|
+
if any(part == "_processing" for part in p.parts):
|
|
101
|
+
return True
|
|
102
|
+
if p.name.startswith(".") or p.name.startswith("~"):
|
|
103
|
+
return True
|
|
104
|
+
return False
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class AutoProcessingHandler(FileSystemEventHandler):
|
|
108
|
+
"""Handle file-system events for automatic processing of videos and reports."""
|
|
109
|
+
|
|
110
|
+
def __init__(self) -> None:
|
|
111
|
+
super().__init__()
|
|
112
|
+
self.processed_files: Set[str] = set()
|
|
113
|
+
self.in_flight_files: Set[str] = set()
|
|
114
|
+
self.files_lock = threading.Lock()
|
|
115
|
+
self.video_extensions = {".mp4", ".avi", ".mov", ".mkv", ".webm", ".m4v"}
|
|
116
|
+
self.report_extensions = {".pdf"}
|
|
117
|
+
self.pseudonymized_extensions = {".pdf", ".mp4"}
|
|
118
|
+
|
|
119
|
+
self.default_center = "university_hospital_wuerzburg"
|
|
120
|
+
self.default_processor = "olympus_cv_1500"
|
|
121
|
+
self.default_model = "image_multilabel_classification_colonoscopy_default"
|
|
122
|
+
|
|
123
|
+
self.executor = ThreadPoolExecutor(max_workers=2, thread_name_prefix="FileProcessor")
|
|
124
|
+
self.pseudonymized_dir = data_paths["import_preanonymized"].resolve()
|
|
125
|
+
|
|
126
|
+
logger.info("AutoProcessingHandler initialized")
|
|
127
|
+
logger.info("Monitoring video extensions: %s", self.video_extensions)
|
|
128
|
+
logger.info("Monitoring report extensions: %s", self.report_extensions)
|
|
129
|
+
logger.info(
|
|
130
|
+
"Monitoring pseudonymized extensions: %s", self.pseudonymized_extensions
|
|
131
|
+
)
|
|
132
|
+
logger.info("Pseudonymized intake directory: %s", self.pseudonymized_dir)
|
|
133
|
+
|
|
134
|
+
def dispatch(self, event): # type: ignore[override]
|
|
135
|
+
if event.is_directory:
|
|
136
|
+
return
|
|
137
|
+
if hasattr(event, "event_type") and event.event_type in {"opened", "closed"}:
|
|
138
|
+
return
|
|
139
|
+
|
|
140
|
+
src_path = str(event.src_path)
|
|
141
|
+
dest_path = getattr(event, "dest_path", None)
|
|
142
|
+
if should_ignore_file(src_path):
|
|
143
|
+
return
|
|
144
|
+
if dest_path and should_ignore_file(dest_path):
|
|
145
|
+
return
|
|
146
|
+
|
|
147
|
+
path = Path(src_path)
|
|
148
|
+
if (
|
|
149
|
+
path.name.startswith(".")
|
|
150
|
+
or path.name.startswith("~")
|
|
151
|
+
or "tmp" in str(path)
|
|
152
|
+
or "transcoding" in str(path)
|
|
153
|
+
):
|
|
154
|
+
return
|
|
155
|
+
|
|
156
|
+
super().dispatch(event)
|
|
157
|
+
|
|
158
|
+
def on_created(self, event):
|
|
159
|
+
if isinstance(event, FileCreatedEvent) and not event.is_directory:
|
|
160
|
+
self._submit_file(str(event.src_path))
|
|
161
|
+
|
|
162
|
+
def on_moved(self, event) -> None:
|
|
163
|
+
if isinstance(event, FileMovedEvent) and not event.is_directory:
|
|
164
|
+
self._submit_file(str(event.dest_path))
|
|
165
|
+
|
|
166
|
+
def _ensure_processing_slot(self, file_path: str) -> bool:
|
|
167
|
+
with self.files_lock:
|
|
168
|
+
if file_path in self.processed_files or file_path in self.in_flight_files:
|
|
169
|
+
return False
|
|
170
|
+
self.in_flight_files.add(file_path)
|
|
171
|
+
return True
|
|
172
|
+
|
|
173
|
+
def _release_processing_slot(self, file_path: str) -> None:
|
|
174
|
+
with self.files_lock:
|
|
175
|
+
self.in_flight_files.discard(file_path)
|
|
176
|
+
|
|
177
|
+
def _mark_processed(self, file_path: str) -> None:
|
|
178
|
+
with self.files_lock:
|
|
179
|
+
self.processed_files.add(file_path)
|
|
180
|
+
|
|
181
|
+
def _unmark_processed(self, file_path: str) -> None:
|
|
182
|
+
with self.files_lock:
|
|
183
|
+
self.processed_files.discard(file_path)
|
|
184
|
+
|
|
185
|
+
def _submit_file(self, file_path: str) -> None:
|
|
186
|
+
if not self._ensure_processing_slot(file_path):
|
|
187
|
+
logger.debug("Skipping duplicate file event: %s", file_path)
|
|
188
|
+
return
|
|
189
|
+
self.executor.submit(self._process_file, file_path)
|
|
190
|
+
|
|
191
|
+
def _process_file(self, file_path: str) -> None:
|
|
192
|
+
path_key = str(Path(file_path))
|
|
193
|
+
path = Path(file_path)
|
|
194
|
+
|
|
195
|
+
try:
|
|
196
|
+
with self.files_lock:
|
|
197
|
+
if path_key in self.processed_files:
|
|
198
|
+
logger.debug("File already processed: %s", path_key)
|
|
199
|
+
return
|
|
200
|
+
if path_key not in self.in_flight_files:
|
|
201
|
+
self.in_flight_files.add(path_key)
|
|
202
|
+
|
|
203
|
+
if should_ignore_file(path):
|
|
204
|
+
logger.debug("Skipping ignored file: %s", path)
|
|
205
|
+
return
|
|
206
|
+
|
|
207
|
+
if not self._wait_for_file_stable(path):
|
|
208
|
+
logger.warning("File not stable after waiting: %s", path)
|
|
209
|
+
return
|
|
210
|
+
|
|
211
|
+
file_extension = path.suffix.lower()
|
|
212
|
+
parent_dir = path.parent.resolve()
|
|
213
|
+
logger.debug("Parent: %s", parent_dir)
|
|
214
|
+
|
|
215
|
+
if (
|
|
216
|
+
parent_dir == data_paths["import_video"].resolve()
|
|
217
|
+
and file_extension in self.video_extensions
|
|
218
|
+
):
|
|
219
|
+
logger.info("New video detected: %s", path)
|
|
220
|
+
self._process_video(path)
|
|
221
|
+
elif (
|
|
222
|
+
parent_dir == data_paths["import_report"].resolve()
|
|
223
|
+
and file_extension in self.report_extensions
|
|
224
|
+
):
|
|
225
|
+
logger.info("New report detected: %s", path)
|
|
226
|
+
self._process_report(path)
|
|
227
|
+
elif (
|
|
228
|
+
parent_dir == self.pseudonymized_dir
|
|
229
|
+
and file_extension in self.pseudonymized_extensions
|
|
230
|
+
):
|
|
231
|
+
logger.info("New pseudonymized file detected: %s", path)
|
|
232
|
+
self._process_pseudonymized(path)
|
|
233
|
+
else:
|
|
234
|
+
logger.debug("Ignoring file (wrong type/location): %s", path)
|
|
235
|
+
except Exception as exc:
|
|
236
|
+
logger.error("Error processing file %s: %s", file_path, exc, exc_info=True)
|
|
237
|
+
finally:
|
|
238
|
+
self._release_processing_slot(path_key)
|
|
239
|
+
|
|
240
|
+
def _wait_for_file_stable(self, path: Path, timeout: int = 30) -> bool:
|
|
241
|
+
if not path.exists() or should_ignore_file(path):
|
|
242
|
+
return False
|
|
243
|
+
|
|
244
|
+
initial_size = -1
|
|
245
|
+
stable_checks = 0
|
|
246
|
+
for _ in range(timeout):
|
|
247
|
+
try:
|
|
248
|
+
current_size = path.stat().st_size
|
|
249
|
+
if current_size == initial_size:
|
|
250
|
+
stable_checks += 1
|
|
251
|
+
if stable_checks >= 3:
|
|
252
|
+
logger.debug("File stable: %s (%s bytes)", path, current_size)
|
|
253
|
+
return True
|
|
254
|
+
else:
|
|
255
|
+
stable_checks = 0
|
|
256
|
+
initial_size = current_size
|
|
257
|
+
logger.debug("File still changing: %s (%s bytes)", path, current_size)
|
|
258
|
+
time.sleep(1)
|
|
259
|
+
except (OSError, IOError) as exc:
|
|
260
|
+
logger.debug("Error checking file size: %s", exc)
|
|
261
|
+
time.sleep(1)
|
|
262
|
+
|
|
263
|
+
return False
|
|
264
|
+
|
|
265
|
+
def _process_video(self, video_path: Path) -> None:
|
|
266
|
+
try:
|
|
267
|
+
logger.info("Starting video processing: %s", video_path)
|
|
268
|
+
video_file = None
|
|
269
|
+
self._mark_processed(str(video_path))
|
|
270
|
+
|
|
271
|
+
try:
|
|
272
|
+
from endoreg_db.exceptions import InsufficientStorageError
|
|
273
|
+
from endoreg_db.models.media.video.create_from_file import (
|
|
274
|
+
check_storage_capacity,
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
storage_root = os.getenv(
|
|
278
|
+
"DJANGO_DATA_DIR", str(RUNTIME_DATA_DIR / "videos")
|
|
279
|
+
)
|
|
280
|
+
check_storage_capacity(video_path, Path(storage_root))
|
|
281
|
+
except InsufficientStorageError as storage_error:
|
|
282
|
+
logger.error(
|
|
283
|
+
"Insufficient storage space for %s: %s",
|
|
284
|
+
video_path,
|
|
285
|
+
storage_error,
|
|
286
|
+
)
|
|
287
|
+
self._unmark_processed(str(video_path))
|
|
288
|
+
return
|
|
289
|
+
except Exception as storage_error:
|
|
290
|
+
logger.warning("Storage check failed, proceeding anyway: %s", storage_error)
|
|
291
|
+
|
|
292
|
+
try:
|
|
293
|
+
video_file = video_import_service.import_and_anonymize(
|
|
294
|
+
file_path=video_path,
|
|
295
|
+
center_name=self.default_center,
|
|
296
|
+
processor_name=self.default_processor,
|
|
297
|
+
retry=False,
|
|
298
|
+
delete_source=False,
|
|
299
|
+
)
|
|
300
|
+
if video_file is None:
|
|
301
|
+
logger.info(
|
|
302
|
+
"Video import skipped (already being processed): %s", video_path
|
|
303
|
+
)
|
|
304
|
+
return
|
|
305
|
+
if not video_file.sensitive_meta:
|
|
306
|
+
logger.warning(
|
|
307
|
+
"Video imported but no SensitiveMeta created: %s",
|
|
308
|
+
video_file.video_hash,
|
|
309
|
+
)
|
|
310
|
+
logger.info("Video imported successfully: %s", video_file.video_hash)
|
|
311
|
+
except Exception as import_error:
|
|
312
|
+
error_msg = str(import_error)
|
|
313
|
+
if "Insufficient storage" in error_msg or "No space left on device" in error_msg:
|
|
314
|
+
logger.error(
|
|
315
|
+
"Storage error during import for %s: %s", video_path, import_error
|
|
316
|
+
)
|
|
317
|
+
self._unmark_processed(str(video_path))
|
|
318
|
+
return
|
|
319
|
+
if "already exists" in error_msg:
|
|
320
|
+
logger.info("Video %s already exists in database, skipping", video_path)
|
|
321
|
+
return
|
|
322
|
+
logger.error("Import failed for %s: %s", video_path, import_error)
|
|
323
|
+
self._unmark_processed(str(video_path))
|
|
324
|
+
return
|
|
325
|
+
|
|
326
|
+
if video_file and getattr(video_file, "pk", None):
|
|
327
|
+
try:
|
|
328
|
+
unload_ollama_model(model_name=self.default_model)
|
|
329
|
+
success = video_file.pipe_1(
|
|
330
|
+
model_name=self.default_model, delete_frames_after=True
|
|
331
|
+
)
|
|
332
|
+
if success:
|
|
333
|
+
logger.info(
|
|
334
|
+
"Video segmentation completed: %s", video_file.video_hash
|
|
335
|
+
)
|
|
336
|
+
else:
|
|
337
|
+
logger.error(
|
|
338
|
+
"Video segmentation failed: %s", video_file.video_hash
|
|
339
|
+
)
|
|
340
|
+
except Exception as exc:
|
|
341
|
+
logger.error("Error during video segmentation: %s", exc, exc_info=True)
|
|
342
|
+
|
|
343
|
+
logger.info("Video processing completed: %s", video_path)
|
|
344
|
+
if video_path.exists():
|
|
345
|
+
logger.info("Source video still exists: %s", video_path)
|
|
346
|
+
video_path.unlink()
|
|
347
|
+
except Exception as exc:
|
|
348
|
+
error_msg = str(exc)
|
|
349
|
+
logger.error("Error processing video %s: %s", video_path, error_msg, exc_info=True)
|
|
350
|
+
if any(
|
|
351
|
+
phrase in error_msg.lower()
|
|
352
|
+
for phrase in ["insufficient storage", "no space left", "disk full"]
|
|
353
|
+
):
|
|
354
|
+
logger.warning(
|
|
355
|
+
"Storage error for %s, will retry when space is available", video_path
|
|
356
|
+
)
|
|
357
|
+
self._unmark_processed(str(video_path))
|
|
358
|
+
return
|
|
359
|
+
logger.warning("Removing %s from processed set due to error", video_path)
|
|
360
|
+
self._unmark_processed(str(video_path))
|
|
361
|
+
|
|
362
|
+
def _process_report(self, report_path: Path) -> None:
|
|
363
|
+
try:
|
|
364
|
+
logger.info("Starting report processing: %s", report_path)
|
|
365
|
+
self._mark_processed(str(report_path))
|
|
366
|
+
|
|
367
|
+
try:
|
|
368
|
+
from endoreg_db.exceptions import InsufficientStorageError
|
|
369
|
+
|
|
370
|
+
storage_root = os.getenv(
|
|
371
|
+
"report_STORAGE_ROOT", str(RUNTIME_DATA_DIR / "reports")
|
|
372
|
+
)
|
|
373
|
+
storage_root_path = Path(storage_root)
|
|
374
|
+
if not storage_root_path.is_absolute():
|
|
375
|
+
storage_root_path = PROJECT_ROOT / storage_root_path
|
|
376
|
+
storage_root_path.mkdir(parents=True, exist_ok=True)
|
|
377
|
+
if not storage_root_path.exists():
|
|
378
|
+
raise InsufficientStorageError(
|
|
379
|
+
f"Storage root does not exist: {storage_root_path}"
|
|
380
|
+
)
|
|
381
|
+
|
|
382
|
+
raw_report = report_import_service.import_and_anonymize(
|
|
383
|
+
file_path=report_path,
|
|
384
|
+
center_name=self.default_center,
|
|
385
|
+
delete_source=False,
|
|
386
|
+
)
|
|
387
|
+
if raw_report:
|
|
388
|
+
logger.info(
|
|
389
|
+
"report imported successfully: %s", raw_report.pdf_hash
|
|
390
|
+
)
|
|
391
|
+
try:
|
|
392
|
+
if report_path.exists():
|
|
393
|
+
report_path.unlink()
|
|
394
|
+
except Exception as exc:
|
|
395
|
+
logger.error(
|
|
396
|
+
"Error removing report file %s: %s", report_path, exc
|
|
397
|
+
)
|
|
398
|
+
else:
|
|
399
|
+
logger.info(
|
|
400
|
+
"report import skipped (already being processed): %s", report_path
|
|
401
|
+
)
|
|
402
|
+
self._unmark_processed(str(report_path))
|
|
403
|
+
except InsufficientStorageError as storage_error:
|
|
404
|
+
logger.error(
|
|
405
|
+
"Insufficient storage space for %s: %s", report_path, storage_error
|
|
406
|
+
)
|
|
407
|
+
self._unmark_processed(str(report_path))
|
|
408
|
+
except Exception as import_error:
|
|
409
|
+
logger.error("report import failed for %s: %s", report_path, import_error)
|
|
410
|
+
self._unmark_processed(str(report_path))
|
|
411
|
+
except Exception as exc:
|
|
412
|
+
logger.error("Error processing report %s: %s", report_path, exc, exc_info=True)
|
|
413
|
+
self._unmark_processed(str(report_path))
|
|
414
|
+
|
|
415
|
+
def _process_pseudonymized(self, file_path: Path) -> None:
|
|
416
|
+
try:
|
|
417
|
+
logger.info("Starting pseudonymized processing: %s", file_path)
|
|
418
|
+
self._mark_processed(str(file_path))
|
|
419
|
+
process_preanonymized_watcher_file(file_path=file_path)
|
|
420
|
+
logger.info("Pseudonymized processing completed: %s", file_path)
|
|
421
|
+
except Exception as exc:
|
|
422
|
+
logger.error(
|
|
423
|
+
"Error processing pseudonymized file %s: %s",
|
|
424
|
+
file_path,
|
|
425
|
+
exc,
|
|
426
|
+
exc_info=True,
|
|
427
|
+
)
|
|
428
|
+
self._unmark_processed(str(file_path))
|
|
429
|
+
|
|
430
|
+
def shutdown(self) -> None:
|
|
431
|
+
logger.info("Shutting down file processor threads...")
|
|
432
|
+
self.executor.shutdown(wait=True)
|
|
433
|
+
logger.info("File processor threads shut down")
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
class FileWatcherService:
|
|
437
|
+
"""Main service class for file watching and automatic processing."""
|
|
438
|
+
|
|
439
|
+
def __init__(self) -> None:
|
|
440
|
+
self.observer = Observer()
|
|
441
|
+
self.handler = AutoProcessingHandler()
|
|
442
|
+
self.video_dir = data_paths["import_video"].resolve()
|
|
443
|
+
self.report_dir = data_paths["import_report"].resolve()
|
|
444
|
+
self.pseudonymized_dir = self.handler.pseudonymized_dir
|
|
445
|
+
|
|
446
|
+
self.video_dir.mkdir(parents=True, exist_ok=True)
|
|
447
|
+
self.report_dir.mkdir(parents=True, exist_ok=True)
|
|
448
|
+
self.pseudonymized_dir.mkdir(parents=True, exist_ok=True)
|
|
449
|
+
|
|
450
|
+
logger.info("Video directory: %s", self.video_dir)
|
|
451
|
+
logger.info("report directory: %s", self.report_dir)
|
|
452
|
+
logger.info("Pseudonymized directory: %s", self.pseudonymized_dir)
|
|
453
|
+
logger.info("Using observer: %s", type(self.observer).__name__)
|
|
454
|
+
|
|
455
|
+
def start(self) -> None:
|
|
456
|
+
try:
|
|
457
|
+
self._validate_django_setup()
|
|
458
|
+
self.observer.schedule(self.handler, str(self.video_dir), recursive=False)
|
|
459
|
+
self.observer.schedule(self.handler, str(self.report_dir), recursive=False)
|
|
460
|
+
self.observer.schedule(
|
|
461
|
+
self.handler, str(self.pseudonymized_dir), recursive=False
|
|
462
|
+
)
|
|
463
|
+
self.observer.start()
|
|
464
|
+
logger.info("File watcher service started successfully")
|
|
465
|
+
logger.info("Monitoring: %s", self.video_dir)
|
|
466
|
+
logger.info("Monitoring: %s", self.report_dir)
|
|
467
|
+
logger.info("Monitoring: %s", self.pseudonymized_dir)
|
|
468
|
+
self.handler.executor.submit(self._process_existing_files)
|
|
469
|
+
|
|
470
|
+
try:
|
|
471
|
+
while True:
|
|
472
|
+
time.sleep(10)
|
|
473
|
+
self._health_check()
|
|
474
|
+
except KeyboardInterrupt:
|
|
475
|
+
logger.info("Received shutdown signal")
|
|
476
|
+
except Exception as exc:
|
|
477
|
+
logger.error("Error starting file watcher service: %s", exc, exc_info=True)
|
|
478
|
+
raise
|
|
479
|
+
finally:
|
|
480
|
+
self.stop()
|
|
481
|
+
|
|
482
|
+
def stop(self) -> None:
|
|
483
|
+
if self.observer.is_alive():
|
|
484
|
+
self.observer.stop()
|
|
485
|
+
self.observer.join()
|
|
486
|
+
logger.info("File watcher service stopped")
|
|
487
|
+
self.handler.shutdown()
|
|
488
|
+
|
|
489
|
+
def _validate_django_setup(self) -> None:
|
|
490
|
+
from django.db import connection
|
|
491
|
+
|
|
492
|
+
connection.ensure_connection()
|
|
493
|
+
Center.objects.first()
|
|
494
|
+
EndoscopyProcessor.objects.first()
|
|
495
|
+
logger.info("Django setup validation successful")
|
|
496
|
+
|
|
497
|
+
def _process_existing_files(self) -> None:
|
|
498
|
+
logger.info("Processing existing files...")
|
|
499
|
+
for video_file in self.video_dir.glob("*"):
|
|
500
|
+
if video_file.is_file() and video_file.suffix.lower() in self.handler.video_extensions:
|
|
501
|
+
logger.info("Processing existing video: %s", video_file)
|
|
502
|
+
self.handler._process_file(str(video_file))
|
|
503
|
+
|
|
504
|
+
for report_file in self.report_dir.glob("*"):
|
|
505
|
+
if report_file.is_file() and report_file.suffix.lower() in self.handler.report_extensions:
|
|
506
|
+
logger.info("Processing existing report: %s", report_file)
|
|
507
|
+
self.handler._process_file(str(report_file))
|
|
508
|
+
|
|
509
|
+
for pseudonymized_file in self.pseudonymized_dir.glob("*"):
|
|
510
|
+
if (
|
|
511
|
+
pseudonymized_file.is_file()
|
|
512
|
+
and pseudonymized_file.suffix.lower()
|
|
513
|
+
in self.handler.pseudonymized_extensions
|
|
514
|
+
):
|
|
515
|
+
logger.info(
|
|
516
|
+
"Processing existing pseudonymized file: %s", pseudonymized_file
|
|
517
|
+
)
|
|
518
|
+
self.handler._process_file(str(pseudonymized_file))
|
|
519
|
+
|
|
520
|
+
logger.info("Existing files processing completed")
|
|
521
|
+
|
|
522
|
+
def _health_check(self) -> None:
|
|
523
|
+
if not self.observer.is_alive():
|
|
524
|
+
logger.error("Observer thread died, restarting...")
|
|
525
|
+
self.observer = Observer()
|
|
526
|
+
self.observer.schedule(self.handler, str(self.video_dir), recursive=False)
|
|
527
|
+
self.observer.schedule(self.handler, str(self.report_dir), recursive=False)
|
|
528
|
+
self.observer.schedule(
|
|
529
|
+
self.handler, str(self.pseudonymized_dir), recursive=False
|
|
530
|
+
)
|
|
531
|
+
self.observer.start()
|
|
532
|
+
|
|
533
|
+
try:
|
|
534
|
+
storage_root = RUNTIME_DATA_DIR / "storage" / "videos"
|
|
535
|
+
if storage_root.exists():
|
|
536
|
+
total, used, free = shutil.disk_usage(storage_root)
|
|
537
|
+
free_gb = free / (1024**3)
|
|
538
|
+
total_gb = total / (1024**3)
|
|
539
|
+
usage_percent = (used / total) * 100
|
|
540
|
+
logger.debug(
|
|
541
|
+
"Storage: %.1f GB free of %.1f GB (%.1f%% used)",
|
|
542
|
+
free_gb,
|
|
543
|
+
total_gb,
|
|
544
|
+
usage_percent,
|
|
545
|
+
)
|
|
546
|
+
if free_gb < 5.0:
|
|
547
|
+
logger.warning("Storage space running low: %.1f GB free", free_gb)
|
|
548
|
+
elif usage_percent > 90:
|
|
549
|
+
logger.warning("Storage usage high: %.1f%% used", usage_percent)
|
|
550
|
+
except Exception as exc:
|
|
551
|
+
logger.debug("Storage check failed: %s", exc)
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
def run_file_watcher() -> None:
|
|
555
|
+
logger.info("Starting File Watcher Service")
|
|
556
|
+
logger.info("Project root: %s", PROJECT_ROOT)
|
|
557
|
+
logger.info("Django settings: %s", os.environ.get("DJANGO_SETTINGS_MODULE"))
|
|
558
|
+
FileWatcherService().start()
|
|
559
|
+
|