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 0000000..bebb191 Binary files /dev/null and b/.npm/_cacache/content-v2/sha512/2c/a8/c457c73791beb8d65d08936a0e7a2a68de1904668ec80c66eae736eacb612d27acc802d2f818b730cf05c4b31a6a19b8745a4a47d6babfdd083035cac131 differ 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 0000000..18a9256 Binary files /dev/null and b/.npm/_cacache/content-v2/sha512/4a/a0/69cafd04da71afcf7b38f07beb36e90f43ba42abbf9d4613a666bfa5ba9664069b4a0789e0a3330cf25e8d374417176d7a08b4c9a2cb0dcddcf840db2173 differ 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 0000000..b09b450 Binary files /dev/null and b/6jj_lths.mat differ diff --git a/adding.py b/adding.py new file mode 100644 index 0000000..307c992 --- /dev/null +++ b/adding.py @@ -0,0 +1,52 @@ +from rt_utils import RTStructBuilder +import matplotlib.pyplot as plt + +# Load existing RT Struct. Requires the series path and existing RT Struct path + + +dicom_series_path = "/nn/6768700/20230106/CT/9/" +rt_struct_list = [ + "/nn/6768700/20230106/CT/9-rtss.dcm", + "/nn/6768700/20230106/CT/DCM_1.2.840.114358.189250942524258.20230106112102.643186932766_230109075302/rtss~3~a2381ecc-4b94-40cc-a7aa-41968c54e206.dcm", +] + +rtstruct = RTStructBuilder.create_new(dicom_series_path=dicom_series_path) + +for rt_struct_path in rt_struct_list: + r = RTStructBuilder.create_from( + dicom_series_path=dicom_series_path, + rt_struct_path=rt_struct_path, + ) + for name in r.get_roi_names(): + mask_3d = r.get_roi_mask_by_name(name) + rtstruct.add_roi( + mask=mask_3d, + name=name, + ) + print(name) + +rtstruct.save('/nn/6768700/20230106/CT/new-rt-struct.dcm') +exit() + +#Large +rtstruct1 = RTStructBuilder.create_from( + dicom_series_path="/nn/6768700/20230106/CT/9/", + rt_struct_path="/nn/6768700/20230106/CT/9-rtss.dcm" +) + +#Small +rtstruct2 = RTStructBuilder.create_from( + dicom_series_path="/nn/6768700/20230106/CT/9/", + rt_struct_path="/nn/6768700/20230106/CT/DCM_1.2.840.114358.189250942524258.20230106112102.643186932766_230109075302/rtss~3~a2381ecc-4b94-40cc-a7aa-41968c54e206.dcm" +) + +# print(dir(rtstruct2)) + +for name in rtstruct2.get_roi_names(): + mask_3d = rtstruct2.get_roi_mask_by_name(name) + rtstruct1.add_roi( + mask=mask_3d, + name=name, + ) + print(name) + diff --git a/bcngawwk.mat b/bcngawwk.mat new file mode 100644 index 0000000..4104c26 Binary files /dev/null and b/bcngawwk.mat differ diff --git a/dev/register_rtss.py b/dev/register_rtss.py new file mode 100755 index 0000000..7458f2e --- /dev/null +++ b/dev/register_rtss.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 + +import os + +from pydicom import dcmread + + +RTSS = '/Patient/RTSS/66351478_struct_set_2022-10-03_10-00-35.dcm' +ReferenceRoot = '/nn/6635147/20220930/MR' + + +ds = dcmread(RTSS) + +print(ds) +exit() + +# print(ds['Frame of Reference UID']) +# print(dir(ds)) + +FrameOfReferenceUID = ds.FrameOfReferenceUID +print(FrameOfReferenceUID) + +for root, dirs, files in os.walk(ReferenceRoot): + for name in files: + dcm = os.path.join(root, name) + print(dcm) + ds = dcmread(dcm) + break + + print(ds.SeriesInstanceUID) +# break + + diff --git a/docker/Dockerfile b/docker/Dockerfile index 4bcef5b..fafe72e 100755 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -6,10 +6,16 @@ RUN apt-get update -y \ # pip # RUN pip install antspyx itk-elastix nipype nnunet rt_utils -RUN pip install antspyx itk-elastix nnunet # too large .... install first +RUN pip install antspyx nipype nnunet # too large .... install first +RUN pip install itk-elastix==0.13.0 RUN pip install --upgrade git+https://github.com/FabianIsensee/hiddenlayer.git@more_plotted_details#egg=hiddenlayer RUN pip install git+https://github.com/qurit/rt-utils.git@5bab9ffcc8fe19dd775e940afdc3d8f48f869150 # fix FrameOfReferenceUID -RUN pip install masonite nipype + + +# WORKDIR /workspace +WORKDIR /123 +COPY requirements.txt /123 +RUN pip install -r requirements.txt # nnUNet @@ -24,12 +30,12 @@ ENV RESULTS_FOLDER="/workspace/nnUNet_trained_models" #ENTRYPOINT service ssh restart && env >> /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 0000000..fe97996 Binary files /dev/null and b/myapp/storage/public/favicon.ico differ diff --git a/myapp/storage/public/logo.png b/myapp/storage/public/logo.png new file mode 100644 index 0000000..f3772ca Binary files /dev/null and b/myapp/storage/public/logo.png differ diff --git a/myapp/storage/public/robots.txt b/myapp/storage/public/robots.txt new file mode 100644 index 0000000..6f27bb6 --- /dev/null +++ b/myapp/storage/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: \ No newline at end of file diff --git a/myapp/templates/__init__.py b/myapp/templates/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/myapp/templates/base-tailwind.html b/myapp/templates/base-tailwind.html new file mode 100644 index 0000000..e8e92df --- /dev/null +++ b/myapp/templates/base-tailwind.html @@ -0,0 +1,24 @@ + + + + + + + + {% 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 0000000..ebe919e Binary files /dev/null and b/pxrjso6b.mat differ diff --git a/razmtoz2.mat b/razmtoz2.mat new file mode 100644 index 0000000..992d9c6 Binary files /dev/null and b/razmtoz2.mat differ diff --git a/registration/__init__.py b/registration/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/registration/ants_reg.py b/registration/ants_reg.py new file mode 100644 index 0000000..dbc75fa --- /dev/null +++ b/registration/ants_reg.py @@ -0,0 +1,82 @@ +from pprint import pprint + +import os +import tempfile + +from skimage.metrics import normalized_mutual_information + +import ants + +class ants_reg: + + def register_aux(self, fi, mv): + mytx = ants.registration(fixed=fi, moving=mv, type_of_transform = 'Rigid', + # verbose=True, + ) + +# print(mytx['fwdtransforms'][0]) + fwdtransforms = ants.read_transform(mytx['fwdtransforms'][0]) + + m1 = normalized_mutual_information(fi.numpy(), mytx['warpedmovout'].numpy()) + m2 = normalized_mutual_information(mv.numpy(), mytx['warpedfixout'].numpy()) + + + print(m1, m2) + + return { + 'fwdtransforms': fwdtransforms, + 'invtransforms': fwdtransforms.invert(), + 'warpedfixout': mytx['warpedfixout'], + 'warpedmovout': mytx['warpedmovout'], + 'metrics': max(m1, m2) + } + + def __init__(self, fi, mv, debug=False): + fixed_image = ants.image_read(fi, dimension=3) + moving_image = ants.image_read(mv, dimension=3) + r1 = self.register_aux(fixed_image, moving_image) + r2 = self.register_aux(moving_image, fixed_image) + + + if r1['metrics'] > 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 0000000..dd0312d Binary files /dev/null and b/tjfrlfp4.mat differ