From fe1230f514569b1e5d53f1fe1be42359e955ed43 Mon Sep 17 00:00:00 2001 From: qudsiramiz Date: Mon, 3 Apr 2023 15:54:38 -0400 Subject: [PATCH 1/8] updated read me --- README.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/README.md b/README.md index 0e9fbce..a6fdfc2 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,50 @@ ## How to run the programme/use the code +### Using a Terminal: + +#### Using Python virtual environment: + +1. Download the code or clone the repository using the command `$git clone + git@github.com:Lexi-BU/lxi_gui.git` + +2. Create a virtual environment using the command `$python3 -m venv + lexi_gui_env` (or any other name you want to give to the environment) + (for Ubuntu) + + a. Might need to install the python3 venv package using the command + `$sudo apt-get install python3-venv` (for Ubuntu) +3. Activate the virtual environment using the command `$source + lexi_gui_env/bin/activate` + +4. Install the required packages using the command `$pip install -r + requirements.txt` + +5. Run the file `lxi_gui.py` using the command `$python lxi_gui.py` (or + `$python3 lxi_gui.py` if you have both python2 and python3 installed). + +6. Can also run the file by simply using the command `$./lxi_gui.sh` (if + the file is an executable file). + +#### Using Poetry: + +1. Download the code or clone the repository using the command `$git clone + git@github.com:Lexi-BU/lxi_gui.git` + +2. cd into the folder using the command `$cd lxi_gui` + +3. Install poetry using the command `$pip install poetry` + +4. Install the required packages using the command `$poetry install` + +5. Start the virtual environment using the command `$poetry shell` + +6. Run the file `lxi_gui.py` using the command `$python lxi_gui.py` (or + `$python3 lxi_gui.py` if you have both python2 and python3 installed). + +7. Can also run the file by simply using the command `$./lxi_gui.sh` (if + the file is an executable file). + ### For Windows: 1. If you are on Windows, you can download the executable file for LUIGI by clicking on this link: [LUIGI Windows](https://drive.google.com/drive/folders/1LIOiDWf1iVsBD70_NCvknc1s4m35v0A-?usp=sharing) From 14e78e796fd3685679b20cb73f8a18c597b5103a Mon Sep 17 00:00:00 2001 From: Ramiz Qudsi Date: Fri, 25 Oct 2024 13:43:30 -0400 Subject: [PATCH 2/8] darkmode edits --- codes/luigi.cfg | 16 ++++++++-------- codes/lxi_gui.py | 31 ++++++++++++++++++++++++++++--- codes/lxi_gui_entry_box.py | 4 ++-- 3 files changed, 38 insertions(+), 13 deletions(-) diff --git a/codes/luigi.cfg b/codes/luigi.cfg index b6377a1..fbb3a27 100644 --- a/codes/luigi.cfg +++ b/codes/luigi.cfg @@ -5,18 +5,18 @@ y_min_entry = -5 y_max_entry = 5 hist_bin_entry = 200 c_min_entry = 1 -c_max_entry = None +c_max_entry = 100 density_status = False -norm_type = log +norm_type = linear unit_type = mcp -v_min_thresh_entry = 1.2 -v_max_thresh_entry = 3.4 -v_sum_min_thresh_entry = 5 -v_sum_max_thresh_entry = 7 +v_min_thresh_entry = 0 +v_max_thresh_entry = 5 +v_sum_min_thresh_entry = 0 +v_sum_max_thresh_entry = 20 cut_status = False curve_fit_status = False -lin_corr_status = True -non_lin_corr_status = True +lin_corr_status = False +non_lin_corr_status = False cmap = viridis [time_options] diff --git a/codes/lxi_gui.py b/codes/lxi_gui.py index b1308f1..176ee1e 100644 --- a/codes/lxi_gui.py +++ b/codes/lxi_gui.py @@ -345,6 +345,14 @@ def update_time_entry(time_entry, time_entry_other): time_entry_other.insert(0, time_entry.get()) +def update_file_entry(file_entry, file_entry_other): + """ + This function will take one file entry and update the other + """ + file_entry_other.delete(0, tk.END) + file_entry_other.insert(0, file_entry.get()) + + def dark_mode_change(): """ This function is called when the "Dark Mode" checkbox is clicked. It changes the background and @@ -352,6 +360,7 @@ def dark_mode_change(): """ global dark_mode dark_mode = dark_mode_var.get() + if dark_mode: bg_color = "black" fg_color = "white" @@ -418,6 +427,9 @@ def dark_mode_change(): except Exception: pass + # Run the populating entries function to change the color of the entry boxes + # lgeb.populate_entries(root=root, dark_mode=dark_mode) + # Check if global_variables.all_file_details is empty. If not, then refresh the plots if global_variables.all_file_details: try: @@ -430,6 +442,7 @@ def dark_mode_change(): except Exception: pass + # Create the main window. root = tk.Tk() @@ -904,6 +917,18 @@ def dark_mode_change(): folder_path.config(insertbackground=insertbackground_color) folder_path.config(state="normal", disabledbackground="black", disabledforeground="gray") +# Add a textbox to enter the folder path in HK tab as well +folder_path_hk = tk.Entry(hk_tab, justify="center", bg=bg_color, fg="green", borderwidth=2) +folder_path_hk.grid(row=12, column=6, columnspan=1, sticky="nsew") + +# Set the default folder name in the text box same as the one in the science tab +folder_path_hk.insert(1, folder_path.get()) + +# If the folder path in one tab is changed, update the other tab +folder_path.bind("", lambda *_: update_file_entry(folder_path, folder_path_hk)) +folder_path_hk.bind("", lambda *_: update_file_entry(folder_path_hk, folder_path)) + + # Add a button to load all the files in the folder_path folder_load_button = tk.Button( sci_tab, @@ -953,7 +978,7 @@ def dark_mode_change(): highlightbackground="green", highlightcolor="green", ) -folder_load_button_hk.grid(row=12, column=6, columnspan=1, sticky="nsew") +folder_load_button_hk.grid(row=12, column=7, columnspan=1, sticky="nsew") folder_load_button_hk.config(state="normal") # Label for plot times @@ -1331,7 +1356,7 @@ def apply_default_config(event): highlightbackground="green", highlightcolor="green", ) -refresh_ts_hk_button.grid(row=12, column=7, columnspan=1, rowspan=1, sticky="new") +refresh_ts_hk_button.grid(row=12, column=8, columnspan=1, rowspan=1, sticky="new") quit_button_hk = tk.Button( hk_tab, @@ -1349,6 +1374,6 @@ def apply_default_config(event): highlightbackground="red", highlightcolor="red", ) -quit_button_hk.grid(row=12, column=8, columnspan=1, rowspan=1, sticky="new") +quit_button_hk.grid(row=12, column=9, columnspan=1, rowspan=1, sticky="new") root.mainloop() diff --git a/codes/lxi_gui_entry_box.py b/codes/lxi_gui_entry_box.py index b0b8ac9..ef5c920 100644 --- a/codes/lxi_gui_entry_box.py +++ b/codes/lxi_gui_entry_box.py @@ -121,10 +121,10 @@ def populate_entries(root=None, dark_mode=True, default_vals=False): if dark_mode: bg_color = "black" - fg_color = "white" + fg_color = "red" else: bg_color = "white" - fg_color = "black" + fg_color = "red" # Get the default values from the config file default_opt_dict = lgcf.get_config_entry(default_vals=default_vals) From cf467e9e938f0d9490882c1ae009a2ce0d72b777 Mon Sep 17 00:00:00 2001 From: Ramiz Qudsi Date: Fri, 25 Oct 2024 14:57:14 -0400 Subject: [PATCH 3/8] fixed the histogram error bug --- codes/luigi.cfg | 16 ++++++++-------- codes/lxi_gui.py | 12 ++++++------ codes/lxi_gui_entry_box.py | 4 ++-- codes/lxi_gui_plot_routines.py | 6 +++--- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/codes/luigi.cfg b/codes/luigi.cfg index b6377a1..fd5dee2 100644 --- a/codes/luigi.cfg +++ b/codes/luigi.cfg @@ -3,20 +3,20 @@ x_min_entry = -5 x_max_entry = 5 y_min_entry = -5 y_max_entry = 5 -hist_bin_entry = 200 -c_min_entry = 1 -c_max_entry = None +hist_bin_entry = 100 +c_min_entry = 5 +c_max_entry = 500 density_status = False norm_type = log unit_type = mcp v_min_thresh_entry = 1.2 v_max_thresh_entry = 3.4 -v_sum_min_thresh_entry = 5 -v_sum_max_thresh_entry = 7 -cut_status = False -curve_fit_status = False +v_sum_min_thresh_entry = 7 +v_sum_max_thresh_entry = 8 +cut_status = True +curve_fit_status = True lin_corr_status = True -non_lin_corr_status = True +non_lin_corr_status = False cmap = viridis [time_options] diff --git a/codes/lxi_gui.py b/codes/lxi_gui.py index b1308f1..3b17ce4 100644 --- a/codes/lxi_gui.py +++ b/codes/lxi_gui.py @@ -456,8 +456,8 @@ def dark_mode_change(): 0.8 * root.winfo_screenheight(), ) -# screen_width = 1800 -# screen_height = 1000 +screen_width = 900 +screen_height = 600 # print( # "If the GUI size is messed up, check comment on line #215 of the code 'lxi_gui.py'." # ) @@ -510,12 +510,12 @@ def dark_mode_change(): dark_mode = True if dark_mode: bg_color = "black" - fg_color = "white" - insertbackground_color = "cyan" + fg_color = "red" + insertbackground_color = "red" else: bg_color = "white" - fg_color = "black" - insertbackground_color = "black" + fg_color = "red" + insertbackground_color = "red" # Add a checkbutton to enable/disable dark mode dark_mode_var = tk.BooleanVar() diff --git a/codes/lxi_gui_entry_box.py b/codes/lxi_gui_entry_box.py index b0b8ac9..ef5c920 100644 --- a/codes/lxi_gui_entry_box.py +++ b/codes/lxi_gui_entry_box.py @@ -121,10 +121,10 @@ def populate_entries(root=None, dark_mode=True, default_vals=False): if dark_mode: bg_color = "black" - fg_color = "white" + fg_color = "red" else: bg_color = "white" - fg_color = "black" + fg_color = "red" # Get the default values from the config file default_opt_dict = lgcf.get_config_entry(default_vals=default_vals) diff --git a/codes/lxi_gui_plot_routines.py b/codes/lxi_gui_plot_routines.py index 007523c..87e302b 100644 --- a/codes/lxi_gui_plot_routines.py +++ b/codes/lxi_gui_plot_routines.py @@ -613,12 +613,12 @@ def hist_plots(self): fig = plt.figure(num=None, facecolor=face_color, edgecolor=edge_color) # fig.subplots_adjust(wspace=0., hspace=0.1) - gs = plt.GridSpec(21, 21) + gs = plt.GridSpec(15, 15) axs1 = fig.add_subplot(gs[:-3, 3:], aspect=1) # Drop all nans in the data - self.df_slice_sci = self.df_slice_sci.dropna() + # self.df_slice_sci = self.df_slice_sci.dropna() # Try to select only rows where "IsCommanded" is False try: self.df_slice_sci = self.df_slice_sci[ @@ -693,7 +693,7 @@ def hist_plots(self): -0.70495138, -1.59298278, 2.63314709]]) # Scatter plot the xy values - axs1.scatter(xy[0], xy[1], marker=".", color="r", s=25, zorder=10) + # axs1.scatter(xy[0], xy[1], marker=".", color="r", s=25, zorder=10) # If all values of counts are NaN, then redo the histogram with different norm and cmin if np.isnan(counts).all(): logger.warning( From b00e45e5509a051899145170f530db84880a3d83 Mon Sep 17 00:00:00 2001 From: Ramiz Qudsi Date: Wed, 30 Oct 2024 09:56:28 -0400 Subject: [PATCH 4/8] minor legend location edits --- codes/luigi.cfg | 4 +- codes/lxi_gui.py | 4 +- codes/lxi_gui_plot_routines.py | 10 +- requirements.txt | 808 ++++++++++++++++++++++++++++++++- 4 files changed, 795 insertions(+), 31 deletions(-) diff --git a/codes/luigi.cfg b/codes/luigi.cfg index f3ebcf1..5018db9 100644 --- a/codes/luigi.cfg +++ b/codes/luigi.cfg @@ -20,7 +20,7 @@ non_lin_corr_status = False cmap = viridis [time_options] -start_time = 2023-01-01 00:00:00 -end_time = 2026-12-31 00:00:00 +start_time = 2024-11-16 10:00:00 +end_time = 2024-11-16 16:32:52 time_threshold = 60 diff --git a/codes/lxi_gui.py b/codes/lxi_gui.py index 1462917..5795a1e 100644 --- a/codes/lxi_gui.py +++ b/codes/lxi_gui.py @@ -469,8 +469,8 @@ def dark_mode_change(): 0.8 * root.winfo_screenheight(), ) -screen_width = 900 -screen_height = 600 +screen_width = 1250 +screen_height = 800 # print( # "If the GUI size is messed up, check comment on line #215 of the code 'lxi_gui.py'." # ) diff --git a/codes/lxi_gui_plot_routines.py b/codes/lxi_gui_plot_routines.py index 87e302b..edba243 100644 --- a/codes/lxi_gui_plot_routines.py +++ b/codes/lxi_gui_plot_routines.py @@ -366,11 +366,11 @@ def ts_plots(self): # percentile values as as mu, where mu is 50 percentile value and subscript is the 10 and # superscript is 90 percentile values axs1.text( + 0.02, 0.05, - 0.95, f"$\mu_{{{10}}}^{{{90}}}={key_50p_val:.2f}_{{{key_10p_val:.2f}}}^{{{key_90p_val:.2f}}}$", horizontalalignment="left", - verticalalignment="top", + verticalalignment="bottom", transform=axs1.transAxes, color=edgecolor, fontsize=10, @@ -398,9 +398,9 @@ def ts_plots(self): axs1.yaxis.set_major_locator(MaxNLocator(integer=True)) # Set the location of the legend and remove the marker from the legend - axs1.legend(loc="upper right", markerscale=0, handlelength=0, handletextpad=0, fancybox=True, - framealpha=0.5, edgecolor=edgecolor, facecolor=facecolor, fontsize=10, - bbox_to_anchor=(1.0, 1.0), bbox_transform=axs1.transAxes) + # axs1.legend(loc="upper right", markerscale=0, handlelength=0, handletextpad=0, fancybox=True, + # framealpha=0.5, edgecolor=edgecolor, facecolor=facecolor, fontsize=10, + # bbox_to_anchor=(1.0, 1.0), bbox_transform=axs1.transAxes) # legend_list = axs1.legend(handlelength=0, handletextpad=0, fancybox=False) # for item in legend_list.legendHandles: # item.set_visible(False) diff --git a/requirements.txt b/requirements.txt index b8fda3f..10d3829 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,22 +1,786 @@ -altgraph==0.17.2 -cycler==0.11.0 -fonttools==4.33.3 -h5py==3.8.0 -kiwisolver==1.4.2 -matplotlib==3.5.2 -numpy==1.22.4 -packaging==21.3 -pandas==1.4.2 -Pillow==9.3.0 -pyinstaller==5.1 -pyinstaller-hooks-contrib==2022.5 -pyparsing==3.0.9 -python-dateutil==2.8.2 -pytz==2022.1 -scipy==1.8.1 -seaborn==0.11.2 -six==1.16.0 -spacepy==0.4.1 -tabulate==0.8.9 -tk==0.1.0 -Wand==0.6.10 +altgraph==0.17.4 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:1b5afbb98f6c4dcadb2e2ae6ab9fa994bbb8c1d75f4fa96d340f9437ae454406 \ + --hash=sha256:642743b4750de17e655e6711601b077bc6598dbfa3ba5fa2b2a35ce12b508dff +bcrypt==4.2.0 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:096a15d26ed6ce37a14c1ac1e48119660f21b24cba457f160a4b830f3fe6b5cb \ + --hash=sha256:0da52759f7f30e83f1e30a888d9163a81353ef224d82dc58eb5bb52efcabc399 \ + --hash=sha256:1bb429fedbe0249465cdd85a58e8376f31bb315e484f16e68ca4c786dcc04291 \ + --hash=sha256:1d84cf6d877918620b687b8fd1bf7781d11e8a0998f576c7aa939776b512b98d \ + --hash=sha256:1ee38e858bf5d0287c39b7a1fc59eec64bbf880c7d504d3a06a96c16e14058e7 \ + --hash=sha256:1ff39b78a52cf03fdf902635e4c81e544714861ba3f0efc56558979dd4f09170 \ + --hash=sha256:27fe0f57bb5573104b5a6de5e4153c60814c711b29364c10a75a54bb6d7ff48d \ + --hash=sha256:3413bd60460f76097ee2e0a493ccebe4a7601918219c02f503984f0a7ee0aebe \ + --hash=sha256:3698393a1b1f1fd5714524193849d0c6d524d33523acca37cd28f02899285060 \ + --hash=sha256:373db9abe198e8e2c70d12b479464e0d5092cc122b20ec504097b5f2297ed184 \ + --hash=sha256:39e1d30c7233cfc54f5c3f2c825156fe044efdd3e0b9d309512cc514a263ec2a \ + --hash=sha256:3bbbfb2734f0e4f37c5136130405332640a1e46e6b23e000eeff2ba8d005da68 \ + --hash=sha256:3d3a6d28cb2305b43feac298774b997e372e56c7c7afd90a12b3dc49b189151c \ + --hash=sha256:5a1e8aa9b28ae28020a3ac4b053117fb51c57a010b9f969603ed885f23841458 \ + --hash=sha256:61ed14326ee023917ecd093ee6ef422a72f3aec6f07e21ea5f10622b735538a9 \ + --hash=sha256:655ea221910bcac76ea08aaa76df427ef8625f92e55a8ee44fbf7753dbabb328 \ + --hash=sha256:762a2c5fb35f89606a9fde5e51392dad0cd1ab7ae64149a8b935fe8d79dd5ed7 \ + --hash=sha256:77800b7147c9dc905db1cba26abe31e504d8247ac73580b4aa179f98e6608f34 \ + --hash=sha256:8ac68872c82f1add6a20bd489870c71b00ebacd2e9134a8aa3f98a0052ab4b0e \ + --hash=sha256:8d7bb9c42801035e61c109c345a28ed7e84426ae4865511eb82e913df18f58c2 \ + --hash=sha256:8f6ede91359e5df88d1f5c1ef47428a4420136f3ce97763e31b86dd8280fbdf5 \ + --hash=sha256:9c1c4ad86351339c5f320ca372dfba6cb6beb25e8efc659bedd918d921956bae \ + --hash=sha256:c02d944ca89d9b1922ceb8a46460dd17df1ba37ab66feac4870f6862a1533c00 \ + --hash=sha256:c52aac18ea1f4a4f65963ea4f9530c306b56ccd0c6f8c8da0c06976e34a6e841 \ + --hash=sha256:cb2a8ec2bc07d3553ccebf0746bbf3d19426d1c6d1adbd4fa48925f66af7b9e8 \ + --hash=sha256:cf69eaf5185fd58f268f805b505ce31f9b9fc2d64b376642164e9244540c1221 \ + --hash=sha256:f4f4acf526fcd1c34e7ce851147deedd4e26e6402369304220250598b26448db +bokeh==3.1.1 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:a542a076ce326f81bf6d226355458572d39fe8fc9b547eab9728a2f1d71e4bdb \ + --hash=sha256:ba0fc6bae4352d307541293256dee930a42d0acf92e760c72dc0e7397c3a28e9 +cffi==1.17.1 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8 \ + --hash=sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2 \ + --hash=sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1 \ + --hash=sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15 \ + --hash=sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36 \ + --hash=sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824 \ + --hash=sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8 \ + --hash=sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36 \ + --hash=sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17 \ + --hash=sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf \ + --hash=sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc \ + --hash=sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3 \ + --hash=sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed \ + --hash=sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702 \ + --hash=sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1 \ + --hash=sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8 \ + --hash=sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903 \ + --hash=sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6 \ + --hash=sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d \ + --hash=sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b \ + --hash=sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e \ + --hash=sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be \ + --hash=sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c \ + --hash=sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683 \ + --hash=sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9 \ + --hash=sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c \ + --hash=sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8 \ + --hash=sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1 \ + --hash=sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4 \ + --hash=sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655 \ + --hash=sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67 \ + --hash=sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595 \ + --hash=sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0 \ + --hash=sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65 \ + --hash=sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41 \ + --hash=sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6 \ + --hash=sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401 \ + --hash=sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6 \ + --hash=sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3 \ + --hash=sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16 \ + --hash=sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93 \ + --hash=sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e \ + --hash=sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4 \ + --hash=sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964 \ + --hash=sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c \ + --hash=sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576 \ + --hash=sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0 \ + --hash=sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3 \ + --hash=sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662 \ + --hash=sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3 \ + --hash=sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff \ + --hash=sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5 \ + --hash=sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd \ + --hash=sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f \ + --hash=sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5 \ + --hash=sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14 \ + --hash=sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d \ + --hash=sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9 \ + --hash=sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7 \ + --hash=sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382 \ + --hash=sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a \ + --hash=sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e \ + --hash=sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a \ + --hash=sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4 \ + --hash=sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99 \ + --hash=sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87 \ + --hash=sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b +contourpy==1.1.1 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6 \ + --hash=sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33 \ + --hash=sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8 \ + --hash=sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d \ + --hash=sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d \ + --hash=sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c \ + --hash=sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf \ + --hash=sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e \ + --hash=sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e \ + --hash=sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163 \ + --hash=sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532 \ + --hash=sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2 \ + --hash=sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8 \ + --hash=sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1 \ + --hash=sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b \ + --hash=sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9 \ + --hash=sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916 \ + --hash=sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23 \ + --hash=sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb \ + --hash=sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a \ + --hash=sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e \ + --hash=sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442 \ + --hash=sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684 \ + --hash=sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34 \ + --hash=sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d \ + --hash=sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d \ + --hash=sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9 \ + --hash=sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45 \ + --hash=sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718 \ + --hash=sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab \ + --hash=sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3 \ + --hash=sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae \ + --hash=sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb \ + --hash=sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5 \ + --hash=sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba \ + --hash=sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0 \ + --hash=sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217 \ + --hash=sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887 \ + --hash=sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887 \ + --hash=sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62 \ + --hash=sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431 \ + --hash=sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b \ + --hash=sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce \ + --hash=sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b \ + --hash=sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f \ + --hash=sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85 \ + --hash=sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e \ + --hash=sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7 \ + --hash=sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251 \ + --hash=sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970 \ + --hash=sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0 \ + --hash=sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7 +cryptography==43.0.3 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362 \ + --hash=sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4 \ + --hash=sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa \ + --hash=sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83 \ + --hash=sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff \ + --hash=sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805 \ + --hash=sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6 \ + --hash=sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664 \ + --hash=sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08 \ + --hash=sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e \ + --hash=sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18 \ + --hash=sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f \ + --hash=sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73 \ + --hash=sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5 \ + --hash=sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984 \ + --hash=sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd \ + --hash=sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3 \ + --hash=sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e \ + --hash=sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405 \ + --hash=sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2 \ + --hash=sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c \ + --hash=sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995 \ + --hash=sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73 \ + --hash=sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16 \ + --hash=sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7 \ + --hash=sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd \ + --hash=sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7 +cycler==0.12.1 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 \ + --hash=sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c +fonttools==4.54.1 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6 \ + --hash=sha256:0a911591200114969befa7f2cb74ac148bce5a91df5645443371aba6d222e263 \ + --hash=sha256:0d1d353ef198c422515a3e974a1e8d5b304cd54a4c2eebcae708e37cd9eeffb1 \ + --hash=sha256:0e88e3018ac809b9662615072dcd6b84dca4c2d991c6d66e1970a112503bba7e \ + --hash=sha256:1d152d1be65652fc65e695e5619e0aa0982295a95a9b29b52b85775243c06556 \ + --hash=sha256:262705b1663f18c04250bd1242b0515d3bbae177bee7752be67c979b7d47f43d \ + --hash=sha256:278913a168f90d53378c20c23b80f4e599dca62fbffae4cc620c8eed476b723e \ + --hash=sha256:301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2 \ + --hash=sha256:31c32d7d4b0958600eac75eaf524b7b7cb68d3a8c196635252b7a2c30d80e986 \ + --hash=sha256:357cacb988a18aace66e5e55fe1247f2ee706e01debc4b1a20d77400354cddeb \ + --hash=sha256:37cddd62d83dc4f72f7c3f3c2bcf2697e89a30efb152079896544a93907733bd \ + --hash=sha256:41bb0b250c8132b2fcac148e2e9198e62ff06f3cc472065dff839327945c5882 \ + --hash=sha256:4aa4817f0031206e637d1e685251ac61be64d1adef111060df84fdcbc6ab6c44 \ + --hash=sha256:4e10d2e0a12e18f4e2dd031e1bf7c3d7017be5c8dbe524d07706179f355c5dac \ + --hash=sha256:5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20 \ + --hash=sha256:54471032f7cb5fca694b5f1a0aaeba4af6e10ae989df408e0216f7fd6cdc405d \ + --hash=sha256:58974b4987b2a71ee08ade1e7f47f410c367cdfc5a94fabd599c88165f56213a \ + --hash=sha256:58d29b9a294573d8319f16f2f79e42428ba9b6480442fa1836e4eb89c4d9d61c \ + --hash=sha256:5eb2474a7c5be8a5331146758debb2669bf5635c021aee00fd7c353558fc659d \ + --hash=sha256:6e37561751b017cf5c40fce0d90fd9e8274716de327ec4ffb0df957160be3bff \ + --hash=sha256:76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7 \ + --hash=sha256:7965af9b67dd546e52afcf2e38641b5be956d68c425bef2158e95af11d229f10 \ + --hash=sha256:7e3b7d44e18c085fd8c16dcc6f1ad6c61b71ff463636fcb13df7b1b818bd0c02 \ + --hash=sha256:7ed7ee041ff7b34cc62f07545e55e1468808691dddfd315d51dd82a6b37ddef2 \ + --hash=sha256:82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07 \ + --hash=sha256:8583e563df41fdecef31b793b4dd3af8a9caa03397be648945ad32717a92885b \ + --hash=sha256:8fa92cb248e573daab8d032919623cc309c005086d743afb014c836636166f08 \ + --hash=sha256:93d458c8a6a354dc8b48fc78d66d2a8a90b941f7fec30e94c7ad9982b1fa6bab \ + --hash=sha256:957f669d4922f92c171ba01bef7f29410668db09f6c02111e22b2bce446f3285 \ + --hash=sha256:9dc080e5a1c3b2656caff2ac2633d009b3a9ff7b5e93d0452f40cd76d3da3b3c \ + --hash=sha256:9ef1b167e22709b46bf8168368b7b5d3efeaaa746c6d39661c1b4405b6352e58 \ + --hash=sha256:a7a310c6e0471602fe3bf8efaf193d396ea561486aeaa7adc1f132e02d30c4b9 \ + --hash=sha256:ab774fa225238986218a463f3fe151e04d8c25d7de09df7f0f5fce27b1243dbc \ + --hash=sha256:ada215fd079e23e060157aab12eba0d66704316547f334eee9ff26f8c0d7b8ab \ + --hash=sha256:c39287f5c8f4a0c5a55daf9eaf9ccd223ea59eed3f6d467133cc727d7b943a55 \ + --hash=sha256:c9c563351ddc230725c4bdf7d9e1e92cbe6ae8553942bd1fb2b2ff0884e8b714 \ + --hash=sha256:d26732ae002cc3d2ecab04897bb02ae3f11f06dd7575d1df46acd2f7c012a8d8 \ + --hash=sha256:d3b659d1029946f4ff9b6183984578041b520ce0f8fb7078bb37ec7445806b33 \ + --hash=sha256:dd9cc95b8d6e27d01e1e1f1fae8559ef3c02c76317da650a19047f249acd519d \ + --hash=sha256:e4564cf40cebcb53f3dc825e85910bf54835e8a8b6880d59e5159f0f325e637e \ + --hash=sha256:e7d82b9e56716ed32574ee106cabca80992e6bbdcf25a88d97d21f73a0aae664 \ + --hash=sha256:e8a4b261c1ef91e7188a30571be6ad98d1c6d9fa2427244c545e2fa0a2494dd7 \ + --hash=sha256:e96bc94c8cda58f577277d4a71f51c8e2129b8b36fd05adece6320dd3d57de8a \ + --hash=sha256:ed2f80ca07025551636c555dec2b755dd005e2ea8fbeb99fc5cdff319b70b23b \ + --hash=sha256:f5b8a096e649768c2f4233f947cf9737f8dbf8728b90e2771e2497c6e3d21d13 \ + --hash=sha256:f8e953cc0bddc2beaf3a3c3b5dd9ab7554677da72dfaf46951e193c9653e515a \ + --hash=sha256:fda582236fee135d4daeca056c8c88ec5f6f6d88a004a79b84a02547c8f57386 \ + --hash=sha256:fdb062893fd6d47b527d39346e0c5578b7957dcea6d6a3b6794569370013d9ac +h5py==3.11.0 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:083e0329ae534a264940d6513f47f5ada617da536d8dccbafc3026aefc33c90e \ + --hash=sha256:1625fd24ad6cfc9c1ccd44a66dac2396e7ee74940776792772819fc69f3a3731 \ + --hash=sha256:21dbdc5343f53b2e25404673c4f00a3335aef25521bd5fa8c707ec3833934892 \ + --hash=sha256:52c416f8eb0daae39dabe71415cb531f95dce2d81e1f61a74537a50c63b28ab3 \ + --hash=sha256:55106b04e2c83dfb73dc8732e9abad69d83a436b5b82b773481d95d17b9685e1 \ + --hash=sha256:67462d0669f8f5459529de179f7771bd697389fcb3faab54d63bf788599a48ea \ + --hash=sha256:6c4b760082626120031d7902cd983d8c1f424cdba2809f1067511ef283629d4b \ + --hash=sha256:731839240c59ba219d4cb3bc5880d438248533366f102402cfa0621b71796b62 \ + --hash=sha256:754c0c2e373d13d6309f408325343b642eb0f40f1a6ad21779cfa9502209e150 \ + --hash=sha256:75bd7b3d93fbeee40860fd70cdc88df4464e06b70a5ad9ce1446f5f32eb84007 \ + --hash=sha256:77b19a40788e3e362b54af4dcf9e6fde59ca016db2c61360aa30b47c7b7cef00 \ + --hash=sha256:7b7e8f78072a2edec87c9836f25f34203fd492a4475709a18b417a33cfb21fa9 \ + --hash=sha256:8ec9df3dd2018904c4cc06331951e274f3f3fd091e6d6cc350aaa90fa9b42a76 \ + --hash=sha256:a76cae64080210389a571c7d13c94a1a6cf8cb75153044fd1f822a962c97aeab \ + --hash=sha256:aa6ae84a14103e8dc19266ef4c3e5d7c00b68f21d07f2966f0ca7bdb6c2761fb \ + --hash=sha256:bbd732a08187a9e2a6ecf9e8af713f1d68256ee0f7c8b652a32795670fb481ba \ + --hash=sha256:c072655ad1d5fe9ef462445d3e77a8166cbfa5e599045f8aa3c19b75315f10e5 \ + --hash=sha256:d9c944d364688f827dc889cf83f1fca311caf4fa50b19f009d1f2b525edd33a3 \ + --hash=sha256:ef4e2f338fc763f50a8113890f455e1a70acd42a4d083370ceb80c463d803972 \ + --hash=sha256:f3736fe21da2b7d8a13fe8fe415f1272d2a1ccdeff4849c1421d2fb30fd533bc \ + --hash=sha256:f4e025e852754ca833401777c25888acb96889ee2c27e7e629a19aee288833f0 +importlib-metadata==8.5.0 ; python_version >= "3.8" and python_version < "3.10" \ + --hash=sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b \ + --hash=sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7 +jinja2==3.1.4 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ + --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d +kiwisolver==1.4.7 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a \ + --hash=sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95 \ + --hash=sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5 \ + --hash=sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0 \ + --hash=sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d \ + --hash=sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18 \ + --hash=sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b \ + --hash=sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258 \ + --hash=sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95 \ + --hash=sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e \ + --hash=sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383 \ + --hash=sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02 \ + --hash=sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b \ + --hash=sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523 \ + --hash=sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee \ + --hash=sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88 \ + --hash=sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd \ + --hash=sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb \ + --hash=sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4 \ + --hash=sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e \ + --hash=sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c \ + --hash=sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935 \ + --hash=sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee \ + --hash=sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e \ + --hash=sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038 \ + --hash=sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d \ + --hash=sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b \ + --hash=sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5 \ + --hash=sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107 \ + --hash=sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f \ + --hash=sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2 \ + --hash=sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17 \ + --hash=sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb \ + --hash=sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674 \ + --hash=sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706 \ + --hash=sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327 \ + --hash=sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3 \ + --hash=sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a \ + --hash=sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2 \ + --hash=sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f \ + --hash=sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948 \ + --hash=sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3 \ + --hash=sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e \ + --hash=sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545 \ + --hash=sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc \ + --hash=sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f \ + --hash=sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650 \ + --hash=sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a \ + --hash=sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8 \ + --hash=sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750 \ + --hash=sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b \ + --hash=sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34 \ + --hash=sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225 \ + --hash=sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51 \ + --hash=sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c \ + --hash=sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3 \ + --hash=sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde \ + --hash=sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599 \ + --hash=sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c \ + --hash=sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76 \ + --hash=sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6 \ + --hash=sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39 \ + --hash=sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9 \ + --hash=sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933 \ + --hash=sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad \ + --hash=sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520 \ + --hash=sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1 \ + --hash=sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503 \ + --hash=sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b \ + --hash=sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36 \ + --hash=sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a \ + --hash=sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643 \ + --hash=sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60 \ + --hash=sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483 \ + --hash=sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf \ + --hash=sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d \ + --hash=sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6 \ + --hash=sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644 \ + --hash=sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2 \ + --hash=sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9 \ + --hash=sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2 \ + --hash=sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640 \ + --hash=sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade \ + --hash=sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a \ + --hash=sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c \ + --hash=sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6 \ + --hash=sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00 \ + --hash=sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27 \ + --hash=sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2 \ + --hash=sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4 \ + --hash=sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379 \ + --hash=sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54 \ + --hash=sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09 \ + --hash=sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a \ + --hash=sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c \ + --hash=sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89 \ + --hash=sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407 \ + --hash=sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904 \ + --hash=sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376 \ + --hash=sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583 \ + --hash=sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278 \ + --hash=sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a \ + --hash=sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d \ + --hash=sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935 \ + --hash=sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb \ + --hash=sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895 \ + --hash=sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b \ + --hash=sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417 \ + --hash=sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608 \ + --hash=sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07 \ + --hash=sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05 \ + --hash=sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a \ + --hash=sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d \ + --hash=sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052 +macholib==1.16.3 ; python_version >= "3.8" and python_version < "3.11" and sys_platform == "darwin" \ + --hash=sha256:07ae9e15e8e4cd9a788013d81f5908b3609aa76f9b1421bae9c4d7606ec86a30 \ + --hash=sha256:0e315d7583d38b8c77e815b1ecbdbf504a8258d8b3e17b61165c6feb60d18f2c +markupsafe==2.1.5 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \ + --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \ + --hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \ + --hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \ + --hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \ + --hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \ + --hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \ + --hash=sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df \ + --hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \ + --hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \ + --hash=sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f \ + --hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \ + --hash=sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8 \ + --hash=sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371 \ + --hash=sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2 \ + --hash=sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465 \ + --hash=sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52 \ + --hash=sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6 \ + --hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \ + --hash=sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad \ + --hash=sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 \ + --hash=sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0 \ + --hash=sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029 \ + --hash=sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f \ + --hash=sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a \ + --hash=sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced \ + --hash=sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5 \ + --hash=sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c \ + --hash=sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf \ + --hash=sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9 \ + --hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \ + --hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \ + --hash=sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3 \ + --hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \ + --hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \ + --hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \ + --hash=sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a \ + --hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \ + --hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \ + --hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \ + --hash=sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea \ + --hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \ + --hash=sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5 \ + --hash=sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e \ + --hash=sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a \ + --hash=sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f \ + --hash=sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50 \ + --hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \ + --hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \ + --hash=sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4 \ + --hash=sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff \ + --hash=sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2 \ + --hash=sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46 \ + --hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \ + --hash=sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf \ + --hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 \ + --hash=sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5 \ + --hash=sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab \ + --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ + --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 +matplotlib==3.5.2 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:03bbb3f5f78836855e127b5dab228d99551ad0642918ccbf3067fcd52ac7ac5e \ + --hash=sha256:24173c23d1bcbaed5bf47b8785d27933a1ac26a5d772200a0f3e0e38f471b001 \ + --hash=sha256:2a0967d4156adbd0d46db06bc1a877f0370bce28d10206a5071f9ecd6dc60b79 \ + --hash=sha256:2e8bda1088b941ead50caabd682601bece983cadb2283cafff56e8fcddbf7d7f \ + --hash=sha256:31fbc2af27ebb820763f077ec7adc79b5a031c2f3f7af446bd7909674cd59460 \ + --hash=sha256:364e6bca34edc10a96aa3b1d7cd76eb2eea19a4097198c1b19e89bee47ed5781 \ + --hash=sha256:3d8e129af95b156b41cb3be0d9a7512cc6d73e2b2109f82108f566dbabdbf377 \ + --hash=sha256:44c6436868186564450df8fd2fc20ed9daaef5caad699aa04069e87099f9b5a8 \ + --hash=sha256:48cf850ce14fa18067f2d9e0d646763681948487a8080ec0af2686468b4607a2 \ + --hash=sha256:49a5938ed6ef9dda560f26ea930a2baae11ea99e1c2080c8714341ecfda72a89 \ + --hash=sha256:4a05f2b37222319753a5d43c0a4fd97ed4ff15ab502113e3f2625c26728040cf \ + --hash=sha256:4a44cdfdb9d1b2f18b1e7d315eb3843abb097869cd1ef89cfce6a488cd1b5182 \ + --hash=sha256:4fa28ca76ac5c2b2d54bc058b3dad8e22ee85d26d1ee1b116a6fd4d2277b6a04 \ + --hash=sha256:5844cea45d804174bf0fac219b4ab50774e504bef477fc10f8f730ce2d623441 \ + --hash=sha256:5a32ea6e12e80dedaca2d4795d9ed40f97bfa56e6011e14f31502fdd528b9c89 \ + --hash=sha256:6c623b355d605a81c661546af7f24414165a8a2022cddbe7380a31a4170fa2e9 \ + --hash=sha256:751d3815b555dcd6187ad35b21736dc12ce6925fc3fa363bbc6dc0f86f16484f \ + --hash=sha256:75c406c527a3aa07638689586343f4b344fcc7ab1f79c396699eb550cd2b91f7 \ + --hash=sha256:77157be0fc4469cbfb901270c205e7d8adb3607af23cef8bd11419600647ceed \ + --hash=sha256:7d7705022df2c42bb02937a2a824f4ec3cca915700dd80dc23916af47ff05f1a \ + --hash=sha256:7f409716119fa39b03da3d9602bd9b41142fab7a0568758cd136cd80b1bf36c8 \ + --hash=sha256:9480842d5aadb6e754f0b8f4ebeb73065ac8be1855baa93cd082e46e770591e9 \ + --hash=sha256:9776e1a10636ee5f06ca8efe0122c6de57ffe7e8c843e0fb6e001e9d9256ec95 \ + --hash=sha256:a91426ae910819383d337ba0dc7971c7cefdaa38599868476d94389a329e599b \ + --hash=sha256:b4fedaa5a9aa9ce14001541812849ed1713112651295fdddd640ea6620e6cf98 \ + --hash=sha256:b6c63cd01cad0ea8704f1fd586e9dc5777ccedcd42f63cbbaa3eae8dd41172a1 \ + --hash=sha256:b8d3f4e71e26307e8c120b72c16671d70c5cd08ae412355c11254aa8254fb87f \ + --hash=sha256:c4b82c2ae6d305fcbeb0eb9c93df2602ebd2f174f6e8c8a5d92f9445baa0c1d3 \ + --hash=sha256:c772264631e5ae61f0bd41313bbe48e1b9bcc95b974033e1118c9caa1a84d5c6 \ + --hash=sha256:c87973ddec10812bddc6c286b88fdd654a666080fbe846a1f7a3b4ba7b11ab78 \ + --hash=sha256:e2b696699386766ef171a259d72b203a3c75d99d03ec383b97fc2054f52e15cf \ + --hash=sha256:ea75df8e567743207e2b479ba3d8843537be1c146d4b1e3e395319a4e1a77fe9 \ + --hash=sha256:ebc27ad11df3c1661f4677a7762e57a8a91dd41b466c3605e90717c9a5f90c82 \ + --hash=sha256:ee0b8e586ac07f83bb2950717e66cb305e2859baf6f00a9c39cc576e0ce9629c \ + --hash=sha256:ee175a571e692fc8ae8e41ac353c0e07259113f4cb063b0ec769eff9717e84bb +numpy==1.24.4 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f \ + --hash=sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61 \ + --hash=sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7 \ + --hash=sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400 \ + --hash=sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef \ + --hash=sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2 \ + --hash=sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d \ + --hash=sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc \ + --hash=sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835 \ + --hash=sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706 \ + --hash=sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5 \ + --hash=sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4 \ + --hash=sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6 \ + --hash=sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463 \ + --hash=sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a \ + --hash=sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f \ + --hash=sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e \ + --hash=sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e \ + --hash=sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694 \ + --hash=sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8 \ + --hash=sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64 \ + --hash=sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d \ + --hash=sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc \ + --hash=sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254 \ + --hash=sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2 \ + --hash=sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1 \ + --hash=sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810 \ + --hash=sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9 +packaging==24.1 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ + --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 +pandas==1.5.3 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813 \ + --hash=sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792 \ + --hash=sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406 \ + --hash=sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373 \ + --hash=sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328 \ + --hash=sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996 \ + --hash=sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf \ + --hash=sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6 \ + --hash=sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7 \ + --hash=sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc \ + --hash=sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1 \ + --hash=sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23 \ + --hash=sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a \ + --hash=sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51 \ + --hash=sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572 \ + --hash=sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31 \ + --hash=sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5 \ + --hash=sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a \ + --hash=sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003 \ + --hash=sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d \ + --hash=sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354 \ + --hash=sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee \ + --hash=sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa \ + --hash=sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0 \ + --hash=sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9 \ + --hash=sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae \ + --hash=sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc +paramiko==3.5.0 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:1fedf06b085359051cd7d0d270cebe19e755a8a921cc2ddbfa647fb0cd7d68f9 \ + --hash=sha256:ad11e540da4f55cedda52931f1a3f812a8238a7af7f62a60de538cd80bb28124 +pefile==2024.8.26 ; python_version >= "3.8" and python_version < "3.11" and sys_platform == "win32" \ + --hash=sha256:3ff6c5d8b43e8c37bb6e6dd5085658d658a7a0bdcd20b6a07b1fcfc1c4e9d632 \ + --hash=sha256:76f8b485dcd3b1bb8166f1128d395fa3d87af26360c2358fb75b80019b957c6f +pillow==10.4.0 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885 \ + --hash=sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea \ + --hash=sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df \ + --hash=sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5 \ + --hash=sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c \ + --hash=sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d \ + --hash=sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd \ + --hash=sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06 \ + --hash=sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908 \ + --hash=sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a \ + --hash=sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be \ + --hash=sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0 \ + --hash=sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b \ + --hash=sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80 \ + --hash=sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a \ + --hash=sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e \ + --hash=sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9 \ + --hash=sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696 \ + --hash=sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b \ + --hash=sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309 \ + --hash=sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e \ + --hash=sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab \ + --hash=sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d \ + --hash=sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060 \ + --hash=sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d \ + --hash=sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d \ + --hash=sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4 \ + --hash=sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3 \ + --hash=sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6 \ + --hash=sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb \ + --hash=sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94 \ + --hash=sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b \ + --hash=sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496 \ + --hash=sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0 \ + --hash=sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319 \ + --hash=sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b \ + --hash=sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856 \ + --hash=sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef \ + --hash=sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680 \ + --hash=sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b \ + --hash=sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42 \ + --hash=sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e \ + --hash=sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597 \ + --hash=sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a \ + --hash=sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8 \ + --hash=sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3 \ + --hash=sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736 \ + --hash=sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da \ + --hash=sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126 \ + --hash=sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd \ + --hash=sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5 \ + --hash=sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b \ + --hash=sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026 \ + --hash=sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b \ + --hash=sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc \ + --hash=sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46 \ + --hash=sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2 \ + --hash=sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c \ + --hash=sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe \ + --hash=sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984 \ + --hash=sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a \ + --hash=sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70 \ + --hash=sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca \ + --hash=sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b \ + --hash=sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91 \ + --hash=sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3 \ + --hash=sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84 \ + --hash=sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1 \ + --hash=sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5 \ + --hash=sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be \ + --hash=sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f \ + --hash=sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc \ + --hash=sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9 \ + --hash=sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e \ + --hash=sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141 \ + --hash=sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef \ + --hash=sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22 \ + --hash=sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27 \ + --hash=sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e \ + --hash=sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1 +pycparser==2.22 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ + --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc +pyinstaller-hooks-contrib==2024.9 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:1ddf9ba21d586afa84e505bb5c65fca10b22500bf3fdb89ee2965b99da53b891 \ + --hash=sha256:4793869f370d1dc4806c101efd2890e3c3e703467d8d27bb5a3db005ebfb008d +pyinstaller==5.13.2 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:16cbd66b59a37f4ee59373a003608d15df180a0d9eb1a29ff3bfbfae64b23d0f \ + --hash=sha256:27cd64e7cc6b74c5b1066cbf47d75f940b71356166031deb9778a2579bb874c6 \ + --hash=sha256:2c2fe9c52cb4577a3ac39626b84cf16cf30c2792f785502661286184f162ae0d \ + --hash=sha256:421cd24f26144f19b66d3868b49ed673176765f92fa9f7914cd2158d25b6d17e \ + --hash=sha256:65133ed89467edb2862036b35d7c5ebd381670412e1e4361215e289c786dd4e6 \ + --hash=sha256:7d51734423685ab2a4324ab2981d9781b203dcae42839161a9ee98bfeaabdade \ + --hash=sha256:8f6dd0e797ae7efdd79226f78f35eb6a4981db16c13325e962a83395c0ec7420 \ + --hash=sha256:aadafb6f213549a5906829bb252e586e2cf72a7fbdb5731810695e6516f0ab30 \ + --hash=sha256:b2e1c7f5cceb5e9800927ddd51acf9cc78fbaa9e79e822c48b0ee52d9ce3c892 \ + --hash=sha256:c63ef6133eefe36c4b2f4daf4cfea3d6412ece2ca218f77aaf967e52a95ac9b8 \ + --hash=sha256:c8e5d3489c3a7cc5f8401c2d1f48a70e588f9967e391c3b06ddac1f685f8d5d2 \ + --hash=sha256:ddcc2b36052a70052479a9e5da1af067b4496f43686ca3cdda99f8367d0627e4 +pynacl==1.5.0 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858 \ + --hash=sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d \ + --hash=sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93 \ + --hash=sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1 \ + --hash=sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92 \ + --hash=sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff \ + --hash=sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba \ + --hash=sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394 \ + --hash=sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b \ + --hash=sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543 +pyparsing==3.1.4 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c \ + --hash=sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032 +python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 +pytz==2024.2 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a \ + --hash=sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725 +pywin32-ctypes==0.2.3 ; python_version >= "3.8" and python_version < "3.11" and sys_platform == "win32" \ + --hash=sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8 \ + --hash=sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755 +pyyaml==6.0.2 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff \ + --hash=sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48 \ + --hash=sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086 \ + --hash=sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e \ + --hash=sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133 \ + --hash=sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5 \ + --hash=sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484 \ + --hash=sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee \ + --hash=sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5 \ + --hash=sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68 \ + --hash=sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a \ + --hash=sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf \ + --hash=sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99 \ + --hash=sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8 \ + --hash=sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 \ + --hash=sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19 \ + --hash=sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc \ + --hash=sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a \ + --hash=sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1 \ + --hash=sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317 \ + --hash=sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c \ + --hash=sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631 \ + --hash=sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d \ + --hash=sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652 \ + --hash=sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5 \ + --hash=sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e \ + --hash=sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b \ + --hash=sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8 \ + --hash=sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476 \ + --hash=sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706 \ + --hash=sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563 \ + --hash=sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237 \ + --hash=sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b \ + --hash=sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083 \ + --hash=sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180 \ + --hash=sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425 \ + --hash=sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e \ + --hash=sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f \ + --hash=sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725 \ + --hash=sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183 \ + --hash=sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab \ + --hash=sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 \ + --hash=sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725 \ + --hash=sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e \ + --hash=sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5 \ + --hash=sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d \ + --hash=sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290 \ + --hash=sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44 \ + --hash=sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed \ + --hash=sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4 \ + --hash=sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba \ + --hash=sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12 \ + --hash=sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4 +scipy==1.10.1 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:049a8bbf0ad95277ffba9b3b7d23e5369cc39e66406d60422c8cfef40ccc8415 \ + --hash=sha256:07c3457ce0b3ad5124f98a86533106b643dd811dd61b548e78cf4c8786652f6f \ + --hash=sha256:0f1564ea217e82c1bbe75ddf7285ba0709ecd503f048cb1236ae9995f64217bd \ + --hash=sha256:1553b5dcddd64ba9a0d95355e63fe6c3fc303a8fd77c7bc91e77d61363f7433f \ + --hash=sha256:15a35c4242ec5f292c3dd364a7c71a61be87a3d4ddcc693372813c0b73c9af1d \ + --hash=sha256:1b4735d6c28aad3cdcf52117e0e91d6b39acd4272f3f5cd9907c24ee931ad601 \ + --hash=sha256:2cf9dfb80a7b4589ba4c40ce7588986d6d5cebc5457cad2c2880f6bc2d42f3a5 \ + --hash=sha256:39becb03541f9e58243f4197584286e339029e8908c46f7221abeea4b749fa88 \ + --hash=sha256:43b8e0bcb877faf0abfb613d51026cd5cc78918e9530e375727bf0625c82788f \ + --hash=sha256:4b3f429188c66603a1a5c549fb414e4d3bdc2a24792e061ffbd607d3d75fd84e \ + --hash=sha256:4c0ff64b06b10e35215abce517252b375e580a6125fd5fdf6421b98efbefb2d2 \ + --hash=sha256:51af417a000d2dbe1ec6c372dfe688e041a7084da4fdd350aeb139bd3fb55353 \ + --hash=sha256:5678f88c68ea866ed9ebe3a989091088553ba12c6090244fdae3e467b1139c35 \ + --hash=sha256:79c8e5a6c6ffaf3a2262ef1be1e108a035cf4f05c14df56057b64acc5bebffb6 \ + --hash=sha256:7ff7f37b1bf4417baca958d254e8e2875d0cc23aaadbe65b3d5b3077b0eb23ea \ + --hash=sha256:aaea0a6be54462ec027de54fca511540980d1e9eea68b2d5c1dbfe084797be35 \ + --hash=sha256:bce5869c8d68cf383ce240e44c1d9ae7c06078a9396df68ce88a1230f93a30c1 \ + --hash=sha256:cd9f1027ff30d90618914a64ca9b1a77a431159df0e2a195d8a9e8a04c78abf9 \ + --hash=sha256:d925fa1c81b772882aa55bcc10bf88324dadb66ff85d548c71515f6689c6dac5 \ + --hash=sha256:e7354fd7527a4b0377ce55f286805b34e8c54b91be865bac273f527e1b839019 \ + --hash=sha256:fae8a7b898c42dffe3f7361c40d5952b6bf32d10c4569098d276b4c547905ee1 +seaborn==0.11.2 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:85a6baa9b55f81a0623abddc4a26b334653ff4c6b18c418361de19dbba0ef283 \ + --hash=sha256:cf45e9286d40826864be0e3c066f98536982baf701a7caa386511792d61ff4f6 +setuptools==75.3.0 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd \ + --hash=sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686 +six==1.16.0 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 +spacepy==0.4.1 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:06a6c2a8941a4c1ef1928b9189485f22fca64d8689a72f90343ae195d6181d59 \ + --hash=sha256:0fc241124ee9f341fe9a51822d4d4bc2f4ec16b6e9e6376363b968864e7d7923 \ + --hash=sha256:1e9ef148156a0648dc1248f4a2eeef7a7639a475e59ed6d47a150257f59aa725 \ + --hash=sha256:8ce5169b585026dd0e81456f3ee8a3ac45874a8b9224dd6e07d92ffc9754a69d \ + --hash=sha256:ba4129a94aa6ac1a22e631df2cc0e790f631f2b92368607277fe6e0d7f75340b \ + --hash=sha256:cd4d549e06f807c4bcfbbc01eebfa3bb041b1a3535f0a574125c4eaf267f58aa +tabulate==0.8.10 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:0ba055423dbaa164b9e456abe7920c5e8ed33fcc16f6d1b2f2d152c8e1e8b4fc \ + --hash=sha256:6c57f3f3dd7ac2782770155f3adb2db0b1a269637e42f27599925e64b114f519 +tk==0.1.0 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:60bc8923d5d35f67f5c6bd93d4f0c49d2048114ec077768f959aef36d4ed97f8 \ + --hash=sha256:703a69ff0d5ba2bd2f7440582ad10160e4a6561595d33457dc6caa79b9bf4930 +tornado==6.4.1 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8 \ + --hash=sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f \ + --hash=sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4 \ + --hash=sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3 \ + --hash=sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14 \ + --hash=sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842 \ + --hash=sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9 \ + --hash=sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698 \ + --hash=sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7 \ + --hash=sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d \ + --hash=sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4 +wand==0.6.13 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:e5dda0ac2204a40c29ef5c4cb310770c95d3d05c37b1379e69c94ea79d7d19c0 \ + --hash=sha256:f5013484eaf7a20eb22d1821aaefe60b50cc329722372b5f8565d46d4aaafcca +xyzservices==2024.9.0 ; python_version >= "3.8" and python_version < "3.11" \ + --hash=sha256:68fb8353c9dbba4f1ff6c0f2e5e4e596bb9e1db7f94f4f7dfbcb26e25aa66fde \ + --hash=sha256:776ae82b78d6e5ca63dd6a94abb054df8130887a4a308473b54a6bd364de8644 +zipp==3.20.2 ; python_version >= "3.8" and python_version < "3.10" \ + --hash=sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350 \ + --hash=sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29 From 4e31f4c5d387feae20fe74d8e2d954efd5775808 Mon Sep 17 00:00:00 2001 From: lexibu Date: Wed, 30 Oct 2024 13:13:28 -0400 Subject: [PATCH 5/8] mac edits --- .gitignore | 3 +++ codes/luigi.cfg | 16 ++++++------ codes/lxi_file_read_funcs.py | 48 ++++++++++++++++++---------------- codes/lxi_gui.py | 45 +++++++++++++++++-------------- codes/lxi_gui_plot_routines.py | 6 ++--- 5 files changed, 65 insertions(+), 53 deletions(-) diff --git a/.gitignore b/.gitignore index 7b643b3..82f0dd4 100644 --- a/.gitignore +++ b/.gitignore @@ -145,3 +145,6 @@ luigi.cfg poetry.lock .flake8 + +# Ignore the .ds store file +.DS_Store diff --git a/codes/luigi.cfg b/codes/luigi.cfg index 5018db9..2ee41d9 100644 --- a/codes/luigi.cfg +++ b/codes/luigi.cfg @@ -9,18 +9,18 @@ c_max_entry = 500 density_status = False norm_type = linear unit_type = mcp -v_min_thresh_entry = 1.2 -v_max_thresh_entry = 3.4 -v_sum_min_thresh_entry = 7 -v_sum_max_thresh_entry = 8 -cut_status = True -curve_fit_status = True -lin_corr_status = True +v_min_thresh_entry = 0 +v_max_thresh_entry = 4 +v_sum_min_thresh_entry = 0 +v_sum_max_thresh_entry = 20 +cut_status = False +curve_fit_status = False +lin_corr_status = False non_lin_corr_status = False cmap = viridis [time_options] -start_time = 2024-11-16 10:00:00 +start_time = 2023-11-16 10:00:00 end_time = 2024-11-16 16:32:52 time_threshold = 60 diff --git a/codes/lxi_file_read_funcs.py b/codes/lxi_file_read_funcs.py index ad7c9e0..0355d68 100644 --- a/codes/lxi_file_read_funcs.py +++ b/codes/lxi_file_read_funcs.py @@ -2,6 +2,7 @@ import datetime import importlib import os +import platform import logging import struct from pathlib import Path @@ -407,15 +408,15 @@ def read_binary_data_sci( # Split the file name in a folder and a file name # Format filenames and folder names for the different operating systems - if os.name == "posix": + if platform.system() == "Linux": output_file_name = os.path.basename(os.path.normpath(in_file_name)).split(".")[0] + "_sci_output.csv" output_folder_name = os.path.dirname(os.path.normpath(in_file_name)) + "/processed_data/sci" save_file_name = output_folder_name + "/" + output_file_name - elif os.name == "nt": + elif platform.system() == "Windows": output_file_name = os.path.basename(os.path.normpath(in_file_name)).split(".")[0] + "_sci_output.csv" output_folder_name = os.path.dirname(os.path.normpath(in_file_name)) + "\\processed_data\\sci" save_file_name = output_folder_name + "\\" + output_file_name - elif os.name == "darwin": + elif platform.system() == "Darwin": output_file_name = os.path.basename(os.path.normpath(in_file_name)).split(".")[0] + "_sci_output.csv" output_folder_name = os.path.dirname(os.path.normpath(in_file_name)) + "/processed_data/sci" save_file_name = output_folder_name + "/" + output_file_name @@ -518,7 +519,7 @@ def read_binary_data_sci( df = pd.read_csv(save_file_name) # Convert the date column to datetime - df["Date"] = pd.to_datetime(df["Date"]) + df["Date"] = pd.to_datetime(df["Date"], format="mixed") # Set index to the date df.set_index("Date", inplace=False) @@ -850,7 +851,8 @@ def read_binary_data_hk( for key in df.keys(): for ii in range(1, len(df[key])): if np.isnan(df[key][ii]): - df[key][ii] = df[key][ii - 1] + # df[key][ii] = df[key][ii - 1] + df.loc[ii, key] = df.loc[ii - 1, key] # Set the date column to the Date_datetime df["Date"] = Date_datetime @@ -881,15 +883,15 @@ def read_binary_data_hk( df.set_index("Date", inplace=True, drop=False) # Split the file name in a folder and a file name # Format filenames and folder names for the different operating systems - if os.name == "posix": + if platform.system() == "Linux": output_folder_name = os.path.dirname(os.path.normpath(in_file_name)) + "/processed_data/hk" output_file_name = os.path.basename(os.path.normpath(in_file_name)).split(".")[0] + "_hk_output.csv" save_file_name = output_folder_name + "/" + output_file_name - elif os.name == "nt": + elif platform.system() == "Windows": output_folder_name = os.path.dirname(os.path.normpath(in_file_name)) + "\\processed_data\\hk" output_file_name = os.path.basename(os.path.normpath(in_file_name)).split(".")[0] + "_hk_output.csv" save_file_name = output_folder_name + "\\" + output_file_name - elif os.name == "darwin": + elif platform.system() == "Darwin": output_folder_name = os.path.dirname(os.path.normpath(in_file_name)) + "/processed_data/hk" output_file_name = os.path.basename(os.path.normpath(in_file_name)).split(".")[0] + "_hk_output.csv" save_file_name = output_folder_name + "/" + output_file_name @@ -916,11 +918,11 @@ def open_file_sci(start_time=None, end_time=None): ) # Get the file name from the file path for different operating systems - if os.name == "posix": + if platform.system() == "Linux": file_name_sci = file_val.split("/")[-1] - elif os.name == "nt": + elif platform.system() == "Windows": file_name_sci = file_val.split("\\")[-1] - elif os.name == "darwin": + elif platform.system() == "Darwin": file_name_sci = file_val.split("/")[-1] else: raise OSError("Operating system not supported.") @@ -945,11 +947,11 @@ def open_file_hk(start_time=None, end_time=None): ) # Get the file name from the file path for different operating systems - if os.name == "posix": + if platform.system() == "Linux": file_name_hk = file_val.split("/")[-1] - elif os.name == "nt": + elif platform.system() == "Windows": file_name_hk = file_val.split("\\")[-1] - elif os.name == "darwin": + elif platform.system() == "Darwin": file_name_hk = file_val.split("/")[-1] else: raise OSError("Operating system not supported.") @@ -1219,10 +1221,10 @@ def read_csv_sci(file_val=None, t_start=None, t_end=None): # Convert the Date column from string to datetime in utc try: - df["Date"] = pd.to_datetime(df["Date"], utc=True) + df["Date"] = pd.to_datetime(df["Date"], utc=True, format="mixed") except Exception: # Convert timestamp to datetime and set it to Date - df["Date"] = pd.to_datetime(df["TimeStamp"], unit="s", utc=True) + df["Date"] = pd.to_datetime(df["TimeStamp"], unit="s", utc=True, format="mixed") # Set the index to the time column df.set_index("Date", inplace=True) @@ -1382,10 +1384,10 @@ def read_csv_hk(file_val=None, t_start=None, t_end=None): # Convert the Date column from string to datetime in utc try: - df["Date"] = pd.to_datetime(df["Date"], utc=True) + df["Date"] = pd.to_datetime(df["Date"], utc=True, format="mixed") except Exception: # Convert timestamp to datetime and set it to Date - df["Date"] = pd.to_datetime(df["TimeStamp"], unit="s", utc=True) + df["Date"] = pd.to_datetime(df["TimeStamp"], unit="s", utc=True, format="mixed") # Set the index to the time column df.set_index("Date", inplace=True) @@ -1465,8 +1467,8 @@ def read_binary_file(file_val=None, t_start=None, t_end=None, multiple_files=Fal if t_start is not None and t_end is not None: # Convert t_start and t_end from string to datetime in UTC timezone - t_start = pd.to_datetime(t_start, utc=True) - t_end = pd.to_datetime(t_end, utc=True) + t_start = pd.to_datetime(t_start, utc=True, format="mixed") + t_end = pd.to_datetime(t_end, utc=True, format="mixed") try: # Convert t_start and t_end from string to unix time in seconds in UTC timezone @@ -1555,7 +1557,7 @@ def read_binary_file(file_val=None, t_start=None, t_end=None, multiple_files=Fal os.makedirs(save_dir) # Get the file name based on the os path - if os.name == "nt": + if platform.system() == "Windows": file_name_hk = save_dir + "\\processed_data\\hk\\" + \ file_name_hk_list[0].split("\\")[-1].split('.')[0].split('_')[0] + '_' + \ file_name_hk_list[0].split("\\")[-1].split('.')[0].split('_')[1] + '_' + \ @@ -1571,7 +1573,7 @@ def read_binary_file(file_val=None, t_start=None, t_end=None, multiple_files=Fal file_name_hk_list[0].split("\\")[-1].split('.')[0].split('_')[3] + '_' + \ file_name_sci_list[-1].split("\\")[-1].split('.')[0].split('_')[-4] + '_' + \ file_name_sci_list[-1].split("\\")[-1].split('.')[0].split('_')[-3] + '_sci_output.csv' - elif os.name == "posix": + elif platform.system() == "Linux": file_name_hk = save_dir + "/processed_data/hk/" + \ file_name_hk_list[0].split("/")[-1].split('.')[0].split('_')[0] + '_' + \ file_name_hk_list[0].split("/")[-1].split('.')[0].split('_')[1] + '_' + \ @@ -1587,7 +1589,7 @@ def read_binary_file(file_val=None, t_start=None, t_end=None, multiple_files=Fal file_name_hk_list[0].split("/")[-1].split('.')[0].split('_')[3] + '_' + \ file_name_sci_list[-1].split("/")[-1].split('.')[0].split('_')[-4] + '_' + \ file_name_sci_list[-1].split("/")[-1].split('.')[0].split('_')[-3] + '_sci_output.csv' - elif os.name == "darwin": + elif platform.system() == "Darwin": file_name_hk = save_dir + "/processed_data/hk/" + \ file_name_hk_list[0].split("/")[-1].split('.')[0].split('_')[0] + '_' + \ file_name_hk_list[0].split("/")[-1].split('.')[0].split('_')[1] + '_' + \ diff --git a/codes/lxi_gui.py b/codes/lxi_gui.py index 5795a1e..2b0270a 100644 --- a/codes/lxi_gui.py +++ b/codes/lxi_gui.py @@ -1,6 +1,5 @@ import importlib import logging -import os import platform from pathlib import Path import tkinter as tk @@ -83,14 +82,14 @@ def hist_plot_inputs(dpi=100): "sticky_channel24": "nesw", "row_span_channel24": 6, "column_span_channel24": 3, - "hist_fig_height": screen_height / (2.2 * dpi), - "hist_fig_width": screen_width / (2.2 * dpi), + "hist_fig_height": screen_height / (4 * dpi), + "hist_fig_width": screen_width / (4 * dpi), "hist_colspan": 7, "hist_rowspan": 20, - "channel13_fig_height": screen_height / (3 * dpi), - "channel13_fig_width": screen_width / (3 * dpi), - "channel24_fig_height": screen_height / (3 * dpi), - "channel24_fig_width": screen_width / (3 * dpi), + "channel13_fig_height": screen_height / (6 * dpi), + "channel13_fig_width": screen_width / (6 * dpi), + "channel24_fig_height": screen_height / (6 * dpi), + "channel24_fig_width": screen_width / (6 * dpi), "v_min": v_min_thresh_entry.get(), "v_max": v_max_thresh_entry.get(), "v_sum_min": v_sum_min_thresh_entry.get(), @@ -132,8 +131,8 @@ def ts_plot_inputs( "column": column, "columnspan": columnspan, "rowspan": rowspan, - "fig_width": screen_width / (2 * dpi), - "fig_height": screen_height / (3 * dpi), + "fig_width": screen_width / (3.5 * dpi), + "fig_height": screen_height / (4 * dpi), "dark_mode": dark_mode_var.get(), "time_type": time_type.get(), } @@ -448,7 +447,8 @@ def dark_mode_change(): # Get the DPI of the screen. This is used to scale the figure size. dpi = root.winfo_fpixels("1i") - +# dpi = 100 +print(f"The DPI of the screen is: {dpi}") # NOTE: This hack is necessary since I am using multiple monitors. This can be edited as we work on # a different machine. # Check whether the operating system is windows or linux, and assign the correct screen width and @@ -463,17 +463,24 @@ def dark_mode_change(): 0.45 * root.winfo_screenwidth(), 0.8 * root.winfo_screenheight(), ) +if platform.system() == "Darwin": + screen_width, screen_height = ( + 0.9 * root.winfo_screenwidth(), + 0.9 * root.winfo_screenheight(), + ) + print(f"The screen width and height are: {screen_width}, {screen_height} for platform: {platform.system()}") else: screen_width, screen_height = ( 0.8 * root.winfo_screenwidth(), 0.8 * root.winfo_screenheight(), ) -screen_width = 1250 -screen_height = 800 -# print( -# "If the GUI size is messed up, check comment on line #215 of the code 'lxi_gui.py'." -# ) +# screen_width = 1000 +# screen_height = 800 +print( + "If the GUI size is messed up, uncomment the line 474 and 475 of lxi_gui.py code and set the " + "screen_width and screen_height to your liking." +) # Set the title of the main window. root.title("LEXI GUI") @@ -903,14 +910,14 @@ def dark_mode_change(): # Set the default folder name in the text box # folder_path.insert(1, "For multiple files, enter the folder path here") # Insert the default folder path in the text box based on the operating system -if os.name == "nt": +if platform.system() == "Windows": folder_path.insert( 1, r"C:\Users\Lexi-Admin\Documents\GitHub\Lexi-BU\lxi_gui\data\from_ff" ) -elif os.name == "posix": +elif platform.system() == "Linux": folder_path.insert(1, "/home/cephadrius/Desktop/git/Lexi-BU/lxi_gui/data/test/20241010/recovery_files/") -elif os.name == "darwin": - folder_path.insert(1, "../git_data/") +elif platform.system() == "Darwin": + folder_path.insert(1, "/Users/mac/Documents/GitHub/Lexi-BU/lxi_gui/git_data/sample_datasets/") else: raise OSError("Operating system not supported") diff --git a/codes/lxi_gui_plot_routines.py b/codes/lxi_gui_plot_routines.py index edba243..32ca4e1 100644 --- a/codes/lxi_gui_plot_routines.py +++ b/codes/lxi_gui_plot_routines.py @@ -343,13 +343,13 @@ def ts_plots(self): elif self.time_type == "UTC": # Convert self.df_slice_hk.utc_time from string to datetime self.df_slice_hk.utc_time = pd.to_datetime( - self.df_slice_hk.utc_time, format="%Y-%m-%d %H:%M:%S", utc=True + self.df_slice_hk.utc_time, utc=True, format="mixed", ) x_axs_val = self.df_slice_hk.utc_time elif self.time_type == "Local": # Convert self.df_slice_hk.local_time and set the time-zone to the local time-zone self.df_slice_hk.local_time = pd.to_datetime( - self.df_slice_hk.local_time, format="%Y-%m-%d %H:%M:%S" + self.df_slice_hk.local_time, format="mixed" ) x_axs_val = self.df_slice_hk.local_time axs1 = plt.subplot(gs[:]) @@ -404,7 +404,7 @@ def ts_plots(self): # legend_list = axs1.legend(handlelength=0, handletextpad=0, fancybox=False) # for item in legend_list.legendHandles: # item.set_visible(False) - plt.tight_layout() + # plt.tight_layout() plt.close("all") return fig From eb71d9a60a7ade68f06de6c320e6340064f4de28 Mon Sep 17 00:00:00 2001 From: Ramiz Qudsi Date: Wed, 30 Oct 2024 16:11:02 -0400 Subject: [PATCH 6/8] modified codes for better labels --- codes/luigi.cfg | 4 +-- codes/lxi_file_read_funcs.py | 16 +++++----- codes/lxi_gui.py | 26 ++++++++-------- codes/lxi_gui_plot_routines.py | 53 ++++++++++++++++++++++++--------- codes/lxi_load_plot_routines.py | 12 ++++++++ 5 files changed, 75 insertions(+), 36 deletions(-) diff --git a/codes/luigi.cfg b/codes/luigi.cfg index 2ee41d9..d1f17b9 100644 --- a/codes/luigi.cfg +++ b/codes/luigi.cfg @@ -13,9 +13,9 @@ v_min_thresh_entry = 0 v_max_thresh_entry = 4 v_sum_min_thresh_entry = 0 v_sum_max_thresh_entry = 20 -cut_status = False +cut_status = True curve_fit_status = False -lin_corr_status = False +lin_corr_status = True non_lin_corr_status = False cmap = viridis diff --git a/codes/lxi_file_read_funcs.py b/codes/lxi_file_read_funcs.py index 0355d68..0a8fc81 100644 --- a/codes/lxi_file_read_funcs.py +++ b/codes/lxi_file_read_funcs.py @@ -519,7 +519,7 @@ def read_binary_data_sci( df = pd.read_csv(save_file_name) # Convert the date column to datetime - df["Date"] = pd.to_datetime(df["Date"], format="mixed") + df["Date"] = pd.to_datetime(df["Date"]) # Set index to the date df.set_index("Date", inplace=False) @@ -1221,10 +1221,10 @@ def read_csv_sci(file_val=None, t_start=None, t_end=None): # Convert the Date column from string to datetime in utc try: - df["Date"] = pd.to_datetime(df["Date"], utc=True, format="mixed") + df["Date"] = pd.to_datetime(df["Date"], utc=True) except Exception: # Convert timestamp to datetime and set it to Date - df["Date"] = pd.to_datetime(df["TimeStamp"], unit="s", utc=True, format="mixed") + df["Date"] = pd.to_datetime(df["TimeStamp"], unit="s", utc=True) # Set the index to the time column df.set_index("Date", inplace=True) @@ -1384,10 +1384,10 @@ def read_csv_hk(file_val=None, t_start=None, t_end=None): # Convert the Date column from string to datetime in utc try: - df["Date"] = pd.to_datetime(df["Date"], utc=True, format="mixed") + df["Date"] = pd.to_datetime(df["Date"], utc=True) except Exception: # Convert timestamp to datetime and set it to Date - df["Date"] = pd.to_datetime(df["TimeStamp"], unit="s", utc=True, format="mixed") + df["Date"] = pd.to_datetime(df["TimeStamp"], unit="s", utc=True) # Set the index to the time column df.set_index("Date", inplace=True) @@ -1467,9 +1467,8 @@ def read_binary_file(file_val=None, t_start=None, t_end=None, multiple_files=Fal if t_start is not None and t_end is not None: # Convert t_start and t_end from string to datetime in UTC timezone - t_start = pd.to_datetime(t_start, utc=True, format="mixed") - t_end = pd.to_datetime(t_end, utc=True, format="mixed") - + t_start = pd.to_datetime(t_start, utc=True) + t_end = pd.to_datetime(t_end, utc=True) try: # Convert t_start and t_end from string to unix time in seconds in UTC timezone t_start_unix = t_start.timestamp() @@ -1487,6 +1486,7 @@ def read_binary_file(file_val=None, t_start=None, t_end=None, multiple_files=Fal # Make sure that file_val is a directory if not os.path.isdir(file_val): + print(f"\n \x1b[1;31;255m WARNING: {file_val} is not a directory. \x1b[0m") raise ValueError("file_val should be a directory.") # Get the names of all the files in the directory with*.dat or *.txt extension diff --git a/codes/lxi_gui.py b/codes/lxi_gui.py index 2b0270a..9687d09 100644 --- a/codes/lxi_gui.py +++ b/codes/lxi_gui.py @@ -102,7 +102,6 @@ def hist_plot_inputs(dpi=100): "use_fig_size": True, "dark_mode": dark_mode_var.get(), } - llpr.load_all_hist_plots(**inputs) else: logger.info("No data to plot") @@ -116,6 +115,7 @@ def ts_plot_inputs( columnspan=3, rowspan=2, plot_key=None, + display_time_label=False, ): """ The function creates and updates the list of widget inputs as might be available from the GUI @@ -131,10 +131,11 @@ def ts_plot_inputs( "column": column, "columnspan": columnspan, "rowspan": rowspan, - "fig_width": screen_width / (3.5 * dpi), + "fig_width": screen_width / (3 * dpi), "fig_height": screen_height / (4 * dpi), "dark_mode": dark_mode_var.get(), "time_type": time_type.get(), + "display_time_label": display_time_label, } llpr.load_ts_plots(**inputs) @@ -255,7 +256,7 @@ def refresh_ts_plot(): try: ts_plot_inputs( - plot_opt_entry=plot_opt_entry_7, row=5, column=0, rowspan=1, columnspan=3 + plot_opt_entry=plot_opt_entry_7, row=5, column=0, rowspan=1, columnspan=3, display_time_label=True ) except Exception: logger.exception( @@ -266,7 +267,7 @@ def refresh_ts_plot(): try: ts_plot_inputs( - plot_opt_entry=plot_opt_entry_8, row=5, column=3, rowspan=1, columnspan=3 + plot_opt_entry=plot_opt_entry_8, row=5, column=3, rowspan=1, columnspan=3, display_time_label=True ) except Exception: logger.exception( @@ -277,7 +278,7 @@ def refresh_ts_plot(): try: ts_plot_inputs( - plot_opt_entry=plot_opt_entry_9, row=5, column=6, rowspan=1, columnspan=3 + plot_opt_entry=plot_opt_entry_9, row=5, column=6, rowspan=1, columnspan=3, display_time_label=True ) except Exception: logger.exception( @@ -448,7 +449,7 @@ def dark_mode_change(): # Get the DPI of the screen. This is used to scale the figure size. dpi = root.winfo_fpixels("1i") # dpi = 100 -print(f"The DPI of the screen is: {dpi}") +# print(f"The DPI of the screen is: {dpi}") # NOTE: This hack is necessary since I am using multiple monitors. This can be edited as we work on # a different machine. # Check whether the operating system is windows or linux, and assign the correct screen width and @@ -468,15 +469,16 @@ def dark_mode_change(): 0.9 * root.winfo_screenwidth(), 0.9 * root.winfo_screenheight(), ) - print(f"The screen width and height are: {screen_width}, {screen_height} for platform: {platform.system()}") else: screen_width, screen_height = ( 0.8 * root.winfo_screenwidth(), 0.8 * root.winfo_screenheight(), ) -# screen_width = 1000 -# screen_height = 800 + +print(f"The screen width and height are: {screen_width}, {screen_height} for platform: {platform.system()}") +screen_width = 3600 +screen_height = 1000 print( "If the GUI size is messed up, uncomment the line 474 and 475 of lxi_gui.py code and set the " "screen_width and screen_height to your liking." @@ -1123,21 +1125,21 @@ def dark_mode_change(): plot_opt_entry_7.trace( "w", lambda *_: ts_plot_inputs( - plot_opt_entry=plot_opt_entry_7, row=5, column=0, rowspan=1, columnspan=3 + plot_opt_entry=plot_opt_entry_7, row=5, column=0, rowspan=1, columnspan=3, display_time_label=True ), ) plot_opt_entry_8.trace( "w", lambda *_: ts_plot_inputs( - plot_opt_entry=plot_opt_entry_8, row=5, column=3, rowspan=1, columnspan=3 + plot_opt_entry=plot_opt_entry_8, row=5, column=3, rowspan=1, columnspan=3, display_time_label=True ), ) plot_opt_entry_9.trace( "w", lambda *_: ts_plot_inputs( - plot_opt_entry=plot_opt_entry_9, row=5, column=6, rowspan=1, columnspan=3 + plot_opt_entry=plot_opt_entry_9, row=5, column=6, rowspan=1, columnspan=3, display_time_label=True ), ) diff --git a/codes/lxi_gui_plot_routines.py b/codes/lxi_gui_plot_routines.py index 32ca4e1..186b179 100644 --- a/codes/lxi_gui_plot_routines.py +++ b/codes/lxi_gui_plot_routines.py @@ -12,7 +12,7 @@ import numpy as np import pandas as pd import pytz -from matplotlib.ticker import MaxNLocator +from matplotlib.ticker import MaxNLocator, FormatStrFormatter from mpl_toolkits.axes_grid1 import make_axes_locatable importlib.reload(global_variables) @@ -203,6 +203,7 @@ def __init__( use_fig_size=None, dark_mode=None, time_type=None, + display_time_label=None, ): self.df_slice_hk = df_slice_hk self.df_slice_sci = df_slice_sci @@ -239,6 +240,7 @@ def __init__( self.use_fig_size = use_fig_size self.dark_mode = dark_mode self.time_type = time_type + self.display_time_label = display_time_label def ts_plots(self): """ @@ -378,21 +380,44 @@ def ts_plots(self): ) axs1.set_xlim(np.nanmin(x_axs_val), np.nanmax(x_axs_val)) - # Rotate the x-axis labels by certain degrees and set their fontsize, if required - plt.setp(axs1.get_xticklabels(), rotation=0) - if self.time_type == "LEXI": - axs1.set_xlabel("Time [UTC]") - elif self.time_type == "UTC": - axs1.set_xlabel("Time [UTC]") - elif self.time_type == "Local": - # Get the local time zone of the system - local_timezone = datetime.datetime.now(pytz.timezone('UTC')).astimezone().tzinfo - axs1.set_xlabel(f"Time [{local_timezone}]") - # Avoid overlapping of the x-axis labels - fig.autofmt_xdate() + min_x_val_time = np.nanmin(x_axs_val) + max_x_val_time = np.nanmax(x_axs_val) + axs1.tick_params(axis="x", which="major", direction="in", length=2, width=1) + # Hide or display the x-axis label based on the display_time_label variable + if self.display_time_label: + # Rotate the x-axis labels by certain degrees and set their fontsize, if required + plt.setp(axs1.get_xticklabels(), rotation=0) + if self.time_type == "LEXI": + axs1.set_xlabel("Time [UTC]") + elif self.time_type == "UTC": + axs1.set_xlabel("Time [UTC]") + elif self.time_type == "Local": + # Get the local time zone of the system + local_timezone = datetime.datetime.now(pytz.timezone('UTC')).astimezone().tzinfo + axs1.set_xlabel(f"Time [{local_timezone}]") + # Avoid overlapping of the x-axis labels + fig.autofmt_xdate() + # At the bottom right, display the start and end time of the plot + axs1.text( + 0.99, + 0.02, + f"Start:{min_x_val_time.strftime('%Y-%m-%d %H:%M:%S')}\n End:{max_x_val_time.strftime('%Y-%m-%d %H:%M:%S')}", + horizontalalignment="right", + verticalalignment="bottom", + transform=axs1.transAxes, + color=edgecolor, + fontsize=8, + bbox=dict(facecolor=facecolor, edgecolor=edgecolor, alpha=0.5), + ) + else: + axs1.set_xlabel("") + axs1.tick_params(axis="x", which="major", direction="in", length=2, width=1) + # Hide the x-tick labels + axs1.set_xticklabels([]) axs1.set_ylabel(f"{unit_dict[self.plot_key]}") - axs1.tick_params(axis="both", which="major") + # Set the y-tick labels to 2 decimal places + axs1.yaxis.set_major_formatter(FormatStrFormatter("%.2f")) if self.plot_key == "Cmd_count" or self.plot_key == "HK_id": # For this case, make sure all the y-axis ticks are integers axs1.yaxis.set_major_locator(MaxNLocator(integer=True)) diff --git a/codes/lxi_load_plot_routines.py b/codes/lxi_load_plot_routines.py index 3ec0f51..a8645fa 100644 --- a/codes/lxi_load_plot_routines.py +++ b/codes/lxi_load_plot_routines.py @@ -29,6 +29,7 @@ def load_ts_plots( fig_height=None, dark_mode=True, time_type="LEXI", + display_time_label=True, ): """ Loads the time series plots for the selected time range and displays them in the GUI. @@ -81,6 +82,7 @@ def load_ts_plots( ts_fig_width=fig_width, dark_mode=dark_mode, time_type=time_type, + display_time_label=display_time_label, ).ts_plots() canvas = FigureCanvasTkAgg(fig_ts, master=frame) canvas.get_tk_widget().pack(side="left", fill="both", expand=False) @@ -232,6 +234,16 @@ def load_hist_plots( canvas.get_tk_widget().pack(side="left", fill="both", expand=True) canvas.draw() + # Create a new tkinter frame to display histograms + # new_root = tk.Tk(baseName=None, className="Histograms") + # new_root.title("Histograms") + # new_root.geometry("800x800") + # frame = tk.Frame(new_root) + # frame.pack(fill="both", expand=True) + # canvas = FigureCanvasTkAgg(fig_hist, master=frame) + # canvas.get_tk_widget().pack(side="left", fill="both", expand=True) + # canvas.draw() + def load_hist_plots_volt( root=None, From 429c662de0de7bd667181bc165236a8bdd0586a0 Mon Sep 17 00:00:00 2001 From: Ramiz Qudsi Date: Wed, 30 Oct 2024 16:15:20 -0400 Subject: [PATCH 7/8] minor edit --- codes/lxi_gui.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/codes/lxi_gui.py b/codes/lxi_gui.py index 9687d09..127e511 100644 --- a/codes/lxi_gui.py +++ b/codes/lxi_gui.py @@ -477,10 +477,10 @@ def dark_mode_change(): print(f"The screen width and height are: {screen_width}, {screen_height} for platform: {platform.system()}") -screen_width = 3600 -screen_height = 1000 +# screen_width = 3600 +# screen_height = 1000 print( - "If the GUI size is messed up, uncomment the line 474 and 475 of lxi_gui.py code and set the " + "If the GUI size is messed up, uncomment the line 480 and 481 of lxi_gui.py code and set the " "screen_width and screen_height to your liking." ) From 88d71be1f4422fb0a1256f01d0ef549b6c3f9042 Mon Sep 17 00:00:00 2001 From: Ramiz Qudsi Date: Wed, 27 Nov 2024 13:44:21 -0500 Subject: [PATCH 8/8] typo edit --- codes/lxi_file_read_funcs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codes/lxi_file_read_funcs.py b/codes/lxi_file_read_funcs.py index 0a8fc81..503a5d1 100644 --- a/codes/lxi_file_read_funcs.py +++ b/codes/lxi_file_read_funcs.py @@ -1453,7 +1453,7 @@ def read_binary_file(file_val=None, t_start=None, t_end=None, multiple_files=Fal ): raise ValueError( "when multiple_files is True, both t_start and t_end must either be" - f"None or a valid time value. The vlaues provided are t_start =" + f"None or a valid time value. The values provided are t_start =" f"{t_start} and t_end = {t_end}." ) # If both t_start and t_end are None, raise a warning stating that the times are set to none