diff --git a/faststack/ChangeLog.md b/faststack/ChangeLog.md index 6beb6b3..c1283a8 100644 --- a/faststack/ChangeLog.md +++ b/faststack/ChangeLog.md @@ -1,5 +1,38 @@ # ChangeLog +Todo: Make it work on Linux / Mac. Create Windows .exe. Write better documentation / help. Add splash screen / icon. Add the ability to pull in images from a stack if they are taken with a camera with in-camera stacking. + +# [1.2.0] - 2025-11-22 + +- Fixed menus, they now work well and look cool. + +## [1.1.0] - 2025-11-22 + +### Major Features +- **Built-in Image Editor:** Full-featured image editor with draggable window + - Exposure, highlights, shadows, whites, blacks, brightness, contrast + - White balance (Blue/Yellow and Magenta/Green axes) + - Auto White Balance button using grey world assumption + - Saturation, vibrance, clarity, sharpness + - Vignette effect + - Rotation (90°, 180°, 270°) + - EXIF metadata preservation (GPS, camera settings, timestamps) + - Press `E` to open editor, `Ctrl+S` to save + - Sequential backup naming (filename-backup.jpg, filename-backup2.jpg, etc.) + +- **Quick Auto White Balance:** Press `A` key for instant auto white balance + - Uses grey world assumption algorithm + - Automatically saves with backup + - Full undo support with Ctrl+Z + +- **Enhanced Batch Display:** Batch counter shows total selected images + - `B` key toggles images in/out of batch selection + +### UI/UX Improvements +- **Updated Key Bindings Dialog:** Added documentation for new features + - Auto white balance (A key) + - Image editor toggle (E key) + ## [1.0.0] - 2025-11-21 ### Major Features diff --git a/faststack/README.md b/faststack/README.md index ef981c0..c90741e 100644 --- a/faststack/README.md +++ b/faststack/README.md @@ -1,6 +1,6 @@ # FastStack -# Version 1.0 - November 21, 2025 +# Version 1.2 - November 22, 2025 # By Alan Rockefeller Ultra-fast, caching JPG viewer designed for culling and selecting RAW or JPG files for focus stacking and website upload. @@ -9,17 +9,19 @@ This tool is optimized for speed, using `libjpeg-turbo` for decoding, aggressive ## Features -- **Instant Navigation:** Sub-10ms next/previous image switching, high peformance decoding via `PyTurboJPEG`. +- **Instant Navigation:** Sub-10ms next/previous image switching, high-peformance decoding via `PyTurboJPEG`. - **Zoom & Pan:** Smooth zooming and panning. - **Stack Selection:** Group images into stacks (`[`, `]`) and select them for processing (`S`). - **Helicon Focus Integration:** Launch Helicon Focus with your selected RAW files with a single keypress (`Enter`). -- **Photoshop Integration:** Edit current image in Photoshop (E key) - uses RAW files when available +- **Image Editor:** Built-in editor with exposure, contrast, white balance, sharpness, and more (E key) +- **Quick Auto White Balance:** Press A to apply auto white balance and save automatically with undo support (Ctrl+Z). For better white balance load the raw into Photoshop with the P key. +- **Photoshop Integration:** Edit current image in Photoshop (P key) - always uses RAW files when available, even for backup files - **Clipboard Support:** Copy image path to clipboard (Ctrl+C) - **Image Filtering:** Filter images by filename - **Drag & Drop:** Drag images to external applications. Press { and } to batch files to drag & drop multiple images. - **Theme Support:** Toggle between light and dark themes - **Delete & Undo:** Move images to recycle bin (Delete/Backspace) with undo support (Ctrl+Z) -- **Has Memory**:** Starts where you left off, tells you which images have been edited, stacked and uploaded +- **Has Memory:** Starts where you left off, tells you which images have been edited, stacked and uploaded - **RAW Pairing:** Automatically maps JPGs to their corresponding RAW files (`.CR3`, `.ARW`, `.NEF`, etc.). - **Configurable:** Adjust cache sizes, prefetch behavior, and Helicon Focus / Photoshop paths via a settings dialog and a persistent `.ini` file. - **Accurate Colors:** Uses monitor ICC profile to display colors correctly. @@ -40,8 +42,9 @@ This tool is optimized for speed, using `libjpeg-turbo` for decoding, aggressive - `J` / `Right Arrow`: Next Image - `K` / `Left Arrow`: Previous Image -- `G`: Toggle Grid View (not implemented yet) -- `S` or 'X': Toggle selection of current image for stacking / drag & drop +- `G`: Go to image # +- `S`: Toggle selection of current image for stacking +- `B`: Toggle selection of current image for batch drag & drop - `[`: Begin new stack group - `]`: End current stack group - `{`: Begin new drag & drop batch @@ -51,9 +54,11 @@ This tool is optimized for speed, using `libjpeg-turbo` for decoding, aggressive - 'Ctrl+E': Toggle edited flag - 'Ctrl+S': Toggle stacked flag - `Enter`: Launch Helicon Focus with selected RAWs -- `E`: Edit in Photoshop (uses RAW file if available) +- `P`: Edit in Photoshop (uses RAW file if available) - `Delete` / `Backspace`: Move image to recycle bin -- `Ctrl+Z`: Undo last delete +- `Ctrl+Z`: Undo last action (delete or auto white balance) +- `A`: Quick auto white balance (saves automatically) +- `E`: Toggle Image Editor - `Ctrl+C`: Copy image path to clipboard - `Ctrl+0`: Reset zoom and pan - `C`: Clear all stacks diff --git a/faststack/faststack.egg-info/PKG-INFO b/faststack/faststack.egg-info/PKG-INFO index d2ad528..4976776 100644 --- a/faststack/faststack.egg-info/PKG-INFO +++ b/faststack/faststack.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.4 Name: faststack -Version: 1.0 +Version: 1.1 Summary: Ultra-fast JPG Viewer for Focus Stacking Selection and website upload Author-email: Alan Rockefeller Classifier: Programming Language :: Python :: 3 @@ -14,14 +14,13 @@ Requires-Dist: PyTurboJPEG<2.0,>=1.8 Requires-Dist: numpy<3.0,>=2.0 Requires-Dist: cachetools<6.0,>=5.0 Requires-Dist: watchdog<5.0,>=4.0 -Requires-Dist: typer<1.0,>=0.12 Requires-Dist: Pillow<11.0,>=10.0 Requires-Dist: pytest<9.0,>=8.0 Dynamic: license-file # FastStack -# Version 1.0 - November 21, 2025 +# Version 1.1 - November 22, 2025 # By Alan Rockefeller Ultra-fast, caching JPG viewer designed for culling and selecting RAW or JPG files for focus stacking. diff --git a/faststack/faststack.egg-info/requires.txt b/faststack/faststack.egg-info/requires.txt index 5694239..d86fd7c 100644 --- a/faststack/faststack.egg-info/requires.txt +++ b/faststack/faststack.egg-info/requires.txt @@ -3,6 +3,5 @@ PyTurboJPEG<2.0,>=1.8 numpy<3.0,>=2.0 cachetools<6.0,>=5.0 watchdog<5.0,>=4.0 -typer<1.0,>=0.12 Pillow<11.0,>=10.0 pytest<9.0,>=8.0 diff --git a/faststack/faststack/app.py b/faststack/faststack/app.py index 11adf79..cdf92fe 100644 --- a/faststack/faststack/app.py +++ b/faststack/faststack/app.py @@ -7,13 +7,14 @@ import time import argparse from pathlib import Path -from typing import Optional, List, Dict +from typing import Optional, List, Dict, Any from datetime import date import os import concurrent.futures import threading import subprocess from faststack.ui.provider import ImageProvider, UIState +import PySide6 from PySide6.QtGui import QDrag, QPixmap from PySide6.QtCore import ( QUrl, @@ -42,6 +43,7 @@ from faststack.imaging.prefetch import Prefetcher, clear_icc_caches from faststack.ui.provider import ImageProvider from faststack.ui.keystrokes import Keybinder +from faststack.imaging.editor import ImageEditor, ASPECT_RATIOS def make_hdrop(paths): """ @@ -91,6 +93,7 @@ def __init__(self, image_dir: Path, engine: QQmlApplicationEngine): # -- Backend Components -- self.watcher = Watcher(self.image_dir, self.refresh_image_list) self.sidecar = SidecarManager(self.image_dir, self.watcher, debug=_debug_mode) + self.image_editor = ImageEditor() # Initialize the editor # -- Caching & Prefetching -- cache_size_gb = config.getfloat('core', 'cache_size_gb', 1.5) @@ -114,7 +117,7 @@ def __init__(self, image_dir: Path, engine: QQmlApplicationEngine): # -- Stacking State -- self.stack_start_index: Optional[int] = None self.stacks: List[List[int]] = [] - self.selected_raws: set[Path] = set() + # -- Batch Selection State (for drag-and-drop) -- self.batch_start_index: Optional[int] = None @@ -130,6 +133,8 @@ def __init__(self, image_dir: Path, engine: QQmlApplicationEngine): # -- Delete/Undo State -- self.recycle_bin_dir = self.image_dir / "image recycle bin" self.delete_history: List[tuple[Path, Optional[Path]]] = [] # [(jpg_path, raw_path), ...] + # Track all undoable actions with timestamps + self.undo_history: List[Tuple[str, Any, float]] = [] # (action_type, action_data, timestamp) self.resize_timer = QTimer() self.resize_timer.setSingleShot(True) @@ -321,6 +326,12 @@ def get_decoded_image(self, index: int) -> Optional[DecodedImage]: log.warning("get_decoded_image called with empty image_files or out of bounds index.") return None + # If editor is open for this image, return the live preview + if self.ui_state.isEditorOpen and self.image_editor.original_image and str(self.image_editor.current_filepath) == str(self.image_files[index].path): + preview_data = self.image_editor.get_preview_data() + if preview_data: + return preview_data + _, _, display_gen = self.get_display_info() cache_key = f"{index}_{display_gen}" @@ -599,7 +610,7 @@ def end_current_batch(self): count = end - start + 1 self.update_status_message(f"Batch defined: {count} images") else: - log.warning("No batch start marked. Press '{{' first.") + log.warning("No batch start marked. Press '{' first.") self.update_status_message("No batch start marked") def clear_all_batches(self): @@ -620,64 +631,72 @@ def remove_from_batch_or_stack(self): removed = False # Check and remove from batches - for i in range(len(self.batches)): - start, end = self.batches[i] - if start <= self.current_index <= end: - # Build new ranges excluding current_index - new_ranges = [] + new_batches = [] + batch_modified = False + for start, end in self.batches: + if not batch_modified and start <= self.current_index <= end: + # This is the batch to modify. + + # Single image batch - remove entirely by not adding anything. if start == end: - # Single image batch - remove entirely (don't add anything) pass + # Remove from beginning - shift start forward elif self.current_index == start: - # Remove from beginning - shift start forward - new_ranges.append([start + 1, end]) + new_batches.append([start + 1, end]) + # Remove from end - shift end backward elif self.current_index == end: - # Remove from end - shift end backward - new_ranges.append([start, end - 1]) + new_batches.append([start, end - 1]) + # Remove from middle - split into two ranges else: - # Remove from middle - split into two ranges - new_ranges.append([start, self.current_index - 1]) - new_ranges.append([self.current_index + 1, end]) - - # Replace the old range with new range(s) - self.batches[i:i+1] = new_ranges + new_batches.append([start, self.current_index - 1]) + new_batches.append([self.current_index + 1, end]) log.info("Removed index %d from batch [%d, %d]", self.current_index, start, end) self.update_status_message(f"Removed from batch") removed = True - break + batch_modified = True + else: + new_batches.append([start, end]) + + if batch_modified: + self.batches = new_batches # Check and remove from stacks if not removed: - for i in range(len(self.stacks)): - start, end = self.stacks[i] - if start <= self.current_index <= end: - # Build new ranges excluding current_index - new_ranges = [] + new_stacks = [] + stack_modified = False + for start, end in self.stacks: + if not stack_modified and start <= self.current_index <= end: + # This is the stack to modify. + + # Single image stack - remove entirely. if start == end: - # Single image stack - remove entirely (don't add anything) pass + # Remove from beginning elif self.current_index == start: - # Remove from beginning - shift start forward - new_ranges.append([start + 1, end]) + new_stacks.append([start + 1, end]) + # Remove from end elif self.current_index == end: - # Remove from end - shift end backward - new_ranges.append([start, end - 1]) + new_stacks.append([start, end - 1]) + # Remove from middle else: - # Remove from middle - split into two ranges - new_ranges.append([start, self.current_index - 1]) - new_ranges.append([self.current_index + 1, end]) - - # Replace the old range with new range(s) - self.stacks[i:i+1] = new_ranges + new_stacks.append([start, self.current_index - 1]) + new_stacks.append([self.current_index + 1, end]) - self.sidecar.data.stacks = self.stacks + self.sidecar.data.stacks = self.stacks # Update sidecar BEFORE self.stacks is replaced self.sidecar.save() log.info("Removed index %d from stack [%d, %d]", self.current_index, start, end) self.update_status_message(f"Removed from stack") removed = True - break - + stack_modified = True + else: + new_stacks.append([start, end]) + + if stack_modified: + self.stacks = new_stacks + self.sidecar.data.stacks = self.stacks + self.sidecar.save() + if removed: self._metadata_cache_index = (-1, -1) self.dataChanged.emit() @@ -686,36 +705,190 @@ def remove_from_batch_or_stack(self): else: self.update_status_message("Not in any batch or stack") - def toggle_selection(self): - """Toggles the selection status of the current image's file (RAW if available, otherwise JPG).""" + def toggle_batch_membership(self): + """Toggles the current image's inclusion in a batch.""" if not self.image_files or self.current_index >= len(self.image_files): return - image_file = self.image_files[self.current_index] - # Use RAW if available, otherwise use JPG - file_to_select = image_file.raw_pair if image_file.raw_pair else image_file.path + index_to_toggle = self.current_index - if file_to_select in self.selected_raws: - self.selected_raws.remove(file_to_select) - log.info("Removed %s from selection.", file_to_select.name) + # Check if the image is already in a batch + in_batch = False + for start, end in self.batches: + if start <= index_to_toggle <= end: + in_batch = True + break + + new_batches = [] + if in_batch: + # Remove from batch + item_removed = False + for start, end in self.batches: + if not item_removed and start <= index_to_toggle <= end: + if start < index_to_toggle: + new_batches.append([start, index_to_toggle - 1]) + if index_to_toggle < end: + new_batches.append([index_to_toggle + 1, end]) + item_removed = True + else: + new_batches.append([start, end]) + self.batches = new_batches + self.update_status_message("Removed image from batch") + log.info("Removed index %d from a batch.", index_to_toggle) else: - self.selected_raws.add(file_to_select) - log.info("Added %s to selection.", file_to_select.name) + # Add to batch - merge with adjacent batches if possible + if not self.batches: + self.batches.append([index_to_toggle, index_to_toggle]) + self.update_status_message("Created new batch with current image.") + log.info("No existing batches. Created new batch for index %d.", index_to_toggle) + else: + # Check if adjacent to any existing batch + merged = False + for i, (start, end) in enumerate(self.batches): + # Adjacent to start of batch + if index_to_toggle == start - 1: + self.batches[i] = [index_to_toggle, end] + merged = True + break + # Adjacent to end of batch + elif index_to_toggle == end + 1: + self.batches[i] = [start, index_to_toggle] + merged = True + break + + if not merged: + # Not adjacent to any batch, create new one + self.batches.append([index_to_toggle, index_to_toggle]) + + # Sort and merge any overlapping batches + self.batches.sort() + merged_batches = [self.batches[0]] if self.batches else [] + for i in range(1, len(self.batches)): + last_start, last_end = merged_batches[-1] + current_start, current_end = self.batches[i] + if current_start <= last_end + 1: + merged_batches[-1] = [last_start, max(last_end, current_end)] + else: + merged_batches.append([current_start, current_end]) + self.batches = merged_batches + + self.update_status_message("Added image to batch") + log.info("Added index %d to batch.", index_to_toggle) - # In a real app, we'd update a selection indicator in the UI. - # For now, we just log and can use it for batch operations. - self.sync_ui_state() # This will trigger a UI refresh + self._metadata_cache_index = (-1, -1) + self.dataChanged.emit() + self.sync_ui_state() + + def toggle_stack_membership(self): + """Toggles the current image's inclusion in a stack.""" + if not self.image_files or self.current_index >= len(self.image_files): + return + + index_to_toggle = self.current_index + + # Check if the image is already in a stack + stack_to_modify_idx = -1 + for i, (start, end) in enumerate(self.stacks): + if start <= index_to_toggle <= end: + stack_to_modify_idx = i + break + + if stack_to_modify_idx != -1: + # --- Remove from existing stack --- + new_stacks = [] + item_removed = False + for i, (start, end) in enumerate(self.stacks): + if not item_removed and i == stack_to_modify_idx: + if start < index_to_toggle: + new_stacks.append([start, index_to_toggle - 1]) + if index_to_toggle < end: + new_stacks.append([index_to_toggle + 1, end]) + item_removed = True + else: + new_stacks.append([start, end]) + self.stacks = new_stacks + self.update_status_message("Removed image from stack") + log.info("Removed index %d from stack #%d.", index_to_toggle, stack_to_modify_idx + 1) + + else: + # --- Add to nearest stack --- + if not self.stacks: + self.stacks.append([index_to_toggle, index_to_toggle]) + self.update_status_message("Created new stack with current image.") + log.info("No existing stacks. Created new stack for index %d.", index_to_toggle) + else: + # Find closest stack + dist_backward = float('inf') + stack_idx_backward = -1 + for i in range(index_to_toggle - 1, -1, -1): + for j, (start, end) in enumerate(self.stacks): + if start <= i <= end: + dist_backward = index_to_toggle - i + stack_idx_backward = j + break + if stack_idx_backward != -1: + break + + dist_forward = float('inf') + stack_idx_forward = -1 + for i in range(index_to_toggle + 1, len(self.image_files)): + for j, (start, end) in enumerate(self.stacks): + if start <= i <= end: + dist_forward = i - index_to_toggle + stack_idx_forward = j + break + if stack_idx_forward != -1: + break + + if stack_idx_backward == -1 and stack_idx_forward == -1: + # This case should be covered by `if not self.stacks`, but as a fallback. + self.stacks.append([index_to_toggle, index_to_toggle]) + self.update_status_message("Created new stack with current image.") + log.info("No stacks found nearby. Created new stack for index %d.", index_to_toggle) + else: + if dist_backward <= dist_forward: + stack_to_join_idx = stack_idx_backward + else: + stack_to_join_idx = stack_idx_forward + + start, end = self.stacks[stack_to_join_idx] + self.stacks[stack_to_join_idx] = [min(start, index_to_toggle), max(end, index_to_toggle)] + + # Merge overlapping stacks + self.stacks.sort() + merged_stacks = [self.stacks[0]] if self.stacks else [] + for i in range(1, len(self.stacks)): + last_start, last_end = merged_stacks[-1] + current_start, current_end = self.stacks[i] + if current_start <= last_end + 1: + merged_stacks[-1] = [last_start, max(last_end, current_end)] + else: + merged_stacks.append([current_start, current_end]) + self.stacks = merged_stacks + + # Find the new stack index for the status message + new_stack_idx = -1 + for i, (start, end) in enumerate(self.stacks): + if start <= index_to_toggle <= end: + new_stack_idx = i + break + + self.update_status_message(f"Added image to Stack #{new_stack_idx + 1}") + log.info("Added index %d to stack #%d.", index_to_toggle, new_stack_idx + 1) + + self.sidecar.data.stacks = self.stacks + self.sidecar.save() + self._metadata_cache_index = (-1, -1) + self.dataChanged.emit() + self.ui_state.stackSummaryChanged.emit() + self.sync_ui_state() + + def launch_helicon(self): """Launches Helicon Focus with selected files (RAW preferred, JPG fallback) or stacks.""" - if self.selected_raws: - log.info("Launching Helicon with %d selected files.", len(self.selected_raws)) - success = self._launch_helicon_with_files(sorted(list(self.selected_raws))) - if success: - self.selected_raws.clear() - - elif self.stacks: + if self.stacks: log.info("Launching Helicon for %d defined stacks.", len(self.stacks)) any_success = False for start, end in self.stacks: @@ -1012,7 +1185,10 @@ def delete_current_image(self): # Add to delete history only if at least one file was moved if deleted_files: + import time + timestamp = time.time() self.delete_history.append((jpg_path, raw_path)) + self.undo_history.append(("delete", (jpg_path, raw_path), timestamp)) # Update status if deleted_files: @@ -1039,58 +1215,97 @@ def delete_current_image(self): @Slot() def undo_delete(self): - """Restores the last deleted image from recycle bin.""" - if not self.delete_history: + """Unified undo that handles both delete and auto white balance operations.""" + if not self.undo_history: self.update_status_message("Nothing to undo.") return - jpg_path, raw_path = self.delete_history.pop() + # Get the most recent action + action_type, action_data, timestamp = self.undo_history.pop() - restored_files = [] - try: - # Restore JPG - jpg_in_bin = self.recycle_bin_dir / jpg_path.name - if jpg_in_bin.exists(): - jpg_in_bin.rename(jpg_path) - restored_files.append(jpg_path.name) - log.info("Restored %s from recycle bin", jpg_path.name) - - # Restore RAW - if raw_path: - raw_in_bin = self.recycle_bin_dir / raw_path.name - if raw_in_bin.exists(): - raw_in_bin.rename(raw_path) - restored_files.append(raw_path.name) - log.info("Restored %s from recycle bin", raw_path.name) - - # Update status - if restored_files: - files_str = ", ".join(restored_files) - self.update_status_message(f"Restored: {files_str}") - else: - self.update_status_message("No files to restore") - - # Refresh image list - self.refresh_image_list() + if action_type == "delete": + jpg_path, raw_path = action_data + # Also remove from delete_history + if self.delete_history and self.delete_history[-1] == (jpg_path, raw_path): + self.delete_history.pop() - # Find and navigate to the restored image - for i, img_file in enumerate(self.image_files): - if img_file.path == jpg_path: - self.current_index = i - break - - # Clear cache and invalidate display generation to force image reload - self.display_generation += 1 - self.image_cache.clear() - self.prefetcher.cancel_all() # Cancel stale tasks since image list changed - self.prefetcher.update_prefetch(self.current_index) - self.sync_ui_state() + restored_files = [] + try: + # Restore JPG + jpg_in_bin = self.recycle_bin_dir / jpg_path.name + if jpg_in_bin.exists(): + jpg_in_bin.rename(jpg_path) + restored_files.append(jpg_path.name) + log.info("Restored %s from recycle bin", jpg_path.name) + + # Restore RAW + if raw_path: + raw_in_bin = self.recycle_bin_dir / raw_path.name + if raw_in_bin.exists(): + raw_in_bin.rename(raw_path) + restored_files.append(raw_path.name) + log.info("Restored %s from recycle bin", raw_path.name) + + # Update status + if restored_files: + files_str = ", ".join(restored_files) + self.update_status_message(f"Restored: {files_str}") + else: + self.update_status_message("No files to restore") + + # Refresh image list + self.refresh_image_list() + + # Find and navigate to the restored image + for i, img_file in enumerate(self.image_files): + if img_file.path == jpg_path: + self.current_index = i + break + + # Clear cache and invalidate display generation to force image reload + self.display_generation += 1 + self.image_cache.clear() + self.prefetcher.cancel_all() # Cancel stale tasks since image list changed + self.prefetcher.update_prefetch(self.current_index) + self.sync_ui_state() + + except OSError as e: + self.update_status_message(f"Undo failed: {e}") + log.exception("Failed to restore image") + # Put it back in history if it failed + self.undo_history.append(("delete", (jpg_path, raw_path), timestamp)) + self.delete_history.append((jpg_path, raw_path)) + + elif action_type == "auto_white_balance": + filepath, saved_path = action_data + filepath_obj = Path(filepath) + backup_path = filepath_obj.parent / f"{filepath_obj.stem}_backup{filepath_obj.suffix}" - except OSError as e: - self.update_status_message(f"Undo failed: {e}") - log.exception("Failed to restore image") - # Put it back in history if it failed - self.delete_history.append((jpg_path, raw_path)) + try: + if backup_path.exists(): + # Restore the backup + filepath_obj.unlink() # Remove the edited version + backup_path.rename(filepath_obj) # Restore backup + log.info("Restored backup for %s", filepath) + + # Refresh the view + self.display_generation += 1 + self.image_cache.clear() + self.prefetcher.cancel_all() + self.prefetcher.update_prefetch(self.current_index) + self.sync_ui_state() + + self.update_status_message("Undid auto white balance") + else: + self.update_status_message("Backup not found") + log.warning("Backup not found at %s", backup_path) + # Put it back in history if backup not found + self.undo_history.append(("auto_white_balance", (filepath, saved_path), timestamp)) + except OSError as e: + self.update_status_message(f"Undo failed: {e}") + log.exception("Failed to undo auto white balance") + # Put it back in history if it failed + self.undo_history.append(("auto_white_balance", (filepath, saved_path), timestamp)) def shutdown(self): log.info("Application shutting down.") @@ -1183,14 +1398,34 @@ def edit_in_photoshop(self): # Prefer RAW file if it exists, otherwise use JPG image_file = self.image_files[self.current_index] - raw_path = image_file.raw_pair + jpg_path = image_file.path + + # Handle backup images: strip -backup, -backup2, -backup-1, etc. to find original RAW + import re + original_stem = jpg_path.stem + # Remove -backup with optional digits or -backup-digits (handles both formats) + original_stem = re.sub(r'-backup(-?\d+)?$', '', original_stem) + + # Look for RAW file with the original stem + raw_path = None + if image_file.raw_pair and image_file.raw_pair.exists(): + # Use the paired RAW if it exists + raw_path = image_file.raw_pair + else: + # Search for RAW file manually by original stem + from faststack.io.indexer import RAW_EXTENSIONS + for ext in RAW_EXTENSIONS: + potential_raw = jpg_path.parent / f"{original_stem}{ext}" + if potential_raw.exists(): + raw_path = potential_raw + break if raw_path and raw_path.exists(): current_image_path = raw_path log.info("Using RAW file for Photoshop: %s", raw_path) else: - current_image_path = image_file.path - log.info("Using JPG file for Photoshop: %s", current_image_path) + current_image_path = jpg_path + log.info("Using JPG file for Photoshop (no RAW found): %s", current_image_path) photoshop_exe = config.get('photoshop', 'exe') photoshop_args = config.get('photoshop', 'args') @@ -1314,9 +1549,10 @@ def start_drag_current_image(self): if 0 <= idx < len(self.image_files): files_to_drag.add(idx) - # Convert to sorted list and get paths + # Convert to sorted list and get only existing paths file_indices = sorted(files_to_drag) - file_paths = [self.image_files[idx].path for idx in file_indices if self.image_files[idx].path.exists()] + existing_indices = [idx for idx in file_indices if self.image_files[idx].path.exists()] + file_paths = [self.image_files[idx].path for idx in existing_indices] if not file_paths: log.error("No valid files to drag") @@ -1355,8 +1591,8 @@ def start_drag_current_image(self): if result in (Qt.CopyAction, Qt.MoveAction): from datetime import datetime today = datetime.now().strftime("%Y-%m-%d") - - for idx in file_indices: + + for idx in existing_indices: stem = self.image_files[idx].path.stem meta = self.sidecar.get_metadata(stem) meta.uploaded = True @@ -1371,7 +1607,255 @@ def start_drag_current_image(self): self._metadata_cache_index = (-1, -1) self.dataChanged.emit() self.sync_ui_state() - log.info("Marked %d file(s) as uploaded on %s. Cleared all batches.", len(file_indices), today) + log.info("Marked %d file(s) as uploaded on %s. Cleared all batches.", len(existing_indices), today) + + # --- Image Editor Logic --- + + @Slot(result=bool) + def load_image_for_editing(self): + """Loads the currently viewed image into the editor.""" + if self.image_files and self.current_index < len(self.image_files): + filepath = str(self.image_files[self.current_index].path) + # Only load if the editor is not already open for this file + if str(self.image_editor.current_filepath) == filepath and self.image_editor.original_image is not None: + # Already loaded, just reset UI state for a fresh start + self.reset_edit_parameters() + return True + + # Get the cached, display-sized image to use for fast previews + cached_preview = self.get_decoded_image(self.current_index) + + if self.image_editor.load_image(filepath, cached_preview=cached_preview): + # Pass initial edits to uiState + initial_edits = self.image_editor._initial_edits() + for key, value in initial_edits.items(): + if hasattr(self.ui_state, key): + setattr(self.ui_state, key, value) + + # Set aspect ratios for QML dropdown + self.ui_state.aspectRatioNames = [r['name'] for r in ASPECT_RATIOS] + self.ui_state.currentAspectRatioIndex = 0 + self.ui_state.currentCropBox = (0, 0, 1000, 1000) # Reset crop box visually + return True + return False + + @Slot(result=DecodedImage) + def get_preview_data(self) -> Optional[DecodedImage]: + """Gets the preview data of the currently edited image as a DecodedImage.""" + return self.image_editor.get_preview_data() + + @Slot(str, "QVariant") + def set_edit_parameter(self, key: str, value: Any): + """Sets an edit parameter and updates the UIState for the slider visual.""" + if self.image_editor.set_edit_param(key, value): + # Update the corresponding UIState property to reflect the new value in QML + if hasattr(self.ui_state, key): + setattr(self.ui_state, key, value) + + # Trigger a refresh of the image to show the edit + self.ui_refresh_generation += 1 + self.ui_state.currentImageSourceChanged.emit() + + @Slot(int, int, int, int) + def set_crop_box(self, left: int, top: int, right: int, bottom: int): + """Sets the normalized crop box (0-1000) in the editor.""" + from typing import Tuple + crop_box: Tuple[int, int, int, int] = (left, top, right, bottom) + self.image_editor.set_crop_box(crop_box) + self.ui_state.currentCropBox = crop_box # Update QML visual (if implemented) + + @Slot() + def reset_edit_parameters(self): + """Resets all editing parameters in the editor.""" + self.image_editor.current_edits = self.image_editor._initial_edits() + if hasattr(self.ui_state, 'reset_editor_state'): + self.ui_state.reset_editor_state() + + # Trigger a refresh to show the reset image + self.ui_refresh_generation += 1 + self.ui_state.currentImageSourceChanged.emit() + + @Slot() + def save_edited_image(self): + """Saves the edited image.""" + saved_path = self.image_editor.save_image() + if saved_path: + # Clear the image editor state so it will reload fresh next time + self.image_editor.original_image = None + self.image_editor.current_filepath = None + self.image_editor._preview_image = None + + # Reset all edit parameters in the controller/UI + self.reset_edit_parameters() + + # Refresh the view - need to refresh image list since backup file was created + original_path = saved_path + self.refresh_image_list() + + # Find the edited image (not the backup) in the refreshed list + for i, img_file in enumerate(self.image_files): + if img_file.path == original_path: + self.current_index = i + break + + # Invalidate cache and refresh display + self.display_generation += 1 + self.image_cache.clear() + self.prefetcher.cancel_all() + self.prefetcher.update_prefetch(self.current_index) + self.sync_ui_state() + + QMessageBox.information( + None, + "Save Successful", + f"Image saved to: {saved_path}. Original backed up.", + QMessageBox.Ok + ) + + @Slot() + def rotate_image_cw(self): + """Rotate the edited image 90 degrees clockwise.""" + current = self.image_editor.current_edits.get('rotation', 0) + new_rotation = (current + 90) % 360 + self.set_edit_parameter('rotation', new_rotation) + + @Slot() + def rotate_image_ccw(self): + """Rotate the edited image 90 degrees counter-clockwise.""" + current = self.image_editor.current_edits.get('rotation', 0) + new_rotation = (current - 90) % 360 + if new_rotation < 0: + new_rotation += 360 + self.set_edit_parameter('rotation', new_rotation) + + @Slot() + def quick_auto_white_balance(self): + """Quickly apply auto white balance, save the image, and track for undo.""" + if not self.image_files: + self.update_status_message("No image to adjust") + return + + import time + image_file = self.image_files[self.current_index] + filepath = str(image_file.path) + + # Load the image into the editor if not already loaded + cached_preview = self.get_decoded_image(self.current_index) + if not self.image_editor.load_image(filepath, cached_preview=cached_preview): + self.update_status_message("Failed to load image") + return + + # Calculate and apply auto white balance + self.auto_white_balance() + + # Save the edited image (this creates a backup automatically) + saved_path = self.image_editor.save_image() + if saved_path: + # Track this action for undo + timestamp = time.time() + self.undo_history.append(("auto_white_balance", (filepath, saved_path), timestamp)) + + # Force the image editor to clear its current state so it reloads fresh + self.image_editor.original_image = None + self.image_editor.current_filepath = None + self.image_editor._preview_image = None + + # Refresh the view - need to refresh image list since backup file was created + original_path = Path(filepath) + self.refresh_image_list() + + # Find the edited image (not the backup) in the refreshed list + for i, img_file in enumerate(self.image_files): + if img_file.path == original_path: + self.current_index = i + break + + # Invalidate cache for the edited image so it's reloaded from disk + # This ensures the Image Editor will see the updated version + self.display_generation += 1 + self.image_cache.clear() + self.prefetcher.cancel_all() + self.prefetcher.update_prefetch(self.current_index) + self.sync_ui_state() + + self.update_status_message("Auto white balance applied and saved") + log.info("Quick auto white balance applied to %s", filepath) + else: + self.update_status_message("Failed to save image") + + @Slot() + def auto_white_balance(self): + """Calculates and applies auto white balance using grey world assumption.""" + if not self.image_editor.original_image: + log.warning("No image loaded in editor for auto white balance") + return + + import numpy as np + + # Work with the original image for accurate calculation + img = self.image_editor.original_image + + # Convert to numpy array + arr = np.array(img, dtype=np.float32) + + # Calculate mean values for each channel + r_mean = arr[:, :, 0].mean() + g_mean = arr[:, :, 1].mean() + b_mean = arr[:, :, 2].mean() + + # Grey world assumption: average should be neutral grey + grey_target = (r_mean + g_mean + b_mean) / 3.0 + + log.info("Auto white balance - means: R=%.1f G=%.1f B=%.1f, target=%.1f", + r_mean, g_mean, b_mean, grey_target) + + # Calculate how much each channel differs from grey (positive = too high) + r_diff = r_mean - grey_target + g_diff = g_mean - grey_target + b_diff = b_mean - grey_target + + # From editor.py, the white balance equations are: + # R' = R + by_shift + mg_shift + # G' = G + by_shift - mg_shift + # B' = B - by_shift + mg_shift + # + # To neutralize: + # We want R' = G' = B' = grey_target + # So: R + by_shift + mg_shift = grey_target => by_shift + mg_shift = -r_diff + # G + by_shift - mg_shift = grey_target => by_shift - mg_shift = -g_diff + # B - by_shift + mg_shift = grey_target => -by_shift + mg_shift = -b_diff + # + # From first two equations: + # by_shift = -(r_diff + g_diff) / 2 + # mg_shift = -(r_diff - g_diff) / 2 + + by_shift = -(r_diff + g_diff) / 2.0 + mg_shift = -(r_diff - g_diff) / 2.0 + + # Convert to the -1 to 1 range expected by the editor (editor multiplies by 0.5 then 127.5) + # So our value goes through: value * 0.5 * 127.5 = value * 63.75 + # We want: by_shift, so value = by_shift / 63.75 + by_value = by_shift / 63.75 + mg_value = mg_shift / 63.75 + + # Clamp to -1.0 to 1.0 range + by_value = float(np.clip(by_value, -1.0, 1.0)) + mg_value = float(np.clip(mg_value, -1.0, 1.0)) + + log.info("Auto white balance: by_shift=%.1f mg_shift=%.1f", by_shift, mg_shift) + log.info("Auto white balance values: B/Y=%.3f, M/G=%.3f", by_value, mg_value) + + # Apply the adjustments + self.image_editor.set_edit_param('white_balance_by', by_value) + self.image_editor.set_edit_param('white_balance_mg', mg_value) + + # Update UIState properties directly to force slider refresh + self.ui_state.white_balance_by = by_value + self.ui_state.white_balance_mg = mg_value + + # Trigger image refresh + self.ui_refresh_generation += 1 + self.ui_state.currentImageSourceChanged.emit() def _get_stack_info(self, index: int) -> str: info = "" @@ -1389,14 +1873,20 @@ def _get_stack_info(self, index: int) -> str: def _get_batch_info(self, index: int) -> str: """Get batch info for the given index.""" info = "" - for i, (start, end) in enumerate(self.batches): + # Check if current image is in any batch + in_batch = False + for start, end in self.batches: if start <= index <= end: - count_in_batch = end - start + 1 - pos_in_batch = index - start + 1 - info = f"Batch {i+1} ({pos_in_batch}/{count_in_batch})" + in_batch = True break - if not info and self.batch_start_index is not None and self.batch_start_index == index: + + if in_batch: + # Calculate total count across all batches + total_count = sum(end - start + 1 for start, end in self.batches) + info = f"{total_count} in Batch" + elif self.batch_start_index is not None and self.batch_start_index == index: info = "Batch Start Marked" + log.debug("_get_batch_info for index %d: %s", index, info) return info @@ -1427,6 +1917,7 @@ def main(image_dir: str = "", debug: bool = False): log.info("Starting FastStack") os.environ["QT_QUICK_CONTROLS_STYLE"] = "Material" + os.environ["QML2_IMPORT_PATH"] = os.path.join(os.path.dirname(__file__), "qml") app = QApplication(sys.argv) # Moved here if debug: @@ -1453,6 +1944,12 @@ def main(image_dir: str = "", debug: bool = False): app.setApplicationName("FastStack") engine = QQmlApplicationEngine() + engine.addImportPath(os.path.join(os.path.dirname(PySide6.__file__), "qml")) + engine.addImportPath("qrc:/qt-project.org/imports") + engine.addImportPath(os.path.join(os.path.dirname(__file__), "qml")) + # Add the path to Qt5Compat.GraphicalEffects to QML import paths + engine.addImportPath(os.path.join(os.path.dirname(PySide6.__file__), "qml", "Qt5Compat")) + controller = AppController(image_dir_path, engine) if debug: log.info("Startup: after AppController: %.3fs", time.perf_counter() - t0) diff --git a/faststack/faststack/app.py.bak b/faststack/faststack/app.py.bak deleted file mode 100644 index d67a59d..0000000 --- a/faststack/faststack/app.py.bak +++ /dev/null @@ -1,638 +0,0 @@ -"""Main application entry point for FastStack.""" - -import logging -import sys -import struct -from pathlib import Path -from typing import Optional, List, Dict -from datetime import date -import os -import typer -import concurrent.futures -import threading -from faststack.ui.provider import ImageProvider, UIState -from PySide6.QtGui import QDrag -from PySide6.QtCore import ( - QUrl, - QTimer, - QObject, - QEvent, - Signal, - Slot, - QMimeData, - Qt -) -from PySide6.QtWidgets import QApplication, QFileDialog -from PySide6.QtQml import QQmlApplicationEngine - -# ⬇️ these are the ones that went missing -from faststack.config import config -from faststack.logging_setup import setup_logging -from faststack.models import ImageFile, DecodedImage, EntryMetadata -from faststack.io.indexer import find_images -from faststack.io.sidecar import SidecarManager -from faststack.io.watcher import Watcher -from faststack.io.helicon import launch_helicon_focus -from faststack.imaging.cache import ByteLRUCache, get_decoded_image_size -from faststack.imaging.prefetch import Prefetcher -from faststack.ui.provider import ImageProvider -from faststack.ui.keystrokes import Keybinder - - -def make_hdrop(paths): - """ - Build a real CF_HDROP (DROPFILES) payload for Windows drag-and-drop. - paths: list[str] - """ - files_part = ("\0".join(paths) + "\0\0").encode("utf-16le") - - # DROPFILES header (20 bytes): bool: - if watched == self.main_window and event.type() == QEvent.Type.KeyPress: - handled = self.keybinder.handle_key_press(event) - if handled: - return True - return super().eventFilter(watched, event) - - def load(self): - """Loads images, sidecar data, and starts services.""" - self.refresh_image_list() - if not self.image_files: - self.current_index = 0 - else: - self.current_index = max(0, min(self.sidecar.data.last_index, len(self.image_files) - 1)) - self.stacks = self.sidecar.data.stacks # Load stacks from sidecar - self.watcher.start() - self.prefetcher.update_prefetch(self.current_index) - - # Defer initial UI sync until after images are loaded - self.sync_ui_state() - - - def refresh_image_list(self): - """Rescans the directory for images and applies the current filter.""" - all_images = find_images(self.image_dir) - if self._filter_string: - self.image_files = [img for img in all_images if self._filter_string.lower() in img.path.stem.lower()] - else: - self.image_files = all_images - - self.prefetcher.set_image_files(self.image_files) - self._metadata_cache_index = (-1, -1) # Invalidate cache - self.ui_state.imageCountChanged.emit() - - def get_decoded_image(self, index: int) -> Optional[DecodedImage]: - """Retrieves a decoded image, from cache or by decoding.""" - if not self.image_files: # Handle empty image list - log.warning("get_decoded_image called with empty image_files.") - return None - - _, _, display_gen = self.get_display_info() - cache_key = f"{index}_{display_gen}" - - if cache_key in self.image_cache: - return self.image_cache[cache_key] - - # If not in cache, this was likely a cache miss. - # The prefetcher should have it, but we can do a blocking load if needed. - log.warning(f"Cache miss for index {index} (gen: {display_gen}). Forcing synchronous load.") - future = self.prefetcher.submit_task(index, self.prefetcher.generation) - if future: - try: - # Wait for the result and then retrieve from cache - result = future.result() - if result: - decoded_index, decoded_display_gen = result - cache_key = f"{decoded_index}_{decoded_display_gen}" - if cache_key in self.image_cache: - return self.image_cache[cache_key] - except concurrent.futures.CancelledError: - log.warning(f"Prefetch task for index {index} was cancelled. Attempting synchronous load.") - return None - return None - - def sync_ui_state(self): - """Forces the UI to update by emitting all state change signals.""" - self.ui_refresh_generation += 1 - self._metadata_cache_index = (-1, -1) # Invalidate cache - self.ui_state.currentIndexChanged.emit() - self.ui_state.currentImageSourceChanged.emit() - self.ui_state.metadataChanged.emit() - log.debug(f"UI State Synced: Index={self.ui_state.currentIndex}, Count={self.ui_state.imageCount}") - log.debug(f"Metadata Synced: Filename={self.ui_state.currentFilename}, Flagged={self.ui_state.isFlagged}, Rejected={self.ui_state.isRejected}, StackInfo='{self.ui_state.stackInfoText}'") - - # --- Actions --- - - def next_image(self): - if self.current_index < len(self.image_files) - 1: - self.current_index += 1 - self.prefetcher.update_prefetch(self.current_index) - self.sync_ui_state() - - def prev_image(self): - if self.current_index > 0: - self.current_index -= 1 - self.prefetcher.update_prefetch(self.current_index) - self.sync_ui_state() - - def toggle_grid_view(self): - log.warning("Grid view not implemented yet.") - - def get_current_metadata(self) -> Dict: - if not self.image_files: - log.debug("get_current_metadata: image_files is empty, returning {}.") - return {} - - # Cache hit check - cache_key = (self.current_index, self.ui_refresh_generation) - if cache_key == self._metadata_cache_index: - return self._metadata_cache - - # Compute and cache - stem = self.image_files[self.current_index].path.stem - meta = self.sidecar.get_metadata(stem) - stack_info = self._get_stack_info(self.current_index) - - self._metadata_cache = { - "filename": self.image_files[self.current_index].path.name, - "flag": meta.flag, - "reject": meta.reject, - "stacked": meta.stacked, - "stacked_date": meta.stacked_date or "", - "stack_info_text": stack_info - } - self._metadata_cache_index = cache_key - return self._metadata_cache - - def toggle_current_flag(self): - stem = self.image_files[self.current_index].path.stem - meta = self.sidecar.get_metadata(stem) - meta.flag = not meta.flag - self.sidecar.save() - self._metadata_cache_index = (-1, -1) # Invalidate cache - self.ui_state.metadataChanged.emit() - - def toggle_current_reject(self): - stem = self.image_files[self.current_index].path.stem - meta = self.sidecar.get_metadata(stem) - meta.reject = not meta.reject - self.sidecar.save() - self._metadata_cache_index = (-1, -1) # Invalidate cache - self.ui_state.metadataChanged.emit() - - def begin_new_stack(self): - self.stack_start_index = self.current_index - log.info(f"Stack start marked at index {self.stack_start_index}") - self._metadata_cache_index = (-1, -1) # Invalidate cache - self.ui_state.metadataChanged.emit() # Update UI to show start marker - - def end_current_stack(self): - log.info(f"end_current_stack called. stack_start_index: {self.stack_start_index}") - if self.stack_start_index is not None: - start = min(self.stack_start_index, self.current_index) - end = max(self.stack_start_index, self.current_index) - self.stacks.append([start, end]) - self.stacks.sort() # Keep stacks sorted by start index - self.sidecar.data.stacks = self.stacks - self.sidecar.save() - log.info(f"Defined new stack: [{start}, {end}]") - self.stack_start_index = None - self._metadata_cache_index = (-1, -1) # Invalidate cache - self.ui_state.metadataChanged.emit() - else: - log.warning("No stack start marked. Press '[' first.") - - def toggle_selection(self): - """Toggles the selection status of the current image's RAW file.""" - if not self.image_files: - return - - image_file = self.image_files[self.current_index] - if image_file.raw_pair: - if image_file.raw_pair in self.selected_raws: - self.selected_raws.remove(image_file.raw_pair) - log.info(f"Removed {image_file.raw_pair.name} from selection.") - else: - self.selected_raws.add(image_file.raw_pair) - log.info(f"Added {image_file.raw_pair.name} to selection.") - - # In a real app, we'd update a selection indicator in the UI. - # For now, we just log and can use it for batch operations. - self.sync_ui_state() # This will trigger a UI refresh - - - def launch_helicon(self): - """Launches Helicon Focus with selected RAWs or all RAWs in defined stacks.""" - if self.selected_raws: - log.info(f"Launching Helicon with {len(self.selected_raws)} selected RAW files.") - self._launch_helicon_with_files(sorted(list(self.selected_raws))) - self.selected_raws.clear() - - elif self.stacks: - log.info(f"Launching Helicon for {len(self.stacks)} defined stacks.") - for start, end in self.stacks: - raw_files_to_process = [] - for idx in range(start, end + 1): - if idx < len(self.image_files) and self.image_files[idx].raw_pair: - raw_files_to_process.append(self.image_files[idx].raw_pair) - - if raw_files_to_process: - self._launch_helicon_with_files(raw_files_to_process) - else: - log.warning(f"No valid RAW files found for stack [{start}, {end}].") - - self.clear_all_stacks() - - else: - log.warning("No selection or stacks defined to launch Helicon Focus.") - return - - self.sync_ui_state() - - def _launch_helicon_with_files(self, raw_files: List[Path]): - """Helper to launch Helicon with a specific list of files.""" - log.info(f"Launching Helicon Focus with {len(raw_files)} RAW files.") - unique_raw_files = sorted(list(set(raw_files))) - success, tmp_path = launch_helicon_focus(unique_raw_files) - if success and tmp_path: - # Schedule delayed deletion of the temporary file - QTimer.singleShot(5000, lambda: self._delete_temp_file(tmp_path)) - - # Record stacking metadata - today = date.today().isoformat() - for raw_path in unique_raw_files: - # Find the corresponding image file to get the stem - for img_file in self.image_files: - if img_file.raw_pair == raw_path: - stem = img_file.path.stem - meta = self.sidecar.get_metadata(stem) - meta.stacked = True - meta.stacked_date = today - break - self.sidecar.save() - self._metadata_cache_index = (-1, -1) # Invalidate cache - - def _delete_temp_file(self, tmp_path: Path): - if tmp_path.exists(): - try: - os.remove(tmp_path) - log.info(f"Deleted temporary file: {tmp_path}") - except OSError as e: - log.error(f"Error deleting temporary file {tmp_path}: {e}") - - def clear_all_stacks(self): - log.info("Clearing all defined stacks.") - self.stacks = [] - self.sidecar.data.stacks = self.stacks - self.sidecar.save() - self._metadata_cache_index = (-1, -1) # Invalidate cache - self.ui_state.metadataChanged.emit() # Refresh UI to show no stacks - - def get_helicon_path(self): - return config.get('helicon', 'exe') - - def set_helicon_path(self, path): - config.set('helicon', 'exe', path) - config.save() - - def open_file_dialog(self): - dialog = QFileDialog() - dialog.setFileMode(QFileDialog.FileMode.ExistingFile) - dialog.setNameFilter("Executables (*.exe)") - if dialog.exec(): - return dialog.selectedFiles()[0] - return "" - - def check_path_exists(self, path): - return os.path.exists(path) - - def get_cache_size(self): - return config.getfloat('core', 'cache_size_gb') - - def set_cache_size(self, size): - config.set('core', 'cache_size_gb', size) - config.save() - - def get_prefetch_radius(self): - return config.getint('core', 'prefetch_radius') - - def set_prefetch_radius(self, radius): - config.set('core', 'prefetch_radius', radius) - config.save() - self.prefetcher.prefetch_radius = radius - self.prefetcher.update_prefetch(self.current_index) - - def get_theme(self): - return 0 if config.get('core', 'theme') == 'dark' else 1 - - def set_theme(self, theme_index): - theme = 'dark' if theme_index == 0 else 'light' - config.set('core', 'theme', theme) - config.save() - self.ui_state.themeChanged.emit() - - def get_default_directory(self): - return config.get('core', 'default_directory') - - def set_default_directory(self, path): - config.set('core', 'default_directory', path) - config.save() - - def open_directory_dialog(self): - dialog = QFileDialog() - dialog.setFileMode(QFileDialog.FileMode.Directory) - if dialog.exec(): - return dialog.selectedFiles()[0] - return "" - - def preload_all_images(self): - if self.ui_state.isPreloading: - log.info("Preloading is already in progress.") - return - - log.info("Starting to preload all images.") - self.ui_state.isPreloading = True - self.ui_state.preloadProgress = 0 - - self.reporter = self.ProgressReporter() - self.reporter.progress_updated.connect(self._update_preload_progress) - self.reporter.finished.connect(self._finish_preloading) - - # Use existing prefetch executor (better resource utilization) - total = len(self.image_files) - - if total == 0: - log.info("No images to preload.") - self.reporter.progress_updated.emit(100) # Or 0, depending on desired UX - self.reporter.finished.emit() - return - - completed = 0 - - def _on_done(_future): - nonlocal completed - completed += 1 - progress = int((completed / total) * 100) - self.reporter.progress_updated.emit(progress) - if completed == total: - self.reporter.finished.emit() - - for i in range(total): - future = self.prefetcher.submit_task(i, self.prefetcher.generation) - if future: - future.add_done_callback(_on_done) - - def _update_preload_progress(self, progress: int): - log.debug(f"Updating preload progress in UI: {progress}%") - self.ui_state.preloadProgress = progress - - def _finish_preloading(self): - self.ui_state.isPreloading = False - self.ui_state.preloadProgress = 0 - log.info("Finished preloading all images.") - - def shutdown(self): - log.info("Application shutting down.") - # Clear QML context property to prevent TypeErrors during shutdown - if self.engine: - log.info("Clearing uiState context property in QML.") - del self.engine # Explicitly delete the engine - - self.watcher.stop() - self.prefetcher.shutdown() - self.sidecar.set_last_index(self.current_index) - self.sidecar.save() - - - @Slot() - def start_drag_current_image(self): - # 1) sanity checks - if not self.image_files or self.current_index >= len(self.image_files): - return - - file_path = self.image_files[self.current_index].path - if not file_path.exists(): - log.error(f"File does not exist, cannot start drag: {file_path}") - return - - if self.main_window is None: - return - - # 2) build the drag - drag = QDrag(self.main_window) - mime_data = QMimeData() - - # Windows: send a real file-drop (CF_HDROP) so Chrome/iNat can upload it - if sys.platform.startswith("win"): - hdrop = make_hdrop([str(file_path)]) - mime_data.setData('application/x-qt-windows-mime;value="FileDrop"', hdrop) - mime_data.setData( - 'application/x-qt-windows-mime;value="FileNameW"', - (str(file_path) + "\0").encode("utf-16le") - ) - mime_data.setData( - 'application/x-qt-windows-mime;value="FileName"', - (str(file_path) + "\0").encode("mbcs", errors="replace") - ) - else: - # fallback for non-Windows - mime_data.setUrls([QUrl.fromLocalFile(str(file_path))]) - - drag.setMimeData(mime_data) - log.info(f"Starting drag for {file_path}") - drag.exec(Qt.CopyAction) - - def _get_stack_info(self, index: int) -> str: - info = "" - for i, (start, end) in enumerate(self.stacks): - if start <= index <= end: - count_in_stack = end - start + 1 - pos_in_stack = index - start + 1 - info = f"Stack {i+1} ({pos_in_stack}/{count_in_stack})" - break - if not info and self.stack_start_index is not None and self.stack_start_index == index: - info = "Stack Start Marked" - log.info(f"_get_stack_info for index {index}: {info}") - return info - - def get_stack_summary(self) -> str: - if not self.stacks: - return "No stacks defined." - summary = [] - for i, (start, end) in enumerate(self.stacks): - summary.append(f"Stack {i+1}: {start}-{end}") - return "; ".join(summary) - - def is_stacked(self) -> bool: - if not self.image_files: - return False - stem = self.image_files[self.current_index].path.stem - meta = self.sidecar.get_metadata(stem) - return meta.stacked - -def main(image_dir: Optional[Path] = typer.Argument(None, help="Directory of images to view")): - """FastStack Application Entry Point""" - setup_logging() - log.info("Starting FastStack") - - os.environ["QT_QUICK_CONTROLS_STYLE"] = "Material" - - app = QApplication(sys.argv) # Moved here - - if image_dir is None: - image_dir_str = config.get('core', 'default_directory') - if not image_dir_str: - log.warning("No image directory provided and no default directory set. Opening directory selection dialog.") - selected_dir = QFileDialog.getExistingDirectory(None, "Select Image Directory") - if not selected_dir: - log.error("No image directory selected. Exiting.") - sys.exit(1) - image_dir_str = selected_dir - image_dir = Path(image_dir_str) - - if not image_dir.is_dir(): - log.error(f"Image directory not found: {image_dir}") - sys.exit(1) - app.setOrganizationName("FastStack") - app.setOrganizationDomain("faststack.dev") - app.setApplicationName("FastStack") - - engine = QQmlApplicationEngine() - controller = AppController(image_dir, engine) - image_provider = ImageProvider(controller) - engine.addImageProvider("provider", image_provider) - - # Expose controller and UI state to QML - context = engine.rootContext() - context.setContextProperty("uiState", controller.ui_state) - context.setContextProperty("controller", controller) - - qml_file = Path(__file__).parent / "qml" / "Main.qml" - engine.load(QUrl.fromLocalFile(str(qml_file))) - - if not engine.rootObjects(): - log.error("Failed to load QML.") - sys.exit(-1) - - # Connect key events from the main window - main_window = engine.rootObjects()[0] - controller.main_window = main_window - main_window.installEventFilter(controller) - - # Load data and start services - controller.load() - - # Graceful shutdown - app.aboutToQuit.connect(controller.shutdown) - - sys.exit(app.exec()) - -if __name__ == "__main__": - typer.run(main) diff --git a/faststack/faststack/imaging/editor.py b/faststack/faststack/imaging/editor.py new file mode 100644 index 0000000..38a9a2b --- /dev/null +++ b/faststack/faststack/imaging/editor.py @@ -0,0 +1,296 @@ +import os +import shutil +import glob +from pathlib import Path +from typing import Optional, Dict, Any, Tuple +import numpy as np +from PIL import Image, ImageEnhance, ImageFilter +from io import BytesIO + +from faststack.models import DecodedImage +from PySide6.QtGui import QImage + +# Aspect Ratios for cropping +INSTAGRAM_RATIOS = { + "Freeform": None, + "1:1 (Square)": (1, 1), + "4:5 (Portrait)": (4, 5), + "1.91:1 (Landscape)": (191, 100), + "9:16 (Story)": (9, 16), +} + +class ImageEditor: + """Handles core image manipulation using PIL.""" + def __init__(self): + # Stores the currently loaded PIL Image object (original) + self.original_image: Optional[Image.Image] = None + # A smaller version of the original image for fast previews + self._preview_image: Optional[Image.Image] = None + # Stores the currently applied edits (used for preview) + self.current_edits: Dict[str, Any] = self._initial_edits() + self.current_filepath: Optional[Path] = None + + def _initial_edits(self) -> Dict[str, Any]: + return { + 'brightness': 0.0, + 'contrast': 0.0, + 'saturation': 0.0, + 'white_balance_by': 0.0, # Blue/Yellow (Cool/Warm) + 'white_balance_mg': 0.0, # Magenta/Green (Tint) + 'crop_box': None, # (left, top, right, bottom) normalized to 0-1000 + 'sharpness': 0.0, + 'rotation': 0, + 'exposure': 0.0, + 'highlights': 0.0, + 'shadows': 0.0, + 'vibrance': 0.0, + 'vignette': 0.0, + 'blacks': 0.0, + 'whites': 0.0, + 'clarity': 0.0, + } + + def load_image(self, filepath: str, cached_preview: Optional[DecodedImage] = None): + """Load a new image for editing.""" + if not filepath or not Path(filepath).exists(): + self.original_image = None + self.current_filepath = None + self._preview_image = None + return False + + self.current_filepath = Path(filepath) + # Reset edits + self.current_edits = self._initial_edits() + + try: + # We must load and close the original file handle immediately + self.original_image = Image.open(self.current_filepath).convert("RGB") + + # Use the cached, display-sized preview if available + if cached_preview: + self._preview_image = Image.frombytes( + "RGB", + (cached_preview.width, cached_preview.height), + bytes(cached_preview.buffer) + ) + else: + # Fallback: create a thumbnail if no preview is provided + self._preview_image = self.original_image.copy() + self._preview_image.thumbnail((1920, 1080)) # Reasonable fallback size + + return True + except Exception as e: + print(f"Error loading image for editing: {e}") + self.original_image = None + self._preview_image = None + return False + + def _apply_edits(self, img: Image.Image) -> Image.Image: + """Applies all current edits to the provided PIL Image.""" + # 1. Rotation + rotation = self.current_edits['rotation'] + if rotation == 90: + img = img.transpose(Image.Transpose.ROTATE_90) + elif rotation == 180: + img = img.transpose(Image.Transpose.ROTATE_180) + elif rotation == 270: + img = img.transpose(Image.Transpose.ROTATE_270) + + # 2. Cropping + crop_box = self.current_edits.get('crop_box') + if crop_box: + width, height = img.size + left = int(crop_box[0] * width / 1000) + top = int(crop_box[1] * height / 1000) + right = int(crop_box[2] * width / 1000) + bottom = int(crop_box[3] * height / 1000) + img = img.crop((left, top, right, bottom)) + + # 3. Exposure (gamma-based) + exposure = self.current_edits['exposure'] + if abs(exposure) > 0.001: + gamma = 1.0 / (1.0 + exposure) if exposure >= 0 else 1.0 - exposure + arr = np.array(img, dtype=np.float32) / 255.0 + arr = np.power(arr, gamma) + arr = (arr * 255).clip(0, 255).astype(np.uint8) + img = Image.fromarray(arr) + + # 4. Blacks/Whites (Levels) + blacks = self.current_edits['blacks'] + whites = self.current_edits['whites'] + if abs(blacks) > 0.001 or abs(whites) > 0.001: + arr = np.array(img, dtype=np.float32) + black_point = -blacks * 40 + white_point = 255 + whites * 40 + arr = (arr - black_point) * (255.0 / (white_point - black_point)) + img = Image.fromarray(arr.clip(0, 255).astype(np.uint8)) + + # 5. Highlights/Shadows + highlights = self.current_edits['highlights'] + shadows = self.current_edits['shadows'] + if abs(highlights) > 0.001 or abs(shadows) > 0.001: + arr = np.array(img, dtype=np.float32) + if abs(shadows) > 0.001: + shadow_mask = 1.0 - np.clip(arr / 128.0, 0, 1) + arr += shadows * 60 * shadow_mask + if abs(highlights) > 0.001: + highlight_mask = np.clip((arr - 128) / 127.0, 0, 1) + arr += highlights * 60 * highlight_mask + img = Image.fromarray(arr.clip(0, 255).astype(np.uint8)) + + # 6. Brightness + bright_factor = 1.0 + self.current_edits['brightness'] + if abs(bright_factor - 1.0) > 0.001: + img = ImageEnhance.Brightness(img).enhance(bright_factor) + + # 7. Contrast + contrast_factor = 1.0 + self.current_edits['contrast'] + if abs(contrast_factor - 1.0) > 0.001: + img = ImageEnhance.Contrast(img).enhance(contrast_factor) + + # 8. Clarity + clarity = self.current_edits['clarity'] + if abs(clarity) > 0.001: + arr = np.array(img, dtype=np.float32) + luminance = 0.299 * arr[:,:,0] + 0.587 * arr[:,:,1] + 0.114 * arr[:,:,2] + lum_img = Image.fromarray(luminance.astype(np.uint8)) + blurred = lum_img.filter(ImageFilter.GaussianBlur(radius=20)) + blurred_arr = np.array(blurred, dtype=np.float32) + midtone_mask = 1.0 - np.abs(luminance - 128) / 128.0 + local_contrast = (luminance - blurred_arr) * clarity * midtone_mask + for c in range(3): + arr[:,:,c] += local_contrast + img = Image.fromarray(arr.clip(0, 255).astype(np.uint8)) + + # 9. Saturation + saturation_factor = 1.0 + self.current_edits['saturation'] + if abs(saturation_factor - 1.0) > 0.001: + img = ImageEnhance.Color(img).enhance(saturation_factor) + + # 10. Vibrance + vibrance = self.current_edits['vibrance'] + if abs(vibrance) > 0.001: + arr = np.array(img, dtype=np.float32) + sat = (arr.max(axis=2) - arr.min(axis=2)) / 255.0 + boost = (1.0 - sat) * vibrance + gray = arr.mean(axis=2, keepdims=True) + arr = gray + (arr - gray) * (1.0 + boost[:, :, np.newaxis]) + img = Image.fromarray(arr.clip(0, 255).astype(np.uint8)) + + # 11. White Balance + by_val = self.current_edits['white_balance_by'] * 0.5 + mg_val = self.current_edits['white_balance_mg'] * 0.5 + if abs(by_val) > 0.001 or abs(mg_val) > 0.001: + arr = np.array(img, dtype=np.float32) + by_shift = by_val * 127.5 + mg_shift = mg_val * 127.5 + arr[:, :, 0] += by_shift + mg_shift + arr[:, :, 1] += by_shift - mg_shift + arr[:, :, 2] -= by_shift - mg_shift + np.clip(arr, 0, 255, out=arr) + img = Image.fromarray(arr.astype(np.uint8)) + + # 12. Sharpness + sharp_factor = 1.0 + self.current_edits['sharpness'] + if abs(sharp_factor - 1.0) > 0.001: + img = ImageEnhance.Sharpness(img).enhance(sharp_factor) + + # 13. Vignette + vignette = self.current_edits['vignette'] + if vignette > 0.001: + arr = np.array(img, dtype=np.float32) + h, w = arr.shape[:2] + y, x = np.ogrid[:h, :w] + cx, cy = w / 2, h / 2 + dist = np.sqrt((x - cx)**2 + (y - cy)**2) + max_dist = np.sqrt(cx**2 + cy**2) + dist = dist / max_dist + vignette_mask = 1.0 - (dist ** 2) * vignette + vignette_mask = vignette_mask[:, :, np.newaxis] + arr = arr * vignette_mask + img = Image.fromarray(arr.clip(0, 255).astype(np.uint8)) + + return img + + def get_preview_data(self) -> Optional[DecodedImage]: + """Apply current edits and return the data as a DecodedImage.""" + if self._preview_image is None: + return None + + # Always start from a fresh copy of the small preview image + img = self._preview_image.copy() + img = self._apply_edits(img) + + # The image is in RGB mode after _apply_edits + buffer = img.tobytes() + return DecodedImage( + buffer=memoryview(buffer), + width=img.width, + height=img.height, + bytes_per_line=img.width * 3, # 3 bytes per pixel for RGB + format=QImage.Format.Format_RGB888 + ) + + def set_edit_param(self, key: str, value: Any) -> bool: + """Update a single edit parameter.""" + if key in self.current_edits and key != 'crop_box': + self.current_edits[key] = value + return True + return False + + def set_crop_box(self, crop_box: Tuple[int, int, int, int]): + """Set the normalized crop box (left, top, right, bottom) from 0-1000.""" + self.current_edits['crop_box'] = crop_box + + def save_image(self) -> Optional[Path]: + """Saves the edited image, backing up the original.""" + if self.original_image is None or self.current_filepath is None: + return None + + final_img = self.original_image.copy() + final_img = self._apply_edits(final_img) + + original_path = self.current_filepath + + # Extract base name without any existing -backup suffix + stem = original_path.stem + # Remove any existing -backup, -backup2, -backup-1, etc. (handles both old and new formats) + import re + base_stem = re.sub(r'-backup(-?\d+)?$', '', stem) + + # Try filename-backup.jpg first + backup_path = original_path.parent / f"{base_stem}-backup{original_path.suffix}" + + # If that exists, try filename-backup2.jpg, filename-backup3.jpg, etc. + i = 2 + while backup_path.exists(): + backup_path = original_path.parent / f"{base_stem}-backup{i}{original_path.suffix}" + i += 1 + + try: + # Perform the backup and overwrite + shutil.copy2(original_path, backup_path) + + # Preserve EXIF data from original image + try: + # Load the original image again to extract EXIF + original_img = Image.open(original_path) + exif_data = original_img.info.get('exif') + + # Save with EXIF data preserved + if exif_data: + final_img.save(original_path, format='JPEG', quality=95, exif=exif_data) + else: + final_img.save(original_path, format='JPEG', quality=95) + except Exception as e: + print(f"Warning: Could not preserve EXIF data: {e}") + # Fall back to saving without EXIF if there's an issue + final_img.save(original_path, format='JPEG', quality=95) + + return original_path + except Exception as e: + print(f"Failed to save edited image or backup: {e}") + return None + +# Dictionary of ratios for QML dropdown +ASPECT_RATIOS = [{"name": name, "ratio": ratio} for name, ratio in INSTAGRAM_RATIOS.items()] diff --git a/faststack/faststack/imaging/jpeg.py b/faststack/faststack/imaging/jpeg.py index 9672749..cfaa316 100644 --- a/faststack/faststack/imaging/jpeg.py +++ b/faststack/faststack/imaging/jpeg.py @@ -9,15 +9,24 @@ log = logging.getLogger(__name__) # Attempt to import PyTurboJPEG + try: from turbojpeg import TurboJPEG, TJPF_RGB - jpeg_decoder = TurboJPEG() - TURBO_AVAILABLE = True - log.info("PyTurboJPEG is available. Using for JPEG decoding.") except ImportError: jpeg_decoder = None TURBO_AVAILABLE = False log.warning("PyTurboJPEG not found. Falling back to Pillow for JPEG decoding.") +else: + try: + jpeg_decoder = TurboJPEG() + except Exception: + jpeg_decoder = None + TURBO_AVAILABLE = False + log.exception("PyTurboJPEG initialization failed. Falling back to Pillow.") + else: + TURBO_AVAILABLE = True + log.info("PyTurboJPEG is available. Using it for JPEG decoding.") + def decode_jpeg_rgb(jpeg_bytes: bytes) -> Optional[np.ndarray]: """Decodes JPEG bytes into an RGB numpy array.""" @@ -29,7 +38,7 @@ def decode_jpeg_rgb(jpeg_bytes: bytes) -> Optional[np.ndarray]: except Exception as e: log.exception(f"PyTurboJPEG failed to decode image: {e}. Trying Pillow.") # Fall through to Pillow fallback - + # Fallback to Pillow try: from io import BytesIO @@ -39,8 +48,9 @@ def decode_jpeg_rgb(jpeg_bytes: bytes) -> Optional[np.ndarray]: log.exception(f"Pillow also failed to decode image: {e}") return None + def decode_jpeg_thumb_rgb( - jpeg_bytes: bytes, + jpeg_bytes: bytes, max_dim: int = 256 ) -> Optional[np.ndarray]: """Decodes a JPEG into a thumbnail-sized RGB numpy array.""" @@ -48,10 +58,10 @@ def decode_jpeg_thumb_rgb( try: # Get image header to determine dimensions width, height, _, _ = jpeg_decoder.decode_header(jpeg_bytes) - + # Find the best scaling factor scaling_factor = _get_turbojpeg_scaling_factor(width, height, max_dim) - + decoded = jpeg_decoder.decode( jpeg_bytes, scaling_factor=scaling_factor, @@ -76,6 +86,7 @@ def decode_jpeg_thumb_rgb( log.exception(f"Pillow also failed to decode thumbnail: {e}") return None + def _get_turbojpeg_scaling_factor(width: int, height: int, max_dim: int) -> Optional[Tuple[int, int]]: """Finds the best libjpeg-turbo scaling factor to get a thumbnail <= max_dim.""" if not TURBO_AVAILABLE or not jpeg_decoder: diff --git a/faststack/faststack/io/helicon.py b/faststack/faststack/io/helicon.py index 08bd032..86ac9f0 100644 --- a/faststack/faststack/io/helicon.py +++ b/faststack/faststack/io/helicon.py @@ -20,7 +20,8 @@ def launch_helicon_focus(raw_files: List[Path]) -> Tuple[bool, Optional[Path]]: raw_files: A list of absolute paths to RAW files. Returns: - True if the process was launched successfully, False otherwise. + Tuple of (success: bool, tmp_path: Optional[Path]). + Returns (True, tmp_path) if launched successfully, (False, None) otherwise. """ helicon_exe = config.get("helicon", "exe") if not helicon_exe or not isinstance(helicon_exe, str): diff --git a/faststack/faststack/qml/Components.qml b/faststack/faststack/qml/Components.qml index 2b60b4a..f8e510b 100644 --- a/faststack/faststack/qml/Components.qml +++ b/faststack/faststack/qml/Components.qml @@ -8,6 +8,7 @@ Item { id: loupeView anchors.fill: parent + // Connection to handle zoom/pan reset signal from Python Connections { target: uiState @@ -26,6 +27,8 @@ Item { source: uiState && uiState.imageCount > 0 ? uiState.currentImageSource : "" fillMode: Image.PreserveAspectFit cache: false // We do our own caching in Python + smooth: uiState && !uiState.anySliderPressed + mipmap: uiState && !uiState.anySliderPressed Component.onCompleted: { if (width > 0 && height > 0) { diff --git a/faststack/faststack/qml/ImageEditorDialog.qml b/faststack/faststack/qml/ImageEditorDialog.qml new file mode 100644 index 0000000..07c3c43 --- /dev/null +++ b/faststack/faststack/qml/ImageEditorDialog.qml @@ -0,0 +1,230 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Controls.Material 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Window 2.15 + +Window { + id: editDialog + width: 720 + height: 700 + title: "Image Editor" + visible: uiState.isEditorOpen + flags: Qt.Window | Qt.WindowTitleHint | Qt.WindowCloseButtonHint + property int updatePulse: 0 + + Material.theme: uiState.theme === 0 ? Material.Dark : Material.Light + Material.accent: "#4fb360" + + // When the dialog is closed by the user (e.g. clicking X), update the state + onVisibleChanged: { + if (!visible) { + uiState.isEditorOpen = false + } + } + + property int slidersPressedCount: 0 + onSlidersPressedCountChanged: { + uiState.setAnySliderPressed(slidersPressedCount > 0) + } + + function getBackendValue(key) { + var _dependency = updatePulse; + if (key in uiState) return uiState[key]; + return 0.0; + } + + // Background + color: "#2b2b2b" + + ScrollView { + anchors.fill: parent + anchors.margins: 10 + clip: true + contentWidth: availableWidth + + RowLayout { + width: parent.width + spacing: 20 + + ColumnLayout { // Left Column + Layout.fillWidth: true + Layout.preferredWidth: (parent.width - 20) / 2 + Layout.alignment: Qt.AlignTop + spacing: 2 + + // --- Light Group --- + Label { text: "Light"; font.bold: true; color: uiState.theme === 0 ? "white" : "black" } + ListModel { + id: lightModel + ListElement { name: "Exposure"; key: "exposure" } + ListElement { name: "Highlights"; key: "highlights" } + ListElement { name: "Shadows"; key: "shadows" } + ListElement { name: "Whites"; key: "whites" } + ListElement { name: "Blacks"; key: "blacks" } + ListElement { name: "Brightness"; key: "brightness" } + ListElement { name: "Contrast"; key: "contrast" } + } + Repeater { model: lightModel; delegate: editSlider } + + // --- Detail Group --- + Label { text: "Detail"; font.bold: true; color: uiState.theme === 0 ? "white" : "black"; Layout.topMargin: 10 } + ListModel { + id: detailModel + ListElement { name: "Clarity"; key: "clarity" } + ListElement { name: "Sharpness"; key: "sharpness" } + } + Repeater { model: detailModel; delegate: editSlider } + } + + ColumnLayout { // Right Column + Layout.fillWidth: true + Layout.preferredWidth: (parent.width - 20) / 2 + Layout.alignment: Qt.AlignTop + spacing: 2 + + // --- Color Group --- + Label { text: "Color"; font.bold: true; color: uiState.theme === 0 ? "white" : "black" } + ListModel { + id: colorModel + ListElement { name: "Saturation"; key: "saturation"; reverse: false } + ListElement { name: "Vibrance"; key: "vibrance"; reverse: false } + ListElement { name: "White Balance (B/Y)"; key: "white_balance_by"; reverse: false } + ListElement { name: "White Balance (G/M)"; key: "white_balance_mg"; reverse: false } + } + Repeater { model: colorModel; delegate: editSlider } + + Button { + text: "Auto White Balance" + Layout.fillWidth: true + Layout.topMargin: 5 + onClicked: { + controller.auto_white_balance() + editDialog.updatePulse++ + } + } + + // --- Effects Group --- + Label { text: "Effects"; font.bold: true; color: uiState.theme === 0 ? "white" : "black"; Layout.topMargin: 10 } + ListModel { + id: effectsModel + ListElement { name: "Vignette"; key: "vignette"; min: 0; max: 100 } + } + Repeater { model: effectsModel; delegate: editSlider } + + // --- Transform Group --- + Label { text: "Transform"; font.bold: true; color: uiState.theme === 0 ? "white" : "black"; Layout.topMargin: 10 } + RowLayout { + Layout.fillWidth: true + Label { text: "Rotation"; color: uiState.theme === 0 ? "white" : "black" } + Button { text: "↶"; onClicked: controller.rotate_image_ccw() } + Button { text: "↷"; onClicked: controller.rotate_image_cw() } + } + + // --- Action Buttons --- + Item { Layout.fillHeight: true; Layout.minimumHeight: 20 } + Button { + text: "Reset All Edits" + Layout.fillWidth: true + onClicked: { + controller.reset_edit_parameters() + editDialog.updatePulse++ + } + } + Button { + text: "Save Edited Image (Ctrl+S)" + Layout.fillWidth: true + onClicked: controller.save_edited_image() + } + Button { + text: "Close Editor (E)" + Layout.fillWidth: true + onClicked: { + uiState.isEditorOpen = false + } + } + } + } + } + + Component { + id: editSlider + ColumnLayout { + Layout.fillWidth: true + spacing: 0 + + property bool isReversed: model.reverse !== undefined ? model.reverse : false + property real displayValue: isReversed ? -slider.value : slider.value + + Text { + text: model.name + ": " + displayValue.toFixed(0) + color: uiState.theme === 0 ? "white" : "black" + font.pixelSize: 14 + wrapMode: Text.WordWrap + Layout.fillWidth: true + } + Slider { + id: slider + Layout.fillWidth: true + Layout.minimumHeight: 30 + from: model.min === undefined ? -100 : model.min + to: model.max === undefined ? 100 : model.max + stepSize: 1 + + property real backendValue: { + var val = editDialog.getBackendValue(model.key) * (model.max === undefined ? 100 : model.max) + return isReversed ? -val : val + } + + value: backendValue + + Connections { + target: editDialog + function onUpdatePulseChanged() { + if (!slider.pressed) { + // This forces the visual handle to snap to the backendValue + // even if backendValue hasn't numerically changed (e.g. 0 -> 0) + slider.value = slider.backendValue + } + } + } + + onMoved: { + var sendValue = isReversed ? -value : value + controller.set_edit_parameter(model.key, sendValue / (model.max === undefined ? 100.0 : model.max)) + } + + onPressedChanged: { + if (pressed) editDialog.slidersPressedCount++; else editDialog.slidersPressedCount--; + } + + onBackendValueChanged: { + // Check '!pressed' to avoid fighting the user if they are + // currently dragging the slider while an update comes in. + if (!pressed) { + value = backendValue + } + } + + background: Rectangle { + x: slider.leftPadding + y: slider.topPadding + slider.availableHeight / 2 - height / 2 + width: slider.availableWidth + height: 4 + radius: 2 + color: "#404040" + } + + handle: Rectangle { + x: slider.leftPadding + slider.visualPosition * (slider.availableWidth - width) + y: slider.topPadding + slider.availableHeight / 2 - height / 2 + width: 16 + height: 16 + radius: 8 + color: slider.pressed ? "#4fb360" : "#6fcf7c" + border.color: "#3d8a4a" + } + } + } + } +} diff --git a/faststack/faststack/qml/ImageEditorDialog.qml.new b/faststack/faststack/qml/ImageEditorDialog.qml.new new file mode 100644 index 0000000..550be81 --- /dev/null +++ b/faststack/faststack/qml/ImageEditorDialog.qml.new @@ -0,0 +1,219 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Controls.Material 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Window 2.15 +import Qt5Compat.GraphicalEffects + +Window { + id: editDialog + width: 720 + height: 600 + title: "Image Editor" + visible: uiState.isEditorOpen + flags: Qt.Window | Qt.WindowTitleHint | Qt.WindowCloseButtonHint + + Material.theme: uiState.theme === 0 ? Material.Dark : Material.Light + Material.accent: "#4fb360" + + // When the dialog is closed by the user (e.g. clicking X), update the state + onVisibleChanged: { + if (!visible) { + uiState.isEditorOpen = false + } + } + + property int slidersPressedCount: 0 + onSlidersPressedCountChanged: { + uiState.setAnySliderPressed(slidersPressedCount > 0) + } + + function getBackendValue(key) { + if (key in uiState) return uiState[key]; + return 0.0; + } + + // Background + color: "#2b2b2b" + + ScrollView { + anchors.fill: parent + anchors.margins: 10 + clip: true + contentWidth: availableWidth + + RowLayout { + width: parent.width + spacing: 20 + + ColumnLayout { // Left Column + Layout.fillWidth: true + Layout.preferredWidth: (parent.width - 20) / 2 + Layout.alignment: Qt.AlignTop + spacing: 2 + + // --- Light Group --- + Label { text: "Light"; font.bold: true; color: uiState.theme === 0 ? "white" : "black" } + ListModel { + id: lightModel + ListElement { name: "Exposure"; key: "exposure" } + ListElement { name: "Highlights"; key: "highlights" } + ListElement { name: "Shadows"; key: "shadows" } + ListElement { name: "Whites"; key: "whites"; reverse: true } + ListElement { name: "Blacks"; key: "blacks" } + ListElement { name: "Brightness"; key: "brightness" } + ListElement { name: "Contrast"; key: "contrast" } + } + Repeater { model: lightModel; delegate: editSlider } + + // --- Detail Group --- + Label { text: "Detail"; font.bold: true; color: uiState.theme === 0 ? "white" : "black"; Layout.topMargin: 10 } + ListModel { + id: detailModel + ListElement { name: "Clarity"; key: "clarity" } + ListElement { name: "Sharpness"; key: "sharpness" } + } + Repeater { model: detailModel; delegate: editSlider } + } + + ColumnLayout { // Right Column + Layout.fillWidth: true + Layout.preferredWidth: (parent.width - 20) / 2 + Layout.alignment: Qt.AlignTop + spacing: 2 + + // --- Color Group --- + Label { text: "Color"; font.bold: true; color: uiState.theme === 0 ? "white" : "black" } + ListModel { + id: colorModel + ListElement { name: "Saturation"; key: "saturation"; reverse: false } + ListElement { name: "Vibrance"; key: "vibrance"; reverse: false } + ListElement { name: "White Balance (B/Y)"; key: "white_balance_by"; reverse: false } + ListElement { name: "White Balance (G/M)"; key: "white_balance_mg"; reverse: false } + } + Repeater { model: colorModel; delegate: editSlider } + + // --- Effects Group --- + Label { text: "Effects"; font.bold: true; color: uiState.theme === 0 ? "white" : "black"; Layout.topMargin: 10 } + ListModel { + id: effectsModel + ListElement { name: "Vignette"; key: "vignette"; min: 0; max: 100 } + } + Repeater { model: effectsModel; delegate: editSlider } + + // --- Transform Group --- + Label { text: "Transform"; font.bold: true; color: uiState.theme === 0 ? "white" : "black"; Layout.topMargin: 10 } + RowLayout { + Layout.fillWidth: true + Label { text: "Rotation"; color: uiState.theme === 0 ? "white" : "black" } + Button { text: "↶"; onClicked: controller.rotate_image_ccw() } + Button { text: "↷"; onClicked: controller.rotate_image_cw() } + } + + // --- Action Buttons --- + Item { Layout.fillHeight: true; Layout.minimumHeight: 20 } + Button { + text: "Reset All Edits" + Layout.fillWidth: true + onClicked: controller.reset_edit_parameters() + } + Button { + text: "Save Edited Image (Ctrl+S)" + Layout.fillWidth: true + onClicked: controller.save_edited_image() + } + Button { + text: "Close Editor (E)" + Layout.fillWidth: true + onClicked: { + uiState.isEditorOpen = false + } + } + } + } + } + + Component { + id: editSlider + ColumnLayout { + Layout.fillWidth: true + spacing: 0 + + property bool isReversed: model.reverse !== undefined ? model.reverse : false + property real displayValue: isReversed ? -slider.value : slider.value + + Text { + text: model.name + ": " + displayValue.toFixed(0) + color: uiState.theme === 0 ? "white" : "black" + font.pixelSize: 14 + wrapMode: Text.WordWrap + Layout.fillWidth: true + } + Slider { + id: slider + Layout.fillWidth: true + Layout.minimumHeight: 30 + from: model.min === undefined ? -100 : model.min + to: model.max === undefined ? 100 : model.max + stepSize: 1 + + property real backendValue: { + var val = editDialog.getBackendValue(model.key) * (model.max === undefined ? 100 : model.max) + return isReversed ? -val : val + } + + value: backendValue + + onMoved: { + var sendValue = isReversed ? -value : value + controller.set_edit_parameter(model.key, sendValue / (model.max === undefined ? 100.0 : model.max)) + } + + onPressedChanged: { + if (pressed) editDialog.slidersPressedCount++; else editDialog.slidersPressedCount--; + } + + background: Rectangle { + implicitHeight: 8 + radius: 4 + color: "#333333" + + Rectangle { + width: slider.visualPosition * parent.width + height: parent.height + radius: 4 + gradient: Gradient { + GradientStop { position: 0.0; color: "#6fcf7c" } + GradientStop { position: 1.0; color: "#4fb360" } + } + } + } + + handle: Rectangle { + x: slider.leftPadding + slider.visualPosition * (slider.availableWidth - width) + y: slider.topPadding + slider.availableHeight / 2 - height / 2 + implicitWidth: 24 + implicitHeight: 24 + radius: 12 + color: slider.pressed ? "#4fb360" : "white" + border.color: "#4fb360" + border.width: 3 + + Behavior on width { NumberAnimation { duration: 120 } } + Behavior on height { NumberAnimation { duration: 120 } } + + // Optional: subtle shadow + layer.enabled: true + layer.effect: Shadow { + radius: 8 + samples: 17 + color: "#80000000" + verticalOffset: 2 + horizontalOffset: 0 + } + } + + } + } + } +} diff --git a/faststack/faststack/qml/ImageEditorDialog.qml.old b/faststack/faststack/qml/ImageEditorDialog.qml.old new file mode 100644 index 0000000..a17ee0d --- /dev/null +++ b/faststack/faststack/qml/ImageEditorDialog.qml.old @@ -0,0 +1,196 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Controls.Material 2.15 +import QtQuick.Layouts 1.15 +import QtQuick.Window 2.15 + +Window { + id: editDialog + width: 720 + height: 600 + title: "Image Editor" + visible: uiState.isEditorOpen + flags: Qt.Window | Qt.WindowTitleHint | Qt.WindowCloseButtonHint + + Material.theme: uiState.theme === 0 ? Material.Dark : Material.Light + Material.accent: "#4fb360" + + // When the dialog is closed by the user (e.g. clicking X), update the state + onVisibleChanged: { + if (!visible) { + uiState.isEditorOpen = false + } + } + + property int slidersPressedCount: 0 + onSlidersPressedCountChanged: { + uiState.setAnySliderPressed(slidersPressedCount > 0) + } + + function getBackendValue(key) { + if (key in uiState) return uiState[key]; + return 0.0; + } + + // Background + color: "#2b2b2b" + + ScrollView { + anchors.fill: parent + anchors.margins: 10 + clip: true + contentWidth: availableWidth + + RowLayout { + width: parent.width + spacing: 20 + + ColumnLayout { // Left Column + Layout.fillWidth: true + Layout.preferredWidth: (parent.width - 20) / 2 + Layout.alignment: Qt.AlignTop + spacing: 2 + + // --- Light Group --- + Label { text: "Light"; font.bold: true; color: uiState.theme === 0 ? "white" : "black" } + ListModel { + id: lightModel + ListElement { name: "Exposure"; key: "exposure" } + ListElement { name: "Highlights"; key: "highlights" } + ListElement { name: "Shadows"; key: "shadows" } + ListElement { name: "Whites"; key: "whites" } + ListElement { name: "Blacks"; key: "blacks" } + ListElement { name: "Brightness"; key: "brightness" } + ListElement { name: "Contrast"; key: "contrast" } + } + Repeater { model: lightModel; delegate: editSlider } + + // --- Detail Group --- + Label { text: "Detail"; font.bold: true; color: uiState.theme === 0 ? "white" : "black"; Layout.topMargin: 10 } + ListModel { + id: detailModel + ListElement { name: "Clarity"; key: "clarity" } + ListElement { name: "Sharpness"; key: "sharpness" } + } + Repeater { model: detailModel; delegate: editSlider } + } + + ColumnLayout { // Right Column + Layout.fillWidth: true + Layout.preferredWidth: (parent.width - 20) / 2 + Layout.alignment: Qt.AlignTop + spacing: 2 + + // --- Color Group --- + Label { text: "Color"; font.bold: true; color: uiState.theme === 0 ? "white" : "black" } + ListModel { + id: colorModel + ListElement { name: "Saturation"; key: "saturation"; reverse: false } + ListElement { name: "Vibrance"; key: "vibrance"; reverse: false } + ListElement { name: "White Balance (B/Y)"; key: "white_balance_by"; reverse: false } + ListElement { name: "White Balance (G/M)"; key: "white_balance_mg"; reverse: false } + } + Repeater { model: colorModel; delegate: editSlider } + + // --- Effects Group --- + Label { text: "Effects"; font.bold: true; color: uiState.theme === 0 ? "white" : "black"; Layout.topMargin: 10 } + ListModel { + id: effectsModel + ListElement { name: "Vignette"; key: "vignette"; min: 0; max: 100 } + } + Repeater { model: effectsModel; delegate: editSlider } + + // --- Transform Group --- + Label { text: "Transform"; font.bold: true; color: uiState.theme === 0 ? "white" : "black"; Layout.topMargin: 10 } + RowLayout { + Layout.fillWidth: true + Label { text: "Rotation"; color: uiState.theme === 0 ? "white" : "black" } + Button { text: "↶"; onClicked: controller.rotate_image_ccw() } + Button { text: "↷"; onClicked: controller.rotate_image_cw() } + } + + // --- Action Buttons --- + Item { Layout.fillHeight: true; Layout.minimumHeight: 20 } + Button { + text: "Reset All Edits" + Layout.fillWidth: true + onClicked: controller.reset_edit_parameters() + } + Button { + text: "Save Edited Image (Ctrl+S)" + Layout.fillWidth: true + onClicked: controller.save_edited_image() + } + Button { + text: "Close Editor (E)" + Layout.fillWidth: true + onClicked: { + uiState.isEditorOpen = false + } + } + } + } + } + + Component { + id: editSlider + ColumnLayout { + Layout.fillWidth: true + spacing: 0 + + property bool isReversed: model.reverse !== undefined ? model.reverse : false + property real displayValue: isReversed ? -slider.value : slider.value + + Text { + text: model.name + ": " + displayValue.toFixed(0) + color: uiState.theme === 0 ? "white" : "black" + font.pixelSize: 14 + wrapMode: Text.WordWrap + Layout.fillWidth: true + } + Slider { + id: slider + Layout.fillWidth: true + Layout.minimumHeight: 30 + from: model.min === undefined ? -100 : model.min + to: model.max === undefined ? 100 : model.max + stepSize: 1 + + property real backendValue: { + var val = editDialog.getBackendValue(model.key) * (model.max === undefined ? 100 : model.max) + return isReversed ? -val : val + } + + value: backendValue + + onMoved: { + var sendValue = isReversed ? -value : value + controller.set_edit_parameter(model.key, sendValue / (model.max === undefined ? 100.0 : model.max)) + } + + onPressedChanged: { + if (pressed) editDialog.slidersPressedCount++; else editDialog.slidersPressedCount--; + } + + background: Rectangle { + x: slider.leftPadding + y: slider.topPadding + slider.availableHeight / 2 - height / 2 + width: slider.availableWidth + height: 4 + radius: 2 + color: "#404040" + } + + handle: Rectangle { + x: slider.leftPadding + slider.visualPosition * (slider.availableWidth - width) + y: slider.topPadding + slider.availableHeight / 2 - height / 2 + width: 16 + height: 16 + radius: 8 + color: slider.pressed ? "#4fb360" : "#6fcf7c" + border.color: "#3d8a4a" + } + } + } + } +} diff --git a/faststack/faststack/qml/Main.qml b/faststack/faststack/qml/Main.qml index c14b1a5..d198544 100644 --- a/faststack/faststack/qml/Main.qml +++ b/faststack/faststack/qml/Main.qml @@ -12,20 +12,25 @@ ApplicationWindow { height: 800 minimumWidth: 800 minimumHeight: 500 - flags: Qt.FramelessWindowHint | Qt.Window title: "FastStack" - Material.theme: uiState.theme === 0 ? Material.Dark : Material.Light + Component.onCompleted: { + // Initialization complete + } + + Material.theme: (uiState && uiState.theme === 0) ? Material.Dark : Material.Light Material.accent: "#4fb360" - property bool isDarkTheme: uiState.theme === 0 + property bool isDarkTheme: uiState ? uiState.theme === 0 : true property color currentBackgroundColor: isDarkTheme ? "#000000" : "white" property color currentTextColor: isDarkTheme ? "white" : "black" background: Rectangle { color: root.currentBackgroundColor } function toggleTheme() { - uiState.theme = (uiState.theme === 0 ? 1 : 0) // 0 for dark, 1 for light + if (uiState) { + uiState.theme = (uiState.theme === 0 ? 1 : 0) + } } Connections { @@ -35,20 +40,584 @@ ApplicationWindow { } } - // Expose the Python UIState object to QML - // This is set from Python via setContextProperty("uiState", ...) + // -------- FLOATING MENU BAR (overlays content) -------- + Rectangle { + id: floatingMenuBar + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + height: 40 + color: "transparent" + z: 100 // Ensure it's above the content + + // Unified "menu active" flag to avoid flashing + property bool menuActive: menuBarMouseArea.containsMouse + || fileMouseArea.containsMouse + || viewMouseArea.containsMouse + || actionsMouseArea.containsMouse + || helpMouseArea.containsMouse + || fileMenu.visible + || viewMenu.visible + || actionsMenu.visible + || helpMenu.visible + + // Semi-transparent background that appears on hover + Rectangle { + anchors.fill: parent + color: root.isDarkTheme ? "#333333" : "#f0f0f0" + opacity: floatingMenuBar.menuActive ? 0.9 : 0.0 - // Main view: either the loupe viewer or the grid - Loader { - id: mainViewLoader - anchors.fill: parent - anchors.topMargin: titleBar.height - source: "Components.qml" + Behavior on opacity { + NumberAnimation { duration: 150 } + } + } + + MouseArea { + id: menuBarMouseArea + anchors.fill: parent + hoverEnabled: true + propagateComposedEvents: true + + // Don't block clicks - let them pass through to children + onClicked: function(mouse) { mouse.accepted = false } + onPressed: function(mouse) { mouse.accepted = false } + onReleased: function(mouse) { mouse.accepted = false } + } + + Row { + id: menuButtonRow + anchors.left: parent.left + anchors.leftMargin: 8 + anchors.verticalCenter: parent.verticalCenter + spacing: 4 + + // Show whenever any menu is hovered or open + visible: floatingMenuBar.menuActive + + // FILE MENU BUTTON + Rectangle { + id: fileBtn + width: fileLabel.width + 20 + height: 30 + color: fileMouseArea.containsMouse ? (root.isDarkTheme ? "#555555" : "#e0e0e0") : "transparent" + radius: 4 + + Text { + id: fileLabel + anchors.centerIn: parent + text: "File" + color: root.currentTextColor + font.pixelSize: 14 + } + + MouseArea { + id: fileMouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: { + var pos = fileBtn.mapToItem(null, 0, fileBtn.height) + fileMenu.popup(pos.x, pos.y) + } + } + } + + // VIEW MENU BUTTON + Rectangle { + id: viewBtn + width: viewLabel.width + 20 + height: 30 + color: viewMouseArea.containsMouse ? (root.isDarkTheme ? "#555555" : "#e0e0e0") : "transparent" + radius: 4 + + Text { + id: viewLabel + anchors.centerIn: parent + text: "View" + color: root.currentTextColor + font.pixelSize: 14 + } + + MouseArea { + id: viewMouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: { + var pos = viewBtn.mapToItem(null, 0, viewBtn.height) + viewMenu.popup(pos.x, pos.y) + } + } + } + + // ACTIONS MENU BUTTON + Rectangle { + id: actionsBtn + width: actionsLabel.width + 20 + height: 30 + color: actionsMouseArea.containsMouse ? (root.isDarkTheme ? "#555555" : "#e0e0e0") : "transparent" + radius: 4 + + Text { + id: actionsLabel + anchors.centerIn: parent + text: "Actions" + color: root.currentTextColor + font.pixelSize: 14 + } + + MouseArea { + id: actionsMouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: { + var pos = actionsBtn.mapToItem(null, 0, actionsBtn.height) + actionsMenu.popup(pos.x, pos.y) + } + } + } + + // HELP MENU BUTTON + Rectangle { + id: helpBtn + width: helpLabel.width + 20 + height: 30 + color: helpMouseArea.containsMouse ? (root.isDarkTheme ? "#555555" : "#e0e0e0") : "transparent" + radius: 4 + + Text { + id: helpLabel + anchors.centerIn: parent + text: "Help" + color: root.currentTextColor + font.pixelSize: 14 + } + + MouseArea { + id: helpMouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: { + var pos = helpBtn.mapToItem(null, 0, helpBtn.height) + helpMenu.popup(pos.x, pos.y) + } + } + } + } } - // Keyboard focus and event handling + // -------- MENU POPUPS -------- + Menu { + id: fileMenu + parent: Overlay.overlay + implicitWidth: 200 + + background: Rectangle { + implicitWidth: 200 + implicitHeight: fileMenuColumn.implicitHeight + color: root.isDarkTheme ? "#424242" : "#ffffff" + border.color: root.isDarkTheme ? "#666666" : "#cccccc" + radius: 4 + } + + contentItem: Column { + id: fileMenuColumn - // Status bar + ItemDelegate { + width: 200 + height: 36 + text: "Open Folder..." + onClicked: { + console.log("Open folder triggered") + fileMenu.close() + } + background: Rectangle { + color: parent.hovered ? (root.isDarkTheme ? "#555555" : "#e0e0e0") : "transparent" + } + contentItem: Text { + text: parent.text + color: root.currentTextColor + verticalAlignment: Text.AlignVCenter + leftPadding: 10 + } + } + ItemDelegate { + width: 200 + height: 36 + text: "Settings..." + onClicked: { + if (uiState) { + settingsDialog.heliconPath = uiState.get_helicon_path() + settingsDialog.photoshopPath = uiState.get_photoshop_path() + settingsDialog.cacheSize = uiState.get_cache_size() + settingsDialog.prefetchRadius = uiState.get_prefetch_radius() + settingsDialog.theme = uiState.theme + settingsDialog.defaultDirectory = uiState.get_default_directory() + } + settingsDialog.open() + fileMenu.close() + } + background: Rectangle { + color: parent.hovered ? (root.isDarkTheme ? "#555555" : "#e0e0e0") : "transparent" + } + contentItem: Text { + text: parent.text + color: root.currentTextColor + verticalAlignment: Text.AlignVCenter + leftPadding: 10 + } + } + Rectangle { + width: 200 + height: 1 + color: root.isDarkTheme ? "#666666" : "#cccccc" + } + ItemDelegate { + width: 200 + height: 36 + text: "Exit" + onClicked: Qt.quit() + background: Rectangle { + color: parent.hovered ? (root.isDarkTheme ? "#555555" : "#e0e0e0") : "transparent" + } + contentItem: Text { + text: parent.text + color: root.currentTextColor + verticalAlignment: Text.AlignVCenter + leftPadding: 10 + } + } + } + } + + Menu { + id: viewMenu + parent: Overlay.overlay + implicitWidth: 220 + + background: Rectangle { + implicitWidth: 220 + implicitHeight: viewMenuColumn.implicitHeight + color: root.isDarkTheme ? "#424242" : "#ffffff" + border.color: root.isDarkTheme ? "#666666" : "#cccccc" + radius: 4 + } + + contentItem: Column { + id: viewMenuColumn + + // Toggle theme + ItemDelegate { + width: 220 + height: 36 + text: "Toggle Light/Dark Mode" + onClicked: { + root.toggleTheme() + viewMenu.close() + } + background: Rectangle { + color: parent.hovered ? (root.isDarkTheme ? "#555555" : "#e0e0e0") : "transparent" + } + contentItem: Text { + text: parent.text + color: root.currentTextColor + verticalAlignment: Text.AlignVCenter + leftPadding: 10 + } + } + + // Separator + Rectangle { + width: 220 + height: 1 + color: root.isDarkTheme ? "#666666" : "#cccccc" + } + + // Color: None (Original) + ItemDelegate { + width: 220 + height: 36 + text: "Color: None (Original)" + onClicked: { + if (controller) controller.set_color_mode("none") + if (uiState) uiState.colorMode = "none" + viewMenu.close() + } + background: Rectangle { + color: parent.hovered ? (root.isDarkTheme ? "#555555" : "#e0e0e0") + : ((uiState && uiState.colorMode === "none") + ? (root.isDarkTheme ? "#505050" : "#d0ffd0") + : "transparent") + } + contentItem: Text { + text: parent.text + color: root.currentTextColor + font.bold: uiState && uiState.colorMode === "none" + verticalAlignment: Text.AlignVCenter + leftPadding: 10 + } + } + + // Color: Saturation Compensation + ItemDelegate { + width: 220 + height: 36 + text: "Color: Saturation Compensation" + onClicked: { + if (controller) controller.set_color_mode("saturation") + if (uiState) uiState.colorMode = "saturation" + viewMenu.close() + } + background: Rectangle { + color: parent.hovered ? (root.isDarkTheme ? "#555555" : "#e0e0e0") + : ((uiState && uiState.colorMode === "saturation") + ? (root.isDarkTheme ? "#505050" : "#d0ffd0") + : "transparent") + } + contentItem: Text { + text: parent.text + color: root.currentTextColor + font.bold: uiState && uiState.colorMode === "saturation" + verticalAlignment: Text.AlignVCenter + leftPadding: 10 + } + } + + // Color: Full ICC Profile + ItemDelegate { + width: 220 + height: 36 + text: "Color: Full ICC Profile" + onClicked: { + if (controller) controller.set_color_mode("icc") + if (uiState) uiState.colorMode = "icc" + viewMenu.close() + } + background: Rectangle { + color: parent.hovered ? (root.isDarkTheme ? "#555555" : "#e0e0e0") + : ((uiState && uiState.colorMode === "icc") + ? (root.isDarkTheme ? "#505050" : "#d0ffd0") + : "transparent") + } + contentItem: Text { + text: parent.text + color: root.currentTextColor + font.bold: uiState && uiState.colorMode === "icc" + verticalAlignment: Text.AlignVCenter + leftPadding: 10 + } + } + } + } + + Menu { + id: actionsMenu + parent: Overlay.overlay + implicitWidth: 220 + + background: Rectangle { + implicitWidth: 220 + implicitHeight: actionsMenuColumn.implicitHeight + color: root.isDarkTheme ? "#424242" : "#ffffff" + border.color: root.isDarkTheme ? "#666666" : "#cccccc" + radius: 4 + } + + contentItem: Column { + id: actionsMenuColumn + + // Edit Image (from old Main.qml) + ItemDelegate { + width: 220 + height: 36 + text: "Edit Image" + onClicked: { + if (uiState) { + uiState.isEditorOpen = !uiState.isEditorOpen + if (uiState.isEditorOpen && controller) { + controller.load_image_for_editing() + } + } + actionsMenu.close() + } + background: Rectangle { + color: parent.hovered ? (root.isDarkTheme ? "#555555" : "#e0e0e0") : "transparent" + } + contentItem: Text { + text: parent.text + color: root.currentTextColor + verticalAlignment: Text.AlignVCenter + leftPadding: 10 + } + } + + ItemDelegate { + width: 220 + height: 36 + text: "Run Stacks" + onClicked: { if (uiState) uiState.launch_helicon(); actionsMenu.close() } + background: Rectangle { + color: parent.hovered ? (root.isDarkTheme ? "#555555" : "#e0e0e0") : "transparent" + } + contentItem: Text { + text: parent.text + color: root.currentTextColor + verticalAlignment: Text.AlignVCenter + leftPadding: 10 + } + } + ItemDelegate { + width: 220 + height: 36 + text: "Clear Stacks" + onClicked: { if (uiState) uiState.clear_all_stacks(); actionsMenu.close() } + background: Rectangle { + color: parent.hovered ? (root.isDarkTheme ? "#555555" : "#e0e0e0") : "transparent" + } + contentItem: Text { + text: parent.text + color: root.currentTextColor + verticalAlignment: Text.AlignVCenter + leftPadding: 10 + } + } + ItemDelegate { + width: 220 + height: 36 + text: "Show Stacks" + onClicked: { showStacksDialog.open(); actionsMenu.close() } + background: Rectangle { + color: parent.hovered ? (root.isDarkTheme ? "#555555" : "#e0e0e0") : "transparent" + } + contentItem: Text { + text: parent.text + color: root.currentTextColor + verticalAlignment: Text.AlignVCenter + leftPadding: 10 + } + } + ItemDelegate { + width: 220 + height: 36 + text: "Preload All Images" + onClicked: { if (uiState) uiState.preloadAllImages(); actionsMenu.close() } + background: Rectangle { + color: parent.hovered ? (root.isDarkTheme ? "#555555" : "#e0e0e0") : "transparent" + } + contentItem: Text { + text: parent.text + color: root.currentTextColor + verticalAlignment: Text.AlignVCenter + leftPadding: 10 + } + } + ItemDelegate { + width: 220 + height: 36 + text: "Filter Images..." + onClicked: { filterDialog.open(); actionsMenu.close() } + background: Rectangle { + color: parent.hovered ? (root.isDarkTheme ? "#555555" : "#e0e0e0") : "transparent" + } + contentItem: Text { + text: parent.text + color: root.currentTextColor + verticalAlignment: Text.AlignVCenter + leftPadding: 10 + } + } + + // Clear Filename Filter (from old Main.qml) + ItemDelegate { + width: 220 + height: 36 + text: "Clear Filename Filter" + onClicked: { + if (controller) controller.clear_filter() + actionsMenu.close() + } + background: Rectangle { + color: parent.hovered ? (root.isDarkTheme ? "#555555" : "#e0e0e0") : "transparent" + } + contentItem: Text { + text: parent.text + color: root.currentTextColor + verticalAlignment: Text.AlignVCenter + leftPadding: 10 + } + } + } + } + + Menu { + id: helpMenu + parent: Overlay.overlay + implicitWidth: 200 + + background: Rectangle { + implicitWidth: 200 + implicitHeight: helpMenuColumn.implicitHeight + color: root.isDarkTheme ? "#424242" : "#ffffff" + border.color: root.isDarkTheme ? "#666666" : "#cccccc" + radius: 4 + } + + contentItem: Column { + id: helpMenuColumn + + ItemDelegate { + width: 200 + height: 36 + text: "Key Bindings" + onClicked: { aboutDialog.open(); helpMenu.close() } + background: Rectangle { + color: parent.hovered ? (root.isDarkTheme ? "#555555" : "#e0e0e0") : "transparent" + } + contentItem: Text { + text: parent.text + color: root.currentTextColor + verticalAlignment: Text.AlignVCenter + leftPadding: 10 + } + } + } + } + + // -------- MAIN VIEW -------- + Item { + id: contentArea + anchors.fill: parent + + Loader { + id: mainViewLoader + anchors.fill: parent + source: "Components.qml" + focus: true + + // Key bindings implemented in old Main.qml + Keys.onPressed: function(event) { + if (!uiState || !controller) { + return + } + + // Toggle Image Editor with 'E' key + if (event.key === Qt.Key_E && !event.isAutoRepeat) { + uiState.isEditorOpen = !uiState.isEditorOpen + if (uiState.isEditorOpen) { + controller.load_image_for_editing() + } + event.accepted = true + } + // Global Key for saving edited image (Ctrl+S) when editor is open + else if (event.key === Qt.Key_S && (event.modifiers & Qt.ControlModifier)) { + if (uiState.isEditorOpen) { + controller.save_edited_image() + event.accepted = true + } + } + } + } + } + + // -------- FOOTER / STATUS BAR (old version) -------- footer: Rectangle { id: footerRect implicitHeight: footerRow.implicitHeight + 10 // Add some padding @@ -59,38 +628,41 @@ ApplicationWindow { RowLayout { id: footerRow spacing: 10 + Label { Layout.leftMargin: 10 - text: `Image: ${uiState.currentIndex + 1} / ${uiState.imageCount}` + text: uiState ? `Image: ${uiState.currentIndex + 1} / ${uiState.imageCount}` : "Image: - / -" color: root.currentTextColor } Label { - text: uiState.imageCount > 0 ? ` | File: ${uiState.currentFilename || 'N/A'}` : " | File: N/A" + text: (uiState && uiState.imageCount > 0) + ? ` | File: ${uiState.currentFilename || 'N/A'}` + : " | File: N/A" color: root.currentTextColor } Label { - text: ` | Stacked: ${uiState.stackedDate}` + text: uiState ? ` | Stacked: ${uiState.stackedDate}` : "" color: "lightgreen" - visible: uiState.imageCount > 0 && uiState.isStacked + visible: uiState ? (uiState.imageCount > 0 && uiState.isStacked) : false } Label { - text: ` | Uploaded on ${uiState.uploadedDate}` + text: uiState ? ` | Uploaded on ${uiState.uploadedDate}` : "" color: "lightgreen" - visible: uiState.imageCount > 0 && uiState.isUploaded + visible: uiState ? (uiState.imageCount > 0 && uiState.isUploaded) : false } Label { - text: ` | Edited on ${uiState.editedDate}` + text: uiState ? ` | Edited on ${uiState.editedDate}` : "" color: "lightgreen" - visible: uiState.imageCount > 0 && uiState.isEdited + visible: uiState ? (uiState.imageCount > 0 && uiState.isEdited) : false } Label { - text: ` | Filter: "${uiState.filterString}"` + text: uiState ? ` | Filter: "${uiState.filterString}"` : "" color: "yellow" font.bold: true - visible: uiState.filterString !== "" + visible: uiState ? (uiState.filterString !== "") : false } Rectangle { - visible: uiState.isPreloading + visible: uiState ? uiState.isPreloading : false Layout.preferredWidth: 200 height: 10 // give it some height color: "gray" @@ -99,35 +671,37 @@ ApplicationWindow { Rectangle { color: "lightblue" - width: parent.width * (uiState.preloadProgress / 100) + width: parent.width * (uiState ? uiState.preloadProgress / 100 : 0) height: parent.height } } Rectangle { - color: (uiState.imageCount > 0 && uiState.stackInfoText) ? "orange" : "transparent" + color: (uiState && uiState.imageCount > 0 && uiState.stackInfoText) ? "orange" : "transparent" radius: 3 implicitWidth: stackInfoLabel.implicitWidth + 10 implicitHeight: stackInfoLabel.implicitHeight + 5 - visible: uiState.imageCount > 0 && uiState.stackInfoText + visible: uiState ? (uiState.imageCount > 0 && uiState.stackInfoText) : false + Label { id: stackInfoLabel anchors.centerIn: parent - text: `Stack: ${uiState.stackInfoText}` + text: uiState ? `Stack: ${uiState.stackInfoText}` : "" color: "black" font.bold: true font.pixelSize: 16 } } Rectangle { - color: (uiState.imageCount > 0 && uiState.batchInfoText) ? "#4fb360" : "transparent" + color: (uiState && uiState.imageCount > 0 && uiState.batchInfoText) ? "#4fb360" : "transparent" radius: 3 implicitWidth: batchInfoLabel.implicitWidth + 10 implicitHeight: batchInfoLabel.implicitHeight + 5 - visible: uiState.imageCount > 0 && uiState.batchInfoText + visible: uiState ? (uiState.imageCount > 0 && uiState.batchInfoText) : false + Label { id: batchInfoLabel anchors.centerIn: parent - text: `Batch: ${uiState.batchInfoText}` + text: uiState ? `Batch: ${uiState.batchInfoText}` : "" color: "white" font.bold: true font.pixelSize: 16 @@ -137,32 +711,32 @@ ApplicationWindow { Layout.fillWidth: true color: "transparent" } - + // Saturation slider (only visible in saturation mode) Row { - visible: uiState.colorMode === "saturation" + visible: uiState && uiState.colorMode === "saturation" spacing: 5 Layout.rightMargin: 10 - + Label { text: "Saturation:" color: root.currentTextColor anchors.verticalCenter: parent.verticalCenter } - + Slider { id: saturationSlider from: 0.0 to: 1.0 - value: uiState.saturationFactor + value: uiState ? uiState.saturationFactor : 1.0 stepSize: 0.01 width: 150 - + onMoved: { - controller.set_saturation_factor(value) + if (controller) controller.set_saturation_factor(value) } } - + Label { text: Math.round(saturationSlider.value * 100) + "%" color: root.currentTextColor @@ -170,174 +744,20 @@ ApplicationWindow { Layout.preferredWidth: 40 } } - + Label { id: statusMessageLabel - text: uiState.statusMessage + text: uiState ? uiState.statusMessage : "" color: root.currentTextColor - visible: uiState.statusMessage !== "" + visible: uiState ? (uiState.statusMessage !== "") : false Layout.rightMargin: 10 } } } - header: Rectangle { - id: titleBar - height: 30 - color: root.currentBackgroundColor - - MouseArea { - anchors.fill: parent - property point lastGlobalPos: Qt.point(0, 0) - onPressed: function(mouse) { - lastGlobalPos = Qt.point(root.x + mouse.x, root.y + mouse.y) - } - onPositionChanged: function(mouse) { - var currentGlobalPos = Qt.point(root.x + mouse.x, root.y + mouse.y) - var delta = Qt.point(currentGlobalPos.x - lastGlobalPos.x, currentGlobalPos.y - lastGlobalPos.y) - root.x += delta.x - root.y += delta.y - lastGlobalPos = currentGlobalPos - } - } - - RowLayout { - - id: menuAndControls - - anchors.fill: parent - - - - MenuBar { - id: menuBar - Layout.preferredWidth: 300 // Give it some width - background: Rectangle { - color: root.currentBackgroundColor - } - palette.buttonText: root.currentTextColor - palette.button: root.currentBackgroundColor - palette.window: root.currentBackgroundColor - palette.text: root.currentTextColor - - Menu { - title: "&File" - Action { text: "&Open Folder..." } - Action { - text: "&Settings..." - onTriggered: { - settingsDialog.heliconPath = uiState.get_helicon_path() - settingsDialog.photoshopPath = uiState.get_photoshop_path() - settingsDialog.cacheSize = uiState.get_cache_size() - settingsDialog.prefetchRadius = uiState.get_prefetch_radius() - settingsDialog.theme = uiState.theme - settingsDialog.defaultDirectory = uiState.get_default_directory() - settingsDialog.open() - } - } - Action { text: "&Exit"; onTriggered: Qt.quit() } - } - Menu { - title: "&View" - Action { text: "Toggle Light/Dark Mode"; onTriggered: root.toggleTheme() } - MenuSeparator {} - - ActionGroup { - id: colorModeGroup - exclusive: true - } - - Action { - text: "Color: None (Original)" - checkable: true - checked: uiState.colorMode === "none" - onTriggered: controller.set_color_mode("none") - ActionGroup.group: colorModeGroup - } - Action { - text: "Color: Saturation Compensation" - checkable: true - checked: uiState.colorMode === "saturation" - onTriggered: controller.set_color_mode("saturation") - ActionGroup.group: colorModeGroup - } - Action { - text: "Color: Full ICC Profile" - checkable: true - checked: uiState.colorMode === "icc" - onTriggered: controller.set_color_mode("icc") - ActionGroup.group: colorModeGroup - } - } - Menu { - title: "&Actions" - Action { text: "Run Stacks"; onTriggered: uiState.launch_helicon() } - Action { text: "Clear Stacks"; onTriggered: uiState.clear_all_stacks() } - Action { text: "Show Stacks"; onTriggered: showStacksDialog.open() } - Action { text: "Preload All Images"; onTriggered: uiState.preloadAllImages() } - Action { text: "Filter Images..."; onTriggered: filterDialog.open() } - Action { text: "Clear Filename Filter"; onTriggered: controller.clear_filter() } - } - Menu { - title: "&Help" - Action { text: "&Key Bindings"; onTriggered: aboutDialog.open() } - } - } - - - - Item { Layout.fillWidth: true } // Left spacer - - Label { - text: uiState.currentDirectory - color: root.currentTextColor - font.pixelSize: 12 - elide: Text.ElideMiddle - Layout.maximumWidth: 600 - Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.topMargin: 5 - horizontalAlignment: Text.AlignHCenter - } - - Item { Layout.fillWidth: true } // Right spacer - - Row { - - // Removed anchors - - spacing: 10 - - - - Button { - - text: "-" - - onClicked: root.showMinimized() - - } - - Button { - - text: "[]" - - onClicked: root.visibility === Window.Maximized ? root.showNormal() : root.showMaximized() - - } - - Button { - - text: "X" - - onClicked: Qt.quit() - - } - - } - - } - } + // -------- DIALOGS -------- + // Old, more robust About dialog Dialog { id: aboutDialog title: "Key Bindings" @@ -379,10 +799,12 @@ ApplicationWindow { "  Ctrl+S: Toggle stacked flag

