From 8404c5e36b2410b01eef9cdb1c3e593976247605 Mon Sep 17 00:00:00 2001 From: xfr Date: Tue, 8 Aug 2023 22:04:06 +0000 Subject: [PATCH] Initial commit --- .bash_history | 500 ++++++++++++++++++ .bash_history-00353.tmp | 98 ++++ .gitignore | 163 ++++++ .jupyter/jupyter_notebook_config.json | 5 + .../plugin.jupyterlab-settings | 7 + .../workspaces/lab-a511.jupyterlab-workspace | 1 + ...workspacesauto-c-4c4c.jupyterlab-workspace | 1 + ...workspacesauto-d-fa4c.jupyterlab-workspace | 1 + ...workspacesauto-m-cb31.jupyterlab-workspace | 1 + ...workspacesauto-q-6fd4.jupyterlab-workspace | 1 + .jupyter/migrated | 1 + .../Trash/info/Untitled Folder.trashinfo | 3 + .local/share/Trash/info/resources 1.trashinfo | 3 + .local/share/Trash/info/resources.trashinfo | 3 + .../share/Trash/info/untitled 1.txt.trashinfo | 3 + .../share/Trash/info/untitled.txt.trashinfo | 3 + .../jupyter/runtime/nbserver-1-open.html | 22 + .local/share/jupyter/runtime/nbserver-1.json | 12 + .../jupyter/runtime/notebook_cookie_secret | 1 + ...1d3522eae064bb805bdf301a273a8766da5b21ab5b | 1 + ...05c4b31a6a19b8745a4a47d6babfdd083035cac131 | Bin 0 -> 5342 bytes ...5e8d374417176d7a08b4c9a2cb0dcddcf840db2173 | Bin 0 -> 10901 bytes ...01b2a28fffb01b51163724e88c06d8a2c6a920bffc | 1 + ...075c166d42a7bc667c6a0cdbbfe90261e360fda8bf | 2 + ...aeffce1682eea81041ebd44192c901522303dea70e | 2 + ...589680dc8ed1731bb9c0adda97021357182d36095a | 2 + ...5384ba651efe7f725e7379ed9fc932281f5a97d9af | 2 + .python_history | 20 + .wget-hsts | 5 + 1-move.py | 157 ++++-- 2-infer.py | 130 ++++- 6jj_lths.mat | Bin 0 -> 193 bytes adding.py | 52 ++ bcngawwk.mat | Bin 0 -> 193 bytes dev/register_rtss.py | 33 ++ docker/Dockerfile | 16 +- docker/qrun.sh | 13 +- docker/requirements.txt | 2 + myapp/.env-example | 51 ++ myapp/.env.testing | 2 + myapp/.gitignore | 18 + myapp/Kernel.py | 117 ++++ myapp/app/__init__.py | 0 myapp/app/controllers/BlogController.py | 7 + myapp/app/controllers/PatientController.py | 11 + myapp/app/controllers/WelcomeController.py | 10 + myapp/app/controllers/__init__.py | 0 myapp/app/controllers/api/UsersController.py | 19 + .../middlewares/AuthenticationMiddleware.py | 13 + myapp/app/middlewares/VerifyCsrfToken.py | 6 + myapp/app/middlewares/__init__.py | 3 + myapp/app/models/User.py | 12 + myapp/app/providers/AppProvider.py | 12 + myapp/app/providers/__init__.py | 2 + myapp/config/__init__.py | 0 myapp/config/api.py | 15 + myapp/config/application.py | 16 + myapp/config/auth.py | 8 + myapp/config/broadcast.py | 14 + myapp/config/cache.py | 25 + myapp/config/database.py | 56 ++ myapp/config/exceptions.py | 24 + myapp/config/filesystem.py | 21 + myapp/config/mail.py | 23 + myapp/config/notification.py | 20 + myapp/config/providers.py | 56 ++ myapp/config/queue.py | 39 ++ myapp/config/session.py | 7 + myapp/craft | 11 + ...1_09_033202_create_password_reset_table.py | 15 + .../2021_01_09_043202_create_users_table.py | 21 + myapp/databases/seeds/__init__.py | 0 myapp/databases/seeds/database_seeder.py | 10 + myapp/databases/seeds/user_table_seeder.py | 18 + myapp/makefile | 9 + myapp/package.json | 17 + myapp/pyproject.toml | 11 + myapp/requirements.txt | 2 + myapp/resources/css/app.css | 1 + myapp/resources/js/app.js | 2 + myapp/resources/js/bootstrap.js | 23 + myapp/routes/api.py | 7 + myapp/routes/web.py | 14 + myapp/setup.cfg | 8 + myapp/storage/.gitignore | 0 myapp/storage/public/favicon.ico | Bin 0 -> 15406 bytes myapp/storage/public/logo.png | Bin 0 -> 48673 bytes myapp/storage/public/robots.txt | 2 + myapp/templates/__init__.py | 0 myapp/templates/base-tailwind.html | 24 + myapp/templates/base.html | 26 + myapp/templates/blog.html | 1 + myapp/templates/errors/403.html | 20 + myapp/templates/errors/404.html | 20 + myapp/templates/errors/500.html | 20 + myapp/templates/maintenance.html | 20 + myapp/templates/patient.html | 18 + myapp/templates/welcome.html | 34 ++ myapp/tests/TestCase.py | 6 + myapp/tests/__init__.py | 1 + myapp/tests/unit/test_basic_testcase.py | 6 + myapp/webpack.mix.js | 26 + myapp/wsgi.py | 14 + old/1-move.py | 189 +++++++ 3-send.py => old/3-send.py | 0 itk_elastix.py => old/itk_elastix.py | 0 pxrjso6b.mat | Bin 0 -> 193 bytes razmtoz2.mat | Bin 0 -> 193 bytes registration/__init__.py | 0 registration/ants_reg.py | 82 +++ registration/best_reg.py | 76 +++ registration/elastix_reg.py | 249 +++++++++ tjfrlfp4.mat | Bin 0 -> 193 bytes 113 files changed, 2833 insertions(+), 44 deletions(-) create mode 100644 .bash_history create mode 100644 .bash_history-00353.tmp create mode 100644 .gitignore create mode 100644 .jupyter/jupyter_notebook_config.json create mode 100644 .jupyter/lab/user-settings/@jupyterlab/docmanager-extension/plugin.jupyterlab-settings create mode 100644 .jupyter/lab/workspaces/lab-a511.jupyterlab-workspace create mode 100644 .jupyter/lab/workspaces/labworkspacesauto-c-4c4c.jupyterlab-workspace create mode 100644 .jupyter/lab/workspaces/labworkspacesauto-d-fa4c.jupyterlab-workspace create mode 100644 .jupyter/lab/workspaces/labworkspacesauto-m-cb31.jupyterlab-workspace create mode 100644 .jupyter/lab/workspaces/labworkspacesauto-q-6fd4.jupyterlab-workspace create mode 100644 .jupyter/migrated create mode 100644 .local/share/Trash/info/Untitled Folder.trashinfo create mode 100644 .local/share/Trash/info/resources 1.trashinfo create mode 100644 .local/share/Trash/info/resources.trashinfo create mode 100644 .local/share/Trash/info/untitled 1.txt.trashinfo create mode 100644 .local/share/Trash/info/untitled.txt.trashinfo create mode 100644 .local/share/jupyter/runtime/nbserver-1-open.html create mode 100644 .local/share/jupyter/runtime/nbserver-1.json create mode 100644 .local/share/jupyter/runtime/notebook_cookie_secret create mode 100644 .npm/_cacache/content-v2/sha512/1f/cb/884aad9b8d6b5eba9afa7c83fdfbcbe955d786c6c887ad72da30e77d719ea36c7337fc03a5ad4ef79a1d3522eae064bb805bdf301a273a8766da5b21ab5b create mode 100644 .npm/_cacache/content-v2/sha512/2c/a8/c457c73791beb8d65d08936a0e7a2a68de1904668ec80c66eae736eacb612d27acc802d2f818b730cf05c4b31a6a19b8745a4a47d6babfdd083035cac131 create mode 100644 .npm/_cacache/content-v2/sha512/4a/a0/69cafd04da71afcf7b38f07beb36e90f43ba42abbf9d4613a666bfa5ba9664069b4a0789e0a3330cf25e8d374417176d7a08b4c9a2cb0dcddcf840db2173 create mode 100644 .npm/_cacache/content-v2/sha512/53/ab/c1d19a3464a3e96f851cfd247273e83e286bee252eae19b2fed306d1f38053549dc03ca1cd9562e66901b2a28fffb01b51163724e88c06d8a2c6a920bffc create mode 100644 .npm/_cacache/index-v5/2b/cd/3ac6ae314de8839b74075c166d42a7bc667c6a0cdbbfe90261e360fda8bf create mode 100644 .npm/_cacache/index-v5/4c/64/23f8b5034fecc4dd91aeffce1682eea81041ebd44192c901522303dea70e create mode 100644 .npm/_cacache/index-v5/ac/d8/02b53e9340cf22cc0e589680dc8ed1731bb9c0adda97021357182d36095a create mode 100644 .npm/_cacache/index-v5/e6/c0/741f8c19375dcfef585384ba651efe7f725e7379ed9fc932281f5a97d9af create mode 100644 .python_history create mode 100644 .wget-hsts create mode 100644 6jj_lths.mat create mode 100644 adding.py create mode 100644 bcngawwk.mat create mode 100755 dev/register_rtss.py create mode 100644 docker/requirements.txt create mode 100644 myapp/.env-example create mode 100644 myapp/.env.testing create mode 100644 myapp/.gitignore create mode 100644 myapp/Kernel.py create mode 100644 myapp/app/__init__.py create mode 100644 myapp/app/controllers/BlogController.py create mode 100644 myapp/app/controllers/PatientController.py create mode 100644 myapp/app/controllers/WelcomeController.py create mode 100644 myapp/app/controllers/__init__.py create mode 100644 myapp/app/controllers/api/UsersController.py create mode 100644 myapp/app/middlewares/AuthenticationMiddleware.py create mode 100644 myapp/app/middlewares/VerifyCsrfToken.py create mode 100644 myapp/app/middlewares/__init__.py create mode 100644 myapp/app/models/User.py create mode 100644 myapp/app/providers/AppProvider.py create mode 100644 myapp/app/providers/__init__.py create mode 100644 myapp/config/__init__.py create mode 100644 myapp/config/api.py create mode 100644 myapp/config/application.py create mode 100644 myapp/config/auth.py create mode 100644 myapp/config/broadcast.py create mode 100644 myapp/config/cache.py create mode 100644 myapp/config/database.py create mode 100644 myapp/config/exceptions.py create mode 100644 myapp/config/filesystem.py create mode 100644 myapp/config/mail.py create mode 100644 myapp/config/notification.py create mode 100644 myapp/config/providers.py create mode 100644 myapp/config/queue.py create mode 100644 myapp/config/session.py create mode 100644 myapp/craft create mode 100644 myapp/databases/migrations/2021_01_09_033202_create_password_reset_table.py create mode 100644 myapp/databases/migrations/2021_01_09_043202_create_users_table.py create mode 100644 myapp/databases/seeds/__init__.py create mode 100644 myapp/databases/seeds/database_seeder.py create mode 100644 myapp/databases/seeds/user_table_seeder.py create mode 100644 myapp/makefile create mode 100644 myapp/package.json create mode 100644 myapp/pyproject.toml create mode 100644 myapp/requirements.txt create mode 100644 myapp/resources/css/app.css create mode 100644 myapp/resources/js/app.js create mode 100644 myapp/resources/js/bootstrap.js create mode 100644 myapp/routes/api.py create mode 100644 myapp/routes/web.py create mode 100644 myapp/setup.cfg create mode 100644 myapp/storage/.gitignore create mode 100644 myapp/storage/public/favicon.ico create mode 100644 myapp/storage/public/logo.png create mode 100644 myapp/storage/public/robots.txt create mode 100644 myapp/templates/__init__.py create mode 100644 myapp/templates/base-tailwind.html create mode 100644 myapp/templates/base.html create mode 100644 myapp/templates/blog.html create mode 100644 myapp/templates/errors/403.html create mode 100644 myapp/templates/errors/404.html create mode 100644 myapp/templates/errors/500.html create mode 100644 myapp/templates/maintenance.html create mode 100644 myapp/templates/patient.html create mode 100644 myapp/templates/welcome.html create mode 100644 myapp/tests/TestCase.py create mode 100644 myapp/tests/__init__.py create mode 100644 myapp/tests/unit/test_basic_testcase.py create mode 100644 myapp/webpack.mix.js create mode 100644 myapp/wsgi.py create mode 100755 old/1-move.py rename 3-send.py => old/3-send.py (100%) rename itk_elastix.py => old/itk_elastix.py (100%) create mode 100644 pxrjso6b.mat create mode 100644 razmtoz2.mat create mode 100644 registration/__init__.py create mode 100644 registration/ants_reg.py create mode 100644 registration/best_reg.py create mode 100644 registration/elastix_reg.py create mode 100644 tjfrlfp4.mat diff --git a/.bash_history b/.bash_history new file mode 100644 index 0000000..164ea44 --- /dev/null +++ b/.bash_history @@ -0,0 +1,500 @@ +./2-infer.py /nn/7091925/20230208/CT/9 /nn/7091925/20230208/MR/7 +./1-move.py 6035638 +./2-infer.py /nn/6035638/20230209/CT/8 /nn/6035638/20230209/MR/7 +./1-move.py 7030265 +./2-infer.py /nn/7030265/20230209/CT/9 /nn/7030265/20230209/MR/7 +./1-move.py 6981439 +./2-infer.py /nn/6981439/20230210/CT/a /nn/6981439/20230210/MR/7 +./1-move.py 5665595 +./2-infer.py /nn/5665595/20230210/CT/9 /nn/5665595/20230210/MR/7 +./1-move.py 3903066 +./2-infer.py /nn/3903066/20230213/CT/a /nn/3903066/20230213/MR/7 +./1-move.py 3903066 +./2-infer.py /nn/3903066/20230213/CT/9 /nn/3903066/20230213/MR/7 +./1-move.py 5487071 +./2-infer.py /nn/5487071/20230213/CT/9 /nn/5487071/20230213/MR/7 +./1-move.py 6771041 +./2-infer.py /nn/6771041/20230214/CT/9 /nn/6771041/20230214/MR/7 +./1-move.py 5495897 +./2-infer.py /nn/5495897/20230214/CT/9 /nn/5495897/20230214/MR/7 +./1-move.py 6987123 +./2-infer.py /nn/6987123/20230215/CT/9 /nn/6987123/20230215/MR/7 +./1-move.py 3183636 +./2-infer.py /nn/3183636/20230215/CT/9 /nn/3183636/20230215/MR/7 +./1-move.py 5768342 +./2-infer.py /nn/5768342/20230216/CT/9 /nn/5768342/20230216/MR/7 +./1-move.py 5695691 +./2-infer.py /nn/5695691/20230216/CT/a /nn/5695691/20230216/MR/7 +./1-move.py 5768342 +./2-infer.py /nn/5768342/20230216/CT/9 /nn/5768342/20230216/MR/7 +./1-move.py 7123316 +./2-infer.py /nn/7123316/20230220/CT/9 /nn/7123316/20230220/MR/7 +./1-move.py 5831210 +./2-infer.py /nn/5831210/20230220/CT/c /nn/5831210/20230220/MR/a +./1-move.py 3387187 +./2-infer.py /nn/3387187/20230221/CT/a /nn/3387187/20230221/MR/7 +./1-move.py 6803836 +./2-infer.py /nn/6803836/20230221/CT/10 /nn/6803836/20230221/MR/e +./1-move.py +./2-infer.py /nn/6466293/20230222/CT/a /nn/6466293/20230222/MR/7 +./1-move.py 2669302 +./2-infer.py /nn/2669302/20230223/CT/a /nn/2669302/20230223/MR/7 +./1-move.py 4607357 +./2-infer.py /nn/4607357/20230224/CT/a /nn/4607357/20230224/MR/7 +./1-move.py 7055212 +./2-infer.py /nn/7055212/20230224/CT/9 /nn/7055212/20230224/MR/7 +./1-move.py 5027429 +./2-infer.py /nn/5027429/20230306/CT/b /nn/5027429/20230306/MR/9 +./1-move.py 7123530 +./2-infer.py /nn/7123530/20230307/CT/a /nn/7123530/20230307/MR/7 +./1-move.py 7130932 +./2-infer.py /nn/7130932/20230307/CT/a /nn/7130932/20230307/MR/7 +./1-move.py 5771396 +./2-infer.py /nn/5771396/20230308/CT/a /nn/5771396/20230308/MR/7 +./1-move.py 7128131 +./2-infer.py /nn/7128131/20230310/CT/a /nn/7128131/20230310/MR/7 +./1-move.py 6412311 +./2-infer.py /nn/6412311/20230313/CT/9 /nn/6412311/20230313/MR/7 +./1-move.py +./2-infer.py /nn/5494530/20230313/CT/a /nn/5494530/20230313/MR/7 +./1-move.py 7128706 +./2-infer.py /nn/7128706/20230310/CT/c /nn/7128706/20230310/MR +./1-move.py 6925186 +./2-infer.py /nn/6925186/20230314/CT/a /nn/6925186/20230314/MR/7 +./1-move.py 3863530 +./1-move.py 3863530 +./2-infer.py /nn/3863530/20230314/CT/a /nn/3863530/20230314/MR/7 +./1-move.py 7131041 +./2-infer.py /nn/7131041/20230315/CT/a /nn/7131041/20230315/MR/7 +./1-move.py 5682089 +./2-infer.py /nn/5682089/20230315/CT/a /nn/5682089/20230315/MR/7 +./1-move.py 5553220 +./2-infer.py /nn/5553220/20230316/CT/a /nn/5553220/20230316/MR/7 +./1-move.py 3589548 +./2-infer.py /nn/3589548/20230317/CT/9 /nn/3589548/20230317/MR/7 +./1-move.py 2111161 +./2-infer.py /nn/2111161/20230317/CT/9 /nn/2111161/20230317/MR/7 +./1-move.py 6167673 +./2-infer.py /nn/6167673/20230320/CT/9 /nn/6167673/20230320/MR/7 +./1-move.py 2372501 +./2-infer.py /nn/2372501/20230320/CT/c /nn/2372501/20230320/MR/2 +./1-move.py 7134146 +./2-infer.py /nn/7134146/20230321/CT/a /nn/7134146/20230321/MR/7 +./1-move.py 6017134 +./2-infer.py /nn/6017134/20230321/CT/9 /nn/6017134/20230321/MR/7 +./1-move.py 5061967 +./2-infer.py /nn/5061967/20230322/CT/b /nn/5061967/20230322/MR/8 +./1-move.py 3060758 +./2-infer.py /nn/3060758/20230322/CT/a /nn/3060758/20230322/MR/7 +./1-move.py 6943475 +./2-infer.py /nn/6943475/20230323/CT/9 /nn/6943475/20230323/MR/7 +./1-move.py 5027838 +./2-infer.py /nn/5027838/20230323/CT/a /nn/5027838/20230323/MR/7 +./1-move.py 6783185 +./2-infer.py /nn/6783185/20230324/CT/a /nn/6783185/20230324/MR/7 +./1-move.py 4482158 +./2-infer.py /nn/4482158/20230324/CT/9 /nn/4482158/20230324/MR/7 +ls /nn +ls -ltr /nn +ls +./1-move.py 4482158 +./1-move.py 6764185 +./2-infer.py /nn/6764185/20230327/CT/9 /nn/6764185/20230327/MR/7 +./1-move.py +./2-infer.py /nn/7127857/20230327/CT/a /nn/7127857/20230327/MR/7 +./1-move.py 6553099 +./2-infer.py /nn/6553099/20230328/CT/9 /nn/6553099/20230328/MR/7 +./1-move.py 7040640 +./2-infer.py /nn/7040640/20230328/CT/a /nn/7040640/20230328/MR/7 +./1-move.py 6553099 +./2-infer.py /nn/6553099/20230328/CT/9 /nn/6553099/20230328/MR/7 +./1-move.py 7106897 +./2-infer.py /nn/7106897/20230329/CT/a /nn/7106897/20230329/MR/7 +./1-move.py 5261092 +./2-infer.py /nn/5261092/20230329/CT/a /nn/5261092/20230329/MR/7 +./1-move.py 4301162 +./2-infer.py /nn/4301162/20230330/CT/d /nn/4301162/20230330/MR/7 +./1-move.py 7131077 + +./1-move.py 6996427 +./1-move.py 6996427 +./2-infer.py /nn/6996427/20230331/CT/a /nn/6996427/20230331/MR/7 +./1-move.py 1561614 +./2-infer.py /nn/1561614/20230331/CT/b /nn/1561614/20230331/MR/8 +top +exit +./1-move.py +./2-infer.py /nn/6623737/20230406/CT/8 /nn/6623737/20230406/MR/7 +./1-move.py 6631848 +./2-infer.py /nn/6631848/20220810/CT/9 /nn/6631848/20230406/MR/7 +./1-move.py 6631848 +./2-infer.py /nn/6631848/20230406/CT/a /nn/6631848/20230406/MR/7 +./2-infer.py /nn/6631848/20230406/CT/a /nn/6631848/20230406/MR/7 +./2-infer.py /nn/6631848/20230406/CT/a /nn/6631848/20230406/MR/7 +./2-infer.py /nn/6631848/20230406/CT/a /nn/6631848/20230406/MR/7 +./2-infer.py /nn/6631848/20230406/CT/a /nn/6631848/20230406/MR/7 +./1-move.py 6418004 +./1-move.py 8045956 +./2-infer.py /nn/8045956/20230407/CT/b /nn/8045956/20230407/MR/7 +./1-move.py 6418004 +./2-infer.py /nn/6418004/20230407/CT/8 /nn/6418004/20230407/MR/7 +./1-move.py 2644799 +./2-infer.py /nn/2644799/20230410/CT/a /nn/2644799/20230410/MR/7 +./1-move.py 4379301 +./2-infer.py /nn/4379301/20230410/CT/a /nn/4379301/20230410/MR/7 +./1-move.py 6563617 +./2-infer.py /nn/6563617/20230411/CT/9 /nn/6563617/20230411/MR/2 +./1-move.py 6739334 +./2-infer.py /nn/6739334/20230411/CT/8 /nn/6739334/20230411/MR/7 +./1-move.py 6393784 +./2-infer.py /nn/6393784/20230412/CT/9 /nn/6393784/20230412/MR/7 +./1-move.py 6962333 +./2-infer.py /nn/6962333/20230412/CT/9 /nn/6962333/20230412/MR/7 +./1-move.py 6474814 +./2-infer.py /nn/6474814/20230413/CT/a /nn/6474814/20230413/MR/7 +./1-move.py 2430604 +./2-infer.py /nn/2430604/20230413/CT/a /nn/2430604/20230413/MR/7 +./1-move.py 4572736 +./2-infer.py /nn/4572736/20230414/CT/a /nn/4572736/20230414/MR/7 +./1-move.py 3905496 +./2-infer.py /nn/3905496/20230414/CT/a /nn/3905496/20230414/MR/7 +./1-move.py 5767800 +./2-infer.py /nn/5767800/20230417/CT/a /nn/5767800/20230417/MR/7 +./1-move.py 6789767 +./2-infer.py /nn/6789767/20230417/CT/9 /nn/6789767/20230417/MR/7 +./1-move.py 5760888 +./2-infer.py /nn/5760888/20230418/CT/8 /nn/5760888/20230418/MR/7 +./1-move.py 6700596 +/nn/6700596/20230418/CT/9 /nn/6700596/20230418/MR/7 +./2-infer.py /nn/6700596/20230418/CT/9 /nn/6700596/20230418/MR/7 +./1-move.py 2334044 +./2-infer.py /nn/2334044/20230419/CT/9 /nn/2334044/20230419/MR/7 +./1-move.py 3001393 +./1-move.py 3001393 +./2-infer.py /nn/3001393/20230419/CT/a /nn/3001393/20230419/MR/7 +./1-move.py 6596248 +./2-infer.py /nn/6596248/20230420/CT/a /nn/6596248/20230420/MR/6 +./1-move.py 7104717 +./2-infer.py /nn/7104717/20230420/CT/a /nn/7104717/20230420/MR/6 +./1-move.py 7132783 +./2-infer.py /nn/7132783/20230421/CT/8 /nn/7132783/20230421/MR/7 +./1-move.py 7096197 +./2-infer.py /nn/7096197/20230424/CT/a /nn/7096197/20230424/MR/7 +./1-move.py 6841107 +./2-infer.py /nn/6841107/20230424/CT/9 /nn/6841107/20230424/MR/7 +./1-move.py 2739367 +./2-infer.py /nn/2739367/20230425/CT/8 /nn/2739367/20230425/MR/7 +./1-move.py 5789401 +./2-infer.py /nn/5789401/20230425/CT/a /nn/5789401/20230425/MR/7 +./1-move.py 1845653 +./2-infer.py /nn/1845653/20230426/CT/a /nn/1845653/20230426/MR/7 +./1-move.py 5956729 +./2-infer.py /nn/5956729/20230426/CT/a /nn/5956729/20230426/MR/7 +./1-move.py 5956729 +./2-infer.py /nn/5956729/20230426/CT/a /nn/5956729/20230426/MR/7 +./1-move.py 7137162 +./2-infer.py /nn/7137162/20230427/CT/a /nn/7137162/20230427/MR/7 +./1-move.py 8003599 +./2-infer.py /nn/8003599/20230427/CT/a /nn/8003599/20230427/MR/7 +./1-move.py 7138225 +./2-infer.py /nn/7138225/20230428/CT/a /nn/7138225/20230428/MR/7 +./1-move.py 3698229 +./2-infer.py /nn/3698229/20230428/CT/a /nn/3698229/20230428/MR/7 +./1-move.py 3391186 +./2-infer.py /nn/3391186/20230501/CT/9 /nn/3391186/20230501/MR/7 +./1-move.py 3698229 +./2-infer.py /nn/3698229/20230428/CT/9 /nn/3698229/20230428/MR/6 +./1-move.py 6793968 +./2-infer.py /nn/6793968/20230501/CT/d /nn/6793968/20230501/MR/7 +./1-move.py 6815738 +./2-infer.py /nn/6815738/20230502/CT/8 /nn/6815738/20230502/MR/7 +./1-move.py 7108421 +./2-infer.p +./1-move.py 4255849 +./2-infer.py /nn/4255849/20230503/CT/9 /nn/4255849/20230503/MR/6 +./1-move.py 6688931 +./2-infer.py /nn/6688931/20230503/CT/a /nn/6688931/20230503/MR/7 +./1-move.py 6688931 +./2-infer.py /nn/6688931/20230503/CT/a /nn/6688931/20230503/MR/7 +./1-move.py 6719072 +./2-infer.py /nn/6719072/20230504/CT/a /nn/6719072/20230504/MR/7 +./1-move.py 6805343 +./2-infer.py /nn/6805343/20230504/CT/a /nn/6805343/20230504/MR/1 +./1-move.py 4273476 +./2-infer.py /nn/4273476/20230505/CT/a /nn/4273476/20230505/MR/7 +./1-move.py 7104717 +./2-infer.py /nn/7104717/20230505/CT/a /nn/7104717/20230505/MR/7 +./1-move.py 5689608 +./2-infer.py /nn/5689608/20230508/CT/a /nn/5689608/20230508/MR/7 +./1-move.py 3277833 +./2-infer.py /nn/3277833/20230508/CT/a /nn/3277833/20230508/MR/7 +./1-move.py 3463014 +./1-move.py 2772372 +./2-infer.py /nn/2772372/20230509/CT/a /nn/2772372/20230509/MR/7 +./1-move.py 5726776 +./2-infer.py /nn/5726776/20230510/CT/5 /nn/5726776/20230510/MR/2 +./1-move.py 3276632 +./2-infer.py /nn/3276632/20230511/CT/9 /nn/3276632/20230511/MR/7 +./1-move.py 3566418 +./2-infer.py /nn/3566418/20230511/CT/9 /nn/3566418/20230511/MR/7 +./1-move.py 3566418 +/nn/3566418/20230511/CT/8 /nn/3566418/20230511/MR/7 +./2-infer.py /nn/3566418/20230511/CT/8 /nn/3566418/20230511/MR/7 +./1-move.py 3994172 +./2-infer.py /nn/3994172/20230512/CT/8 /nn/3994172/20230512/MR/7 +./1-move.py 5868361 +./2-infer.py /nn/5868361/20230512/CT/8 /nn/5868361/20230512/MR/7 +./1-move.py 7146459 +./2-infer.py /nn/7146459/20230515/CT/a /nn/7146459/20230515/MR/7 +./1-move.py 7124386 +./1-move.py 7124386 +./2-infer.py /nn/7124386/20230515/CT/a /nn/7124386/20230515/MR/7 +./1-move.py 7127462 +./2-infer.py /nn/7127462/20230516/CT/4 /nn/7127462/20230516/MR/3 +./1-move.py 6510305 +./2-infer.py /nn/6510305/20230516/CT/9 /nn/6510305/20230516/MR/7 +./1-move.py 7128841 +./2-infer.py /nn/7128841/20230517/CT/8 /nn/7128841/20230517/MR/6 +./1-move.py 6400837 +./2-infer.py /nn/6400837/20230517/CT/8 /nn/6400837/20230517/MR/7 +./1-move.py 6743139 +./2-infer.py /nn/6743139/20230518/CT/c /nn/6743139/20230518/MR/6 +./1-move.py 3561770 +./2-infer.py /nn/3561770/20230518/CT/9 /nn/3561770/20230518/MR/6 +./1-move.py 3561770 +./2-infer.py /nn/3561770/20230518/CT/9 /nn/3561770/20230518/MR/7 +./1-move.py 7138891 +./2-infer.py /nn/7138891/20230522/CT/9 MAR /nn/7138891/20230522/MR/7 +./1-move.py 2508411 +./2-infer.py /nn/2508411/20230522/CT/a /nn/2508411/20230522/MR/7 +./1-move.py 7138891 +/nn/7138891/20230522/CT/9 /nn/7138891/20230522/MR/7 +./2-infer.py /nn/7138891/20230522/CT/9 /nn/7138891/20230522/MR/7 +./1-move.py 7021220 +./2-infer.py /nn/7021220/20230523/CT/9 /nn/7021220/20230523/MR/7 +./1-move.py 3978624 +./2-infer.py /nn/3978624/20230523/CT/9 /nn/3978624/20230523/MR/7 +./1-move.py 7144666 +./2-infer.py /nn/7144666/20230525/CT/9 /nn/7144666/20230525/MR/7 +./1-move.py 6861756 +./2-infer.py /nn/6861756/20230525/CT/a /nn/6861756/20230525/MR/7 +./1-move.py 4500037 +./2-infer.py /nn/4500037/20230526/CT/a /nn/4500037/20230526/MR/6 +./1-move.py 7128016 +./2-infer.py /nn/7128016/20230526/CT/a /nn/7128016/20230526/MR/6 +./1-move.py 7135342 +./2-infer.py /nn/7135342/20230529/CT/b /nn/7135342/20230529/MR/8 +./1-move.py 7046657 +./2-infer.py /nn/7046657/20230529/CT/a /nn/7046657/20230529/MR/7 +./1-move.py 5494513 +./2-infer.py /nn/5494513/20230530/CT/5 /nn/5494513/20230530/MR/2 +./1-move.py +./2-infer +./1-move.py 6825963 +./2-infer.py /nn/6825963/20230531/CT/9 /nn/6825963/20230531/MR/7 +./1-move.py 7074124 +./2-infer.py /nn/7074124/20230531/CT/b /nn/7074124/20230531/MR/7 +./1-move.py 5168451 +./2-infer.py /nn/5168451/20230601/CT/9 /nn/5168451/20230601/MR/7 +./1-move.py +./2-infer.py /nn/3924866/20230601/CT/a /nn/3924866/20230601/MR/7 +./1-move.py 7008354 +./2-infer.py /nn/7008354/20230602/CT/8 /nn/7008354/20230602/MR/7 +./1-move.py 5665595 +./2-infer.py /nn/5665595/20230605/CT/9 /nn/5665595/20230605/MR/7 +./1-move.py 7115427 +./2-infer.py /nn/7115427/20230605/CT/9 /nn/7115427/20230605/MR/7 +./1-move.py 2567501 +./2-infer.py /nn/2567501/20230606/CT/8 /nn/2567501/20230606/MR/7 +./1-move.py 5569945 +./2-infer.p +./1-move.py 7144930 +./2-infer.py /nn/7144930/20230607/CT/9 /nn/7144930/20230607/MR/7 +./1-move.py 6744457 +./2-infer.py /nn/6744457/20230607/CT/9 /nn/6744457/20230607/MR/7 +./1-move.py 2313478 +./2-infer.py /nn/2313478/20230608/CT/a /nn/2313478/20230608/MR/6 +./1-move.py 7146030 +./2-infer.py /nn/7146030/20230609/CT/a /nn/7146030/20230609/MR/7 +./1-move.py 1994656 +./2-infer.py /nn/1994656/20230609/CT/a /nn/1994656/20230609/MR/7 +./1-move.py 1784858 +./2-infer.py /nn/1784858/20230612/CT/a /nn/1784858/20230612/MR/7 +./1-move.py 6507299 +./2-infer.py /nn/6507299/20230612/CT/a /nn/6507299/20230612/MR/7 +./1-move.py 6305556 +./2-infer.py /nn/6305556/20230613/CT/9 /nn/6305556/[A +./1-move.py 6305556 +./2-infer.py /nn/6305556/20230613/CT/9 /nn/6305556/20230613/MR/7 +./1-move.py +./2-infer.py /nn/2559243/20230613/CT/a /nn/2559243/20230613/MR/7 +./1-move.py 7112382 +./2-infer.py /nn/7112382/20230614/CT/a /nn/7112382/20230614/MR/7 +./1-move.py 6460301 +./2-infer.py /nn/6460301/20230614/CT/9 /nn/6460301/20230614/MR/7 +nvidia-smi +./1-move.py 1325527 +./2-infer.py /nn/1325527/20230615/CT/9 /nn/1325527/20230615/MR/7 +./1-move.py 7018112 +./2-infer.py /nn/7018112/20230615/CT/9 /nn/7018112/20230615/MR/7 +./1-move.py 6647069 +./2-infer.py /nn/6647069/20230616/CT/a /nn/6647069/20230616/MR/7 +./1-move.py 7150687 +./2-infer.py /nn/7150687/20230616/CT/9 /nn/7150687/20230616/MR/7 +./1-move.py 6746593 +./2-infer.py /nn/6746593/20230619/CT/9 /nn/6746593/20230619/MR/7 +./1-move.py 7024631 +./2-infer.py /nn/7024631/20230619/CT/a /nn/7024631/20230619/MR/7 +./1-move.py 3384498 +./2-infer.py /nn/3384498/20230620/CT/a /nn/3384498/20230620/MR/7 +./1-move.py 7113684 +./2-infer.py /nn/7113684/20230620/CT/a /nn/7113684/20230620/MR/7 +./1-move.py 5053997 +./2-infer.py /nn/5053997/20230621/CT/a /nn/5053997/20230621/MR/7 +./1-move.py 5522920 +./2-infer.py /nn/5522920/20230621/CT/a /nn/5522920/20230621/MR/7 +./1-move.py 5522920 +./2-infer.py /nn/5522920/20230621/CT/a /nn/5522920/20230621/MR/7 +./1-move.py 7152084 +./2-infer.py /nn/7152084/20230623/CT/a /nn/7152084/20230623/MR/7 +./1-move.py 6354781 +./2-infer.py /nn/6354781/20230623/CT/a /nn/6354781/20230623/MR/7 +./1-move.py 3950552 +./2-infer.py /nn/3950552/20230626/CT/8 /nn/3950552/20230626/MR/7 +./1-move.py 6699766 +./2-infer.py /nn/6699766/20230626/CT/9 /nn/6699766/20230626/MR/7 +./1-move.py 7143289 +./2-infer.py /nn/7143289/20230627/CT/8 /nn/7143289/20230627/MR/7 +./1-move.py 6716839 +./2-infer.py /nn/6716839/20230627/CT/8 /nn/6716839/20230627/MR/7 +./1-move.py 7152103 +./2-infer.py /nn/7152103/20230628/CT/9 /nn/7152103/20230628/MR/7 +./1-move.py 6119992 +./2-infer.py /nn/6119992/20230628/CT/9 /nn/6119992/20230628/MR/7 +./1-move.py 6224878 +./2-infer.py /nn/6224878/20230629/CT/9 /nn/6224878/20230629/MR/6 +./1-move.py 7147425 +./2-infer.py /nn/7147425/20230629/CT/9 /nn/7147425/20230629/MR/7 +./1-move.py 7152233 +./2-infer.py /nn/7152233/20230630/CT/a /nn/7152233/20230630/MR/6 +./1-move.py 711176 +./2-infer.py /nn/7111769/20230630/CT/a /nn/7111769/20230630/MR/7 +./1-move.py 7130901 +./2-infer.py /nn/7130901/20230703/CT/a /nn/7130901/20230703/MR/7 +./1-move.py 7150422 + +./1-move.py 7111769 +./1-move.py 6106176 +./2-infer.py /nn/6106176/20230704/CT/a /nn/6106176/20230704/MR/7 +./1-move.py 3889924 +./2-infer.py /nn/3889924/20230704/CT/9 /nn/3889924/20230704/MR/7 +./1-move.py 3678428 +./2-infer.py /nn/3678428/20230705/CT/a /nn/3678428/20230705/MR/6 +./1-move.py 7155718 +./2-infer.py /nn/7155718/20230705/CT/a /nn/7155718/20230705/MR/7 +./1-move.py +./1-move.py 6803603 +./2-infer.py /nn/6803603/20230706/CT/9 /nn/6803603/20230706/MR/7 +./1-move.py 4153961 +./2-infer.py /nn/4153961/20230706/CT/9 /nn/4153961/20230706/MR/7 +./1-move.py +./2-infer.py /nn/6510305/20230707/CT/8 /nn/6510305/20230707/MR/7 +./1-move.py 5369780 +./2-infer.py /nn/5369780/20230707/CT/9 /nn/5369780/20230707/MR/7 +./1-move.py 7111644 +./2-infer.py /nn/7111644/20230710/CT/9 /nn/7111644/20230710/MR/7 +./1-move.py 3247320 +./2-infer.py /nn/3247320/20230710/CT/9 /nn/3247320/20230710/MR/7 +./1-move.py 3782801 +./1-move.py 3782810 +./2-infer.py /nn/3782810/20230711/CT/a /nn/3782810/20230711/MR/7 +./1-move.py 7047930 +./2-infer.py /nn/7047930/20230711/CT/8 /nn/7047930/20230711/MR/2 +./1-move.py 7155947 +./2-infer.py /nn/7155947/20230712/CT/9 /nn/7155947/20230712/MR/7 +./1-move.py 6607568 +./2-infer.py /nn/6607568/20230712/CT/9 /nn/6607568/20230712/MR/7 +./1-move.py 5638465 +./2-infer.py /nn/5638465/20230713/CT/9 /nn/5638465/20230713/MR/2 +./1-move.py 2855422 +./2-infer.py /nn/2855422/20230713/CT/9 /nn/2855422/20230713/MR/2 +./1-move.py 4118618 +./2-infer.py /nn/4118618/20230714/CT/d /nn/4118618/20230714/MR/8 +./1-move.py 7138156 +./2-infer.py /nn/7138156/20230714/CT/9 /nn/7138156/20230714/MR/7 +22444455555555444444./1-move.py 14444454555 +./1-move.py 4214975 +./2-infer.py /nn/4214975/20230717/CT/c /nn/4214975/20230717/MR/8 +./1-move.py 3485443 +./2-infer.py /nn/3485443/20230717/CT/a /nn/3485443/20230717/MR/7 +./1-move.py 6824186 +./2-infer.py /nn/6824186/20230718/CT/9 /nn/6824186/20230718/MR/7 +./1-move.py 6547497 +./2-infer.py /nn/6547497/20230718/CT/8 /nn/6547497/20230718/MR/7 +./1-move.py 1875185 +./2-infer.py /nn/1875185/20230719/CT/a /nn/1875185/20230719/MR/6 +./1-move.py 7023789 +./2-infer.py /nn/7023789/20230719/CT/a /nn/7023789/20230719/MR/6 +./1-move.py 2098952 +./2-infer.py /nn/2098952/20230720/CT/a /nn/2098952/20230720/MR/6 +./1-move.py 7151783 +./2-infer.py /nn/7151783/20230720/CT/a /nn/7151783/20230720/MR/7 +./1-move.py 7075650 +./2-infer.py /nn/7075650/20230721/CT/9 /nn/7075650/20230721/MR/7 +./1-move.py 4352680 +./2-infer.py /nn/4352680/20230721/CT/9 MAR +./2-infer.py /nn/4352680/20230721/CT/9 MAR /nn/4352680/20230721/MR/7 +./1-move.py 4352680 +./2-infer.py /nn/4352680/20230721/CT/a /nn/4352680/20230721/MR/7 +./1-move.py 7144639 +./2-infer.py /nn/7144639/20230724/CT/a /nn/7144639/20230724/MR/3 +./1-move.py 4505405 +./2-infer.py /nn/4505405/20230724/CT/9 /nn/4505405/20230724/MR/7 +./1-move.py 7157433 +./2-infer.py /nn/7157433/20230725/CT/b /nn/7157433/20230725/MR/7 +./1-move.py 3283427 +./2-infer.py /nn/3283427/20230725/CT/9 /nn/3283427/20230725/MR/7 +./1-move.py 6401745 +./2-infer.py /nn/6401745/20230726/CT/a /nn/6401745/20230726/MR/6 +./1-move.py 4383470 +./2-infer.py /nn/4383470 +./1-move.py 1994335 +./2-infer.py /nn/1994335/20230727/CT/9 /nn/1994335/20230727/MR/7 +./1-move.py 6184547 +./2-infer.py /nn/6184547/20230728/CT/a /nn/6184547/20230728/MR/7 +./1-move.py 5223617 +./2-infer.py /nn/5223617/20220520/CT/8 /nn/5223617/20230728/MR/7 +./1-move.py /nn/5223617/20230728/MR/7 + +./1-move.py 5223617 +./1-move.py /nn/5223617/20230728/CT/8 /nn/5223617/20230728/MR/7 +./1-move.py /nn/5223617/20230728/CT/8 /nn/5223617/20230728/MR/7 +./2-infer.py /nn/5223617/20220520/CT/8 /nn/5223617/20230728/MR/7 +./1-move.py 1003532 +./2-infer.py /nn/1003532/20230728/CT/9 /nn/1003532/20230728/MR/2 +./1-move.py 5223617 +./2-infer.py /nn/5223617/20230728/CT/8 /nn/5223617/20230728/MR/7 +./1-move.py 3307080 +./2-infer.py /nn/3307080/20230731/CT/8 /nn/3307080/20230731/MR/7 +./1-move.py 3307080 +./2-infer.py /nn/3307080/20230731/CT/8 /nn/3307080/20230731/MR/7 +./1-move.py 2431392 +./2-infer.py /nn/2431392/20230731/CT/9 /nn/2431392/20230731/MR/2 +./1-move.py 7155758 +./2-infer.py /nn/7155758/20230801/CT/a /nn/7155758/20230801/MR/7 +./1-move.py 5879999 +./2-infer.py /nn/5879999/20230801/CT/a /nn/5879999/20230801/MR/7 +./1-move.py 6460676 +./2-infer.py /nn/6460676/20230802/CT/9 /nn/6460676/20230802/MR/7 +./1-move.py 4107788 +./2-infer.py /nn/4107788/20230802/CT/a /nn/4107788/20230802/MR/7 +./1-move.py 7159471 +./2-infer.py /nn/7159471/20 +./1-move.py 7159471 +./2-infer.py /nn/7159471/20230804/CT/a /nn/7159471/20230804/MR/7 +ps aux +ps aux +ps aux +nvidia-smi +nvidia-smi +nvidia-smi diff --git a/.bash_history-00353.tmp b/.bash_history-00353.tmp new file mode 100644 index 0000000..60638f7 --- /dev/null +++ b/.bash_history-00353.tmp @@ -0,0 +1,98 @@ +./2-infer.py /nn/7091925/20230208/CT/9 /nn/7091925/20230208/MR/7 +./1-move.py 6035638 +./2-infer.py /nn/6035638/20230209/CT/8 /nn/6035638/20230209/MR/7 +./1-move.py 7030265 +./2-infer.py /nn/7030265/20230209/CT/9 /nn/7030265/20230209/MR/7 +./1-move.py 6981439 +./2-infer.py /nn/6981439/20230210/CT/a /nn/6981439/20230210/MR/7 +./1-move.py 5665595 +./2-infer.py /nn/5665595/20230210/CT/9 /nn/5665595/20230210/MR/7 +./1-move.py 3903066 +./2-infer.py /nn/3903066/20230213/CT/a /nn/3903066/20230213/MR/7 +./1-move.py 3903066 +./2-infer.py /nn/3903066/20230213/CT/9 /nn/3903066/20230213/MR/7 +./1-move.py 5487071 +./2-infer.py /nn/5487071/20230213/CT/9 /nn/5487071/20230213/MR/7 +./1-move.py 6771041 +./2-infer.py /nn/6771041/20230214/CT/9 /nn/6771041/20230214/MR/7 +./1-move.py 5495897 +./2-infer.py /nn/5495897/20230214/CT/9 /nn/5495897/20230214/MR/7 +./1-move.py 6987123 +./2-infer.py /nn/6987123/20230215/CT/9 /nn/6987123/20230215/MR/7 +./1-move.py 3183636 +./2-infer.py /nn/3183636/20230215/CT/9 /nn/3183636/20230215/MR/7 +./1-move.py 5768342 +./2-infer.py /nn/5768342/20230216/CT/9 /nn/5768342/20230216/MR/7 +./1-move.py 5695691 +./2-infer.py /nn/5695691/20230216/CT/a /nn/5695691/20230216/MR/7 +./1-move.py 5768342 +./2-infer.py /nn/5768342/20230216/CT/9 /nn/5768342/20230216/MR/7 +./1-move.py 7123316 +./2-infer.py /nn/7123316/20230220/CT/9 /nn/7123316/20230220/MR/7 +./1-move.py 5831210 +./2-infer.py /nn/5831210/20230220/CT/c /nn/5831210/20230220/MR/a +./1-move.py 3387187 +./2-infer.py /nn/3387187/20230221/CT/a /nn/3387187/20230221/MR/7 +./1-move.py 6803836 +./2-infer.py /nn/6803836/20230221/CT/10 /nn/6803836/20230221/MR/e +./1-move.py +./2-infer.py /nn/6466293/20230222/CT/a /nn/6466293/20230222/MR/7 +./1-move.py 2669302 +./2-infer.py /nn/2669302/20230223/CT/a /nn/2669302/20230223/MR/7 +./1-move.py 4607357 +./2-infer.py /nn/4607357/20230224/CT/a /nn/4607357/20230224/MR/7 +./1-move.py 7055212 +./2-infer.py /nn/7055212/20230224/CT/9 /nn/7055212/20230224/MR/7 +./1-move.py 5027429 +./2-infer.py /nn/5027429/20230306/CT/b /nn/5027429/20230306/MR/9 +./1-move.py 7123530 +./2-infer.py /nn/7123530/20230307/CT/a /nn/7123530/20230307/MR/7 +./1-move.py 7130932 +./2-infer.py /nn/7130932/20230307/CT/a /nn/7130932/20230307/MR/7 +./1-move.py 5771396 +./2-infer.py /nn/5771396/20230308/CT/a /nn/5771396/20230308/MR/7 +./1-move.py 7128131 +./2-infer.py /nn/7128131/20230310/CT/a /nn/7128131/20230310/MR/7 +./1-move.py 6412311 +./2-infer.py /nn/6412311/20230313/CT/9 /nn/6412311/20230313/MR/7 +./1-move.py +./2-infer.py /nn/5494530/20230313/CT/a /nn/5494530/20230313/MR/7 +./1-move.py 7128706 +./2-infer.py /nn/7128706/20230310/CT/c /nn/7128706/20230310/MR +./1-move.py 6925186 +./2-infer.py /nn/6925186/20230314/CT/a /nn/6925186/20230314/MR/7 +./1-move.py 3863530 +./1-move.py 3863530 +./2-infer.py /nn/3863530/20230314/CT/a /nn/3863530/20230314/MR/7 +./1-move.py 7131041 +./2-infer.py /nn/7131041/20230315/CT/a /nn/7131041/20230315/MR/7 +./1-move.py 5682089 +./2-infer.py /nn/5682089/20230315/CT/a /nn/5682089/20230315/MR/7 +./1-move.py 5553220 +./2-infer.py /nn/5553220/20230316/CT/a /nn/5553220/20230316/MR/7 +./1-move.py 3589548 +./2-infer.py /nn/3589548/20230317/CT/9 /nn/3589548/20230317/MR/7 +./1-move.py 2111161 +./2-infer.py /nn/2111161/20230317/CT/9 /nn/2111161/20230317/MR/7 +./1-move.py 6167673 +./2-infer.py /nn/6167673/20230320/CT/9 /nn/6167673/20230320/MR/7 +./1-move.py 2372501 +./2-infer.py /nn/2372501/20230320/CT/c /nn/2372501/20230320/MR/2 +./1-move.py 7134146 +./2-infer.py /nn/7134146/20230321/CT/a /nn/7134146/20230321/MR/7 +./1-move.py 6017134 +./2-infer.py /nn/6017134/20230321/CT/9 /nn/6017134/20230321/MR/7 +./1-move.py 5061967 +./2-infer.py /nn/5061967/20230322/CT/b /nn/5061967/20230322/MR/8 +./1-move.py 3060758 +./2-infer.py /nn/3060758/20230322/CT/a /nn/3060758/20230322/MR/7 +./1-move.py 6943475 +./2-infer.py /nn/6943475/20230323/CT/9 /nn/6943475/20230323/MR/7 +./1-move.py 5027838 +./2-infer.py /nn/5027838/20230323/CT/a /nn/5027838/20230323/MR/7 +./1-move.py 6783185 +./2-infer.py /nn/6783185/20230324/CT/a /nn/6783185/20230324/MR/7 +./1-move.py 4482158 +./2-infer.py /nn/4482158/20230324/CT/9 /nn/4482158/20230324/MR/7 +ls /nn +ls -ltr /nn diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b20d69f --- /dev/null +++ b/.gitignore @@ -0,0 +1,163 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +*.nii +*.nii.gz diff --git a/.jupyter/jupyter_notebook_config.json b/.jupyter/jupyter_notebook_config.json new file mode 100644 index 0000000..ba00e1e --- /dev/null +++ b/.jupyter/jupyter_notebook_config.json @@ -0,0 +1,5 @@ +{ + "NotebookApp": { + "password": "argon2:$argon2id$v=19$m=10240,t=10,p=8$/HEcZ8SGmRfbiGy+ShUi3w$z9qZcXIgssWhW8t+ck11DQ" + } +} \ No newline at end of file diff --git a/.jupyter/lab/user-settings/@jupyterlab/docmanager-extension/plugin.jupyterlab-settings b/.jupyter/lab/user-settings/@jupyterlab/docmanager-extension/plugin.jupyterlab-settings new file mode 100644 index 0000000..a319ba7 --- /dev/null +++ b/.jupyter/lab/user-settings/@jupyterlab/docmanager-extension/plugin.jupyterlab-settings @@ -0,0 +1,7 @@ +{ + +defaultViewers: { + html: "Editor" + } + +} \ No newline at end of file diff --git a/.jupyter/lab/workspaces/lab-a511.jupyterlab-workspace b/.jupyter/lab/workspaces/lab-a511.jupyterlab-workspace new file mode 100644 index 0000000..ac31f6e --- /dev/null +++ b/.jupyter/lab/workspaces/lab-a511.jupyterlab-workspace @@ -0,0 +1 @@ +{"data":{"layout-restorer:data":{"main":{"dock":{"type":"tab-area","currentIndex":1,"widgets":["editor:1-move.py","terminal:1","terminal:2","editor:2-infer.py","editor:adding.py"]},"mode":"multiple-document","current":"terminal:1"},"left":{"collapsed":false,"current":"filebrowser","widgets":["filebrowser","running-sessions","command-palette","jp-property-inspector","tab-manager","extensionmanager.main-view"]},"right":{"collapsed":true,"widgets":[]}},"@jupyterlab/settingeditor-extension:plugin":{"sizes":[0.16252955082742318,0.8374704491725768],"container":{"plugin":"@jupyterlab/terminal-extension:plugin","sizes":[0.4873891008009604,0.5126108991990396]}},"file-browser-filebrowser:cwd":{"path":""},"editor:2-infer.py":{"data":{"path":"2-infer.py","factory":"Editor"}},"editor:1-move.py":{"data":{"path":"1-move.py","factory":"Editor"}},"editor:adding.py":{"data":{"path":"adding.py","factory":"Editor"}},"terminal:1":{"data":{"name":"1"}},"terminal:2":{"data":{"name":"2"}}},"metadata":{"id":"/lab"}} \ No newline at end of file diff --git a/.jupyter/lab/workspaces/labworkspacesauto-c-4c4c.jupyterlab-workspace b/.jupyter/lab/workspaces/labworkspacesauto-c-4c4c.jupyterlab-workspace new file mode 100644 index 0000000..ddce5a0 --- /dev/null +++ b/.jupyter/lab/workspaces/labworkspacesauto-c-4c4c.jupyterlab-workspace @@ -0,0 +1 @@ +{"data":{"layout-restorer:data":{"main":{"dock":{"type":"tab-area","currentIndex":3,"widgets":["editor:1-move.py","editor:2-infer.py","editor:adding.py","terminal:1"]},"mode":"multiple-document","current":"terminal:1"},"left":{"collapsed":false,"current":"filebrowser","widgets":["filebrowser","running-sessions","command-palette","jp-property-inspector","tab-manager","extensionmanager.main-view"]},"right":{"collapsed":true,"widgets":[]}},"@jupyterlab/settingeditor-extension:plugin":{"sizes":[0.16252955082742318,0.8374704491725768],"container":{"plugin":"@jupyterlab/terminal-extension:plugin","sizes":[0.4873891008009604,0.5126108991990396]}},"file-browser-filebrowser:cwd":{"path":""},"editor:2-infer.py":{"data":{"path":"2-infer.py","factory":"Editor"}},"editor:1-move.py":{"data":{"path":"1-move.py","factory":"Editor"}},"editor:adding.py":{"data":{"path":"adding.py","factory":"Editor"}},"terminal:1":{"data":{"name":"1"}}},"metadata":{"id":"/lab/workspaces/auto-c"}} \ No newline at end of file diff --git a/.jupyter/lab/workspaces/labworkspacesauto-d-fa4c.jupyterlab-workspace b/.jupyter/lab/workspaces/labworkspacesauto-d-fa4c.jupyterlab-workspace new file mode 100644 index 0000000..f817c06 --- /dev/null +++ b/.jupyter/lab/workspaces/labworkspacesauto-d-fa4c.jupyterlab-workspace @@ -0,0 +1 @@ +{"data":{"layout-restorer:data":{"main":{"dock":{"type":"tab-area","currentIndex":7,"widgets":["editor:1-move.py","editor:2-infer.py","editor:myapp/config/providers.py","editor:myapp/config/auth.py","editor:myapp/routes/api.py","editor:docker/qrun.sh","editor:myapp/routes/web.py","terminal:1","setting-editor:setting-editor","editor:myapp/Kernel.py"]},"mode":"multiple-document","current":"terminal:1"},"left":{"collapsed":false,"current":"filebrowser","widgets":["filebrowser","running-sessions","command-palette","jp-property-inspector","tab-manager","extensionmanager.main-view"]},"right":{"collapsed":true,"widgets":[]}},"file-browser-filebrowser:cwd":{"path":"docker"},"editor:2-infer.py":{"data":{"path":"2-infer.py","factory":"Editor"}},"editor:1-move.py":{"data":{"path":"1-move.py","factory":"Editor"}},"editor:myapp/config/providers.py":{"data":{"path":"myapp/config/providers.py","factory":"Editor"}},"editor:myapp/config/auth.py":{"data":{"path":"myapp/config/auth.py","factory":"Editor"}},"editor:myapp/Kernel.py":{"data":{"path":"myapp/Kernel.py","factory":"Editor"}},"editor:myapp/routes/web.py":{"data":{"path":"myapp/routes/web.py","factory":"Editor"}},"editor:myapp/routes/api.py":{"data":{"path":"myapp/routes/api.py","factory":"Editor"}},"editor:docker/qrun.sh":{"data":{"path":"docker/qrun.sh","factory":"Editor"}},"terminal:1":{"data":{"name":"1"}},"setting-editor:setting-editor":{"data":{}},"@jupyterlab/settingeditor-extension:plugin":{"sizes":[0.23954703832752614,0.7604529616724739],"container":{"plugin":"@jupyterlab/console-extension:tracker","sizes":[0.48738910080096043,0.5126108991990396]}}},"metadata":{"id":"/lab/workspaces/auto-d"}} \ No newline at end of file diff --git a/.jupyter/lab/workspaces/labworkspacesauto-m-cb31.jupyterlab-workspace b/.jupyter/lab/workspaces/labworkspacesauto-m-cb31.jupyterlab-workspace new file mode 100644 index 0000000..d1a1c43 --- /dev/null +++ b/.jupyter/lab/workspaces/labworkspacesauto-m-cb31.jupyterlab-workspace @@ -0,0 +1 @@ +{"data":{"layout-restorer:data":{"main":{"dock":{"type":"tab-area","currentIndex":3,"widgets":["editor:1-move.py","editor:2-infer.py","editor:myapp/config/providers.py","editor:myapp/config/auth.py","editor:myapp/routes/api.py","editor:docker/qrun.sh","editor:myapp/routes/web.py","editor:myapp/Kernel.py"]},"mode":"multiple-document","current":"editor:myapp/config/auth.py"},"left":{"collapsed":false,"current":"running-sessions","widgets":["filebrowser","running-sessions","command-palette","jp-property-inspector","tab-manager","extensionmanager.main-view"]},"right":{"collapsed":true,"widgets":[]}},"file-browser-filebrowser:cwd":{"path":"docker"},"editor:2-infer.py":{"data":{"path":"2-infer.py","factory":"Editor"}},"editor:1-move.py":{"data":{"path":"1-move.py","factory":"Editor"}},"editor:myapp/config/providers.py":{"data":{"path":"myapp/config/providers.py","factory":"Editor"}},"editor:myapp/config/auth.py":{"data":{"path":"myapp/config/auth.py","factory":"Editor"}},"editor:myapp/Kernel.py":{"data":{"path":"myapp/Kernel.py","factory":"Editor"}},"editor:myapp/routes/web.py":{"data":{"path":"myapp/routes/web.py","factory":"Editor"}},"editor:myapp/routes/api.py":{"data":{"path":"myapp/routes/api.py","factory":"Editor"}},"editor:docker/qrun.sh":{"data":{"path":"docker/qrun.sh","factory":"Editor"}}},"metadata":{"id":"/lab/workspaces/auto-m"}} \ No newline at end of file diff --git a/.jupyter/lab/workspaces/labworkspacesauto-q-6fd4.jupyterlab-workspace b/.jupyter/lab/workspaces/labworkspacesauto-q-6fd4.jupyterlab-workspace new file mode 100644 index 0000000..a2b57a3 --- /dev/null +++ b/.jupyter/lab/workspaces/labworkspacesauto-q-6fd4.jupyterlab-workspace @@ -0,0 +1 @@ +{"data":{"layout-restorer:data":{"main":{"dock":{"type":"tab-area","currentIndex":5,"widgets":["editor:1-move.py","editor:2-infer.py","editor:myapp/config/providers.py","editor:myapp/config/auth.py","editor:myapp/routes/api.py","terminal:5","editor:docker/qrun.sh","editor:myapp/routes/web.py","editor:myapp/Kernel.py"]},"mode":"multiple-document","current":"terminal:5"},"left":{"collapsed":false,"current":"filebrowser","widgets":["filebrowser","running-sessions","command-palette","jp-property-inspector","tab-manager","extensionmanager.main-view"]},"right":{"collapsed":true,"widgets":[]}},"file-browser-filebrowser:cwd":{"path":"docker"},"editor:2-infer.py":{"data":{"path":"2-infer.py","factory":"Editor"}},"editor:1-move.py":{"data":{"path":"1-move.py","factory":"Editor"}},"editor:myapp/config/providers.py":{"data":{"path":"myapp/config/providers.py","factory":"Editor"}},"editor:myapp/config/auth.py":{"data":{"path":"myapp/config/auth.py","factory":"Editor"}},"editor:myapp/Kernel.py":{"data":{"path":"myapp/Kernel.py","factory":"Editor"}},"editor:myapp/routes/web.py":{"data":{"path":"myapp/routes/web.py","factory":"Editor"}},"editor:myapp/routes/api.py":{"data":{"path":"myapp/routes/api.py","factory":"Editor"}},"editor:docker/qrun.sh":{"data":{"path":"docker/qrun.sh","factory":"Editor"}},"terminal:5":{"data":{"name":"5"}}},"metadata":{"id":"/lab/workspaces/auto-Q"}} \ No newline at end of file diff --git a/.jupyter/migrated b/.jupyter/migrated new file mode 100644 index 0000000..8d1778e --- /dev/null +++ b/.jupyter/migrated @@ -0,0 +1 @@ +2022-05-11T03:11:38.961576 \ No newline at end of file diff --git a/.local/share/Trash/info/Untitled Folder.trashinfo b/.local/share/Trash/info/Untitled Folder.trashinfo new file mode 100644 index 0000000..6f950a6 --- /dev/null +++ b/.local/share/Trash/info/Untitled Folder.trashinfo @@ -0,0 +1,3 @@ +[Trash Info] +Path=/123/myapp/routes/Untitled%20Folder +DeletionDate=2022-06-01T04:13:59 diff --git a/.local/share/Trash/info/resources 1.trashinfo b/.local/share/Trash/info/resources 1.trashinfo new file mode 100644 index 0000000..c80c71f --- /dev/null +++ b/.local/share/Trash/info/resources 1.trashinfo @@ -0,0 +1,3 @@ +[Trash Info] +Path=/123/myapp/app/resources +DeletionDate=2022-06-01T04:12:37 diff --git a/.local/share/Trash/info/resources.trashinfo b/.local/share/Trash/info/resources.trashinfo new file mode 100644 index 0000000..934e99d --- /dev/null +++ b/.local/share/Trash/info/resources.trashinfo @@ -0,0 +1,3 @@ +[Trash Info] +Path=/123/myapp/app/resources +DeletionDate=2022-06-01T04:12:05 diff --git a/.local/share/Trash/info/untitled 1.txt.trashinfo b/.local/share/Trash/info/untitled 1.txt.trashinfo new file mode 100644 index 0000000..966f878 --- /dev/null +++ b/.local/share/Trash/info/untitled 1.txt.trashinfo @@ -0,0 +1,3 @@ +[Trash Info] +Path=/123/untitled.txt +DeletionDate=2023-01-09T00:47:45 diff --git a/.local/share/Trash/info/untitled.txt.trashinfo b/.local/share/Trash/info/untitled.txt.trashinfo new file mode 100644 index 0000000..6cc91f3 --- /dev/null +++ b/.local/share/Trash/info/untitled.txt.trashinfo @@ -0,0 +1,3 @@ +[Trash Info] +Path=/123/untitled.txt +DeletionDate=2023-01-09T00:47:37 diff --git a/.local/share/jupyter/runtime/nbserver-1-open.html b/.local/share/jupyter/runtime/nbserver-1-open.html new file mode 100644 index 0000000..545c03b --- /dev/null +++ b/.local/share/jupyter/runtime/nbserver-1-open.html @@ -0,0 +1,22 @@ + + + + + + + Opening Jupyter Notebook + + + + +

+ This page should redirect you to Jupyter Notebook. If it doesn't, + click here to go to Jupyter. +

+ + + \ No newline at end of file diff --git a/.local/share/jupyter/runtime/nbserver-1.json b/.local/share/jupyter/runtime/nbserver-1.json new file mode 100644 index 0000000..ba8ef65 --- /dev/null +++ b/.local/share/jupyter/runtime/nbserver-1.json @@ -0,0 +1,12 @@ +{ + "base_url": "/", + "hostname": "0.0.0.0", + "notebook_dir": "/123", + "password": true, + "pid": 1, + "port": 8888, + "secure": false, + "sock": "", + "token": "", + "url": "http://0.0.0.0:8888/" +} \ No newline at end of file diff --git a/.local/share/jupyter/runtime/notebook_cookie_secret b/.local/share/jupyter/runtime/notebook_cookie_secret new file mode 100644 index 0000000..4456838 --- /dev/null +++ b/.local/share/jupyter/runtime/notebook_cookie_secret @@ -0,0 +1 @@ +vkkp8m062eSxpTv8GKMXdm8kX7IeFDfFVWzs39i+7GY= diff --git a/.npm/_cacache/content-v2/sha512/1f/cb/884aad9b8d6b5eba9afa7c83fdfbcbe955d786c6c887ad72da30e77d719ea36c7337fc03a5ad4ef79a1d3522eae064bb805bdf301a273a8766da5b21ab5b b/.npm/_cacache/content-v2/sha512/1f/cb/884aad9b8d6b5eba9afa7c83fdfbcbe955d786c6c887ad72da30e77d719ea36c7337fc03a5ad4ef79a1d3522eae064bb805bdf301a273a8766da5b21ab5b new file mode 100644 index 0000000..e5961b5 --- /dev/null +++ b/.npm/_cacache/content-v2/sha512/1f/cb/884aad9b8d6b5eba9afa7c83fdfbcbe955d786c6c887ad72da30e77d719ea36c7337fc03a5ad4ef79a1d3522eae064bb805bdf301a273a8766da5b21ab5b @@ -0,0 +1 @@ +{"name":"jupyterlab-jupytext","dist-tags":{"latest":"1.3.8"},"versions":{"0.1.0-dev":{"name":"jupyterlab-jupytext","version":"0.1.0-dev","dependencies":{"@jupyterlab/application":"^0.19.1","@jupyterlab/apputils":"^0.19.1","@jupyterlab/notebook":"^0.19.2"},"devDependencies":{"rimraf":"^2.6.1","typescript":"~3.1.1"},"dist":{"integrity":"sha512-uNeXDbPAMfj9dROHTc9mCSQVum/NdTAXi0AJ+IwbElUMQhqClGv4FXZOENhsppCidL2IU9FNFxFKaM1LbEwDBQ==","shasum":"cb95adf36c5c26828b686a8bae0166f7163d18f1","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-0.1.0-dev.tgz","fileCount":6,"unpackedSize":6335,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcW3z7CRA9TVsSAnZWagAAW74P/A0inMkVSaeHennaPnf+\nrRaYNiPOXQSXqcPiFDXI2Xz31AbHQNjUpV3gun3x8wciSFqThT+RZHNieKj2\nJuZ7UQojhmFmPE/pb0HBuH0WHH/IIvezYPeODDC1UQ5lA9sg+wazCv3hiyKD\ny5QFeqqW4HUdOAW3q8ktXJUNASCozCuAfsMumkx6rr9mcB4eaWOp4kHe910K\n8qTYg2bzPtoLbMC1HtpTb+/IcB+eD/TY4b/LYuEibJbuLrQNI4l6ru44QcKM\nrSdOQXsSDZd5LzMzWibKkXUmsV3nU8mc0WnTe1XjYdfvUb0sdrfqNK8crc2x\nygJK39vrn0DWh8T9ayR4+SSYzLdlHAW+lvd4cDXgMmspRSf3movYTxHaYVbY\n9/1KAT1R2kMSLeIfSq/EJrtBU9Cvp82uOzJTS4dHpTAhkGomO/X2S6gFdusa\n3qL72nnAAosf+Ji9pSLn1PPy0033yxE5S0Rv4XBmg3wfF/xi7Q5ymIX4UNT0\nAxcwQpZxNBg1VuENqAH2AUM14Pw7Q9ESatYnU4MlLfLjFNHjJqMhUDUjSoHB\ng9sR9yrN9n+vXJvmqQkBhHcANGtO2sFhVvy+/A7+2ZrohpFZjwMQfCOhfSUa\njwwEp/NV99FbEfycoy7jlsSyyVmbot773t7a/HxtstjaS2nXElbJNF+nlguz\nT8vl\r\n=VWxH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC+hCblyP2DssBUCASnipe9l8NWyj37EPywCHHaXinRnwIgc27LPJAwPGcKVpRXTmNGKxNDsQ6yKaf/Gen1yf5Nx5g="}]}},"0.1.0":{"name":"jupyterlab-jupytext","version":"0.1.0","dependencies":{"@jupyterlab/application":">=0.16","@jupyterlab/apputils":">=0.16","@jupyterlab/notebook":">=0.16"},"devDependencies":{"rimraf":"^2.6.1","typescript":"~3.1.1"},"dist":{"integrity":"sha512-Nh1MOtAapHWaZ1Z9UZu81Xqds8mmvnZ7k5Zvt5kikMnLqdTim/dQjjk/dtDXvnUKL0Hu20SKn8bI0E2GxkruUQ==","shasum":"9be48c8283b9954f1e0c84dd1b1a0b0c2e75deda","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-0.1.0.tgz","fileCount":6,"unpackedSize":8460,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcYCGnCRA9TVsSAnZWagAAEOMP/j3PFb7449KG1C9a5SRV\nIC26cHZNAcWQZ3T0wzIGaa7rKSFKb88NntcWXOYKmBWwG8yycWAGcn67XHL2\nFY33PXEDnjeJmq6ZcdXQ2HGpwHG1xFC+YAigUPcVbYopp1gqy5Ej6vV2aea0\nNZUUra3Z2LtuT14SFd6qIUOf8+2B3lkZK/rTucqcdhvIYtr8gDYajPNhLN4j\nofOs3HQetXJs9ft2YjitsJH8zw9bwBnQepRwxYDlfA2b+c0zM6meWPTTGZ4Y\nut1+cs368oZOQ2ROMH7e5LrVbCPZSz7DXKR+STMAlqa+gssQsJWFHxFoEvGE\nNKoyUdTYqmA27yICNDhtUBmupooV25YydSjinDqavNOsCCRnY/bDCD/BGCje\ncVo0vTmgeTOaKGjFq/VrEDLX8UqQqxMTyorg/STfHHQoQ3oW1ioYOPsUaNSl\nGOCORTvBOFg0uTBpyS+9hiX560qObJffT6mBhpWjcfYYJP0BWaHk031al0N2\nQ8TxhE74GcgqHmVcH6Y3pGf3DJ/kSs/we7owBy9WGf/QgUmTofg93kFDycEt\nmSOCRe7fn8vXoimzFvsgSYIxUTyI1ScX2YbIHhF+fk/mHT8/wSZJZCFDieR+\nPLcAGaAqu9ittDHTw2iXUtHDbyvsFR5OTjY9v5qgNkgIreX0JeU30+pfy1pu\n2abI\r\n=UHMD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAWeyEqjBxJ8QmB9Vb+nXtzsbkOfqRQZpAuPUQ7PpNs+AiA+eLHz86swz02tGudMEGpsyhTex5PE+i2bqTuVFk0qoA=="}]}},"0.19.0":{"name":"jupyterlab-jupytext","version":"0.19.0","dependencies":{"@jupyterlab/application":"^0.19","@jupyterlab/apputils":"^0.19","@jupyterlab/notebook":"^0.19"},"devDependencies":{"rimraf":"^2.6.1","typescript":"~3.1.1"},"dist":{"integrity":"sha512-YwmJHM04tpVuugH1oj6yYAzEXGT6oIRdXGQD7bNOHihjGj2S6QKfV9q+GsdrA0PDWAINEMAILxoMamFup0mlPA==","shasum":"459fdb4b6081244bc1f10b9a27fc8be5b8f33d1b","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-0.19.0.tgz","fileCount":5,"unpackedSize":12307,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdIK5rCRA9TVsSAnZWagAA5PkP/iUixv2hkqTFr3VH0O6o\nt/I04/Uhg0WQOsugm89I1gs2kaYpCIiVFh9ACDO58C3OasuKxfl/sok33OIO\nhYJXHJ8zf6EbF8NdMJB0+SYwqIAUYe44vPwrgIOwGzPfaVYmsA0l9UHgqeQp\nETLY2ockjLkbUdM6aenzxi4K7UFacQyO2CNy8NR6Xk9vm+KNokQ9HbQQfO39\naOw5SvgeGcvHrjU/Od6lthZwhVI+ZIHt7/ogmVEUIeOkqi4GagW6N9fVrDZ5\nw2wWPVPgMMaTotr/M3UjCQqEbA40WGMRHt9n+GsvSR8wb5v5cQeX52DV0On7\np4QVWiEej+PQn51shtP/xDs5V71Q1yT15jDRB1yvjl61WBWZCvE6cF+HVFOU\npeNm7tDmEyFlRA+lxe6XRB3T33An9m0ukyHlY3CMrTpluwNIIt/EFPJ6QZ5y\nW3/L3TY+pO96xwUg6tMLBFE7kL4yMGHM+qOnJeB++DWFi0JCGBGJFr2GleLs\n2AqJtCPybSKJwhrN+DTxaGfXPpWOrHo4Qovlkllnvh5g/Sc6WOUEud66PbeH\nX/g70sSxmBvXF58MueN8891vOKj9RBEIIs8YxYVysRGgspmTeIq0gaIfkdU2\nk+TX/nmMZJ+9B/4ru6MoRgAku57GO0psIdDebt6y1I3CC6NCCvGNwaEXREr2\nh+vo\r\n=9fuK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGZwC2eL2DzXDXiyyRQvz/LVfoPi85+K8QucVjvCDA64AiAUOKpagOFhObBZXpewEk021bAPJgUOG44f3m6E7waxIA=="}]}},"1.0.0":{"name":"jupyterlab-jupytext","version":"1.0.0","dependencies":{"@jupyterlab/application":"^1.0","@jupyterlab/apputils":"^1.0","@jupyterlab/notebook":"^1.0"},"devDependencies":{"rimraf":"^2.6.1","typescript":"~3.1.1"},"dist":{"integrity":"sha512-U9en9IKyh6YlzDUg008P7lvv9hOslqvPlKmE21zeHFGiLl1iMOQmTqIPCo5oKHQAlE6ultph9luoEd9dXc1sJA==","shasum":"345cef1d5c9f73960925906c0510735d5f79e0ec","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.0.0.tgz","fileCount":5,"unpackedSize":12303,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdILZGCRA9TVsSAnZWagAAGnMP+gJ5wb/N+eozE1OzGCos\nFFL5Y5ixltpSksR0WPbNE3IPpdnPV/4vYFx/Pvg/j6yoKvEULNaQtvaDWGO9\nxHnQHqUUoeyLs2iV2gpVH2k4s8FyzrAO4Yqvy/Is7UuUsZZ2TJ234X8DOKgi\nCu4qNl2fNPBQzWHu6ZJnV7KlAdCU9dqfS5nLKEtf1s/Edzm64objSvsK4OeD\nCBe6VOlrVhOuGIc5oESo1rGlgaEpHv7MZyZt9l7/OJC+L4JMz+ABNfdPLezj\nsD+4t+fDNq5529HOgE0jvcY+sG3Xm48vw87bnUBh6Q6uy86gdX+WG/OlSRQo\n17BuOTpjuoFhy1RvVunexwb1dBvkBZ86Qti/47tQa1sig0O8dXG78JbubKqo\npCM7VYOlIr4gU4tLNF6wuNq9oAAmih7aw5R0pOSbrncRVzll/m+XZu9tlFMz\ngzq2zeF8wPIg7JOeX0Vc+00QdNtTYoVxl7c+9SYDdzDZRcWBwZY2mTpOhUET\nfjYMFEm0pJspbzSp4MmmyzZmHJ2CJtkUjtugIVHkxDKnD6NA3OnoL15RGf3Q\nfcpBkxSxtyFf0XrgyYH6STJI9yjcXNGEMp460XekeaJs7Cub5iNin0tdmIf+\nArGTq/V+Tr1IMhPMaBXlqfh1khXzF19HL9bcHfiljv/aQtFKOamT7fGTHXiX\nrrBY\r\n=MSW1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC+755elAaboQFrclL49noDqWjttnkAmZ2cxasA3muZjgIhAJiGNmKtZhj6mhbOn6PZXIymzlnKbVaspRiCN1DT3kwg"}]}},"1.0.1":{"name":"jupyterlab-jupytext","version":"1.0.1","dependencies":{"@jupyterlab/application":"^1.0","@jupyterlab/apputils":"^1.0","@jupyterlab/notebook":"^1.0"},"devDependencies":{"rimraf":"^2.6.1","typescript":"~3.1.1"},"dist":{"integrity":"sha512-Bh3KREh7l+ogYTBnbhX0d4yCdMF4pAva/oL5/lyMmZT7vKARBym6bAVgGtdDr9iohYdQxvBhEjC6FOScH0Y4Pg==","shasum":"ecf5754437d26e7b428e1d34eed2fe563d004fb2","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.0.1.tgz","fileCount":6,"unpackedSize":13413,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdL6t4CRA9TVsSAnZWagAA3JMP/2JN9rBKqKFSNBIbdyN2\nfFM5sdMUHe2QdSDHX+ZJ7zeTdhUC+AH7NEX5Fa7KnTCYHv9XCpyeTUaQ7Fx1\nRBRlOILXGeiI4ZY1qIMQNiMbfaQjk6KERQ/rC7WUkM44mMnlS3dYn+XHwEx2\nJsiuvr3Tcf1OVW1h98iGxN5Ax3/sN2rtMaK7deacrruEqGG8ND41Bb0IkBea\nf7EsFLaHfVSttaerxxkf1ctCkiSpATo/ZEQ44dadZfYr9XTgqB6x2m3suf9J\nVPcGxMc4OApX5UtM14ciYnGMzXpaoixRV40567kV7WB43847te/CffdUynp9\n7EtHps2PMhEJ7JXu2aSHh/Tkeo7YvzlcagC5w2lWPSPROwbOwANJl3RdbW2p\n1skjF8/rdXkn147hKSnmGy2Vpe5X4+Y1pJE2vlH2TfDkKfEmk6jbIBvNDHTs\nHQzpV0wHbnElbS0mE09Bhpjw4DJF8pdL9DcikGHzphC0IlfR6LtfB3OqOg5y\n+y8o+5p6s/v79HFX9j502fK5q4nCjFw/f4EPrNqqy82tWUF+ATg5Aycl75tr\n0MSM2iFnDbJOjpsH2ehRB5vCgZ1397eCQhviWd3tUAUxLRNDfDi+1RRedAHU\nWol4no4V6E9aIDkLHBbXkMFkPMvVW3eha3FrE2+rYrXtf+aAfIKtF613Z+pI\ntjwH\r\n=RseX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG6+FTB9F1t26//O8CbhAAiSbVUBDRS6+oROCZaAsFgbAiA5aL4g43zkLTSDQiTmfiWSqKxeibcBXFzt8dzMTDk+ZA=="}]}},"1.0.2":{"name":"jupyterlab-jupytext","version":"1.0.2","dependencies":{"@jupyterlab/application":"^1.0","@jupyterlab/apputils":"^1.0","@jupyterlab/notebook":"^1.0"},"devDependencies":{"rimraf":"^2.6.1","typescript":"~3.1.1"},"dist":{"integrity":"sha512-/aBS6hCHv+QGtmV+7GcgBYmJM6keeXfcOHQyJwF/1ZngGUVfdjD2L00QStCKAvPi/oW5TCXbX8/W73gODL7acg==","shasum":"caef4d46240e5aa413750c643fa3c88a6fe7e551","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.0.2.tgz","fileCount":6,"unpackedSize":13544,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdMBIqCRA9TVsSAnZWagAA7BEP/13iXH+F7UGM+eEn41rH\nfOzCFOVebSnKKxlVBDqSZNitTsb/i3HgVDEjSlN0BQzbtzhaL0BWke1MSY13\nsJclLMfGTkq/r7SkEO3gNvbU18BrvriEHnPXggFizXUfE4gWMu5RlKzI89RK\nPZbXp4Pn1k+iUQASk/Oru3ttXLi98weDy/OyS+gOjZT6pwIqMxArl83n7KBD\nLzuZxU14LLKuQwn01ZbNg2LsWXd5+umT0foGTJR74MtQzKAExvfwRsUkkuB0\n/AemBpMxtvsQ4zVqx5C7OaWmdXvA7hksbfnSAQ7ce3rkNsDAX9kvUzcairZZ\nnjcpuhKOGrvJguZgTs0Ym+EyZDfL3qbgL7+xksHvZV0CDQRphK1Usvs7xEX7\nrKAptiesvVUBzMdwi13m6gEIoI3NaogjGi8UO19x5G4TyRAv1WOK04n9BWUm\n5OBB0wnYbxfwxefPxjrh6gDdXPoiFuAGu71mBC7h/8mU4l9BQxMN0kvoFxYd\n6w3tQFugIdeKeqC1TYiEkTpJPQOFNBX7SdUV7VaklWl00SJxjmk1JG6YHIYq\nm09rcC5tYgi350lytQaMkgpcONFJ3BRAer/wi/we3YnMF1r7QJDEjyKbqO69\ne+ECu/oaFQUS815aXBqU4HXUhHFc+UdJFvfJYGXX8vrJ58OjYb209gGoZI5f\nLBLd\r\n=UU4q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDIxVdH5FZPKs/227M0KWhzlQ8M6WbeHT0q2XZ6uGFIBQIhAMC4oHK5maCH8bCnH4IidnpkE6GIm/NG6FgaCL4GC6eD"}]}},"1.1.0":{"name":"jupyterlab-jupytext","version":"1.1.0","dependencies":{"@jupyterlab/application":"^1.0","@jupyterlab/apputils":"^1.0","@jupyterlab/notebook":"^1.0"},"devDependencies":{"rimraf":"^2.6.1","typescript":"~3.1.1"},"dist":{"integrity":"sha512-TOiywLKM3okTMdC7vJsnC+rlvJXmHeyB/9nePtdeRrvvWn9cp07yFvXl5zTQKWDg9fCJNrAB8/lRD0CLfXA/vw==","shasum":"dddf33f4282808940771ab6d109906d3a070d68b","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.1.0.tgz","fileCount":6,"unpackedSize":18614,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd2O3NCRA9TVsSAnZWagAASisP/jcMa+swgJ0zYf1mzOFG\nGMhXObNWr91Db3aN4UMss3+KReg4hR7kLp0iP9HB79WUkUtAalHea5WGwUf6\nl/yBVrfzz4ULp1FcZ1ZJaQ8I/nseWoqYFHD89k+rSld5o8NDtGdc96TUHgtw\npaWknEfJ2EvG1fhvGWAhm71OvGoyRS+Brqi7L/2BJUbWAjweLbZqUXHIbdAr\nLzFLTY1m+XKeosPPi0nJ7ostDS9k2I7tKBZPmUOADsruvUpbr64CFUqTPJba\nxmrymlidibOVzIS5rt4glJQHRobuvF6G6OSOs1unN6ldrEvME+9gHW4eCqYU\npDLK8HQPjMsPkB8vAQXhxGWxgLSWKeQuVnwHkz1FtilC+ygVHovS2jfnFmr4\ndPeYzgUBzdPeDLa9ntZCTEbpMBO47TETJu/qIoRbkat/mPt7tyc7o7B/iDRN\nWOgBPE5fjMbZuGcsdWnoWwjzotfgjKEipvtL5boAGAbb8/6zZ2TqvlcjQlup\niAQfv0A/6Cd0QwoFerZ48X0Oetgg41NB29F5Hb/F3+3qX83jak+8P5EkEeNa\n10MdHdMZBiSkkvS3m0cQQYWw2tRosCvLxxJBO9K1rqs+mm8xr2iA5L17/l+Q\nychcoHooSap2FItU7lWoTC3PKMYcvIPxozdGG0WtEkSiaTGvwjiJDdubqCh/\nYtN8\r\n=zXnJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBO27T99j4KGQaS8kaQpHmN62PJE/0SddPUM3SShc5fbAiEA3J9meDMJ/I721vqZeWHjdWwkA29FR35pvUMY1obrJ44="}]}},"1.1.1":{"name":"jupyterlab-jupytext","version":"1.1.1","dependencies":{"@jupyterlab/application":"^1.0","@jupyterlab/apputils":"^1.0","@jupyterlab/notebook":"^1.0"},"devDependencies":{"rimraf":"^2.6.1","typescript":"~3.1.1"},"dist":{"integrity":"sha512-CEuFXjFiC7XnOD5a7RHG2HR/N2G8DDaZCPdY67ftEje17HQdGQGCIc50y0Lc4BR18Z/9yJDEawsxTFgQbq8I6Q==","shasum":"23cf6c81e50136036d6e0156c01d39c5a7e5dc96","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.1.1.tgz","fileCount":6,"unpackedSize":18748,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeZAibCRA9TVsSAnZWagAAY0sP/1XCTzvvRLvpwPZ3jxVT\neCOcipnRn7okjiZoGQw94mNzpuEqOTpvWR19pCcqa882xLTnAlXi7k5wSBKS\nyqAhRhBcYst0BkGOrh/JpMpPHyWTNP6rgMSZPvu4BpFb75DUAKVtsuyJLJVd\nZMcySUcN9PBwTa4/iCYGEy8n4b1VSKeBOL39xezi36agyo6GUa1Vw07wUi/W\nIv0FC+FOwI3wG6TgrEgOJP2JFSJXKDSR23QyGI55/1q8fFggGnYPFCLuEJo0\nBk9tvTxZLAQgWUil1SUNuSEKXmV5LTqdZPzLXLY5L8x8Ig75/GOvjo34HpD4\nWOlpabkPBOcrT/dG4J5m9xL58FxJxBQpkFH0N+L3o/c61aLXHu4cK5KL+KcQ\nh7/tfizDm51zJRS7VNxjAgl2swXofg3Sidtg3IIyOxrKJvWHd9T/SInqhtL0\n3LO5wn6cZbQ/XcNTB9OQT4U/vtdBF4whpRrN3PiWCu7mNfBO9FelxkbsgXv9\nSpHBf53cED8AZWvazrOSxuV7i8B0OcrdlcbRxG+j3qbp5cueTeKPUdxggTuj\nwYNbJtz8po+7DBa/mj+px1X05zJPXgsjDeqWAVYBDRQEghUoOnpyaLGa20q/\nHSlR8kE275Lm6GQWyAB7hLI4JaFQynplgSMYDmu6Ehh0DADV59b9RbVeV2Qm\nH/Ej\r\n=83go\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCvnQpJ6esyYuCJWGNZatFOlOQJRd2w959xo043TkmiBwIhAN2oMTnbYgdMoFsoCCXi+Z/8okRQzoh97VwmoTpqfu8M"}]}},"1.2.0":{"name":"jupyterlab-jupytext","version":"1.2.0","dependencies":{"@jupyterlab/application":"^2.0","@jupyterlab/apputils":"^2.0","@jupyterlab/notebook":"^2.0","@jupyterlab/nbformat":"^2.0"},"devDependencies":{"rimraf":"^3.0.0","typescript":"~3.7.3"},"dist":{"integrity":"sha512-glsYTPVExqxcvGMuqgSCHpuH0lEg8pETB7UnehHgN9VVPd4DFHgJJ/Q+fyF9SNJGukWgfHjxBIP74eGadVOS5Q==","shasum":"c483f719daaf585eed3960317f843f636ea7d4d6","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.2.0.tgz","fileCount":6,"unpackedSize":18936,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeZmHLCRA9TVsSAnZWagAAF80P/1EdTR8tunGAx8a9L8k0\nAr0mh8bH7RbZV/8Y6spjUsaxhSEDt0fu2QZxeds8d8ZqDz40fQxPzBUhhrqY\nO3bvcr2pydhGVhmf6PsFcel46ktnxXwfogUhX30tYJp3c9evsPtY0mt9lt7G\nHhm+vV+BWN5zdvGezWO/LSMWWdQVCvT6HXGAHk9d3paBpExRSg9DEPxFBP17\nyYlHC8wPkc/tip1Pm6zLEKHnDu/yqGKwIVPvu0KA3/YOLYyHHbYwo+A+9aVy\nYeVEFiOIT9q+L4KTdbSyuHYiIo4pIlLYQTsvDOM1EzDvVQMg7qaZAvniP40O\n2+MOcPXfEmJzMFvW6AY+lGZJCgt4CfB62Q82HRoaMZmwV2fQgi37vEV/vSL+\nYzxbycmJhrC4d6ylzNUP/h3nDJ0f7Gpx9rqr2AwhH9j01bxbH3ewHWQ62MR0\n9tKVcsIwTeMzuOgYsCcPAuMvb7EW2ZI74TmjWf/TTmu83U4o90cSwrWqPpZa\nplU6BuqnI887NSBlBprKXhOfNhGy5zkwoc3EAbKmimn8zbpvkcdw4mztkwBc\nZyCU0H+oFX0LKr689i5XvdWJshC12eyvms6oSxDSWQPmMTBty9NNXcjsNKxT\nLvMVBMLnBYoywsUtFuC7MRxv0Lfxx7fUfea06JwWY6sLvubyE5aiCAxGgBNa\nKOs3\r\n=vYy4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB/xJsF4EL8t6G0lgyj2qvHlH6pM38/oSc4/4JhN+eG7AiEAkloEsj60JTgElfUPiAv7sXQdrJr8abWx7bx3AE/4TPw="}]}},"1.2.1":{"name":"jupyterlab-jupytext","version":"1.2.1","dependencies":{"@jupyterlab/application":"^2.0","@jupyterlab/apputils":"^2.0","@jupyterlab/notebook":"^2.0","@jupyterlab/nbformat":"^2.0"},"devDependencies":{"rimraf":"^3.0.0","typescript":"~3.7.3"},"dist":{"integrity":"sha512-1P9LD2KoLCrWLYoX13kfoRlP+b8cJP/JStq4n2+wKMlpMGMCiXySh2DrrflXpKQUqZ7wkbsiYttyWgJshcFCbA==","shasum":"ff130ce0abc34219e562f35af53ed7a11e7a77f1","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.2.1.tgz","fileCount":6,"unpackedSize":19279,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJecq7lCRA9TVsSAnZWagAAfDkP/06yHilyR3qOK4JKg+1M\nK55TVfjD/kd5Q7uiM0gFVKixGAMnEH0GWKKh+p8ixUU25HAa/w+xfKYrd7Qr\n4kX0u6OIKXElnYkO/xgWv/mjo5PYeYSC9vGdKvd7Bxdt6wPS9z1P9thbjH4+\n4uzeWGKjskV78QM5ZPps/l9dBrfrKk/OiiCtGXXTo5eTOW7wdHKoxZDUMIVC\nsbAfU0LbAIakZH23xPeFwI5XACIAY6AJlC3S2XjO6YzXvx6NNfByxp5jHAgN\nyizqO2TEDNlo155P70bYvxPSglpYVG5PnjxuC38xx5SEKHrJeglWVoZ63ykg\nk45v3SLrAjeDkD8FNC28tfhaNe/adjA1h7lJXtaYl/PypjhGo8SSCq72aXMp\nn1va8G3aXVwzLrbrx9j6rvZZQOBJuEoDINyPdPG+h0fesOgiHtii99sSJ8g/\n/1A6eIXyUU6xgYYyJiGF1u4G8CKsDDUVPJdZ6Pg4faEcim4bgRzv/+HmmGNs\nJhg5ad9v8ZBTnaoBVJzkRw6OUbpZ/5iI3iLpKdg+82pHdHmRjiuwbXeFAlMb\n6DbG6EsLed3liFvHethROS8cxcNmB13ePTi1J+nlyDFgehjfmUHscQNnCi9w\nwllxFQPXrzzjW3TeXO47lc3lG030pQ4PfSToK+UC/WuYxibPVsfhx7fpP5gM\nZ2g5\r\n=9P2P\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIElxaAToKD/t5NbcSa4ICjjGWKDxkgubIEvBtQ1C22OAAiB+T1DiJ5jES6KzGqdnz1Pw1VHUDWT1EQSBfVCCO9Wi9Q=="}]}},"1.2.2":{"name":"jupyterlab-jupytext","version":"1.2.2","dependencies":{"@jupyterlab/application":"^2.0","@jupyterlab/apputils":"^2.0","@jupyterlab/notebook":"^2.0","@jupyterlab/nbformat":"^2.0"},"devDependencies":{"rimraf":"^3.0.0","typescript":"~3.7.3"},"dist":{"integrity":"sha512-SBphQUhnRqHh2EzA6FurID0YnP4Q9mvUAM81zmcaZhwhONoSbtfM6ZciyERdLfzTyeG5RYTw7x3r32vf6/UGvA==","shasum":"0598320a3e5a3d1b2fbe0c44f4775cb49e7523e6","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.2.2.tgz","fileCount":6,"unpackedSize":19333,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfhcJwCRA9TVsSAnZWagAA6/IP/2PGnGByQ78eMe3co7yv\nIQBJWV1uBpTHgmXq7rMa2qnf2btf4Pg1iwoDsgC06R27rDKMy4lbS8q3TFTm\nFAQ0oXbHmmopH4D8eEk6U4rEk/GwRb193+wQh45hi9HFaz+Rot58bSKQtzeA\nhztZngwEM3BJ2e5ebpFGl6zCVsagOMsnt3nHxGSP8iMiiz0to5bDfmoiVeij\nUCEFN0rTlwPPsTIwb7ZLOUnl56uFb/MQTglnrdNA5ECvbBEuK3szDuaCFvop\nIduw1CmRsK7+3G1GEDE2I8CgKpxAsNgUcGx5OLJKxK1eKvp0/KGvNJW9kVR2\nHSRPl+6B+sFNhwpkRNI+AfqC1BqO+2/4XHvQSJlFEWsR8I5ssoX1sn+8X46+\nUZfM87sRAE6bekRBJXvj/7kR4Isuz838XgyGQOHk8qQNIQybFtxafvcotvFy\n/Yk+Me7zmg+McOkwjbp/3xyTikdyGfXTWrK/kvfv1ROwnLfrynBY14gd6u8O\nZWxHctbmO/iqFh8A3A50GnKNk6sk62LioRI1UAmUUYfM7UgpRkdKr/39nVe1\nebj8AZW9OY/IvRlxd9gjfomX0RE9cUWWOTkKo7WneCXJwKa7me5Ad68eej4P\niJuxvOPdjy0yCRb485BQQb1K0TPTAWfsInDRBYCLpmvmLSAVKqr+4MdXxm5x\nJKbW\r\n=pwcw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBg/LOMn85uw2mFVOltDEiDxxyzH1P1UKxgL2BFuaPS+AiBoGZEclydAcxR0FoovUYWJ43oTDPRBsNUApaNdxrK6vw=="}]}},"1.2.3":{"name":"jupyterlab-jupytext","version":"1.2.3","dependencies":{"@jupyterlab/application":"^2.0","@jupyterlab/apputils":"^2.0","@jupyterlab/notebook":"^2.0","@jupyterlab/nbformat":"^2.0"},"devDependencies":{"rimraf":"^3.0.0","typescript":"~3.7.3"},"dist":{"integrity":"sha512-LKjEV8c3kb641l0Ik2oOeipo3hkEZo7IDGbq5zbqy2EtJ6zIAtL4GLcwzwXEsxpqGbh0WkpH1rq/3QgwNcrBMQ==","shasum":"44cd6a4854f0c71b0ea13d0f2217ac5a235aaaee","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.2.3.tgz","fileCount":6,"unpackedSize":19374,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfhwGECRA9TVsSAnZWagAAOJ8P/io14VoHWO0nhidctt/d\nUjuW8jqcxZnwfMf+Akn6cB3LhHM7Ya/jI8PRV7TKynluTSUpyNfj/sUavcEe\nHPuIuUVj2AeLff8DSJdR3eTOh1K3en2Hq/TcmDoEaljK+5jF+EYRJ6CD5YvR\nmGmSPQJ+Dbu6uNvfACCLjt7QcpYjICgTj8Gi2nrQ9h7pwmcqg3snIFMn2Gvs\nzdoyQi/oUFyARUXp6KCJVNWx32Rs8hijfM/CfQFAFWZD9HyU7OkKHaYz6adh\nHidSdKIu1+o+CrwrxPRiVcfyq9G9RzdgMJv8sGHgvakSQvX2hVGijqrEmTTc\nqW+o5FzQhMBjZ6OIO8rGXPAboiLr9QJgVZecQsLzuUTsNjkI8/cxdGgtQBzC\nWPs21m1kGM07bsLgAAO/eMvkBaUu+XLH4FkIozy0Q+St8gdJGbe3/uOZMRcD\nswlx/cvVmtWmk/jH3e88+dg86e0g3KaQ16LDR0hXIMvM40bUsZF4UySpgSMa\naE3TJ/hnrPmJO/skvZh0ucK+r82QXzf4i7SH6QKQYWrmfcI+tm3aU9ED86vb\nVYcgYk4KqymO7gaLgMkjyEbx4oYCMU9OKFYCI7aO6/1RLjJTDfnCro05fbWF\ngoU72kSe7tWJ6rlFplb6sjP3lk73EVlReDB9L0DQ5+dTU69P1ViQ/vt1tHHP\nKUSv\r\n=eYtv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCxAy43Ik2kq+NViMi9KCK/AaZlXCYffNJatI71Q8p5NQIgUkAAhH/ClKkzffiy3+OneKezD4r81xJxTGwiz71W09g="}]}},"1.3.0":{"name":"jupyterlab-jupytext","version":"1.3.0","dependencies":{"@jupyterlab/application":"^3.0.0","@jupyterlab/apputils":"^3.0.0","@jupyterlab/nbformat":"^3.0.0","@jupyterlab/notebook":"^3.0.0"},"devDependencies":{"@jupyterlab/builder":"^3.0.0","npm-run-all":"^4.1.5","rimraf":"^3.0.2","typescript":"~4.0.3"},"dist":{"integrity":"sha512-4AsuVRIp7SUWX561c/1bQz4wGoNrYGqjznt9NwGEW5oCcaWsFmHTQA/rI71z9T3szrU3VetRWZzBN3RkfHOCbw==","shasum":"9afdbf9e3260212e1080dd607cc84ada870f6b1d","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.3.0.tgz","fileCount":6,"unpackedSize":20324,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf9OFxCRA9TVsSAnZWagAAUjgQAJ6pHstWjWzOsTdCSUYj\no4hDngugWQhw1ooy5hFfs6u3JX97VcyvwNpTYdyueYe+cI708TSYG3zm7VRr\nx6rbuiR/K0iOYe/Sv+9sRcgRQZrziKQ3toYKj89gYCnaP7rgUgsC4ackhloV\nNb+PwS6ZrTKgAYdECHlhm5EVJqjavraw9CPMpVUDCvx39mzS10iNgNVSakWM\ncISYdeyIibeHw/tBmQVK3ekZJltL9GpXw74eB8HHKedwnpwDN+sr14uA1vI0\n8O3fJuDaDASeRBM6kiupaEcKFL0qVnQreCeYm5W5fnKYhp9ok8UHK/6JlG2H\npVT3B+hD4pVkimh5rX8xUSnIa00kkYeHlBUEwjKKQYb7vsSIIT5yPZsoic92\nlYfgx/vl1H0GSHhHqOSwx50yLmhV3WF1LMEa06b2dwaElIfKEUuol4XhjHB7\nGK4h/eJD65dLBskn2A8aB1yCtsca51PbQ2HnJc6lGRt8KGY/olNLLvCjVdAN\nYwQsLZEXvve/+PjrmXbHuumszWLCjov41HUs2p0PGIC+IcwbHrlJg3Gu9SQB\n70ijAdzEzPoCozIbjC2Gy3apCwzQgNV4DQDE/rfRmXk3lnUC6XstVXeQ3tqW\nSPXD3ZxQ98uMkw3q2sGyMA7FoG/SpcfAgV+0Fj0HP+P7btPktYRDy0iMwZh3\nETVl\r\n=CWWq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHXvGL1KNw4dQYezU2GSY33b95U62xH+LiTE1q8k1FSxAiEAjdYrwvG2S6inxXOdYvo5DGGn9C+kII7uKHKuLAvQ3Zw="}]}},"1.3.1":{"name":"jupyterlab-jupytext","version":"1.3.1","dependencies":{"@jupyterlab/application":"^3.0.0","@jupyterlab/apputils":"^3.0.0","@jupyterlab/nbformat":"^3.0.0","@jupyterlab/notebook":"^3.0.0"},"devDependencies":{"@jupyterlab/builder":"^3.0.0","npm-run-all":"^4.1.5","rimraf":"^3.0.2","typescript":"~4.0.3"},"dist":{"integrity":"sha512-xm4wFG4cyaMDDWY4fhbT/fC1hJwQ2LoW1CWHZQIyTQmIsCJebAS/8E8TycUrzX10I43elKLcFhaKTKJlBzb6fw==","shasum":"85aa11fcaee8262bfe02838a917610104eb44d8d","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.3.1.tgz","fileCount":6,"unpackedSize":20500,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgRSl3CRA9TVsSAnZWagAAGTMP/017vesiQf2k4jtNLBgf\nXGXJoW8a8fe8Wqqeb9h5HF3VK/OkQCrj+tnIj9pXzWedFyBQ6Qa7UYLSiSuF\ng4ngHB7SR71kf3vZCqWbWSKLysqonGSiwIO3jKPXtTPoNSmJELxaLBGSX9EA\nH24YzPu72S/HUuhUxWbSd+Sk7gFcTHAg1ekgrnNj6PNYAEQ5Yklf4bGIJi7c\nocxD5G5etxFABTEOguplszh2FQ2Jj0wJufrk3mJ006KMTcyqlQVRNR9lKS9j\nLIQqaetIa9puKUVeXNP1S/JMfZ2ZRfBXWZbWLK1soaF7FZKWTd2I9QfepV0M\nilRlLk1MXC5E+S9+NHI7/bFMRxwQ8+3IL65de3aFbrlXARG/R+zkr11M7CPL\nqUNy+Y+yaZneMpVIaBXvwl9ZiQsscA/9kY46YZlJkdjP8B8YmqMUHwS0h01Y\nnHvuzeL9ftJulN+aC+gxNnUBGtkvgvy3CXrpeNWrQiNaQvwT9iH46Iiqn/rX\nAa2odzFBjVMjKAgPeywVs40YcI2f0DJHT6+vjjqJELHBiNLg8e1SSbNPp6An\nqGmp+xGtOJFt7YYCy5YkDCm4jxB/yLLRfRSCPFWRCNlX3IsZO/n4bUGYe42i\nO5CyHHT0UmEjDC/5UHVqU5wlUIYvNTAXFWgWeHEuKnBKt0jssOuiQF9fwrqK\nHBKg\r\n=dDo5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBvmuKcWHJujwtaBPFhaqhRmYpV1ke4fxkQDg8SzlRhwAiEAlztot4juiBJxlwLkI2Yt8PG/XnPz8LPEJCbZzXvgWRQ="}]}},"1.3.2":{"name":"jupyterlab-jupytext","version":"1.3.2","dependencies":{"@jupyterlab/application":"^3.0.0","@jupyterlab/apputils":"^3.0.0","@jupyterlab/nbformat":"^3.0.0","@jupyterlab/notebook":"^3.0.0"},"devDependencies":{"@jupyterlab/builder":"^3.0.0","npm-run-all":"^4.1.5","rimraf":"^3.0.2","typescript":"~4.0.3"},"dist":{"integrity":"sha512-5BhfaYwX5CwjHiBtZpu5WEutwlvnQxT+wri9L6ONsrf7suHgiztuDyHwQWyku1GSbhSzBQRh3efj+gC/eTbYaA==","shasum":"4473c345d13254bde778ae487d60da7b695b1c1e","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.3.2.tgz","fileCount":6,"unpackedSize":20641,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgpt6tCRA9TVsSAnZWagAAS6oQAJCDZPN2Y5jc9gaJCQ6R\ntwD8i1qYJulTDv4nHg1L5ScmHpBPLYcaIdWMjU38ClulSjV27Kbf+LEYwgkn\n2gCmd5Fnk4t80je9+fbuvtyv0DNTd22r/W9xatet0IqmINV6d3syX0KZdK/a\nkxC+t3Yg7VPFPbJhJYmVONFXGwGN6pM0jgAeNDA4DlVDlLOfnNqN+lC/j69D\nHryZm2lOKpNqJIjJgfQYzvpDkknakT724Hntb24JQOnqW1q9cb+4eHycywR1\n5n+geBCBh+303rX5jgrE7Mn5j3QRtC0FinlXik8SWKPVPdY44FeBfOFfqMQK\nn3rIq3sMFb3p6Uln32qTsE4NWJFuv4VklR7M0k5JQ5HWF2xZGFshUBlEYbJ3\na668+59FzKc76DTZO5YSzv90RQxSf+b37wsU7vZdasdRb9oPG6OE4Z5c/PZF\nqZFz/Ocy4qkWdApO61YOB+oC/iZVZFHaolQx28A313s/HnNQ6fxDribW84BO\njfDYaBXfAvAl69zwQHAyE5/VegXqdPGXY7lAaAdIJBc4CMq13/GGHkb0vSVp\nN635Q0ZWnrskXCycK6quXKDgJIzUZCfwQDxpvG6oGcAT0Fjtdo/qdfjb9YvB\n0hREr8Cru6c/D9FwuY2T2P0R3EzOwpt60PCkmijMT2dHJc1aXwg37Vp4WmbN\nVcuf\r\n=SF36\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH/XGaxoTNm3YPE9BptkNTf03ZS54CUkz4ar+fG8uxVhAiEAsX/tcmyaR+PbQTK4XaVBqMo/7A2pF/arvJzaHbSZL6o="}]}},"1.3.3":{"name":"jupyterlab-jupytext","version":"1.3.3","dependencies":{"@jupyterlab/application":"^3.0.0","@jupyterlab/apputils":"^3.0.0","@jupyterlab/nbformat":"^3.0.0","@jupyterlab/notebook":"^3.0.0"},"devDependencies":{"@jupyterlab/builder":"^3.0.0","npm-run-all":"^4.1.5","rimraf":"^3.0.2","typescript":"~4.0.3"},"dist":{"integrity":"sha512-SbLXxbvlUPyNWQUuGH7Tmz/Z6lHObEZgR7PzkFlMbk5N0GUMDdId7zK7YDdjc7Zv17qoZYldx+6PpUbuA1Rg4Q==","shasum":"14d5743813c243b5f1c90de7ac8254ae937d5d96","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.3.3.tgz","fileCount":6,"unpackedSize":20769,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgwZztCRA9TVsSAnZWagAA1IYP/26ROWeqe03Eg/2Ior5/\nfRP+8p7nAUasSJSEtI6HyUu195e9xLOrZjog4UKlpo2BYpbMI7fcj+ypR+RR\nnQaAjic+TOEKgMFW5kO5ROCpKi+KUbTQc/2S/3k31BgKzIHm4oyRVFY8DXFv\nwf0egOwyI9F0oB+6N1XUs3aW6nuEQPeOy0Um09vr4SySyStYpD7Y+7opLqjL\nuOS7p8Ie8EC8Uw/L362Sq+LDirv0XuNRXOMq7uE1krCqXv3w3brIbTbFTJ/3\nYgjzKhkI4s5SP0HtySp/C15Ct06xi0dd27KbkNXQ+tcti/LfBqxIM7nMIxs8\nYw5LDsHUfemRO/3+h88c5bDCGSaKSKAouhgSp/RSDWIKuVxl3IRLktm36qPO\nd1k0nZGERONOEmgHbIdyewGeyr62F28R0pZcC94knyOTmQtnUuLDVZDeuCKu\nrleYFi+Cxf9yx7ThnXLlkXKEyD+mDn8F0CaK5E3jcBbRejP6GxyhiWVEpSEz\nwgFo20+UK2caSPKQM7R9YUy0aq0/V6o0gdSUs5tTXpHUoHUoX9pYlUdrtk0c\n71Jy3i3OwqpG6SrX06lhAA2MMatxLFlG2bTPAF6deXu3Mph/HKbOZ7tbEqM0\n+FFiHF7/lThnXUwXWWQrKO04zvpLXOrsJ2VhbA2/JDle4oEHMUy9AM1PTpJp\nC2My\r\n=u48r\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCJ3OZWkoHNhmqGWgTTCOM9mcoC1wXFDM/mHz4nZKtmHQIhAMgFjUjuo0tjRsM+JRCulLrTU+Z366DFw85D9qUN28G2"}]}},"1.3.4":{"name":"jupyterlab-jupytext","version":"1.3.4","dependencies":{"@jupyterlab/application":"^3.0.0","@jupyterlab/apputils":"^3.0.0","@jupyterlab/nbformat":"^3.0.0","@jupyterlab/notebook":"^3.0.0"},"devDependencies":{"@jupyterlab/builder":"^3.0.0","npm-run-all":"^4.1.5","rimraf":"^3.0.2","typescript":"~4.0.3"},"dist":{"integrity":"sha512-3Ms90K/H39y+5HlFByMXRtytyo8oNyq7q0vGtzvBfXOC7ZOfzbqs4I3WmFcuj8HfEMqen8aYNLNXpmdlyZen5A==","shasum":"7d11d67fa8c4a3e698206cf7e256710009f189f5","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.3.4.tgz","fileCount":6,"unpackedSize":20925,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhLpFPCRA9TVsSAnZWagAARgIP/jnTOF1/cllaf8B3jHKg\nityvqcu7bbHX5TFu6LNtWoskjvH6YtIE4UlxgQ7DhtQWEZae6FElGyZOdovo\nB8UShWHmIR4mwE6OCHL/eSGIpVRP0L/o6YTOYEflNtTE8vKin+jHsPQgEW/W\nLyIREw9Rm4PCpoobJFxhh3LGI6A/ox7z3HhqH3RMefwzF53NsN3lVgrGCE8q\n7eerBblJeUL3Rzb7ZlVmlOenwNeDy3DSLP1u3j2azAo6APeqQdNYYv2ybsVY\nK8dOT3+zzGq+PVJwUo4tqq9V2dJ4xWycRmf23hI1xFOj2e+wSwT9l7e7wkHD\noavbBKF++uJmlIg0g/SWwgAQp7tx2lQjPGsfzoo+1a5b5kXyddDIMWIaKDF4\ngxuqoQGYAzFvzH4U9SBCPAgc3Q0BqpV2dL02sgFvzj58p03LgJYV+cyg/9f1\n4Rblp8WwPBQn5CTFlyIYi7R+YKn+30EPt2eN+1GrjAUP3I/6w3y7OhpuW7vt\nnMmLJYzuLiSmZtCgNJwk2G3N4tmU0z7Sv7C2sjgovreeG9W9/I7oB/cCcmIo\nBtvB4gRHSCSFcLXyugNYy0buYnXl4apKsgvg86DHZYuy5UGMWntWthkdHkJ6\nqXCuvnGUhyIJsRMRDAdljaxh+4GC1EDPWXvZRyvsmV+/yD0RwUD5D/L9YO5v\n9csq\r\n=8Hqh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCoGcZlHEYRTkd+zJxryWGuwwRNmnlXRM72LQRtVqpcAgIhANrrrBVNfO0CD9/OcV1x/dBrIicReWqakB1w4LKqE1a7"}]}},"1.3.5":{"name":"jupyterlab-jupytext","version":"1.3.5","dependencies":{"@jupyterlab/application":"^3.0.0","@jupyterlab/apputils":"^3.0.0","@jupyterlab/nbformat":"^3.0.0","@jupyterlab/notebook":"^3.0.0"},"devDependencies":{"@jupyterlab/builder":"^3.0.0","npm-run-all":"^4.1.5","rimraf":"^3.0.2","typescript":"~4.0.3"},"dist":{"integrity":"sha512-OY+Tb3cGBHPJfsGQvlxe8FnrJY3yuwMXBOrocvFExG3pQDvtBKbXh5yKApAbfBz/VHLD435MSmMwW0J70aHQaA==","shasum":"821c268fa1af5572dac9adf997be299ab30bcb5f","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.3.5.tgz","fileCount":6,"unpackedSize":21137,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhOSlwCRA9TVsSAnZWagAAzcYP/1PFOlHLU3+7OBJr32jT\nILc9Ff1tYqsUdpnpxoKSkicgH936VR+0fxsdqBSpglnEQnJ+9tI0CkqNecBJ\npIJhHS+NEGjD3b37SvAKtffCnUxY9fTXzZiAv5pXk0rDMBqVDJR7moopc0RC\nuJ+k96EaabPIaEMPb1AFYmYeQOMQ+i0GJxBfCatDalpui1dluc13CsxRWj/p\nchxv2u8YZh+zg2uB9Gf2HnwAF0KY9Ku6dOR1D4PJ1ai8R8iHn2hnFXCWgVTt\n69R405pOdgoPClydXPKdgFK8wDJ1/KlLqfnFd2uQoLRZ4RfdE+6EJ+y6mzxl\nPzrqN5r7jMflFm2pDDjcKH533Dw1AoO/uEEVU80RMd2iBQNfjh8rIMI5vlZE\nVtn4TN7t+xn/mmXMz7Bb4guw4XhOVGDn86KRm13vG4N/7xmtxg+yi3pGbrrl\nDQR9hPfXa9BnlSrSxD5DptXO0F4EQtShbUIF/4Eo9gVq/6DasgKRTPSi4G8N\nXYoataxI+xD7XEbh5WohQOhR8pVNXe2aCCrRNUobgoqOBFmK7u/KzU70QKyB\nCTS0MN7f86pIVu7TSJBxJKJwgwudLSAQF5cS7BYjDvhgJrsw1S1hT4HwbYoY\nWrD2j/dLzpaSosfenGL/h3v3mE2iEJczX2uGx4fp4PtAr5JO37VPejBm5vbz\nicJS\r\n=Nneo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCwHe2hxMHuRsNuJC0TDUaYEv7LKUV28BUvTGy6nj9y4AIhAJTercNPWbLx1PAfhpqxvB2UW6x78oBlUGKQrpqjJm/2"}]}},"1.3.6":{"name":"jupyterlab-jupytext","version":"1.3.6","dependencies":{"@jupyterlab/application":"^3.0.0","@jupyterlab/apputils":"^3.0.0","@jupyterlab/nbformat":"^3.0.0","@jupyterlab/notebook":"^3.0.0"},"devDependencies":{"@jupyterlab/builder":"^3.0.0","npm-run-all":"^4.1.5","rimraf":"^3.0.2","typescript":"~4.0.3"},"dist":{"integrity":"sha512-MSLg1l3LSJZOs8Xa429LEu40Kx5xh5LP4gZUMt0AfGf/kGniuadpPsrf4SiyPCo93T7DHuZ6cvNwOjqqSBszOA==","shasum":"3594ad030196d297cc98ce151a32350a5e2f3d76","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.3.6.tgz","fileCount":6,"unpackedSize":21273,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCUOL9NHIruaykE7m1Go0do+kYJxEtuypeVDXjpRoOrqwIgQEZrMzsP6/XbcGl21IAHNzBFye3ftDpmzkGzzcKg7RU="}]}},"1.3.7":{"name":"jupyterlab-jupytext","version":"1.3.7","dependencies":{"@jupyterlab/application":"^3.0.0","@jupyterlab/apputils":"^3.0.0","@jupyterlab/nbformat":"^3.0.0","@jupyterlab/notebook":"^3.0.0"},"devDependencies":{"@jupyterlab/builder":"^3.0.0","npm-run-all":"^4.1.5","rimraf":"^3.0.2","typescript":"~4.0.3"},"dist":{"integrity":"sha512-PprMBIOgNBNvg4we0csvRlAoReHzrZixTGm/MBQrUY+pe9YMSMe+ULbl1tgRzIQFaaIkQXNzrquFHH+YbblErg==","shasum":"2af05224989b3ddc2831b7f3043291f2ce132185","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.3.7.tgz","fileCount":5,"unpackedSize":23456,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhpXj8CRA9TVsSAnZWagAAVZcP/0XA5IzI85cUfMRBeVxV\nIUCXqsaYIrQafNCb1G2HZg39FI2hUJiSLeEVTYAFoWnQ8uFZDCT+R54kQ49z\n4fpfAghKP/2eWuf/yV4NRDoInD7my7DqaY5C3z3tF9surJGN+/SI00FTvJhn\nPoPy2vvUrXGsh+iKSw/Yimb5MoH7Zc2ZtWb1UfBFPjrRS9slVR2NL58bklTw\nHlOMujyMd8Lu7Eg9wAPT9mTPL8c5SzNMbFT/UmXEQBFy8LgO2IOQrkvOaznj\nzDYvDk+mdoe3GXW1NHmqtAcEdOT7SA17wTvIg67xUJCTJX5gN1Yi/1l+E4E7\nSycA9ryC+bOS2qWEY7B4CRK0wM8kay/0gRtOCubmuHbZdayhYJh+FWnLlZRF\nrO396Ijc/Dyv2g0vEOHQP+iKoZChLLxQjV8qOPslmfuXjcFHuEZXPXcDP0ol\nzM5gY7AizI1fPWPHnbGrZLQJyEwK4k9005YMSjbAY1wZnhb94P64cNlDDHzD\nfmV4A4R/EhOt09nSn7gCEhbRli/8lQydsC9jzT6J7jZ3dZ8+AtkSSyY9rDmH\nxF/J94Ry2mMOvYq3K/iDU/YXJaaHvxxKKx0duyZxEyuYGjlvcrd2mnRz6Cgl\n40yGlu26REkcgVOH4b3Qf7pQEb4LNFp1XgJzrai38N71+nW8jHb2DV6ulkPl\niA+j\r\n=eFJ9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDG6E3795fdRnLVGVlZ1oQRsY+B1agTa4zfdXROf92EQwIhALUhw5tBQDIFz4rNKeNjhE0YSz4KBtTdanoILtF5de2l"}]}},"1.3.8":{"name":"jupyterlab-jupytext","version":"1.3.8","dependencies":{"@jupyterlab/application":"^3.0.0","@jupyterlab/apputils":"^3.0.0","@jupyterlab/nbformat":"^3.0.0","@jupyterlab/notebook":"^3.0.0"},"devDependencies":{"@jupyterlab/builder":"^3.0.0","npm-run-all":"^4.1.5","rimraf":"^3.0.2","typescript":"~4.0.3"},"dist":{"integrity":"sha512-KYylafqYWD8k0EO55XS0TSUFupkhejpJiGgvu+CkTYWg/EJZaqD9HYd3xvZCmlCeEZ65wjGP9XrCoAXJ7yJSng==","shasum":"79fa1f3489ce956f65a3fe8d5b7bbd4d6cd2ef3b","tarball":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.3.8.tgz","fileCount":5,"unpackedSize":23940,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhq2gQCRA9TVsSAnZWagAA1AEP/03z6LqmOm3d1x3YtSSu\n+S+58b9Y9KNoI18ZlGxAdQ6vXK6iDBqFx3/UVUqdfJv6sX5mgr1DLqiaOMcU\niQOupmLQYb/d3zbaXaWk5Wl5OE7szmVctYJq2vXVv+GVFRwQXPzx9FDOifvO\nFQcEVZog0s5OSxIV5JiVj5fPxZB2m/7TnApI93Nt6Sbn5pdxM77kjsoVMHgP\n4xg1+V+Jjt8ukCuvE1wyhpGO9YkI8AbNZrVcQQ/OxerOZ0dBEXUQkyWNqcrL\netdPf2GE9bUaKI93BGgSy4eJ86hO3e6xQzuq35nt6/VGLxkqbnQT0tTKbSgN\nciMfsjZ2ybfKmfSAb5nhQiFPauXjE/byF4UvPdiTChQ7PFRDnWGk9DAIfgjP\nB96lWFdQVbkd+EdGBSYY2mKcVQb8alZh85KyV87mFAgNq/2d2yj1qZbOaXm0\ncfIiNEHrsrepDqJHgQaqy0Gr0R56oZk+piMMNDve9cBqv7LgW+0nNPlYHfoK\nvyTZlKnP0L/1ZdlyV4+4KiGWqM4jh9V+v4Vn86jiOoG/jdNcZEWfO5X2hHKe\nm3S1r4BuIWxm5TJLk2G0In/9AIbBdKClxHeQOZ5rUtbwet7sTEaAlZYKddud\nwtJJtyYaaN73bAgAhK3NvLTStS6FMUEICm37FnTeGmwZ7EN06aBlKWaCoPvN\n1z9N\r\n=z74O\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDgys0gxtbGopOJlV5br7XDr5dTShgmNioyfTykcCiE8gIhAKU9DpPSclddodmfZeLoK2AHDBX9y65xKrh4Cn8DWXAo"}]}}},"modified":"2022-05-07T01:15:07.819Z"} \ No newline at end of file diff --git a/.npm/_cacache/content-v2/sha512/2c/a8/c457c73791beb8d65d08936a0e7a2a68de1904668ec80c66eae736eacb612d27acc802d2f818b730cf05c4b31a6a19b8745a4a47d6babfdd083035cac131 b/.npm/_cacache/content-v2/sha512/2c/a8/c457c73791beb8d65d08936a0e7a2a68de1904668ec80c66eae736eacb612d27acc802d2f818b730cf05c4b31a6a19b8745a4a47d6babfdd083035cac131 new file mode 100644 index 0000000000000000000000000000000000000000..bebb191e3d293df9078b5d704831194c3a7b28a2 GIT binary patch literal 5342 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 literal 0 HcmV?d00001 diff --git a/.npm/_cacache/content-v2/sha512/4a/a0/69cafd04da71afcf7b38f07beb36e90f43ba42abbf9d4613a666bfa5ba9664069b4a0789e0a3330cf25e8d374417176d7a08b4c9a2cb0dcddcf840db2173 b/.npm/_cacache/content-v2/sha512/4a/a0/69cafd04da71afcf7b38f07beb36e90f43ba42abbf9d4613a666bfa5ba9664069b4a0789e0a3330cf25e8d374417176d7a08b4c9a2cb0dcddcf840db2173 new file mode 100644 index 0000000000000000000000000000000000000000..18a9256c5ed12c87ede3a8c0fa4c37adc4115e78 GIT binary patch literal 10901 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 literal 0 HcmV?d00001 diff --git a/.npm/_cacache/content-v2/sha512/53/ab/c1d19a3464a3e96f851cfd247273e83e286bee252eae19b2fed306d1f38053549dc03ca1cd9562e66901b2a28fffb01b51163724e88c06d8a2c6a920bffc b/.npm/_cacache/content-v2/sha512/53/ab/c1d19a3464a3e96f851cfd247273e83e286bee252eae19b2fed306d1f38053549dc03ca1cd9562e66901b2a28fffb01b51163724e88c06d8a2c6a920bffc new file mode 100644 index 0000000..8fc208d --- /dev/null +++ b/.npm/_cacache/content-v2/sha512/53/ab/c1d19a3464a3e96f851cfd247273e83e286bee252eae19b2fed306d1f38053549dc03ca1cd9562e66901b2a28fffb01b51163724e88c06d8a2c6a920bffc @@ -0,0 +1 @@ +{"name":"jupyterlab_tensorboard","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"jupyterlab_tensorboard","version":"0.1.0","dependencies":{"@jupyterlab/application":"^0.16.3","@jupyterlab/apputils":"^0.16.4","@jupyterlab/coreutils":"^1.1.3","@jupyterlab/launcher":"^0.16.3","@jupyterlab/services":"^2.0.3","@phosphor/algorithm":"^1.1.2","@phosphor/coreutils":"^1.3.0","@phosphor/disposable":"^1.1.2","@phosphor/domutils":"^1.1.2","@phosphor/messaging":"^1.2.2","@phosphor/signaling":"^1.2.2","@phosphor/widgets":"^1.5.0"},"devDependencies":{"rimraf":"^2.6.1","typescript":"~2.9.2"},"dist":{"integrity":"sha512-c4AZbBW8XGLX7B+qIBWCHmbyB2s6l+6RH+uetKlis3ee8U7av7qpCAcZ8vdg8cdFMVAijoiiufcnITlPL5eo2w==","shasum":"94fb3c846c01fde7a100409080937ee446356714","tarball":"https://registry.npmjs.org/jupyterlab_tensorboard/-/jupyterlab_tensorboard-0.1.0.tgz","fileCount":14,"unpackedSize":59327,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbctFLCRA9TVsSAnZWagAAKzsP/R66Q/cTZ4etf+789WYe\nTCkGgvKEs7tDmlEa4YBoUHgwbdpWiNSwE1mXt4O/bgLwifwCNOcsNlVy+Jkn\nYFt9uJMxG0z1/tROjArPXZWdKw6VlFYfZZ91sBfBElXU8Os38Ow/JbiiM1+0\n/D5L7pzR/z3Lv33MEc9MDXBRGQcitW8ZqilwFN7KQ83FcubyJHW96fgbrURx\nazT1N6eUqYCnwDz3Bl2qmQOJlYg2CsX6spJLn8ZX1gdWRttW4ZiI3l0cRvfY\nyJ4xYP78kny6KBNzc7cLK0YbH8n68lqRcAzY7QHGX/G78GF6M4DU+mp5ZBvB\nvBZKOHWw1D1Ik7kAp00iDVs3NQe1XD/hEbA3uoSTLz8654a0mW4xP9T4wJMO\nNZZ3ocSX24vFUsVsuGkvjEH752ut/Wq1VzZwcf9quQEGo8bYS2f0e1sh3JO/\nKBrNoVODA5Gdqp8cwLMtdwgzNqGAESXPWKhBhbx3vJmn8y4IW2OLwIKyHBBP\nkH/HPSSW2yHY2f+uF1aw4lBYslf2Xw8qsGku+R/K4ai6bIIf+o0Iyeukecvg\nIlthfVnhgil7N/iB4Pwk3MA75jh2kA4IVESTos8G+UcKIaf3rR7EYFOTxmQx\nMYPbAbwb3wPca5IVHeo3ft2hJBVpF6m/0Xsgt9GTO+zJxNUDXJei1+GPIBUa\nCgg+\r\n=viBo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDMLpJi8RqcHvHL9OWxIhNeQ66uOOXNGmZ1kjRi6GI74gIgbJGCmUSCXvjaAQiucdTaQI07QtjLv/uH92X4zx0j274="}]}},"0.1.2":{"name":"jupyterlab_tensorboard","version":"0.1.2","dependencies":{"@jupyterlab/application":"^0.16.3","@jupyterlab/apputils":"^0.16.4","@jupyterlab/coreutils":"^1.1.3","@jupyterlab/launcher":"^0.16.3","@jupyterlab/services":"^2.0.3","@phosphor/algorithm":"^1.1.2","@phosphor/coreutils":"^1.3.0","@phosphor/disposable":"^1.1.2","@phosphor/domutils":"^1.1.2","@phosphor/messaging":"^1.2.2","@phosphor/signaling":"^1.2.2","@phosphor/widgets":"^1.5.0"},"devDependencies":{"rimraf":"^2.6.1","typescript":"~2.9.2"},"dist":{"integrity":"sha512-l7Xx9I/Tnqxplvu1IrXrGC8xqGi52zD/of0+TLck9RYLAYw9VGStoEuokDudVHPCrqIn08vKSUYsd5fugH1Qtg==","shasum":"6a305f4d03a88f6b8715df875b8c39e771a56da8","tarball":"https://registry.npmjs.org/jupyterlab_tensorboard/-/jupyterlab_tensorboard-0.1.2.tgz","fileCount":15,"unpackedSize":61101,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbcuEMCRA9TVsSAnZWagAAHG4P/3caERx6ZKu6/utk8Ix1\n11/QhVjqhkcK7MfCtN1/QlVVOrhU2FYW87OWuBm4OJ13scx70rh/mnkVbiKj\nDl+HDOGAHNNCR+BZTlEQ/cyLObKuenMazZIyJ9rj3kvOGb1QB9fLGRD9Zk6Q\n+BILgX8KogZNRMVb0PXMM9YrGDceo2E8txe1JxeX/lOCIY/O5YRCQVokuZpJ\nQ0ixVWAQ+Aar7eLgHW/nWksjChwHe+CcrKKjdRzj0hDbBvRYccl+XlL3V37d\nLEA0jA0VGBunB25JlxP7CwIYpFwg+OU5q+a9Z0ucW1NDg9LMmIi+Eq37aWD6\nCpx9sxhFy0rQV23Hyi+8HVtPL8s+bCCYPz4N9PN0W1ynpVD/0QTRiaAJF6rS\n30E3lik4DSpy95Qh4gl4HipN0SQTHygcBEN8L7Kb7une+8xi6w3vDGtpQif1\nF/PB4ug5PSiMYVNHXEP5R5Z9asDW+0f6KoiJh9IykanQX3vCshtEKfw1Bg0W\nCPjriCd8pzawfouBDpuPaI3E46OL+jZbGMnYlC7+afQvgLt8cmEb0nIYVOv/\nciC93FwSW89d/I12JVreKdRWjETFMxeoH5eE316Q4mYXaHgw6UGxDqysMZE5\nHuD11sW0DKHfC72lGmUE1JaF7aG2VAwEBh2D/522Je+G3vQrU6hZ4cGq4iAD\nOQap\r\n=R9p7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDF7JqzAKAOWXIufV1/hoOHKZTWhPWyJ4bxOjUEPapcTAIhAP6E6PtxUmz8g5joKXMxzKb3vaoFYM5TNRmFeWpGejZ1"}]}},"0.1.3":{"name":"jupyterlab_tensorboard","version":"0.1.3","dependencies":{"@jupyterlab/application":"^0.17.2","@jupyterlab/apputils":"^0.17.2","@jupyterlab/coreutils":"^2.0.2","@jupyterlab/launcher":"^0.17.2","@jupyterlab/services":"^3.0.3","@phosphor/algorithm":"^1.1.2","@phosphor/coreutils":"^1.3.0","@phosphor/disposable":"^1.1.2","@phosphor/domutils":"^1.1.2","@phosphor/messaging":"^1.2.2","@phosphor/signaling":"^1.2.2","@phosphor/widgets":"^1.5.0"},"devDependencies":{"rimraf":"^2.6.1","typescript":"~2.9.2"},"dist":{"integrity":"sha512-ayopIhWJT+3jcZTB1IlJvvE08cHH3oGKQlGXZvub3p0t59X4O6871GQuOe6yajT9OefOMtOd5iG35qtfmfFKSA==","shasum":"064082cf8041ceb9d647e526078243933131d772","tarball":"https://registry.npmjs.org/jupyterlab_tensorboard/-/jupyterlab_tensorboard-0.1.3.tgz","fileCount":15,"unpackedSize":61114,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbcuFcCRA9TVsSAnZWagAATnsP/2ZTtLaGw5vF14xU4Xci\nmeh4WG8qiNXazqcBJXAmIKZPpdJbrZY0SQZYYOSC+9otXjTtZU/nEEHS9zWx\norS/YhOdGawpbXMhFFb4wHYUvdM0cyQfHo1s+1lm/yRLc8X3cv6Alf91u2Dn\nrKXrfECnR8RmxevNL4aSlJtoJe5iAyrzk7mTgMRcYmUsLyessZ5tjQo0jc5I\nEQT/Cy4nKfXcjTs4Z+z5iquldtZGirPAPbfA4YtEQneDOBbrOnTm3CP13W29\n4Q812sWbZJ9on2plCMzAmMPOjy2mv0INXjd0Xh5sXDEkqsxXIbXRBtTa4xEi\nTKv8wPnSDFXOlKHKBkGknWPXVQJhYXMNwisVO92qVEBMOmTZYloSwmRBYwlu\nCdD65K1trvl6cROgk9SdtjOCX55zYF3lS1hbCFphDP5nIs9uHmybq3qXsemb\nWHLTJwOgE9JIpEj3JOaOA/YAEk3BznKxGaoVvD/etEuD4zDT+zM1sAC72B4h\nZjSygalg0pU08SecDBPGvVCoDBI8VNx0lJOpdWxZ5vHbtqGECaghUJlI5WEi\nONP2Wp7G5vEjrszle4XSrv4YZ8oejfS/j8mNcWD0rWNT/ZMpyPcSV3TudOHB\nu0YZpj05fG6nIj7Ll1Xh8LvCHffIHoDabmpnqcMmyjjYwln8uOVHLzhRGDvc\ncqVR\r\n=aHpw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD8h6eQyZNCkLfltvvRrzNxBSI3QSV6XSLrWlSpqp2FZgIhALkCCBTakuTED4nQUgSEKwgya0vYn8Jia8X8+gZbQYwQ"}]}},"0.1.4":{"name":"jupyterlab_tensorboard","version":"0.1.4","dependencies":{"@jupyterlab/application":"^0.18.2","@jupyterlab/apputils":"^0.18.2","@jupyterlab/coreutils":"^2.1.2","@jupyterlab/launcher":"^0.18.2","@jupyterlab/services":"^3.1.2","@phosphor/algorithm":"^1.1.2","@phosphor/coreutils":"^1.3.0","@phosphor/disposable":"^1.1.2","@phosphor/domutils":"^1.1.2","@phosphor/messaging":"^1.2.2","@phosphor/signaling":"^1.2.2","@phosphor/widgets":"^1.6.0"},"devDependencies":{"rimraf":"^2.6.1","typescript":"~2.9.2"},"dist":{"integrity":"sha512-cHqu5zlQ3x47WCkUZm2fxtDUndcwrBdBnE8Lhteq3CQzJNHr+2JN0ZqkBfLBb/bZnwaYam2DBbk456/+k5l6Sw==","shasum":"20b3f9a27c09fbe9723c86f72bfb73a6a82773f2","tarball":"https://registry.npmjs.org/jupyterlab_tensorboard/-/jupyterlab_tensorboard-0.1.4.tgz","fileCount":15,"unpackedSize":61121,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbfjM8CRA9TVsSAnZWagAA12YP/iaVD59QofsCBzy1WQge\nLw600c1Xh5DIEBqXQaQgchFpy916Z0BBHMNSWBq/8d3Tqlwn/q25RjSUNFzy\nu009xxeaIvUW1WSXywZulJXWRvjxQV848IHBiqzYtnaK+9QhVsFFlP/rwiaW\nXFUJkf4UI2S13arXbB+UFavRNut0QSFbUv7Iq9+4c+pZupvGrkaEVaqG7n8x\nc4VLfOsLKdrsZj2fFXonSQLozoci+RmV6uvSKRG9n9CeZewQFIXjW70Y+Ifx\n6vc+NVbl2d2mWM/ZSoJA+9qyK2Ew1Jt88rRntQd0nG6Z9uOjIMMkCzGPwZ3t\nPBMwT9ltAbi3OJg7Cc1OcP4qHN12p09gEr0UVq7Qvznog5+oPcz3OfMWi2xg\n9S66TNDj+MGFknBVpDa9e/N3y0MhjZO7sgyt5lnQgkx05krCFlaKjQY4t0s/\nsWPaPDSIS0sbnqKqNcrpLZg417J11VIWw4fq8z9VDC7vazNvXdsoYDKkRbSP\nAze+qNreUPEbtm4ztUnHK6ahqEpcVry+/IAHTk1DsctKaYOKtAlMuxIv6gFq\nYKlnx5YWJdxw6IGT1h44ZDAnw64G88WF71Fd10glqz0SFwGdShVg7XbbIEXl\nz3lw3+uOp5USHP2TqCsnLq8pqw2LtAnAKotatLnhphyD7urxh7Rz4mU1FrwI\nZHnW\r\n=68qI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDmeZlf+3NHV2fpdlkXXRjJRJkKOg5mEHep0UcFXDEOvAIgG/f+bF+sEzqrhPHlx/2rSTqRffQT1wPWUk/nl/1fw2Q="}]}},"0.1.5":{"name":"jupyterlab_tensorboard","version":"0.1.5","dependencies":{"@jupyterlab/application":"^0.19.1","@jupyterlab/apputils":"^0.19.1","@jupyterlab/coreutils":"^2.1.2","@jupyterlab/launcher":"^0.19.1","@jupyterlab/services":"^3.1.2","@phosphor/algorithm":"^1.1.2","@phosphor/coreutils":"^1.3.0","@phosphor/disposable":"^1.1.2","@phosphor/domutils":"^1.1.2","@phosphor/messaging":"^1.2.2","@phosphor/signaling":"^1.2.2","@phosphor/widgets":"^1.6.0"},"devDependencies":{"rimraf":"^2.6.1","typescript":"~2.9.2"},"dist":{"shasum":"56424eec11bbe2ac334ac68b521cfb270fddd9c0","tarball":"https://registry.npmjs.org/jupyterlab_tensorboard/-/jupyterlab_tensorboard-0.1.5.tgz","integrity":"sha512-51gyCEamhpdhZpOcRt3gLteE1tlgZqMHw3rNR9VoStetM3DTzRtChTrjd6WWXCblwSBBv2+p8W47ARGhCJ8o3A==","fileCount":15,"unpackedSize":61121,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb4o8QCRA9TVsSAnZWagAAnL4P/15xpzlg2pT9XXRixynZ\navp54oWXRZfPzIzhcS/+JPjBrp0+BrftsO8Z/SRHPYN6u3IyvKiyE1HnMpZt\n9gh3B6kiMsRWAQ7YLMIe4P7CCu0nAUMwxmZjESCFkpXZ7TU2hBuErX57DjWi\n37NZK/s4WbWOlB015//WGplOAMRTEkXc24x6Pl2QypRzFcfNkLr50WAPdWsI\n4Dw+js89GKzlpWO21p/A72SGb70K+F+JkQRDU75mm4wEk+aKHmhNm152DEPt\nCDTQ4KgPxp3FYugxOqqjal4i246jO5XvrzV2zoKF0cWU/QkLsTIj6OI/g36d\nirpdfcyrSkBw21a9sO5SdTmaT5G590x0WztNJZ8BvnIpgCKBEpJINys6B1ow\ntsMHwIxcnz1FFno4hrRHQdk9diHdxTJCKNw1Bsfk7ZzGlwjn78vdxF/UTYIV\nBKjipbhP951GDFGgBiy/xJ/dsfKK8kZEAh9hgIC+9vbv9iKe7QHgb7Xelmsh\nmqITytQAKEfk5ttdG1k8a8CKpi4q56HdP9cFKQBR1O0VKw2Wdz5dDXwlR+n2\nTr/wBN+h8qVibpUX9t6VZIv83Qnx9ltZDAj64KBGQb9BXA1nmbnBx6qfWEza\nFtLnz8k8ttbXLtDT3vES/Ka78hkpAH0YoKWWUbQCTwIoxR5IE6Ao82QKqnJa\nh7lv\r\n=j90H\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA9JhruCmO+kVmkw1EJuRz6WN27KHPq2WnYK0JZscmnDAiEAuizaAkZDq7dPuZZw2573hdLJtufoWehvo7piAljyewQ="}]}},"0.1.6":{"name":"jupyterlab_tensorboard","version":"0.1.6","dependencies":{"@jupyterlab/application":"^1.0.0","@jupyterlab/apputils":"^1.0.0","@jupyterlab/coreutils":"^3.0.0","@jupyterlab/launcher":"^1.0.0","@jupyterlab/services":"^4.0.0","@phosphor/algorithm":"^1.1.3","@phosphor/coreutils":"^1.3.1","@phosphor/disposable":"^1.2.0","@phosphor/domutils":"^1.1.2","@phosphor/messaging":"^1.2.3","@phosphor/signaling":"^1.2.3","@phosphor/widgets":"^1.8.0"},"devDependencies":{"rimraf":"^2.6.1","typescript":"~3.5.1"},"dist":{"integrity":"sha512-SVei6iIgdm2Xgvn6LSYqLa4G5JKXTKH23EoCMCI1OSF1vw9nNyRCGals8aDyxdzgapoeWMQM7ib29xDF4v5w/A==","shasum":"d7814038b5a827e814e602c77382251b086f1e5e","tarball":"https://registry.npmjs.org/jupyterlab_tensorboard/-/jupyterlab_tensorboard-0.1.6.tgz","fileCount":15,"unpackedSize":61483,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdIHaFCRA9TVsSAnZWagAA6OwP/1PhfYoGYvGR1x/m/Ci8\nF/0K3o78KZ++snRnTK5mbkh3QW2hmG5zzi66hqE6S4a/0UqwJjPwEoFCSUKH\ndJ1lo6UxdWLZyzo/ar65q9e5F7L/maiIlqF9Qxels+S4zqBjWJ1ZFSkDz7dw\nl0k+m5M+ObHrBepDG+rTcir2gQFWZEUjBzlbovraieVnY9ncpZdtPvGkDg40\nr0yP+U5aToC54jE/NtgYhlwrqZhs7+f7M6HfMkNq2Cr0Jb21J4csgcZDWuzy\nVwqbIrIQF1mgqclEmlOqXBheXCTGr6/ys1sigwi74a3tzRPd0GvQN+of76nC\n3Tj6yLrfXU1f6Gsbr2B+GsxnDvPxuAOfVu9IRmHt/TNTy7ANxO+z+1P/tn2V\nXX/2QejwwhBq0bI8vG9JaZrrb9VK0F5nptXZUcp0/kmWjKJ8x5XpcLzFbL1v\nnt+1VgIS4wwWQCCIho7B17z4BtLHUtAAFYzjSWyN1y0Xn0rCgzxdZWgWo9bE\nRSh67V7axgyh1BIGPQAlLSkbCVl+Ua05GPO70bUdqGp6FD8J0PcFO481WBS6\ndhiGn3GZ0EmAnnkp9lXnXL1j21PKqtWptkrPTQVEat12VDsUpPK65ugA8y3v\nvFVjHB/dlloBnJFjX/1+t76T6OrHRQwCqBQsvqPA8DBk3m5ZaqwOn/KkwCG+\nKGpu\r\n=n69/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEE6q48i0dXT33LI0ZN+e9p9pmH5KJZWq7xBYk1fpXRuAiEA/fwhRAwu6w2Fd6zTa2FRZ2s+Q2JYhrcP4xqDwR6Kl9s="}]}},"0.2.0":{"name":"jupyterlab_tensorboard","version":"0.2.0","dependencies":{"@jupyterlab/application":"^2.0.0","@jupyterlab/apputils":"^2.0.0","@jupyterlab/coreutils":"^4.0.0","@jupyterlab/launcher":"^2.0.0","@jupyterlab/services":"^5.0.0","@jupyterlab/mainmenu":"^2.0.0","@jupyterlab/filebrowser":"^2.0.0","@lumino/algorithm":"^1.1.3","@lumino/coreutils":"^1.3.1","@lumino/disposable":"^1.2.0","@lumino/domutils":"^1.1.2","@lumino/messaging":"^1.2.3","@lumino/signaling":"^1.2.3","@lumino/widgets":"^1.8.0"},"devDependencies":{"rimraf":"^3.0.0","typescript":"~3.8.0"},"dist":{"integrity":"sha512-057S0no4gquDITYkDP2bBh5jQBduqr+ZjqNLn+XCLWb4q6k+6cM2XgClFnPygoScpZQaLDqKan3GaP64l0Q5LQ==","shasum":"bda788ce68ac394550f6898259c8111e13053482","tarball":"https://registry.npmjs.org/jupyterlab_tensorboard/-/jupyterlab_tensorboard-0.2.0.tgz","fileCount":15,"unpackedSize":60835,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJefOMLCRA9TVsSAnZWagAAxvwP/iWyMoU92+Vo6ND2fOkR\nfx+k51tCey2dPxYRI5BNxmp+E653aTa2BXLdVslS65F1yDWPZXmYCT6QZLyq\nISnQxaX6JcKMhy/URnD41tbj0NG9coFxLCIF2Os0lVFRL2RBY1SoamB0aXxQ\nUKIQkM8MqvA1skGAZO/02Wsx/XBcEh4W8ZjjFsOUeTtKnPli6OOUNKWTxG5F\nuU8n6lcvYWqWzCu14Ie9T/T5ToknkmXplzpSFtw9NTy9cUBG0+8gdJu4dKgu\nwxHZEElpUFn5+L4o8suG68/x/NY68aGwJTiyxMJ7bDk4B5LdObxcfpJD14/v\nwlt8yoq29z3kp0DEkqTVUWjBIKoRlxXjFCmZlvedWVIFQb/TpA78K9FNvp5d\nWRtMzCKF073jQVKvTtdbNKTTYKiOH5lyJOTUKtMoT92/5946OTuf0iHkhSNA\n6qUVVCCSG4Nd8hJohKd42wA8kmzQryve+37tjgUdWp98jNX1e6kfa29nrWsb\nKNweg8B4/LYLlhFGu/PgdNTJCHX5iM7CeQMLrFVLDEPzLRFTqiEbVoy0VJyX\nzh1309raVLTEGQuprvsqhLorxVNFmYlR8sbznlCw1nOs9MAixPpFMe7P54AL\nQowkONlpZ91fEWscbWX6iiIL7Gkvk60AQt/4qgRxtbxMWR2evGoK0xCgfcsM\nghEK\r\n=JIlz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBM/lrsVytTu+92v/gHwNXMWLcxhHHhoOt3zOc0Zgp4VAiAk0/Flih+smHhpIxyzAkYkxlGvM6dwVzQsmLOwzyhvxg=="}]}},"0.2.1":{"name":"jupyterlab_tensorboard","version":"0.2.1","dependencies":{"@jupyterlab/application":"^2.0.0","@jupyterlab/apputils":"^2.0.0","@jupyterlab/coreutils":"^4.0.0","@jupyterlab/launcher":"^2.0.0","@jupyterlab/services":"^5.0.0","@jupyterlab/mainmenu":"^2.0.0","@jupyterlab/filebrowser":"^2.0.0","@jupyterlab/running":"^2.0.0","@jupyterlab/ui-components":"^2.0.0","@lumino/algorithm":"^1.1.3","@lumino/coreutils":"^1.3.1","@lumino/disposable":"^1.2.0","@lumino/domutils":"^1.1.2","@lumino/messaging":"^1.2.3","@lumino/signaling":"^1.2.3","@lumino/widgets":"^1.8.0"},"devDependencies":{"rimraf":"^3.0.0","typescript":"~3.8.0"},"dist":{"integrity":"sha512-SqBpyv0E2nGvz3s48HvrNukPQ7pCq7+dRhOmZr+lupZkBptKB4ngozMM8l6NN0QXF216CLTJossNzdz4QNshcw==","shasum":"1ecd28d590c14cda82b27d76709b35f9c21121ef","tarball":"https://registry.npmjs.org/jupyterlab_tensorboard/-/jupyterlab_tensorboard-0.2.1.tgz","fileCount":13,"unpackedSize":44024,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe90xcCRA9TVsSAnZWagAAvp4P/36bRAM1PAlzGFJJpNrv\noUfd31hd95v9Vw5PgLJvRgzthQPxpZlDI+vBRpexbxJDqYXlV3TXNUTp2C9W\n+dSeYfWO432YcbRVty9To76hv2ec9q0/l4lWUYG8cF/cvO2gr8Z0kM+95wvo\nXzSds0YEYxWvb9UgZ+gcNT3mBhjRrSsP3fuKTHn3C7OGJ4PEe1TL2yU4t0sn\nfAOzmTYE3fpG6IhFva2GuWJrOjdONyYf1oB6j8ePwnJcV8xLmKWPRxYSVIxZ\nM9i0WECbo7M1ml47LBeb1lHk/CMZsN2EORcMD/y3BVD4eSvsjV3aENDqgj+7\nSVoqkZ6kmXufNDmXz9eUA2VepA5UDMaIzwPtxu+38AgR5ZOkCfW/uHCI7Ovo\nikSMSjhPqwXOrGZDyy+6zJPlOJkH9cNL/XzYD9iNPtDDOU6l684bbA51W3/Z\n39KchByih9TJbRK7gxXlEMZ/QI9YoeRpThLR/yw2pw74roHQ9SIPazQuIDRQ\nkTmwAuyQbZkbAsd1HKMxQK2vd0CcyHQ+iiDFLq21Iehy3NoaTDtft5tbP8th\n1iREXzB61DVWuriBehtXmNm6HcWEZXgBnHtkGe3EDUtryOf4/8Lmsjd1e60U\nERmpNr6wvwokz3SdsZ4sUXgFGw6AdrCCrClUNYrIFHz4Zria3wiid+BLeHYY\n9179\r\n=3TQA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCMpPhAfcFAc2biHeg2h3P5w4ZAZJy909HSiJ0ClELRlQIhANi47PRbDj2b1WaUXxv/Ph2sRm8UPWAy+xFhB++AJkP6"}]}}},"modified":"2022-05-07T01:19:29.195Z"} \ No newline at end of file diff --git a/.npm/_cacache/index-v5/2b/cd/3ac6ae314de8839b74075c166d42a7bc667c6a0cdbbfe90261e360fda8bf b/.npm/_cacache/index-v5/2b/cd/3ac6ae314de8839b74075c166d42a7bc667c6a0cdbbfe90261e360fda8bf new file mode 100644 index 0000000..fbee82d --- /dev/null +++ b/.npm/_cacache/index-v5/2b/cd/3ac6ae314de8839b74075c166d42a7bc667c6a0cdbbfe90261e360fda8bf @@ -0,0 +1,2 @@ + +8c995c5e3409c2931595a373c086ed8bd7a30bac {"key":"make-fetch-happen:request-cache:https://registry.npmjs.org/jupyterlab_tensorboard","integrity":"sha512-U6vB0Zo0ZKPpb4Uc/SRyc+g+KGvuJS6uGbL+0wbR84BTVJ3APKHNlWLmaQGyoo//sBtRFjck6IwG2KLGqSC//A==","time":1652238676475,"size":15624,"metadata":{"time":1652238676470,"url":"https://registry.npmjs.org/jupyterlab_tensorboard","reqHeaders":{"accept":"application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*"},"resHeaders":{"cache-control":"public, max-age=300","content-type":"application/vnd.npm.install-v1+json","date":"Wed, 11 May 2022 03:11:13 GMT","etag":"\"da7906fcbeb79e3a83419495d5ed4ff6\"","last-modified":"Sat, 07 May 2022 01:19:30 GMT","vary":"accept-encoding, accept"}}} \ No newline at end of file diff --git a/.npm/_cacache/index-v5/4c/64/23f8b5034fecc4dd91aeffce1682eea81041ebd44192c901522303dea70e b/.npm/_cacache/index-v5/4c/64/23f8b5034fecc4dd91aeffce1682eea81041ebd44192c901522303dea70e new file mode 100644 index 0000000..3f00698 --- /dev/null +++ b/.npm/_cacache/index-v5/4c/64/23f8b5034fecc4dd91aeffce1682eea81041ebd44192c901522303dea70e @@ -0,0 +1,2 @@ + +c62bd2d038a20e41575732711abe42c4d876c701 {"key":"make-fetch-happen:request-cache:https://registry.npmjs.org/jupyterlab_tensorboard/-/jupyterlab_tensorboard-0.2.1.tgz","integrity":"sha512-SqBpyv0E2nGvz3s48HvrNukPQ7pCq7+dRhOmZr+lupZkBptKB4ngozMM8l6NN0QXF216CLTJossNzdz4QNshcw==","time":1652238676763,"size":10901,"metadata":{"time":1652238676754,"url":"https://registry.npmjs.org/jupyterlab_tensorboard/-/jupyterlab_tensorboard-0.2.1.tgz","reqHeaders":{},"resHeaders":{"cache-control":"public, immutable, max-age=31557600","content-type":"application/octet-stream","date":"Wed, 11 May 2022 03:11:14 GMT","etag":"\"21d0faf71443a52538e39bc72e0c8231\"","last-modified":"Sat, 27 Jun 2020 13:40:47 GMT","vary":"Accept-Encoding"}}} \ No newline at end of file diff --git a/.npm/_cacache/index-v5/ac/d8/02b53e9340cf22cc0e589680dc8ed1731bb9c0adda97021357182d36095a b/.npm/_cacache/index-v5/ac/d8/02b53e9340cf22cc0e589680dc8ed1731bb9c0adda97021357182d36095a new file mode 100644 index 0000000..232b4d1 --- /dev/null +++ b/.npm/_cacache/index-v5/ac/d8/02b53e9340cf22cc0e589680dc8ed1731bb9c0adda97021357182d36095a @@ -0,0 +1,2 @@ + +b3763bb843c295581320d1319e7addcd685704ba {"key":"make-fetch-happen:request-cache:https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.2.3.tgz","integrity":"sha512-LKjEV8c3kb641l0Ik2oOeipo3hkEZo7IDGbq5zbqy2EtJ6zIAtL4GLcwzwXEsxpqGbh0WkpH1rq/3QgwNcrBMQ==","time":1652238676561,"size":5342,"metadata":{"time":1652238676558,"url":"https://registry.npmjs.org/jupyterlab-jupytext/-/jupyterlab-jupytext-1.2.3.tgz","reqHeaders":{},"resHeaders":{"cache-control":"public, immutable, max-age=31557600","content-type":"application/octet-stream","date":"Wed, 11 May 2022 03:11:13 GMT","etag":"\"539610b0f4cc3a127abe58a55c362fbb\"","last-modified":"Wed, 14 Oct 2020 13:47:55 GMT","vary":"Accept-Encoding"}}} \ No newline at end of file diff --git a/.npm/_cacache/index-v5/e6/c0/741f8c19375dcfef585384ba651efe7f725e7379ed9fc932281f5a97d9af b/.npm/_cacache/index-v5/e6/c0/741f8c19375dcfef585384ba651efe7f725e7379ed9fc932281f5a97d9af new file mode 100644 index 0000000..67a0acc --- /dev/null +++ b/.npm/_cacache/index-v5/e6/c0/741f8c19375dcfef585384ba651efe7f725e7379ed9fc932281f5a97d9af @@ -0,0 +1,2 @@ + +ffd469e70d7e98d57eef3215ac34205f40d2e841 {"key":"make-fetch-happen:request-cache:https://registry.npmjs.org/jupyterlab-jupytext","integrity":"sha512-H8uISq2bjWteupr6fIP9+8vpVdeGxsiHrXLaMOd9cZ6jbHM3/AOlrU73mh01IurgZLuAW98wGic6h2baWyGrWw==","time":1652238676385,"size":34188,"metadata":{"time":1652238676358,"url":"https://registry.npmjs.org/jupyterlab-jupytext","reqHeaders":{"accept":"application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*"},"resHeaders":{"cache-control":"public, max-age=300","content-type":"application/vnd.npm.install-v1+json","date":"Wed, 11 May 2022 03:11:13 GMT","etag":"\"96455b475ba85a33d3d3122d9f0e0f16\"","last-modified":"Sat, 07 May 2022 01:15:09 GMT","vary":"accept-encoding, accept"}}} \ No newline at end of file diff --git a/.python_history b/.python_history new file mode 100644 index 0000000..871bff6 --- /dev/null +++ b/.python_history @@ -0,0 +1,20 @@ +import itk +parameter_object = itk.ParameterObject.New() +import itk +parameter_object = itk.ParameterObject.New() +import itk +itk.version +itk.VERSION +import itk +parameter_object = itk.ParameterObject.New() +from registration.best_reg import registration +from registration import +from registration.best_reg import registration +import monai +monai +dir(monai) +monai._version +monai._version() +monai._version +print(monai._version) +monai.__version__ diff --git a/.wget-hsts b/.wget-hsts new file mode 100644 index 0000000..2b8f815 --- /dev/null +++ b/.wget-hsts @@ -0,0 +1,5 @@ +# HSTS 1.0 Known Hosts database for GNU Wget. +# Edit at your own risk. +# +raw.githubusercontent.com 0 0 1691530822 31536000 +github.com 0 1 1691530822 31536000 diff --git a/1-move.py b/1-move.py index c47dbef..bba798e 100755 --- a/1-move.py +++ b/1-move.py @@ -1,13 +1,19 @@ #!/usr/bin/env python3 import os +import pprint import sys import time from pydicom.dataset import Dataset from pynetdicom import AE, evt, StoragePresentationContexts, debug_logger -from pynetdicom.sop_class import PatientRootQueryRetrieveInformationModelMove +from pynetdicom.sop_class import ( + PatientRootQueryRetrieveInformationModelFind, + PatientRootQueryRetrieveInformationModelMove, + StudyRootQueryRetrieveInformationModelMove, + PatientStudyOnlyQueryRetrieveInformationModelMove, +) # debug_logger() @@ -16,12 +22,13 @@ Series = {} dcm_dir = '/nn' def handle_store(event): - # print(event) +# print(event) """Handle a C-STORE request event.""" ds = event.dataset ds.file_meta = event.file_meta - # print(ds.SeriesInstanceUID) +# print(ds.SeriesInstanceUID) +# print(ds) if ds.SeriesInstanceUID in Series: s = Series[ds.SeriesInstanceUID] @@ -55,13 +62,97 @@ def handle_store(event): # Return a 'Success' status return 0x0000 +# Search in nested Python dict +def gen_dict_extract(key, var): + if hasattr(var,'items'): + for k, v in var.items(): + if k == key: + yield v + if isinstance(v, dict): + for result in gen_dict_extract(key, v): + yield result + elif isinstance(v, list): + for d in v: + for result in gen_dict_extract(key, d): + yield result + + +def FindElement(identifier, element): + e = None + for v in gen_dict_extract(element, identifier.to_json_dict()): + e = v['Value'][0] + return e + def QueryDCM(PatientID): - handlers = [(evt.EVT_C_STORE, handle_store)] + handlers = [ + (evt.EVT_C_STORE, handle_store), + ] +# debug_logger() + + StudyInstanceUID_DICT = {} + + ae = AE() + ae.add_requested_context(PatientRootQueryRetrieveInformationModelFind) + assoc = ae.associate("192.168.10.56", 104, + ae_title = 'IQWEBX', + ) + ds = Dataset() + ds.QueryRetrieveLevel = 'PATIENT' + ds.PatientID = PatientID + responses = assoc.send_c_find(ds, PatientRootQueryRetrieveInformationModelFind) +# print(responses) + for (status, identifier) in responses: +# print(status, identifier) + if status: + print('C-FIND query status: 0x{0:04X}'.format(status.Status)) + else: + print('Connection timed out, was aborted or received invalid response') + + if identifier: + +# d = {} + +# d['StudyDate' ] = FindElement(identifier, '00080020') +# d['ModalitiesInStudy'] = FindElement(identifier, '00080061') +# d['StudyInstanceUID' ] = FindElement(identifier, '0020000D') +# print(d) + +# if (d['ModalitiesInStudy' ] not in StudyInstanceUID_DICT) or ( +# d['StudyDate' ] > StudyInstanceUID_DICT[d['ModalitiesInStudy']]['StudyDate']): +# StudyInstanceUID_DICT[d['ModalitiesInStudy']] = d + + +# print(dir(identifier)) +# print(identifier.keys()) + + + + for sq in identifier[(0x3109, 0x1035)]: +# print(sq) +# print(type(sq)) + # exit() + d = {} + + d['StudyDate' ] = FindElement(sq, '00080020') + d['ModalitiesInStudy'] = FindElement(sq, '00080061') + d['StudyInstanceUID' ] = FindElement(sq, '0020000D') + print(d) + + if (d['ModalitiesInStudy' ] not in StudyInstanceUID_DICT) or ( + d['StudyDate' ] > StudyInstanceUID_DICT[d['ModalitiesInStudy']]['StudyDate']): + StudyInstanceUID_DICT[d['ModalitiesInStudy']] = d + + + assoc.release() + pprint.pprint(StudyInstanceUID_DICT) +# exit() + + + # Initialise the Application Entity ae = AE() - # Add a requested presentation context ae.add_requested_context(PatientRootQueryRetrieveInformationModelMove) @@ -73,34 +164,40 @@ def QueryDCM(PatientID): # scp = ae.start_server(("127.0.0.1", 11120), block=False, evt_handlers=handlers) scp = ae.start_server(("0.0.0.0", 11120), block=False, evt_handlers=handlers) - # Create out identifier (query) dataset - ds = Dataset() - ds.QueryRetrieveLevel = 'PATIENT' - ds.PatientID = PatientID + for ModalitiesInStudy, d in StudyInstanceUID_DICT.items(): + StudyInstanceUID = d['StudyInstanceUID'] + + # Create out identifier (query) dataset + ds = Dataset() + # ds.QueryRetrieveLevel = 'PATIENT' + # ds.PatientID = PatientID + ds.QueryRetrieveLevel = 'STUDY' + ds.StudyInstanceUID = StudyInstanceUID + + + # Associate with peer AE at IP 127.0.0.1 and port 11112 + # assoc = ae.associate("127.0.0.1", 11112) + assoc = ae.associate("192.168.10.56", 104, + ae_title = 'IQWEBX', + ) + + if assoc.is_established: + # Use the C-MOVE service to send the identifier + responses = assoc.send_c_move(ds, 'OUR_STORE_SCP', PatientRootQueryRetrieveInformationModelMove) - # Associate with peer AE at IP 127.0.0.1 and port 11112 - # assoc = ae.associate("127.0.0.1", 11112) - assoc = ae.associate("192.168.10.56", 104, - ae_title = 'IQWEBX', - ) + # print(responses) + for (status, identifier) in responses: +# print(status, identifier) + if status: + print('C-MOVE query status: 0x{0:04x}'.format(status.Status)) + else: + print('Connection timed out, was aborted or received invalid response') - - if assoc.is_established: - # Use the C-MOVE service to send the identifier - responses = assoc.send_c_move(ds, 'OUR_STORE_SCP', PatientRootQueryRetrieveInformationModelMove) - - for (status, identifier) in responses: - # print(status, identifier) - if status: - print('C-MOVE query status: 0x{0:04x}'.format(status.Status)) - else: - print('Connection timed out, was aborted or received invalid response') - - # Release the association - assoc.release() - else: - print('Association rejected, aborted or never connected') + # Release the association + assoc.release() + else: + print('Association rejected, aborted or never connected') # Stop our Storage SCP scp.shutdown() diff --git a/2-infer.py b/2-infer.py index 9e42ac3..ba6815a 100755 --- a/2-infer.py +++ b/2-infer.py @@ -1,5 +1,26 @@ #!/usr/bin/env python3 +''' +2d 0.4610997436727624 +3d_fullres 0.5022740762294419 +3d_lowres 0.5957028945994233 +3d_cascade_fullres 0.517286480153028 +ensemble_2d__nnUNetTrainerV2__nnUNetPlansv2.1--3d_fullres__nnUNetTrainerV2__nnUNetPlansv2.1 0.5243185547220239 +ensemble_2d__nnUNetTrainerV2__nnUNetPlansv2.1--3d_lowres__nnUNetTrainerV2__nnUNetPlansv2.1 0.552552255340162 +ensemble_2d__nnUNetTrainerV2__nnUNetPlansv2.1--3d_cascade_fullres__nnUNetTrainerV2CascadeFullRes__nnUNetPlansv2.1 0.531701751318307 +ensemble_3d_fullres__nnUNetTrainerV2__nnUNetPlansv2.1--3d_lowres__nnUNetTrainerV2__nnUNetPlansv2.1 0.6105215496684026 +ensemble_3d_fullres__nnUNetTrainerV2__nnUNetPlansv2.1--3d_cascade_fullres__nnUNetTrainerV2CascadeFullRes__nnUNetPlansv2.1 0.5343679184080806 +ensemble_3d_lowres__nnUNetTrainerV2__nnUNetPlansv2.1--3d_cascade_fullres__nnUNetTrainerV2CascadeFullRes__nnUNetPlansv2.1 0.6000630104223947 +Task222_ICTS2022 submit model ensemble_3d_fullres__nnUNetTrainerV2__nnUNetPlansv2.1--3d_lowres__nnUNetTrainerV2__nnUNetPlansv2.1 0.6105215496684026 + +Here is how you should predict test cases. Run in sequential order and replace all input and output folder names with your personalized ones + +nnUNet_predict -i FOLDER_WITH_TEST_CASES -o OUTPUT_FOLDER_MODEL1 -tr nnUNetTrainerV2 -ctr nnUNetTrainerV2CascadeFullRes -m 3d_fullres -p nnUNetPlansv2.1 -t Task222_ICTS2022 +nnUNet_predict -i FOLDER_WITH_TEST_CASES -o OUTPUT_FOLDER_MODEL2 -tr nnUNetTrainerV2 -ctr nnUNetTrainerV2CascadeFullRes -m 3d_lowres -p nnUNetPlansv2.1 -t Task222_ICTS2022 +nnUNet_ensemble -f OUTPUT_FOLDER_MODEL1 OUTPUT_FOLDER_MODEL2 -o OUTPUT_FOLDER -pp /workspace/nnUNet_trained_models/nnUNet/ensembles/Task222_ICTS2022/ensemble_3d_fullres__nnUNetTrainerV2__nnUNetPlansv2.1--3d_lowres__nnUNetTrainerV2__nnUNetPlansv2.1/postprocessing.json +''' + + import difflib import os import shutil @@ -8,14 +29,16 @@ import sys import time from nipype.interfaces.dcm2nii import Dcm2niix +from pydicom import dcmread +from pynetdicom import AE, debug_logger +from pynetdicom.sop_class import CTImageStorage, RTStructureSetStorage from rt_utils import RTStructBuilder import numpy as np import SimpleITK as sitk - -import itk_elastix - +# import itk_elastix +from registration.best_reg import reg_transform def dcm2nii(source_dir, output_dir): @@ -30,13 +53,17 @@ def dcm2nii(source_dir, output_dir): converter.run() -def register(DCM_CT, DCM_MR): +def inference(DCM_CT, DCM_MR): matcher = difflib.SequenceMatcher(a=DCM_CT, b=DCM_MR) match = matcher.find_longest_match(0, len(matcher.a), 0, len(matcher.b)) ROOT_DIR = DCM_CT[:match.size] NII_DIR = os.path.join(ROOT_DIR, 'nii') INPUT_DIR = os.path.join(ROOT_DIR, 'input') + + OUTPUT_3d_fullres = os.path.join(ROOT_DIR, '3d_fullres') + OUTPUT_3d_lowres = os.path.join(ROOT_DIR, '3d_lowres') + OUTPUT_DIR = os.path.join(ROOT_DIR, 'output') head, tail = os.path.split(DCM_CT) @@ -46,6 +73,8 @@ def register(DCM_CT, DCM_MR): os.makedirs(NII_DIR) shutil.rmtree(INPUT_DIR, ignore_errors=True) os.makedirs(INPUT_DIR) + shutil.rmtree(OUTPUT_3d_fullres, ignore_errors=True) + shutil.rmtree(OUTPUT_3d_lowres, ignore_errors=True) shutil.rmtree(OUTPUT_DIR, ignore_errors=True) # os.makedirs(OUTPUT_DIR) @@ -80,6 +109,7 @@ def register(DCM_CT, DCM_MR): print(NII_CT, NII_MR, input_file) # nnUNet_predict -i INPUT_FOLDER -o OUTPUT_FOLDER -t 222 -m 3d_lowres --save_npz + ''' subprocess.run(["nnUNet_predict", "-i", INPUT_DIR, "-o", OUTPUT_DIR, @@ -87,11 +117,56 @@ def register(DCM_CT, DCM_MR): "-m", "3d_lowres", "--save_npz", ]) + ''' + +# nnUNet_predict -i FOLDER_WITH_TEST_CASES -o OUTPUT_FOLDER_MODEL1 -tr nnUNetTrainerV2 -ctr nnUNetTrainerV2CascadeFullRes -m 3d_fullres -p nnUNetPlansv2.1 -t Task222_ICTS2022 +# nnUNet_predict -i FOLDER_WITH_TEST_CASES -o OUTPUT_FOLDER_MODEL2 -tr nnUNetTrainerV2 -ctr nnUNetTrainerV2CascadeFullRes -m 3d_lowres -p nnUNetPlansv2.1 -t Task222_ICTS2022 +# nnUNet_ensemble -f OUTPUT_FOLDER_MODEL1 OUTPUT_FOLDER_MODEL2 -o OUTPUT_FOLDER -pp /workspace/nnUNet_trained_models/nnUNet/ensembles/Task222_ICTS2022/ensemble_3d_fullres__nnUNetTrainerV2__nnUNetPlansv2.1--3d_lowres__nnUNetTrainerV2__nnUNetPlansv2.1/postprocessing.json + + + subprocess.run(["nnUNet_predict", + "-i", INPUT_DIR, + "-o", OUTPUT_3d_fullres, + "-tr", "nnUNetTrainerV2", + "-ctr", "nnUNetTrainerV2CascadeFullRes", + "-m", "3d_fullres", + "-p", "nnUNetPlansv2.1", + "-t", "Task222_ICTS2022", + "--save_npz", + ]) + + subprocess.run(["nnUNet_predict", + "-i", INPUT_DIR, + "-o", OUTPUT_3d_lowres, + "-tr", "nnUNetTrainerV2", + "-ctr", "nnUNetTrainerV2CascadeFullRes", + "-m", "3d_lowres", + "-p", "nnUNetPlansv2.1", + "-t", "Task222_ICTS2022", + "--save_npz", + ]) + + a = ["nnUNet_ensemble", + "-f", OUTPUT_3d_fullres, OUTPUT_3d_lowres, + "-o", OUTPUT_DIR, + "-pp", "/workspace/nnUNet_trained_models/nnUNet/ensembles/Task222_ICTS2022/ensemble_3d_fullres__nnUNetTrainerV2__nnUNetPlansv2.1--3d_lowres__nnUNetTrainerV2__nnUNetPlansv2.1/postprocessing.json", + ] + + print (' '.join(a)) + + subprocess.run(["nnUNet_ensemble", + "-f", OUTPUT_3d_fullres, OUTPUT_3d_lowres, + "-o", OUTPUT_DIR, + "-pp", "/workspace/nnUNet_trained_models/nnUNet/ensembles/Task222_ICTS2022/ensemble_3d_fullres__nnUNetTrainerV2__nnUNetPlansv2.1--3d_lowres__nnUNetTrainerV2__nnUNetPlansv2.1/postprocessing.json", + ]) + print(output_file) - r2 = itk_elastix.register(NII_CT, NII_MR) - itk_elastix.transform_write(output_file, r2['fwdtransforms'], label_file, is_label=True) +# r2 = itk_elastix.register(NII_CT, NII_MR) +# itk_elastix.transform_write(output_file, r2['fwdtransforms'], label_file, is_label=True) + + reg_transform(NII_CT, NII_MR, output_file, label_file) reader = sitk.ImageSeriesReader() dicom_names = reader.GetGDCMSeriesFileNames(DCM_CT) @@ -126,8 +201,48 @@ def register(DCM_CT, DCM_MR): print(rtss_file) rtstruct.save(rtss_file) + + return rtss_file +# incorporate send_c_store + +def SendDCM(fp): + debug_logger() + + # Initialise the Application Entity + ae = AE() + ae.ae_title = 'OUR_STORE_SCP' + + # Add a requested presentation context + # ae.add_requested_context(CTImageStorage) + ae.add_requested_context(RTStructureSetStorage) + + # Read in our DICOM CT dataset + ds = dcmread(fp) + + # Associate with peer AE at IP 127.0.0.1 and port 11112 + assoc = ae.associate("127.0.0.1", 11112) + assoc = ae.associate("172.16.40.36", 104, + ae_title = 'N1000_STORAGE', + ) + if assoc.is_established: + # Use the C-STORE service to send the dataset + # returns the response status as a pydicom Dataset + status = assoc.send_c_store(ds) + + # Check the status of the storage request + if status: + # If the storage request succeeded this will be 0x0000 + print('C-STORE request status: 0x{0:04x}'.format(status.Status)) + else: + print('Connection timed out, was aborted or received invalid response') + + # Release the association + assoc.release() + else: + print('Association rejected, aborted or never connected') + def main(): if len(sys.argv) < 2: @@ -138,7 +253,8 @@ def main(): print(sys.argv[1]) start = time.time() - register(sys.argv[1], sys.argv[2]) + rtss_file = inference(sys.argv[1], sys.argv[2]) + SendDCM(rtss_file) end = time.time() print(end - start, 'seconds') diff --git a/6jj_lths.mat b/6jj_lths.mat new file mode 100644 index 0000000000000000000000000000000000000000..b09b4502f3d09f87e567f51dec22a92fbf948178 GIT binary patch literal 193 zcmZQzU|`?@Vn!ea0cjw1OiRnmOARSX%qvdIFUpNi$uCXHNsTv-HwLMA@c-X?dmw#a zrdjuXAe|s_rvXGOsQm8)i9b+$1D1DSYuyMEXGmSw1QI{6pmrmOR%n69GjPR79{};~ xncN(JbVJStO%Tn%48$Jqu9!M{E z<=6$H54`_hv>(J5+|&i48(hDFJoTkR)T1UhY> /etc/environment && bash #EXPOSE 22 +# Masonite +EXPOSE 8000 + # jupyter ENTRYPOINT jupyter-lab EXPOSE 8888 # pynetdicom EXPOSE 11120 - -# WORKDIR /workspace -WORKDIR /123 diff --git a/docker/qrun.sh b/docker/qrun.sh index d5ab395..856bc9c 100755 --- a/docker/qrun.sh +++ b/docker/qrun.sh @@ -4,11 +4,20 @@ export dockerImage=123:v0 #docker run --gpus all --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 -it --rm -v $DIR:/workspace $dockerImage /bin/bash -GPU=nvidia0 gpu-docker run --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 -it --rm \ +# GPU=nvidia0 gpu-docker run --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 -it --rm \ +#GPU=nvidia0 gpu-docker run --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 \ +docker run --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 \ +--name 123 \ -v /share/WORKSPACE/nnUNet:/workspace \ -v /share/Public/git/123:/123 \ -v /share/Public/git/123:/root \ -v /share/Public/nn:/nn \ --p 11120:11120 \ +-v /share/Public/Patient:/Patient \ +-p 8000:8000 \ -p 8888:8888 \ +-p 11120:11120 \ $dockerImage & + + +# Then recreate, adding GPU in runtime + diff --git a/docker/requirements.txt b/docker/requirements.txt new file mode 100644 index 0000000..70fbb58 --- /dev/null +++ b/docker/requirements.txt @@ -0,0 +1,2 @@ +masonite>=4.0,<5.0 +masonite-orm>=2.0,<3.0 diff --git a/myapp/.env-example b/myapp/.env-example new file mode 100644 index 0000000..9499e35 --- /dev/null +++ b/myapp/.env-example @@ -0,0 +1,51 @@ +APP_DEBUG=True +APP_ENV=local +APP_KEY=kdFqv3GDtbgryi-1RAtMDwFa80WQuDPwYcFDie4r9zs= +APP_URL=http://localhost:8000 +HASHING_FUNCTION=bcrypt +MIX_BASE_URL= + +MAIL_DRIVER=terminal +MAIL_FROM= +MAIL_HOST= +MAIL_PORT= +MAIL_USERNAME= +MAIL_PASSWORD= + +MAILGUN_DOMAIN= +MAILGUN_SECRET= + +DB_CONNECTION=sqlite +SQLITE_DB_DATABASE=masonite.sqlite3 +DB_HOST=127.0.0.1 +DB_USERNAME=root +DB_PASSWORD=root +DB_DATABASE=masonite +DB_PORT=3306 +DB_LOG=True + +S3_CLIENT= +S3_SECRET= +S3_BUCKET= + +JWT_SECRET= + +QUEUE_DRIVER=async +QUEUE_USERNAME= +QUEUE_VHOST= +QUEUE_PASSWORD= +QUEUE_HOST= +QUEUE_PORT= +QUEUE_CHANNEL= + +SLACK_TOKEN= +SLACK_WEBHOOK= + +VONAGE_KEY= +VONAGE_SECRET= +VONAGE_SMS_FROM= + +PUSHER_CLIENT= +PUSHER_APP_ID= +PUSHER_SECRET= +PUSHER_CLUSTER= \ No newline at end of file diff --git a/myapp/.env.testing b/myapp/.env.testing new file mode 100644 index 0000000..1ad83c1 --- /dev/null +++ b/myapp/.env.testing @@ -0,0 +1,2 @@ +DB_CONNECTION=sqlite +DB_LOG=True \ No newline at end of file diff --git a/myapp/.gitignore b/myapp/.gitignore new file mode 100644 index 0000000..4d928ff --- /dev/null +++ b/myapp/.gitignore @@ -0,0 +1,18 @@ +# python +*.pyc +*__pycache__ +.pytest_cache +venv +# environment +.env +.env.* +!.env.testing +# npm +node_modules +package-lock.json + +.vscode +**/*.DS_Store + +# compiled assets +storage/compiled diff --git a/myapp/Kernel.py b/myapp/Kernel.py new file mode 100644 index 0000000..9bb3f4c --- /dev/null +++ b/myapp/Kernel.py @@ -0,0 +1,117 @@ +from masonite.foundation import response_handler +from masonite.storage import StorageCapsule +from masonite.auth import Sign +from masonite.environment import LoadEnvironment +from masonite.utils.structures import load +from masonite.utils.location import base_path +from masonite.middleware import ( + SessionMiddleware, + EncryptCookies, + LoadUserMiddleware, + MaintenanceModeMiddleware, +) +from masonite.routes import Route +from masonite.configuration.Configuration import Configuration +from masonite.configuration import config + +from app.middlewares import VerifyCsrfToken, AuthenticationMiddleware +from masonite.api.middleware import JWTAuthenticationMiddleware + +class Kernel: + + http_middleware = [MaintenanceModeMiddleware, EncryptCookies] + + route_middleware = { + "web": [SessionMiddleware, LoadUserMiddleware, VerifyCsrfToken], + "auth": [AuthenticationMiddleware], + + # .. + "api": [ + JWTAuthenticationMiddleware + ], + + } + + def __init__(self, app): + self.application = app + + def register(self): + # Register routes + self.load_environment() + self.register_configurations() + self.register_middleware() + self.register_routes() + self.register_database() + self.register_templates() + self.register_storage() + + def load_environment(self): + LoadEnvironment() + + def register_configurations(self): + # load configuration + self.application.bind("config.location", "config") + configuration = Configuration(self.application) + configuration.load() + self.application.bind("config", configuration) + key = config("application.key") + self.application.bind("key", key) + self.application.bind("sign", Sign(key)) + # set locations + self.application.bind("resources.location", "resources/") + self.application.bind("controllers.location", "app/controllers") + self.application.bind("jobs.location", "app/jobs") + self.application.bind("providers.location", "app/providers") + self.application.bind("mailables.location", "app/mailables") + self.application.bind("listeners.location", "app/listeners") + self.application.bind("validation.location", "app/validation") + self.application.bind("notifications.location", "app/notifications") + self.application.bind("events.location", "app/events") + self.application.bind("tasks.location", "app/tasks") + self.application.bind("models.location", "app/models") + self.application.bind("observers.location", "app/models/observers") + self.application.bind("policies.location", "app/policies") + self.application.bind("commands.location", "app/commands") + self.application.bind("middlewares.location", "app/middlewares") + + self.application.bind("server.runner", "masonite.commands.ServeCommand.main") + + def register_middleware(self): + self.application.make("middleware").add(self.route_middleware).add(self.http_middleware) + + def register_routes(self): + Route.set_controller_locations(self.application.make("controllers.location")) + self.application.bind("routes.location", "routes/web") + self.application.make("router").add( + Route.group( + load(self.application.make("routes.location"), "ROUTES"), middleware=["web"] + ) + ) + #API Development + self.application.bind("routes.api.location", "routes/api") + + + + def register_database(self): + from masoniteorm.query import QueryBuilder + + self.application.bind( + "builder", + QueryBuilder(connection_details=config("database.databases")), + ) + + self.application.bind("migrations.location", "databases/migrations") + self.application.bind("seeds.location", "databases/seeds") + + self.application.bind("resolver", config("database.db")) + + def register_templates(self): + self.application.bind("views.location", "templates/") + + def register_storage(self): + storage = StorageCapsule() + storage.add_storage_assets(config("filesystem.staticfiles")) + self.application.bind("storage_capsule", storage) + + self.application.set_response_handler(response_handler) + self.application.use_storage_path(base_path("storage")) diff --git a/myapp/app/__init__.py b/myapp/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myapp/app/controllers/BlogController.py b/myapp/app/controllers/BlogController.py new file mode 100644 index 0000000..8aeb19c --- /dev/null +++ b/myapp/app/controllers/BlogController.py @@ -0,0 +1,7 @@ +from masonite.controllers import Controller +from masonite.views import View + + +class BlogController(Controller): + def show(self, view: View): + return view.render("blog") diff --git a/myapp/app/controllers/PatientController.py b/myapp/app/controllers/PatientController.py new file mode 100644 index 0000000..82f916e --- /dev/null +++ b/myapp/app/controllers/PatientController.py @@ -0,0 +1,11 @@ +from masonite.controllers import Controller +from masonite.views import View + + +class PatientController(Controller): + def show(self, view: View): + return view.render("patient.html") + + def move(self, view: View): + return view.render("patient.html") + \ No newline at end of file diff --git a/myapp/app/controllers/WelcomeController.py b/myapp/app/controllers/WelcomeController.py new file mode 100644 index 0000000..28c74b8 --- /dev/null +++ b/myapp/app/controllers/WelcomeController.py @@ -0,0 +1,10 @@ +"""A WelcomeController Module.""" +from masonite.views import View +from masonite.controllers import Controller + + +class WelcomeController(Controller): + """WelcomeController Controller Class.""" + + def show(self, view: View): + return view.render("welcome") diff --git a/myapp/app/controllers/__init__.py b/myapp/app/controllers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myapp/app/controllers/api/UsersController.py b/myapp/app/controllers/api/UsersController.py new file mode 100644 index 0000000..1b2f55f --- /dev/null +++ b/myapp/app/controllers/api/UsersController.py @@ -0,0 +1,19 @@ +from masonite.controllers import Controller +from masonite.views import View + + +class UsersController(Controller): + def index(self, view: View): + return view.render("") + + def show(self, view: View): + return view.render("") + + def store(self, view: View): + return view.render("") + + def update(self, view: View): + return view.render("") + + def destroy(self, view: View): + return view.render("") diff --git a/myapp/app/middlewares/AuthenticationMiddleware.py b/myapp/app/middlewares/AuthenticationMiddleware.py new file mode 100644 index 0000000..f00264c --- /dev/null +++ b/myapp/app/middlewares/AuthenticationMiddleware.py @@ -0,0 +1,13 @@ +from masonite.middleware import Middleware + + +class AuthenticationMiddleware(Middleware): + """Middleware to check if the user is logged in.""" + + def before(self, request, response): + if not request.user(): + return response.redirect(name="login") + return request + + def after(self, request, response): + return request diff --git a/myapp/app/middlewares/VerifyCsrfToken.py b/myapp/app/middlewares/VerifyCsrfToken.py new file mode 100644 index 0000000..d1f7b11 --- /dev/null +++ b/myapp/app/middlewares/VerifyCsrfToken.py @@ -0,0 +1,6 @@ +from masonite.middleware import VerifyCsrfToken as Middleware + + +class VerifyCsrfToken(Middleware): + + exempt = [] diff --git a/myapp/app/middlewares/__init__.py b/myapp/app/middlewares/__init__.py new file mode 100644 index 0000000..c88e722 --- /dev/null +++ b/myapp/app/middlewares/__init__.py @@ -0,0 +1,3 @@ +# flake8: noqa: F401 +from .VerifyCsrfToken import VerifyCsrfToken +from .AuthenticationMiddleware import AuthenticationMiddleware diff --git a/myapp/app/models/User.py b/myapp/app/models/User.py new file mode 100644 index 0000000..5c1056f --- /dev/null +++ b/myapp/app/models/User.py @@ -0,0 +1,12 @@ +"""User Model.""" +from masoniteorm.models import Model +from masoniteorm.scopes import SoftDeletesMixin +from masonite.authentication import Authenticates + + +class User(Model, SoftDeletesMixin, Authenticates): + """User Model.""" + + __fillable__ = ["name", "email", "password"] + __hidden__ = ["password"] + __auth__ = "email" diff --git a/myapp/app/providers/AppProvider.py b/myapp/app/providers/AppProvider.py new file mode 100644 index 0000000..2a81f14 --- /dev/null +++ b/myapp/app/providers/AppProvider.py @@ -0,0 +1,12 @@ +from masonite.providers import Provider + + +class AppProvider(Provider): + def __init__(self, application): + self.application = application + + def register(self): + pass + + def boot(self): + pass diff --git a/myapp/app/providers/__init__.py b/myapp/app/providers/__init__.py new file mode 100644 index 0000000..61ae291 --- /dev/null +++ b/myapp/app/providers/__init__.py @@ -0,0 +1,2 @@ +# flake8: noqa: F401 +from .AppProvider import AppProvider diff --git a/myapp/config/__init__.py b/myapp/config/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myapp/config/api.py b/myapp/config/api.py new file mode 100644 index 0000000..746ac11 --- /dev/null +++ b/myapp/config/api.py @@ -0,0 +1,15 @@ +"""API Config""" +from masonite.environment import env + +from app.models.User import User + +DRIVERS = { + "jwt": { + "algorithm": "HS512", + "secret": env("JWT_SECRET"), + "model": User, + "expires": None, + "authenticates": False, + "version": None, + } +} diff --git a/myapp/config/application.py b/myapp/config/application.py new file mode 100644 index 0000000..4b12a24 --- /dev/null +++ b/myapp/config/application.py @@ -0,0 +1,16 @@ +from masonite.environment import env + + +KEY = env("APP_KEY", "-RkDOqXojJIlsF_I8wWiUq_KRZ0PtGWTOZ676u5HtLg=") + +DEBUG = env("APP_DEBUG", True) + +HASHING = { + "default": env("HASHING_FUNCTION", "bcrypt"), + "bcrypt": {"rounds": 10}, + "argon2": {"memory": 1024, "threads": 2, "time": 2}, +} + +APP_URL = env("APP_URL", "http://localhost:8000/") + +MIX_BASE_URL = env("MIX_BASE_URL", None) diff --git a/myapp/config/auth.py b/myapp/config/auth.py new file mode 100644 index 0000000..c7dadcc --- /dev/null +++ b/myapp/config/auth.py @@ -0,0 +1,8 @@ +from app.models.User import User + +GUARDS = { + "default": "web", + "web": {"model": User}, + "password_reset_table": "password_resets", + "password_reset_expiration": 1440, # in minutes. 24 hours. None if disabled +} diff --git a/myapp/config/broadcast.py b/myapp/config/broadcast.py new file mode 100644 index 0000000..78bc948 --- /dev/null +++ b/myapp/config/broadcast.py @@ -0,0 +1,14 @@ +from masonite.environment import env + + +BROADCASTS = { + "default": "pusher", + "pusher": { + "driver": "pusher", + "client": env("PUSHER_CLIENT"), + "app_id": env("PUSHER_APP_ID"), + "secret": env("PUSHER_SECRET"), + "cluster": env("PUSHER_CLUSTER"), + "ssl": False, + }, +} diff --git a/myapp/config/cache.py b/myapp/config/cache.py new file mode 100644 index 0000000..8623bdb --- /dev/null +++ b/myapp/config/cache.py @@ -0,0 +1,25 @@ +# from masonite.environment import env + + +STORES = { + "default": "local", + "local": { + "driver": "file", + "location": "storage/framework/cache" + # + }, + "redis": { + "driver": "redis", + "host": "127.0.0.1", + "port": "6379", + "password": "", + "name": "project_name", + }, + "memcache": { + "driver": "memcache", + "host": "127.0.0.1", + "port": "11211", + "password": "", + "name": "project_name", + }, +} diff --git a/myapp/config/database.py b/myapp/config/database.py new file mode 100644 index 0000000..091d99f --- /dev/null +++ b/myapp/config/database.py @@ -0,0 +1,56 @@ +from masonite.environment import LoadEnvironment, env +from masoniteorm.connections import ConnectionResolver + +# Loads in the environment variables when this page is imported. +LoadEnvironment() + +""" +The connections here don't determine the database but determine the "connection". +They can be named whatever you want. +""" +DATABASES = { + "default": env("DB_CONNECTION", "sqlite"), + "sqlite": { + "driver": "sqlite", + "database": env("SQLITE_DB_DATABASE", "masonite.sqlite3"), + "prefix": "", + "log_queries": env("DB_LOG"), + }, + "mysql": { + "driver": "mysql", + "host": env("DB_HOST"), + "user": env("DB_USERNAME"), + "password": env("DB_PASSWORD"), + "database": env("DB_DATABASE"), + "port": env("DB_PORT"), + "prefix": "", + "grammar": "mysql", + "options": { + "charset": "utf8mb4", + }, + "log_queries": env("DB_LOG"), + }, + "postgres": { + "driver": "postgres", + "host": env("DB_HOST"), + "user": env("DB_USERNAME"), + "password": env("DB_PASSWORD"), + "database": env("DB_DATABASE"), + "port": env("DB_PORT"), + "prefix": "", + "grammar": "postgres", + "log_queries": env("DB_LOG"), + }, + "mssql": { + "driver": "mssql", + "host": env("MSSQL_DATABASE_HOST"), + "user": env("MSSQL_DATABASE_USER"), + "password": env("MSSQL_DATABASE_PASSWORD"), + "database": env("MSSQL_DATABASE_DATABASE"), + "port": env("MSSQL_DATABASE_PORT"), + "prefix": "", + "log_queries": env("DB_LOG"), + }, +} + +DB = ConnectionResolver().set_connection_details(DATABASES) diff --git a/myapp/config/exceptions.py b/myapp/config/exceptions.py new file mode 100644 index 0000000..0d1f47a --- /dev/null +++ b/myapp/config/exceptions.py @@ -0,0 +1,24 @@ +OPTIONS = { + "editor": "vscode", + "search_url": "https://www.google.com/search?q=", + "links": { + "doc": "https://docs.masoniteproject.com", + "repo": "https://github.com/MasoniteFramework/masonite", + }, + "stack": {"offset": 10, "shorten": True}, + "hide_sensitive_data": True, +} + +HANDLERS = { + "context": True, + "dumps": True, + "solutions": { + "stackoverflow": False, + "possible_solutions": True + }, + "recommendations": { + "packages_updates": { + "list": ["exceptionite", "masonite", "masonite-orm", "pytest"] + } + }, +} diff --git a/myapp/config/filesystem.py b/myapp/config/filesystem.py new file mode 100644 index 0000000..0ede055 --- /dev/null +++ b/myapp/config/filesystem.py @@ -0,0 +1,21 @@ +from masonite.environment import env +from masonite.utils.location import base_path + + +DISKS = { + "default": "local", + "local": {"driver": "file", "path": base_path("storage/framework/filesystem")}, + "s3": { + "driver": "s3", + "client": env("S3_CLIENT"), + "secret": env("S3_SECRET"), + "bucket": env("S3_BUCKET"), + }, +} + +STATICFILES = { + # folder # template alias + "storage/static": "static/", + "storage/compiled": "assets/", + "storage/public": "/", +} diff --git a/myapp/config/mail.py b/myapp/config/mail.py new file mode 100644 index 0000000..2e20dd9 --- /dev/null +++ b/myapp/config/mail.py @@ -0,0 +1,23 @@ +from masonite.environment import env + + +FROM_EMAIL = env("MAIL_FROM", "no-reply@masonite.com") + +DRIVERS = { + "default": env("MAIL_DRIVER", "terminal"), + "smtp": { + "host": env("MAIL_HOST"), + "port": env("MAIL_PORT"), + "username": env("MAIL_USERNAME"), + "password": env("MAIL_PASSWORD"), + "from": FROM_EMAIL, + }, + "mailgun": { + "domain": env("MAILGUN_DOMAIN"), + "secret": env("MAILGUN_SECRET"), + "from": FROM_EMAIL, + }, + "terminal": { + "from": FROM_EMAIL, + }, +} diff --git a/myapp/config/notification.py b/myapp/config/notification.py new file mode 100644 index 0000000..e12dc32 --- /dev/null +++ b/myapp/config/notification.py @@ -0,0 +1,20 @@ +from masonite.environment import env + + +DRIVERS = { + "slack": { + "token": env("SLACK_TOKEN", ""), # used for API mode + "webhook": env("SLACK_WEBHOOK", ""), # used for webhook mode + }, + "vonage": { + "key": env("VONAGE_KEY", ""), + "secret": env("VONAGE_SECRET", ""), + "sms_from": env("VONAGE_SMS_FROM", "+33000000000"), + }, + "database": { + "connection": "sqlite", + "table": "notifications", + }, +} + +DRY = False diff --git a/myapp/config/providers.py b/myapp/config/providers.py new file mode 100644 index 0000000..07e7535 --- /dev/null +++ b/myapp/config/providers.py @@ -0,0 +1,56 @@ +from masonite.providers import ( + RouteProvider, + FrameworkProvider, + ViewProvider, + WhitenoiseProvider, + ExceptionProvider, + MailProvider, + SessionProvider, + QueueProvider, + CacheProvider, + EventProvider, + StorageProvider, + HelpersProvider, + BroadcastProvider, + AuthenticationProvider, + AuthorizationProvider, + HashServiceProvider, + ORMProvider, +) + +# Third Party Providers +from masonite.api.providers import ApiProvider + +from masonite.scheduling.providers import ScheduleProvider +from masonite.notification.providers import NotificationProvider +from masonite.validation.providers import ValidationProvider + +from app.providers import AppProvider + +PROVIDERS = [ + FrameworkProvider, + HelpersProvider, + RouteProvider, + ViewProvider, + WhitenoiseProvider, + ExceptionProvider, + MailProvider, + NotificationProvider, + SessionProvider, + CacheProvider, + QueueProvider, + ScheduleProvider, + EventProvider, + StorageProvider, + BroadcastProvider, + HashServiceProvider, + AuthenticationProvider, + ValidationProvider, + AuthorizationProvider, + ORMProvider, + AppProvider, + + # Third Party Providers + ApiProvider, + +] diff --git a/myapp/config/queue.py b/myapp/config/queue.py new file mode 100644 index 0000000..15f707b --- /dev/null +++ b/myapp/config/queue.py @@ -0,0 +1,39 @@ +from masonite.environment import env + + +DRIVERS = { + "default": env("QUEUE_DRIVER", "async"), + "database": { + "connection": "sqlite", + "table": "jobs", + "failed_table": "failed_jobs", + "attempts": 3, + "poll": 5, + }, + "redis": { + "name": env("QUEUE_USERNAME", "guest"), + "password": env("QUEUE_PASSWORD", "guest"), + "port": env("QUEUE_PORT", "6379"), + "host": env("QUEUE_HOST", "localhost"), + }, + "amqp": { + "username": env("QUEUE_USERNAME", "guest"), + "password": env("QUEUE_PASSWORD", "guest"), + "port": env("QUEUE_PORT", "5672"), + "vhost": env("QUEUE_VHOST", ""), + "host": env("QUEUE_HOST", "localhost"), + "exchange": "", + # See https://pika.readthedocs.io/en/stable/modules/parameters.html#pika.connection.URLParameters + # for valid connection options values + "connection_options": {}, + "channel": env("QUEUE_CHANNEL", "default"), + "queue": "masonite4", + "tz": "UTC", + }, + "async": { + "blocking": True, + "callback": "handle", + "mode": "threading", + "workers": 1, + }, +} diff --git a/myapp/config/session.py b/myapp/config/session.py new file mode 100644 index 0000000..e7557bd --- /dev/null +++ b/myapp/config/session.py @@ -0,0 +1,7 @@ +# from masonite.environment import env + + +DRIVERS = { + "default": "cookie", + "cookie": {}, +} diff --git a/myapp/craft b/myapp/craft new file mode 100644 index 0000000..b32fb5b --- /dev/null +++ b/myapp/craft @@ -0,0 +1,11 @@ +#!/usr/bin/env python +"""Craft Command. +This module is really used for backup only if the masonite CLI cannot import this for you. +This can be used by running "python craft". This module is not ran when the CLI can +successfully import commands for you. +""" + +from wsgi import application + +if __name__ == "__main__": + application.make("commands").run() diff --git a/myapp/databases/migrations/2021_01_09_033202_create_password_reset_table.py b/myapp/databases/migrations/2021_01_09_033202_create_password_reset_table.py new file mode 100644 index 0000000..4fa611f --- /dev/null +++ b/myapp/databases/migrations/2021_01_09_033202_create_password_reset_table.py @@ -0,0 +1,15 @@ +from masoniteorm.migrations import Migration + + +class CreatePasswordResetTable(Migration): + def up(self): + """Run the migrations.""" + with self.schema.create("password_resets") as table: + table.string("email").unique() + table.string("token") + table.datetime("expires_at").nullable() + table.datetime("created_at") + + def down(self): + """Revert the migrations.""" + self.schema.drop("password_resets") diff --git a/myapp/databases/migrations/2021_01_09_043202_create_users_table.py b/myapp/databases/migrations/2021_01_09_043202_create_users_table.py new file mode 100644 index 0000000..3311e59 --- /dev/null +++ b/myapp/databases/migrations/2021_01_09_043202_create_users_table.py @@ -0,0 +1,21 @@ +from masoniteorm.migrations import Migration + + +class CreateUsersTable(Migration): + def up(self): + """Run the migrations.""" + with self.schema.create("users") as table: + table.increments("id") + table.string("name") + table.string("email").unique() + table.string("password") + table.string("second_password").nullable() + table.string("remember_token").nullable() + table.string("phone").nullable() + table.timestamp("verified_at").nullable() + table.timestamps() + table.soft_deletes() + + def down(self): + """Revert the migrations.""" + self.schema.drop("users") diff --git a/myapp/databases/seeds/__init__.py b/myapp/databases/seeds/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myapp/databases/seeds/database_seeder.py b/myapp/databases/seeds/database_seeder.py new file mode 100644 index 0000000..4baa61b --- /dev/null +++ b/myapp/databases/seeds/database_seeder.py @@ -0,0 +1,10 @@ +"""Base Database Seeder Module.""" +from masoniteorm.seeds import Seeder + +from .user_table_seeder import UserTableSeeder + + +class DatabaseSeeder(Seeder): + def run(self): + """Run the database seeds.""" + self.call(UserTableSeeder) diff --git a/myapp/databases/seeds/user_table_seeder.py b/myapp/databases/seeds/user_table_seeder.py new file mode 100644 index 0000000..bdda61d --- /dev/null +++ b/myapp/databases/seeds/user_table_seeder.py @@ -0,0 +1,18 @@ +"""UserTableSeeder Seeder.""" +from masoniteorm.seeds import Seeder +from masonite.facades import Hash + +from app.models.User import User + + +class UserTableSeeder(Seeder): + def run(self): + """Run the database seeds.""" + User.create( + { + "name": "Joe", + "email": "user@example.com", + "password": Hash.make("secret"), + "phone": "+123456789", + } + ) diff --git a/myapp/makefile b/myapp/makefile new file mode 100644 index 0000000..66a6840 --- /dev/null +++ b/myapp/makefile @@ -0,0 +1,9 @@ +init: + pip install -r requirements.txt +lint: + python -m flake8 . +format: + black . + make lint +serve: + python craft serve diff --git a/myapp/package.json b/myapp/package.json new file mode 100644 index 0000000..800b050 --- /dev/null +++ b/myapp/package.json @@ -0,0 +1,17 @@ +{ + "private": true, + "scripts": { + "dev": "npm run development", + "development": "mix", + "watch": "mix watch", + "watch-poll": "mix watch -- --watch-options-poll=1000", + "hot": "mix watch --hot", + "prod": "npm run production", + "production": "mix --production" + }, + "devDependencies": { + "axios": "^0.22.0", + "laravel-mix": "^6.0.39", + "postcss": "^8.4.5" + } +} diff --git a/myapp/pyproject.toml b/myapp/pyproject.toml new file mode 100644 index 0000000..ddbc992 --- /dev/null +++ b/myapp/pyproject.toml @@ -0,0 +1,11 @@ +[tool.black] +line-length = 99 +target-version = ['py37'] +include = '\.pyi?$' +exclude = '(\.git|\.venv|\.idea|templates|resources|storage|databases\/migrations|node_modules)' + +[tool.pytest.ini_options] +minversion = "6.0" +testpaths = [ + "tests", +] \ No newline at end of file diff --git a/myapp/requirements.txt b/myapp/requirements.txt new file mode 100644 index 0000000..70fbb58 --- /dev/null +++ b/myapp/requirements.txt @@ -0,0 +1,2 @@ +masonite>=4.0,<5.0 +masonite-orm>=2.0,<3.0 diff --git a/myapp/resources/css/app.css b/myapp/resources/css/app.css new file mode 100644 index 0000000..b824a33 --- /dev/null +++ b/myapp/resources/css/app.css @@ -0,0 +1 @@ +/* Put your CSS here */ diff --git a/myapp/resources/js/app.js b/myapp/resources/js/app.js new file mode 100644 index 0000000..683e609 --- /dev/null +++ b/myapp/resources/js/app.js @@ -0,0 +1,2 @@ + +require("./bootstrap.js") diff --git a/myapp/resources/js/bootstrap.js b/myapp/resources/js/bootstrap.js new file mode 100644 index 0000000..9f66ef4 --- /dev/null +++ b/myapp/resources/js/bootstrap.js @@ -0,0 +1,23 @@ +/** + * We'll load the axios HTTP library which allows us to easily issue requests + * to our Masonite back-end. This library automatically handles sending the + * CSRF token as a header based on the value of the "XSRF" token cookie. + */ + +window.axios = require('axios'); + +window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; + +/** + * Next we will register the CSRF Token as a common header with Axios so that + * all outgoing HTTP requests automatically have it attached. This is just + * a simple convenience so we don't have to attach every token manually. + */ + +let token = document.head.querySelector('meta[name="csrf-token"]'); + +if (token) { + window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content; +} else { + console.error('CSRF token not found: https://docs.masoniteproject.com/features/csrf#ajax-vue-axios'); +} diff --git a/myapp/routes/api.py b/myapp/routes/api.py new file mode 100644 index 0000000..dec4e94 --- /dev/null +++ b/myapp/routes/api.py @@ -0,0 +1,7 @@ +# routes/api.py + +from masonite.routes import Route + +ROUTES = [ + Route.get('/users', 'UsersController@index') +] diff --git a/myapp/routes/web.py b/myapp/routes/web.py new file mode 100644 index 0000000..db0f1da --- /dev/null +++ b/myapp/routes/web.py @@ -0,0 +1,14 @@ +from masonite.routes import Route +from masonite.api import Api + +ROUTES = [ +# Route.get("/", "WelcomeController@show"), + Route.get("/", "PatientController@show"), + Route.post("/patient/move", "PatientController@move"), + + # Blog Routes + Route.get('/blog', 'BlogController@show'), + +] + +ROUTES += Api.routes(auth_route="/api/auth", reauth_route="/api/reauth") \ No newline at end of file diff --git a/myapp/setup.cfg b/myapp/setup.cfg new file mode 100644 index 0000000..59c885f --- /dev/null +++ b/myapp/setup.cfg @@ -0,0 +1,8 @@ +[flake8] +max-line-length = 99 +exclude = .git,.venv,.idea,templates,resources,storage,databases/migrations,resources,node_modules,__pycache__ +ignore=E501,F401,E203,E128,E402,E731,F821,E712,W503,F811 + +[coverage:run] +include = backend/* +omit = *migrations*, *tests*, config/*, manage.py, conftest.py diff --git a/myapp/storage/.gitignore b/myapp/storage/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/myapp/storage/public/favicon.ico b/myapp/storage/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fe97996ec72abee50a3b57cf0be7c0b271537d0b GIT binary patch literal 15406 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 + + + + + + + {% block title %}Masonite 4{% endblock %} + + + {% block head %} + + {% endblock %} + + + {% block content %}{% endblock %} + {% block js %} + + {% endblock %} + + diff --git a/myapp/templates/base.html b/myapp/templates/base.html new file mode 100644 index 0000000..c7998b1 --- /dev/null +++ b/myapp/templates/base.html @@ -0,0 +1,26 @@ + + + + + + + + {% block title %}Masonite 4{% endblock %} + + + + + + {% block head %} + + {% endblock %} + + + {% block content %}{% endblock %} + + + {% block js %} + + {% endblock %} + + diff --git a/myapp/templates/blog.html b/myapp/templates/blog.html new file mode 100644 index 0000000..5690c51 --- /dev/null +++ b/myapp/templates/blog.html @@ -0,0 +1 @@ +This is a blog \ No newline at end of file diff --git a/myapp/templates/errors/403.html b/myapp/templates/errors/403.html new file mode 100644 index 0000000..0435b9f --- /dev/null +++ b/myapp/templates/errors/403.html @@ -0,0 +1,20 @@ + + + + + + + + Permission Denied + + + + + {% block content %} +
+

Oops looks like you don't have access to this page !

+
+ {% endblock %} + + + diff --git a/myapp/templates/errors/404.html b/myapp/templates/errors/404.html new file mode 100644 index 0000000..0b0b68e --- /dev/null +++ b/myapp/templates/errors/404.html @@ -0,0 +1,20 @@ + + + + + + + + Page Not Found + + + + + {% block content %} +
+

Oops this page does not exist !

+
+ {% endblock %} + + + diff --git a/myapp/templates/errors/500.html b/myapp/templates/errors/500.html new file mode 100644 index 0000000..848ddf5 --- /dev/null +++ b/myapp/templates/errors/500.html @@ -0,0 +1,20 @@ + + + + + + + + Error 500 + + + + + {% block content %} +
+

Oops an error happened !

+
+ {% endblock %} + + + diff --git a/myapp/templates/maintenance.html b/myapp/templates/maintenance.html new file mode 100644 index 0000000..ad8b1ed --- /dev/null +++ b/myapp/templates/maintenance.html @@ -0,0 +1,20 @@ + + + + + + + + Server Maintenance + + + + + {% block content %} +
+

Sorry, this site is currently down for maintenance.

+
+ {% endblock %} + + + \ No newline at end of file diff --git a/myapp/templates/patient.html b/myapp/templates/patient.html new file mode 100644 index 0000000..a257d8f --- /dev/null +++ b/myapp/templates/patient.html @@ -0,0 +1,18 @@ +@extends 'base.html' + + +@block content + +
+ {{ csrf_field }} +
+ + +
Medical record number
+
+ +
+ +@endblock + + diff --git a/myapp/templates/welcome.html b/myapp/templates/welcome.html new file mode 100644 index 0000000..837ae2a --- /dev/null +++ b/myapp/templates/welcome.html @@ -0,0 +1,34 @@ +{% extends "base.html" %} +{% block title %}Welcome on Masonite 4{% endblock %} + +{% block content %} + +{% endblock %} diff --git a/myapp/tests/TestCase.py b/myapp/tests/TestCase.py new file mode 100644 index 0000000..f642e7f --- /dev/null +++ b/myapp/tests/TestCase.py @@ -0,0 +1,6 @@ +from masonite.tests import TestCase + + +class TestCase(TestCase): + def setUp(self): + super().setUp() diff --git a/myapp/tests/__init__.py b/myapp/tests/__init__.py new file mode 100644 index 0000000..975feaf --- /dev/null +++ b/myapp/tests/__init__.py @@ -0,0 +1 @@ +from .TestCase import TestCase diff --git a/myapp/tests/unit/test_basic_testcase.py b/myapp/tests/unit/test_basic_testcase.py new file mode 100644 index 0000000..1025831 --- /dev/null +++ b/myapp/tests/unit/test_basic_testcase.py @@ -0,0 +1,6 @@ +from tests import TestCase + + +class BasicTestCase(TestCase): + def test_basic_assertion(self): + self.assertTrue(True) diff --git a/myapp/webpack.mix.js b/myapp/webpack.mix.js new file mode 100644 index 0000000..677967c --- /dev/null +++ b/myapp/webpack.mix.js @@ -0,0 +1,26 @@ +/* Mix provides a clean, fluent API for defining some Webpack build steps for your Masonite +applications. By default, we are compiling the CSS file for the application as well as +bundling up all the JS files. */ +const mix = require('laravel-mix') +const path = require('path') + + +mix.js('resources/js/app.js', 'storage/compiled/js') + .postCss('resources/css/app.css', 'storage/compiled/css', [ + // + ]) + +// ensure root directory of mix is project root +mix.setPublicPath(".") + +// add an alias to js code +mix.alias({ + "@": path.resolve("resources/js/"), +}) + +// add version hash in production +if (mix.inProduction()) { + mix.version() +} +// Disable compilation success notification +mix.disableSuccessNotifications() diff --git a/myapp/wsgi.py b/myapp/wsgi.py new file mode 100644 index 0000000..a409dfd --- /dev/null +++ b/myapp/wsgi.py @@ -0,0 +1,14 @@ +from masonite.foundation import Application, Kernel +from masonite.utils.location import base_path +from masonite.configuration import config + +from Kernel import Kernel as ApplicationKernel + +"""Start The Application Instance.""" +application = Application(base_path()) + +"""Now Bind important providers needed to make the framework work.""" +application.register_providers(Kernel, ApplicationKernel) + +"""Now Bind important application specific providers needed to make the application work.""" +application.add_providers(*config("providers.providers")) diff --git a/old/1-move.py b/old/1-move.py new file mode 100755 index 0000000..ca61768 --- /dev/null +++ b/old/1-move.py @@ -0,0 +1,189 @@ +#!/usr/bin/env python3 + +import os +import sys +import time + +from pydicom.dataset import Dataset + +from pynetdicom import AE, evt, StoragePresentationContexts, debug_logger +from pynetdicom.sop_class import ( + PatientRootQueryRetrieveInformationModelFind, + PatientRootQueryRetrieveInformationModelMove, + StudyRootQueryRetrieveInformationModelMove, + PatientStudyOnlyQueryRetrieveInformationModelMove, +) + +# debug_logger() + +Series = {} + +dcm_dir = '/nn' + +def handle_store(event): +# print(event) + """Handle a C-STORE request event.""" + ds = event.dataset + ds.file_meta = event.file_meta + +# print(ds.SeriesInstanceUID) + + if ds.SeriesInstanceUID in Series: + s = Series[ds.SeriesInstanceUID] + else: + number = len(Series) + series_dir = os.path.join(dcm_dir, ds.PatientID, ds.StudyInstanceUID, ds.SeriesInstanceUID, str(number)) + series_dir = os.path.join(dcm_dir, ds.PatientID, ds.StudyDate, ds.Modality, str(number)) + series_dir = os.path.join(dcm_dir, ds.PatientID, ds.StudyDate, ds.Modality, hex(number)[2:]) + s = { + 'PatientID': ds.PatientID, + 'StudyInstanceUID': ds.StudyInstanceUID, + 'SeriesInstanceUID': ds.SeriesInstanceUID, + + 'Modality': ds.Modality, + 'SeriesDescription': ds.SeriesDescription, + + 'path': series_dir, + 'number': number, + } + # print(s) + print(s['path'], s['SeriesDescription']) + Series[ds.SeriesInstanceUID] = s + + os.makedirs(s['path'], exist_ok=True) + + filename = os.path.join(s['path'], ds.SOPInstanceUID) + + # Save the dataset using the SOP Instance UID as the filename + ds.save_as(filename, write_like_original=False) + + # Return a 'Success' status + return 0x0000 + +# Search in nested Python dict +def gen_dict_extract(key, var): + if hasattr(var,'items'): + for k, v in var.items(): + if k == key: + yield v + if isinstance(v, dict): + for result in gen_dict_extract(key, v): + yield result + elif isinstance(v, list): + for d in v: + for result in gen_dict_extract(key, d): + yield result + + +def FindElement(identifier, element): + e = None + for v in gen_dict_extract(element, identifier.to_json_dict()): + e = v['Value'][0] + return e + +def QueryDCM(PatientID): + + handlers = [ + (evt.EVT_C_STORE, handle_store), + ] + +# debug_logger() + + StudyInstanceUID_LIST = [] + + ae = AE() + ae.add_requested_context(PatientRootQueryRetrieveInformationModelFind) + assoc = ae.associate("192.168.10.56", 104, + ae_title = 'IQWEBX', + ) + ds = Dataset() + ds.QueryRetrieveLevel = 'PATIENT' + ds.PatientID = PatientID + responses = assoc.send_c_find(ds, PatientRootQueryRetrieveInformationModelFind) +# print(responses) + for (status, identifier) in responses: +# print(status, identifier) + if status: + print('C-FIND query status: 0x{0:04X}'.format(status.Status)) + else: + print('Connection timed out, was aborted or received invalid response') + + if identifier: + StudyInstanceUID = FindElement(identifier, '0020000D') + print(StudyInstanceUID) + StudyInstanceUID_LIST.append(StudyInstanceUID) + assoc.release() + print(StudyInstanceUID_LIST) + + + + # Initialise the Application Entity + ae = AE() + # Add a requested presentation context + ae.add_requested_context(PatientRootQueryRetrieveInformationModelMove) + + # Add the Storage SCP's supported presentation contexts + ae.supported_contexts = StoragePresentationContexts + + # Start our Storage SCP in non-blocking mode, listening on port 11120 + ae.ae_title = 'OUR_STORE_SCP' + # scp = ae.start_server(("127.0.0.1", 11120), block=False, evt_handlers=handlers) + scp = ae.start_server(("0.0.0.0", 11120), block=False, evt_handlers=handlers) + + for StudyInstanceUID in StudyInstanceUID_LIST: + + # Create out identifier (query) dataset + ds = Dataset() + # ds.QueryRetrieveLevel = 'PATIENT' + # ds.PatientID = PatientID + ds.QueryRetrieveLevel = 'STUDY' + ds.StudyInstanceUID = StudyInstanceUID + + + # Associate with peer AE at IP 127.0.0.1 and port 11112 + # assoc = ae.associate("127.0.0.1", 11112) + assoc = ae.associate("192.168.10.56", 104, + ae_title = 'IQWEBX', + ) + + if assoc.is_established: + + # Use the C-MOVE service to send the identifier + responses = assoc.send_c_move(ds, 'OUR_STORE_SCP', PatientRootQueryRetrieveInformationModelMove) + + # print(responses) + for (status, identifier) in responses: +# print(status, identifier) + if status: + print('C-MOVE query status: 0x{0:04x}'.format(status.Status)) + else: + print('Connection timed out, was aborted or received invalid response') + + # Release the association + assoc.release() + else: + print('Association rejected, aborted or never connected') + + # Stop our Storage SCP + scp.shutdown() + + +def main(): + if len(sys.argv) < 2: + print('Usage:', sys.argv[0], 'PatientID') + sys.exit() + print('hello') + print(sys.argv[0]) + print(sys.argv[1]) + + start = time.time() + QueryDCM(sys.argv[1]) + end = time.time() + print(end - start, 'seconds') + + # for k, v in Series.items(): + # print(v['number'], v['Modality'], v['SeriesDescription'], v['path']) + # print(v['path'], v['SeriesDescription']) + +if __name__ == '__main__': + main() diff --git a/3-send.py b/old/3-send.py similarity index 100% rename from 3-send.py rename to old/3-send.py diff --git a/itk_elastix.py b/old/itk_elastix.py similarity index 100% rename from itk_elastix.py rename to old/itk_elastix.py diff --git a/pxrjso6b.mat b/pxrjso6b.mat new file mode 100644 index 0000000000000000000000000000000000000000..ebe919eaa109799b54450d8949bfa5f806a009c2 GIT binary patch literal 193 zcmZQzU|`?@Vn!ea0cjw1OiRnmOARSX%qvdIFUpNi$uCXHNsTv-HwG&a+VS2V$Z+tv zdH_T-WN7y62T})`?;HTp4prO1@(hvRCxG}3#>MR*bqDy?OajxA|G@GOJU%cV0E#O# xNIE%y=o~r613;RA8Hi!dVFR+$GAmM3KoSXS7jqr}(hWINR2+b`1IJ(c0|2%AF7yBZ literal 0 HcmV?d00001 diff --git a/razmtoz2.mat b/razmtoz2.mat new file mode 100644 index 0000000000000000000000000000000000000000..992d9c66eee916f2377bb61dbfb4095f1eb01e90 GIT binary patch literal 193 zcmZQzU|`?@Vn!ea0cjw1OiRnmOARSX%qvdIFUpNi$uCXHNsTv-HwLLtkof=J9!NXz z#&_)p38)m+f#?TMgF8Xu3xwZ+ r2['metrics']: + self.res = r1 + else: + self.res = dict(r2) + self.res.update({ + 'fwdtransforms': r2['invtransforms'], + 'invtransforms': r2['fwdtransforms'], + 'warpedfixout': r2['warpedmovout'], + 'warpedmovout': r2['warpedfixout'], + }) + self.res.update({ + 'fix': fixed_image, + 'mov': moving_image, + }) + + + if debug: + pprint(self.res) + ants.image_write(fixed_image, '0fixed.nii.gz') + ants.image_write(moving_image, '0moving.nii.gz') + ants.image_write(r1['warpedfixout'], '0mf1.nii.gz') + ants.image_write(r1['warpedmovout'], '0fm1.nii.gz') + ants.image_write(r2['warpedmovout'], '0mf2.nii.gz') + ants.image_write(r2['warpedfixout'], '0fm2.nii.gz') + + def get_metrics(self): + return self.res['metrics'] + + def transform(self, moving, output_filename, is_label=False): + transform1 = next(tempfile._get_candidate_names())+'.mat' + # print(transform1) + ants.write_transform(self.res['fwdtransforms'], transform1) + mi = ants.image_read(moving, dimension=3) + if is_label: + transformed = ants.apply_transforms(self.res['fix'], mi, + transformlist=[transform1], interpolator='genericLabel').astype('uint8') + else: + transformed = ants.apply_transforms(self.res['fix'], mi, + transformlist=[transform1]) + # print(transformed) + ants.image_write(transformed, output_filename) + os.remove(transform1) \ No newline at end of file diff --git a/registration/best_reg.py b/registration/best_reg.py new file mode 100644 index 0000000..c2e9459 --- /dev/null +++ b/registration/best_reg.py @@ -0,0 +1,76 @@ +import multiprocessing +import os +import shutil +import tempfile +import time + +from .ants_reg import ants_reg +from .elastix_reg import elastix_reg + +Q = multiprocessing.Queue() + +def registration(method, fix, mov_image, mov_label): + start = time.time() + + transformed = next(tempfile._get_candidate_names())+'.nii.gz' + r = method(fix, mov_image) + r.transform(mov_label, transformed, is_label=False) + r.transform(mov_label, transformed, is_label=True) + + end = time.time() + + res = { + 'name': r.__class__.__name__, + 'metrics': r.get_metrics(), + 'transformed': transformed, + 'time': end - start, + } + + Q. put(res) + return r.get_metrics() + + +def dump_queue(q): + q.put(None) + return list(iter(lambda : q.get(timeout=0.00001), None)) + + +def reg_transform(fix, mov_image, mov_label, out_label): + regs = [ants_reg, elastix_reg] + + inputs = [(r, fix, mov_image, mov_label) for r in regs] + pool = multiprocessing.Pool(4) + # print(inputs) + pool_outputs = pool.starmap(registration, inputs) + pool.close() + + print(pool_outputs) + rlist = dump_queue(Q) +# print(rlist) + rlist2 = sorted(rlist, key=lambda r: -r['metrics']) + print(rlist2) + + shutil.copy(rlist2[0]['transformed'], out_label) + + for r in rlist2: + os.remove(r['transformed']) + + +fi = '/nn/2896833/20220506/nii/b_C+MAR_20220506155936_301.nii.gz' +mv_img = '/nn/2896833/20220506/nii/9_3D_fl3d_mt_FS_+_c_MPR_Tra_20220506142416_15.nii.gz' +mv_lab = '/nn/2896833/20220506/output/9_3D_fl3d_mt_FS_+_c_MPR_Tra_20220506142416.nii.gz' + + +if __name__ == '__main__': + reg_transform(fi, mv_img, mv_lab, 'tmp.nii.gz') + + # regs = [ants_reg, elastix_reg] + + # inputs = [(r, fi, mv) for r in regs] + # pool = multiprocessing.Pool(4) + # # print(inputs) + # pool_outputs = pool.starmap(registration, inputs) + # pool.close() + + # print(pool_outputs) + # print(dump_queue(Q)) diff --git a/registration/elastix_reg.py b/registration/elastix_reg.py new file mode 100644 index 0000000..29d33d2 --- /dev/null +++ b/registration/elastix_reg.py @@ -0,0 +1,249 @@ +from pprint import pprint + +import os +import re +import shutil +import tempfile + +from skimage.metrics import normalized_mutual_information + +import itk + +NumberOfIterations = 2100 +# NumberOfIterations = 4000 + +metric_patern = r'Final metric value = (\S+)' +metric_prog = re.compile(metric_patern) + + + +class elastix_reg: + + + def register_aux(self, fi, mv, debug=False, MaximumNumberOfIterations=[str(NumberOfIterations)]): + + parameter_object = itk.ParameterObject.New() + default_rigid_parameter_map = parameter_object.GetDefaultParameterMap('rigid') + default_rigid_parameter_map["AutomaticTransformInitialization"] = ["true"] + # default_rigid_parameter_map["NumberOfSamplesForExactGradient"] = ["100000"] + default_rigid_parameter_map['MaximumNumberOfIterations'] = MaximumNumberOfIterations + parameter_object.AddParameterMap(default_rigid_parameter_map) + + # pprint(default_rigid_parameter_map.asdict()) + # exit() + + outdir1 = tempfile.mkdtemp() + + try: + fm, params1 = itk.elastix_registration_method( + fi, mv, + parameter_object=parameter_object, + # log_to_console=True, + log_to_file=True, + output_directory = outdir1, + ) + except Exception as ex: + print(ex) + print(os.path.join(outdir1, 'elastix.log')) + # exit() + return { + 'metrics': 0, + } + + TransformParameterFileName = os.path.join(outdir1, 'TransformParameters.0.txt') + + # print(TransformParameterFileName) + # exit() + + ''' + The DisplacementMagnitudePenalty is a cost function that penalises ||Tμ(x) − x||2. You can use this + to invert transforms, by setting the transform to be inverted as an initial transform (using -t0), setting + (HowToCombineTransforms "Compose"), and running elastix with this metric, using the original fixed + image set both as fixed (-f) and moving (-m) image. After that you can manually set the initial transform + in the last parameter file to "NoInitialTransform", and voila, you have the inverse transform! Strictly + speaking, you should then also change the Size/Spacing/Origin/Index/Direction settings to match that of + the moving image. Select it with: + (Metric "DisplacementMagnitudePenalty") + Note that inverting a transformation becomes conceptually very similar to performing an image registration + in this way. Consequently, the same choices are relevant: optimisation algorithm, multiresolution etc... + Note that this procedure was described and evaluated in Metz et al. [2011]. + ''' + + parameter_object2 = itk.ParameterObject.New() + inverse_rigid_parameter_map = parameter_object.GetDefaultParameterMap('rigid') + inverse_rigid_parameter_map["HowToCombineTransforms"] = ["Compose"] + inverse_rigid_parameter_map["Metric"] = ["DisplacementMagnitudePenalty"] + + # inverse_rigid_parameter_map["AutomaticTransformInitialization"] = ["true"] + inverse_rigid_parameter_map['MaximumNumberOfIterations'] = MaximumNumberOfIterations + # inverse_rigid_parameter_map['UseAdaptiveStepSizes'] = ['false'] + parameter_object2.AddParameterMap(inverse_rigid_parameter_map) + + + # print(TransformParameterFileName) + # exit() + + + outdir2 = tempfile.mkdtemp() + mm, params2 = itk.elastix_registration_method( + mv, mv, + parameter_object=parameter_object2, + initial_transform_parameter_file_name = TransformParameterFileName, + log_to_console=debug, + log_to_file=True, + output_directory = outdir2, + ) + + elastix_log = os.path.join(outdir2, 'elastix.log') + with open(elastix_log) as log: + m = re.search(metric_prog, log.read()) + + DisplacementMagnitudePenalty = float(m[1]) + # print(DisplacementMagnitudePenalty) + # exit() + + last_parameter_map = params2.GetParameterMap(0) + # pprint(last_parameter_map.asdict()) + # exit() + last_parameter_map["InitialTransformParametersFileName"] = ["NoInitialTransform"] + + params2.SetParameterMap(0, last_parameter_map) + # params2.WriteParameterFile('123.txt') + mf = itk.transformix_filter( + fi, + params2) + + m1 = normalized_mutual_information(itk.GetArrayViewFromImage(fi), itk.GetArrayViewFromImage(fm)) + m2 = normalized_mutual_information(itk.GetArrayViewFromImage(mv), itk.GetArrayViewFromImage(mf)) + + print(MaximumNumberOfIterations, m1, m2, DisplacementMagnitudePenalty) + + shutil.rmtree(outdir1) + shutil.rmtree(outdir2) + # exit() + + + return { + 'fwdtransforms': params1, + 'invtransforms': params2, + 'warpedfixout': mf, + 'warpedmovout': fm, + 'metrics': max(m1, m2), + 'DisplacementMagnitudePenalty': DisplacementMagnitudePenalty, + } + + + # PixelType = itk.F + # Dimension = 3 + # ImageType = itk.Image[PixelType, Dimension] + + + # METRIC_THRESHOLD = 1.1 + def __init__(self, fi, mv, warpedfixout=None, warpedmovout=None, debug=False, iterations_init=NumberOfIterations): + + # reader = itk.ImageFileReader[ImageType].New() + # reader.SetFileName(fi) + # reader.Update() + # fixed_image = reader.GetOutput() + + fixed_image = itk.imread(fi, itk.F) + moving_image = itk.imread(mv, itk.F) + + iterations = iterations_init + # iterations_fin = iterations_init*2 + + + while True: + MaximumNumberOfIterations = [str(iterations)] + r1 = self.register_aux(fixed_image, moving_image, debug, MaximumNumberOfIterations=MaximumNumberOfIterations) + + if 'DisplacementMagnitudePenalty' not in r1: # None? + break + if r1['DisplacementMagnitudePenalty'] < 1: + break + # elif r1['metrics'] > METRIC_THRESHOLD: + # Redo = False + + # if iterations>iterations_fin: + # Redo = False + + iterations *= 2 + + + while True: + MaximumNumberOfIterations = [str(iterations)] + r2 = self.register_aux(moving_image, fixed_image, debug, MaximumNumberOfIterations=MaximumNumberOfIterations) + + if 'DisplacementMagnitudePenalty' not in r2: # None? + break + elif r2['DisplacementMagnitudePenalty'] < 1: + break + # elif r2['metrics'] > METRIC_THRESHOLD: + # Redo = False + + # if iterations>iterations_fin: + # Redo = False + + iterations *= 2 + + + + if r1['metrics'] > r2['metrics']: + self.res = r1 + else: + + if 'invtransforms' not in r2: + return None + + self.res = dict(r2) + self.res.update({ + 'fwdtransforms': r2['invtransforms'], + 'invtransforms': r2['fwdtransforms'], + 'warpedfixout': r2['warpedmovout'], + 'warpedmovout': r2['warpedfixout'], + }) + + + assert self.res['DisplacementMagnitudePenalty'] < 1, 'DisplacementMagnitudePenalty: %f ' % (self.res['DisplacementMagnitudePenalty']) + + + if warpedfixout is not None: + itk.imwrite(self.res['warpedfixout'], warpedfixout) + if warpedmovout is not None: + itk.imwrite(self.res['warpedmovout'], warpedmovout) + + if debug: + pprint(self.res) + itk.imwrite(fixed_image, '0fixed.nii.gz') + itk.imwrite(moving_image, '0moving.nii.gz') + itk.imwrite(r1['warpedfixout'], '0mf1.nii.gz') + itk.imwrite(r1['warpedmovout'], '0fm1.nii.gz') + itk.imwrite(r2['warpedmovout'], '0mf2.nii.gz') + itk.imwrite(r2['warpedfixout'], '0fm2.nii.gz') + + # return res + + def get_metrics(self): + return self.res['metrics'] + + def transform(self, moving, output_filename, is_label=False): + transform1 = self.res['fwdtransforms'] + mv = itk.imread(moving) + last_parameter_map = transform1.GetParameterMap(0) + + if is_label: + # last_parameter_map["InitialTransformParametersFileName"] = ["NoInitialTransform"] + last_parameter_map["ResampleInterpolator"] = ["FinalNearestNeighborInterpolator"] + # last_parameter_map["ResultImagePixelType"] = ["unsigned char"] + + t2 = itk.ParameterObject.New() + t2.AddParameterMap(last_parameter_map) + # pprint(t2.GetParameterMap(0).asdict()) + + output = itk.transformix_filter( + mv.astype(itk.F), + t2) + + if is_label: + output=output.astype(itk.UC) + itk.imwrite(output, output_filename) diff --git a/tjfrlfp4.mat b/tjfrlfp4.mat new file mode 100644 index 0000000000000000000000000000000000000000..dd0312daef280f6c9ac09eb9638162a706e3b66b GIT binary patch literal 193 zcmZQzU|`?@Vn!ea0cjw1OiRnmOARSX%qvdIFUpNi$uCXHNsTv-HwLL_SoG(;J&;cL zVLb^%A4p}Kz8^%lnN9-JoBo0286Fsfg5(#}vrPxl3