" + "File Management:
" + "  Delete: Move current image to recycle bin
" + - "  Ctrl+Z: Undo last delete

" + + "  Ctrl+Z: Undo last action (delete or auto white balance)

" + "Actions:
" + "  Enter: Launch Helicon Focus
" + - "  E: Edit in Photoshop
" + + "  P: Edit in Photoshop
" + + "  A: Quick auto white balance (saves automatically)
" + + "  E: Toggle Image Editor
" + "  Ctrl+C: Copy image path to clipboard" padding: 10 wrapMode: Text.WordWrap @@ -406,7 +828,7 @@ ApplicationWindow { } contentItem: Text { - text: uiState.stackSummary || "No stacks defined." + text: (uiState && uiState.stackSummary) ? uiState.stackSummary : "No stacks defined." padding: 10 wrapMode: Text.WordWrap color: root.currentTextColor @@ -420,13 +842,22 @@ ApplicationWindow { FilterDialog { id: filterDialog onAccepted: { - controller.apply_filter(filterString) + if (uiState) uiState.applyFilter(filterString) } } JumpToImageDialog { id: jumpToImageDialog - maxImageCount: uiState.imageCount + maxImageCount: uiState ? uiState.imageCount : 0 + } + + ImageEditorDialog { + id: imageEditorDialog + onVisibleChanged: { + if (!visible) { + mainViewLoader.forceActiveFocus() + } + } } function show_jump_to_image_dialog() { diff --git a/faststack/faststack/qml/Main.qml.bak b/faststack/faststack/qml/Main.qml.bak deleted file mode 100644 index 3c9ca9f..0000000 --- a/faststack/faststack/qml/Main.qml.bak +++ /dev/null @@ -1,295 +0,0 @@ -import QtQuick -import QtQuick.Window -import QtQuick.Controls 2.15 -import QtQuick.Controls.Material 2.15 -import QtQuick.Layouts 1.15 -import "." - -ApplicationWindow { - id: root - visible: true - width: 1200 - height: 800 - minimumWidth: 800 - minimumHeight: 500 - flags: Qt.FramelessWindowHint | Qt.Window - title: "FastStack" - - Material.theme: uiState.theme === 0 ? Material.Dark : Material.Light - - property bool isDarkTheme: uiState.theme === 0 - property color currentBackgroundColor: isDarkTheme ? "#000000" : "white" - property color currentTextColor: isDarkTheme ? "white" : "black" - - background: Rectangle { color: root.currentBackgroundColor } - - function toggleTheme() { - uiState.theme = (uiState.theme === 0 ? 1 : 0) // 0 for dark, 1 for light - } - - Connections { - target: uiState - function onThemeChanged() { - root.isDarkTheme = uiState.theme === 0 - } - } - - // Expose the Python UIState object to QML - // This is set from Python via setContextProperty("uiState", ...) - - // Main view: either the loupe viewer or the grid - Loader { - id: mainViewLoader - anchors.fill: parent - anchors.topMargin: titleBar.height - source: "Components.qml" - } - - // Keyboard focus and event handling - - // Status bar - footer: Rectangle { - id: footerRect - implicitHeight: footerRow.implicitHeight + 10 // Add some padding - anchors.left: parent.left - anchors.right: parent.right - color: "#80000000" // Semi-transparent black - - RowLayout { - id: footerRow - spacing: 10 - Label { - Layout.leftMargin: 10 - text: `Image: ${uiState.currentIndex + 1} / ${uiState.imageCount}` - color: root.currentTextColor - } - Label { - text: ` | File: ${uiState.currentFilename || 'N/A'}` - color: root.currentTextColor - } - Label { - text: ` | Flag: ${uiState.isFlagged}` - color: uiState.isFlagged ? "lightgreen" : root.currentTextColor - } - Label { - text: ` | Rejected: ${uiState.isRejected}` - color: uiState.isRejected ? "red" : root.currentTextColor - } - Label { - text: ` | Stacked: ${uiState.stackedDate}` - color: "lightgreen" - visible: uiState.isStacked - } - Rectangle { - visible: uiState.isPreloading - Layout.preferredWidth: 200 - height: 10 // give it some height - color: "gray" - border.color: "red" - border.width: 1 - - Rectangle { - color: "lightblue" - width: parent.width * (uiState.preloadProgress / 100) - height: parent.height - } - } - Rectangle { - Layout.fillWidth: true - color: uiState.stackInfoText ? "orange" : "transparent" // Brighter background - radius: 3 - implicitWidth: stackInfoLabel.implicitWidth + 10 - implicitHeight: stackInfoLabel.implicitHeight + 5 - Label { - id: stackInfoLabel - anchors.centerIn: parent - text: `Stack: ${uiState.stackInfoText || 'N/A'}` - color: "black" // Black text for contrast on orange - font.bold: true - font.pixelSize: 16 - } - } - } - } - - header: Rectangle { - id: titleBar - height: 30 - color: root.currentBackgroundColor - - MouseArea { - anchors.fill: parent - property point lastMousePos: Qt.point(0, 0) - onPressed: function(mouse) { - lastMousePos = Qt.point(mouse.x, mouse.y) - } - onPositionChanged: function(mouse) { - var delta = Qt.point(mouse.x - lastMousePos.x, mouse.y - lastMousePos.y) - root.x += delta.x - root.y += delta.y - } - } - - RowLayout { - - id: menuAndControls - - anchors.fill: parent - - - - MenuBar { - id: menuBar - Layout.preferredWidth: 300 // Give it some width - background: Rectangle { - color: root.currentBackgroundColor - } - palette.buttonText: root.currentTextColor - palette.button: root.currentBackgroundColor - palette.window: root.currentBackgroundColor - palette.text: root.currentTextColor - - Menu { - title: "&File" - Action { text: "&Open Folder..." } - Action { - text: "&Settings..." - onTriggered: { - settingsDialog.heliconPath = uiState.get_helicon_path() - settingsDialog.cacheSize = uiState.get_cache_size() - settingsDialog.prefetchRadius = uiState.get_prefetch_radius() - settingsDialog.theme = uiState.theme - settingsDialog.defaultDirectory = uiState.get_default_directory() - settingsDialog.open() - } - } - Action { text: "&Exit"; onTriggered: Qt.quit() } - } - Menu { - title: "&View" - Action { text: "Toggle Light/Dark Mode"; onTriggered: root.toggleTheme() } - } - Menu { - title: "&Actions" - Action { text: "Run Stacks"; onTriggered: uiState.launch_helicon() } - Action { text: "Clear Stacks"; onTriggered: uiState.clear_all_stacks() } - Action { text: "Show Stacks"; onTriggered: showStacksDialog.open() } - Action { text: "Preload All Images"; onTriggered: uiState.preloadAllImages() } - Action { text: "Filter Images..."; onTriggered: filterDialog.open() } - } - Menu { - title: "&Help" - Action { text: "&Key Bindings"; onTriggered: aboutDialog.open() } - } - } - - - - Item { Layout.fillWidth: true } // Spacer - - - - Row { - - // Removed anchors - - spacing: 10 - - - - Button { - - text: "-" - - onClicked: root.showMinimized() - - } - - Button { - - text: "[]" - - onClicked: root.visibility === Window.Maximized ? root.showNormal() : root.showMaximized() - - } - - Button { - - text: "X" - - onClicked: Qt.quit() - - } - - } - - } - } - - Dialog { - id: aboutDialog - title: "Key Bindings" - standardButtons: Dialog.Ok - modal: true - width: 400 - height: 400 - - background: Rectangle { - color: root.currentBackgroundColor - } - - contentItem: Text { - text: "FastStack Keyboard and Mouse Commands

" + - "Navigation:
" + - "  J / Right Arrow: Next Image
" + - "  K / Left Arrow: Previous Image

" + - "Viewing:
" + - "  Mouse Wheel: Zoom in/out
" + - "  Left-click + Drag: Pan image
" + - "  G: Toggle Grid View (not implemented)

" + - "Rating & Stacking:
" + - "  Space: Toggle Flag
" + - "  X: Toggle Reject
" + - "  S: Add to selection for Helicon
" + - "  [: Begin new stack
" + - "  ]: End current stack
" + - "  C: Clear all stacks

" + - "Actions:
" + - "  Enter: Launch Helicon Focus" - padding: 10 - wrapMode: Text.WordWrap - color: root.currentTextColor - } - } - - Dialog { - id: showStacksDialog - title: "Stack Information" - standardButtons: Dialog.Ok - modal: true - width: 400 - height: 300 - - background: Rectangle { - color: root.currentBackgroundColor - } - - contentItem: Text { - text: uiState.stackSummary || "No stacks defined." - padding: 10 - wrapMode: Text.WordWrap - color: root.currentTextColor - } - } - - SettingsDialog { - id: settingsDialog - } - - FilterDialog { - id: filterDialog - onAccepted: { - uiState.applyFilter(filterString) - } - } -} \ No newline at end of file diff --git a/faststack/faststack/ui/keystrokes.py b/faststack/faststack/ui/keystrokes.py index 90cef44..1f8b9bf 100644 --- a/faststack/faststack/ui/keystrokes.py +++ b/faststack/faststack/ui/keystrokes.py @@ -26,15 +26,16 @@ def __init__(self, controller): # Stacking Qt.Key_BracketLeft: "begin_new_stack", Qt.Key_BracketRight: "end_current_stack", - + Qt.Key_S: "toggle_stack_membership", + # Batching Qt.Key_BraceLeft: "begin_new_batch", Qt.Key_BraceRight: "end_current_batch", Qt.Key_Backslash: "clear_all_batches", + Qt.Key_B: "toggle_batch_membership", # Remove from batch/stack Qt.Key_X: "remove_from_batch_or_stack", - Qt.Key_S: "remove_from_batch_or_stack", # Toggle flags Qt.Key_U: "toggle_uploaded", @@ -42,8 +43,9 @@ def __init__(self, controller): # Actions Qt.Key_Enter: "launch_helicon", Qt.Key_Return: "launch_helicon", - Qt.Key_E: "edit_in_photoshop", + Qt.Key_P: "edit_in_photoshop", Qt.Key_C: "clear_all_stacks", + Qt.Key_A: "quick_auto_white_balance", Qt.Key_Delete: "delete_current_image", Qt.Key_Backspace: "delete_current_image", } diff --git a/faststack/faststack/ui/provider.py b/faststack/faststack/ui/provider.py index 93e9881..26d369f 100644 --- a/faststack/faststack/ui/provider.py +++ b/faststack/faststack/ui/provider.py @@ -84,6 +84,29 @@ class UIState(QObject): filterStringChanged = Signal() # Signal for filter string updates colorModeChanged = Signal() # Signal for color mode updates saturationFactorChanged = Signal() # Signal for saturation factor updates + default_directory_changed = Signal(str) + # Image Editor Signals + is_editor_open_changed = Signal(bool) + is_cropping_changed = Signal(bool) + brightness_changed = Signal(float) + contrast_changed = Signal(float) + saturation_changed = Signal(float) + white_balance_by_changed = Signal(float) + white_balance_mg_changed = Signal(float) + aspect_ratio_names_changed = Signal(list) + current_aspect_ratio_index_changed = Signal(int) + current_crop_box_changed = Signal(tuple) # (left, top, right, bottom) normalized to 0-1000 + anySliderPressedChanged = Signal(bool) + sharpness_changed = Signal(float) + rotation_changed = Signal(int) + exposure_changed = Signal(float) + highlights_changed = Signal(float) + shadows_changed = Signal(float) + vibrance_changed = Signal(float) + vignette_changed = Signal(float) + blacks_changed = Signal(float) + whites_changed = Signal(float) + clarity_changed = Signal(float) def __init__(self, app_controller): super().__init__() @@ -93,6 +116,28 @@ def __init__(self, app_controller): # 1 = light, 0 = dark (controller will overwrite this on startup) self._theme = 1 self._status_message = "" # New private variable for status message + # Image Editor State + self._is_editor_open = False + self._is_cropping = False + self._brightness = 0.0 + self._contrast = 0.0 + self._saturation = 0.0 + self._white_balance_by = 0.0 + self._white_balance_mg = 0.0 + self._current_crop_box = (0, 0, 1000, 1000) + self._aspect_ratio_names = [] + self._current_aspect_ratio_index = 0 + self._any_slider_pressed = False + self._sharpness = 0.0 + self._rotation = 0 + self._exposure = 0.0 + self._highlights = 0.0 + self._shadows = 0.0 + self._vibrance = 0.0 + self._vignette = 0.0 + self._blacks = 0.0 + self._whites = 0.0 + self._clarity = 0.0 # ---- THEME PROPERTY ---- @Property(int, notify=themeChanged) @@ -341,3 +386,257 @@ def resetZoomPan(self): """Triggers a reset of zoom and pan in QML.""" self.resetZoomPanRequested.emit() + # --- Image Editor Properties --- + + @Property(bool, notify=is_editor_open_changed) + def isEditorOpen(self) -> bool: + return self._is_editor_open + + @isEditorOpen.setter + def isEditorOpen(self, new_value: bool): + if self._is_editor_open != new_value: + self._is_editor_open = new_value + self.is_editor_open_changed.emit(new_value) + + @Property(bool, notify=anySliderPressedChanged) + def anySliderPressed(self): + return self._any_slider_pressed + + @anySliderPressed.setter + def anySliderPressed(self, value): + if self._any_slider_pressed != value: + self._any_slider_pressed = value + self.anySliderPressedChanged.emit(value) + + @Slot(bool) + def setAnySliderPressed(self, pressed: bool): + self.anySliderPressed = pressed + + @Property(bool, notify=is_cropping_changed) + def isCropping(self) -> bool: + return self._is_cropping + + @isCropping.setter + def isCropping(self, new_value: bool): + if self._is_cropping != new_value: + self._is_cropping = new_value + self.is_cropping_changed.emit(new_value) + + @Property(float, notify=brightness_changed) + def brightness(self) -> float: + return self._brightness + + @brightness.setter + def brightness(self, new_value: float): + if self._brightness != new_value: + self._brightness = new_value + self.brightness_changed.emit(new_value) + + @Property(float, notify=contrast_changed) + def contrast(self) -> float: + return self._contrast + + @contrast.setter + def contrast(self, new_value: float): + if self._contrast != new_value: + self._contrast = new_value + self.contrast_changed.emit(new_value) + + @Property(float, notify=saturation_changed) + def saturation(self) -> float: + return self._saturation + + @saturation.setter + def saturation(self, new_value: float): + if self._saturation != new_value: + self._saturation = new_value + self.saturation_changed.emit(new_value) + + @Property(float, notify=white_balance_by_changed) + def whiteBalanceBY(self) -> float: + return self._white_balance_by + + @whiteBalanceBY.setter + def whiteBalanceBY(self, new_value: float): + if self._white_balance_by != new_value: + self._white_balance_by = new_value + self.white_balance_by_changed.emit(new_value) + + @Property(float, notify=white_balance_mg_changed) + def whiteBalanceMG(self) -> float: + return self._white_balance_mg + + @whiteBalanceMG.setter + def whiteBalanceMG(self, new_value: float): + if self._white_balance_mg != new_value: + self._white_balance_mg = new_value + self.white_balance_mg_changed.emit(new_value) + + # Snake_case aliases for QML bracket notation access + @Property(float, notify=white_balance_by_changed) + def white_balance_by(self) -> float: + return self._white_balance_by + + @white_balance_by.setter + def white_balance_by(self, new_value: float): + self.whiteBalanceBY = new_value + + @Property(float, notify=white_balance_mg_changed) + def white_balance_mg(self) -> float: + return self._white_balance_mg + + @white_balance_mg.setter + def white_balance_mg(self, new_value: float): + self.whiteBalanceMG = new_value + + @Property('QVariantList', notify=aspect_ratio_names_changed) + def aspectRatioNames(self) -> list: + return self._aspect_ratio_names + + @aspectRatioNames.setter + def aspectRatioNames(self, new_value: list): + if self._aspect_ratio_names != new_value: + self._aspect_ratio_names = new_value + self.aspect_ratio_names_changed.emit(new_value) + + @Property(int, notify=current_aspect_ratio_index_changed) + def currentAspectRatioIndex(self) -> int: + return self._current_aspect_ratio_index + + @currentAspectRatioIndex.setter + def currentAspectRatioIndex(self, new_value: int): + if self._current_aspect_ratio_index != new_value: + self._current_aspect_ratio_index = new_value + self.current_aspect_ratio_index_changed.emit(new_value) + + @Property('QVariant', notify=current_crop_box_changed) + def currentCropBox(self) -> tuple: + # QML will receive this as a list + return self._current_crop_box + + @currentCropBox.setter + def currentCropBox(self, new_value: tuple): + if self._current_crop_box != new_value: + self._current_crop_box = new_value + self.current_crop_box_changed.emit(new_value) + + # --- New Properties --- + @Property(float, notify=sharpness_changed) + def sharpness(self) -> float: + return self._sharpness + + @sharpness.setter + def sharpness(self, new_value: float): + if self._sharpness != new_value: + self._sharpness = new_value + self.sharpness_changed.emit(new_value) + + @Property(int, notify=rotation_changed) + def rotation(self) -> int: + return self._rotation + + @rotation.setter + def rotation(self, new_value: int): + if self._rotation != new_value: + self._rotation = new_value + self.rotation_changed.emit(new_value) + + @Property(float, notify=exposure_changed) + def exposure(self) -> float: + return self._exposure + + @exposure.setter + def exposure(self, new_value: float): + if self._exposure != new_value: + self._exposure = new_value + self.exposure_changed.emit(new_value) + + @Property(float, notify=highlights_changed) + def highlights(self) -> float: + return self._highlights + + @highlights.setter + def highlights(self, new_value: float): + if self._highlights != new_value: + self._highlights = new_value + self.highlights_changed.emit(new_value) + + @Property(float, notify=shadows_changed) + def shadows(self) -> float: + return self._shadows + + @shadows.setter + def shadows(self, new_value: float): + if self._shadows != new_value: + self._shadows = new_value + self.shadows_changed.emit(new_value) + + @Property(float, notify=vibrance_changed) + def vibrance(self) -> float: + return self._vibrance + + @vibrance.setter + def vibrance(self, new_value: float): + if self._vibrance != new_value: + self._vibrance = new_value + self.vibrance_changed.emit(new_value) + + @Property(float, notify=vignette_changed) + def vignette(self) -> float: + return self._vignette + + @vignette.setter + def vignette(self, new_value: float): + if self._vignette != new_value: + self._vignette = new_value + self.vignette_changed.emit(new_value) + + @Property(float, notify=blacks_changed) + def blacks(self) -> float: + return self._blacks + + @blacks.setter + def blacks(self, new_value: float): + if self._blacks != new_value: + self._blacks = new_value + self.blacks_changed.emit(new_value) + + @Property(float, notify=whites_changed) + def whites(self) -> float: + return self._whites + + @whites.setter + def whites(self, new_value: float): + if self._whites != new_value: + self._whites = new_value + self.whites_changed.emit(new_value) + + @Property(float, notify=clarity_changed) + def clarity(self) -> float: + return self._clarity + + @clarity.setter + def clarity(self, new_value: float): + if self._clarity != new_value: + self._clarity = new_value + self.clarity_changed.emit(new_value) + + def reset_editor_state(self): + """Resets all UI state variables for the editor.""" + self.brightness = 0.0 + self.contrast = 0.0 + self.saturation = 0.0 + self.whiteBalanceBY = 0.0 + self.whiteBalanceMG = 0.0 + self.currentCropBox = (0, 0, 1000, 1000) + self.isCropping = False + self.sharpness = 0.0 + self.rotation = 0 + self.exposure = 0.0 + self.highlights = 0.0 + self.shadows = 0.0 + self.vibrance = 0.0 + self.vignette = 0.0 + self.blacks = 0.0 + self.whites = 0.0 + self.clarity = 0.0 diff --git a/faststack/pyproject.toml b/faststack/pyproject.toml index ae403f2..2cbce1e 100644 --- a/faststack/pyproject.toml +++ b/faststack/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta" [project] name = "faststack" -version = "1.0" +version = "1.2" authors = [ { name="Alan Rockefeller", email="alanrockefeller@gmail.com" }, ] diff --git a/faststack/requirements.txt b/faststack/requirements.txt index f67333a..a5ad649 100644 --- a/faststack/requirements.txt +++ b/faststack/requirements.txt @@ -3,7 +3,6 @@ PyTurboJPEG==1.* numpy==2.* cachetools==5.* watchdog==4.* -typer==0.12.* Pillow==10.* # fallback decode; keep it pyinstaller==6.* pytest==8.* diff --git a/z b/z new file mode 100644 index 0000000..0a47495 --- /dev/null +++ b/z @@ -0,0 +1,2977 @@ +tar: faststack/README.md: Cannot open: No such file or directory +tar: faststack/faststack.egg-info: Cannot mkdir: No such file or directory +tar: faststack/faststack.egg-info: Cannot mkdir: No such file or directory +tar: faststack/faststack.egg-info/dependency_links.txt: Cannot open: No such file or directory +tar: faststack/faststack.egg-info: Cannot mkdir: No such file or directory +tar: faststack/faststack.egg-info/requires.txt: Cannot open: No such file or directory +tar: faststack/faststack.egg-info: Cannot mkdir: No such file or directory +tar: faststack/faststack.egg-info/entry_points.txt: Cannot open: No such file or directory +tar: faststack/faststack.egg-info: Cannot mkdir: No such file or directory +tar: faststack/faststack.egg-info/PKG-INFO: Cannot open: No such file or directory +tar: faststack/faststack.egg-info: Cannot mkdir: No such file or directory +tar: faststack/faststack.egg-info/top_level.txt: Cannot open: No such file or directory +tar: faststack/faststack.egg-info: Cannot mkdir: No such file or directory +tar: faststack/faststack.egg-info/SOURCES.txt: Cannot open: No such file or directory +tar: faststack/LICENSE: Cannot open: No such file or directory +tar: faststack/faststack.spec: Cannot open: No such file or directory +tar: faststack/ChangeLog.md: Cannot open: No such file or directory +tar: faststack/pyproject.toml: Cannot open: No such file or directory +tar: faststack/patch: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/config.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/io: Cannot mkdir: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/io/indexer.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/io/helicon.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/io/__pycache__: Cannot mkdir: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/io/__pycache__/helicon.cpython-313.pyc: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/io/__pycache__/executable_validator.cpython-313.pyc: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/io/__pycache__/sidecar.cpython-313.pyc: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/io/__pycache__/indexer.cpython-313.pyc: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/io/__pycache__/watcher.cpython-313.pyc: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/io/watcher.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/io/executable_validator.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/io/sidecar.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/ui: Cannot mkdir: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/ui/keystrokes.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/ui/provider.py.bak: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/ui/__pycache__: Cannot mkdir: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/ui/__pycache__/controller.cpython-313.pyc: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/ui/__pycache__/provider.cpython-313.pyc: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/ui/__pycache__/keystrokes.cpython-313.pyc: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/ui/keystrokes.py.bak: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/ui/provider.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/benchmark_decode.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/app.py.bak: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/__pycache__: Cannot mkdir: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/__pycache__/models.cpython-313.pyc: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/__pycache__/app.cpython-313.pyc: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/__pycache__/logging_setup.cpython-313.pyc: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/__pycache__/entry.cpython-313.pyc: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/__pycache__/__init__.cpython-313.pyc: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/__pycache__/config.cpython-313.pyc: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/qml: Cannot mkdir: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/qml/JumpToImageDialog.qml: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/qml/Main.qml.bak: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/qml/SettingsDialog.qml: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/qml/Main.qml: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/qml/Components.qml: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/qml/ImageEditorDialog.qml: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/qml/FilterDialog.qml: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/app.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/logging_setup.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/imaging: Cannot mkdir: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/imaging/cache.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/imaging/editor.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/imaging/prefetch.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/imaging/__pycache__: Cannot mkdir: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/imaging/__pycache__/cache.cpython-313.pyc: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/imaging/__pycache__/jpeg.cpython-313.pyc: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/imaging/__pycache__/prefetch.cpython-313.pyc: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/imaging/jpeg.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/models.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/__init__.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/tests: Cannot mkdir: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/tests/test_executable_validator.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/tests/__pycache__: Cannot mkdir: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/tests/__pycache__/test_executable_validator.cpython-313-pytest-8.4.2.pyc: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/tests/test_sidecar.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/tests/test_cache.py: Cannot open: No such file or directory +tar: faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/faststack/tests/test_pairing.py: Cannot open: No such file or directory +tar: faststack/requirements.txt: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_operator.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/weakref.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/copy.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_weakrefset.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/contextvars.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/genericpath.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/contextlib.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/parsers: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/parsers/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/parsers/expat: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/parsers/expat/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/parsers/expat/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/parsers/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/dom: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/dom/minidom.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/dom/minicompat.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/dom/xmlbuilder.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/dom/xmlbuilder.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/dom/minicompat.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/dom/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/dom/domreg.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/dom/expatbuilder.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/dom/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/dom/expatbuilder.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/dom/domreg.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/dom/minidom.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/sax: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/sax/_exceptions.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/sax/handler.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/sax/xmlreader.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/sax/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/sax/_exceptions.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/sax/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/sax/handler.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/sax/xmlreader.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/etree: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/etree/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/etree/ElementTree.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/etree/ElementTree.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/xml/etree/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_decimal.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/socket.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/cProfile.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/fractions.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/builtins.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/copyreg.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/os: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/os/path.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/os/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/os/path.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/os/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/math.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/selectors.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numbers.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/dis.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/warnings.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/itertools.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_bisect.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/bisect.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_locale.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/codeop.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/sre_compile.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/signal.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/contextvars.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/http: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/http/client.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/http/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/http/client.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/http/cookiejar.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/http/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/http/cookiejar.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/locale.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/pickle.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/selectors.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_weakref.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/ImageFile.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/TiffImagePlugin.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/ImagePalette.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/ImagePalette.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/_typing.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/ImageFilter.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/Image.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/TiffTags.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/_imaging.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/ImageColor.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/ImageColor.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/PaletteFile.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/GimpPaletteFile.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/_imagingcms.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/_version.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/_version.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/ImageFilter.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/ImageCms.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/_imaging.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/ExifTags.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/Image.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/ExifTags.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/_imagingcms.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/ImageMode.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/TiffTags.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/ImageQt.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/_util.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/ImageOps.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/_util.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/ImageFile.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/_typing.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/ImageOps.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/GimpGradientFile.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/_binary.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/GimpPaletteFile.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/ImageCms.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/ImageMode.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/GimpGradientFile.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/TiffImagePlugin.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/_deprecate.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/_deprecate.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/ImageQt.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/PaletteFile.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PIL/_binary.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_warnings.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_weakref.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/keyword.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/sre_constants.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/keyword.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/typing.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/string.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/codeop.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/struct.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/zipimport.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/bisect.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/io.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/time.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/shlex.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/wave.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/ssl.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/tokenize.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/reprlib.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/@plugins_snapshot.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/token.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/types.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/zipimport.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/zlib.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/base64.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/getopt.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/configparser.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_ast.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/pathlib.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_typeshed: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_typeshed/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_typeshed/xml.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_typeshed/xml.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_typeshed/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/zlib.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/bdb.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/pathlib.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/builtins.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_codecs.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/urllib: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/urllib/parse.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/urllib/parse.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/urllib/error.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/urllib/request.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/urllib/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/urllib/response.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/urllib/request.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/urllib/error.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/urllib/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/urllib/response.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/dataclasses.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/sqlite3: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/sqlite3/dbapi2.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/sqlite3/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/sqlite3/dbapi2.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/sqlite3/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/pdb.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/shutil.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_thread.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/pydoc.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/copyreg.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/sre_constants.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numbers.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/contextlib.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/linecache.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_random.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/dataclasses.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/random.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/subprocess.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/reprlib.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/log.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/traitlets.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/_version.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/_version.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/config: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/config/loader.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/config/configurable.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/config/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/config/application.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/config/argcomplete_config.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/config/configurable.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/config/loader.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/config/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/config/argcomplete_config.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/config/application.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/log.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/traitlets.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/text.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/warnings.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/decorators.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/decorators.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/bunch.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/sentinel.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/bunch.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/getargspec.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/descriptions.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/importstring.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/warnings.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/importstring.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/sentinel.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/nested_update.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/getargspec.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/text.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/descriptions.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traitlets/utils/nested_update.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/bdb.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/uuid.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/subprocess.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/operator.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/threading.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_compression.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/notebooknode.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/json_compat.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v1: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v1/nbjson.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v1/nbbase.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v1/nbjson.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v1/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v1/nbbase.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v1/rwbase.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v1/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v1/rwbase.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v1/convert.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v1/convert.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/_imports.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/warnings.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/sentinel.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/validator.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/_imports.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v3: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v3/nbjson.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v3/nbbase.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v3/nbjson.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v3/nbpy.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v3/nbpy.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v3/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v3/nbbase.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v3/rwbase.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v3/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v3/rwbase.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v3/convert.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v3/convert.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/_version.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/_version.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v4: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v4/nbjson.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v4/nbbase.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v4/nbjson.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v4/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v4/nbbase.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v4/rwbase.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v4/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v4/rwbase.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v4/convert.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v4/convert.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/warnings.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/json_compat.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/_struct.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/reader.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/sentinel.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v2: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v2/nbjson.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v2/nbbase.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v2/nbjson.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v2/nbpy.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v2/nbpy.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v2/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v2/nbxml.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v2/nbbase.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v2/rwbase.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v2/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v2/nbxml.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v2/rwbase.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v2/convert.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/v2/convert.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/validator.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/_struct.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/converter.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/notebooknode.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/converter.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/corpus: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/corpus/words.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/corpus/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/corpus/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/corpus/words.data.json.bc126a5597e10293: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/corpus/words.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/nbformat/reader.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/opcode.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/random.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/posixpath.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/display.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/paths.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/display.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/lib: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/lib/display.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/lib/display.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/lib/clipboard.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/lib/pretty.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/lib/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/lib/pretty.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/lib/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/lib/clipboard.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/shortcuts: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/shortcuts/auto_match.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/shortcuts/auto_match.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/shortcuts/filters.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/shortcuts/auto_suggest.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/shortcuts/auto_suggest.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/shortcuts/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/shortcuts/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/shortcuts/filters.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/ptutils.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/interactiveshell.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/embed.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/magics.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/pt_inputhooks: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/pt_inputhooks/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/pt_inputhooks/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/magics.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/prompts.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/ptutils.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/embed.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/debugger.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/ipapp.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/prompts.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/debugger.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/ipapp.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/terminal/interactiveshell.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/paths.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/extensions: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/extensions/storemagic.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/extensions/storemagic.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/extensions/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/extensions/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/testing: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/testing/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/testing/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/testing/skipdoctest.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/testing/skipdoctest.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/capture.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/contexts.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/tokenutil.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/_process_common.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/text.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/path.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/decorators.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/encoding.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/decorators.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/data.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/sentinel.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/coloransi.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/io.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/openpy.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/py3compat.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/module_paths.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/_process_posix.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/process.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/encoding.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/strdispatch.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/_process_win32.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/dir2.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/importstring.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/_sysinfo.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/wildcard.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/capture.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/module_paths.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/docs.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/syspathcontext.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/process.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/docs.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/timing.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/importstring.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/sentinel.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/frame.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/sysinfo.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/_sysinfo.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/colorable.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/generics.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/_process_win32.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/path.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/_process_common.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/strdispatch.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/syspathcontext.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/ipstruct.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/terminal.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/openpy.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/dir2.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/contexts.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/text.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/py3compat.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/PyColorize.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/sysinfo.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/PyColorize.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/io.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/frame.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/tokenutil.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/data.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/_process_posix.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/coloransi.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/wildcard.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/terminal.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/colorable.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/timing.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/generics.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/utils/ipstruct.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/payload.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/builtin_trap.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/ultratb.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/pylabtools.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/profiledir.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/payload.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/shellapp.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/excolors.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/display.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/displayhook.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/display_trap.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/page.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/code.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/pylab.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/display.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/execution.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/namespace.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/display.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/history.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/code.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/extension.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/pylab.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/config.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/logging.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/namespace.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/script.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/packaging.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/osm.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/execution.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/basic.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/basic.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/auto.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/extension.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/history.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/packaging.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/auto.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/script.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/config.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/ast_mod.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/osm.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/logging.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magics/ast_mod.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/alias.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/display.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/hooks.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/ultratb.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/completer.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/excolors.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/interactiveshell.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/pylabtools.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/history.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/error.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/crashhandler.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/getipython.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/oinspect.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/prefilter.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/displaypub.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/release.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/completerlib.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/oinspect.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/prefilter.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magic.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/page.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/crashhandler.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/logger.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/guarded_eval.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/extensions.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/compilerop.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/latex_symbols.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/guarded_eval.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/completerlib.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/displayhook.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/application.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/usage.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magic.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/inputtransformer2.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/splitinput.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/async_helpers.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/macro.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/autocall.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/logger.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/events.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/builtin_trap.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/inputtransformer2.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/usage.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/extensions.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/compilerop.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/history.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/hooks.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/macro.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/shellapp.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/completer.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/formatters.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/error.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/autocall.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/debugger.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/alias.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/release.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/displaypub.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/async_helpers.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magic_arguments.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/latex_symbols.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/magic_arguments.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/getipython.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/debugger.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/events.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/display_functions.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/profiledir.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/display_trap.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/display_functions.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/application.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/splitinput.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/formatters.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/IPython/core/interactiveshell.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/timeit.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/typing_extensions.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/socket.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/glob.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/collections: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/collections/abc.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/collections/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/collections/abc.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/collections/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/pickle.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_codecs.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/inspect.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/platform.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/glob.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/observers: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/observers/inotify.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/observers/api.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/observers/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/observers/inotify_c.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/observers/polling.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/observers/inotify.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/observers/polling.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/observers/api.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/observers/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/observers/inotify_buffer.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/observers/inotify_buffer.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/observers/inotify_c.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/events.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/events.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/utils: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/utils/patterns.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/utils/patterns.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/utils/bricks.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/utils/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/utils/dirsnapshot.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/utils/bricks.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/utils/dirsnapshot.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/utils/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/utils/delayed_queue.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/watchdog/utils/delayed_queue.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/pdb.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_stat.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/bz2.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/time.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/abc.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/cmd.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_lsprof.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/sys: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/sys/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/sys/_monitoring.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/sys/_monitoring.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/sys/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/math.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/datetime.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/errno.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/functools.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/async_case.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/result.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/async_case.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/_log.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/runner.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/loader.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/_log.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/signals.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/signals.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/suite.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/main.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/loader.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/result.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/case.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/case.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/suite.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/main.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unittest/runner.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/codecs.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/resource.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_ctypes.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/enum.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/site.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/__future__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/mimetypes.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/struct.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/ctypes: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/ctypes/_endian.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/ctypes/util.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/ctypes/util.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/ctypes/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/ctypes/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/ctypes/wintypes.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/ctypes/_endian.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/ctypes/wintypes.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/ast.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/string.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/difflib.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/timeit.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/weakref.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unicodedata.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_collections_abc.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/sre_compile.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/pydoc.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/queue.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/atexit.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/zipfile: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/zipfile/_path.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/zipfile/_path.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/zipfile/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/zipfile/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/linecache.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/mimetypes.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/dis.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/warnings.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/__future__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/html: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/html/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/html/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/fnmatch.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/tarfile.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/gzip.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/gzip.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_ctypes.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/shutil.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/unicodedata.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/__main__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/argparse.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/datetime.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/msvcrt.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/getopt.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/resource.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_compression.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_thread.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/hashlib.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/bz2.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/functools.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/runpy.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/tokenize.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/textwrap.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/configparser.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/colorsys.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/gc.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/abc.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/opcode.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/shlex.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_decimal.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/decimal.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/tarfile.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/stat.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/base64.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/profile.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/enum.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/typing_extensions.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/ast.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/operator.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_weakrefset.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/mmap.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/cmd.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/posixpath.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/ssl.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/json: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/json/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/json/decoder.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/json/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/json/decoder.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/json/encoder.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/json/encoder.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_socket.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/atexit.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/argparse.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/threading.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_locale.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/runpy.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/types.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/context.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/reduction.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/shared_memory.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/synchronize.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/popen_fork.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/synchronize.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/sharedctypes.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/util.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/popen_spawn_posix.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/spawn.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/process.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/popen_spawn_posix.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/util.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/popen_spawn_win32.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/queues.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/popen_spawn_win32.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/reduction.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/context.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/shared_memory.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/pool.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/process.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/managers.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/connection.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/sharedctypes.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/spawn.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/popen_fork.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/queues.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/managers.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/popen_forkserver.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/popen_forkserver.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/pool.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/multiprocessing/connection.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/colorsys.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/sre_parse.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/itertools.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_warnings.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/sre_parse.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/re.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/difflib.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/fractions.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_bisect.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/pstats.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/token.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/codecs.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_collections_abc.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/locale.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/tempfile.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/textwrap.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/_abc.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/machinery.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/metadata: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/metadata/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/metadata/_meta.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/metadata/_meta.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/metadata/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/abc.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/readers.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/abc.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/_abc.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/readers.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/resources: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/resources/abc.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/resources/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/resources/abc.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/resources/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/importlib/machinery.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/futures.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/exceptions.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/selector_events.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/unix_events.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/futures.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/timeouts.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/subprocess.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/subprocess.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/unix_events.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/exceptions.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/locks.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/protocols.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/queues.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/locks.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/base_events.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/coroutines.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/events.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/transports.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/taskgroups.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/selector_events.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/transports.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/coroutines.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/mixins.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/queues.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/mixins.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/base_events.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/threads.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/streams.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/tasks.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/taskgroups.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/tasks.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/runners.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/streams.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/events.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/runners.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/threads.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/protocols.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/asyncio/timeouts.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traceback.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/ui.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/io: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/io/sidecar.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/io/sidecar.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/io/executable_validator.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/io/indexer.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/io/helicon.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/io/indexer.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/io/helicon.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/io/executable_validator.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/models.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/io.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/ui.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/logging_setup.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/logging_setup.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/imaging.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/models.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/config.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/faststack.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/imaging.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/faststack.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/config.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/faststack: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/faststack/io.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/profile.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/select.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/binascii.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/uuid.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_random.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/io.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_lsprof.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/typing.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/traceback.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_operator.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/email: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/email/charset.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/email/_policybase.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/email/message.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/email/header.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/email/policy.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/email/errors.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/email/charset.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/email/contentmanager.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/email/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/email/errors.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/email/message.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/email/_policybase.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/email/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/email/contentmanager.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/email/header.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/email/policy.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/array.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/platform.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_ast.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/msvcrt.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_stat.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/copy.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/binascii.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/logging: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/logging/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/logging/handlers.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/logging/config.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/logging/handlers.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/logging/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/logging/config.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/stat.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/fnmatch.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/exceptions.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/typing: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/typing/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/typing/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/polynomial: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/polynomial/polynomial.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/polynomial/legendre.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/polynomial/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/polynomial/legendre.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/polynomial/polyutils.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/polynomial/_polybase.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/polynomial/chebyshev.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/polynomial/hermite.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/polynomial/laguerre.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/polynomial/_polybase.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/polynomial/hermite_e.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/polynomial/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/polynomial/hermite_e.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/polynomial/polynomial.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/polynomial/polyutils.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/polynomial/chebyshev.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/polynomial/hermite.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/polynomial/laguerre.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/version.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/dtypes.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_pytesttester.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_pytesttester.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/dtypes.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/exceptions.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/ctypeslib.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/utils.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/scimath.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/stride_tricks.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/arraysetops.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/npyio.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/npyio.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/arraysetops.data.json.fb9c4864355d404e: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/twodim_base.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/utils.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/histograms.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/format.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/function_base.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/index_tricks.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/shape_base.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/polynomial.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/nanfunctions.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/arraysetops.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/arrayterator.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/nanfunctions.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/_version.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/_version.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/arrayterator.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/stride_tricks.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/arraypad.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/arraypad.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/shape_base.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/type_check.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/ufunclike.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/type_check.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/scimath.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/function_base.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/mixins.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/polynomial.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/mixins.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/histograms.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/twodim_base.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/ufunclike.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/format.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/lib/index_tricks.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_callable.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_char_codes.data.json.feedcc2d4b38d34a: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_scalars.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_nbit.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_scalars.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_array_like.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_ufunc.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_array_like.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_shape.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_extended_precision.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_shape.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_ufunc.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_char_codes.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_add_docstring.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_extended_precision.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_nbit.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_nested_sequence.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_char_codes.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_nested_sequence.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_add_docstring.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_dtype_like.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_callable.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_typing/_dtype_like.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/random: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/random/bit_generator.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/random/_philox.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/random/_mt19937.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/random/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/random/_pcg64.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/random/_generator.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/random/bit_generator.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/random/_generator.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/random/_philox.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/random/mtrand.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/random/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/random/_mt19937.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/random/_pcg64.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/random/_sfc64.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/random/mtrand.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/random/_sfc64.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/fft: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/fft/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/fft/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/fft/_pocketfft.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/fft/helper.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/fft/helper.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/fft/_pocketfft.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/ma: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/ma/extras.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/ma/extras.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/ma/core.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/ma/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/ma/core.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/ma/mrecords.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/ma/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/ma/mrecords.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/matrixlib: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/matrixlib/defmatrix.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/matrixlib/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/matrixlib/defmatrix.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/matrixlib/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/ctypeslib.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_utils: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_utils/_convertions.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_utils/_convertions.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_utils/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/_utils/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/linalg: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/linalg/linalg.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/linalg/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/linalg/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/linalg/linalg.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/testing: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/testing/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/testing/_private: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/testing/_private/utils.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/testing/_private/utils.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/testing/_private/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/testing/_private/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/testing/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/version.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/numerictypes.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/fromnumeric.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/fromnumeric.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/numerictypes.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/_ufunc_config.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/function_base.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/shape_base.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/numeric.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/numeric.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/_asarray.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/_asarray.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/records.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/_internal.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/multiarray.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/_ufunc_config.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/defchararray.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/umath.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/_type_aliases.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/einsumfunc.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/multiarray.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/arrayprint.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/arrayprint.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/shape_base.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/records.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/defchararray.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/umath.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/function_base.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/_type_aliases.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/einsumfunc.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/numpy/core/_internal.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/hashlib.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/__main__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/mmap.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/signal.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/decimal.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/cProfile.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/queue.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/inspect.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PyQt6: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PyQt6/sip.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PyQt6/QtCore.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PyQt6/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PyQt6/QtGui.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PyQt6/sip.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PyQt6/QtCore.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PyQt6/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/PyQt6/QtGui.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/array.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/concurrent: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/concurrent/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/concurrent/futures: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/concurrent/futures/process.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/concurrent/futures/thread.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/concurrent/futures/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/concurrent/futures/thread.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/concurrent/futures/process.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/concurrent/futures/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/concurrent/futures/_base.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/concurrent/futures/_base.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/concurrent/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/tempfile.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/site.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/gc.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/_socket.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/pprint.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/pprint.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/pstats.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/utils.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/buffer.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/utils.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/dummy.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/dimension.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/controls.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/scrollable_pane.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/margins.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/utils.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/mouse_handlers.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/menus.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/screen.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/layout.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/dummy.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/mouse_handlers.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/processors.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/containers.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/scrollable_pane.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/dimension.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/controls.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/containers.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/processors.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/menus.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/margins.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/layout.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/layout/screen.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/data_structures.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/completion: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/completion/filesystem.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/completion/fuzzy_completer.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/completion/word_completer.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/completion/deduplicate.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/completion/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/completion/nested.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/completion/word_completer.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/completion/filesystem.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/completion/base.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/completion/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/completion/nested.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/completion/deduplicate.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/completion/base.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/completion/fuzzy_completer.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/shortcuts: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/shortcuts/utils.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/shortcuts/utils.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/shortcuts/progress_bar: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/shortcuts/progress_bar/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/shortcuts/progress_bar/formatters.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/shortcuts/progress_bar/base.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/shortcuts/progress_bar/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/shortcuts/progress_bar/base.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/shortcuts/progress_bar/formatters.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/shortcuts/prompt.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/shortcuts/prompt.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/shortcuts/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/shortcuts/dialogs.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/shortcuts/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/shortcuts/dialogs.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/search.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/utils.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/filters: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/filters/utils.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/filters/utils.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/filters/app.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/filters/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/filters/cli.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/filters/base.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/filters/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/filters/app.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/filters/base.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/filters/cli.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/keys.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/mouse_events.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/history.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/enums.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/buffer.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/cache.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/auto_suggest.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/keys.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/patch_stdout.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/eventloop: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/eventloop/utils.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/eventloop/utils.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/eventloop/inputhook.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/eventloop/inputhook.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/eventloop/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/eventloop/async_generator.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/eventloop/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/eventloop/async_generator.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/auto_suggest.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/validation.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/output: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/output/flush_stdout.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/output/plain_text.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/output/vt100.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/output/plain_text.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/output/defaults.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/output/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/output/color_depth.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/output/vt100.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/output/base.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/output/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/output/defaults.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/output/flush_stdout.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/output/color_depth.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/output/base.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/mouse_events.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/document.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/renderer.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/widgets: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/widgets/toolbars.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/widgets/menus.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/widgets/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/widgets/dialogs.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/widgets/toolbars.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/widgets/base.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/widgets/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/widgets/dialogs.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/widgets/menus.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/widgets/base.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/key_processor.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/cpr.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/named_commands.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/cpr.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/completion.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/focus.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/auto_suggest.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/focus.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/auto_suggest.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/mouse.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/vi.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/page_navigation.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/open_in_editor.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/basic.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/basic.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/open_in_editor.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/scroll.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/completion.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/mouse.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/emacs.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/vi.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/emacs.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/page_navigation.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/scroll.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/bindings/named_commands.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/key_bindings.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/key_processor.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/vi_state.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/emacs_state.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/defaults.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/defaults.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/digraphs.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/vi_state.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/emacs_state.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/key_bindings.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/key_binding/digraphs.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/input: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/input/vt100_parser.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/input/typeahead.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/input/ansi_escape_sequences.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/input/defaults.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/input/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/input/typeahead.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/input/base.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/input/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/input/defaults.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/input/vt100_parser.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/input/base.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/input/ansi_escape_sequences.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/enums.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/search.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/history.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/validation.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/formatted_text: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/formatted_text/utils.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/formatted_text/ansi.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/formatted_text/pygments.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/formatted_text/utils.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/formatted_text/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/formatted_text/pygments.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/formatted_text/ansi.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/formatted_text/base.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/formatted_text/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/formatted_text/html.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/formatted_text/base.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/formatted_text/html.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/patch_stdout.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/cursor_shapes.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/styles: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/styles/pygments.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/styles/style.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/styles/style.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/styles/style_transformation.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/styles/named_colors.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/styles/defaults.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/styles/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/styles/pygments.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/styles/base.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/styles/style_transformation.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/styles/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/styles/defaults.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/styles/named_colors.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/styles/base.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/application: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/application/dummy.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/application/dummy.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/application/current.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/application/run_in_terminal.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/application/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/application/application.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/application/run_in_terminal.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/application/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/application/current.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/application/application.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/clipboard: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/clipboard/in_memory.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/clipboard/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/clipboard/base.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/clipboard/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/clipboard/base.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/clipboard/in_memory.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/document.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/lexers: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/lexers/pygments.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/lexers/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/lexers/pygments.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/lexers/base.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/lexers/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/lexers/base.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/data_structures.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/selection.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/selection.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/renderer.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/cache.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/prompt_toolkit/cursor_shapes.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/re.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/genericpath.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/pyexpat: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/pyexpat/errors.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/pyexpat/__init__.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/pyexpat/errors.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/pyexpat/__init__.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/pyexpat/model.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/pyexpat/model.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/select.meta.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/errno.data.json: Cannot open: No such file or directory +tar: faststack/.mypy_cache: Cannot mkdir: No such file or directory +tar: faststack/.mypy_cache/3.12/wave.data.json: Cannot open: No such file or directory +tar: faststack: Cannot utime: No such file or directory +tar: faststack: Cannot stat: No such file or directory +tar: Exiting with failure status due to previous errors