Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ee94d8e529 | ||
|
|
ac32c55ab9 |
No files matched your search
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"python.pythonPath": "c:\\projects\\stable_api\\venv\\Scripts\\python.exe"
|
||||
}
|
||||
@@ -2,17 +2,23 @@ import sys
|
||||
import json
|
||||
import base64
|
||||
import requests
|
||||
import os
|
||||
from time import sleep
|
||||
from PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,
|
||||
QHBoxLayout, QLabel, QLineEdit, QPushButton,
|
||||
QComboBox, QSpinBox, QDoubleSpinBox, QProgressBar,
|
||||
QScrollArea, QTextEdit, QFileDialog, QMenuBar, QMenu)
|
||||
from PyQt6.QtCore import Qt, QThread, pyqtSignal, QTimer
|
||||
from PyQt6.QtGui import QPixmap, QImage, QAction
|
||||
from PyQt6.QtGui import QPixmap, QImage, QAction, QFontDatabase, QFont
|
||||
from PIL import Image
|
||||
from io import BytesIO
|
||||
from pathlib import Path
|
||||
from dotenv import load_dotenv
|
||||
|
||||
# Импортируем новые модули
|
||||
# Загружаем переменные окружения
|
||||
load_dotenv()
|
||||
|
||||
# Импортируем модули
|
||||
from modules.console_window import ConsoleWindow
|
||||
from modules.model_manager import ModelManager
|
||||
from modules.sampler_manager import SamplerManager
|
||||
@@ -20,6 +26,13 @@ from modules.prompt_window import PromptWindow
|
||||
from modules.negative_prompt_window import NegativePromptWindow
|
||||
from modules.size_preset_manager import SizePresetManager
|
||||
from modules.settings_menu import SettingsMenu
|
||||
from modules.styles.base_window import BaseWindow
|
||||
from modules.styles.navigation import NavigationPanel
|
||||
from modules.styles.page import PageContainer
|
||||
from modules.pages.home_page import HomePage
|
||||
from modules.pages.models_page import ModelsPage
|
||||
from modules.pages.settings_page import SettingsPage
|
||||
from scripts.download_resources import download_font
|
||||
|
||||
class GenerationThread(QThread):
|
||||
progress_updated = pyqtSignal(float, str)
|
||||
@@ -61,497 +74,148 @@ class GenerationThread(QThread):
|
||||
def stop(self):
|
||||
self.is_generating = False
|
||||
|
||||
class MainWindow(QMainWindow):
|
||||
class MainWindow(BaseWindow):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.api_url = "http://localhost:7860" # URL по умолчанию
|
||||
self.console_window = None
|
||||
self.prompt_window = None
|
||||
self.negative_prompt_window = None
|
||||
self.progress_timer = None
|
||||
|
||||
# Создаем меню бар
|
||||
self.create_menu_bar()
|
||||
|
||||
self.init_ui()
|
||||
|
||||
def create_menu_bar(self):
|
||||
"""Создание меню бара с настройками"""
|
||||
menubar = QMenuBar(self)
|
||||
menubar.setStyleSheet("""
|
||||
QMenuBar {
|
||||
background-color: #2b2b2b;
|
||||
color: #ffffff;
|
||||
border-bottom: 1px solid #3b3b3b;
|
||||
padding: 2px;
|
||||
}
|
||||
QMenuBar::item {
|
||||
background-color: transparent;
|
||||
padding: 8px 12px;
|
||||
margin: 0;
|
||||
border-radius: 4px;
|
||||
}
|
||||
QMenuBar::item:selected {
|
||||
background-color: #3b3b3b;
|
||||
}
|
||||
QMenuBar::item:pressed {
|
||||
background-color: #404040;
|
||||
}
|
||||
""")
|
||||
|
||||
# Добавляем меню настроек
|
||||
settings_menu = SettingsMenu(self)
|
||||
menubar.addMenu(settings_menu)
|
||||
|
||||
self.setMenuBar(menubar)
|
||||
|
||||
def init_ui(self):
|
||||
self.setWindowTitle("Stable Diffusion UI")
|
||||
self.setStyleSheet("""
|
||||
QMainWindow {
|
||||
background-color: #2b2b2b;
|
||||
}
|
||||
QWidget {
|
||||
color: #ffffff;
|
||||
font-size: 14px;
|
||||
}
|
||||
QLineEdit, QTextEdit, QComboBox, QSpinBox, QDoubleSpinBox {
|
||||
background-color: #3b3b3b;
|
||||
border: 1px solid #555555;
|
||||
border-radius: 4px;
|
||||
padding: 5px;
|
||||
color: #ffffff;
|
||||
min-width: 100px;
|
||||
}
|
||||
QSpinBox::up-button, QDoubleSpinBox::up-button {
|
||||
background-color: #4a4a4a;
|
||||
border: none;
|
||||
border-left: 1px solid #555555;
|
||||
border-bottom: 1px solid #555555;
|
||||
border-top-right-radius: 4px;
|
||||
width: 20px;
|
||||
height: 12px;
|
||||
}
|
||||
QSpinBox::down-button, QDoubleSpinBox::down-button {
|
||||
background-color: #4a4a4a;
|
||||
border: none;
|
||||
border-left: 1px solid #555555;
|
||||
border-bottom-right-radius: 4px;
|
||||
width: 20px;
|
||||
height: 12px;
|
||||
}
|
||||
QSpinBox::up-button:hover, QDoubleSpinBox::up-button:hover,
|
||||
QSpinBox::down-button:hover, QDoubleSpinBox::down-button:hover {
|
||||
background-color: #5a5a5a;
|
||||
}
|
||||
QSpinBox::up-button:pressed, QDoubleSpinBox::up-button:pressed,
|
||||
QSpinBox::down-button:pressed, QDoubleSpinBox::down-button:pressed {
|
||||
background-color: #666666;
|
||||
}
|
||||
QSpinBox::up-arrow, QDoubleSpinBox::up-arrow {
|
||||
image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOCA0TDQgOEgxMkw4IDRaIiBmaWxsPSIjZmZmZmZmIi8+PC9zdmc+);
|
||||
width: 12px;
|
||||
height: 6px;
|
||||
}
|
||||
QSpinBox::down-arrow, QDoubleSpinBox::down-arrow {
|
||||
image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOCAxMkwxMiA4SDRMOCAxMloiIGZpbGw9IiNmZmZmZmYiLz48L3N2Zz4=);
|
||||
width: 12px;
|
||||
height: 6px;
|
||||
}
|
||||
QPushButton {
|
||||
background-color: #0d6efd;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
padding: 8px 16px;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
}
|
||||
QPushButton:hover {
|
||||
background-color: #0b5ed7;
|
||||
}
|
||||
QPushButton:pressed {
|
||||
background-color: #0a58ca;
|
||||
}
|
||||
QProgressBar {
|
||||
border: 1px solid #555555;
|
||||
border-radius: 4px;
|
||||
text-align: center;
|
||||
}
|
||||
QProgressBar::chunk {
|
||||
background-color: #0d6efd;
|
||||
}
|
||||
""")
|
||||
self.setMinimumSize(1200, 800)
|
||||
|
||||
# Получаем URL API из переменных окружения
|
||||
self.api_url = os.getenv('SD_API_URL', 'http://localhost:3000')
|
||||
|
||||
# Инициализируем менеджеры
|
||||
self.model_manager = ModelManager(api_url=self.api_url)
|
||||
self.sampler_manager = SamplerManager(api_url=self.api_url)
|
||||
self.size_preset_manager = SizePresetManager()
|
||||
|
||||
# Инициализируем окна
|
||||
self.prompt_window = PromptWindow()
|
||||
self.negative_prompt_window = NegativePromptWindow()
|
||||
self.console_window = ConsoleWindow()
|
||||
|
||||
self.setup_ui()
|
||||
|
||||
def setup_ui(self):
|
||||
# Загружаем шрифт
|
||||
font_path = Path("resources/fonts/InterVariable.ttf")
|
||||
if not font_path.exists():
|
||||
download_font()
|
||||
font_id = QFontDatabase.addApplicationFont(str(font_path))
|
||||
if font_id != -1:
|
||||
font_family = QFontDatabase.applicationFontFamilies(font_id)[0]
|
||||
app_font = QFont(font_family)
|
||||
QApplication.setFont(app_font)
|
||||
|
||||
# Создаем центральный виджет
|
||||
central_widget = QWidget()
|
||||
self.setCentralWidget(central_widget)
|
||||
main_layout = QHBoxLayout(central_widget)
|
||||
main_layout = QVBoxLayout(central_widget)
|
||||
main_layout.setContentsMargins(0, 0, 0, 0)
|
||||
main_layout.setSpacing(0)
|
||||
|
||||
# Левая панель с настройками
|
||||
settings_widget = QWidget()
|
||||
settings_layout = QVBoxLayout(settings_widget)
|
||||
settings_layout.setSpacing(10)
|
||||
# Создаем верхнюю панель
|
||||
top_panel = QHBoxLayout()
|
||||
|
||||
# URL API
|
||||
api_layout = QHBoxLayout()
|
||||
api_label = QLabel("API URL:")
|
||||
self.api_url_input = QLineEdit(self.api_url)
|
||||
self.api_url_input.textChanged.connect(self.update_api_url)
|
||||
api_layout.addWidget(api_label)
|
||||
api_layout.addWidget(self.api_url_input)
|
||||
settings_layout.addLayout(api_layout)
|
||||
# Кнопки для окон промптов
|
||||
prompt_btn = QPushButton("Библиотека промптов")
|
||||
prompt_btn.clicked.connect(self.show_prompt_window)
|
||||
top_panel.addWidget(prompt_btn)
|
||||
|
||||
# Промпт
|
||||
prompt_layout = QVBoxLayout()
|
||||
prompt_header = QHBoxLayout()
|
||||
prompt_label = QLabel("Промпт:")
|
||||
self.prompt_input = QTextEdit()
|
||||
self.prompt_input.setMinimumHeight(100)
|
||||
prompt_buttons = QHBoxLayout()
|
||||
self.prompt_button = QPushButton("Готовые промпты")
|
||||
self.prompt_button.clicked.connect(self.toggle_prompt_window)
|
||||
self.negative_prompt_button = QPushButton("Негативные промпты")
|
||||
self.negative_prompt_button.clicked.connect(self.toggle_negative_prompt_window)
|
||||
prompt_buttons.addWidget(self.prompt_button)
|
||||
prompt_buttons.addWidget(self.negative_prompt_button)
|
||||
prompt_header.addWidget(prompt_label)
|
||||
prompt_header.addLayout(prompt_buttons)
|
||||
prompt_layout.addLayout(prompt_header)
|
||||
prompt_layout.addWidget(self.prompt_input)
|
||||
settings_layout.addLayout(prompt_layout)
|
||||
negative_prompt_btn = QPushButton("Негативные промпты")
|
||||
negative_prompt_btn.clicked.connect(self.show_negative_prompt_window)
|
||||
top_panel.addWidget(negative_prompt_btn)
|
||||
|
||||
# Негативный промпт
|
||||
negative_prompt_layout = QVBoxLayout()
|
||||
negative_prompt_label = QLabel("Негативный промпт:")
|
||||
self.negative_prompt_input = QTextEdit()
|
||||
self.negative_prompt_input.setMinimumHeight(100)
|
||||
negative_prompt_layout.addWidget(negative_prompt_label)
|
||||
negative_prompt_layout.addWidget(self.negative_prompt_input)
|
||||
settings_layout.addLayout(negative_prompt_layout)
|
||||
# Пресеты разрешения
|
||||
resolution_combo = QComboBox()
|
||||
resolution_combo.addItems(self.size_preset_manager.get_preset_names())
|
||||
resolution_combo.currentTextChanged.connect(self.on_resolution_changed)
|
||||
top_panel.addWidget(resolution_combo)
|
||||
|
||||
# Добавляем менеджер моделей
|
||||
self.model_manager = ModelManager(self.api_url)
|
||||
self.model_manager.model_changed.connect(self.on_model_changed)
|
||||
settings_layout.addWidget(self.model_manager)
|
||||
# Кнопка консоли
|
||||
console_btn = QPushButton("Консоль")
|
||||
console_btn.clicked.connect(self.show_console)
|
||||
top_panel.addWidget(console_btn)
|
||||
|
||||
# Добавляем менеджер сэмплеров
|
||||
self.sampler_manager = SamplerManager(self.api_url)
|
||||
settings_layout.addWidget(self.sampler_manager)
|
||||
top_panel.addStretch()
|
||||
main_layout.addLayout(top_panel)
|
||||
|
||||
# Добавляем менеджер пресетов размеров
|
||||
self.size_preset_manager = SizePresetManager()
|
||||
self.size_preset_manager.size_changed.connect(self.on_size_preset_changed)
|
||||
settings_layout.addWidget(self.size_preset_manager)
|
||||
# Создаем горизонтальный layout для навигации и контента
|
||||
content_layout = QHBoxLayout()
|
||||
|
||||
# Параметры генерации
|
||||
params_layout = QVBoxLayout()
|
||||
# Добавляем навигационную панель
|
||||
self.nav_panel = NavigationPanel()
|
||||
content_layout.addWidget(self.nav_panel)
|
||||
|
||||
# Размеры
|
||||
size_layout = QHBoxLayout()
|
||||
width_label = QLabel("Ширина:")
|
||||
self.width_input = QSpinBox()
|
||||
self.width_input.setRange(64, 2048)
|
||||
self.width_input.setValue(512)
|
||||
height_label = QLabel("Высота:")
|
||||
self.height_input = QSpinBox()
|
||||
self.height_input.setRange(64, 2048)
|
||||
self.height_input.setValue(512)
|
||||
size_layout.addWidget(width_label)
|
||||
size_layout.addWidget(self.width_input)
|
||||
size_layout.addWidget(height_label)
|
||||
size_layout.addWidget(self.height_input)
|
||||
params_layout.addLayout(size_layout)
|
||||
# Создаем контейнер для страниц
|
||||
self.page_container = PageContainer()
|
||||
content_layout.addWidget(self.page_container)
|
||||
|
||||
# Сид
|
||||
seed_layout = QHBoxLayout()
|
||||
seed_label = QLabel("Сид:")
|
||||
self.seed_input = QSpinBox()
|
||||
self.seed_input.setRange(-1, 999999999)
|
||||
self.seed_input.setValue(-1)
|
||||
seed_layout.addWidget(seed_label)
|
||||
seed_layout.addWidget(self.seed_input)
|
||||
params_layout.addLayout(seed_layout)
|
||||
main_layout.addLayout(content_layout)
|
||||
|
||||
# CFG Scale
|
||||
cfg_layout = QHBoxLayout()
|
||||
cfg_label = QLabel("CFG Scale:")
|
||||
self.cfg_input = QDoubleSpinBox()
|
||||
self.cfg_input.setRange(1.0, 30.0)
|
||||
self.cfg_input.setValue(7.0)
|
||||
cfg_layout.addWidget(cfg_label)
|
||||
cfg_layout.addWidget(self.cfg_input)
|
||||
params_layout.addLayout(cfg_layout)
|
||||
# Добавляем страницы
|
||||
self.home_page = HomePage(
|
||||
model_manager=self.model_manager,
|
||||
sampler_manager=self.sampler_manager,
|
||||
size_preset_manager=self.size_preset_manager
|
||||
)
|
||||
self.models_page = ModelsPage(self.model_manager)
|
||||
self.settings_page = SettingsPage()
|
||||
|
||||
# Шаги
|
||||
steps_layout = QHBoxLayout()
|
||||
steps_label = QLabel("Шаги:")
|
||||
self.steps_input = QSpinBox()
|
||||
self.steps_input.setRange(1, 150)
|
||||
self.steps_input.setValue(20)
|
||||
steps_layout.addWidget(steps_label)
|
||||
steps_layout.addWidget(self.steps_input)
|
||||
params_layout.addLayout(steps_layout)
|
||||
self.page_container.add_page("home", self.home_page)
|
||||
self.page_container.add_page("models", self.models_page)
|
||||
self.page_container.add_page("settings", self.settings_page)
|
||||
|
||||
settings_layout.addLayout(params_layout)
|
||||
# Подключаем сигнал смены страницы
|
||||
self.nav_panel.page_changed.connect(self.switch_page)
|
||||
|
||||
# Добавляем кнопку консоли
|
||||
self.console_button = QPushButton("Открыть консоль")
|
||||
self.console_button.clicked.connect(self.toggle_console)
|
||||
settings_layout.addWidget(self.console_button)
|
||||
# Показываем домашнюю страницу по умолчанию
|
||||
self.page_container.show_page("home")
|
||||
|
||||
# Кнопка генерации
|
||||
self.generate_button = QPushButton("Сгенерировать")
|
||||
self.generate_button.clicked.connect(self.start_generation)
|
||||
settings_layout.addWidget(self.generate_button)
|
||||
# Загружаем данные
|
||||
self.load_data()
|
||||
|
||||
# Прогресс бар
|
||||
self.progress_bar = QProgressBar()
|
||||
settings_layout.addWidget(self.progress_bar)
|
||||
|
||||
# Добавляем левую панель в основной layout
|
||||
main_layout.addWidget(settings_widget, stretch=1)
|
||||
|
||||
# Правая панель для результатов
|
||||
results_widget = QWidget()
|
||||
results_layout = QVBoxLayout(results_widget)
|
||||
|
||||
# Область для отображения изображений
|
||||
scroll_area = QScrollArea()
|
||||
scroll_area.setWidgetResizable(True)
|
||||
scroll_area.setMinimumWidth(512)
|
||||
self.results_content = QWidget()
|
||||
self.results_content_layout = QVBoxLayout(self.results_content)
|
||||
scroll_area.setWidget(self.results_content)
|
||||
results_layout.addWidget(scroll_area)
|
||||
|
||||
# Добавляем правую панель в основной layout
|
||||
main_layout.addWidget(results_widget, stretch=2)
|
||||
|
||||
# Устанавливаем размер окна
|
||||
self.setMinimumSize(1200, 800)
|
||||
|
||||
def toggle_console(self):
|
||||
"""Открыть/закрыть окно консоли"""
|
||||
if self.console_window is None:
|
||||
self.console_window = ConsoleWindow(parent=self)
|
||||
self.console_window.console_closed.connect(self.on_console_closed)
|
||||
self.console_window.show()
|
||||
else:
|
||||
self.console_window.close()
|
||||
|
||||
def on_console_closed(self):
|
||||
"""Обработчик закрытия окна консоли"""
|
||||
self.console_window = None
|
||||
|
||||
def on_model_changed(self, model_name):
|
||||
"""Обработчик смены модели"""
|
||||
print(f"Модель изменена на: {model_name}")
|
||||
|
||||
def log_to_console(self, message):
|
||||
"""Логирование в консоль"""
|
||||
if self.console_window:
|
||||
self.console_window.log(message)
|
||||
print(message)
|
||||
|
||||
def toggle_prompt_window(self):
|
||||
"""Открыть/закрыть окно с промптами"""
|
||||
if self.prompt_window is None:
|
||||
self.prompt_window = PromptWindow(parent=self)
|
||||
self.prompt_window.prompt_selected.connect(self.add_prompt)
|
||||
self.prompt_window.show()
|
||||
else:
|
||||
self.prompt_window.close()
|
||||
|
||||
def toggle_negative_prompt_window(self):
|
||||
"""Открыть/закрыть окно с негативными промптами"""
|
||||
if self.negative_prompt_window is None:
|
||||
self.negative_prompt_window = NegativePromptWindow(parent=self)
|
||||
self.negative_prompt_window.prompt_selected.connect(self.add_negative_prompt)
|
||||
self.negative_prompt_window.show()
|
||||
else:
|
||||
self.negative_prompt_window.close()
|
||||
|
||||
def add_prompt(self, text):
|
||||
"""Добавить промпт в поле ввода"""
|
||||
current_text = self.prompt_input.toPlainText()
|
||||
if current_text:
|
||||
current_text += ", "
|
||||
self.prompt_input.setText(current_text + text)
|
||||
|
||||
def add_negative_prompt(self, text):
|
||||
"""Добавить негативный промпт в поле ввода"""
|
||||
current_text = self.negative_prompt_input.toPlainText()
|
||||
if current_text:
|
||||
current_text += ", "
|
||||
self.negative_prompt_input.setText(current_text + text)
|
||||
|
||||
def start_generation(self):
|
||||
self.generate_button.setEnabled(False)
|
||||
self.progress_bar.setValue(0)
|
||||
|
||||
params = {
|
||||
"prompt": self.prompt_input.toPlainText(),
|
||||
"negative_prompt": self.negative_prompt_input.toPlainText(),
|
||||
"width": self.width_input.value(),
|
||||
"height": self.height_input.value(),
|
||||
"seed": self.seed_input.value(),
|
||||
"cfg_scale": self.cfg_input.value(),
|
||||
"steps": self.steps_input.value(),
|
||||
"sampler_name": self.sampler_manager.get_current_sampler(),
|
||||
"batch_size": 1
|
||||
}
|
||||
|
||||
self.log_to_console(f"Начало генерации с параметрами: {json.dumps(params, indent=2, ensure_ascii=False)}")
|
||||
|
||||
# Запускаем таймер для отслеживания прогресса
|
||||
self.progress_timer = QTimer()
|
||||
self.progress_timer.timeout.connect(self.check_progress)
|
||||
self.progress_timer.start(100) # Проверяем каждые 100 мс
|
||||
|
||||
self.generation_thread = GenerationThread(self.api_url_input.text(), params)
|
||||
self.generation_thread.generation_complete.connect(self.handle_generation_complete)
|
||||
self.generation_thread.error_occurred.connect(self.handle_error)
|
||||
self.generation_thread.start()
|
||||
|
||||
def check_progress(self):
|
||||
"""Проверка прогресса генерации"""
|
||||
def load_data(self):
|
||||
"""Загрузка данных с сервера"""
|
||||
try:
|
||||
response = requests.get(f"{self.api_url_input.text()}/sdapi/v1/progress")
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
progress = data.get('progress', 0)
|
||||
current_step = data.get('current_step', 0)
|
||||
total_steps = data.get('total_steps', 1)
|
||||
# Загружаем список моделей
|
||||
self.model_manager.load_models()
|
||||
|
||||
percentage = int(progress * 100)
|
||||
self.progress_bar.setValue(percentage)
|
||||
self.log_to_console(f"Прогресс: {percentage}% - Шаг {current_step}/{total_steps}")
|
||||
# Загружаем список сэмплеров
|
||||
self.sampler_manager.load_samplers()
|
||||
|
||||
# Обновляем интерфейс
|
||||
self.home_page.update_ui()
|
||||
self.models_page.update_ui()
|
||||
|
||||
# Если генерация завершена, останавливаем таймер
|
||||
if progress >= 1.0:
|
||||
self.progress_timer.stop()
|
||||
self.progress_timer = None
|
||||
except Exception as e:
|
||||
print(f"Ошибка при получении прогресса: {str(e)}")
|
||||
self.console_window.log(f"Ошибка загрузки данных: {str(e)}", "ERROR")
|
||||
|
||||
def handle_generation_complete(self, images):
|
||||
"""Обработка завершения генерации"""
|
||||
# Останавливаем таймер, если он ещё активен
|
||||
if self.progress_timer:
|
||||
self.progress_timer.stop()
|
||||
self.progress_timer = None
|
||||
def show_prompt_window(self):
|
||||
"""Показать окно промптов"""
|
||||
self.prompt_window.show()
|
||||
|
||||
self.generate_button.setEnabled(True)
|
||||
self.progress_bar.setValue(100)
|
||||
self.log_to_console("Генерация завершена успешно")
|
||||
def show_negative_prompt_window(self):
|
||||
"""Показать окно негативных промптов"""
|
||||
self.negative_prompt_window.show()
|
||||
|
||||
# Очищаем предыдущие результаты
|
||||
for i in reversed(range(self.results_content_layout.count())):
|
||||
self.results_content_layout.itemAt(i).widget().setParent(None)
|
||||
def show_console(self):
|
||||
"""Показать консоль"""
|
||||
self.console_window.show()
|
||||
|
||||
for img_data in images:
|
||||
try:
|
||||
# Декодируем base64 в байты
|
||||
img_bytes = base64.b64decode(img_data)
|
||||
self.log_to_console(f"Размер полученных данных: {len(img_bytes)} байт")
|
||||
def on_resolution_changed(self, preset_name: str):
|
||||
"""Обработка изменения пресета разрешения"""
|
||||
preset = self.size_preset_manager.get_preset(preset_name)
|
||||
if preset:
|
||||
self.home_page.set_resolution(preset.width, preset.height)
|
||||
|
||||
# Создаем объект изображения
|
||||
img = Image.open(BytesIO(img_bytes))
|
||||
self.log_to_console(f"Размер изображения: {img.size}, формат: {img.format}")
|
||||
def switch_page(self, page_name):
|
||||
self.page_container.show_page(page_name)
|
||||
|
||||
# Конвертируем в RGB если нужно
|
||||
if img.mode != 'RGB':
|
||||
img = img.convert('RGB')
|
||||
|
||||
# Сохраняем во временный буфер как PNG
|
||||
buffer = BytesIO()
|
||||
img.save(buffer, format='PNG')
|
||||
buffer.seek(0)
|
||||
|
||||
# Создаем QPixmap
|
||||
pixmap = QPixmap()
|
||||
if not pixmap.loadFromData(buffer.getvalue()):
|
||||
raise Exception("Не удалось создать QPixmap из данных")
|
||||
|
||||
# Проверяем размер QPixmap
|
||||
if pixmap.isNull():
|
||||
raise Exception("Создан пустой QPixmap")
|
||||
|
||||
self.log_to_console(f"Размер QPixmap: {pixmap.width()}x{pixmap.height()}")
|
||||
|
||||
# Создаем и добавляем QLabel с изображением
|
||||
img_label = QLabel()
|
||||
img_label.setPixmap(pixmap)
|
||||
img_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
|
||||
# Создаем кнопку сохранения
|
||||
save_button = QPushButton("Сохранить")
|
||||
save_button.clicked.connect(lambda checked, img=img: self.save_image(img))
|
||||
|
||||
# Создаем кнопку копирования в буфер обмена
|
||||
copy_button = QPushButton("Копировать")
|
||||
copy_button.clicked.connect(lambda checked, img=img: self.copy_to_clipboard(img))
|
||||
|
||||
# Создаем контейнер для изображения и кнопок
|
||||
container = QWidget()
|
||||
container_layout = QVBoxLayout(container)
|
||||
container_layout.addWidget(img_label)
|
||||
|
||||
# Создаем горизонтальный layout для кнопок
|
||||
buttons_layout = QHBoxLayout()
|
||||
buttons_layout.addWidget(save_button)
|
||||
buttons_layout.addWidget(copy_button)
|
||||
container_layout.addLayout(buttons_layout)
|
||||
|
||||
self.results_content_layout.addWidget(container)
|
||||
self.log_to_console("Изображение успешно добавлено в интерфейс")
|
||||
except Exception as e:
|
||||
error_msg = f"Ошибка отображения изображения: {str(e)}"
|
||||
self.log_to_console(error_msg)
|
||||
error_label = QLabel(error_msg)
|
||||
self.results_content_layout.addWidget(error_label)
|
||||
|
||||
def handle_error(self, error_message):
|
||||
"""Обработка ошибок"""
|
||||
self.generate_button.setEnabled(True)
|
||||
self.log_to_console(f"Ошибка: {error_message}")
|
||||
|
||||
def save_image(self, img):
|
||||
file_path, _ = QFileDialog.getSaveFileName(self, "Сохранить изображение", "", "PNG Files (*.png);;JPEG Files (*.jpg)")
|
||||
if file_path:
|
||||
img.save(file_path)
|
||||
|
||||
def copy_to_clipboard(self, img):
|
||||
"""Копирование изображения в буфер обмена"""
|
||||
# Конвертируем изображение в QPixmap
|
||||
buffer = BytesIO()
|
||||
img.save(buffer, format='PNG')
|
||||
buffer.seek(0)
|
||||
pixmap = QPixmap()
|
||||
pixmap.loadFromData(buffer.getvalue())
|
||||
|
||||
# Копируем в буфер обмена
|
||||
clipboard = QApplication.clipboard()
|
||||
clipboard.setPixmap(pixmap)
|
||||
|
||||
# Показываем уведомление
|
||||
self.log_to_console("Изображение скопировано в буфер обмена")
|
||||
|
||||
def update_api_url(self):
|
||||
"""Обновление URL API во всех компонентах"""
|
||||
new_url = self.api_url_input.text()
|
||||
self.model_manager.update_api_url(new_url)
|
||||
self.sampler_manager.update_api_url(new_url)
|
||||
self.log_to_console(f"API URL обновлен: {new_url}")
|
||||
|
||||
def on_size_preset_changed(self, width, height):
|
||||
"""Обработчик изменения размера через пресет"""
|
||||
self.width_input.setValue(width)
|
||||
self.height_input.setValue(height)
|
||||
self.log_to_console(f"Размер изменен на: {width}x{height}")
|
||||
|
||||
if __name__ == '__main__':
|
||||
def main():
|
||||
app = QApplication(sys.argv)
|
||||
window = MainWindow()
|
||||
window.show()
|
||||
sys.exit(app.exec())
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,71 @@
|
||||
from enum import Enum, auto
|
||||
from typing import List, Dict
|
||||
|
||||
class NegativePromptCategory(Enum):
|
||||
"""Категории негативных промптов"""
|
||||
QUALITY = auto()
|
||||
ARTIFACTS = auto()
|
||||
COMPOSITION = auto()
|
||||
ANATOMY = auto()
|
||||
STYLE = auto()
|
||||
|
||||
class NegativePromptData:
|
||||
"""Класс для хранения данных о негативном промпте"""
|
||||
def __init__(self, text: str, description: str = "", weight: float = 1.0):
|
||||
self.text = text
|
||||
self.description = description
|
||||
self.weight = weight
|
||||
|
||||
class NegativePromptCategories:
|
||||
"""Класс для работы с категориями негативных промптов"""
|
||||
|
||||
@staticmethod
|
||||
def get_prompts() -> Dict[NegativePromptCategory, List[NegativePromptData]]:
|
||||
"""Возвращает словарь с негативными промптами по категориям"""
|
||||
return {
|
||||
NegativePromptCategory.QUALITY: [
|
||||
NegativePromptData("low quality", "Низкое качество"),
|
||||
NegativePromptData("blurry", "Размытое изображение"),
|
||||
NegativePromptData("pixelated", "Пикселизация"),
|
||||
NegativePromptData("jpeg artifacts", "JPEG артефакты"),
|
||||
NegativePromptData("compression artifacts", "Артефакты сжатия"),
|
||||
],
|
||||
NegativePromptCategory.ARTIFACTS: [
|
||||
NegativePromptData("watermark", "Водяные знаки"),
|
||||
NegativePromptData("signature", "Подписи"),
|
||||
NegativePromptData("text", "Текст на изображении"),
|
||||
NegativePromptData("frame", "Рамки"),
|
||||
NegativePromptData("duplicate", "Дубликаты элементов"),
|
||||
],
|
||||
NegativePromptCategory.COMPOSITION: [
|
||||
NegativePromptData("bad composition", "Плохая композиция"),
|
||||
NegativePromptData("unbalanced", "Несбалансированная композиция"),
|
||||
NegativePromptData("cropped", "Обрезанное изображение"),
|
||||
NegativePromptData("out of frame", "Выход за пределы кадра"),
|
||||
],
|
||||
NegativePromptCategory.ANATOMY: [
|
||||
NegativePromptData("bad anatomy", "Неправильная анатомия"),
|
||||
NegativePromptData("extra limbs", "Лишние конечности"),
|
||||
NegativePromptData("missing limbs", "Отсутствующие конечности"),
|
||||
NegativePromptData("deformed", "Деформации"),
|
||||
NegativePromptData("mutated", "Мутации"),
|
||||
],
|
||||
NegativePromptCategory.STYLE: [
|
||||
NegativePromptData("3d render", "3D рендер"),
|
||||
NegativePromptData("cartoon", "Мультяшный стиль"),
|
||||
NegativePromptData("painting", "Живопись"),
|
||||
NegativePromptData("sketch", "Набросок"),
|
||||
NegativePromptData("anime", "Аниме"),
|
||||
],
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def get_category_name(category: NegativePromptCategory) -> str:
|
||||
"""Возвращает название категории на русском"""
|
||||
return {
|
||||
NegativePromptCategory.QUALITY: "Качество",
|
||||
NegativePromptCategory.ARTIFACTS: "Артефакты",
|
||||
NegativePromptCategory.COMPOSITION: "Композиция",
|
||||
NegativePromptCategory.ANATOMY: "Анатомия",
|
||||
NegativePromptCategory.STYLE: "Стиль",
|
||||
}[category]
|
||||
@@ -0,0 +1,86 @@
|
||||
from enum import Enum, auto
|
||||
from typing import List, Dict
|
||||
|
||||
class PromptCategory(Enum):
|
||||
"""Категории промптов"""
|
||||
STYLE = auto()
|
||||
LIGHTING = auto()
|
||||
COMPOSITION = auto()
|
||||
CAMERA = auto()
|
||||
COLORS = auto()
|
||||
MOOD = auto()
|
||||
QUALITY = auto()
|
||||
|
||||
class PromptData:
|
||||
"""Класс для хранения данных о промпте"""
|
||||
def __init__(self, text: str, description: str = "", weight: float = 1.0):
|
||||
self.text = text
|
||||
self.description = description
|
||||
self.weight = weight
|
||||
|
||||
class PromptCategories:
|
||||
"""Класс для работы с категориями промптов"""
|
||||
|
||||
@staticmethod
|
||||
def get_prompts() -> Dict[PromptCategory, List[PromptData]]:
|
||||
"""Возвращает словарь с промптами по категориям"""
|
||||
return {
|
||||
PromptCategory.STYLE: [
|
||||
PromptData("digital art", "Цифровое искусство"),
|
||||
PromptData("oil painting", "Масляная живопись"),
|
||||
PromptData("watercolor", "Акварель"),
|
||||
PromptData("pencil sketch", "Карандашный набросок"),
|
||||
PromptData("anime style", "Аниме стиль"),
|
||||
PromptData("photorealistic", "Фотореалистичный"),
|
||||
],
|
||||
PromptCategory.LIGHTING: [
|
||||
PromptData("soft lighting", "Мягкое освещение"),
|
||||
PromptData("dramatic lighting", "Драматическое освещение"),
|
||||
PromptData("cinematic lighting", "Кинематографическое освещение"),
|
||||
PromptData("natural light", "Естественное освещение"),
|
||||
PromptData("studio lighting", "Студийное освещение"),
|
||||
],
|
||||
PromptCategory.COMPOSITION: [
|
||||
PromptData("rule of thirds", "Правило третей"),
|
||||
PromptData("symmetrical", "Симметричная композиция"),
|
||||
PromptData("centered composition", "Центральная композиция"),
|
||||
PromptData("dynamic pose", "Динамичная поза"),
|
||||
],
|
||||
PromptCategory.CAMERA: [
|
||||
PromptData("close-up shot", "Крупный план"),
|
||||
PromptData("wide angle", "Широкий угол"),
|
||||
PromptData("bokeh", "Боке"),
|
||||
PromptData("depth of field", "Глубина резкости"),
|
||||
],
|
||||
PromptCategory.COLORS: [
|
||||
PromptData("vibrant colors", "Яркие цвета"),
|
||||
PromptData("pastel colors", "Пастельные цвета"),
|
||||
PromptData("monochrome", "Монохром"),
|
||||
PromptData("high contrast", "Высокий контраст"),
|
||||
],
|
||||
PromptCategory.MOOD: [
|
||||
PromptData("peaceful", "Умиротворенное"),
|
||||
PromptData("mysterious", "Таинственное"),
|
||||
PromptData("energetic", "Энергичное"),
|
||||
PromptData("melancholic", "Меланхоличное"),
|
||||
],
|
||||
PromptCategory.QUALITY: [
|
||||
PromptData("highly detailed", "Высокая детализация"),
|
||||
PromptData("8k uhd", "Высокое разрешение"),
|
||||
PromptData("masterpiece", "Шедевр"),
|
||||
PromptData("best quality", "Лучшее качество"),
|
||||
],
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def get_category_name(category: PromptCategory) -> str:
|
||||
"""Возвращает название категории на русском"""
|
||||
return {
|
||||
PromptCategory.STYLE: "Стили",
|
||||
PromptCategory.LIGHTING: "Освещение",
|
||||
PromptCategory.COMPOSITION: "Композиция",
|
||||
PromptCategory.CAMERA: "Камера",
|
||||
PromptCategory.COLORS: "Цвета",
|
||||
PromptCategory.MOOD: "Настроение",
|
||||
PromptCategory.QUALITY: "Качество",
|
||||
}[category]
|
||||
@@ -0,0 +1,86 @@
|
||||
from typing import Dict
|
||||
|
||||
class PromptTranslations:
|
||||
"""Класс для работы с переводами промптов"""
|
||||
|
||||
@staticmethod
|
||||
def get_translations() -> Dict[str, str]:
|
||||
"""Возвращает словарь с переводами промптов"""
|
||||
return {
|
||||
# Стили
|
||||
"digital art": "цифровое искусство",
|
||||
"oil painting": "масляная живопись",
|
||||
"watercolor": "акварель",
|
||||
"pencil sketch": "карандашный набросок",
|
||||
"anime style": "аниме стиль",
|
||||
"photorealistic": "фотореалистичный",
|
||||
|
||||
# Освещение
|
||||
"soft lighting": "мягкое освещение",
|
||||
"dramatic lighting": "драматическое освещение",
|
||||
"cinematic lighting": "кинематографическое освещение",
|
||||
"natural light": "естественное освещение",
|
||||
"studio lighting": "студийное освещение",
|
||||
|
||||
# Композиция
|
||||
"rule of thirds": "правило третей",
|
||||
"symmetrical": "симметричный",
|
||||
"centered composition": "центральная композиция",
|
||||
"dynamic pose": "динамичная поза",
|
||||
|
||||
# Камера
|
||||
"close-up shot": "крупный план",
|
||||
"wide angle": "широкий угол",
|
||||
"bokeh": "боке",
|
||||
"depth of field": "глубина резкости",
|
||||
|
||||
# Цвета
|
||||
"vibrant colors": "яркие цвета",
|
||||
"pastel colors": "пастельные цвета",
|
||||
"monochrome": "монохром",
|
||||
"high contrast": "высокий контраст",
|
||||
|
||||
# Настроение
|
||||
"peaceful": "умиротворенный",
|
||||
"mysterious": "таинственный",
|
||||
"energetic": "энергичный",
|
||||
"melancholic": "меланхоличный",
|
||||
|
||||
# Качество
|
||||
"highly detailed": "высокая детализация",
|
||||
"8k uhd": "8k uhd",
|
||||
"masterpiece": "шедевр",
|
||||
"best quality": "лучшее качество",
|
||||
|
||||
# Негативные промпты
|
||||
"low quality": "низкое качество",
|
||||
"blurry": "размытый",
|
||||
"pixelated": "пикселизированный",
|
||||
"jpeg artifacts": "jpeg артефакты",
|
||||
"compression artifacts": "артефакты сжатия",
|
||||
"watermark": "водяной знак",
|
||||
"signature": "подпись",
|
||||
"text": "текст",
|
||||
"frame": "рамка",
|
||||
"duplicate": "дубликат",
|
||||
"bad composition": "плохая композиция",
|
||||
"unbalanced": "несбалансированный",
|
||||
"cropped": "обрезанный",
|
||||
"out of frame": "за пределами кадра",
|
||||
"bad anatomy": "плохая анатомия",
|
||||
"extra limbs": "лишние конечности",
|
||||
"missing limbs": "отсутствующие конечности",
|
||||
"deformed": "деформированный",
|
||||
"mutated": "мутированный",
|
||||
"3d render": "3d рендер",
|
||||
"cartoon": "мультяшный",
|
||||
"painting": "живопись",
|
||||
"sketch": "набросок",
|
||||
"anime": "аниме",
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def translate(text: str) -> str:
|
||||
"""Переводит промпт на русский язык"""
|
||||
translations = PromptTranslations.get_translations()
|
||||
return translations.get(text.lower(), text)
|
||||
@@ -2,6 +2,17 @@ from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout,
|
||||
QComboBox, QPushButton, QLabel)
|
||||
from PyQt6.QtCore import pyqtSignal
|
||||
import requests
|
||||
from typing import List, Dict
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
|
||||
# Загружаем переменные окружения
|
||||
load_dotenv()
|
||||
|
||||
class Model:
|
||||
def __init__(self, name: str, title: str = None):
|
||||
self.name = name
|
||||
self.title = title or name
|
||||
|
||||
class ModelManager(QWidget):
|
||||
model_changed = pyqtSignal(str)
|
||||
@@ -9,6 +20,8 @@ class ModelManager(QWidget):
|
||||
def __init__(self, api_url, parent=None):
|
||||
super().__init__(parent)
|
||||
self.api_url = api_url
|
||||
self.models = []
|
||||
self.current_model = None
|
||||
self.setup_ui()
|
||||
self.load_models()
|
||||
|
||||
@@ -97,33 +110,86 @@ class ModelManager(QWidget):
|
||||
try:
|
||||
response = requests.get(f"{self.api_url}/sdapi/v1/sd-models")
|
||||
if response.status_code == 200:
|
||||
models = response.json()
|
||||
current_model = self.model_combo.currentText()
|
||||
models_data = response.json()
|
||||
self.models = [
|
||||
Model(model.get('title', ''), model.get('model_name', ''))
|
||||
for model in models_data
|
||||
]
|
||||
|
||||
# Получаем текущую модель
|
||||
options_response = requests.get(f"{self.api_url}/sdapi/v1/options")
|
||||
if options_response.status_code == 200:
|
||||
current_model_name = options_response.json().get('sd_model_checkpoint')
|
||||
self.current_model = next(
|
||||
(model for model in self.models if model.name == current_model_name),
|
||||
self.models[0] if self.models else None
|
||||
)
|
||||
|
||||
# Обновляем UI
|
||||
self.model_combo.clear()
|
||||
for model in models:
|
||||
self.model_combo.addItem(model.get('title', ''))
|
||||
for model in self.models:
|
||||
self.model_combo.addItem(model.title)
|
||||
|
||||
# Устанавливаем текущую модель
|
||||
if self.current_model:
|
||||
index = self.model_combo.findText(self.current_model.title)
|
||||
if index >= 0:
|
||||
self.model_combo.setCurrentIndex(index)
|
||||
|
||||
# Восстанавливаем выбранную модель, если она всё ещё доступна
|
||||
index = self.model_combo.findText(current_model)
|
||||
if index >= 0:
|
||||
self.model_combo.setCurrentIndex(index)
|
||||
except Exception as e:
|
||||
print(f"Ошибка при загрузке моделей: {str(e)}")
|
||||
self.models = []
|
||||
self.current_model = None
|
||||
|
||||
def on_model_changed(self, model_name):
|
||||
def on_model_changed(self, model_title):
|
||||
"""Обработка смены модели"""
|
||||
model = next(
|
||||
(m for m in self.models if m.title == model_title),
|
||||
None
|
||||
)
|
||||
if model:
|
||||
try:
|
||||
response = requests.post(
|
||||
f"{self.api_url}/sdapi/v1/options",
|
||||
json={"sd_model_checkpoint": model.name}
|
||||
)
|
||||
if response.status_code == 200:
|
||||
self.current_model = model
|
||||
self.model_changed.emit(model.name)
|
||||
except Exception as e:
|
||||
print(f"Ошибка при смене модели: {str(e)}")
|
||||
|
||||
def update_api_url(self, new_url):
|
||||
"""Обновить URL API"""
|
||||
self.api_url = new_url
|
||||
self.load_models()
|
||||
|
||||
def get_models(self):
|
||||
"""Возвращает список доступных моделей"""
|
||||
return self.models
|
||||
|
||||
def get_model_names(self):
|
||||
"""Возвращает список имен моделей"""
|
||||
return [model.name for model in self.models]
|
||||
|
||||
def get_current_model(self):
|
||||
"""Возвращает текущую модель"""
|
||||
return self.current_model
|
||||
|
||||
def switch_model(self, model_name: str) -> bool:
|
||||
"""Переключение на другую модель"""
|
||||
try:
|
||||
response = requests.post(
|
||||
f"{self.api_url}/sdapi/v1/options",
|
||||
json={"sd_model_checkpoint": model_name}
|
||||
)
|
||||
if response.status_code == 200:
|
||||
self.model_changed.emit(model_name)
|
||||
self.current_model = next(
|
||||
(model for model in self.models if model.name == model_name),
|
||||
None
|
||||
)
|
||||
return True
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"Ошибка при смене модели: {str(e)}")
|
||||
|
||||
def update_api_url(self, new_url):
|
||||
"""Обновить URL API"""
|
||||
self.api_url = new_url
|
||||
self.load_models()
|
||||
print(f"Ошибка переключения модели: {str(e)}")
|
||||
return False
|
||||
@@ -0,0 +1,237 @@
|
||||
from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout,
|
||||
QLabel, QPushButton, QLineEdit, QSpinBox,
|
||||
QComboBox, QProgressBar)
|
||||
from PyQt6.QtCore import Qt, pyqtSignal
|
||||
from PyQt6.QtGui import QPixmap
|
||||
import requests
|
||||
from ..styles.style_constants import StyleConstants
|
||||
from ..styles.icons import IconManager, IconType
|
||||
from ..styles.page import BasePage
|
||||
|
||||
class HomePage(BasePage):
|
||||
def __init__(self, model_manager, sampler_manager, size_preset_manager, parent=None):
|
||||
super().__init__(parent)
|
||||
self.model_manager = model_manager
|
||||
self.sampler_manager = sampler_manager
|
||||
self.size_preset_manager = size_preset_manager
|
||||
self.icon_manager = IconManager.get_instance()
|
||||
self.setup_ui()
|
||||
|
||||
def setup_ui(self):
|
||||
# Верхняя панель с настройками
|
||||
settings_panel = QHBoxLayout()
|
||||
settings_panel.setContentsMargins(
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg']
|
||||
)
|
||||
settings_panel.setSpacing(StyleConstants.SPACING['md'])
|
||||
|
||||
# Выбор модели
|
||||
model_label = QLabel("Модель:")
|
||||
settings_panel.addWidget(model_label)
|
||||
|
||||
self.model_combo = QComboBox()
|
||||
self.model_combo.currentTextChanged.connect(self.on_model_changed)
|
||||
settings_panel.addWidget(self.model_combo)
|
||||
|
||||
# Выбор сэмплера
|
||||
sampler_label = QLabel("Сэмплер:")
|
||||
settings_panel.addWidget(sampler_label)
|
||||
|
||||
self.sampler_combo = QComboBox()
|
||||
self.sampler_combo.currentTextChanged.connect(self.on_sampler_changed)
|
||||
settings_panel.addWidget(self.sampler_combo)
|
||||
|
||||
# Настройки размера
|
||||
size_label = QLabel("Размер:")
|
||||
settings_panel.addWidget(size_label)
|
||||
|
||||
self.width_spin = QSpinBox()
|
||||
self.width_spin.setRange(64, 2048)
|
||||
self.width_spin.setSingleStep(64)
|
||||
self.width_spin.setValue(512)
|
||||
settings_panel.addWidget(self.width_spin)
|
||||
|
||||
self.height_spin = QSpinBox()
|
||||
self.height_spin.setRange(64, 2048)
|
||||
self.height_spin.setSingleStep(64)
|
||||
self.height_spin.setValue(512)
|
||||
settings_panel.addWidget(self.height_spin)
|
||||
|
||||
settings_panel.addStretch()
|
||||
self.layout.addLayout(settings_panel)
|
||||
|
||||
# Панель промптов
|
||||
prompts_panel = QVBoxLayout()
|
||||
prompts_panel.setContentsMargins(
|
||||
StyleConstants.SPACING['lg'],
|
||||
0,
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg']
|
||||
)
|
||||
prompts_panel.setSpacing(StyleConstants.SPACING['md'])
|
||||
|
||||
# Позитивный промпт
|
||||
prompt_label = QLabel("Промпт:")
|
||||
prompts_panel.addWidget(prompt_label)
|
||||
|
||||
self.prompt_edit = QLineEdit()
|
||||
self.prompt_edit.setPlaceholderText("Опишите желаемое изображение...")
|
||||
prompts_panel.addWidget(self.prompt_edit)
|
||||
|
||||
# Негативный промпт
|
||||
negative_prompt_label = QLabel("Негативный промпт:")
|
||||
prompts_panel.addWidget(negative_prompt_label)
|
||||
|
||||
self.negative_prompt_edit = QLineEdit()
|
||||
self.negative_prompt_edit.setPlaceholderText("Опишите нежелательные элементы...")
|
||||
prompts_panel.addWidget(self.negative_prompt_edit)
|
||||
|
||||
self.layout.addLayout(prompts_panel)
|
||||
|
||||
# Панель генерации
|
||||
generate_panel = QHBoxLayout()
|
||||
generate_panel.setContentsMargins(
|
||||
StyleConstants.SPACING['lg'],
|
||||
0,
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg']
|
||||
)
|
||||
generate_panel.setSpacing(StyleConstants.SPACING['md'])
|
||||
|
||||
self.steps_spin = QSpinBox()
|
||||
self.steps_spin.setRange(1, 150)
|
||||
self.steps_spin.setValue(20)
|
||||
self.steps_spin.setPrefix("Шаги: ")
|
||||
generate_panel.addWidget(self.steps_spin)
|
||||
|
||||
self.cfg_spin = QSpinBox()
|
||||
self.cfg_spin.setRange(1, 30)
|
||||
self.cfg_spin.setValue(7)
|
||||
self.cfg_spin.setPrefix("CFG: ")
|
||||
generate_panel.addWidget(self.cfg_spin)
|
||||
|
||||
self.batch_size_spin = QSpinBox()
|
||||
self.batch_size_spin.setRange(1, 4)
|
||||
self.batch_size_spin.setValue(1)
|
||||
self.batch_size_spin.setPrefix("Количество: ")
|
||||
generate_panel.addWidget(self.batch_size_spin)
|
||||
|
||||
self.generate_btn = QPushButton("Сгенерировать")
|
||||
self.generate_btn.setIcon(self.icon_manager.get_icon(IconType.GENERATE))
|
||||
self.generate_btn.clicked.connect(self.generate_images)
|
||||
generate_panel.addWidget(self.generate_btn)
|
||||
|
||||
generate_panel.addStretch()
|
||||
self.layout.addLayout(generate_panel)
|
||||
|
||||
# Прогресс-бар
|
||||
progress_layout = QHBoxLayout()
|
||||
progress_layout.setContentsMargins(
|
||||
StyleConstants.SPACING['lg'],
|
||||
0,
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg']
|
||||
)
|
||||
|
||||
self.progress_bar = QProgressBar()
|
||||
self.progress_bar.setTextVisible(True)
|
||||
self.progress_bar.setFormat("%p% - %v/%m шагов")
|
||||
progress_layout.addWidget(self.progress_bar)
|
||||
|
||||
self.layout.addLayout(progress_layout)
|
||||
|
||||
# Область для результатов
|
||||
result_layout = QVBoxLayout()
|
||||
result_layout.setContentsMargins(
|
||||
StyleConstants.SPACING['lg'],
|
||||
0,
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg']
|
||||
)
|
||||
|
||||
self.result_label = QLabel()
|
||||
self.result_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
result_layout.addWidget(self.result_label)
|
||||
|
||||
self.layout.addLayout(result_layout)
|
||||
self.layout.addStretch()
|
||||
|
||||
# Обновляем UI
|
||||
self.update_ui()
|
||||
|
||||
def update_ui(self):
|
||||
"""Обновление UI после загрузки данных"""
|
||||
# Обновляем список моделей
|
||||
self.model_combo.clear()
|
||||
for model in self.model_manager.get_models():
|
||||
self.model_combo.addItem(model.title, model.name)
|
||||
|
||||
# Устанавливаем текущую модель
|
||||
current_model = self.model_manager.get_current_model()
|
||||
if current_model:
|
||||
index = self.model_combo.findData(current_model.name)
|
||||
if index >= 0:
|
||||
self.model_combo.setCurrentIndex(index)
|
||||
|
||||
# Обновляем список сэмплеров
|
||||
self.sampler_combo.clear()
|
||||
for sampler in self.sampler_manager.get_samplers():
|
||||
self.sampler_combo.addItem(sampler.title, sampler.name)
|
||||
|
||||
# Устанавливаем текущий сэмплер
|
||||
current_sampler = self.sampler_manager.get_current_sampler()
|
||||
if current_sampler:
|
||||
index = self.sampler_combo.findData(current_sampler.name)
|
||||
if index >= 0:
|
||||
self.sampler_combo.setCurrentIndex(index)
|
||||
|
||||
def on_model_changed(self, model_title):
|
||||
"""Обработка изменения модели"""
|
||||
model_name = self.model_combo.currentData()
|
||||
if model_name:
|
||||
self.model_manager.switch_model(model_name)
|
||||
|
||||
def on_sampler_changed(self, sampler_title):
|
||||
"""Обработка изменения сэмплера"""
|
||||
sampler_name = self.sampler_combo.currentData()
|
||||
if sampler_name:
|
||||
self.sampler_manager.set_current_sampler(sampler_name)
|
||||
|
||||
def set_resolution(self, width: int, height: int):
|
||||
"""Установка разрешения"""
|
||||
self.width_spin.setValue(width)
|
||||
self.height_spin.setValue(height)
|
||||
|
||||
def generate_images(self):
|
||||
"""Генерация изображений"""
|
||||
try:
|
||||
# Получаем параметры
|
||||
params = {
|
||||
"prompt": self.prompt_edit.text(),
|
||||
"negative_prompt": self.negative_prompt_edit.text(),
|
||||
"steps": self.steps_spin.value(),
|
||||
"cfg_scale": self.cfg_spin.value(),
|
||||
"batch_size": self.batch_size_spin.value(),
|
||||
"width": self.width_spin.value(),
|
||||
"height": self.height_spin.value(),
|
||||
"sampler_name": self.sampler_combo.currentData(),
|
||||
}
|
||||
|
||||
# Отправляем запрос
|
||||
response = requests.post(
|
||||
f"{self.model_manager.api_url}/sdapi/v1/txt2img",
|
||||
json=params
|
||||
)
|
||||
|
||||
if response.status_code == 200:
|
||||
result = response.json()
|
||||
# TODO: Отобразить сгенерированные изображения
|
||||
print("Изображения успешно сгенерированы")
|
||||
else:
|
||||
print(f"Ошибка генерации: {response.status_code}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Ошибка при генерации: {str(e)}")
|
||||
@@ -0,0 +1,145 @@
|
||||
from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout,
|
||||
QLabel, QPushButton, QLineEdit, QSpinBox,
|
||||
QComboBox, QProgressBar, QScrollArea, QFrame)
|
||||
from PyQt6.QtCore import Qt
|
||||
from ..styles.style_constants import StyleConstants
|
||||
from ..styles.icons import IconManager, IconType
|
||||
from ..styles.page import BasePage
|
||||
|
||||
class ModelCard(QFrame):
|
||||
"""Карточка модели"""
|
||||
def __init__(self, model, parent=None):
|
||||
super().__init__(parent)
|
||||
self.model = model
|
||||
self.setup_ui()
|
||||
|
||||
def setup_ui(self):
|
||||
self.setStyleSheet(f"""
|
||||
QFrame {{
|
||||
background-color: {StyleConstants.COLORS['dark']['surface']};
|
||||
border-radius: {StyleConstants.RADIUS['md']}px;
|
||||
padding: {StyleConstants.SPACING['md']}px;
|
||||
margin-bottom: {StyleConstants.SPACING['md']}px;
|
||||
}}
|
||||
QLabel {{
|
||||
color: {StyleConstants.COLORS['dark']['text']};
|
||||
}}
|
||||
QPushButton {{
|
||||
background-color: {StyleConstants.COLORS['primary']};
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: {StyleConstants.RADIUS['sm']}px;
|
||||
padding: {StyleConstants.SPACING['sm']}px {StyleConstants.SPACING['md']}px;
|
||||
}}
|
||||
QPushButton:hover {{
|
||||
background-color: {StyleConstants.COLORS['secondary']};
|
||||
}}
|
||||
""")
|
||||
|
||||
layout = QVBoxLayout(self)
|
||||
layout.setSpacing(StyleConstants.SPACING['sm'])
|
||||
|
||||
# Название модели
|
||||
title = QLabel(self.model.title)
|
||||
title.setStyleSheet(f"""
|
||||
font-size: {StyleConstants.FONTS['size']['lg']};
|
||||
font-weight: {StyleConstants.FONTS['weight']['bold']};
|
||||
""")
|
||||
layout.addWidget(title)
|
||||
|
||||
# Имя файла модели
|
||||
name = QLabel(self.model.name)
|
||||
name.setStyleSheet(f"""
|
||||
font-size: {StyleConstants.FONTS['size']['sm']};
|
||||
color: {StyleConstants.COLORS['dark']['text_secondary']};
|
||||
""")
|
||||
layout.addWidget(name)
|
||||
|
||||
# Кнопки управления
|
||||
buttons_layout = QHBoxLayout()
|
||||
|
||||
select_btn = QPushButton("Выбрать")
|
||||
select_btn.setIcon(IconManager.get_instance().get_icon(IconType.SUCCESS))
|
||||
buttons_layout.addWidget(select_btn)
|
||||
|
||||
delete_btn = QPushButton("Удалить")
|
||||
delete_btn.setIcon(IconManager.get_instance().get_icon(IconType.DELETE))
|
||||
buttons_layout.addWidget(delete_btn)
|
||||
|
||||
buttons_layout.addStretch()
|
||||
layout.addLayout(buttons_layout)
|
||||
|
||||
class ModelsPage(BasePage):
|
||||
"""Страница управления моделями"""
|
||||
def __init__(self, model_manager, parent=None):
|
||||
super().__init__(parent)
|
||||
self.model_manager = model_manager
|
||||
self.setup_ui()
|
||||
|
||||
def setup_ui(self):
|
||||
# Верхняя панель
|
||||
top_panel = QHBoxLayout()
|
||||
top_panel.setContentsMargins(
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg']
|
||||
)
|
||||
top_panel.setSpacing(StyleConstants.SPACING['md'])
|
||||
|
||||
# Поиск
|
||||
self.search_edit = QLineEdit()
|
||||
self.search_edit.setPlaceholderText("Поиск моделей...")
|
||||
top_panel.addWidget(self.search_edit)
|
||||
|
||||
# Кнопка обновления
|
||||
refresh_btn = QPushButton("Обновить")
|
||||
refresh_btn.setIcon(IconManager.get_instance().get_icon(IconType.REFRESH))
|
||||
refresh_btn.clicked.connect(self.update_ui)
|
||||
top_panel.addWidget(refresh_btn)
|
||||
|
||||
# Кнопка добавления
|
||||
add_btn = QPushButton("Добавить")
|
||||
add_btn.setIcon(IconManager.get_instance().get_icon(IconType.ADD))
|
||||
top_panel.addWidget(add_btn)
|
||||
|
||||
top_panel.addStretch()
|
||||
self.layout.addLayout(top_panel)
|
||||
|
||||
# Область прокрутки для моделей
|
||||
scroll_area = QScrollArea()
|
||||
scroll_area.setWidgetResizable(True)
|
||||
scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
|
||||
|
||||
# Контейнер для карточек моделей
|
||||
self.models_container = QWidget()
|
||||
self.models_layout = QVBoxLayout(self.models_container)
|
||||
self.models_layout.setContentsMargins(
|
||||
StyleConstants.SPACING['lg'],
|
||||
0,
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg']
|
||||
)
|
||||
self.models_layout.setSpacing(0)
|
||||
|
||||
scroll_area.setWidget(self.models_container)
|
||||
self.layout.addWidget(scroll_area)
|
||||
|
||||
# Обновляем UI
|
||||
self.update_ui()
|
||||
|
||||
def update_ui(self):
|
||||
"""Обновление списка моделей"""
|
||||
# Очищаем контейнер
|
||||
for i in reversed(range(self.models_layout.count())):
|
||||
widget = self.models_layout.itemAt(i).widget()
|
||||
if widget:
|
||||
widget.deleteLater()
|
||||
|
||||
# Добавляем карточки моделей
|
||||
for model in self.model_manager.get_models():
|
||||
card = ModelCard(model)
|
||||
self.models_layout.addWidget(card)
|
||||
|
||||
# Добавляем растягивающийся элемент в конец
|
||||
self.models_layout.addStretch()
|
||||
@@ -0,0 +1,193 @@
|
||||
from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout,
|
||||
QLabel, QPushButton, QLineEdit, QComboBox,
|
||||
QSpinBox, QCheckBox, QFrame)
|
||||
from PyQt6.QtCore import Qt
|
||||
from ..styles.page import BasePage
|
||||
from ..styles.theme import Colors, Spacing, Fonts
|
||||
from ..styles.icons import IconManager, IconType
|
||||
from ..styles.theme_manager import ThemeManager
|
||||
|
||||
class SettingsSection(QFrame):
|
||||
def __init__(self, title: str, parent=None):
|
||||
super().__init__(parent)
|
||||
self.title = title
|
||||
self.theme_manager = ThemeManager.get_instance()
|
||||
self.setup_ui()
|
||||
|
||||
def setup_ui(self):
|
||||
"""Настройка UI секции настроек"""
|
||||
colors = self.theme_manager.current_theme.get_colors()
|
||||
spacing = self.theme_manager.current_theme.get_spacing()
|
||||
|
||||
# Основной layout
|
||||
layout = QVBoxLayout(self)
|
||||
layout.setContentsMargins(16, 16, 16, 16)
|
||||
layout.setSpacing(16)
|
||||
|
||||
# Заголовок секции
|
||||
title_label = QLabel(self.title)
|
||||
title_label.setStyleSheet(f"""
|
||||
QLabel {{
|
||||
color: {colors['text']};
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
}}
|
||||
""")
|
||||
layout.addWidget(title_label)
|
||||
|
||||
# Контейнер для содержимого
|
||||
self.content_layout = QVBoxLayout()
|
||||
self.content_layout.setSpacing(12)
|
||||
layout.addLayout(self.content_layout)
|
||||
|
||||
# Стили
|
||||
self.setStyleSheet(f"""
|
||||
QFrame {{
|
||||
background-color: {colors['surface']};
|
||||
border: 1px solid {colors['border']};
|
||||
border-radius: {spacing.MEDIUM}px;
|
||||
}}
|
||||
""")
|
||||
|
||||
class SettingsPage(BasePage):
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
self.theme_manager = ThemeManager.get_instance()
|
||||
self.setup_content()
|
||||
|
||||
def setup_content(self):
|
||||
"""Настройка содержимого страницы"""
|
||||
colors = self.theme_manager.current_theme.get_colors()
|
||||
spacing = self.theme_manager.current_theme.get_spacing()
|
||||
|
||||
# Заголовок
|
||||
header = QLabel("Настройки")
|
||||
header.setStyleSheet(f"""
|
||||
QLabel {{
|
||||
color: {colors['text']};
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
}}
|
||||
""")
|
||||
self.layout.addWidget(header)
|
||||
|
||||
# API настройки
|
||||
api_section = SettingsSection("API")
|
||||
|
||||
api_url_layout = QVBoxLayout()
|
||||
api_url_label = QLabel("URL API:")
|
||||
api_url_label.setStyleSheet(f"color: {colors['text']};")
|
||||
self.api_url_input = QLineEdit()
|
||||
self.api_url_input.setPlaceholderText("http://localhost:7860")
|
||||
api_url_layout.addWidget(api_url_label)
|
||||
api_url_layout.addWidget(self.api_url_input)
|
||||
api_section.content_layout.addLayout(api_url_layout)
|
||||
|
||||
self.layout.addWidget(api_section)
|
||||
|
||||
# UI настройки
|
||||
ui_section = SettingsSection("Интерфейс")
|
||||
|
||||
# Тема
|
||||
theme_layout = QVBoxLayout()
|
||||
theme_label = QLabel("Тема:")
|
||||
theme_label.setStyleSheet(f"color: {colors['text']};")
|
||||
self.theme_combo = QComboBox()
|
||||
self.theme_combo.addItems(["Тёмная", "Светлая"])
|
||||
theme_layout.addWidget(theme_label)
|
||||
theme_layout.addWidget(self.theme_combo)
|
||||
ui_section.content_layout.addLayout(theme_layout)
|
||||
|
||||
# Размер шрифта
|
||||
font_size_layout = QVBoxLayout()
|
||||
font_size_label = QLabel("Размер шрифта:")
|
||||
font_size_label.setStyleSheet(f"color: {colors['text']};")
|
||||
self.font_size_spin = QSpinBox()
|
||||
self.font_size_spin.setRange(10, 24)
|
||||
self.font_size_spin.setValue(14)
|
||||
font_size_layout.addWidget(font_size_label)
|
||||
font_size_layout.addWidget(self.font_size_spin)
|
||||
ui_section.content_layout.addLayout(font_size_layout)
|
||||
|
||||
self.layout.addWidget(ui_section)
|
||||
|
||||
# Настройки генерации
|
||||
generation_section = SettingsSection("Генерация")
|
||||
|
||||
# Качество по умолчанию
|
||||
quality_layout = QVBoxLayout()
|
||||
quality_label = QLabel("Качество по умолчанию:")
|
||||
quality_label.setStyleSheet(f"color: {colors['text']};")
|
||||
self.quality_combo = QComboBox()
|
||||
self.quality_combo.addItems(["Низкое", "Среднее", "Высокое"])
|
||||
quality_layout.addWidget(quality_label)
|
||||
quality_layout.addWidget(self.quality_combo)
|
||||
generation_section.content_layout.addLayout(quality_layout)
|
||||
|
||||
# Размер по умолчанию
|
||||
size_layout = QVBoxLayout()
|
||||
size_label = QLabel("Размер по умолчанию:")
|
||||
size_label.setStyleSheet(f"color: {colors['text']};")
|
||||
self.size_combo = QComboBox()
|
||||
self.size_combo.addItems(["512x512", "768x768", "1024x1024"])
|
||||
size_layout.addWidget(size_label)
|
||||
size_layout.addWidget(self.size_combo)
|
||||
generation_section.content_layout.addLayout(size_layout)
|
||||
|
||||
self.layout.addWidget(generation_section)
|
||||
|
||||
# Кнопки
|
||||
buttons_layout = QHBoxLayout()
|
||||
|
||||
self.save_btn = QPushButton("Сохранить")
|
||||
self.save_btn.setMinimumWidth(150)
|
||||
self.save_btn.setStyleSheet(f"""
|
||||
QPushButton {{
|
||||
background-color: {colors['primary']};
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: {spacing.TINY}px;
|
||||
padding: {spacing.SMALL}px {spacing.MEDIUM}px;
|
||||
}}
|
||||
|
||||
QPushButton:hover {{
|
||||
background-color: {colors['hover']};
|
||||
}}
|
||||
|
||||
QPushButton:pressed {{
|
||||
background-color: {colors['active']};
|
||||
}}
|
||||
""")
|
||||
buttons_layout.addWidget(self.save_btn)
|
||||
|
||||
self.reset_btn = QPushButton("Сбросить")
|
||||
self.reset_btn.setMinimumWidth(150)
|
||||
self.reset_btn.setStyleSheet(f"""
|
||||
QPushButton {{
|
||||
background-color: transparent;
|
||||
color: {colors['primary']};
|
||||
border: 1px solid {colors['primary']};
|
||||
border-radius: {spacing.TINY}px;
|
||||
padding: {spacing.SMALL}px {spacing.MEDIUM}px;
|
||||
}}
|
||||
|
||||
QPushButton:hover {{
|
||||
background-color: {colors['hover']};
|
||||
color: white;
|
||||
border: none;
|
||||
}}
|
||||
|
||||
QPushButton:pressed {{
|
||||
background-color: {colors['active']};
|
||||
color: white;
|
||||
border: none;
|
||||
}}
|
||||
""")
|
||||
buttons_layout.addWidget(self.reset_btn)
|
||||
|
||||
buttons_layout.addStretch()
|
||||
|
||||
self.layout.addLayout(buttons_layout)
|
||||
|
||||
# Растягиваем пространство
|
||||
self.layout.addStretch()
|
||||
@@ -2,6 +2,17 @@ from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout,
|
||||
QComboBox, QLabel)
|
||||
from PyQt6.QtCore import pyqtSignal
|
||||
import requests
|
||||
from typing import List, Dict
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
|
||||
# Загружаем переменные окружения
|
||||
load_dotenv()
|
||||
|
||||
class Sampler:
|
||||
def __init__(self, name: str, title: str = None):
|
||||
self.name = name
|
||||
self.title = title or name
|
||||
|
||||
class SamplerManager(QWidget):
|
||||
sampler_changed = pyqtSignal(str)
|
||||
@@ -71,28 +82,25 @@ class SamplerManager(QWidget):
|
||||
layout.addStretch()
|
||||
|
||||
def load_samplers(self):
|
||||
"""Загрузить список доступных сэмплеров"""
|
||||
"""Загрузка списка сэмплеров с сервера"""
|
||||
try:
|
||||
response = requests.get(f"{self.api_url}/sdapi/v1/samplers")
|
||||
if response.status_code == 200:
|
||||
samplers = response.json()
|
||||
current_sampler = self.sampler_combo.currentText()
|
||||
samplers_data = response.json()
|
||||
self.samplers = [
|
||||
Sampler(sampler['name'], sampler.get('title'))
|
||||
for sampler in samplers_data
|
||||
]
|
||||
|
||||
self.sampler_combo.clear()
|
||||
for sampler in samplers:
|
||||
self.sampler_combo.addItem(sampler.get('name', ''))
|
||||
|
||||
# Восстанавливаем выбранный сэмплер, если он всё ещё доступен
|
||||
index = self.sampler_combo.findText(current_sampler)
|
||||
if index >= 0:
|
||||
self.sampler_combo.setCurrentIndex(index)
|
||||
elif self.sampler_combo.count() > 0:
|
||||
# По умолчанию выбираем Euler a
|
||||
default_index = self.sampler_combo.findText("Euler a")
|
||||
if default_index >= 0:
|
||||
self.sampler_combo.setCurrentIndex(default_index)
|
||||
# По умолчанию выбираем Euler a
|
||||
self.current_sampler = next(
|
||||
(sampler for sampler in self.samplers if sampler.name == "Euler a"),
|
||||
self.samplers[0] if self.samplers else None
|
||||
)
|
||||
except Exception as e:
|
||||
print(f"Ошибка при загрузке сэмплеров: {str(e)}")
|
||||
print(f"Ошибка загрузки сэмплеров: {str(e)}")
|
||||
self.samplers = []
|
||||
self.current_sampler = None
|
||||
|
||||
def on_sampler_changed(self, sampler_name):
|
||||
"""Обработка смены сэмплера"""
|
||||
@@ -103,6 +111,25 @@ class SamplerManager(QWidget):
|
||||
self.api_url = new_url
|
||||
self.load_samplers()
|
||||
|
||||
def get_samplers(self):
|
||||
"""Возвращает список доступных сэмплеров"""
|
||||
return self.samplers
|
||||
|
||||
def get_sampler_names(self):
|
||||
"""Возвращает список имен сэмплеров"""
|
||||
return [sampler.name for sampler in self.samplers]
|
||||
|
||||
def get_current_sampler(self):
|
||||
"""Получить текущий выбранный сэмплер"""
|
||||
return self.sampler_combo.currentText()
|
||||
"""Возвращает текущий сэмплер"""
|
||||
return self.current_sampler
|
||||
|
||||
def set_current_sampler(self, sampler_name: str) -> bool:
|
||||
"""Установка текущего сэмплера"""
|
||||
sampler = next(
|
||||
(s for s in self.samplers if s.name == sampler_name),
|
||||
None
|
||||
)
|
||||
if sampler:
|
||||
self.current_sampler = sampler
|
||||
return True
|
||||
return False
|
||||
@@ -1,6 +1,14 @@
|
||||
from PyQt6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QFrame
|
||||
from PyQt6.QtCore import Qt, pyqtSignal
|
||||
from .size_presets import SIZE_PRESETS
|
||||
from dataclasses import dataclass
|
||||
from typing import List, Dict
|
||||
|
||||
@dataclass
|
||||
class SizePreset:
|
||||
name: str
|
||||
width: int
|
||||
height: int
|
||||
|
||||
class SizePresetManager(QWidget):
|
||||
size_changed = pyqtSignal(int, int) # Сигнал для изменения размера
|
||||
@@ -8,6 +16,17 @@ class SizePresetManager(QWidget):
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
self.setup_ui()
|
||||
self.presets = [
|
||||
SizePreset("512x512", 512, 512),
|
||||
SizePreset("768x768", 768, 768),
|
||||
SizePreset("1024x1024", 1024, 1024),
|
||||
SizePreset("512x768", 512, 768),
|
||||
SizePreset("768x512", 768, 512),
|
||||
SizePreset("512x1024", 512, 1024),
|
||||
SizePreset("1024x512", 1024, 512),
|
||||
SizePreset("768x1024", 768, 1024),
|
||||
SizePreset("1024x768", 1024, 768),
|
||||
]
|
||||
|
||||
def setup_ui(self):
|
||||
layout = QVBoxLayout(self)
|
||||
@@ -91,3 +110,14 @@ class SizePresetManager(QWidget):
|
||||
def on_preset_clicked(self, width, height):
|
||||
"""Обработчик нажатия на кнопку пресета"""
|
||||
self.size_changed.emit(width, height)
|
||||
|
||||
def get_preset_names(self) -> List[str]:
|
||||
"""Возвращает список имен пресетов"""
|
||||
return [preset.name for preset in self.presets]
|
||||
|
||||
def get_preset(self, name: str) -> SizePreset:
|
||||
"""Возвращает пресет по имени"""
|
||||
return next(
|
||||
(preset for preset in self.presets if preset.name == name),
|
||||
None
|
||||
)
|
||||
@@ -0,0 +1,75 @@
|
||||
from PyQt6.QtWidgets import QMainWindow, QWidget, QVBoxLayout
|
||||
from PyQt6.QtCore import QEasingCurve, QPropertyAnimation, QRect
|
||||
from .theme_manager import ThemeManager
|
||||
|
||||
class BaseWindow(QMainWindow):
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
self.theme_manager = ThemeManager.get_instance()
|
||||
self.setup_window()
|
||||
|
||||
def setup_window(self):
|
||||
"""Базовая настройка окна"""
|
||||
# Создаем центральный виджет
|
||||
self.central_widget = QWidget()
|
||||
self.setCentralWidget(self.central_widget)
|
||||
|
||||
# Основной layout
|
||||
self.main_layout = QVBoxLayout(self.central_widget)
|
||||
self.main_layout.setContentsMargins(0, 0, 0, 0)
|
||||
self.main_layout.setSpacing(0)
|
||||
|
||||
# Применяем тему
|
||||
self.theme_manager.apply_theme()
|
||||
|
||||
def animate_window(self, start_geometry: QRect, end_geometry: QRect, duration: int = 300):
|
||||
"""Анимация окна"""
|
||||
self.animation = QPropertyAnimation(self, b"geometry")
|
||||
self.animation.setDuration(duration)
|
||||
self.animation.setStartValue(start_geometry)
|
||||
self.animation.setEndValue(end_geometry)
|
||||
self.animation.setEasingCurve(QEasingCurve.Type.OutCubic)
|
||||
self.animation.start()
|
||||
|
||||
def show_with_animation(self):
|
||||
"""Показать окно с анимацией"""
|
||||
# Сохраняем конечную геометрию
|
||||
end_geometry = self.geometry()
|
||||
|
||||
# Устанавливаем начальную геометрию (уменьшенную и прозрачную)
|
||||
start_geometry = QRect(
|
||||
end_geometry.x() + end_geometry.width() // 2,
|
||||
end_geometry.y() + end_geometry.height() // 2,
|
||||
0,
|
||||
0
|
||||
)
|
||||
|
||||
# Запускаем анимацию
|
||||
self.animate_window(start_geometry, end_geometry)
|
||||
super().show()
|
||||
|
||||
def hide_with_animation(self):
|
||||
"""Скрыть окно с анимацией"""
|
||||
# Сохраняем начальную геометрию
|
||||
start_geometry = self.geometry()
|
||||
|
||||
# Устанавливаем конечную геометрию (уменьшенную и прозрачную)
|
||||
end_geometry = QRect(
|
||||
start_geometry.x() + start_geometry.width() // 2,
|
||||
start_geometry.y() + start_geometry.height() // 2,
|
||||
0,
|
||||
0
|
||||
)
|
||||
|
||||
# Запускаем анимацию
|
||||
self.animation = QPropertyAnimation(self, b"geometry")
|
||||
self.animation.setDuration(300)
|
||||
self.animation.setStartValue(start_geometry)
|
||||
self.animation.setEndValue(end_geometry)
|
||||
self.animation.setEasingCurve(QEasingCurve.Type.InCubic)
|
||||
self.animation.finished.connect(super().hide)
|
||||
self.animation.start()
|
||||
|
||||
def toggle_theme(self):
|
||||
"""Переключение темы"""
|
||||
self.theme_manager.toggle_theme()
|
||||
@@ -0,0 +1,102 @@
|
||||
from enum import Enum, auto
|
||||
from PyQt6.QtGui import QIcon
|
||||
from pathlib import Path
|
||||
import requests
|
||||
import os
|
||||
|
||||
class IconType(Enum):
|
||||
"""Типы иконок"""
|
||||
HOME = auto()
|
||||
MODELS = auto()
|
||||
SETTINGS = auto()
|
||||
GENERATE = auto()
|
||||
ADD = auto()
|
||||
DELETE = auto()
|
||||
REFRESH = auto()
|
||||
SAVE = auto()
|
||||
CLOSE = auto()
|
||||
SUCCESS = auto()
|
||||
|
||||
# Навигация
|
||||
MENU = "menu"
|
||||
BACK = "arrow-back"
|
||||
FORWARD = "arrow-forward"
|
||||
|
||||
# Действия
|
||||
REMOVE = "remove"
|
||||
EDIT = "edit"
|
||||
SEARCH = "search"
|
||||
|
||||
# Медиа
|
||||
IMAGE = auto()
|
||||
VIDEO = "video"
|
||||
AUDIO = "audio"
|
||||
PLAY = "play"
|
||||
PAUSE = "pause"
|
||||
STOP = "stop"
|
||||
|
||||
# Статусы
|
||||
WARNING = "warning"
|
||||
ERROR = "error"
|
||||
INFO = "info"
|
||||
|
||||
# Интерфейс
|
||||
MINIMIZE = "minimize"
|
||||
MAXIMIZE = "maximize"
|
||||
RESTORE = "restore"
|
||||
|
||||
# Тема
|
||||
LIGHT_MODE = "light-mode"
|
||||
DARK_MODE = "dark-mode"
|
||||
|
||||
class IconManager:
|
||||
"""Менеджер иконок"""
|
||||
_instance = None
|
||||
|
||||
def __init__(self):
|
||||
self.icons = {}
|
||||
self.load_icons()
|
||||
|
||||
@classmethod
|
||||
def get_instance(cls):
|
||||
"""Получить экземпляр менеджера иконок (Singleton)"""
|
||||
if cls._instance is None:
|
||||
cls._instance = IconManager()
|
||||
return cls._instance
|
||||
|
||||
def load_icons(self):
|
||||
"""Загрузка иконок"""
|
||||
icons_dir = Path("resources/icons")
|
||||
|
||||
# Сопоставление типов иконок с файлами
|
||||
icon_files = {
|
||||
IconType.HOME: "home.svg",
|
||||
IconType.MODELS: "models.svg",
|
||||
IconType.SETTINGS: "settings.svg",
|
||||
IconType.GENERATE: "generate.svg",
|
||||
IconType.ADD: "add.svg",
|
||||
IconType.DELETE: "delete.svg",
|
||||
IconType.REFRESH: "refresh.svg",
|
||||
IconType.SAVE: "save.svg",
|
||||
IconType.CLOSE: "close.svg",
|
||||
IconType.SUCCESS: "success.svg",
|
||||
}
|
||||
|
||||
# Загружаем иконки
|
||||
for icon_type, filename in icon_files.items():
|
||||
icon_path = icons_dir / filename
|
||||
if icon_path.exists():
|
||||
self.icons[icon_type] = QIcon(str(icon_path))
|
||||
else:
|
||||
print(f"Иконка не найдена: {icon_path}")
|
||||
|
||||
def get_icon(self, icon_type: IconType) -> QIcon:
|
||||
"""Получить иконку по типу"""
|
||||
return self.icons.get(icon_type, QIcon())
|
||||
|
||||
def get_themed_icon(self, icon_type: IconType, theme: str) -> QIcon:
|
||||
"""Получение иконки с учетом темы"""
|
||||
icon_file = Path("resources/icons") / theme / f"{icon_type.value}.svg"
|
||||
if icon_file.exists():
|
||||
return QIcon(str(icon_file))
|
||||
return self.get_icon(icon_type)
|
||||
@@ -0,0 +1,170 @@
|
||||
/* Основные стили */
|
||||
QMainWindow {
|
||||
background: #1C1C1E;
|
||||
}
|
||||
|
||||
/* Навигационная панель */
|
||||
NavigationPanel {
|
||||
background-color: #2C2C2E;
|
||||
border-right: 1px solid #38383A;
|
||||
min-width: 250px;
|
||||
max-width: 250px;
|
||||
}
|
||||
|
||||
NavigationButton {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
border-radius: 8px;
|
||||
padding: 8px 16px;
|
||||
text-align: left;
|
||||
font-size: 14px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
NavigationButton:hover {
|
||||
background-color: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
NavigationButton:checked {
|
||||
background-color: rgba(255, 255, 255, 0.15);
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Страницы */
|
||||
BasePage {
|
||||
background-color: #1C1C1E;
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
/* Заголовки */
|
||||
QLabel[heading="true"] {
|
||||
color: white;
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
/* Поля ввода */
|
||||
QLineEdit, QTextEdit {
|
||||
background-color: #2C2C2E;
|
||||
border: 1px solid #38383A;
|
||||
border-radius: 8px;
|
||||
padding: 8px 12px;
|
||||
color: white;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
QLineEdit:focus, QTextEdit:focus {
|
||||
border: 2px solid #007AFF;
|
||||
background-color: #1C1C1E;
|
||||
}
|
||||
|
||||
/* Кнопки */
|
||||
QPushButton {
|
||||
background-color: #007AFF;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 8px;
|
||||
padding: 8px 16px;
|
||||
font-weight: 500;
|
||||
font-size: 14px;
|
||||
min-width: 100px;
|
||||
min-height: 36px;
|
||||
}
|
||||
|
||||
QPushButton:hover {
|
||||
background-color: #5856D6;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
QPushButton:pressed {
|
||||
background-color: #007AFF;
|
||||
transform: translateY(1px);
|
||||
}
|
||||
|
||||
QPushButton:disabled {
|
||||
background-color: #38383A;
|
||||
color: #EBEBF5;
|
||||
}
|
||||
|
||||
/* Выпадающие списки */
|
||||
QComboBox {
|
||||
background-color: #2C2C2E;
|
||||
color: white;
|
||||
border: 1px solid #38383A;
|
||||
border-radius: 8px;
|
||||
padding: 8px 12px;
|
||||
font-size: 14px;
|
||||
min-height: 36px;
|
||||
}
|
||||
|
||||
QComboBox::drop-down {
|
||||
border: none;
|
||||
width: 20px;
|
||||
}
|
||||
|
||||
QComboBox::down-arrow {
|
||||
image: url(resources/icons/chevron-down.svg);
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
}
|
||||
|
||||
/* Полосы прокрутки */
|
||||
QScrollBar:vertical {
|
||||
background: #1C1C1E;
|
||||
width: 8px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
QScrollBar::handle:vertical {
|
||||
background: #38383A;
|
||||
border-radius: 4px;
|
||||
min-height: 30px;
|
||||
}
|
||||
|
||||
QScrollBar::add-line:vertical,
|
||||
QScrollBar::sub-line:vertical {
|
||||
height: 0;
|
||||
}
|
||||
|
||||
/* Секции настроек */
|
||||
SettingsSection {
|
||||
background-color: #2C2C2E;
|
||||
border: 1px solid #38383A;
|
||||
border-radius: 12px;
|
||||
padding: 16px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
/* Списки */
|
||||
QListWidget {
|
||||
background-color: #2C2C2E;
|
||||
border: 1px solid #38383A;
|
||||
border-radius: 8px;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
QListWidget::item {
|
||||
background-color: transparent;
|
||||
border-radius: 4px;
|
||||
margin: 2px 0;
|
||||
color: white;
|
||||
}
|
||||
|
||||
QListWidget::item:selected {
|
||||
background-color: #007AFF;
|
||||
}
|
||||
|
||||
/* Прогресс бар */
|
||||
QProgressBar {
|
||||
border: 1px solid #38383A;
|
||||
border-radius: 4px;
|
||||
text-align: center;
|
||||
color: white;
|
||||
background-color: #2C2C2E;
|
||||
}
|
||||
|
||||
QProgressBar::chunk {
|
||||
background-color: #007AFF;
|
||||
border-radius: 3px;
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout,
|
||||
QPushButton, QLabel, QFrame)
|
||||
from PyQt6.QtCore import Qt, QPropertyAnimation, QEasingCurve, pyqtSignal
|
||||
from .icons import IconManager, IconType
|
||||
from .theme import Theme, Colors, Spacing
|
||||
from .theme_manager import ThemeManager
|
||||
|
||||
class NavigationButton(QPushButton):
|
||||
def __init__(self, icon_type: IconType, text: str, parent=None):
|
||||
super().__init__(parent)
|
||||
self.icon_manager = IconManager.get_instance()
|
||||
self.icon_type = icon_type
|
||||
self.setup_ui(text)
|
||||
|
||||
def setup_ui(self, text: str):
|
||||
self.icon_manager = IconManager.get_instance()
|
||||
self.setIcon(self.icon_manager.get_icon(self.icon_type))
|
||||
self.setText(text)
|
||||
self.setCheckable(True)
|
||||
self.setFixedHeight(40)
|
||||
|
||||
self.setStyleSheet("""
|
||||
QPushButton {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
border-radius: 8px;
|
||||
padding: 8px 16px;
|
||||
text-align: left;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
QPushButton:hover {
|
||||
background-color: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
QPushButton:checked {
|
||||
background-color: rgba(255, 255, 255, 0.15);
|
||||
font-weight: bold;
|
||||
}
|
||||
""")
|
||||
|
||||
class NavigationPanel(QFrame):
|
||||
page_changed = pyqtSignal(str)
|
||||
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
self.theme_manager = ThemeManager.get_instance()
|
||||
self.setup_ui()
|
||||
|
||||
def setup_ui(self):
|
||||
colors = self.theme_manager.current_theme.get_colors()
|
||||
self.setStyleSheet(f"""
|
||||
QFrame {{
|
||||
background-color: {colors['surface']};
|
||||
border-right: 1px solid {colors['border']};
|
||||
}}
|
||||
""")
|
||||
|
||||
# Основной layout
|
||||
layout = QVBoxLayout(self)
|
||||
layout.setContentsMargins(8, 16, 8, 16)
|
||||
layout.setSpacing(8)
|
||||
|
||||
# Заголовок
|
||||
header = QLabel("Stable Diffusion UI")
|
||||
header.setStyleSheet(f"""
|
||||
QLabel {{
|
||||
color: {colors['text']};
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
padding: 16px;
|
||||
}}
|
||||
""")
|
||||
layout.addWidget(header)
|
||||
|
||||
# Кнопки навигации
|
||||
self.home_btn = NavigationButton(IconType.HOME, "Главная")
|
||||
self.models_btn = NavigationButton(IconType.IMAGE, "Модели")
|
||||
self.settings_btn = NavigationButton(IconType.SETTINGS, "Настройки")
|
||||
|
||||
# Добавляем кнопки
|
||||
layout.addWidget(self.home_btn)
|
||||
layout.addWidget(self.models_btn)
|
||||
layout.addWidget(self.settings_btn)
|
||||
|
||||
# Растягиваем пространство
|
||||
layout.addStretch()
|
||||
|
||||
# Подключаем сигналы
|
||||
self.home_btn.clicked.connect(lambda: self.change_page("home"))
|
||||
self.models_btn.clicked.connect(lambda: self.change_page("models"))
|
||||
self.settings_btn.clicked.connect(lambda: self.change_page("settings"))
|
||||
|
||||
# Устанавливаем фиксированную ширину
|
||||
self.setFixedWidth(250)
|
||||
|
||||
def change_page(self, page_name: str):
|
||||
"""Смена активной страницы"""
|
||||
# Отключаем все кнопки
|
||||
for btn in self.findChildren(NavigationButton):
|
||||
btn.setChecked(False)
|
||||
|
||||
# Включаем нужную кнопку
|
||||
if page_name == "home":
|
||||
self.home_btn.setChecked(True)
|
||||
elif page_name == "models":
|
||||
self.models_btn.setChecked(True)
|
||||
elif page_name == "settings":
|
||||
self.settings_btn.setChecked(True)
|
||||
|
||||
# Отправляем сигнал о смене страницы
|
||||
self.page_changed.emit(page_name)
|
||||
@@ -0,0 +1,130 @@
|
||||
from PyQt6.QtWidgets import QWidget, QStackedWidget, QVBoxLayout
|
||||
from PyQt6.QtCore import QPropertyAnimation, QParallelAnimationGroup, QEasingCurve, Qt, QPoint
|
||||
from .theme import Theme, Colors
|
||||
from .theme_manager import ThemeManager
|
||||
from .style_constants import StyleConstants
|
||||
|
||||
class BasePage(QWidget):
|
||||
"""Базовый класс для страниц"""
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
self.theme_manager = ThemeManager.get_instance()
|
||||
self.setup_base_ui()
|
||||
|
||||
def setup_base_ui(self):
|
||||
"""Настройка базового UI"""
|
||||
colors = self.theme_manager.current_theme.get_colors()
|
||||
self.setStyleSheet(f"""
|
||||
QWidget {{
|
||||
background-color: {colors['background']};
|
||||
}}
|
||||
""")
|
||||
|
||||
self.layout = QVBoxLayout(self)
|
||||
self.layout.setContentsMargins(0, 0, 0, 0)
|
||||
self.layout.setSpacing(0)
|
||||
|
||||
# Создаем анимации
|
||||
self.enter_animation = QPropertyAnimation(self, b"pos")
|
||||
self.enter_animation.setDuration(250)
|
||||
self.enter_animation.setEasingCurve(QEasingCurve.Type.OutCubic)
|
||||
|
||||
self.exit_animation = QPropertyAnimation(self, b"pos")
|
||||
self.exit_animation.setDuration(250)
|
||||
self.exit_animation.setEasingCurve(QEasingCurve.Type.OutCubic)
|
||||
|
||||
def enter_animation(self):
|
||||
"""Анимация появления страницы"""
|
||||
# Создаем группу анимаций
|
||||
self.anim_group = QParallelAnimationGroup()
|
||||
|
||||
# Анимация прозрачности
|
||||
fade_anim = QPropertyAnimation(self, b"windowOpacity")
|
||||
fade_anim.setStartValue(0.0)
|
||||
fade_anim.setEndValue(1.0)
|
||||
fade_anim.setDuration(200)
|
||||
fade_anim.setEasingCurve(QEasingCurve.Type.OutCubic)
|
||||
|
||||
# Анимация сдвига
|
||||
pos_anim = QPropertyAnimation(self, b"pos")
|
||||
start_pos = self.pos()
|
||||
pos_anim.setStartValue(start_pos + QPoint(20, 0))
|
||||
pos_anim.setEndValue(start_pos)
|
||||
pos_anim.setDuration(200)
|
||||
pos_anim.setEasingCurve(QEasingCurve.Type.OutCubic)
|
||||
|
||||
# Добавляем анимации в группу
|
||||
self.anim_group.addAnimation(fade_anim)
|
||||
self.anim_group.addAnimation(pos_anim)
|
||||
|
||||
# Запускаем анимацию
|
||||
self.anim_group.start()
|
||||
|
||||
def leave_animation(self):
|
||||
"""Анимация исчезновения страницы"""
|
||||
# Создаем группу анимаций
|
||||
self.anim_group = QParallelAnimationGroup()
|
||||
|
||||
# Анимация прозрачности
|
||||
fade_anim = QPropertyAnimation(self, b"windowOpacity")
|
||||
fade_anim.setStartValue(1.0)
|
||||
fade_anim.setEndValue(0.0)
|
||||
fade_anim.setDuration(200)
|
||||
fade_anim.setEasingCurve(QEasingCurve.Type.InCubic)
|
||||
|
||||
# Анимация сдвига
|
||||
pos_anim = QPropertyAnimation(self, b"pos")
|
||||
start_pos = self.pos()
|
||||
pos_anim.setStartValue(start_pos)
|
||||
pos_anim.setEndValue(start_pos - QPoint(20, 0))
|
||||
pos_anim.setDuration(200)
|
||||
pos_anim.setEasingCurve(QEasingCurve.Type.InCubic)
|
||||
|
||||
# Добавляем анимации в группу
|
||||
self.anim_group.addAnimation(fade_anim)
|
||||
self.anim_group.addAnimation(pos_anim)
|
||||
|
||||
# Запускаем анимацию
|
||||
self.anim_group.start()
|
||||
|
||||
class PageContainer(QStackedWidget):
|
||||
"""Контейнер для страниц с анимацией переходов"""
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
self.pages = {}
|
||||
self.current_page = None
|
||||
|
||||
def add_page(self, name: str, page: BasePage):
|
||||
"""Добавить страницу"""
|
||||
self.pages[name] = page
|
||||
self.addWidget(page)
|
||||
|
||||
def show_page(self, name: str):
|
||||
"""Показать страницу с анимацией"""
|
||||
if name not in self.pages:
|
||||
return
|
||||
|
||||
next_page = self.pages[name]
|
||||
|
||||
if self.current_page == next_page:
|
||||
return
|
||||
|
||||
# Получаем размеры виджета
|
||||
width = self.width()
|
||||
|
||||
# Настраиваем анимации
|
||||
if self.current_page:
|
||||
# Анимация выхода текущей страницы
|
||||
self.current_page.exit_animation.setStartValue(QPoint(0, 0))
|
||||
self.current_page.exit_animation.setEndValue(QPoint(-width, 0))
|
||||
self.current_page.exit_animation.start()
|
||||
|
||||
# Анимация входа следующей страницы
|
||||
next_page.move(width, 0)
|
||||
next_page.enter_animation.setStartValue(QPoint(width, 0))
|
||||
next_page.enter_animation.setEndValue(QPoint(0, 0))
|
||||
next_page.enter_animation.start()
|
||||
|
||||
# Показываем страницу
|
||||
self.setCurrentWidget(next_page)
|
||||
self.current_page = next_page
|
||||
@@ -0,0 +1,181 @@
|
||||
from typing import Dict
|
||||
|
||||
class StyleConstants:
|
||||
# Цветовая схема
|
||||
COLORS = {
|
||||
'primary': '#7E57C2', # Основной цвет
|
||||
'secondary': '#B39DDB', # Вторичный цвет
|
||||
'accent': '#536DFE', # Акцентный цвет
|
||||
'success': '#66BB6A', # Цвет успеха
|
||||
'warning': '#FFA726', # Цвет предупреждения
|
||||
'error': '#EF5350', # Цвет ошибки
|
||||
|
||||
# Светлая тема
|
||||
'light': {
|
||||
'background': 'qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #FFFFFF, stop:1 #F5F5F5)',
|
||||
'surface': '#FFFFFF',
|
||||
'text': '#212121',
|
||||
'text_secondary': '#757575',
|
||||
'border': '#E0E0E0',
|
||||
'hover': '#F5F5F5',
|
||||
'pressed': '#EEEEEE'
|
||||
},
|
||||
|
||||
# Темная тема
|
||||
'dark': {
|
||||
'background': 'qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #1A1A1A, stop:1 #2D2D2D)',
|
||||
'surface': '#2D2D2D',
|
||||
'text': '#FFFFFF',
|
||||
'text_secondary': '#B0B0B0',
|
||||
'border': '#404040',
|
||||
'hover': '#353535',
|
||||
'pressed': '#404040'
|
||||
}
|
||||
}
|
||||
|
||||
# Размеры и отступы (в пикселях)
|
||||
SPACING = {
|
||||
'xxs': 4,
|
||||
'xs': 8,
|
||||
'sm': 12,
|
||||
'md': 16,
|
||||
'lg': 24,
|
||||
'xl': 32,
|
||||
'xxl': 48
|
||||
}
|
||||
|
||||
# Радиусы скругления (в пикселях)
|
||||
RADIUS = {
|
||||
'sm': 4,
|
||||
'md': 8,
|
||||
'lg': 12,
|
||||
'xl': 16,
|
||||
'pill': 9999
|
||||
}
|
||||
|
||||
# Тени
|
||||
SHADOWS = {
|
||||
'sm': '0 2px 4px rgba(0,0,0,0.1)',
|
||||
'md': '0 4px 8px rgba(0,0,0,0.1)',
|
||||
'lg': '0 8px 16px rgba(0,0,0,0.1)'
|
||||
}
|
||||
|
||||
# Анимации
|
||||
ANIMATIONS = {
|
||||
'duration': {
|
||||
'fast': 150,
|
||||
'normal': 250,
|
||||
'slow': 350
|
||||
},
|
||||
'easing': 'cubic-bezier(0.4, 0, 0.2, 1)'
|
||||
}
|
||||
|
||||
# Шрифты
|
||||
FONTS = {
|
||||
'family': {
|
||||
'primary': 'Inter',
|
||||
'secondary': 'Roboto'
|
||||
},
|
||||
'size': {
|
||||
'xs': '12px',
|
||||
'sm': '14px',
|
||||
'md': '16px',
|
||||
'lg': '18px',
|
||||
'xl': '24px',
|
||||
'xxl': '32px'
|
||||
},
|
||||
'weight': {
|
||||
'regular': '400',
|
||||
'medium': '500',
|
||||
'semibold': '600',
|
||||
'bold': '700'
|
||||
}
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def get_base_styles(cls, theme: str = 'light') -> str:
|
||||
"""Возвращает базовые стили для приложения"""
|
||||
colors = cls.COLORS[theme]
|
||||
|
||||
return f"""
|
||||
/* Основные стили */
|
||||
QMainWindow {{
|
||||
background: {colors['background']};
|
||||
}}
|
||||
|
||||
QWidget {{
|
||||
color: {colors['text']};
|
||||
font-family: {cls.FONTS['family']['primary']};
|
||||
font-size: {cls.FONTS['size']['md']};
|
||||
}}
|
||||
|
||||
/* Кнопки */
|
||||
QPushButton {{
|
||||
background-color: {cls.COLORS['primary']};
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: {cls.RADIUS['md']}px;
|
||||
padding: {cls.SPACING['sm']}px {cls.SPACING['md']}px;
|
||||
font-weight: {cls.FONTS['weight']['medium']};
|
||||
}}
|
||||
|
||||
QPushButton:hover {{
|
||||
background-color: {cls.COLORS['secondary']};
|
||||
}}
|
||||
|
||||
QPushButton:pressed {{
|
||||
background-color: {cls.COLORS['accent']};
|
||||
}}
|
||||
|
||||
/* Поля ввода */
|
||||
QLineEdit, QTextEdit {{
|
||||
background-color: {colors['surface']};
|
||||
color: {colors['text']};
|
||||
border: 1px solid {colors['border']};
|
||||
border-radius: {cls.RADIUS['md']}px;
|
||||
padding: {cls.SPACING['sm']}px;
|
||||
selection-background-color: {cls.COLORS['secondary']};
|
||||
}}
|
||||
|
||||
QLineEdit:focus, QTextEdit:focus {{
|
||||
border-color: {cls.COLORS['primary']};
|
||||
}}
|
||||
|
||||
/* Выпадающие списки */
|
||||
QComboBox {{
|
||||
background-color: {colors['surface']};
|
||||
color: {colors['text']};
|
||||
border: 1px solid {colors['border']};
|
||||
border-radius: {cls.RADIUS['md']}px;
|
||||
padding: {cls.SPACING['sm']}px;
|
||||
}}
|
||||
|
||||
QComboBox:hover {{
|
||||
border-color: {cls.COLORS['primary']};
|
||||
}}
|
||||
|
||||
/* Полосы прокрутки */
|
||||
QScrollBar:vertical {{
|
||||
background-color: {colors['surface']};
|
||||
width: 12px;
|
||||
margin: 0;
|
||||
}}
|
||||
|
||||
QScrollBar::handle:vertical {{
|
||||
background-color: {cls.COLORS['secondary']};
|
||||
min-height: 20px;
|
||||
border-radius: {cls.RADIUS['sm']}px;
|
||||
}}
|
||||
|
||||
QScrollBar:horizontal {{
|
||||
background-color: {colors['surface']};
|
||||
height: 12px;
|
||||
margin: 0;
|
||||
}}
|
||||
|
||||
QScrollBar::handle:horizontal {{
|
||||
background-color: {cls.COLORS['secondary']};
|
||||
min-width: 20px;
|
||||
border-radius: {cls.RADIUS['sm']}px;
|
||||
}}
|
||||
"""
|
||||
@@ -0,0 +1,217 @@
|
||||
from enum import Enum, auto
|
||||
from typing import Dict
|
||||
|
||||
class Colors:
|
||||
DARK = {
|
||||
'background': '#1E1E1E',
|
||||
'surface': '#252526',
|
||||
'primary': '#007ACC',
|
||||
'secondary': '#3C3C3C',
|
||||
'text': '#FFFFFF',
|
||||
'text_secondary': '#CCCCCC',
|
||||
'border': '#3C3C3C',
|
||||
'hover': '#2A2D2E',
|
||||
'active': '#37373D',
|
||||
'error': '#F44336',
|
||||
'success': '#4CAF50',
|
||||
'warning': '#FFC107'
|
||||
}
|
||||
|
||||
LIGHT = {
|
||||
'background': '#FFFFFF',
|
||||
'surface': '#F3F3F3',
|
||||
'primary': '#007ACC',
|
||||
'secondary': '#E0E0E0',
|
||||
'text': '#000000',
|
||||
'text_secondary': '#666666',
|
||||
'border': '#CCCCCC',
|
||||
'hover': '#E8E8E8',
|
||||
'active': '#DADADA',
|
||||
'error': '#F44336',
|
||||
'success': '#4CAF50',
|
||||
'warning': '#FFC107'
|
||||
}
|
||||
|
||||
class Fonts:
|
||||
FAMILY = "Inter"
|
||||
SIZES = {
|
||||
"xs": "11px",
|
||||
"sm": "13px",
|
||||
"md": "14px",
|
||||
"lg": "16px",
|
||||
"xl": "18px"
|
||||
}
|
||||
WEIGHTS = {
|
||||
"normal": "400",
|
||||
"medium": "500",
|
||||
"semibold": "600",
|
||||
"bold": "700"
|
||||
}
|
||||
|
||||
class Spacing:
|
||||
TINY = 4
|
||||
SMALL = 8
|
||||
MEDIUM = 16
|
||||
LARGE = 24
|
||||
XLARGE = 32
|
||||
XXLARGE = 48
|
||||
|
||||
class Shadows:
|
||||
SMALL = {
|
||||
"dark": "0 2px 4px rgba(0, 0, 0, 0.3)",
|
||||
"light": "0 2px 4px rgba(0, 0, 0, 0.1)"
|
||||
}
|
||||
MEDIUM = {
|
||||
"dark": "0 4px 8px rgba(0, 0, 0, 0.4)",
|
||||
"light": "0 4px 8px rgba(0, 0, 0, 0.15)"
|
||||
}
|
||||
LARGE = {
|
||||
"dark": "0 8px 16px rgba(0, 0, 0, 0.5)",
|
||||
"light": "0 8px 16px rgba(0, 0, 0, 0.2)"
|
||||
}
|
||||
|
||||
class Theme(Enum):
|
||||
DARK = auto()
|
||||
LIGHT = auto()
|
||||
|
||||
def get_colors(self):
|
||||
if self == Theme.DARK:
|
||||
return Colors.DARK
|
||||
return Colors.LIGHT
|
||||
|
||||
def get_spacing(self):
|
||||
return Spacing
|
||||
|
||||
def get_fonts(self):
|
||||
return Fonts
|
||||
|
||||
def get_shadows(self):
|
||||
if self == Theme.DARK:
|
||||
return {k: v["dark"] for k, v in Shadows.__dict__.items() if isinstance(v, dict)}
|
||||
return {k: v["light"] for k, v in Shadows.__dict__.items() if isinstance(v, dict)}
|
||||
|
||||
class StyleSheet:
|
||||
@staticmethod
|
||||
def get_base_styles(theme: Theme) -> str:
|
||||
colors = theme.get_colors()
|
||||
spacing = theme.get_spacing()
|
||||
|
||||
return f"""
|
||||
QMainWindow {{
|
||||
background-color: {colors['background']};
|
||||
}}
|
||||
|
||||
QWidget {{
|
||||
color: {colors['text']};
|
||||
font-family: 'Inter';
|
||||
}}
|
||||
|
||||
QPushButton {{
|
||||
background-color: {colors['primary']};
|
||||
border: none;
|
||||
border-radius: {spacing.TINY}px;
|
||||
padding: {spacing.SMALL}px {spacing.MEDIUM}px;
|
||||
color: white;
|
||||
}}
|
||||
|
||||
QPushButton:hover {{
|
||||
background-color: {colors['hover']};
|
||||
}}
|
||||
|
||||
QPushButton:pressed {{
|
||||
background-color: {colors['active']};
|
||||
}}
|
||||
|
||||
QLineEdit, QTextEdit {{
|
||||
background-color: {colors['surface']};
|
||||
border: 1px solid {colors['border']};
|
||||
border-radius: {spacing.TINY}px;
|
||||
padding: {spacing.SMALL}px;
|
||||
color: {colors['text']};
|
||||
}}
|
||||
|
||||
QLineEdit:focus, QTextEdit:focus {{
|
||||
border: 1px solid {colors['primary']};
|
||||
}}
|
||||
|
||||
QComboBox {{
|
||||
background-color: {colors['surface']};
|
||||
border: 1px solid {colors['border']};
|
||||
border-radius: {spacing.TINY}px;
|
||||
padding: {spacing.SMALL}px;
|
||||
color: {colors['text']};
|
||||
}}
|
||||
|
||||
QComboBox:hover {{
|
||||
border: 1px solid {colors['primary']};
|
||||
}}
|
||||
|
||||
QLabel {{
|
||||
color: {colors['text']};
|
||||
}}
|
||||
|
||||
QScrollBar:vertical {{
|
||||
border: none;
|
||||
background-color: {colors['surface']};
|
||||
width: 10px;
|
||||
margin: 0px;
|
||||
}}
|
||||
|
||||
QScrollBar::handle:vertical {{
|
||||
background-color: {colors['secondary']};
|
||||
min-height: 20px;
|
||||
border-radius: 5px;
|
||||
}}
|
||||
|
||||
QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical {{
|
||||
height: 0px;
|
||||
}}
|
||||
|
||||
QScrollBar:horizontal {{
|
||||
border: none;
|
||||
background-color: {colors['surface']};
|
||||
height: 10px;
|
||||
margin: 0px;
|
||||
}}
|
||||
|
||||
QScrollBar::handle:horizontal {{
|
||||
background-color: {colors['secondary']};
|
||||
min-width: 20px;
|
||||
border-radius: 5px;
|
||||
}}
|
||||
|
||||
QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal {{
|
||||
width: 0px;
|
||||
}}
|
||||
"""
|
||||
|
||||
@staticmethod
|
||||
def get_custom_styles(theme: Theme) -> Dict[str, str]:
|
||||
colors = theme.get_colors()
|
||||
return {
|
||||
"primary_button": f"""
|
||||
QPushButton {{
|
||||
background-color: {colors['primary']};
|
||||
color: white;
|
||||
}}
|
||||
""",
|
||||
"secondary_button": f"""
|
||||
QPushButton {{
|
||||
background-color: transparent;
|
||||
color: {colors['primary']};
|
||||
border: 1px solid {colors['primary']};
|
||||
}}
|
||||
""",
|
||||
"danger_button": f"""
|
||||
QPushButton {{
|
||||
background-color: {colors['error']};
|
||||
color: white;
|
||||
}}
|
||||
""",
|
||||
"success_button": f"""
|
||||
QPushButton {{
|
||||
background-color: {colors['success']};
|
||||
color: white;
|
||||
}}
|
||||
"""
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
from typing import Optional
|
||||
from PyQt6.QtWidgets import QApplication
|
||||
from .theme import Theme, StyleSheet
|
||||
|
||||
class ThemeManager:
|
||||
_instance: Optional['ThemeManager'] = None
|
||||
_current_theme = Theme.DARK
|
||||
|
||||
def __new__(cls):
|
||||
if cls._instance is None:
|
||||
cls._instance = super(ThemeManager, cls).__new__(cls)
|
||||
return cls._instance
|
||||
|
||||
@classmethod
|
||||
def get_instance(cls) -> 'ThemeManager':
|
||||
if cls._instance is None:
|
||||
cls._instance = cls()
|
||||
return cls._instance
|
||||
|
||||
@property
|
||||
def current_theme(self) -> Theme:
|
||||
return self._current_theme
|
||||
|
||||
def switch_theme(self, theme: Theme):
|
||||
"""Переключение темы приложения"""
|
||||
self._current_theme = theme
|
||||
self.apply_theme()
|
||||
|
||||
def toggle_theme(self):
|
||||
"""Переключение между светлой и темной темой"""
|
||||
new_theme = Theme.LIGHT if self._current_theme == Theme.DARK else Theme.DARK
|
||||
self.switch_theme(new_theme)
|
||||
|
||||
def apply_theme(self):
|
||||
"""Применение текущей темы ко всему приложению"""
|
||||
if not QApplication.instance():
|
||||
return
|
||||
|
||||
# Применяем базовые стили
|
||||
QApplication.instance().setStyleSheet(
|
||||
StyleSheet.get_base_styles(self._current_theme)
|
||||
)
|
||||
|
||||
def get_style(self, style_name: str) -> str:
|
||||
"""Получение конкретного стиля"""
|
||||
return StyleSheet.get_base_styles(self._current_theme)
|
||||
@@ -0,0 +1,91 @@
|
||||
from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout,
|
||||
QLabel, QPushButton, QTextEdit, QComboBox)
|
||||
from PyQt6.QtCore import Qt, pyqtSignal
|
||||
from PyQt6.QtGui import QTextCursor
|
||||
from ..styles.style_constants import StyleConstants
|
||||
from ..styles.icons import IconManager, IconType
|
||||
|
||||
class ConsoleWindow(QWidget):
|
||||
"""Окно для консольного вывода"""
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
self.icon_manager = IconManager.get_instance()
|
||||
self.setup_ui()
|
||||
|
||||
def setup_ui(self):
|
||||
self.setWindowTitle("Консоль")
|
||||
self.resize(600, 400)
|
||||
|
||||
# Основной layout
|
||||
layout = QVBoxLayout(self)
|
||||
layout.setSpacing(StyleConstants.SPACING['md'])
|
||||
layout.setContentsMargins(
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg']
|
||||
)
|
||||
|
||||
# Верхняя панель
|
||||
top_panel = QHBoxLayout()
|
||||
|
||||
# Уровень логирования
|
||||
self.log_level = QComboBox()
|
||||
self.log_level.addItems(["INFO", "WARNING", "ERROR", "DEBUG"])
|
||||
top_panel.addWidget(self.log_level)
|
||||
|
||||
# Кнопки
|
||||
clear_btn = QPushButton("Очистить")
|
||||
clear_btn.setIcon(self.icon_manager.get_icon(IconType.DELETE))
|
||||
clear_btn.clicked.connect(self.clear_console)
|
||||
top_panel.addWidget(clear_btn)
|
||||
|
||||
save_btn = QPushButton("Сохранить")
|
||||
save_btn.setIcon(self.icon_manager.get_icon(IconType.SAVE))
|
||||
top_panel.addWidget(save_btn)
|
||||
|
||||
top_panel.addStretch()
|
||||
layout.addLayout(top_panel)
|
||||
|
||||
# Консоль
|
||||
self.console = QTextEdit()
|
||||
self.console.setReadOnly(True)
|
||||
self.console.setStyleSheet(f"""
|
||||
QTextEdit {{
|
||||
background-color: {StyleConstants.COLORS['dark']['background']};
|
||||
color: {StyleConstants.COLORS['dark']['text']};
|
||||
font-family: 'Consolas', monospace;
|
||||
font-size: {StyleConstants.FONTS['size']['md']};
|
||||
padding: {StyleConstants.SPACING['md']}px;
|
||||
border-radius: {StyleConstants.RADIUS['md']}px;
|
||||
}}
|
||||
""")
|
||||
layout.addWidget(self.console)
|
||||
|
||||
# Применяем стили
|
||||
self.setStyleSheet(StyleConstants.get_base_styles('light'))
|
||||
|
||||
def log(self, message: str, level: str = "INFO"):
|
||||
"""Добавление сообщения в консоль"""
|
||||
color = {
|
||||
"INFO": StyleConstants.COLORS['primary'],
|
||||
"WARNING": StyleConstants.COLORS['warning'],
|
||||
"ERROR": StyleConstants.COLORS['error'],
|
||||
"DEBUG": StyleConstants.COLORS['secondary']
|
||||
}.get(level, StyleConstants.COLORS['primary'])
|
||||
|
||||
# Форматируем сообщение
|
||||
formatted_message = f'<span style="color: {color}">[{level}]</span> {message}<br>'
|
||||
|
||||
# Добавляем сообщение в консоль
|
||||
cursor = self.console.textCursor()
|
||||
cursor.movePosition(QTextCursor.MoveOperation.End)
|
||||
cursor.insertHtml(formatted_message)
|
||||
|
||||
# Прокручиваем к последнему сообщению
|
||||
self.console.setTextCursor(cursor)
|
||||
self.console.ensureCursorVisible()
|
||||
|
||||
def clear_console(self):
|
||||
"""Очистка консоли"""
|
||||
self.console.clear()
|
||||
@@ -0,0 +1,153 @@
|
||||
from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout,
|
||||
QLabel, QPushButton, QTextEdit, QComboBox,
|
||||
QScrollArea, QFrame, QCheckBox)
|
||||
from PyQt6.QtCore import Qt, pyqtSignal
|
||||
from ..styles.style_constants import StyleConstants
|
||||
from ..styles.icons import IconManager, IconType
|
||||
|
||||
class NegativePromptCategory(QFrame):
|
||||
"""Виджет категории негативных промптов"""
|
||||
def __init__(self, title: str, prompts: dict, parent=None):
|
||||
super().__init__(parent)
|
||||
self.title = title
|
||||
self.prompts = prompts
|
||||
self.setup_ui()
|
||||
|
||||
def setup_ui(self):
|
||||
layout = QVBoxLayout(self)
|
||||
|
||||
# Заголовок категории
|
||||
title_label = QLabel(self.title)
|
||||
title_label.setStyleSheet(f"""
|
||||
font-size: {StyleConstants.FONTS['size']['lg']};
|
||||
font-weight: {StyleConstants.FONTS['weight']['bold']};
|
||||
margin-bottom: {StyleConstants.SPACING['sm']};
|
||||
""")
|
||||
layout.addWidget(title_label)
|
||||
|
||||
# Список промптов с чекбоксами
|
||||
for prompt, description in self.prompts.items():
|
||||
prompt_frame = QFrame()
|
||||
prompt_layout = QVBoxLayout(prompt_frame)
|
||||
|
||||
checkbox = QCheckBox(prompt)
|
||||
checkbox.setStyleSheet(f"""
|
||||
font-size: {StyleConstants.FONTS['size']['md']};
|
||||
font-weight: {StyleConstants.FONTS['weight']['medium']};
|
||||
""")
|
||||
|
||||
description_label = QLabel(description)
|
||||
description_label.setStyleSheet(f"""
|
||||
color: {StyleConstants.COLORS['light']['text_secondary']};
|
||||
font-size: {StyleConstants.FONTS['size']['sm']};
|
||||
""")
|
||||
description_label.setWordWrap(True)
|
||||
|
||||
prompt_layout.addWidget(checkbox)
|
||||
prompt_layout.addWidget(description_label)
|
||||
layout.addWidget(prompt_frame)
|
||||
|
||||
self.setStyleSheet(f"""
|
||||
QFrame {{
|
||||
background-color: {StyleConstants.COLORS['light']['surface']};
|
||||
border-radius: {StyleConstants.RADIUS['lg']};
|
||||
padding: {StyleConstants.SPACING['md']};
|
||||
margin-bottom: {StyleConstants.SPACING['md']};
|
||||
}}
|
||||
""")
|
||||
|
||||
class NegativePromptWindow(QWidget):
|
||||
"""Окно для работы с негативными промптами"""
|
||||
prompts_selected = pyqtSignal(list)
|
||||
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
self.icon_manager = IconManager.get_instance()
|
||||
self.setup_ui()
|
||||
|
||||
def setup_ui(self):
|
||||
self.setWindowTitle("Негативные промпты")
|
||||
self.resize(800, 600)
|
||||
|
||||
# Основной layout
|
||||
layout = QVBoxLayout(self)
|
||||
layout.setSpacing(StyleConstants.SPACING['md'])
|
||||
layout.setContentsMargins(
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg']
|
||||
)
|
||||
|
||||
# Верхняя панель
|
||||
top_panel = QHBoxLayout()
|
||||
|
||||
# Поиск
|
||||
self.search_box = QComboBox()
|
||||
self.search_box.setEditable(True)
|
||||
self.search_box.setPlaceholderText("Поиск негативных промптов...")
|
||||
self.search_box.setMinimumWidth(300)
|
||||
top_panel.addWidget(self.search_box)
|
||||
|
||||
# Кнопки
|
||||
select_all_btn = QPushButton("Выбрать все")
|
||||
select_all_btn.setIcon(self.icon_manager.get_icon(IconType.SUCCESS))
|
||||
top_panel.addWidget(select_all_btn)
|
||||
|
||||
clear_btn = QPushButton("Очистить")
|
||||
clear_btn.setIcon(self.icon_manager.get_icon(IconType.CLOSE))
|
||||
top_panel.addWidget(clear_btn)
|
||||
|
||||
top_panel.addStretch()
|
||||
layout.addLayout(top_panel)
|
||||
|
||||
# Область прокрутки для категорий
|
||||
scroll_area = QScrollArea()
|
||||
scroll_area.setWidgetResizable(True)
|
||||
scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
|
||||
|
||||
# Контейнер для категорий
|
||||
categories_widget = QWidget()
|
||||
self.categories_layout = QVBoxLayout(categories_widget)
|
||||
|
||||
# Добавляем тестовые категории
|
||||
test_categories = {
|
||||
"Качество": {
|
||||
"Низкое качество": "Удаляет артефакты низкого качества и размытость",
|
||||
"Шум и зернистость": "Убирает нежелательный шум и зернистость",
|
||||
"Искажения": "Предотвращает искажения пропорций и перспективы"
|
||||
},
|
||||
"Артефакты": {
|
||||
"Двойные элементы": "Убирает дублирование частей изображения",
|
||||
"Размытые лица": "Улучшает четкость и детализацию лиц",
|
||||
"Неправильная анатомия": "Корректирует анатомические ошибки"
|
||||
}
|
||||
}
|
||||
|
||||
for title, prompts in test_categories.items():
|
||||
category = NegativePromptCategory(title, prompts)
|
||||
self.categories_layout.addWidget(category)
|
||||
|
||||
self.categories_layout.addStretch()
|
||||
scroll_area.setWidget(categories_widget)
|
||||
layout.addWidget(scroll_area)
|
||||
|
||||
# Нижняя панель
|
||||
bottom_panel = QHBoxLayout()
|
||||
|
||||
apply_btn = QPushButton("Применить")
|
||||
apply_btn.setIcon(self.icon_manager.get_icon(IconType.SUCCESS))
|
||||
apply_btn.setStyleSheet(f"""
|
||||
background-color: {StyleConstants.COLORS['success']};
|
||||
""")
|
||||
bottom_panel.addWidget(apply_btn)
|
||||
|
||||
cancel_btn = QPushButton("Отмена")
|
||||
cancel_btn.setIcon(self.icon_manager.get_icon(IconType.CLOSE))
|
||||
bottom_panel.addWidget(cancel_btn)
|
||||
|
||||
bottom_panel.addStretch()
|
||||
layout.addLayout(bottom_panel)
|
||||
|
||||
# Применяем стили
|
||||
self.setStyleSheet(StyleConstants.get_base_styles('light'))
|
||||
@@ -0,0 +1,117 @@
|
||||
from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout,
|
||||
QLabel, QPushButton, QTextEdit, QComboBox,
|
||||
QScrollArea, QFrame)
|
||||
from PyQt6.QtCore import Qt, pyqtSignal
|
||||
from ..styles.style_constants import StyleConstants
|
||||
from ..styles.icons import IconManager, IconType
|
||||
|
||||
class PromptCategory(QFrame):
|
||||
"""Виджет категории промптов"""
|
||||
def __init__(self, title: str, prompts: list, parent=None):
|
||||
super().__init__(parent)
|
||||
self.title = title
|
||||
self.prompts = prompts
|
||||
self.setup_ui()
|
||||
|
||||
def setup_ui(self):
|
||||
layout = QVBoxLayout(self)
|
||||
|
||||
# Заголовок категории
|
||||
title_label = QLabel(self.title)
|
||||
title_label.setStyleSheet(f"""
|
||||
font-size: {StyleConstants.FONTS['size']['lg']};
|
||||
font-weight: {StyleConstants.FONTS['weight']['bold']};
|
||||
margin-bottom: {StyleConstants.SPACING['sm']};
|
||||
""")
|
||||
layout.addWidget(title_label)
|
||||
|
||||
# Список промптов
|
||||
for prompt in self.prompts:
|
||||
btn = QPushButton(prompt)
|
||||
btn.setStyleSheet(f"""
|
||||
text-align: left;
|
||||
padding: {StyleConstants.SPACING['sm']};
|
||||
margin-bottom: {StyleConstants.SPACING['xs']};
|
||||
""")
|
||||
layout.addWidget(btn)
|
||||
|
||||
self.setStyleSheet(f"""
|
||||
QFrame {{
|
||||
background-color: {StyleConstants.COLORS['light']['surface']};
|
||||
border-radius: {StyleConstants.RADIUS['lg']};
|
||||
padding: {StyleConstants.SPACING['md']};
|
||||
margin-bottom: {StyleConstants.SPACING['md']};
|
||||
}}
|
||||
""")
|
||||
|
||||
class PromptWindow(QWidget):
|
||||
"""Окно для работы с промптами"""
|
||||
prompt_selected = pyqtSignal(str)
|
||||
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
self.icon_manager = IconManager.get_instance()
|
||||
self.setup_ui()
|
||||
|
||||
def setup_ui(self):
|
||||
self.setWindowTitle("Библиотека промптов")
|
||||
self.resize(800, 600)
|
||||
|
||||
# Основной layout
|
||||
layout = QVBoxLayout(self)
|
||||
layout.setSpacing(StyleConstants.SPACING['md'])
|
||||
layout.setContentsMargins(
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg'],
|
||||
StyleConstants.SPACING['lg']
|
||||
)
|
||||
|
||||
# Верхняя панель
|
||||
top_panel = QHBoxLayout()
|
||||
|
||||
# Поиск
|
||||
self.search_box = QComboBox()
|
||||
self.search_box.setEditable(True)
|
||||
self.search_box.setPlaceholderText("Поиск промптов...")
|
||||
self.search_box.setMinimumWidth(300)
|
||||
top_panel.addWidget(self.search_box)
|
||||
|
||||
# Кнопки
|
||||
add_btn = QPushButton("Добавить промпт")
|
||||
add_btn.setIcon(self.icon_manager.get_icon(IconType.ADD))
|
||||
top_panel.addWidget(add_btn)
|
||||
|
||||
refresh_btn = QPushButton("Обновить")
|
||||
refresh_btn.setIcon(self.icon_manager.get_icon(IconType.REFRESH))
|
||||
top_panel.addWidget(refresh_btn)
|
||||
|
||||
top_panel.addStretch()
|
||||
layout.addLayout(top_panel)
|
||||
|
||||
# Область прокрутки для категорий
|
||||
scroll_area = QScrollArea()
|
||||
scroll_area.setWidgetResizable(True)
|
||||
scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
|
||||
|
||||
# Контейнер для категорий
|
||||
categories_widget = QWidget()
|
||||
self.categories_layout = QVBoxLayout(categories_widget)
|
||||
|
||||
# Добавляем тестовые категории
|
||||
test_categories = {
|
||||
"Стили": ["Фотореалистичный", "Аниме", "Масляная живопись", "Акварель"],
|
||||
"Освещение": ["Дневной свет", "Закат", "Ночное освещение", "Студийный свет"],
|
||||
"Композиция": ["Крупный план", "Панорама", "Портрет", "Пейзаж"]
|
||||
}
|
||||
|
||||
for title, prompts in test_categories.items():
|
||||
category = PromptCategory(title, prompts)
|
||||
self.categories_layout.addWidget(category)
|
||||
|
||||
self.categories_layout.addStretch()
|
||||
scroll_area.setWidget(categories_widget)
|
||||
layout.addWidget(scroll_area)
|
||||
|
||||
# Применяем стили
|
||||
self.setStyleSheet(StyleConstants.get_base_styles('light'))
|
||||
@@ -0,0 +1,14 @@
|
||||
# requirements.txt
|
||||
|
||||
certifi==2025.1.31
|
||||
charset-normalizer==3.4.1
|
||||
dotenv==0.9.9
|
||||
idna==3.10
|
||||
pillow==11.1.0
|
||||
PyQt6==6.8.1
|
||||
PyQt6-Qt6==6.8.2
|
||||
PyQt6_sip==13.10.0
|
||||
python-dotenv==1.0.1
|
||||
requests==2.32.3
|
||||
urllib3==2.3.0
|
||||
websockets==15.0.1
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z"/></svg>
|
||||
|
After Width: | Height: | Size: 156 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M19 6.41L17.59 5L12 10.59L6.41 5L5 6.41L10.59 12L5 17.59L6.41 19L12 13.41L17.59 19L19 17.59L13.41 12z"/></svg>
|
||||
|
After Width: | Height: | Size: 224 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M19 4h-3.5l-1-1h-5l-1 1H5v2h14M6 19a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V7H6z"/></svg>
|
||||
|
After Width: | Height: | Size: 193 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M18 15v3h-3v2h3v3h2v-3h3v-2h-3v-3zm-4.7 6H5c-1.1 0-2-.9-2-2V5c0-1.1.9-2 2-2h14c1.1 0 2 .9 2 2v8.3c-.6-.2-1.3-.3-2-.3c-1.1 0-2.2.3-3.1.9L14.5 12L11 16.5l-2.5-3L5 18h8.1c-.1.3-.1.7-.1 1c0 .7.1 1.4.3 2"/></svg>
|
||||
|
After Width: | Height: | Size: 321 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M10 20v-6h4v6h5v-8h3L12 3L2 12h3v8z"/></svg>
|
||||
|
After Width: | Height: | Size: 158 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="m8.5 13.5l2.5 3l3.5-4.5l4.5 6H5m16 1V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2"/></svg>
|
||||
|
After Width: | Height: | Size: 225 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M21 16.5c0 .38-.21.71-.53.88l-7.9 4.44c-.16.12-.36.18-.57.18s-.41-.06-.57-.18l-7.9-4.44A.99.99 0 0 1 3 16.5v-9c0-.38.21-.71.53-.88l7.9-4.44c.16-.12.36-.18.57-.18s.41.06.57.18l7.9 4.44c.32.17.53.5.53.88zM12 4.15L6.04 7.5L12 10.85l5.96-3.35z"/></svg>
|
||||
|
After Width: | Height: | Size: 362 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M17.65 6.35A7.96 7.96 0 0 0 12 4a8 8 0 0 0-8 8a8 8 0 0 0 8 8c3.73 0 6.84-2.55 7.73-6h-2.08A5.99 5.99 0 0 1 12 18a6 6 0 0 1-6-6a6 6 0 0 1 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4z"/></svg>
|
||||
|
After Width: | Height: | Size: 299 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M15 9H5V5h10m-3 14a3 3 0 0 1-3-3a3 3 0 0 1 3-3a3 3 0 0 1 3 3a3 3 0 0 1-3 3m5-16H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V7z"/></svg>
|
||||
|
After Width: | Height: | Size: 255 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M12 15.5A3.5 3.5 0 0 1 8.5 12A3.5 3.5 0 0 1 12 8.5a3.5 3.5 0 0 1 3.5 3.5a3.5 3.5 0 0 1-3.5 3.5m7.43-2.53c.04-.32.07-.64.07-.97s-.03-.66-.07-1l2.11-1.63c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.31-.61-.22l-2.49 1c-.52-.39-1.06-.73-1.69-.98l-.37-2.65A.506.506 0 0 0 14 2h-4c-.25 0-.46.18-.5.42l-.37 2.65c-.63.25-1.17.59-1.69.98l-2.49-1c-.22-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64L4.57 11c-.04.34-.07.67-.07 1s.03.65.07.97l-2.11 1.66c-.19.15-.25.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1.01c.52.4 1.06.74 1.69.99l.37 2.65c.04.24.25.42.5.42h4c.25 0 .46-.18.5-.42l.37-2.65c.63-.26 1.17-.59 1.69-.99l2.49 1.01c.22.08.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64z"/></svg>
|
||||
|
After Width: | Height: | Size: 787 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10s10-4.5 10-10S17.5 2 12 2m-2 15l-5-5l1.41-1.41L10 14.17l7.59-7.59L19 8z"/></svg>
|
||||
|
After Width: | Height: | Size: 229 B |
@@ -0,0 +1,51 @@
|
||||
import requests
|
||||
from pathlib import Path
|
||||
import os
|
||||
|
||||
def download_file(url: str, path: Path):
|
||||
"""Загрузка файла по URL"""
|
||||
try:
|
||||
response = requests.get(url)
|
||||
response.raise_for_status()
|
||||
path.write_bytes(response.content)
|
||||
print(f"Загружен файл: {path}")
|
||||
except Exception as e:
|
||||
print(f"Ошибка при загрузке {path}: {e}")
|
||||
|
||||
def download_font():
|
||||
"""Загрузка шрифта Inter"""
|
||||
fonts_dir = Path("resources/fonts")
|
||||
fonts_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
font_url = "https://github.com/rsms/inter/raw/master/docs/font-files/InterVariable.ttf"
|
||||
font_path = fonts_dir / "InterVariable.ttf"
|
||||
|
||||
if not font_path.exists():
|
||||
download_file(font_url, font_path)
|
||||
|
||||
def download_icons():
|
||||
"""Загрузка иконок"""
|
||||
icons_dir = Path("resources/icons")
|
||||
icons_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
icons = {
|
||||
"home.svg": "https://api.iconify.design/mdi/home.svg",
|
||||
"models.svg": "https://api.iconify.design/mdi/cube.svg",
|
||||
"settings.svg": "https://api.iconify.design/mdi/cog.svg",
|
||||
"generate.svg": "https://api.iconify.design/mdi/image-plus.svg",
|
||||
"add.svg": "https://api.iconify.design/mdi/plus.svg",
|
||||
"delete.svg": "https://api.iconify.design/mdi/delete.svg",
|
||||
"refresh.svg": "https://api.iconify.design/mdi/refresh.svg",
|
||||
"save.svg": "https://api.iconify.design/mdi/content-save.svg",
|
||||
"close.svg": "https://api.iconify.design/mdi/close.svg",
|
||||
"success.svg": "https://api.iconify.design/mdi/check-circle.svg",
|
||||
}
|
||||
|
||||
for filename, url in icons.items():
|
||||
icon_path = icons_dir / filename
|
||||
if not icon_path.exists():
|
||||
download_file(url, icon_path)
|
||||
|
||||
if __name__ == "__main__":
|
||||
download_font()
|
||||
download_icons()
|
||||
@@ -6,95 +6,88 @@ const app = express();
|
||||
const port = 3000;
|
||||
|
||||
// Конфигурация API Stable Diffusion
|
||||
const SD_API_URL = 'http://localhost:7860';
|
||||
const SD_API_URL = process.env.SD_API_URL || 'http://localhost:7860';
|
||||
|
||||
app.use(cors());
|
||||
app.use(express.json());
|
||||
|
||||
// Прокси для txt2img с отслеживанием прогресса
|
||||
// Middleware для логирования запросов
|
||||
app.use((req, res, next) => {
|
||||
console.log(`${req.method} ${req.path}`);
|
||||
next();
|
||||
});
|
||||
|
||||
// Прокси для txt2img
|
||||
app.post('/api/txt2img', async (req, res) => {
|
||||
try {
|
||||
// Отправляем запрос на генерацию
|
||||
const generationPromise = axios.post(`${SD_API_URL}/sdapi/v1/txt2img`, req.body);
|
||||
|
||||
// Начинаем отслеживать прогресс сразу
|
||||
let isGenerating = true;
|
||||
let lastProgress = 0;
|
||||
|
||||
while (isGenerating) {
|
||||
try {
|
||||
const progressResponse = await axios.get(`${SD_API_URL}/sdapi/v1/progress`);
|
||||
const progress = progressResponse.data;
|
||||
|
||||
if (progress.progress >= 1.0) {
|
||||
isGenerating = false;
|
||||
}
|
||||
|
||||
// Если прогресс изменился, обновляем lastProgress
|
||||
if (progress.progress !== lastProgress) {
|
||||
lastProgress = progress.progress;
|
||||
console.log(`Прогресс генерации: ${Math.round(progress.progress * 100)}%`);
|
||||
}
|
||||
|
||||
await new Promise(resolve => setTimeout(resolve, 100));
|
||||
} catch (error) {
|
||||
console.error('Ошибка при получении прогресса:', error);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Ждем завершения генерации
|
||||
const response = await generationPromise;
|
||||
const response = await axios.post(`${SD_API_URL}/sdapi/v1/txt2img`, req.body);
|
||||
res.json(response.data);
|
||||
} catch (error) {
|
||||
console.error('Ошибка при запросе к Stable Diffusion API:', error);
|
||||
res.status(500).json({ error: 'Ошибка при генерации изображения' });
|
||||
res.status(500).json({
|
||||
error: 'Ошибка при генерации изображения',
|
||||
details: error.message
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Прокси для проверки прогресса
|
||||
// Прокси для получения прогресса
|
||||
app.get('/api/progress', async (req, res) => {
|
||||
try {
|
||||
const response = await axios.get(`${SD_API_URL}/sdapi/v1/progress`);
|
||||
const progress = response.data;
|
||||
|
||||
// Добавляем дополнительную информацию о прогрессе
|
||||
const result = {
|
||||
...progress,
|
||||
percentage: Math.round(progress.progress * 100),
|
||||
current_step: progress.state?.sampling_step || 0,
|
||||
total_steps: progress.state?.sampling_steps || 1
|
||||
};
|
||||
|
||||
res.json(result);
|
||||
res.json({
|
||||
...response.data,
|
||||
percentage: Math.round(response.data.progress * 100)
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Ошибка при получении прогресса:', error);
|
||||
res.status(500).json({ error: 'Ошибка при получении прогресса' });
|
||||
res.status(500).json({
|
||||
error: 'Ошибка при получении прогресса',
|
||||
details: error.message
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Прокси для получения моделей
|
||||
app.get('/api/sd-models', async (req, res) => {
|
||||
// Прокси для получения списка моделей
|
||||
app.get('/api/models', async (req, res) => {
|
||||
try {
|
||||
const response = await axios.get(`${SD_API_URL}/sdapi/v1/sd-models`);
|
||||
res.json(response.data);
|
||||
} catch (error) {
|
||||
console.error('Ошибка при получении списка моделей:', error);
|
||||
res.status(500).json({ error: 'Ошибка при получении списка моделей' });
|
||||
res.status(500).json({
|
||||
error: 'Ошибка при получении списка моделей',
|
||||
details: error.message
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Прокси для получения сэмплеров
|
||||
app.get('/api/samplers', async (req, res) => {
|
||||
// Прокси для изменения модели
|
||||
app.post('/api/models/switch', async (req, res) => {
|
||||
try {
|
||||
const response = await axios.get(`${SD_API_URL}/sdapi/v1/samplers`);
|
||||
res.json(response.data);
|
||||
const response = await axios.post(`${SD_API_URL}/sdapi/v1/options`, {
|
||||
sd_model_checkpoint: req.body.model_name
|
||||
});
|
||||
res.json({ success: true });
|
||||
} catch (error) {
|
||||
console.error('Ошибка при получении списка сэмплеров:', error);
|
||||
res.status(500).json({ error: 'Ошибка при получении списка сэмплеров' });
|
||||
console.error('Ошибка при переключении модели:', error);
|
||||
res.status(500).json({
|
||||
error: 'Ошибка при переключении модели',
|
||||
details: error.message
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Обработка ошибок
|
||||
app.use((err, req, res, next) => {
|
||||
console.error(err.stack);
|
||||
res.status(500).json({
|
||||
error: 'Внутренняя ошибка сервера',
|
||||
details: err.message
|
||||
});
|
||||
});
|
||||
|
||||
app.listen(port, () => {
|
||||
console.log(`Сервер запущен на порту ${port}`);
|
||||
console.log(`Stable Diffusion API URL: ${SD_API_URL}`);
|
||||
});
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2018 Pedro Burón
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,14 @@
|
||||
Metadata-Version: 2.1
|
||||
Name: dotenv
|
||||
Version: 0.9.9
|
||||
Summary: Deprecated package
|
||||
Home-page: https://github.com/pedroburon/dotenv
|
||||
Author: Pedro Burón
|
||||
Author-email: pedroburonv@gmail.com
|
||||
License: UNKNOWN
|
||||
Platform: UNKNOWN
|
||||
License-File: LICENSE
|
||||
Requires-Dist: python-dotenv
|
||||
|
||||
UNKNOWN
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
dotenv-0.9.9.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
dotenv-0.9.9.dist-info/LICENSE,sha256=UDN9gmLB0tw_cK1WQ5POBgI5Iu13Bt4kf9VSMrrjJ7c,1069
|
||||
dotenv-0.9.9.dist-info/METADATA,sha256=C-L93MBAM6T9nTEUOLcRWO_CuLfoo4Zd9WIpxnMu4e0,279
|
||||
dotenv-0.9.9.dist-info/RECORD,,
|
||||
dotenv-0.9.9.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
dotenv-0.9.9.dist-info/WHEEL,sha256=Kh9pAotZVRFj97E15yTA4iADqXdQfIVTHcNaZTjxeGM,110
|
||||
dotenv-0.9.9.dist-info/top_level.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
||||
@@ -0,0 +1,6 @@
|
||||
Wheel-Version: 1.0
|
||||
Generator: bdist_wheel (0.45.1)
|
||||
Root-Is-Purelib: true
|
||||
Tag: py2-none-any
|
||||
Tag: py3-none-any
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
from typing import Any, Optional
|
||||
|
||||
from .main import (dotenv_values, find_dotenv, get_key, load_dotenv, set_key,
|
||||
unset_key)
|
||||
|
||||
|
||||
def load_ipython_extension(ipython: Any) -> None:
|
||||
from .ipython import load_ipython_extension
|
||||
load_ipython_extension(ipython)
|
||||
|
||||
|
||||
def get_cli_string(
|
||||
path: Optional[str] = None,
|
||||
action: Optional[str] = None,
|
||||
key: Optional[str] = None,
|
||||
value: Optional[str] = None,
|
||||
quote: Optional[str] = None,
|
||||
):
|
||||
"""Returns a string suitable for running as a shell script.
|
||||
|
||||
Useful for converting a arguments passed to a fabric task
|
||||
to be passed to a `local` or `run` command.
|
||||
"""
|
||||
command = ['dotenv']
|
||||
if quote:
|
||||
command.append(f'-q {quote}')
|
||||
if path:
|
||||
command.append(f'-f {path}')
|
||||
if action:
|
||||
command.append(action)
|
||||
if key:
|
||||
command.append(key)
|
||||
if value:
|
||||
if ' ' in value:
|
||||
command.append(f'"{value}"')
|
||||
else:
|
||||
command.append(value)
|
||||
|
||||
return ' '.join(command).strip()
|
||||
|
||||
|
||||
__all__ = ['get_cli_string',
|
||||
'load_dotenv',
|
||||
'dotenv_values',
|
||||
'get_key',
|
||||
'set_key',
|
||||
'unset_key',
|
||||
'find_dotenv',
|
||||
'load_ipython_extension']
|
||||
@@ -0,0 +1,6 @@
|
||||
"""Entry point for cli, enables execution with `python -m dotenv`"""
|
||||
|
||||
from .cli import cli
|
||||
|
||||
if __name__ == "__main__":
|
||||
cli()
|
||||
@@ -0,0 +1,199 @@
|
||||
import json
|
||||
import os
|
||||
import shlex
|
||||
import sys
|
||||
from contextlib import contextmanager
|
||||
from subprocess import Popen
|
||||
from typing import Any, Dict, IO, Iterator, List
|
||||
|
||||
try:
|
||||
import click
|
||||
except ImportError:
|
||||
sys.stderr.write('It seems python-dotenv is not installed with cli option. \n'
|
||||
'Run pip install "python-dotenv[cli]" to fix this.')
|
||||
sys.exit(1)
|
||||
|
||||
from .main import dotenv_values, set_key, unset_key
|
||||
from .version import __version__
|
||||
|
||||
|
||||
def enumerate_env():
|
||||
"""
|
||||
Return a path for the ${pwd}/.env file.
|
||||
|
||||
If pwd does not exist, return None.
|
||||
"""
|
||||
try:
|
||||
cwd = os.getcwd()
|
||||
except FileNotFoundError:
|
||||
return None
|
||||
path = os.path.join(cwd, '.env')
|
||||
return path
|
||||
|
||||
|
||||
@click.group()
|
||||
@click.option('-f', '--file', default=enumerate_env(),
|
||||
type=click.Path(file_okay=True),
|
||||
help="Location of the .env file, defaults to .env file in current working directory.")
|
||||
@click.option('-q', '--quote', default='always',
|
||||
type=click.Choice(['always', 'never', 'auto']),
|
||||
help="Whether to quote or not the variable values. Default mode is always. This does not affect parsing.")
|
||||
@click.option('-e', '--export', default=False,
|
||||
type=click.BOOL,
|
||||
help="Whether to write the dot file as an executable bash script.")
|
||||
@click.version_option(version=__version__)
|
||||
@click.pass_context
|
||||
def cli(ctx: click.Context, file: Any, quote: Any, export: Any) -> None:
|
||||
"""This script is used to set, get or unset values from a .env file."""
|
||||
ctx.obj = {'QUOTE': quote, 'EXPORT': export, 'FILE': file}
|
||||
|
||||
|
||||
@contextmanager
|
||||
def stream_file(path: os.PathLike) -> Iterator[IO[str]]:
|
||||
"""
|
||||
Open a file and yield the corresponding (decoded) stream.
|
||||
|
||||
Exits with error code 2 if the file cannot be opened.
|
||||
"""
|
||||
|
||||
try:
|
||||
with open(path) as stream:
|
||||
yield stream
|
||||
except OSError as exc:
|
||||
print(f"Error opening env file: {exc}", file=sys.stderr)
|
||||
exit(2)
|
||||
|
||||
|
||||
@cli.command()
|
||||
@click.pass_context
|
||||
@click.option('--format', default='simple',
|
||||
type=click.Choice(['simple', 'json', 'shell', 'export']),
|
||||
help="The format in which to display the list. Default format is simple, "
|
||||
"which displays name=value without quotes.")
|
||||
def list(ctx: click.Context, format: bool) -> None:
|
||||
"""Display all the stored key/value."""
|
||||
file = ctx.obj['FILE']
|
||||
|
||||
with stream_file(file) as stream:
|
||||
values = dotenv_values(stream=stream)
|
||||
|
||||
if format == 'json':
|
||||
click.echo(json.dumps(values, indent=2, sort_keys=True))
|
||||
else:
|
||||
prefix = 'export ' if format == 'export' else ''
|
||||
for k in sorted(values):
|
||||
v = values[k]
|
||||
if v is not None:
|
||||
if format in ('export', 'shell'):
|
||||
v = shlex.quote(v)
|
||||
click.echo(f'{prefix}{k}={v}')
|
||||
|
||||
|
||||
@cli.command()
|
||||
@click.pass_context
|
||||
@click.argument('key', required=True)
|
||||
@click.argument('value', required=True)
|
||||
def set(ctx: click.Context, key: Any, value: Any) -> None:
|
||||
"""Store the given key/value."""
|
||||
file = ctx.obj['FILE']
|
||||
quote = ctx.obj['QUOTE']
|
||||
export = ctx.obj['EXPORT']
|
||||
success, key, value = set_key(file, key, value, quote, export)
|
||||
if success:
|
||||
click.echo(f'{key}={value}')
|
||||
else:
|
||||
exit(1)
|
||||
|
||||
|
||||
@cli.command()
|
||||
@click.pass_context
|
||||
@click.argument('key', required=True)
|
||||
def get(ctx: click.Context, key: Any) -> None:
|
||||
"""Retrieve the value for the given key."""
|
||||
file = ctx.obj['FILE']
|
||||
|
||||
with stream_file(file) as stream:
|
||||
values = dotenv_values(stream=stream)
|
||||
|
||||
stored_value = values.get(key)
|
||||
if stored_value:
|
||||
click.echo(stored_value)
|
||||
else:
|
||||
exit(1)
|
||||
|
||||
|
||||
@cli.command()
|
||||
@click.pass_context
|
||||
@click.argument('key', required=True)
|
||||
def unset(ctx: click.Context, key: Any) -> None:
|
||||
"""Removes the given key."""
|
||||
file = ctx.obj['FILE']
|
||||
quote = ctx.obj['QUOTE']
|
||||
success, key = unset_key(file, key, quote)
|
||||
if success:
|
||||
click.echo(f"Successfully removed {key}")
|
||||
else:
|
||||
exit(1)
|
||||
|
||||
|
||||
@cli.command(context_settings={'ignore_unknown_options': True})
|
||||
@click.pass_context
|
||||
@click.option(
|
||||
"--override/--no-override",
|
||||
default=True,
|
||||
help="Override variables from the environment file with those from the .env file.",
|
||||
)
|
||||
@click.argument('commandline', nargs=-1, type=click.UNPROCESSED)
|
||||
def run(ctx: click.Context, override: bool, commandline: List[str]) -> None:
|
||||
"""Run command with environment variables present."""
|
||||
file = ctx.obj['FILE']
|
||||
if not os.path.isfile(file):
|
||||
raise click.BadParameter(
|
||||
f'Invalid value for \'-f\' "{file}" does not exist.',
|
||||
ctx=ctx
|
||||
)
|
||||
dotenv_as_dict = {
|
||||
k: v
|
||||
for (k, v) in dotenv_values(file).items()
|
||||
if v is not None and (override or k not in os.environ)
|
||||
}
|
||||
|
||||
if not commandline:
|
||||
click.echo('No command given.')
|
||||
exit(1)
|
||||
ret = run_command(commandline, dotenv_as_dict)
|
||||
exit(ret)
|
||||
|
||||
|
||||
def run_command(command: List[str], env: Dict[str, str]) -> int:
|
||||
"""Run command in sub process.
|
||||
|
||||
Runs the command in a sub process with the variables from `env`
|
||||
added in the current environment variables.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
command: List[str]
|
||||
The command and it's parameters
|
||||
env: Dict
|
||||
The additional environment variables
|
||||
|
||||
Returns
|
||||
-------
|
||||
int
|
||||
The return code of the command
|
||||
|
||||
"""
|
||||
# copy the current environment variables and add the vales from
|
||||
# `env`
|
||||
cmd_env = os.environ.copy()
|
||||
cmd_env.update(env)
|
||||
|
||||
p = Popen(command,
|
||||
universal_newlines=True,
|
||||
bufsize=0,
|
||||
shell=False,
|
||||
env=cmd_env)
|
||||
_, _ = p.communicate()
|
||||
|
||||
return p.returncode
|
||||
@@ -0,0 +1,39 @@
|
||||
from IPython.core.magic import Magics, line_magic, magics_class # type: ignore
|
||||
from IPython.core.magic_arguments import (argument, magic_arguments, # type: ignore
|
||||
parse_argstring) # type: ignore
|
||||
|
||||
from .main import find_dotenv, load_dotenv
|
||||
|
||||
|
||||
@magics_class
|
||||
class IPythonDotEnv(Magics):
|
||||
|
||||
@magic_arguments()
|
||||
@argument(
|
||||
'-o', '--override', action='store_true',
|
||||
help="Indicate to override existing variables"
|
||||
)
|
||||
@argument(
|
||||
'-v', '--verbose', action='store_true',
|
||||
help="Indicate function calls to be verbose"
|
||||
)
|
||||
@argument('dotenv_path', nargs='?', type=str, default='.env',
|
||||
help='Search in increasingly higher folders for the `dotenv_path`')
|
||||
@line_magic
|
||||
def dotenv(self, line):
|
||||
args = parse_argstring(self.dotenv, line)
|
||||
# Locate the .env file
|
||||
dotenv_path = args.dotenv_path
|
||||
try:
|
||||
dotenv_path = find_dotenv(dotenv_path, True, True)
|
||||
except IOError:
|
||||
print("cannot find .env file")
|
||||
return
|
||||
|
||||
# Load the .env file
|
||||
load_dotenv(dotenv_path, verbose=args.verbose, override=args.override)
|
||||
|
||||
|
||||
def load_ipython_extension(ipython):
|
||||
"""Register the %dotenv magic."""
|
||||
ipython.register_magics(IPythonDotEnv)
|
||||
@@ -0,0 +1,392 @@
|
||||
import io
|
||||
import logging
|
||||
import os
|
||||
import pathlib
|
||||
import shutil
|
||||
import sys
|
||||
import tempfile
|
||||
from collections import OrderedDict
|
||||
from contextlib import contextmanager
|
||||
from typing import (IO, Dict, Iterable, Iterator, Mapping, Optional, Tuple,
|
||||
Union)
|
||||
|
||||
from .parser import Binding, parse_stream
|
||||
from .variables import parse_variables
|
||||
|
||||
# A type alias for a string path to be used for the paths in this file.
|
||||
# These paths may flow to `open()` and `shutil.move()`; `shutil.move()`
|
||||
# only accepts string paths, not byte paths or file descriptors. See
|
||||
# https://github.com/python/typeshed/pull/6832.
|
||||
StrPath = Union[str, 'os.PathLike[str]']
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def with_warn_for_invalid_lines(mappings: Iterator[Binding]) -> Iterator[Binding]:
|
||||
for mapping in mappings:
|
||||
if mapping.error:
|
||||
logger.warning(
|
||||
"Python-dotenv could not parse statement starting at line %s",
|
||||
mapping.original.line,
|
||||
)
|
||||
yield mapping
|
||||
|
||||
|
||||
class DotEnv:
|
||||
def __init__(
|
||||
self,
|
||||
dotenv_path: Optional[StrPath],
|
||||
stream: Optional[IO[str]] = None,
|
||||
verbose: bool = False,
|
||||
encoding: Optional[str] = None,
|
||||
interpolate: bool = True,
|
||||
override: bool = True,
|
||||
) -> None:
|
||||
self.dotenv_path: Optional[StrPath] = dotenv_path
|
||||
self.stream: Optional[IO[str]] = stream
|
||||
self._dict: Optional[Dict[str, Optional[str]]] = None
|
||||
self.verbose: bool = verbose
|
||||
self.encoding: Optional[str] = encoding
|
||||
self.interpolate: bool = interpolate
|
||||
self.override: bool = override
|
||||
|
||||
@contextmanager
|
||||
def _get_stream(self) -> Iterator[IO[str]]:
|
||||
if self.dotenv_path and os.path.isfile(self.dotenv_path):
|
||||
with open(self.dotenv_path, encoding=self.encoding) as stream:
|
||||
yield stream
|
||||
elif self.stream is not None:
|
||||
yield self.stream
|
||||
else:
|
||||
if self.verbose:
|
||||
logger.info(
|
||||
"Python-dotenv could not find configuration file %s.",
|
||||
self.dotenv_path or '.env',
|
||||
)
|
||||
yield io.StringIO('')
|
||||
|
||||
def dict(self) -> Dict[str, Optional[str]]:
|
||||
"""Return dotenv as dict"""
|
||||
if self._dict:
|
||||
return self._dict
|
||||
|
||||
raw_values = self.parse()
|
||||
|
||||
if self.interpolate:
|
||||
self._dict = OrderedDict(resolve_variables(raw_values, override=self.override))
|
||||
else:
|
||||
self._dict = OrderedDict(raw_values)
|
||||
|
||||
return self._dict
|
||||
|
||||
def parse(self) -> Iterator[Tuple[str, Optional[str]]]:
|
||||
with self._get_stream() as stream:
|
||||
for mapping in with_warn_for_invalid_lines(parse_stream(stream)):
|
||||
if mapping.key is not None:
|
||||
yield mapping.key, mapping.value
|
||||
|
||||
def set_as_environment_variables(self) -> bool:
|
||||
"""
|
||||
Load the current dotenv as system environment variable.
|
||||
"""
|
||||
if not self.dict():
|
||||
return False
|
||||
|
||||
for k, v in self.dict().items():
|
||||
if k in os.environ and not self.override:
|
||||
continue
|
||||
if v is not None:
|
||||
os.environ[k] = v
|
||||
|
||||
return True
|
||||
|
||||
def get(self, key: str) -> Optional[str]:
|
||||
"""
|
||||
"""
|
||||
data = self.dict()
|
||||
|
||||
if key in data:
|
||||
return data[key]
|
||||
|
||||
if self.verbose:
|
||||
logger.warning("Key %s not found in %s.", key, self.dotenv_path)
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def get_key(
|
||||
dotenv_path: StrPath,
|
||||
key_to_get: str,
|
||||
encoding: Optional[str] = "utf-8",
|
||||
) -> Optional[str]:
|
||||
"""
|
||||
Get the value of a given key from the given .env.
|
||||
|
||||
Returns `None` if the key isn't found or doesn't have a value.
|
||||
"""
|
||||
return DotEnv(dotenv_path, verbose=True, encoding=encoding).get(key_to_get)
|
||||
|
||||
|
||||
@contextmanager
|
||||
def rewrite(
|
||||
path: StrPath,
|
||||
encoding: Optional[str],
|
||||
) -> Iterator[Tuple[IO[str], IO[str]]]:
|
||||
pathlib.Path(path).touch()
|
||||
|
||||
with tempfile.NamedTemporaryFile(mode="w", encoding=encoding, delete=False) as dest:
|
||||
error = None
|
||||
try:
|
||||
with open(path, encoding=encoding) as source:
|
||||
yield (source, dest)
|
||||
except BaseException as err:
|
||||
error = err
|
||||
|
||||
if error is None:
|
||||
shutil.move(dest.name, path)
|
||||
else:
|
||||
os.unlink(dest.name)
|
||||
raise error from None
|
||||
|
||||
|
||||
def set_key(
|
||||
dotenv_path: StrPath,
|
||||
key_to_set: str,
|
||||
value_to_set: str,
|
||||
quote_mode: str = "always",
|
||||
export: bool = False,
|
||||
encoding: Optional[str] = "utf-8",
|
||||
) -> Tuple[Optional[bool], str, str]:
|
||||
"""
|
||||
Adds or Updates a key/value to the given .env
|
||||
|
||||
If the .env path given doesn't exist, fails instead of risking creating
|
||||
an orphan .env somewhere in the filesystem
|
||||
"""
|
||||
if quote_mode not in ("always", "auto", "never"):
|
||||
raise ValueError(f"Unknown quote_mode: {quote_mode}")
|
||||
|
||||
quote = (
|
||||
quote_mode == "always"
|
||||
or (quote_mode == "auto" and not value_to_set.isalnum())
|
||||
)
|
||||
|
||||
if quote:
|
||||
value_out = "'{}'".format(value_to_set.replace("'", "\\'"))
|
||||
else:
|
||||
value_out = value_to_set
|
||||
if export:
|
||||
line_out = f'export {key_to_set}={value_out}\n'
|
||||
else:
|
||||
line_out = f"{key_to_set}={value_out}\n"
|
||||
|
||||
with rewrite(dotenv_path, encoding=encoding) as (source, dest):
|
||||
replaced = False
|
||||
missing_newline = False
|
||||
for mapping in with_warn_for_invalid_lines(parse_stream(source)):
|
||||
if mapping.key == key_to_set:
|
||||
dest.write(line_out)
|
||||
replaced = True
|
||||
else:
|
||||
dest.write(mapping.original.string)
|
||||
missing_newline = not mapping.original.string.endswith("\n")
|
||||
if not replaced:
|
||||
if missing_newline:
|
||||
dest.write("\n")
|
||||
dest.write(line_out)
|
||||
|
||||
return True, key_to_set, value_to_set
|
||||
|
||||
|
||||
def unset_key(
|
||||
dotenv_path: StrPath,
|
||||
key_to_unset: str,
|
||||
quote_mode: str = "always",
|
||||
encoding: Optional[str] = "utf-8",
|
||||
) -> Tuple[Optional[bool], str]:
|
||||
"""
|
||||
Removes a given key from the given `.env` file.
|
||||
|
||||
If the .env path given doesn't exist, fails.
|
||||
If the given key doesn't exist in the .env, fails.
|
||||
"""
|
||||
if not os.path.exists(dotenv_path):
|
||||
logger.warning("Can't delete from %s - it doesn't exist.", dotenv_path)
|
||||
return None, key_to_unset
|
||||
|
||||
removed = False
|
||||
with rewrite(dotenv_path, encoding=encoding) as (source, dest):
|
||||
for mapping in with_warn_for_invalid_lines(parse_stream(source)):
|
||||
if mapping.key == key_to_unset:
|
||||
removed = True
|
||||
else:
|
||||
dest.write(mapping.original.string)
|
||||
|
||||
if not removed:
|
||||
logger.warning("Key %s not removed from %s - key doesn't exist.", key_to_unset, dotenv_path)
|
||||
return None, key_to_unset
|
||||
|
||||
return removed, key_to_unset
|
||||
|
||||
|
||||
def resolve_variables(
|
||||
values: Iterable[Tuple[str, Optional[str]]],
|
||||
override: bool,
|
||||
) -> Mapping[str, Optional[str]]:
|
||||
new_values: Dict[str, Optional[str]] = {}
|
||||
|
||||
for (name, value) in values:
|
||||
if value is None:
|
||||
result = None
|
||||
else:
|
||||
atoms = parse_variables(value)
|
||||
env: Dict[str, Optional[str]] = {}
|
||||
if override:
|
||||
env.update(os.environ) # type: ignore
|
||||
env.update(new_values)
|
||||
else:
|
||||
env.update(new_values)
|
||||
env.update(os.environ) # type: ignore
|
||||
result = "".join(atom.resolve(env) for atom in atoms)
|
||||
|
||||
new_values[name] = result
|
||||
|
||||
return new_values
|
||||
|
||||
|
||||
def _walk_to_root(path: str) -> Iterator[str]:
|
||||
"""
|
||||
Yield directories starting from the given directory up to the root
|
||||
"""
|
||||
if not os.path.exists(path):
|
||||
raise IOError('Starting path not found')
|
||||
|
||||
if os.path.isfile(path):
|
||||
path = os.path.dirname(path)
|
||||
|
||||
last_dir = None
|
||||
current_dir = os.path.abspath(path)
|
||||
while last_dir != current_dir:
|
||||
yield current_dir
|
||||
parent_dir = os.path.abspath(os.path.join(current_dir, os.path.pardir))
|
||||
last_dir, current_dir = current_dir, parent_dir
|
||||
|
||||
|
||||
def find_dotenv(
|
||||
filename: str = '.env',
|
||||
raise_error_if_not_found: bool = False,
|
||||
usecwd: bool = False,
|
||||
) -> str:
|
||||
"""
|
||||
Search in increasingly higher folders for the given file
|
||||
|
||||
Returns path to the file if found, or an empty string otherwise
|
||||
"""
|
||||
|
||||
def _is_interactive():
|
||||
""" Decide whether this is running in a REPL or IPython notebook """
|
||||
try:
|
||||
main = __import__('__main__', None, None, fromlist=['__file__'])
|
||||
except ModuleNotFoundError:
|
||||
return False
|
||||
return not hasattr(main, '__file__')
|
||||
|
||||
if usecwd or _is_interactive() or getattr(sys, 'frozen', False):
|
||||
# Should work without __file__, e.g. in REPL or IPython notebook.
|
||||
path = os.getcwd()
|
||||
else:
|
||||
# will work for .py files
|
||||
frame = sys._getframe()
|
||||
current_file = __file__
|
||||
|
||||
while frame.f_code.co_filename == current_file or not os.path.exists(
|
||||
frame.f_code.co_filename
|
||||
):
|
||||
assert frame.f_back is not None
|
||||
frame = frame.f_back
|
||||
frame_filename = frame.f_code.co_filename
|
||||
path = os.path.dirname(os.path.abspath(frame_filename))
|
||||
|
||||
for dirname in _walk_to_root(path):
|
||||
check_path = os.path.join(dirname, filename)
|
||||
if os.path.isfile(check_path):
|
||||
return check_path
|
||||
|
||||
if raise_error_if_not_found:
|
||||
raise IOError('File not found')
|
||||
|
||||
return ''
|
||||
|
||||
|
||||
def load_dotenv(
|
||||
dotenv_path: Optional[StrPath] = None,
|
||||
stream: Optional[IO[str]] = None,
|
||||
verbose: bool = False,
|
||||
override: bool = False,
|
||||
interpolate: bool = True,
|
||||
encoding: Optional[str] = "utf-8",
|
||||
) -> bool:
|
||||
"""Parse a .env file and then load all the variables found as environment variables.
|
||||
|
||||
Parameters:
|
||||
dotenv_path: Absolute or relative path to .env file.
|
||||
stream: Text stream (such as `io.StringIO`) with .env content, used if
|
||||
`dotenv_path` is `None`.
|
||||
verbose: Whether to output a warning the .env file is missing.
|
||||
override: Whether to override the system environment variables with the variables
|
||||
from the `.env` file.
|
||||
encoding: Encoding to be used to read the file.
|
||||
Returns:
|
||||
Bool: True if at least one environment variable is set else False
|
||||
|
||||
If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the
|
||||
.env file.
|
||||
"""
|
||||
if dotenv_path is None and stream is None:
|
||||
dotenv_path = find_dotenv()
|
||||
|
||||
dotenv = DotEnv(
|
||||
dotenv_path=dotenv_path,
|
||||
stream=stream,
|
||||
verbose=verbose,
|
||||
interpolate=interpolate,
|
||||
override=override,
|
||||
encoding=encoding,
|
||||
)
|
||||
return dotenv.set_as_environment_variables()
|
||||
|
||||
|
||||
def dotenv_values(
|
||||
dotenv_path: Optional[StrPath] = None,
|
||||
stream: Optional[IO[str]] = None,
|
||||
verbose: bool = False,
|
||||
interpolate: bool = True,
|
||||
encoding: Optional[str] = "utf-8",
|
||||
) -> Dict[str, Optional[str]]:
|
||||
"""
|
||||
Parse a .env file and return its content as a dict.
|
||||
|
||||
The returned dict will have `None` values for keys without values in the .env file.
|
||||
For example, `foo=bar` results in `{"foo": "bar"}` whereas `foo` alone results in
|
||||
`{"foo": None}`
|
||||
|
||||
Parameters:
|
||||
dotenv_path: Absolute or relative path to the .env file.
|
||||
stream: `StringIO` object with .env content, used if `dotenv_path` is `None`.
|
||||
verbose: Whether to output a warning if the .env file is missing.
|
||||
encoding: Encoding to be used to read the file.
|
||||
|
||||
If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the
|
||||
.env file.
|
||||
"""
|
||||
if dotenv_path is None and stream is None:
|
||||
dotenv_path = find_dotenv()
|
||||
|
||||
return DotEnv(
|
||||
dotenv_path=dotenv_path,
|
||||
stream=stream,
|
||||
verbose=verbose,
|
||||
interpolate=interpolate,
|
||||
override=True,
|
||||
encoding=encoding,
|
||||
).dict()
|
||||
@@ -0,0 +1,175 @@
|
||||
import codecs
|
||||
import re
|
||||
from typing import (IO, Iterator, Match, NamedTuple, Optional, # noqa:F401
|
||||
Pattern, Sequence, Tuple)
|
||||
|
||||
|
||||
def make_regex(string: str, extra_flags: int = 0) -> Pattern[str]:
|
||||
return re.compile(string, re.UNICODE | extra_flags)
|
||||
|
||||
|
||||
_newline = make_regex(r"(\r\n|\n|\r)")
|
||||
_multiline_whitespace = make_regex(r"\s*", extra_flags=re.MULTILINE)
|
||||
_whitespace = make_regex(r"[^\S\r\n]*")
|
||||
_export = make_regex(r"(?:export[^\S\r\n]+)?")
|
||||
_single_quoted_key = make_regex(r"'([^']+)'")
|
||||
_unquoted_key = make_regex(r"([^=\#\s]+)")
|
||||
_equal_sign = make_regex(r"(=[^\S\r\n]*)")
|
||||
_single_quoted_value = make_regex(r"'((?:\\'|[^'])*)'")
|
||||
_double_quoted_value = make_regex(r'"((?:\\"|[^"])*)"')
|
||||
_unquoted_value = make_regex(r"([^\r\n]*)")
|
||||
_comment = make_regex(r"(?:[^\S\r\n]*#[^\r\n]*)?")
|
||||
_end_of_line = make_regex(r"[^\S\r\n]*(?:\r\n|\n|\r|$)")
|
||||
_rest_of_line = make_regex(r"[^\r\n]*(?:\r|\n|\r\n)?")
|
||||
_double_quote_escapes = make_regex(r"\\[\\'\"abfnrtv]")
|
||||
_single_quote_escapes = make_regex(r"\\[\\']")
|
||||
|
||||
|
||||
class Original(NamedTuple):
|
||||
string: str
|
||||
line: int
|
||||
|
||||
|
||||
class Binding(NamedTuple):
|
||||
key: Optional[str]
|
||||
value: Optional[str]
|
||||
original: Original
|
||||
error: bool
|
||||
|
||||
|
||||
class Position:
|
||||
def __init__(self, chars: int, line: int) -> None:
|
||||
self.chars = chars
|
||||
self.line = line
|
||||
|
||||
@classmethod
|
||||
def start(cls) -> "Position":
|
||||
return cls(chars=0, line=1)
|
||||
|
||||
def set(self, other: "Position") -> None:
|
||||
self.chars = other.chars
|
||||
self.line = other.line
|
||||
|
||||
def advance(self, string: str) -> None:
|
||||
self.chars += len(string)
|
||||
self.line += len(re.findall(_newline, string))
|
||||
|
||||
|
||||
class Error(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class Reader:
|
||||
def __init__(self, stream: IO[str]) -> None:
|
||||
self.string = stream.read()
|
||||
self.position = Position.start()
|
||||
self.mark = Position.start()
|
||||
|
||||
def has_next(self) -> bool:
|
||||
return self.position.chars < len(self.string)
|
||||
|
||||
def set_mark(self) -> None:
|
||||
self.mark.set(self.position)
|
||||
|
||||
def get_marked(self) -> Original:
|
||||
return Original(
|
||||
string=self.string[self.mark.chars:self.position.chars],
|
||||
line=self.mark.line,
|
||||
)
|
||||
|
||||
def peek(self, count: int) -> str:
|
||||
return self.string[self.position.chars:self.position.chars + count]
|
||||
|
||||
def read(self, count: int) -> str:
|
||||
result = self.string[self.position.chars:self.position.chars + count]
|
||||
if len(result) < count:
|
||||
raise Error("read: End of string")
|
||||
self.position.advance(result)
|
||||
return result
|
||||
|
||||
def read_regex(self, regex: Pattern[str]) -> Sequence[str]:
|
||||
match = regex.match(self.string, self.position.chars)
|
||||
if match is None:
|
||||
raise Error("read_regex: Pattern not found")
|
||||
self.position.advance(self.string[match.start():match.end()])
|
||||
return match.groups()
|
||||
|
||||
|
||||
def decode_escapes(regex: Pattern[str], string: str) -> str:
|
||||
def decode_match(match: Match[str]) -> str:
|
||||
return codecs.decode(match.group(0), 'unicode-escape') # type: ignore
|
||||
|
||||
return regex.sub(decode_match, string)
|
||||
|
||||
|
||||
def parse_key(reader: Reader) -> Optional[str]:
|
||||
char = reader.peek(1)
|
||||
if char == "#":
|
||||
return None
|
||||
elif char == "'":
|
||||
(key,) = reader.read_regex(_single_quoted_key)
|
||||
else:
|
||||
(key,) = reader.read_regex(_unquoted_key)
|
||||
return key
|
||||
|
||||
|
||||
def parse_unquoted_value(reader: Reader) -> str:
|
||||
(part,) = reader.read_regex(_unquoted_value)
|
||||
return re.sub(r"\s+#.*", "", part).rstrip()
|
||||
|
||||
|
||||
def parse_value(reader: Reader) -> str:
|
||||
char = reader.peek(1)
|
||||
if char == u"'":
|
||||
(value,) = reader.read_regex(_single_quoted_value)
|
||||
return decode_escapes(_single_quote_escapes, value)
|
||||
elif char == u'"':
|
||||
(value,) = reader.read_regex(_double_quoted_value)
|
||||
return decode_escapes(_double_quote_escapes, value)
|
||||
elif char in (u"", u"\n", u"\r"):
|
||||
return u""
|
||||
else:
|
||||
return parse_unquoted_value(reader)
|
||||
|
||||
|
||||
def parse_binding(reader: Reader) -> Binding:
|
||||
reader.set_mark()
|
||||
try:
|
||||
reader.read_regex(_multiline_whitespace)
|
||||
if not reader.has_next():
|
||||
return Binding(
|
||||
key=None,
|
||||
value=None,
|
||||
original=reader.get_marked(),
|
||||
error=False,
|
||||
)
|
||||
reader.read_regex(_export)
|
||||
key = parse_key(reader)
|
||||
reader.read_regex(_whitespace)
|
||||
if reader.peek(1) == "=":
|
||||
reader.read_regex(_equal_sign)
|
||||
value: Optional[str] = parse_value(reader)
|
||||
else:
|
||||
value = None
|
||||
reader.read_regex(_comment)
|
||||
reader.read_regex(_end_of_line)
|
||||
return Binding(
|
||||
key=key,
|
||||
value=value,
|
||||
original=reader.get_marked(),
|
||||
error=False,
|
||||
)
|
||||
except Error:
|
||||
reader.read_regex(_rest_of_line)
|
||||
return Binding(
|
||||
key=None,
|
||||
value=None,
|
||||
original=reader.get_marked(),
|
||||
error=True,
|
||||
)
|
||||
|
||||
|
||||
def parse_stream(stream: IO[str]) -> Iterator[Binding]:
|
||||
reader = Reader(stream)
|
||||
while reader.has_next():
|
||||
yield parse_binding(reader)
|
||||
@@ -0,0 +1 @@
|
||||
# Marker file for PEP 561
|
||||
@@ -0,0 +1,86 @@
|
||||
import re
|
||||
from abc import ABCMeta, abstractmethod
|
||||
from typing import Iterator, Mapping, Optional, Pattern
|
||||
|
||||
_posix_variable: Pattern[str] = re.compile(
|
||||
r"""
|
||||
\$\{
|
||||
(?P<name>[^\}:]*)
|
||||
(?::-
|
||||
(?P<default>[^\}]*)
|
||||
)?
|
||||
\}
|
||||
""",
|
||||
re.VERBOSE,
|
||||
)
|
||||
|
||||
|
||||
class Atom(metaclass=ABCMeta):
|
||||
def __ne__(self, other: object) -> bool:
|
||||
result = self.__eq__(other)
|
||||
if result is NotImplemented:
|
||||
return NotImplemented
|
||||
return not result
|
||||
|
||||
@abstractmethod
|
||||
def resolve(self, env: Mapping[str, Optional[str]]) -> str: ...
|
||||
|
||||
|
||||
class Literal(Atom):
|
||||
def __init__(self, value: str) -> None:
|
||||
self.value = value
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return f"Literal(value={self.value})"
|
||||
|
||||
def __eq__(self, other: object) -> bool:
|
||||
if not isinstance(other, self.__class__):
|
||||
return NotImplemented
|
||||
return self.value == other.value
|
||||
|
||||
def __hash__(self) -> int:
|
||||
return hash((self.__class__, self.value))
|
||||
|
||||
def resolve(self, env: Mapping[str, Optional[str]]) -> str:
|
||||
return self.value
|
||||
|
||||
|
||||
class Variable(Atom):
|
||||
def __init__(self, name: str, default: Optional[str]) -> None:
|
||||
self.name = name
|
||||
self.default = default
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return f"Variable(name={self.name}, default={self.default})"
|
||||
|
||||
def __eq__(self, other: object) -> bool:
|
||||
if not isinstance(other, self.__class__):
|
||||
return NotImplemented
|
||||
return (self.name, self.default) == (other.name, other.default)
|
||||
|
||||
def __hash__(self) -> int:
|
||||
return hash((self.__class__, self.name, self.default))
|
||||
|
||||
def resolve(self, env: Mapping[str, Optional[str]]) -> str:
|
||||
default = self.default if self.default is not None else ""
|
||||
result = env.get(self.name, default)
|
||||
return result if result is not None else ""
|
||||
|
||||
|
||||
def parse_variables(value: str) -> Iterator[Atom]:
|
||||
cursor = 0
|
||||
|
||||
for match in _posix_variable.finditer(value):
|
||||
(start, end) = match.span()
|
||||
name = match["name"]
|
||||
default = match["default"]
|
||||
|
||||
if start > cursor:
|
||||
yield Literal(value=value[cursor:start])
|
||||
|
||||
yield Variable(name=name, default=default)
|
||||
cursor = end
|
||||
|
||||
length = len(value)
|
||||
if cursor < length:
|
||||
yield Literal(value=value[cursor:length])
|
||||
@@ -0,0 +1 @@
|
||||
__version__ = "1.0.1"
|
||||
@@ -1,992 +0,0 @@
|
||||
../../Scripts/pip.exe,sha256=wVTlSM1CoHzfPpDxEAOsp6Jjwv-I_iqzOCFudVcKfJI,107893
|
||||
../../Scripts/pip3.10.exe,sha256=AZt5rsH4BlFFFrekn19LvZKeuvhlzaPjf3hwlvXq6RQ,107893
|
||||
../../Scripts/pip3.exe,sha256=AZt5rsH4BlFFFrekn19LvZKeuvhlzaPjf3hwlvXq6RQ,107893
|
||||
pip-22.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
pip-22.2.1.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
|
||||
pip-22.2.1.dist-info/METADATA,sha256=shj9XW4KG9MEp43PNu0VqMaNr0dbIBnk0SALqyhNu6Q,4197
|
||||
pip-22.2.1.dist-info/RECORD,,
|
||||
pip-22.2.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip-22.2.1.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
|
||||
pip-22.2.1.dist-info/entry_points.txt,sha256=_ZUyZpzz1RdotcszCitH_lQ6yiWAKmaOcIkCEmkrePU,124
|
||||
pip-22.2.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
pip/__init__.py,sha256=TnK0qWewypiwM5sIDNYfy404XnpGnbemXiEH9cyPTWg,357
|
||||
pip/__main__.py,sha256=mXwWDftNLMKfwVqKFWGE_uuBZvGSIiUELhLkeysIuZc,1198
|
||||
pip/__pip-runner__.py,sha256=9cY5wjw19ypL7f1StHYjB9Ud2WqQvEcynma3hOoeIRU,1085
|
||||
pip/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/__pycache__/__main__.cpython-310.pyc,,
|
||||
pip/__pycache__/__pip-runner__.cpython-310.pyc,,
|
||||
pip/_internal/__init__.py,sha256=nnFCuxrPMgALrIDxSoy-H6Zj4W4UY60D-uL1aJyq0pc,573
|
||||
pip/_internal/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/__pycache__/build_env.cpython-310.pyc,,
|
||||
pip/_internal/__pycache__/cache.cpython-310.pyc,,
|
||||
pip/_internal/__pycache__/configuration.cpython-310.pyc,,
|
||||
pip/_internal/__pycache__/exceptions.cpython-310.pyc,,
|
||||
pip/_internal/__pycache__/main.cpython-310.pyc,,
|
||||
pip/_internal/__pycache__/pyproject.cpython-310.pyc,,
|
||||
pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc,,
|
||||
pip/_internal/__pycache__/wheel_builder.cpython-310.pyc,,
|
||||
pip/_internal/build_env.py,sha256=Io06wf8aNlP1FkDYCbbuVFPGWAMJNys7l_p7r9CmEKE,9535
|
||||
pip/_internal/cache.py,sha256=-FXxS81WOM-amtx3w7N8s20PfFIlHPX8X27FfOBql-I,10623
|
||||
pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132
|
||||
pip/_internal/cli/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/autocompletion.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/base_command.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/cmdoptions.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/command_context.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/main.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/main_parser.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/parser.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/progress_bars.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/req_command.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/spinners.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/status_codes.cpython-310.pyc,,
|
||||
pip/_internal/cli/autocompletion.py,sha256=wY2JPZY2Eji1vhR7bVo-yCBPJ9LCy6P80iOAhZD1Vi8,6676
|
||||
pip/_internal/cli/base_command.py,sha256=EiHzq1RBubmgYkhsVgJLNc4Y18koPUS1TzMVJwpnYxc,8146
|
||||
pip/_internal/cli/cmdoptions.py,sha256=LKKpinHThNt7wtHqxwkWJpgCUcyQeTX0GUCqyXImAbc,29985
|
||||
pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774
|
||||
pip/_internal/cli/main.py,sha256=ioJ8IVlb2K1qLOxR-tXkee9lURhYV89CDM71MKag7YY,2472
|
||||
pip/_internal/cli/main_parser.py,sha256=Q9TnytfuC5Z2JSjBFWVGtEdYLFy7rukNIb04movHdAo,2614
|
||||
pip/_internal/cli/parser.py,sha256=tWP-K1uSxnJyXu3WE0kkH3niAYRBeuUaxeydhzOdhL4,10817
|
||||
pip/_internal/cli/progress_bars.py,sha256=So4mPoSjXkXiSHiTzzquH3VVyVD_njXlHJSExYPXAow,1968
|
||||
pip/_internal/cli/req_command.py,sha256=ypTutLv4j_efxC2f6C6aCQufxre-zaJdi5m_tWlLeBk,18172
|
||||
pip/_internal/cli/spinners.py,sha256=rs_NveD0wCoJ9GiJJmOjGC1UPVK8isOQpQsFVE899zQ,5098
|
||||
pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116
|
||||
pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882
|
||||
pip/_internal/commands/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/cache.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/check.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/completion.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/configuration.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/debug.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/download.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/freeze.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/hash.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/help.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/index.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/inspect.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/install.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/list.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/search.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/show.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/uninstall.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/wheel.cpython-310.pyc,,
|
||||
pip/_internal/commands/cache.py,sha256=muaT0mbL-ZUpn6AaushVAipzTiMwE4nV2BLbJBwt_KQ,7582
|
||||
pip/_internal/commands/check.py,sha256=0gjXR7j36xJT5cs2heYU_dfOfpnFfzX8OoPNNoKhqdM,1685
|
||||
pip/_internal/commands/completion.py,sha256=H0TJvGrdsoleuIyQKzJbicLFppYx2OZA0BLNpQDeFjI,4129
|
||||
pip/_internal/commands/configuration.py,sha256=ZJRO2YMzI5vPA2ADTWZrSsvGd4q880CylCUzEUJziZY,9500
|
||||
pip/_internal/commands/debug.py,sha256=kVjn-O1ixLk0webD0w9vfFFq_GCTUTd2hmLOnYtDCig,6573
|
||||
pip/_internal/commands/download.py,sha256=vLtEY3QqIAddjAOGvJJsbaHJg7Har5TPa4UuOOL6Gn8,5058
|
||||
pip/_internal/commands/freeze.py,sha256=gCjoD6foBZPBAAYx5t8zZLkJhsF_ZRtnb3dPuD7beO8,2951
|
||||
pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703
|
||||
pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132
|
||||
pip/_internal/commands/index.py,sha256=1VVXXj5MsI2qH-N7uniQQyVkg-KCn_RdjiyiUmkUS5U,4762
|
||||
pip/_internal/commands/inspect.py,sha256=mRJ9aIkBQN0IJ7Um8pzaxAzVPIgL8KfWHx1fWKJgUAQ,3374
|
||||
pip/_internal/commands/install.py,sha256=nyZCUv7Oi8rScPe4WENgQ8Vd5n3OHzBuj2tw6khg4Ss,30315
|
||||
pip/_internal/commands/list.py,sha256=wF2g5i4j_JyoRckO9FAeB7KhcFAnLboy0dL-G9fn7Eo,12148
|
||||
pip/_internal/commands/search.py,sha256=sbBZiARRc050QquOKcCvOr2K3XLsoYebLKZGRi__iUI,5697
|
||||
pip/_internal/commands/show.py,sha256=CJI8q4SSY0X346K1hi4Th8Nbyhl4nxPTBJUuzOlTaYE,6129
|
||||
pip/_internal/commands/uninstall.py,sha256=0JQhifYxecNrJAwoILFwjm9V1V3liXzNT-y4bgRXXPw,3680
|
||||
pip/_internal/commands/wheel.py,sha256=dar33wNjUyTN6Cy8PVxV5TerJS1u7pZmKoqgoYiQh7g,6307
|
||||
pip/_internal/configuration.py,sha256=uBKTus43pDIO6IzT2mLWQeROmHhtnoabhniKNjPYvD0,13529
|
||||
pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858
|
||||
pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/distributions/__pycache__/base.cpython-310.pyc,,
|
||||
pip/_internal/distributions/__pycache__/installed.cpython-310.pyc,,
|
||||
pip/_internal/distributions/__pycache__/sdist.cpython-310.pyc,,
|
||||
pip/_internal/distributions/__pycache__/wheel.cpython-310.pyc,,
|
||||
pip/_internal/distributions/base.py,sha256=jrF1Vi7eGyqFqMHrieh1PIOrGU7KeCxhYPZnbvtmvGY,1221
|
||||
pip/_internal/distributions/installed.py,sha256=NI2OgsgH9iBq9l5vB-56vOg5YsybOy-AU4VE5CSCO2I,729
|
||||
pip/_internal/distributions/sdist.py,sha256=SQBdkatXSigKGG_SaD0U0p1Jwdfrg26UCNcHgkXZfdA,6494
|
||||
pip/_internal/distributions/wheel.py,sha256=m-J4XO-gvFerlYsFzzSXYDvrx8tLZlJFTCgDxctn8ig,1164
|
||||
pip/_internal/exceptions.py,sha256=U-dV1ixkSz6NAU6Aw9dosKi2EzZ5D3BA7ilYZuTLKeU,20912
|
||||
pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30
|
||||
pip/_internal/index/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/index/__pycache__/collector.cpython-310.pyc,,
|
||||
pip/_internal/index/__pycache__/package_finder.cpython-310.pyc,,
|
||||
pip/_internal/index/__pycache__/sources.cpython-310.pyc,,
|
||||
pip/_internal/index/collector.py,sha256=UCB2bYQIbIV4IIcTWK7cfy8iYpdOIcDiNLGFDcL6c-A,20301
|
||||
pip/_internal/index/package_finder.py,sha256=kmcMu5_i-BP6v3NQGY0_am1ezxM2Gk4t00arZMmm4sc,37596
|
||||
pip/_internal/index/sources.py,sha256=SVyPitv08-Qalh2_Bk5diAJ9GAA_d-a93koouQodAG0,6557
|
||||
pip/_internal/locations/__init__.py,sha256=pxbyuIew0-ZMHs-aGfUgrNlYXdHTqvEJj_mM3UWiH1U,17461
|
||||
pip/_internal/locations/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/locations/__pycache__/_distutils.cpython-310.pyc,,
|
||||
pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc,,
|
||||
pip/_internal/locations/__pycache__/base.cpython-310.pyc,,
|
||||
pip/_internal/locations/_distutils.py,sha256=6aYLJT475os90AQJ0w6YtgJcYN86aa60Ld27q8rkRK8,6254
|
||||
pip/_internal/locations/_sysconfig.py,sha256=nM-DiVHXWTxippdmN0MGVl5r7OIfIMy3vgDMlo8c_oo,7867
|
||||
pip/_internal/locations/base.py,sha256=ufyDqPwZ4jLbScD44u8AwTVI-3ft8O78UGrroQI5f68,2573
|
||||
pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340
|
||||
pip/_internal/metadata/__init__.py,sha256=IeqRXbTeSreqClORmjA_4CMjkWA-trWdss7Oyimwosw,3535
|
||||
pip/_internal/metadata/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/metadata/__pycache__/_json.cpython-310.pyc,,
|
||||
pip/_internal/metadata/__pycache__/base.cpython-310.pyc,,
|
||||
pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc,,
|
||||
pip/_internal/metadata/_json.py,sha256=BTkWfFDrWFwuSodImjtbAh8wCL3isecbnjTb5E6UUDI,2595
|
||||
pip/_internal/metadata/base.py,sha256=gOjhT0Mk4f6hCa8hzZIQKynIwpHzydnm6krwGTHTVhI,24596
|
||||
pip/_internal/metadata/importlib/__init__.py,sha256=9ZVO8BoE7NEZPmoHp5Ap_NJo0HgNIezXXg-TFTtt3Z4,107
|
||||
pip/_internal/metadata/importlib/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/metadata/importlib/__pycache__/_compat.cpython-310.pyc,,
|
||||
pip/_internal/metadata/importlib/__pycache__/_dists.cpython-310.pyc,,
|
||||
pip/_internal/metadata/importlib/__pycache__/_envs.cpython-310.pyc,,
|
||||
pip/_internal/metadata/importlib/_compat.py,sha256=B_qZlMBcbf2VrjHw4Pz9gfk-c-W1Mzp2u_GAzoWWuLE,1493
|
||||
pip/_internal/metadata/importlib/_dists.py,sha256=iEu6KvMdFIfq3ujQvsS0fvI9jDbp1qFC9SmOySfn_fY,7456
|
||||
pip/_internal/metadata/importlib/_envs.py,sha256=-4O0PiYmxydf0e6upJ7X-_BR4DB46I_szlgx53hnJLs,7195
|
||||
pip/_internal/metadata/pkg_resources.py,sha256=RfU--nYrkHAYJXfpoviyBHJA5b9Mw3Dc5HpeYwki1gE,9289
|
||||
pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63
|
||||
pip/_internal/models/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/candidate.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/direct_url.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/format_control.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/index.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/installation_report.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/link.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/scheme.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/search_scope.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/selection_prefs.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/target_python.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/wheel.cpython-310.pyc,,
|
||||
pip/_internal/models/candidate.py,sha256=6pcABsaR7CfIHlbJbr2_kMkVJFL_yrYjTx6SVWUnCPQ,990
|
||||
pip/_internal/models/direct_url.py,sha256=HLO0sL2aYB6n45bwmd72TDN05sLHJlOQI8M01l2SH3I,5877
|
||||
pip/_internal/models/format_control.py,sha256=DJpMYjxeYKKQdwNcML2_F0vtAh-qnKTYe-CpTxQe-4g,2520
|
||||
pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030
|
||||
pip/_internal/models/installation_report.py,sha256=ad1arqtxrSFBvWnm6mRqmG12HLV3pZZcZcHrlTFIiqU,2617
|
||||
pip/_internal/models/link.py,sha256=_5okBLOR7vshRltnD11SC3cyD0aSxOa0lMpKWIwQ5UY,10490
|
||||
pip/_internal/models/scheme.py,sha256=3EFQp_ICu_shH1-TBqhl0QAusKCPDFOlgHFeN4XowWs,738
|
||||
pip/_internal/models/search_scope.py,sha256=LwloG0PJAmtI1hFXIypsD95kWE9xfR5hf_a2v1Vw7sk,4520
|
||||
pip/_internal/models/selection_prefs.py,sha256=KZdi66gsR-_RUXUr9uejssk3rmTHrQVJWeNA2sV-VSY,1907
|
||||
pip/_internal/models/target_python.py,sha256=qKpZox7J8NAaPmDs5C_aniwfPDxzvpkrCKqfwndG87k,3858
|
||||
pip/_internal/models/wheel.py,sha256=X_fakLR3OGF7HhrhwVXCUN-1wBwVCT2Lz0o3NguT_GQ,3575
|
||||
pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50
|
||||
pip/_internal/network/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/network/__pycache__/auth.cpython-310.pyc,,
|
||||
pip/_internal/network/__pycache__/cache.cpython-310.pyc,,
|
||||
pip/_internal/network/__pycache__/download.cpython-310.pyc,,
|
||||
pip/_internal/network/__pycache__/lazy_wheel.cpython-310.pyc,,
|
||||
pip/_internal/network/__pycache__/session.cpython-310.pyc,,
|
||||
pip/_internal/network/__pycache__/utils.cpython-310.pyc,,
|
||||
pip/_internal/network/__pycache__/xmlrpc.cpython-310.pyc,,
|
||||
pip/_internal/network/auth.py,sha256=a3C7Xaa8kTJjXkdi_wrUjqaySc8Z9Yz7U6QIbXfzMyc,12190
|
||||
pip/_internal/network/cache.py,sha256=hgXftU-eau4MWxHSLquTMzepYq5BPC2zhCkhN3glBy8,2145
|
||||
pip/_internal/network/download.py,sha256=HvDDq9bVqaN3jcS3DyVJHP7uTqFzbShdkf7NFSoHfkw,6096
|
||||
pip/_internal/network/lazy_wheel.py,sha256=7YsbcpwOLyXbwCbR484ikhG9-C1FbUVABekVSBS0zHc,7637
|
||||
pip/_internal/network/session.py,sha256=BpDOJ7_Xw5VkgPYWsePzcaqOfcyRZcB2AW7W0HGBST0,18443
|
||||
pip/_internal/network/utils.py,sha256=6A5SrUJEEUHxbGtbscwU2NpCyz-3ztiDlGWHpRRhsJ8,4073
|
||||
pip/_internal/network/xmlrpc.py,sha256=AzQgG4GgS152_cqmGr_Oz2MIXsCal-xfsis7fA7nmU0,1791
|
||||
pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_internal/operations/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/operations/__pycache__/check.cpython-310.pyc,,
|
||||
pip/_internal/operations/__pycache__/freeze.cpython-310.pyc,,
|
||||
pip/_internal/operations/__pycache__/prepare.cpython-310.pyc,,
|
||||
pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_internal/operations/build/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/operations/build/__pycache__/build_tracker.cpython-310.pyc,,
|
||||
pip/_internal/operations/build/__pycache__/metadata.cpython-310.pyc,,
|
||||
pip/_internal/operations/build/__pycache__/metadata_editable.cpython-310.pyc,,
|
||||
pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-310.pyc,,
|
||||
pip/_internal/operations/build/__pycache__/wheel.cpython-310.pyc,,
|
||||
pip/_internal/operations/build/__pycache__/wheel_editable.cpython-310.pyc,,
|
||||
pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-310.pyc,,
|
||||
pip/_internal/operations/build/build_tracker.py,sha256=vf81EwomN3xe9G8qRJED0VGqNikmRQRQoobNsxi5Xrs,4133
|
||||
pip/_internal/operations/build/metadata.py,sha256=ES_uRmAvhrNm_nDTpZxshBfUsvnXtkj-g_4rZrH9Rww,1404
|
||||
pip/_internal/operations/build/metadata_editable.py,sha256=_Rai0VZjxoeJUkjkuICrq45LtjwFoDOveosMYH43rKc,1456
|
||||
pip/_internal/operations/build/metadata_legacy.py,sha256=o-eU21As175hDC7dluM1fJJ_FqokTIShyWpjKaIpHZw,2198
|
||||
pip/_internal/operations/build/wheel.py,sha256=AO9XnTGhTgHtZmU8Dkbfo1OGr41rBuSDjIgAa4zUKgE,1063
|
||||
pip/_internal/operations/build/wheel_editable.py,sha256=TVETY-L_M_dSEKBhTIcQOP75zKVXw8tuq1U354Mm30A,1405
|
||||
pip/_internal/operations/build/wheel_legacy.py,sha256=C9j6rukgQI1n_JeQLoZGuDdfUwzCXShyIdPTp6edbMQ,3064
|
||||
pip/_internal/operations/check.py,sha256=ca4O9CkPt9Em9sLCf3H0iVt1GIcW7M8C0U5XooaBuT4,5109
|
||||
pip/_internal/operations/freeze.py,sha256=mwTZ2uML8aQgo3k8MR79a7SZmmmvdAJqdyaknKbavmg,9784
|
||||
pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51
|
||||
pip/_internal/operations/install/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/operations/install/__pycache__/editable_legacy.cpython-310.pyc,,
|
||||
pip/_internal/operations/install/__pycache__/legacy.cpython-310.pyc,,
|
||||
pip/_internal/operations/install/__pycache__/wheel.cpython-310.pyc,,
|
||||
pip/_internal/operations/install/editable_legacy.py,sha256=ee4kfJHNuzTdKItbfAsNOSEwq_vD7DRPGkBdK48yBhU,1354
|
||||
pip/_internal/operations/install/legacy.py,sha256=cHdcHebyzf8w7OaOLwcsTNSMSSV8WBoAPFLay_9CjE8,4105
|
||||
pip/_internal/operations/install/wheel.py,sha256=ZbmrarCh74tariXY8rgI56jbZ1BJ2Z6u5fZt4nt3Gmw,27379
|
||||
pip/_internal/operations/prepare.py,sha256=kvL-s1ZUs53g1JIzmJ62j8FwCO_fKWXN45pAtVuz0xE,22962
|
||||
pip/_internal/pyproject.py,sha256=ob0Gb0l12YLZNxjdpZGRfWHgjqhZTnSVv96RuJyNOfs,7074
|
||||
pip/_internal/req/__init__.py,sha256=rUQ9d_Sh3E5kNYqX9pkN0D06YL-LrtcbJQ-LiIonq08,2807
|
||||
pip/_internal/req/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/req/__pycache__/constructors.cpython-310.pyc,,
|
||||
pip/_internal/req/__pycache__/req_file.cpython-310.pyc,,
|
||||
pip/_internal/req/__pycache__/req_install.cpython-310.pyc,,
|
||||
pip/_internal/req/__pycache__/req_set.cpython-310.pyc,,
|
||||
pip/_internal/req/__pycache__/req_uninstall.cpython-310.pyc,,
|
||||
pip/_internal/req/constructors.py,sha256=ypjtq1mOQ3d2mFkFPMf_6Mr8SLKeHQk3tUKHA1ddG0U,16611
|
||||
pip/_internal/req/req_file.py,sha256=Qgqx7qLfDO3ai72oO2U1u928_6Idajun5VFRWPZg3XM,17502
|
||||
pip/_internal/req/req_install.py,sha256=bOtpOZnDgmEst_QuWZRXViaPW1JJ1iAvO6vVFgFf0PI,33506
|
||||
pip/_internal/req/req_set.py,sha256=j3esG0s6SzoVReX9rWn4rpYNtyET_fwxbwJPRimvRxo,2858
|
||||
pip/_internal/req/req_uninstall.py,sha256=ZFQfgSNz6H1BMsgl87nQNr2iaQCcbFcmXpW8rKVQcic,24045
|
||||
pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_internal/resolution/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/resolution/__pycache__/base.cpython-310.pyc,,
|
||||
pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583
|
||||
pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_internal/resolution/legacy/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/resolution/legacy/__pycache__/resolver.cpython-310.pyc,,
|
||||
pip/_internal/resolution/legacy/resolver.py,sha256=9em8D5TcSsEN4xZM1WreaRShOnyM4LlvhMSHpUPsocE,24129
|
||||
pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/resolution/resolvelib/__pycache__/base.cpython-310.pyc,,
|
||||
pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-310.pyc,,
|
||||
pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-310.pyc,,
|
||||
pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-310.pyc,,
|
||||
pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-310.pyc,,
|
||||
pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-310.pyc,,
|
||||
pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-310.pyc,,
|
||||
pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-310.pyc,,
|
||||
pip/_internal/resolution/resolvelib/base.py,sha256=u1O4fkvCO4mhmu5i32xrDv9AX5NgUci_eYVyBDQhTIM,5220
|
||||
pip/_internal/resolution/resolvelib/candidates.py,sha256=6kQZeMzwibnL4lO6bW0hUQQjNEvXfADdFphRRkRvOtc,18963
|
||||
pip/_internal/resolution/resolvelib/factory.py,sha256=OnjkLIgyk5Tol7uOOqapA1D4qiRHWmPU18DF1yN5N8o,27878
|
||||
pip/_internal/resolution/resolvelib/found_candidates.py,sha256=hvL3Hoa9VaYo-qEOZkBi2Iqw251UDxPz-uMHVaWmLpE,5705
|
||||
pip/_internal/resolution/resolvelib/provider.py,sha256=Vd4jW_NnyifB-HMkPYtZIO70M3_RM0MbL5YV6XyBM-w,9914
|
||||
pip/_internal/resolution/resolvelib/reporter.py,sha256=3ZVVYrs5PqvLFJkGLcuXoMK5mTInFzl31xjUpDBpZZk,2526
|
||||
pip/_internal/resolution/resolvelib/requirements.py,sha256=B1ndvKPSuyyyTEXt9sKhbwminViSWnBrJa7qO2ln4Z0,5455
|
||||
pip/_internal/resolution/resolvelib/resolver.py,sha256=nYZ9bTFXj5c1ILKnkSgU7tUCTYyo5V5J-J0sKoA7Wzg,11533
|
||||
pip/_internal/self_outdated_check.py,sha256=R3MmjCyUt_lkUNMc6p3xVSx7vX28XiDh3VDs5OrYn6Q,8020
|
||||
pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_internal/utils/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/_log.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/appdirs.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/compat.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/compatibility_tags.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/datetime.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/deprecation.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/direct_url_helpers.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/distutils_args.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/egg_link.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/encoding.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/entrypoints.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/filesystem.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/filetypes.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/glibc.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/hashes.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/inject_securetransport.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/logging.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/misc.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/models.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/packaging.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/setuptools_build.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/subprocess.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/temp_dir.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/unpacking.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/urls.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/virtualenv.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/wheel.cpython-310.pyc,,
|
||||
pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015
|
||||
pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklAo,1665
|
||||
pip/_internal/utils/compat.py,sha256=ACyBfLgj3_XG-iA5omEDrXqDM0cQKzi8h8HRBInzG6Q,1884
|
||||
pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1T0xxS97VhHkk,5377
|
||||
pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242
|
||||
pip/_internal/utils/deprecation.py,sha256=Ozzqnnl9kI0oQW6e2Pm3c-v0IZPy6gGERviDG45TmbY,3638
|
||||
pip/_internal/utils/direct_url_helpers.py,sha256=6F1tc2rcKaCZmgfVwsE6ObIe_Pux23mUVYA-2D9wCFc,3206
|
||||
pip/_internal/utils/distutils_args.py,sha256=bYUt4wfFJRaeGO4VHia6FNaA8HlYXMcKuEq1zYijY5g,1115
|
||||
pip/_internal/utils/egg_link.py,sha256=5MVlpz5LirT4iLQq86OYzjXaYF0D4Qk1dprEI7ThST4,2203
|
||||
pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169
|
||||
pip/_internal/utils/entrypoints.py,sha256=GgeG2FUbbYhQ0sYgG2AtM-a4d1P8MJYdmEl5IhQ-WeM,2900
|
||||
pip/_internal/utils/filesystem.py,sha256=RhMIXUaNVMGjc3rhsDahWQ4MavvEQDdqXqgq-F6fpw8,5122
|
||||
pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716
|
||||
pip/_internal/utils/glibc.py,sha256=tDfwVYnJCOC0BNVpItpy8CGLP9BjkxFHdl0mTS0J7fc,3110
|
||||
pip/_internal/utils/hashes.py,sha256=EPVx_I0UI8Gvu_skgLwpJA90pHZ5Ev1qNaZagYOub7I,4811
|
||||
pip/_internal/utils/inject_securetransport.py,sha256=o-QRVMGiENrTJxw3fAhA7uxpdEdw6M41TjHYtSVRrcg,795
|
||||
pip/_internal/utils/logging.py,sha256=U2q0i1n8hPS2gQh8qcocAg5dovGAa_bR24akmXMzrk4,11632
|
||||
pip/_internal/utils/misc.py,sha256=49Rs2NgrD4JGTKFt0farCm7FIAi-rjyoxgioArhCW_0,21617
|
||||
pip/_internal/utils/models.py,sha256=5GoYU586SrxURMvDn_jBMJInitviJg4O5-iOU-6I0WY,1193
|
||||
pip/_internal/utils/packaging.py,sha256=5Wm6_x7lKrlqVjPI5MBN_RurcRHwVYoQ7Ksrs84de7s,2108
|
||||
pip/_internal/utils/setuptools_build.py,sha256=vNH9hQB9wT6d-h1hVQhBKw91jNeT42meHpVeii-urOI,5652
|
||||
pip/_internal/utils/subprocess.py,sha256=MYySbvY7qBevRxq_RFfOsDqG4vMqrB4vDoL_eyPE6Bo,9197
|
||||
pip/_internal/utils/temp_dir.py,sha256=aCX489gRa4Nu0dMKRFyGhV6maJr60uEynu5uCbKR4Qg,7702
|
||||
pip/_internal/utils/unpacking.py,sha256=SBb2iV1crb89MDRTEKY86R4A_UOWApTQn9VQVcMDOlE,8821
|
||||
pip/_internal/utils/urls.py,sha256=AhaesUGl-9it6uvG6fsFPOr9ynFpGaTMk4t5XTX7Z_Q,1759
|
||||
pip/_internal/utils/virtualenv.py,sha256=4_48qMzCwB_F5jIK5BC_ua7uiAMVifmQWU9NdaGUoVA,3459
|
||||
pip/_internal/utils/wheel.py,sha256=lXOgZyTlOm5HmK8tw5iw0A3_5A6wRzsXHOaQkIvvloU,4549
|
||||
pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596
|
||||
pip/_internal/vcs/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/vcs/__pycache__/bazaar.cpython-310.pyc,,
|
||||
pip/_internal/vcs/__pycache__/git.cpython-310.pyc,,
|
||||
pip/_internal/vcs/__pycache__/mercurial.cpython-310.pyc,,
|
||||
pip/_internal/vcs/__pycache__/subversion.cpython-310.pyc,,
|
||||
pip/_internal/vcs/__pycache__/versioncontrol.cpython-310.pyc,,
|
||||
pip/_internal/vcs/bazaar.py,sha256=IGb5ca1xSZfgegRD2_JeyoZPrQQHs7lEYEIgpVsKpoU,3047
|
||||
pip/_internal/vcs/git.py,sha256=mjhwudCx9WlLNkxZ6_kOKmueF0rLoU2i1xeASKF6yiQ,18116
|
||||
pip/_internal/vcs/mercurial.py,sha256=Bzbd518Jsx-EJI0IhIobiQqiRsUv5TWYnrmRIFWE0Gw,5238
|
||||
pip/_internal/vcs/subversion.py,sha256=TEMRdwECvMcXakZX0pTNUep79kmBYkWDkWFkrYmcmac,11718
|
||||
pip/_internal/vcs/versioncontrol.py,sha256=KUOc-hN51em9jrqxKwUR3JnkgSE-xSOqMiiJcSaL6B8,22811
|
||||
pip/_internal/wheel_builder.py,sha256=S-_i83q75xGqKjBenUl4uaTkLyXcZf7jFgChcCNi0xc,12712
|
||||
pip/_vendor/__init__.py,sha256=fNxOSVD0auElsD8fN9tuq5psfgMQ-RFBtD4X5gjlRkg,4966
|
||||
pip/_vendor/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/__pycache__/six.cpython-310.pyc,,
|
||||
pip/_vendor/__pycache__/typing_extensions.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/__init__.py,sha256=hrxlv3q7upsfyMw8k3gQ9vagBax1pYHSGGqYlZ0Zk0M,465
|
||||
pip/_vendor/cachecontrol/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/__pycache__/adapter.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/__pycache__/cache.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/__pycache__/compat.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/__pycache__/controller.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/__pycache__/serialize.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/_cmd.py,sha256=lxUXqfNTVx84zf6tcWbkLZHA6WVBRtJRpfeA9ZqhaAY,1379
|
||||
pip/_vendor/cachecontrol/adapter.py,sha256=ew9OYEQHEOjvGl06ZsuX8W3DAvHWsQKHwWAxISyGug8,5033
|
||||
pip/_vendor/cachecontrol/cache.py,sha256=Tty45fOjH40fColTGkqKQvQQmbYsMpk-nCyfLcv2vG4,1535
|
||||
pip/_vendor/cachecontrol/caches/__init__.py,sha256=h-1cUmOz6mhLsjTjOrJ8iPejpGdLCyG4lzTftfGZvLg,242
|
||||
pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/caches/file_cache.py,sha256=GpexcE29LoY4MaZwPUTcUBZaDdcsjqyLxZFznk8Hbr4,5271
|
||||
pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=mp-QWonP40I3xJGK3XVO-Gs9a3UjzlqqEmp9iLJH9F4,1033
|
||||
pip/_vendor/cachecontrol/compat.py,sha256=LNx7vqBndYdHU8YuJt53ab_8rzMGTXVrvMb7CZJkxG0,778
|
||||
pip/_vendor/cachecontrol/controller.py,sha256=bAYrt7x_VH4toNpI066LQxbHpYGpY1MxxmZAhspplvw,16416
|
||||
pip/_vendor/cachecontrol/filewrapper.py,sha256=X4BAQOO26GNOR7nH_fhTzAfeuct2rBQcx_15MyFBpcs,3946
|
||||
pip/_vendor/cachecontrol/heuristics.py,sha256=8kAyuZLSCyEIgQr6vbUwfhpqg9ows4mM0IV6DWazevI,4154
|
||||
pip/_vendor/cachecontrol/serialize.py,sha256=_U1NU_C-SDgFzkbAxAsPDgMTHeTWZZaHCQnZN_jh0U8,7105
|
||||
pip/_vendor/cachecontrol/wrapper.py,sha256=X3-KMZ20Ho3VtqyVaXclpeQpFzokR5NE8tZSfvKVaB8,774
|
||||
pip/_vendor/certifi/__init__.py,sha256=SuZ3iYmzdRyUv-PiaZkquUgXtWZ16ICUKgymlEBspx0,94
|
||||
pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255
|
||||
pip/_vendor/certifi/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/certifi/__pycache__/__main__.cpython-310.pyc,,
|
||||
pip/_vendor/certifi/__pycache__/core.cpython-310.pyc,,
|
||||
pip/_vendor/certifi/cacert.pem,sha256=pZ_eiDoO-ddKudrQCWieABc9KFlbV0FsmLLugygMbkw,285222
|
||||
pip/_vendor/certifi/core.py,sha256=g6EYcIFUAhYv5CB9B94iKRgMfGj8f82MF0CRdTDovxM,3052
|
||||
pip/_vendor/chardet/__init__.py,sha256=9-r0i294avRciob2HKVcKf6GJmXPHpgMqIijVrqHBDU,3705
|
||||
pip/_vendor/chardet/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/big5freq.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/big5prober.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/chardistribution.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/charsetprober.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/cp949prober.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/enums.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/escprober.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/escsm.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/eucjpprober.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/euckrfreq.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/euckrprober.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/euctwfreq.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/euctwprober.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/gb2312freq.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/gb2312prober.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/hebrewprober.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/jisfreq.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/johabfreq.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/johabprober.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/jpcntx.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/langthaimodel.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/latin1prober.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/mbcssm.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/sjisprober.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/universaldetector.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/utf1632prober.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/utf8prober.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/__pycache__/version.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/big5freq.py,sha256=ltcfP-3PjlNHCoo5e4a7C4z-2DhBTXRfY6jbMbB7P30,31274
|
||||
pip/_vendor/chardet/big5prober.py,sha256=neUXIlq35507yibstiznZWFzyNcMn6EXrqJaUJVPWKg,1741
|
||||
pip/_vendor/chardet/chardistribution.py,sha256=M9NTKdM72KieFKy4TT5eml4PP0WaVcXuY5PpWSFD0FA,9608
|
||||
pip/_vendor/chardet/charsetgroupprober.py,sha256=CaIBAmNitEsYuSgMvgAsMREN4cLxMj5OYwMhVo6MAxk,3817
|
||||
pip/_vendor/chardet/charsetprober.py,sha256=Eo3w8sCmbvnVKOGNW1iy50KATVs8xV-gF7cQ0VG85dQ,4801
|
||||
pip/_vendor/chardet/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/chardet/cli/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/cli/chardetect.py,sha256=1qMxT3wrp5vP6ugSf1-Zz3BWwlbCWJ0jzeCuhgX85vw,2406
|
||||
pip/_vendor/chardet/codingstatemachine.py,sha256=BiGR9kgTYbS4gJI5qBmE52HMOBOR_roDvXf7aIehdEk,3559
|
||||
pip/_vendor/chardet/cp949prober.py,sha256=kCQEaOCzMntqv7pAyXEobWTRgIUxYfoiUr0btXO1nI8,1838
|
||||
pip/_vendor/chardet/enums.py,sha256=Rodw4p61Vg9U-oCo6eUuT7uDzKwIbCaA15HwbvCoCNk,1619
|
||||
pip/_vendor/chardet/escprober.py,sha256=girD61r3NsQLnMQXsWWBU4hHuRJzTH3V7-VfTUr-nQY,3864
|
||||
pip/_vendor/chardet/escsm.py,sha256=0Vs4iPPovberMoSxxnK5pI161Xf-mtKgOl14g5Xc7zg,12021
|
||||
pip/_vendor/chardet/eucjpprober.py,sha256=pGgs4lINwCEDV2bxqIZ6hXpaj2j4l2oLsMx6kuOK_zQ,3676
|
||||
pip/_vendor/chardet/euckrfreq.py,sha256=3mHuRvXfsq_QcQysDQFb8qSudvTiol71C6Ic2w57tKM,13566
|
||||
pip/_vendor/chardet/euckrprober.py,sha256=qBuSS2zXWaoUmGdzz3owAnD1GNhuKR_8bYzDC3yxe6I,1731
|
||||
pip/_vendor/chardet/euctwfreq.py,sha256=2alILE1Lh5eqiFJZjzRkMQXolNJRHY5oBQd-vmZYFFM,36913
|
||||
pip/_vendor/chardet/euctwprober.py,sha256=SLnCoJC94jZL8PJio60Q8PZACJA1rVPtUdWMa1W8Pwk,1731
|
||||
pip/_vendor/chardet/gb2312freq.py,sha256=49OrdXzD-HXqwavkqjo8Z7gvs58hONNzDhAyMENNkvY,20735
|
||||
pip/_vendor/chardet/gb2312prober.py,sha256=NS_i52jZE0TnWGkKqFduvu9fzW0nMcS2XbYJ8qSX8hY,1737
|
||||
pip/_vendor/chardet/hebrewprober.py,sha256=1l1hXF8-2IWDrPkf85UvAO1GVtMfY1r11kDgOqa-gU4,13919
|
||||
pip/_vendor/chardet/jisfreq.py,sha256=mm8tfrwqhpOd3wzZKS4NJqkYBQVcDfTM2JiQ5aW932E,25796
|
||||
pip/_vendor/chardet/johabfreq.py,sha256=dBpOYG34GRX6SL8k_LbS9rxZPMjLjoMlgZ03Pz5Hmqc,42498
|
||||
pip/_vendor/chardet/johabprober.py,sha256=C18osd4vMPfy9facw-Y1Lor_9UrW0PeV-zxM2fu441c,1730
|
||||
pip/_vendor/chardet/jpcntx.py,sha256=m1gDpPkRca4EDwym8XSL5YdoILFnFsDbNBYMQV7_-NE,26797
|
||||
pip/_vendor/chardet/langbulgarianmodel.py,sha256=vmbvYFP8SZkSxoBvLkFqKiH1sjma5ihk3PTpdy71Rr4,104562
|
||||
pip/_vendor/chardet/langgreekmodel.py,sha256=JfB7bupjjJH2w3X_mYnQr9cJA_7EuITC2cRW13fUjeI,98484
|
||||
pip/_vendor/chardet/langhebrewmodel.py,sha256=3HXHaLQPNAGcXnJjkIJfozNZLTvTJmf4W5Awi6zRRKc,98196
|
||||
pip/_vendor/chardet/langhungarianmodel.py,sha256=WxbeQIxkv8YtApiNqxQcvj-tMycsoI4Xy-fwkDHpP_Y,101363
|
||||
pip/_vendor/chardet/langrussianmodel.py,sha256=s395bTZ87ESTrZCOdgXbEjZ9P1iGPwCl_8xSsac_DLY,128035
|
||||
pip/_vendor/chardet/langthaimodel.py,sha256=7bJlQitRpTnVGABmbSznHnJwOHDy3InkTvtFUx13WQI,102774
|
||||
pip/_vendor/chardet/langturkishmodel.py,sha256=XY0eGdTIy4eQ9Xg1LVPZacb-UBhHBR-cq0IpPVHowKc,95372
|
||||
pip/_vendor/chardet/latin1prober.py,sha256=u_iGcQMUcZLXvj4B_WXx4caA0C5oaE2Qj1KTpz_RQ1I,5260
|
||||
pip/_vendor/chardet/mbcharsetprober.py,sha256=iKKuB6o_FF80NynRLBDT0UtwOnpLqmL_OspRPMib7CM,3367
|
||||
pip/_vendor/chardet/mbcsgroupprober.py,sha256=1D_kp9nv2_NQRddq9I2WDvB35OJh7Tfpo-OYTnL3B5o,2056
|
||||
pip/_vendor/chardet/mbcssm.py,sha256=EfORNu1WXgnFvpFarU8uJHS8KFif63xmgrHOB4DdDdY,30068
|
||||
pip/_vendor/chardet/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/metadata/__pycache__/languages.cpython-310.pyc,,
|
||||
pip/_vendor/chardet/metadata/languages.py,sha256=HcaBygWtZq3gR8prIkJp_etvkhm2V4pUIToqjPZhgrc,13280
|
||||
pip/_vendor/chardet/sbcharsetprober.py,sha256=VvtWiNRLbHDZ5xgnofsmP1u8VQIkkaAuw3Ir9m1zDzQ,6199
|
||||
pip/_vendor/chardet/sbcsgroupprober.py,sha256=mekr4E3hgT4onmwi8oi1iEGW1CN-Z-BArG6kOtCunJw,4129
|
||||
pip/_vendor/chardet/sjisprober.py,sha256=sLfWS25PVFr5cDGhEf6h_s-RJsyeSteA-4ynsTl_UvA,3749
|
||||
pip/_vendor/chardet/universaldetector.py,sha256=BHeNWt1kn0yQgnR6xNtLAjiNmEQpSHYlKEvuZ9QyR1k,13288
|
||||
pip/_vendor/chardet/utf1632prober.py,sha256=N42YJEOkVDB67c38t5aJhXMG1QvnyWWDMNY5ERzniU0,8289
|
||||
pip/_vendor/chardet/utf8prober.py,sha256=mnLaSBV4gg-amt2WmxKFKWy4vVBedMNgjdbvgzBo0Dc,2709
|
||||
pip/_vendor/chardet/version.py,sha256=u_QYi-DXU1s7fyC_Rwa0I0-UcxMVmH7Co6c7QGKbe3g,242
|
||||
pip/_vendor/colorama/__init__.py,sha256=ihDoWQOkapwF7sqQ99AoDoEF3vGYm40OtmgW211cLZw,239
|
||||
pip/_vendor/colorama/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/colorama/__pycache__/ansi.cpython-310.pyc,,
|
||||
pip/_vendor/colorama/__pycache__/ansitowin32.cpython-310.pyc,,
|
||||
pip/_vendor/colorama/__pycache__/initialise.cpython-310.pyc,,
|
||||
pip/_vendor/colorama/__pycache__/win32.cpython-310.pyc,,
|
||||
pip/_vendor/colorama/__pycache__/winterm.cpython-310.pyc,,
|
||||
pip/_vendor/colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522
|
||||
pip/_vendor/colorama/ansitowin32.py,sha256=gGrO7MVtwc-j1Sq3jKfZpERT1JWmYSOsTVDiTnFbZU4,10830
|
||||
pip/_vendor/colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915
|
||||
pip/_vendor/colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404
|
||||
pip/_vendor/colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438
|
||||
pip/_vendor/distlib/__init__.py,sha256=kshNHF2XFPxmBv57X7Jsj7c6VzF5r9naVwGePP-s5Wc,581
|
||||
pip/_vendor/distlib/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/compat.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/database.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/index.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/locators.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/manifest.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/markers.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/metadata.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/resources.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/scripts.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/util.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/version.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/wheel.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/compat.py,sha256=tfoMrj6tujk7G4UC2owL6ArgDuCKabgBxuJRGZSmpko,41259
|
||||
pip/_vendor/distlib/database.py,sha256=o_mw0fAr93NDAHHHfqG54Y1Hi9Rkfrp2BX15XWZYK50,51697
|
||||
pip/_vendor/distlib/index.py,sha256=HFiDG7LMoaBs829WuotrfIwcErOOExUOR_AeBtw_TCU,20834
|
||||
pip/_vendor/distlib/locators.py,sha256=wNzG-zERzS_XGls-nBPVVyLRHa2skUlkn0-5n0trMWA,51991
|
||||
pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811
|
||||
pip/_vendor/distlib/markers.py,sha256=TpHHHLgkzyT7YHbwj-2i6weRaq-Ivy2-MUnrDkjau-U,5058
|
||||
pip/_vendor/distlib/metadata.py,sha256=g_DIiu8nBXRzA-mWPRpatHGbmFZqaFoss7z9TG7QSUU,39801
|
||||
pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820
|
||||
pip/_vendor/distlib/scripts.py,sha256=BmkTKmiTk4m2cj-iueliatwz3ut_9SsABBW51vnQnZU,18102
|
||||
pip/_vendor/distlib/t32.exe,sha256=lD3IWCwZiYZ9onypJifi2R1sGS-S24t3mYupsEAOKyA,97792
|
||||
pip/_vendor/distlib/t64-arm.exe,sha256=3hjLTLg7XBVHwDxgzZpkiHXXp4IJQMLvg_ZlGGpKZDI,182784
|
||||
pip/_vendor/distlib/t64.exe,sha256=vvS31h4-SnumthypJJKAWBeBh7cxSJ8AwGmbqumM05k,107520
|
||||
pip/_vendor/distlib/util.py,sha256=31dPXn3Rfat0xZLeVoFpuniyhe6vsbl9_QN-qd9Lhlk,66262
|
||||
pip/_vendor/distlib/version.py,sha256=WG__LyAa2GwmA6qSoEJtvJE8REA1LZpbSizy8WvhJLk,23513
|
||||
pip/_vendor/distlib/w32.exe,sha256=-a9nfgVZClK_mGnbQtXVLbn7xtPYw3xDKTddKnu2AJ8,91648
|
||||
pip/_vendor/distlib/w64-arm.exe,sha256=LW-JyIIGblDOp8Psy8igJXDvcg_YpJIINvN0tRjfv18,168448
|
||||
pip/_vendor/distlib/w64.exe,sha256=XvKqAoQzca86ERd2-KV5Vo1RSOBM28I2a35sPQONrYI,101888
|
||||
pip/_vendor/distlib/wheel.py,sha256=Rgqs658VsJ3R2845qwnZD8XQryV2CzWw2mghwLvxxsI,43898
|
||||
pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981
|
||||
pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64
|
||||
pip/_vendor/distro/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/distro/__pycache__/__main__.cpython-310.pyc,,
|
||||
pip/_vendor/distro/__pycache__/distro.cpython-310.pyc,,
|
||||
pip/_vendor/distro/distro.py,sha256=UYQG_9H_iSOt422uasA92HlY7aXeTnWKdV-IhsSAdwQ,48841
|
||||
pip/_vendor/idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849
|
||||
pip/_vendor/idna/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/idna/__pycache__/codec.cpython-310.pyc,,
|
||||
pip/_vendor/idna/__pycache__/compat.cpython-310.pyc,,
|
||||
pip/_vendor/idna/__pycache__/core.cpython-310.pyc,,
|
||||
pip/_vendor/idna/__pycache__/idnadata.cpython-310.pyc,,
|
||||
pip/_vendor/idna/__pycache__/intranges.cpython-310.pyc,,
|
||||
pip/_vendor/idna/__pycache__/package_data.cpython-310.pyc,,
|
||||
pip/_vendor/idna/__pycache__/uts46data.cpython-310.pyc,,
|
||||
pip/_vendor/idna/codec.py,sha256=6ly5odKfqrytKT9_7UrlGklHnf1DSK2r9C6cSM4sa28,3374
|
||||
pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321
|
||||
pip/_vendor/idna/core.py,sha256=RFIkY-HhFZaDoBEFjGwyGd_vWI04uOAQjnzueMWqwOU,12795
|
||||
pip/_vendor/idna/idnadata.py,sha256=fzMzkCea2xieVxcrjngJ-2pLsKQNejPCZFlBajIuQdw,44025
|
||||
pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881
|
||||
pip/_vendor/idna/package_data.py,sha256=szxQhV0ZD0nKJ84Kuobw3l8q4_KeCyXjFRdpwIpKZmw,21
|
||||
pip/_vendor/idna/uts46data.py,sha256=o-D7V-a0fOLZNd7tvxof6MYfUd0TBZzE2bLR5XO67xU,204400
|
||||
pip/_vendor/msgpack/__init__.py,sha256=NryGaKLDk_Egd58ZxXpnuI7OWO27AXz7S6CBFRM3sAY,1132
|
||||
pip/_vendor/msgpack/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/msgpack/__pycache__/exceptions.cpython-310.pyc,,
|
||||
pip/_vendor/msgpack/__pycache__/ext.cpython-310.pyc,,
|
||||
pip/_vendor/msgpack/__pycache__/fallback.cpython-310.pyc,,
|
||||
pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081
|
||||
pip/_vendor/msgpack/ext.py,sha256=TuldJPkYu8Wo_Xh0tFGL2l06-gY88NSR8tOje9fo2Wg,6080
|
||||
pip/_vendor/msgpack/fallback.py,sha256=OORDn86-fHBPlu-rPlMdM10KzkH6S_Rx9CHN1b7o4cg,34557
|
||||
pip/_vendor/packaging/__about__.py,sha256=ugASIO2w1oUyH8_COqQ2X_s0rDhjbhQC3yJocD03h2c,661
|
||||
pip/_vendor/packaging/__init__.py,sha256=b9Kk5MF7KxhhLgcDmiUWukN-LatWFxPdNug0joPhHSk,497
|
||||
pip/_vendor/packaging/__pycache__/__about__.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/_manylinux.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/_musllinux.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/_structures.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/markers.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/requirements.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/tags.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/utils.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/version.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/_manylinux.py,sha256=XcbiXB-qcjv3bcohp6N98TMpOP4_j3m-iOA8ptK2GWY,11488
|
||||
pip/_vendor/packaging/_musllinux.py,sha256=_KGgY_qc7vhMGpoqss25n2hiLCNKRtvz9mCrS7gkqyc,4378
|
||||
pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431
|
||||
pip/_vendor/packaging/markers.py,sha256=AJBOcY8Oq0kYc570KuuPTkvuqjAlhufaE2c9sCUbm64,8487
|
||||
pip/_vendor/packaging/requirements.py,sha256=NtDlPBtojpn1IUC85iMjPNsUmufjpSlwnNA-Xb4m5NA,4676
|
||||
pip/_vendor/packaging/specifiers.py,sha256=LRQ0kFsHrl5qfcFNEEJrIFYsnIHQUJXY9fIsakTrrqE,30110
|
||||
pip/_vendor/packaging/tags.py,sha256=lmsnGNiJ8C4D_Pf9PbM0qgbZvD9kmB9lpZBQUZa3R_Y,15699
|
||||
pip/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200
|
||||
pip/_vendor/packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665
|
||||
pip/_vendor/pep517/__init__.py,sha256=Y1bATL2qbFNN6M_DQa4yyrwqjpIiL-j9T6kBmR0DS14,130
|
||||
pip/_vendor/pep517/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/__pycache__/build.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/__pycache__/check.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/__pycache__/colorlog.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/__pycache__/compat.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/__pycache__/dirtools.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/__pycache__/envbuild.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/__pycache__/meta.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/__pycache__/wrappers.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/build.py,sha256=2bar6EdjwIz2Dlfy94qdxn3oA9mVnnny40mfoT5f-qI,3457
|
||||
pip/_vendor/pep517/check.py,sha256=bCORq1WrHjhpTONa-zpAqG0EB9rHNuhO1ORu6DsDuL8,6084
|
||||
pip/_vendor/pep517/colorlog.py,sha256=Tk9AuYm_cLF3BKTBoSTJt9bRryn0aFojIQOwbfVUTxQ,4098
|
||||
pip/_vendor/pep517/compat.py,sha256=NmLImE5oiDT3gbEhJ4w7xeoMFcpAPrGu_NltBytSJUY,1253
|
||||
pip/_vendor/pep517/dirtools.py,sha256=2mkAkAL0mRz_elYFjRKuekTJVipH1zTn4tbf1EDev84,1129
|
||||
pip/_vendor/pep517/envbuild.py,sha256=zFde--rmzjXMLXcm7SA_3hDtgk5VCTA8hjpk88RbF6E,6100
|
||||
pip/_vendor/pep517/in_process/__init__.py,sha256=MyWoAi8JHdcBv7yXuWpUSVADbx6LSB9rZh7kTIgdA8Y,563
|
||||
pip/_vendor/pep517/in_process/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/in_process/__pycache__/_in_process.cpython-310.pyc,,
|
||||
pip/_vendor/pep517/in_process/_in_process.py,sha256=D3waguyNSGcwosociD5USfcycYr2RCzCjYtxX5UHQmQ,11201
|
||||
pip/_vendor/pep517/meta.py,sha256=8mnM5lDnT4zXQpBTliJbRGfesH7iioHwozbDxALPS9Y,2463
|
||||
pip/_vendor/pep517/wrappers.py,sha256=impq7Cz_LL1iDF1iiOzYWB4MaEu6O6Gps7TJ5qsJz1Q,13429
|
||||
pip/_vendor/pkg_resources/__init__.py,sha256=NnpQ3g6BCHzpMgOR_OLBmYtniY4oOzdKpwqghfq_6ug,108287
|
||||
pip/_vendor/pkg_resources/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-310.pyc,,
|
||||
pip/_vendor/pkg_resources/py31compat.py,sha256=CRk8fkiPRDLsbi5pZcKsHI__Pbmh_94L8mr9Qy9Ab2U,562
|
||||
pip/_vendor/platformdirs/__init__.py,sha256=x0aUmmovXXuRFVrVQBtwIiovX12B7rUkdV4F9UlLz0Y,12831
|
||||
pip/_vendor/platformdirs/__main__.py,sha256=ZmsnTxEOxtTvwa-Y_Vfab_JN3X4XCVeN8X0yyy9-qnc,1176
|
||||
pip/_vendor/platformdirs/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/platformdirs/__pycache__/__main__.cpython-310.pyc,,
|
||||
pip/_vendor/platformdirs/__pycache__/android.cpython-310.pyc,,
|
||||
pip/_vendor/platformdirs/__pycache__/api.cpython-310.pyc,,
|
||||
pip/_vendor/platformdirs/__pycache__/macos.cpython-310.pyc,,
|
||||
pip/_vendor/platformdirs/__pycache__/unix.cpython-310.pyc,,
|
||||
pip/_vendor/platformdirs/__pycache__/version.cpython-310.pyc,,
|
||||
pip/_vendor/platformdirs/__pycache__/windows.cpython-310.pyc,,
|
||||
pip/_vendor/platformdirs/android.py,sha256=GKizhyS7ESRiU67u8UnBJLm46goau9937EchXWbPBlk,4068
|
||||
pip/_vendor/platformdirs/api.py,sha256=MXKHXOL3eh_-trSok-JUTjAR_zjmmKF3rjREVABjP8s,4910
|
||||
pip/_vendor/platformdirs/macos.py,sha256=-3UXQewbT0yMhMdkzRXfXGAntmLIH7Qt4a9Hlf8I5_Y,2655
|
||||
pip/_vendor/platformdirs/unix.py,sha256=b4aVYTz0qZ50HntwOXo8r6tp82jAa3qTjxw-WlnC2yc,6910
|
||||
pip/_vendor/platformdirs/version.py,sha256=tsBKKPDX3LLh39yHXeTYauGRbRd-AmOJr9SwKldlFIU,78
|
||||
pip/_vendor/platformdirs/windows.py,sha256=ISruopR5UGBePC0BxCxXevkZYfjJsIZc49YWU5iYfQ4,6439
|
||||
pip/_vendor/pygments/__init__.py,sha256=M4yPkVb6x8OkEb4tHfVU8p6B3DBEsshB_8a2gZvr4FE,3002
|
||||
pip/_vendor/pygments/__main__.py,sha256=p0_rz3JZmNZMNZBOqDojaEx1cr9wmA9FQZX_TYl74lQ,353
|
||||
pip/_vendor/pygments/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/__main__.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/cmdline.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/console.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/filter.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/formatter.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/lexer.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/modeline.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/plugin.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/regexopt.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/scanner.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/sphinxext.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/style.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/token.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/unistring.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/util.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/cmdline.py,sha256=HYs14dbtMgL7t_BJ7B84NXlFjOzMYgW7Z0ZSxkTJun4,23408
|
||||
pip/_vendor/pygments/console.py,sha256=hQfqCFuOlGk7DW2lPQYepsw-wkOH1iNt9ylNA1eRymM,1697
|
||||
pip/_vendor/pygments/filter.py,sha256=NglMmMPTRRv-zuRSE_QbWid7JXd2J4AvwjCW2yWALXU,1938
|
||||
pip/_vendor/pygments/filters/__init__.py,sha256=F8WwJguaJLs3bomEH8LyVATQfpULTpSpTd4PRPONR5A,40292
|
||||
pip/_vendor/pygments/filters/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatter.py,sha256=6-TS2Y8pUMeWIUolWwr1O8ruC-U6HydWDwOdbAiJgJQ,2917
|
||||
pip/_vendor/pygments/formatters/__init__.py,sha256=5LfCZThsbVVtZU5OyavkRPwC0MV7tB6pqcJ793PWi6E,5119
|
||||
pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/groff.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/html.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/img.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/irc.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/latex.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/other.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/svg.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/_mapping.py,sha256=QLyYZ7Cv9W7YcM8seq0XqR3MXW3MzoFZSyHd7BDNU84,6517
|
||||
pip/_vendor/pygments/formatters/bbcode.py,sha256=JrL4ITjN-KzPcuQpPMBf1pm33eW2sDUNr8WzSoAJsJA,3314
|
||||
pip/_vendor/pygments/formatters/groff.py,sha256=xrOFoLbafSA9uHsSLRogy79_Zc4GWJ8tMK2hCdTJRsw,5086
|
||||
pip/_vendor/pygments/formatters/html.py,sha256=QNt9prPgxmbKx2M-nfDwoR1bIg06-sNouQuWnE434Wc,35441
|
||||
pip/_vendor/pygments/formatters/img.py,sha256=j3hHU1fhbBEIKEtWTV-vc-z-5c2nqoobOty3QqeQbpk,21819
|
||||
pip/_vendor/pygments/formatters/irc.py,sha256=iwk5tDJOxbCV64SCmOFyvk__x6RD60ay0nUn7ko9n7U,5871
|
||||
pip/_vendor/pygments/formatters/latex.py,sha256=thPbytJCIs2AUXsO3NZwqKtXJ-upOlcXP4CXsx94G4w,19351
|
||||
pip/_vendor/pygments/formatters/other.py,sha256=PczqK1Rms43lz6iucOLPeBMxIncPKOGBt-195w1ynII,5073
|
||||
pip/_vendor/pygments/formatters/pangomarkup.py,sha256=ZZzMsKJKXrsDniFeMTkIpe7aQ4VZYRHu0idWmSiUJ2U,2212
|
||||
pip/_vendor/pygments/formatters/rtf.py,sha256=abrKlWjipBkQvhIICxtjYTUNv6WME0iJJObFvqVuudE,5014
|
||||
pip/_vendor/pygments/formatters/svg.py,sha256=6MM9YyO8NhU42RTQfTWBiagWMnsf9iG5gwhqSriHORE,7335
|
||||
pip/_vendor/pygments/formatters/terminal.py,sha256=NpEGvwkC6LgMLQTjVzGrJXji3XcET1sb5JCunSCzoRo,4674
|
||||
pip/_vendor/pygments/formatters/terminal256.py,sha256=4v4OVizvsxtwWBpIy_Po30zeOzE5oJg_mOc1-rCjMDk,11753
|
||||
pip/_vendor/pygments/lexer.py,sha256=ZPB_TGn_qzrXodRFwEdPzzJk6LZBo9BlfSy3lacc6zg,32005
|
||||
pip/_vendor/pygments/lexers/__init__.py,sha256=Gku6kqn9IvgIdvV50gISPo0mmyyMNYRoUliEwhw6eNY,11491
|
||||
pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/lexers/__pycache__/python.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/lexers/_mapping.py,sha256=sExOsmEbtg7hKwXgSz6M3L77cKPaOgskzxOCdw_GxVc,72083
|
||||
pip/_vendor/pygments/lexers/python.py,sha256=QWj4ud4brZCj0-LXjR7IcO0kL6lqM2HzM_DzZZxMRjg,52792
|
||||
pip/_vendor/pygments/modeline.py,sha256=gIbMSYrjSWPk0oATz7W9vMBYkUyTK2OcdVyKjioDRvA,986
|
||||
pip/_vendor/pygments/plugin.py,sha256=tIRWetjR4dokpgbbFnsx7jjfN57T4-Z4errH1eVgGYw,1727
|
||||
pip/_vendor/pygments/regexopt.py,sha256=c6xcXGpGgvCET_3VWawJJqAnOp0QttFpQEdOPNY2Py0,3072
|
||||
pip/_vendor/pygments/scanner.py,sha256=F2T2G6cpkj-yZtzGQr-sOBw5w5-96UrJWveZN6va2aM,3092
|
||||
pip/_vendor/pygments/sphinxext.py,sha256=F8L0211sPnXaiWutN0lkSUajWBwlgDMIEFFAbMWOvZY,4630
|
||||
pip/_vendor/pygments/style.py,sha256=RRnussX1YiK9Z7HipIvKorImxu3-HnkdpPCO4u925T0,6257
|
||||
pip/_vendor/pygments/styles/__init__.py,sha256=eVJlJqbmc-TYSQEEl-2yhbtnW6INfuvlayJOiXrt9ro,3252
|
||||
pip/_vendor/pygments/styles/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/token.py,sha256=naybicpgOtSlh3vMGvbbx2T_6qEdGWYEH_RJ4gacIcc,6143
|
||||
pip/_vendor/pygments/unistring.py,sha256=gP3gK-6C4oAFjjo9HvoahsqzuV4Qz0jl0E0OxfDerHI,63187
|
||||
pip/_vendor/pygments/util.py,sha256=KgwpWWC3By5AiNwxGTI7oI9aXupH2TyZWukafBJe0Mg,9110
|
||||
pip/_vendor/pyparsing/__init__.py,sha256=ZPdI7pPo4IYXcABw-51AcqOzsxVvDtqnQbyn_qYWZvo,9171
|
||||
pip/_vendor/pyparsing/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pyparsing/__pycache__/actions.cpython-310.pyc,,
|
||||
pip/_vendor/pyparsing/__pycache__/common.cpython-310.pyc,,
|
||||
pip/_vendor/pyparsing/__pycache__/core.cpython-310.pyc,,
|
||||
pip/_vendor/pyparsing/__pycache__/exceptions.cpython-310.pyc,,
|
||||
pip/_vendor/pyparsing/__pycache__/helpers.cpython-310.pyc,,
|
||||
pip/_vendor/pyparsing/__pycache__/results.cpython-310.pyc,,
|
||||
pip/_vendor/pyparsing/__pycache__/testing.cpython-310.pyc,,
|
||||
pip/_vendor/pyparsing/__pycache__/unicode.cpython-310.pyc,,
|
||||
pip/_vendor/pyparsing/__pycache__/util.cpython-310.pyc,,
|
||||
pip/_vendor/pyparsing/actions.py,sha256=wU9i32e0y1ymxKE3OUwSHO-SFIrt1h_wv6Ws0GQjpNU,6426
|
||||
pip/_vendor/pyparsing/common.py,sha256=lFL97ooIeR75CmW5hjURZqwDCTgruqltcTCZ-ulLO2Q,12936
|
||||
pip/_vendor/pyparsing/core.py,sha256=AzTm1KFT1FIhiw2zvXZJmrpQoAwB0wOmeDCiR6SYytw,213344
|
||||
pip/_vendor/pyparsing/diagram/__init__.py,sha256=KW0PV_TvWKnL7jysz0pQbZ24nzWWu2ZfNaeyUIIywIg,23685
|
||||
pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pyparsing/exceptions.py,sha256=3LbSafD32NYb1Tzt85GHNkhEAU1eZkTtNSk24cPMemo,9023
|
||||
pip/_vendor/pyparsing/helpers.py,sha256=QpUOjW0-psvueMwWb9bQpU2noqKCv98_wnw1VSzSdVo,39129
|
||||
pip/_vendor/pyparsing/results.py,sha256=HgNvWVXBdQP-Q6PtJfoCEeOJk2nwEvG-2KVKC5sGA30,25341
|
||||
pip/_vendor/pyparsing/testing.py,sha256=7tu4Abp4uSeJV0N_yEPRmmNUhpd18ZQP3CrX41DM814,13402
|
||||
pip/_vendor/pyparsing/unicode.py,sha256=fwuhMj30SQ165Cv7HJpu-rSxGbRm93kN9L4Ei7VGc1Y,10787
|
||||
pip/_vendor/pyparsing/util.py,sha256=kq772O5YSeXOSdP-M31EWpbH_ayj7BMHImBYo9xPD5M,6805
|
||||
pip/_vendor/requests/__init__.py,sha256=3XN75ZS4slWy3TQsEGF7-Q6l2R146teU-s2_rXNhxhU,5178
|
||||
pip/_vendor/requests/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/__version__.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/_internal_utils.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/adapters.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/api.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/auth.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/certs.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/compat.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/cookies.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/exceptions.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/help.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/hooks.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/models.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/packages.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/sessions.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/status_codes.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/structures.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/utils.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__version__.py,sha256=nJVa3ef2yRyeYMhy7yHnRyjjpnNTDykZsE4Sp9irBC4,440
|
||||
pip/_vendor/requests/_internal_utils.py,sha256=aSPlF4uDhtfKxEayZJJ7KkAxtormeTfpwKSBSwtmAUw,1397
|
||||
pip/_vendor/requests/adapters.py,sha256=GFEz5koZaMZD86v0SHXKVB5SE9MgslEjkCQzldkNwVM,21443
|
||||
pip/_vendor/requests/api.py,sha256=dyvkDd5itC9z2g0wHl_YfD1yf6YwpGWLO7__8e21nks,6377
|
||||
pip/_vendor/requests/auth.py,sha256=h-HLlVx9j8rKV5hfSAycP2ApOSglTz77R0tz7qCbbEE,10187
|
||||
pip/_vendor/requests/certs.py,sha256=kHDlkK_beuHXeMPc5jta2wgl8gdKeUWt5f2nTDVrvt8,441
|
||||
pip/_vendor/requests/compat.py,sha256=IhK9quyX0RRuWTNcg6d2JGSAOUbM6mym2p_2XjLTwf4,1286
|
||||
pip/_vendor/requests/cookies.py,sha256=kD3kNEcCj-mxbtf5fJsSaT86eGoEYpD3X0CSgpzl7BM,18560
|
||||
pip/_vendor/requests/exceptions.py,sha256=FA-_kVwBZ2jhXauRctN_ewHVK25b-fj0Azyz1THQ0Kk,3823
|
||||
pip/_vendor/requests/help.py,sha256=FnAAklv8MGm_qb2UilDQgS6l0cUttiCFKUjx0zn2XNA,3879
|
||||
pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733
|
||||
pip/_vendor/requests/models.py,sha256=GZRMMrGwDOLVvVfFHLUq0qTfIWDla3NcFHa1f5xs9Q8,35287
|
||||
pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695
|
||||
pip/_vendor/requests/sessions.py,sha256=KUqJcRRLovNefUs7ScOXSUVCcfSayTFWtbiJ7gOSlTI,30180
|
||||
pip/_vendor/requests/status_codes.py,sha256=FvHmT5uH-_uimtRz5hH9VCbt7VV-Nei2J9upbej6j8g,4235
|
||||
pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912
|
||||
pip/_vendor/requests/utils.py,sha256=0gzSOcx9Ya4liAbHnHuwt4jM78lzCZZoDFgkmsInNUg,33240
|
||||
pip/_vendor/resolvelib/__init__.py,sha256=UL-B2BDI0_TRIqkfGwLHKLxY-LjBlomz7941wDqzB1I,537
|
||||
pip/_vendor/resolvelib/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/resolvelib/__pycache__/providers.cpython-310.pyc,,
|
||||
pip/_vendor/resolvelib/__pycache__/reporters.cpython-310.pyc,,
|
||||
pip/_vendor/resolvelib/__pycache__/resolvers.cpython-310.pyc,,
|
||||
pip/_vendor/resolvelib/__pycache__/structs.cpython-310.pyc,,
|
||||
pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-310.pyc,,
|
||||
pip/_vendor/resolvelib/compat/collections_abc.py,sha256=uy8xUZ-NDEw916tugUXm8HgwCGiMO0f-RcdnpkfXfOs,156
|
||||
pip/_vendor/resolvelib/providers.py,sha256=roVmFBItQJ0TkhNua65h8LdNny7rmeqVEXZu90QiP4o,5872
|
||||
pip/_vendor/resolvelib/reporters.py,sha256=fW91NKf-lK8XN7i6Yd_rczL5QeOT3sc6AKhpaTEnP3E,1583
|
||||
pip/_vendor/resolvelib/resolvers.py,sha256=2wYzVGBGerbmcIpH8cFmgSKgLSETz8jmwBMGjCBMHG4,17592
|
||||
pip/_vendor/resolvelib/structs.py,sha256=IVIYof6sA_N4ZEiE1C1UhzTX495brCNnyCdgq6CYq28,4794
|
||||
pip/_vendor/rich/__init__.py,sha256=zREyQ22R3zKg8gMdhiikczdVQYtZNeayHNrbBg5scm0,5944
|
||||
pip/_vendor/rich/__main__.py,sha256=BmTmBWI93ytq75IEPi1uAAdeRYzFfDbgaAXjsX1ogig,8808
|
||||
pip/_vendor/rich/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/__main__.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_cell_widths.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_emoji_codes.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_emoji_replace.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_export_format.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_extension.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_inspect.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_log_render.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_loop.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_palettes.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_pick.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_ratio.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_spinners.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_stack.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_timer.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_win32_console.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_windows.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_windows_renderer.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_wrap.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/abc.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/align.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/ansi.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/bar.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/box.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/cells.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/color.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/color_triplet.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/columns.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/console.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/constrain.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/containers.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/control.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/default_styles.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/diagnose.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/emoji.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/errors.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/file_proxy.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/filesize.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/highlighter.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/json.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/jupyter.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/layout.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/live.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/live_render.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/logging.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/markup.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/measure.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/padding.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/pager.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/palette.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/panel.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/pretty.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/progress.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/progress_bar.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/prompt.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/protocol.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/region.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/repr.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/rule.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/scope.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/screen.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/segment.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/spinner.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/status.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/style.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/styled.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/syntax.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/table.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/terminal_theme.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/text.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/theme.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/themes.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/traceback.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/tree.cpython-310.pyc,,
|
||||
pip/_vendor/rich/_cell_widths.py,sha256=2n4EiJi3X9sqIq0O16kUZ_zy6UYMd3xFfChlKfnW1Hc,10096
|
||||
pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235
|
||||
pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064
|
||||
pip/_vendor/rich/_export_format.py,sha256=nHArqOljIlYn6NruhWsAsh-fHo7oJC3y9BDJyAa-QYQ,2114
|
||||
pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265
|
||||
pip/_vendor/rich/_inspect.py,sha256=oZJGw31e64dwXSCmrDnvZbwVb1ZKhWfU8wI3VWohjJk,9695
|
||||
pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225
|
||||
pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236
|
||||
pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063
|
||||
pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423
|
||||
pip/_vendor/rich/_ratio.py,sha256=2lLSliL025Y-YMfdfGbutkQDevhcyDqc-DtUYW9mU70,5472
|
||||
pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919
|
||||
pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351
|
||||
pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417
|
||||
pip/_vendor/rich/_win32_console.py,sha256=P0vxI2fcndym1UU1S37XAzQzQnkyY7YqAKmxm24_gug,22820
|
||||
pip/_vendor/rich/_windows.py,sha256=dvNl9TmfPzNVxiKk5WDFihErZ5796g2UC9-KGGyfXmk,1926
|
||||
pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783
|
||||
pip/_vendor/rich/_wrap.py,sha256=xfV_9t0Sg6rzimmrDru8fCVmUlalYAcHLDfrJZnbbwQ,1840
|
||||
pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890
|
||||
pip/_vendor/rich/align.py,sha256=FV6_GS-8uhIyViMng3hkIWSFaTgMohK1Oqyjl8I8mGE,10368
|
||||
pip/_vendor/rich/ansi.py,sha256=HtaPG7dvgL6_yo0sQmx5CM05DJ4_1goY5SWXXOYNaKs,6820
|
||||
pip/_vendor/rich/bar.py,sha256=a7UD303BccRCrEhGjfMElpv5RFYIinaAhAuqYqhUvmw,3264
|
||||
pip/_vendor/rich/box.py,sha256=1Iv1sUWqjtp5XwLwGH-AJ8HgyXZ7dRFUkO0z3M_bRl8,9864
|
||||
pip/_vendor/rich/cells.py,sha256=zMjFI15wCpgjLR14lHdfFMVC6qMDi5OsKIB0PYZBBMk,4503
|
||||
pip/_vendor/rich/color.py,sha256=kp87L8V4-3qayE6CUxtW_nP8Ujfew_-DAhNwYMXBMOY,17957
|
||||
pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054
|
||||
pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131
|
||||
pip/_vendor/rich/console.py,sha256=bTT9DNX03V4cQXefg22d-gLSs_e_ZY2zdCvLIlEyU2Q,95885
|
||||
pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288
|
||||
pip/_vendor/rich/containers.py,sha256=aKgm5UDHn5Nmui6IJaKdsZhbHClh_X7D-_Wg8Ehrr7s,5497
|
||||
pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630
|
||||
pip/_vendor/rich/default_styles.py,sha256=WqVh-RPNEsx0Wxf3fhS_fCn-wVqgJ6Qfo-Zg7CoCsLE,7954
|
||||
pip/_vendor/rich/diagnose.py,sha256=an6uouwhKPAlvQhYpNNpGq9EJysfMIOvvCbO3oSoR24,972
|
||||
pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501
|
||||
pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642
|
||||
pip/_vendor/rich/file_proxy.py,sha256=4gCbGRXg0rW35Plaf0UVvj3dfENHuzc_n8I_dBqxI7o,1616
|
||||
pip/_vendor/rich/filesize.py,sha256=yShoVpARafJBreyZFaAhC4OhnJ6ydC1WXR-Ez4wU_YQ,2507
|
||||
pip/_vendor/rich/highlighter.py,sha256=3WW6PACGlq0e3YDjfqiMBQ0dYZwu7pcoFYUgJy01nb0,9585
|
||||
pip/_vendor/rich/json.py,sha256=RCm4lXBXrjvXHpqrWPH8wdGP0jEo4IohLmkddlhRY18,5051
|
||||
pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252
|
||||
pip/_vendor/rich/layout.py,sha256=E3xJ4fomizUADwime3VA0lBXoMSPl9blEokIzVBjO0Q,14074
|
||||
pip/_vendor/rich/live.py,sha256=emVaLUua-FKSYqZXmtJJjBIstO99CqMOuA6vMAKVkO0,14172
|
||||
pip/_vendor/rich/live_render.py,sha256=zElm3PrfSIvjOce28zETHMIUf9pFYSUA5o0AflgUP64,3667
|
||||
pip/_vendor/rich/logging.py,sha256=10j13lPr-QuYqEEBz_2aRJp8gNYvSN2wmCUlUqJcPLM,11471
|
||||
pip/_vendor/rich/markup.py,sha256=xzF4uAafiEeEYDJYt_vUnJOGoTU8RrH-PH7WcWYXjCg,8198
|
||||
pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305
|
||||
pip/_vendor/rich/padding.py,sha256=kTFGsdGe0os7tXLnHKpwTI90CXEvrceeZGCshmJy5zw,4970
|
||||
pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828
|
||||
pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396
|
||||
pip/_vendor/rich/panel.py,sha256=CzdojkDAjxAKgvDxis47nWzUh1V2NniOqkJJQajosG8,8744
|
||||
pip/_vendor/rich/pretty.py,sha256=CalVLVW3mvTn1hvI9Pgi2v-y4S-5zUWBK-PH7SlVs-U,36576
|
||||
pip/_vendor/rich/progress.py,sha256=zjQRwd3TmDnAvSjTPsNPHFjmqE9GOEX3bf0Lj56hIL8,59746
|
||||
pip/_vendor/rich/progress_bar.py,sha256=zHHaFPEfIhW2fq6Fnl5vBY7AUpP1N0HVGElISUHsnqw,8161
|
||||
pip/_vendor/rich/prompt.py,sha256=x0mW-pIPodJM4ry6grgmmLrl8VZp99kqcmdnBe70YYA,11303
|
||||
pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391
|
||||
pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166
|
||||
pip/_vendor/rich/repr.py,sha256=Je91CIrZN_av9L3FRCKCs5yoX2LvczrCNKqUbVsjUvQ,4449
|
||||
pip/_vendor/rich/rule.py,sha256=V6AWI0wCb6DB0rvN967FRMlQrdlG7HoZdfEAHyeG8CM,4773
|
||||
pip/_vendor/rich/scope.py,sha256=HX13XsJfqzQHpPfw4Jn9JmJjCsRj9uhHxXQEqjkwyLA,2842
|
||||
pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591
|
||||
pip/_vendor/rich/segment.py,sha256=6XdX0MfL18tUCaUWDWncIqx0wpq3GiaqzhYP779JvRA,24224
|
||||
pip/_vendor/rich/spinner.py,sha256=7b8MCleS4fa46HX0AzF98zfu6ZM6fAL0UgYzPOoakF4,4374
|
||||
pip/_vendor/rich/status.py,sha256=gJsIXIZeSo3urOyxRUjs6VrhX5CZrA0NxIQ-dxhCnwo,4425
|
||||
pip/_vendor/rich/style.py,sha256=4WnUEkHNMp9Tfmd8cmbxWGby7QeTk2LUTQzFSs46EQc,26240
|
||||
pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258
|
||||
pip/_vendor/rich/syntax.py,sha256=_M08KbE11nNWNBPooFLKAA7lWkThPzlGUsuesxQYsuA,34697
|
||||
pip/_vendor/rich/table.py,sha256=r_lahmj45cINCWLYaIjq9yEv3gve8E6bkYTP8NDqApE,39515
|
||||
pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370
|
||||
pip/_vendor/rich/text.py,sha256=oajdGIeHcLcSdOwbC48_20ylDsHAS5fsPZD_Ih0clyA,44666
|
||||
pip/_vendor/rich/theme.py,sha256=GKNtQhDBZKAzDaY0vQVQQFzbc0uWfFe6CJXA-syT7zQ,3627
|
||||
pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102
|
||||
pip/_vendor/rich/traceback.py,sha256=MORQpXH7AvhAAThW8oIbtwffXb8M6XRkSkcJ52JuA3g,26060
|
||||
pip/_vendor/rich/tree.py,sha256=BMbUYNjS9uodNPfvtY_odmU09GA5QzcMbQ5cJZhllQI,9169
|
||||
pip/_vendor/six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549
|
||||
pip/_vendor/tenacity/__init__.py,sha256=GLLsTFD4Bd5VDgTR6mU_FxyOsrxc48qONorVaRebeD4,18257
|
||||
pip/_vendor/tenacity/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/tenacity/__pycache__/_asyncio.cpython-310.pyc,,
|
||||
pip/_vendor/tenacity/__pycache__/_utils.cpython-310.pyc,,
|
||||
pip/_vendor/tenacity/__pycache__/after.cpython-310.pyc,,
|
||||
pip/_vendor/tenacity/__pycache__/before.cpython-310.pyc,,
|
||||
pip/_vendor/tenacity/__pycache__/before_sleep.cpython-310.pyc,,
|
||||
pip/_vendor/tenacity/__pycache__/nap.cpython-310.pyc,,
|
||||
pip/_vendor/tenacity/__pycache__/retry.cpython-310.pyc,,
|
||||
pip/_vendor/tenacity/__pycache__/stop.cpython-310.pyc,,
|
||||
pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-310.pyc,,
|
||||
pip/_vendor/tenacity/__pycache__/wait.cpython-310.pyc,,
|
||||
pip/_vendor/tenacity/_asyncio.py,sha256=HEb0BVJEeBJE9P-m9XBxh1KcaF96BwoeqkJCL5sbVcQ,3314
|
||||
pip/_vendor/tenacity/_utils.py,sha256=-y68scDcyoqvTJuJJ0GTfjdSCljEYlbCYvgk7nM4NdM,1944
|
||||
pip/_vendor/tenacity/after.py,sha256=dlmyxxFy2uqpLXDr838DiEd7jgv2AGthsWHGYcGYsaI,1496
|
||||
pip/_vendor/tenacity/before.py,sha256=7XtvRmO0dRWUp8SVn24OvIiGFj8-4OP5muQRUiWgLh0,1376
|
||||
pip/_vendor/tenacity/before_sleep.py,sha256=ThyDvqKU5yle_IvYQz_b6Tp6UjUS0PhVp6zgqYl9U6Y,1908
|
||||
pip/_vendor/tenacity/nap.py,sha256=fRWvnz1aIzbIq9Ap3gAkAZgDH6oo5zxMrU6ZOVByq0I,1383
|
||||
pip/_vendor/tenacity/retry.py,sha256=62R71W59bQjuNyFKsDM7hE2aEkEPtwNBRA0tnsEvgSk,6645
|
||||
pip/_vendor/tenacity/stop.py,sha256=sKHmHaoSaW6sKu3dTxUVKr1-stVkY7lw4Y9yjZU30zQ,2790
|
||||
pip/_vendor/tenacity/tornadoweb.py,sha256=E8lWO2nwe6dJgoB-N2HhQprYLDLB_UdSgFnv-EN6wKE,2145
|
||||
pip/_vendor/tenacity/wait.py,sha256=e_Saa6I2tsNLpCL1t9897wN2fGb0XQMQlE4bU2t9V2w,6691
|
||||
pip/_vendor/tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396
|
||||
pip/_vendor/tomli/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/tomli/__pycache__/_parser.cpython-310.pyc,,
|
||||
pip/_vendor/tomli/__pycache__/_re.cpython-310.pyc,,
|
||||
pip/_vendor/tomli/__pycache__/_types.cpython-310.pyc,,
|
||||
pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633
|
||||
pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943
|
||||
pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254
|
||||
pip/_vendor/typing_extensions.py,sha256=U_PyumPFBkMiR_Iq78QWZXdPprTywptECB2WRIQjDv0,75420
|
||||
pip/_vendor/urllib3/__init__.py,sha256=j3yzHIbmW7CS-IKQJ9-PPQf_YKO8EOAey_rMW0UR7us,2763
|
||||
pip/_vendor/urllib3/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/_collections.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/_version.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/connection.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/connectionpool.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/exceptions.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/fields.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/filepost.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/poolmanager.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/request.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/response.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/_collections.py,sha256=Rp1mVyBgc_UlAcp6M3at1skJBXR5J43NawRTvW2g_XY,10811
|
||||
pip/_vendor/urllib3/_version.py,sha256=kDAZ-bEcWgqZsVJELrYbVo4buZP5eBBOGl_X7VA0Ic4,64
|
||||
pip/_vendor/urllib3/connection.py,sha256=8976wL6sGeVMW0JnXvx5mD00yXu87uQjxtB9_VL8dx8,20070
|
||||
pip/_vendor/urllib3/connectionpool.py,sha256=vEzk1iJEw1qR2vHBo7m3Y98iDfna6rKkUz3AyK5lJKQ,39093
|
||||
pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957
|
||||
pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632
|
||||
pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922
|
||||
pip/_vendor/urllib3/contrib/appengine.py,sha256=lfzpHFmJiO82shClLEm3QB62SYgHWnjpZOH_2JhU5Tc,11034
|
||||
pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=ej9gGvfAb2Gt00lafFp45SIoRz-QwrQ4WChm6gQmAlM,4538
|
||||
pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=oR_4W0U0gaDYBN8Q5qz_VZ8xrYZsoXve52RwIKdYGbc,16899
|
||||
pip/_vendor/urllib3/contrib/securetransport.py,sha256=yhZdmVjY6PI6EeFbp7qYOp6-vp1Rkv2NMuOGaEj7pmc,34448
|
||||
pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097
|
||||
pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217
|
||||
pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579
|
||||
pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440
|
||||
pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/packages/__pycache__/six.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417
|
||||
pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665
|
||||
pip/_vendor/urllib3/poolmanager.py,sha256=0KOOJECoeLYVjUHvv-0h4Oq3FFQQ2yb-Fnjkbj8gJO0,19786
|
||||
pip/_vendor/urllib3/request.py,sha256=ZFSIqX0C6WizixecChZ3_okyu7BEv0lZu1VT0s6h4SM,5985
|
||||
pip/_vendor/urllib3/response.py,sha256=36JUM28H4dHsuCQgIPeN91LNcK8r1wBUJGFLk3ALfJc,28156
|
||||
pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155
|
||||
pip/_vendor/urllib3/util/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/connection.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/proxy.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/queue.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/request.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/response.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/retry.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/timeout.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/url.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/wait.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901
|
||||
pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605
|
||||
pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498
|
||||
pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997
|
||||
pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510
|
||||
pip/_vendor/urllib3/util/retry.py,sha256=iESg2PvViNdXBRY4MpL4h0kqwOOkHkxmLn1kkhFHPU8,22001
|
||||
pip/_vendor/urllib3/util/ssl_.py,sha256=X4-AqW91aYPhPx6-xbf66yHFQKbqqfC_5Zt4WkLX1Hc,17177
|
||||
pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758
|
||||
pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895
|
||||
pip/_vendor/urllib3/util/timeout.py,sha256=QSbBUNOB9yh6AnDn61SrLQ0hg5oz0I9-uXEG91AJuIg,10003
|
||||
pip/_vendor/urllib3/util/url.py,sha256=49HwObaTUUjqVe4qvSUvIjZyf3ghgNA6-OLm3kmkFKM,14287
|
||||
pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403
|
||||
pip/_vendor/vendor.txt,sha256=8XILGklF_LcEc20OonK8_bpFH7tG7wLotFxI0k3FMU0,469
|
||||
pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579
|
||||
pip/_vendor/webencodings/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/webencodings/__pycache__/labels.cpython-310.pyc,,
|
||||
pip/_vendor/webencodings/__pycache__/mklabels.cpython-310.pyc,,
|
||||
pip/_vendor/webencodings/__pycache__/tests.cpython-310.pyc,,
|
||||
pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-310.pyc,,
|
||||
pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979
|
||||
pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305
|
||||
pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563
|
||||
pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307
|
||||
pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286
|
||||
@@ -0,0 +1,806 @@
|
||||
@Switch01
|
||||
A_Rog
|
||||
Aakanksha Agrawal
|
||||
Abhinav Sagar
|
||||
ABHYUDAY PRATAP SINGH
|
||||
abs51295
|
||||
AceGentile
|
||||
Adam Chainz
|
||||
Adam Tse
|
||||
Adam Wentz
|
||||
admin
|
||||
Adolfo Ochagavía
|
||||
Adrien Morison
|
||||
Agus
|
||||
ahayrapetyan
|
||||
Ahilya
|
||||
AinsworthK
|
||||
Akash Srivastava
|
||||
Alan Yee
|
||||
Albert Tugushev
|
||||
Albert-Guan
|
||||
albertg
|
||||
Alberto Sottile
|
||||
Aleks Bunin
|
||||
Ales Erjavec
|
||||
Alethea Flowers
|
||||
Alex Gaynor
|
||||
Alex Grönholm
|
||||
Alex Hedges
|
||||
Alex Loosley
|
||||
Alex Morega
|
||||
Alex Stachowiak
|
||||
Alexander Shtyrov
|
||||
Alexandre Conrad
|
||||
Alexey Popravka
|
||||
Aleš Erjavec
|
||||
Alli
|
||||
Ami Fischman
|
||||
Ananya Maiti
|
||||
Anatoly Techtonik
|
||||
Anders Kaseorg
|
||||
Andre Aguiar
|
||||
Andreas Lutro
|
||||
Andrei Geacar
|
||||
Andrew Gaul
|
||||
Andrew Shymanel
|
||||
Andrey Bienkowski
|
||||
Andrey Bulgakov
|
||||
Andrés Delfino
|
||||
Andy Freeland
|
||||
Andy Kluger
|
||||
Ani Hayrapetyan
|
||||
Aniruddha Basak
|
||||
Anish Tambe
|
||||
Anrs Hu
|
||||
Anthony Sottile
|
||||
Antoine Musso
|
||||
Anton Ovchinnikov
|
||||
Anton Patrushev
|
||||
Anton Zelenov
|
||||
Antonio Alvarado Hernandez
|
||||
Antony Lee
|
||||
Antti Kaihola
|
||||
Anubhav Patel
|
||||
Anudit Nagar
|
||||
Anuj Godase
|
||||
AQNOUCH Mohammed
|
||||
AraHaan
|
||||
arena
|
||||
arenasys
|
||||
Arindam Choudhury
|
||||
Armin Ronacher
|
||||
Arnon Yaari
|
||||
Artem
|
||||
Arun Babu Neelicattu
|
||||
Ashley Manton
|
||||
Ashwin Ramaswami
|
||||
atse
|
||||
Atsushi Odagiri
|
||||
Avinash Karhana
|
||||
Avner Cohen
|
||||
Awit (Ah-Wit) Ghirmai
|
||||
Baptiste Mispelon
|
||||
Barney Gale
|
||||
barneygale
|
||||
Bartek Ogryczak
|
||||
Bastian Venthur
|
||||
Ben Bodenmiller
|
||||
Ben Darnell
|
||||
Ben Hoyt
|
||||
Ben Mares
|
||||
Ben Rosser
|
||||
Bence Nagy
|
||||
Benjamin Peterson
|
||||
Benjamin VanEvery
|
||||
Benoit Pierre
|
||||
Berker Peksag
|
||||
Bernard
|
||||
Bernard Tyers
|
||||
Bernardo B. Marques
|
||||
Bernhard M. Wiedemann
|
||||
Bertil Hatt
|
||||
Bhavam Vidyarthi
|
||||
Blazej Michalik
|
||||
Bogdan Opanchuk
|
||||
BorisZZZ
|
||||
Brad Erickson
|
||||
Bradley Ayers
|
||||
Branch Vincent
|
||||
Brandon L. Reiss
|
||||
Brandt Bucher
|
||||
Brannon Dorsey
|
||||
Brett Randall
|
||||
Brett Rosen
|
||||
Brian Cristante
|
||||
Brian Rosner
|
||||
briantracy
|
||||
BrownTruck
|
||||
Bruno Oliveira
|
||||
Bruno Renié
|
||||
Bruno S
|
||||
Bstrdsmkr
|
||||
Buck Golemon
|
||||
burrows
|
||||
Bussonnier Matthias
|
||||
bwoodsend
|
||||
c22
|
||||
Caleb Brown
|
||||
Caleb Martinez
|
||||
Calvin Smith
|
||||
Carl Meyer
|
||||
Carlos Liam
|
||||
Carol Willing
|
||||
Carter Thayer
|
||||
Cass
|
||||
Chandrasekhar Atina
|
||||
Charlie Marsh
|
||||
charwick
|
||||
Chih-Hsuan Yen
|
||||
Chris Brinker
|
||||
Chris Hunt
|
||||
Chris Jerdonek
|
||||
Chris Kuehl
|
||||
Chris Markiewicz
|
||||
Chris McDonough
|
||||
Chris Pawley
|
||||
Chris Pryer
|
||||
Chris Wolfe
|
||||
Christian Clauss
|
||||
Christian Heimes
|
||||
Christian Oudard
|
||||
Christoph Reiter
|
||||
Christopher Hunt
|
||||
Christopher Snyder
|
||||
chrysle
|
||||
cjc7373
|
||||
Clark Boylan
|
||||
Claudio Jolowicz
|
||||
Clay McClure
|
||||
Cody
|
||||
Cody Soyland
|
||||
Colin Watson
|
||||
Collin Anderson
|
||||
Connor Osborn
|
||||
Cooper Lees
|
||||
Cooper Ry Lees
|
||||
Cory Benfield
|
||||
Cory Wright
|
||||
Craig Kerstiens
|
||||
Cristian Sorinel
|
||||
Cristina
|
||||
Cristina Muñoz
|
||||
ctg123
|
||||
Curtis Doty
|
||||
cytolentino
|
||||
Daan De Meyer
|
||||
Dale
|
||||
Damian
|
||||
Damian Quiroga
|
||||
Damian Shaw
|
||||
Dan Black
|
||||
Dan Savilonis
|
||||
Dan Sully
|
||||
Dane Hillard
|
||||
daniel
|
||||
Daniel Collins
|
||||
Daniel Hahler
|
||||
Daniel Holth
|
||||
Daniel Jost
|
||||
Daniel Katz
|
||||
Daniel Shaulov
|
||||
Daniele Esposti
|
||||
Daniele Nicolodi
|
||||
Daniele Procida
|
||||
Daniil Konovalenko
|
||||
Danny Hermes
|
||||
Danny McClanahan
|
||||
Darren Kavanagh
|
||||
Dav Clark
|
||||
Dave Abrahams
|
||||
Dave Jones
|
||||
David Aguilar
|
||||
David Black
|
||||
David Bordeynik
|
||||
David Caro
|
||||
David D Lowe
|
||||
David Evans
|
||||
David Hewitt
|
||||
David Linke
|
||||
David Poggi
|
||||
David Poznik
|
||||
David Pursehouse
|
||||
David Runge
|
||||
David Tucker
|
||||
David Wales
|
||||
Davidovich
|
||||
ddelange
|
||||
Deepak Sharma
|
||||
Deepyaman Datta
|
||||
Denise Yu
|
||||
dependabot[bot]
|
||||
derwolfe
|
||||
Desetude
|
||||
Devesh Kumar Singh
|
||||
devsagul
|
||||
Diego Caraballo
|
||||
Diego Ramirez
|
||||
DiegoCaraballo
|
||||
Dimitri Merejkowsky
|
||||
Dimitri Papadopoulos
|
||||
Dimitri Papadopoulos Orfanos
|
||||
Dirk Stolle
|
||||
Dmitry Gladkov
|
||||
Dmitry Volodin
|
||||
Domen Kožar
|
||||
Dominic Davis-Foster
|
||||
Donald Stufft
|
||||
Dongweiming
|
||||
doron zarhi
|
||||
Dos Moonen
|
||||
Douglas Thor
|
||||
DrFeathers
|
||||
Dustin Ingram
|
||||
Dustin Rodrigues
|
||||
Dwayne Bailey
|
||||
Ed Morley
|
||||
Edgar Ramírez
|
||||
Edgar Ramírez Mondragón
|
||||
Ee Durbin
|
||||
Efflam Lemaillet
|
||||
efflamlemaillet
|
||||
Eitan Adler
|
||||
ekristina
|
||||
elainechan
|
||||
Eli Schwartz
|
||||
Elisha Hollander
|
||||
Ellen Marie Dash
|
||||
Emil Burzo
|
||||
Emil Styrke
|
||||
Emmanuel Arias
|
||||
Endoh Takanao
|
||||
enoch
|
||||
Erdinc Mutlu
|
||||
Eric Cousineau
|
||||
Eric Gillingham
|
||||
Eric Hanchrow
|
||||
Eric Hopper
|
||||
Erik M. Bray
|
||||
Erik Rose
|
||||
Erwin Janssen
|
||||
Eugene Vereshchagin
|
||||
everdimension
|
||||
Federico
|
||||
Felipe Peter
|
||||
Felix Yan
|
||||
fiber-space
|
||||
Filip Kokosiński
|
||||
Filipe Laíns
|
||||
Finn Womack
|
||||
finnagin
|
||||
Flavio Amurrio
|
||||
Florian Briand
|
||||
Florian Rathgeber
|
||||
Francesco
|
||||
Francesco Montesano
|
||||
Fredrik Orderud
|
||||
Frost Ming
|
||||
Gabriel Curio
|
||||
Gabriel de Perthuis
|
||||
Garry Polley
|
||||
gavin
|
||||
gdanielson
|
||||
Geoffrey Sneddon
|
||||
George Song
|
||||
Georgi Valkov
|
||||
Georgy Pchelkin
|
||||
ghost
|
||||
Giftlin Rajaiah
|
||||
gizmoguy1
|
||||
gkdoc
|
||||
Godefroid Chapelle
|
||||
Gopinath M
|
||||
GOTO Hayato
|
||||
gousaiyang
|
||||
gpiks
|
||||
Greg Roodt
|
||||
Greg Ward
|
||||
Guilherme Espada
|
||||
Guillaume Seguin
|
||||
gutsytechster
|
||||
Guy Rozendorn
|
||||
Guy Tuval
|
||||
gzpan123
|
||||
Hanjun Kim
|
||||
Hari Charan
|
||||
Harsh Vardhan
|
||||
harupy
|
||||
Harutaka Kawamura
|
||||
hauntsaninja
|
||||
Henrich Hartzer
|
||||
Henry Schreiner
|
||||
Herbert Pfennig
|
||||
Holly Stotelmyer
|
||||
Honnix
|
||||
Hsiaoming Yang
|
||||
Hugo Lopes Tavares
|
||||
Hugo van Kemenade
|
||||
Hugues Bruant
|
||||
Hynek Schlawack
|
||||
Ian Bicking
|
||||
Ian Cordasco
|
||||
Ian Lee
|
||||
Ian Stapleton Cordasco
|
||||
Ian Wienand
|
||||
Igor Kuzmitshov
|
||||
Igor Sobreira
|
||||
Ikko Ashimine
|
||||
Ilan Schnell
|
||||
Illia Volochii
|
||||
Ilya Baryshev
|
||||
Inada Naoki
|
||||
Ionel Cristian Mărieș
|
||||
Ionel Maries Cristian
|
||||
Itamar Turner-Trauring
|
||||
Ivan Pozdeev
|
||||
J. Nick Koston
|
||||
Jacob Kim
|
||||
Jacob Walls
|
||||
Jaime Sanz
|
||||
jakirkham
|
||||
Jakub Kuczys
|
||||
Jakub Stasiak
|
||||
Jakub Vysoky
|
||||
Jakub Wilk
|
||||
James Cleveland
|
||||
James Curtin
|
||||
James Firth
|
||||
James Gerity
|
||||
James Polley
|
||||
Jan Pokorný
|
||||
Jannis Leidel
|
||||
Jarek Potiuk
|
||||
jarondl
|
||||
Jason Curtis
|
||||
Jason R. Coombs
|
||||
JasonMo
|
||||
JasonMo1
|
||||
Jay Graves
|
||||
Jean Abou Samra
|
||||
Jean-Christophe Fillion-Robin
|
||||
Jeff Barber
|
||||
Jeff Dairiki
|
||||
Jeff Widman
|
||||
Jelmer Vernooij
|
||||
jenix21
|
||||
Jeremy Fleischman
|
||||
Jeremy Stanley
|
||||
Jeremy Zafran
|
||||
Jesse Rittner
|
||||
Jiashuo Li
|
||||
Jim Fisher
|
||||
Jim Garrison
|
||||
Jinzhe Zeng
|
||||
Jiun Bae
|
||||
Jivan Amara
|
||||
Joe Bylund
|
||||
Joe Michelini
|
||||
John Paton
|
||||
John Sirois
|
||||
John T. Wodder II
|
||||
John-Scott Atlakson
|
||||
johnthagen
|
||||
Jon Banafato
|
||||
Jon Dufresne
|
||||
Jon Parise
|
||||
Jonas Nockert
|
||||
Jonathan Herbert
|
||||
Joonatan Partanen
|
||||
Joost Molenaar
|
||||
Jorge Niedbalski
|
||||
Joseph Bylund
|
||||
Joseph Long
|
||||
Josh Bronson
|
||||
Josh Cannon
|
||||
Josh Hansen
|
||||
Josh Schneier
|
||||
Joshua
|
||||
JoshuaPerdue
|
||||
Juan Luis Cano Rodríguez
|
||||
Juanjo Bazán
|
||||
Judah Rand
|
||||
Julian Berman
|
||||
Julian Gethmann
|
||||
Julien Demoor
|
||||
July Tikhonov
|
||||
Jussi Kukkonen
|
||||
Justin van Heek
|
||||
jwg4
|
||||
Jyrki Pulliainen
|
||||
Kai Chen
|
||||
Kai Mueller
|
||||
Kamal Bin Mustafa
|
||||
Karolina Surma
|
||||
kasium
|
||||
kaustav haldar
|
||||
keanemind
|
||||
Keith Maxwell
|
||||
Kelsey Hightower
|
||||
Kenneth Belitzky
|
||||
Kenneth Reitz
|
||||
Kevin Burke
|
||||
Kevin Carter
|
||||
Kevin Frommelt
|
||||
Kevin R Patterson
|
||||
Kexuan Sun
|
||||
Kit Randel
|
||||
Klaas van Schelven
|
||||
KOLANICH
|
||||
konstin
|
||||
kpinc
|
||||
Krishna Oza
|
||||
Kumar McMillan
|
||||
Kuntal Majumder
|
||||
Kurt McKee
|
||||
Kyle Persohn
|
||||
lakshmanaram
|
||||
Laszlo Kiss-Kollar
|
||||
Laurent Bristiel
|
||||
Laurent LAPORTE
|
||||
Laurie O
|
||||
Laurie Opperman
|
||||
layday
|
||||
Leon Sasson
|
||||
Lev Givon
|
||||
Lincoln de Sousa
|
||||
Lipis
|
||||
lorddavidiii
|
||||
Loren Carvalho
|
||||
Lucas Cimon
|
||||
Ludovic Gasc
|
||||
Luis Medel
|
||||
Lukas Geiger
|
||||
Lukas Juhrich
|
||||
Luke Macken
|
||||
Luo Jiebin
|
||||
luojiebin
|
||||
luz.paz
|
||||
László Kiss Kollár
|
||||
M00nL1ght
|
||||
Marc Abramowitz
|
||||
Marc Tamlyn
|
||||
Marcus Smith
|
||||
Mariatta
|
||||
Mark Kohler
|
||||
Mark McLoughlin
|
||||
Mark Williams
|
||||
Markus Hametner
|
||||
Martey Dodoo
|
||||
Martin Fischer
|
||||
Martin Häcker
|
||||
Martin Pavlasek
|
||||
Masaki
|
||||
Masklinn
|
||||
Matej Stuchlik
|
||||
Mathew Jennings
|
||||
Mathieu Bridon
|
||||
Mathieu Kniewallner
|
||||
Matt Bacchi
|
||||
Matt Good
|
||||
Matt Maker
|
||||
Matt Robenolt
|
||||
Matt Wozniski
|
||||
matthew
|
||||
Matthew Einhorn
|
||||
Matthew Feickert
|
||||
Matthew Gilliard
|
||||
Matthew Hughes
|
||||
Matthew Iversen
|
||||
Matthew Treinish
|
||||
Matthew Trumbell
|
||||
Matthew Willson
|
||||
Matthias Bussonnier
|
||||
mattip
|
||||
Maurits van Rees
|
||||
Max W Chase
|
||||
Maxim Kurnikov
|
||||
Maxime Rouyrre
|
||||
mayeut
|
||||
mbaluna
|
||||
mdebi
|
||||
memoselyk
|
||||
meowmeowcat
|
||||
Michael
|
||||
Michael Aquilina
|
||||
Michael E. Karpeles
|
||||
Michael Klich
|
||||
Michael Mintz
|
||||
Michael Williamson
|
||||
michaelpacer
|
||||
Michał Górny
|
||||
Mickaël Schoentgen
|
||||
Miguel Araujo Perez
|
||||
Mihir Singh
|
||||
Mike
|
||||
Mike Hendricks
|
||||
Min RK
|
||||
MinRK
|
||||
Miro Hrončok
|
||||
Monica Baluna
|
||||
montefra
|
||||
Monty Taylor
|
||||
morotti
|
||||
mrKazzila
|
||||
Muha Ajjan
|
||||
Nadav Wexler
|
||||
Nahuel Ambrosini
|
||||
Nate Coraor
|
||||
Nate Prewitt
|
||||
Nathan Houghton
|
||||
Nathaniel J. Smith
|
||||
Nehal J Wani
|
||||
Neil Botelho
|
||||
Nguyễn Gia Phong
|
||||
Nicholas Serra
|
||||
Nick Coghlan
|
||||
Nick Stenning
|
||||
Nick Timkovich
|
||||
Nicolas Bock
|
||||
Nicole Harris
|
||||
Nikhil Benesch
|
||||
Nikhil Ladha
|
||||
Nikita Chepanov
|
||||
Nikolay Korolev
|
||||
Nipunn Koorapati
|
||||
Nitesh Sharma
|
||||
Niyas Sait
|
||||
Noah
|
||||
Noah Gorny
|
||||
Nowell Strite
|
||||
NtaleGrey
|
||||
nvdv
|
||||
OBITORASU
|
||||
Ofek Lev
|
||||
ofrinevo
|
||||
Oliver Freund
|
||||
Oliver Jeeves
|
||||
Oliver Mannion
|
||||
Oliver Tonnhofer
|
||||
Olivier Girardot
|
||||
Olivier Grisel
|
||||
Ollie Rutherfurd
|
||||
OMOTO Kenji
|
||||
Omry Yadan
|
||||
onlinejudge95
|
||||
Oren Held
|
||||
Oscar Benjamin
|
||||
Oz N Tiram
|
||||
Pachwenko
|
||||
Patrick Dubroy
|
||||
Patrick Jenkins
|
||||
Patrick Lawson
|
||||
patricktokeeffe
|
||||
Patrik Kopkan
|
||||
Paul Ganssle
|
||||
Paul Kehrer
|
||||
Paul Moore
|
||||
Paul Nasrat
|
||||
Paul Oswald
|
||||
Paul van der Linden
|
||||
Paulus Schoutsen
|
||||
Pavel Safronov
|
||||
Pavithra Eswaramoorthy
|
||||
Pawel Jasinski
|
||||
Paweł Szramowski
|
||||
Pekka Klärck
|
||||
Peter Gessler
|
||||
Peter Lisák
|
||||
Peter Shen
|
||||
Peter Waller
|
||||
Petr Viktorin
|
||||
petr-tik
|
||||
Phaneendra Chiruvella
|
||||
Phil Elson
|
||||
Phil Freo
|
||||
Phil Pennock
|
||||
Phil Whelan
|
||||
Philip Jägenstedt
|
||||
Philip Molloy
|
||||
Philippe Ombredanne
|
||||
Pi Delport
|
||||
Pierre-Yves Rofes
|
||||
Pieter Degroote
|
||||
pip
|
||||
Prabakaran Kumaresshan
|
||||
Prabhjyotsing Surjit Singh Sodhi
|
||||
Prabhu Marappan
|
||||
Pradyun Gedam
|
||||
Prashant Sharma
|
||||
Pratik Mallya
|
||||
pre-commit-ci[bot]
|
||||
Preet Thakkar
|
||||
Preston Holmes
|
||||
Przemek Wrzos
|
||||
Pulkit Goyal
|
||||
q0w
|
||||
Qiangning Hong
|
||||
Qiming Xu
|
||||
Quentin Lee
|
||||
Quentin Pradet
|
||||
R. David Murray
|
||||
Rafael Caricio
|
||||
Ralf Schmitt
|
||||
Ran Benita
|
||||
Randy Döring
|
||||
Razzi Abuissa
|
||||
rdb
|
||||
Reece Dunham
|
||||
Remi Rampin
|
||||
Rene Dudfield
|
||||
Riccardo Magliocchetti
|
||||
Riccardo Schirone
|
||||
Richard Jones
|
||||
Richard Si
|
||||
Ricky Ng-Adam
|
||||
Rishi
|
||||
rmorotti
|
||||
RobberPhex
|
||||
Robert Collins
|
||||
Robert McGibbon
|
||||
Robert Pollak
|
||||
Robert T. McGibbon
|
||||
robin elisha robinson
|
||||
Roey Berman
|
||||
Rohan Jain
|
||||
Roman Bogorodskiy
|
||||
Roman Donchenko
|
||||
Romuald Brunet
|
||||
ronaudinho
|
||||
Ronny Pfannschmidt
|
||||
Rory McCann
|
||||
Ross Brattain
|
||||
Roy Wellington Ⅳ
|
||||
Ruairidh MacLeod
|
||||
Russell Keith-Magee
|
||||
Ryan Shepherd
|
||||
Ryan Wooden
|
||||
ryneeverett
|
||||
S. Guliaev
|
||||
Sachi King
|
||||
Salvatore Rinchiera
|
||||
sandeepkiran-js
|
||||
Sander Van Balen
|
||||
Savio Jomton
|
||||
schlamar
|
||||
Scott Kitterman
|
||||
Sean
|
||||
seanj
|
||||
Sebastian Jordan
|
||||
Sebastian Schaetz
|
||||
Segev Finer
|
||||
SeongSoo Cho
|
||||
Sergey Vasilyev
|
||||
Seth Michael Larson
|
||||
Seth Woodworth
|
||||
Shahar Epstein
|
||||
Shantanu
|
||||
shenxianpeng
|
||||
shireenrao
|
||||
Shivansh-007
|
||||
Shixian Sheng
|
||||
Shlomi Fish
|
||||
Shovan Maity
|
||||
Simeon Visser
|
||||
Simon Cross
|
||||
Simon Pichugin
|
||||
sinoroc
|
||||
sinscary
|
||||
snook92
|
||||
socketubs
|
||||
Sorin Sbarnea
|
||||
Srinivas Nyayapati
|
||||
Srishti Hegde
|
||||
Stavros Korokithakis
|
||||
Stefan Scherfke
|
||||
Stefano Rivera
|
||||
Stephan Erb
|
||||
Stephen Rosen
|
||||
stepshal
|
||||
Steve (Gadget) Barnes
|
||||
Steve Barnes
|
||||
Steve Dower
|
||||
Steve Kowalik
|
||||
Steven Myint
|
||||
Steven Silvester
|
||||
stonebig
|
||||
studioj
|
||||
Stéphane Bidoul
|
||||
Stéphane Bidoul (ACSONE)
|
||||
Stéphane Klein
|
||||
Sumana Harihareswara
|
||||
Surbhi Sharma
|
||||
Sviatoslav Sydorenko
|
||||
Sviatoslav Sydorenko (Святослав Сидоренко)
|
||||
Swat009
|
||||
Sylvain
|
||||
Takayuki SHIMIZUKAWA
|
||||
Taneli Hukkinen
|
||||
tbeswick
|
||||
Thiago
|
||||
Thijs Triemstra
|
||||
Thomas Fenzl
|
||||
Thomas Grainger
|
||||
Thomas Guettler
|
||||
Thomas Johansson
|
||||
Thomas Kluyver
|
||||
Thomas Smith
|
||||
Thomas VINCENT
|
||||
Tim D. Smith
|
||||
Tim Gates
|
||||
Tim Harder
|
||||
Tim Heap
|
||||
tim smith
|
||||
tinruufu
|
||||
Tobias Hermann
|
||||
Tom Forbes
|
||||
Tom Freudenheim
|
||||
Tom V
|
||||
Tomas Hrnciar
|
||||
Tomas Orsava
|
||||
Tomer Chachamu
|
||||
Tommi Enenkel | AnB
|
||||
Tomáš Hrnčiar
|
||||
Tony Beswick
|
||||
Tony Narlock
|
||||
Tony Zhaocheng Tan
|
||||
TonyBeswick
|
||||
toonarmycaptain
|
||||
Toshio Kuratomi
|
||||
toxinu
|
||||
Travis Swicegood
|
||||
Tushar Sadhwani
|
||||
Tzu-ping Chung
|
||||
Valentin Haenel
|
||||
Victor Stinner
|
||||
victorvpaulo
|
||||
Vikram - Google
|
||||
Viktor Szépe
|
||||
Ville Skyttä
|
||||
Vinay Sajip
|
||||
Vincent Philippon
|
||||
Vinicyus Macedo
|
||||
Vipul Kumar
|
||||
Vitaly Babiy
|
||||
Vladimir Fokow
|
||||
Vladimir Rutsky
|
||||
W. Trevor King
|
||||
Wil Tan
|
||||
Wilfred Hughes
|
||||
William Edwards
|
||||
William ML Leslie
|
||||
William T Olson
|
||||
William Woodruff
|
||||
Wilson Mo
|
||||
wim glenn
|
||||
Winson Luk
|
||||
Wolfgang Maier
|
||||
Wu Zhenyu
|
||||
XAMES3
|
||||
Xavier Fernandez
|
||||
Xianpeng Shen
|
||||
xoviat
|
||||
xtreak
|
||||
YAMAMOTO Takashi
|
||||
Yen Chi Hsuan
|
||||
Yeray Diaz Diaz
|
||||
Yoval P
|
||||
Yu Jian
|
||||
Yuan Jing Vincent Yan
|
||||
Yusuke Hayashi
|
||||
Zearin
|
||||
Zhiping Deng
|
||||
ziebam
|
||||
Zvezdan Petkovic
|
||||
Łukasz Langa
|
||||
Роман Донченко
|
||||
Семён Марьясин
|
||||
@@ -1,11 +1,10 @@
|
||||
Metadata-Version: 2.1
|
||||
Metadata-Version: 2.2
|
||||
Name: pip
|
||||
Version: 22.2.1
|
||||
Version: 25.0.1
|
||||
Summary: The PyPA recommended tool for installing Python packages.
|
||||
Home-page: https://pip.pypa.io/
|
||||
Author: The pip developers
|
||||
Author-email: distutils-sig@python.org
|
||||
Author-email: The pip developers <distutils-sig@python.org>
|
||||
License: MIT
|
||||
Project-URL: Homepage, https://pip.pypa.io/
|
||||
Project-URL: Documentation, https://pip.pypa.io
|
||||
Project-URL: Source, https://github.com/pypa/pip
|
||||
Project-URL: Changelog, https://pip.pypa.io/en/stable/news/
|
||||
@@ -16,24 +15,35 @@ Classifier: Topic :: Software Development :: Build Tools
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3 :: Only
|
||||
Classifier: Programming Language :: Python :: 3.7
|
||||
Classifier: Programming Language :: Python :: 3.8
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: 3.13
|
||||
Classifier: Programming Language :: Python :: Implementation :: CPython
|
||||
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
||||
Requires-Python: >=3.7
|
||||
Requires-Python: >=3.8
|
||||
Description-Content-Type: text/x-rst
|
||||
License-File: LICENSE.txt
|
||||
License-File: AUTHORS.txt
|
||||
|
||||
pip - The Python Package Installer
|
||||
==================================
|
||||
|
||||
.. image:: https://img.shields.io/pypi/v/pip.svg
|
||||
.. |pypi-version| image:: https://img.shields.io/pypi/v/pip.svg
|
||||
:target: https://pypi.org/project/pip/
|
||||
:alt: PyPI
|
||||
|
||||
.. image:: https://readthedocs.org/projects/pip/badge/?version=latest
|
||||
.. |python-versions| image:: https://img.shields.io/pypi/pyversions/pip
|
||||
:target: https://pypi.org/project/pip
|
||||
:alt: PyPI - Python Version
|
||||
|
||||
.. |docs-badge| image:: https://readthedocs.org/projects/pip/badge/?version=latest
|
||||
:target: https://pip.pypa.io/en/latest
|
||||
:alt: Documentation
|
||||
|
||||
|pypi-version| |python-versions| |docs-badge|
|
||||
|
||||
pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.
|
||||
|
||||
@@ -47,10 +57,6 @@ We release updates regularly, with a new version every 3 months. Find more detai
|
||||
* `Release notes`_
|
||||
* `Release process`_
|
||||
|
||||
In pip 20.3, we've `made a big improvement to the heart of pip`_; `learn more`_. We want your input, so `sign up for our user experience research studies`_ to help us do it right.
|
||||
|
||||
**Note**: pip 21.0, in January 2021, removed Python 2 support, per pip's `Python 2 support policy`_. Please migrate to Python 3.
|
||||
|
||||
If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:
|
||||
|
||||
* `Issue tracking`_
|
||||
@@ -61,7 +67,6 @@ If you want to get involved head over to GitHub to get the source code, look at
|
||||
|
||||
* `GitHub page`_
|
||||
* `Development documentation`_
|
||||
* `Development mailing list`_
|
||||
* `Development IRC`_
|
||||
|
||||
Code of Conduct
|
||||
@@ -78,13 +83,8 @@ rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.
|
||||
.. _Release process: https://pip.pypa.io/en/latest/development/release-process/
|
||||
.. _GitHub page: https://github.com/pypa/pip
|
||||
.. _Development documentation: https://pip.pypa.io/en/latest/development
|
||||
.. _made a big improvement to the heart of pip: https://pyfound.blogspot.com/2020/11/pip-20-3-new-resolver.html
|
||||
.. _learn more: https://pip.pypa.io/en/latest/user_guide/#changes-to-the-pip-dependency-resolver-in-20-3-2020
|
||||
.. _sign up for our user experience research studies: https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html
|
||||
.. _Python 2 support policy: https://pip.pypa.io/en/latest/development/release-process/#python-2-support
|
||||
.. _Issue tracking: https://github.com/pypa/pip/issues
|
||||
.. _Discourse channel: https://discuss.python.org/c/packaging
|
||||
.. _Development mailing list: https://mail.python.org/mailman3/lists/distutils-sig.python.org/
|
||||
.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa
|
||||
.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev
|
||||
.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
|
||||
@@ -0,0 +1,854 @@
|
||||
../../Scripts/pip.exe,sha256=TWiJ5FcJI2RNY2D9Eq2Vpk8aawbkJwUoQGIH4xe81k4,108405
|
||||
../../Scripts/pip3.10.exe,sha256=TWiJ5FcJI2RNY2D9Eq2Vpk8aawbkJwUoQGIH4xe81k4,108405
|
||||
../../Scripts/pip3.exe,sha256=TWiJ5FcJI2RNY2D9Eq2Vpk8aawbkJwUoQGIH4xe81k4,108405
|
||||
pip-25.0.1.dist-info/AUTHORS.txt,sha256=HqzpBVLfT1lBthqQfiDlVeFkg65hJ7ZQvvWhoq-BAsA,11018
|
||||
pip-25.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
pip-25.0.1.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
|
||||
pip-25.0.1.dist-info/METADATA,sha256=T6cxjPMPl523zsRcEsu8K0-IoV8S7vv1mmKR0KA6-SY,3677
|
||||
pip-25.0.1.dist-info/RECORD,,
|
||||
pip-25.0.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip-25.0.1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
||||
pip-25.0.1.dist-info/entry_points.txt,sha256=eeIjuzfnfR2PrhbjnbzFU6MnSS70kZLxwaHHq6M-bD0,87
|
||||
pip-25.0.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
pip/__init__.py,sha256=aKiv_sTe7UbE7qmtCinJutFjqN0MndZQZ1fKLNwFFLE,357
|
||||
pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854
|
||||
pip/__pip-runner__.py,sha256=cPPWuJ6NK_k-GzfvlejLFgwzmYUROmpAR6QC3Q-vkXQ,1450
|
||||
pip/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/__pycache__/__main__.cpython-310.pyc,,
|
||||
pip/__pycache__/__pip-runner__.cpython-310.pyc,,
|
||||
pip/_internal/__init__.py,sha256=MfcoOluDZ8QMCFYal04IqOJ9q6m2V7a0aOsnI-WOxUo,513
|
||||
pip/_internal/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/__pycache__/build_env.cpython-310.pyc,,
|
||||
pip/_internal/__pycache__/cache.cpython-310.pyc,,
|
||||
pip/_internal/__pycache__/configuration.cpython-310.pyc,,
|
||||
pip/_internal/__pycache__/exceptions.cpython-310.pyc,,
|
||||
pip/_internal/__pycache__/main.cpython-310.pyc,,
|
||||
pip/_internal/__pycache__/pyproject.cpython-310.pyc,,
|
||||
pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc,,
|
||||
pip/_internal/__pycache__/wheel_builder.cpython-310.pyc,,
|
||||
pip/_internal/build_env.py,sha256=Dv4UCClSg4uNaal_hL-trg5-zl3Is9CuIDxkChCkXF4,10700
|
||||
pip/_internal/cache.py,sha256=Jb698p5PNigRtpW5o26wQNkkUv4MnQ94mc471wL63A0,10369
|
||||
pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132
|
||||
pip/_internal/cli/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/autocompletion.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/base_command.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/cmdoptions.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/command_context.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/index_command.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/main.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/main_parser.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/parser.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/progress_bars.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/req_command.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/spinners.cpython-310.pyc,,
|
||||
pip/_internal/cli/__pycache__/status_codes.cpython-310.pyc,,
|
||||
pip/_internal/cli/autocompletion.py,sha256=Lli3Mr6aDNu7ZkJJFFvwD2-hFxNI6Avz8OwMyS5TVrs,6865
|
||||
pip/_internal/cli/base_command.py,sha256=NZin6KMzW9NSYzKk4Tc8isb_TQYKR4CKd5j9mSm46PI,8625
|
||||
pip/_internal/cli/cmdoptions.py,sha256=V3BB22F4_v_RkHaZ5onWnszhbBtjYZvNhbn9M0NO0HI,30116
|
||||
pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774
|
||||
pip/_internal/cli/index_command.py,sha256=i_sgNlPmXC5iHUaY-dmmrHKKTgc5O4hWzisr5Al1rr0,5677
|
||||
pip/_internal/cli/main.py,sha256=BDZef-bWe9g9Jpr4OVs4dDf-845HJsKw835T7AqEnAc,2817
|
||||
pip/_internal/cli/main_parser.py,sha256=laDpsuBDl6kyfywp9eMMA9s84jfH2TJJn-vmL0GG90w,4338
|
||||
pip/_internal/cli/parser.py,sha256=VCMtduzECUV87KaHNu-xJ-wLNL82yT3x16V4XBxOAqI,10825
|
||||
pip/_internal/cli/progress_bars.py,sha256=9GcgusWtwfqou2zhAQp1XNbQHIDslqyyz9UwLzw7Jgc,2717
|
||||
pip/_internal/cli/req_command.py,sha256=DqeFhmUMs6o6Ev8qawAcOoYNdAZsfyKS0MZI5jsJYwQ,12250
|
||||
pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118
|
||||
pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116
|
||||
pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882
|
||||
pip/_internal/commands/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/cache.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/check.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/completion.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/configuration.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/debug.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/download.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/freeze.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/hash.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/help.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/index.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/inspect.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/install.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/list.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/search.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/show.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/uninstall.cpython-310.pyc,,
|
||||
pip/_internal/commands/__pycache__/wheel.cpython-310.pyc,,
|
||||
pip/_internal/commands/cache.py,sha256=IOezTicHjGE5sWdBx2nwPVgbjuJHM3s-BZEkpZLemuY,8107
|
||||
pip/_internal/commands/check.py,sha256=Hr_4eiMd9cgVDgEvjtIdw915NmL7ROIWW8enkr8slPQ,2268
|
||||
pip/_internal/commands/completion.py,sha256=HT4lD0bgsflHq2IDgYfiEdp7IGGtE7s6MgI3xn0VQEw,4287
|
||||
pip/_internal/commands/configuration.py,sha256=n98enwp6y0b5G6fiRQjaZo43FlJKYve_daMhN-4BRNc,9766
|
||||
pip/_internal/commands/debug.py,sha256=DNDRgE9YsKrbYzU0s3VKi8rHtKF4X13CJ_br_8PUXO0,6797
|
||||
pip/_internal/commands/download.py,sha256=0qB0nys6ZEPsog451lDsjL5Bx7Z97t-B80oFZKhpzKM,5273
|
||||
pip/_internal/commands/freeze.py,sha256=2Vt72BYTSm9rzue6d8dNzt8idxWK4Db6Hd-anq7GQ80,3203
|
||||
pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703
|
||||
pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132
|
||||
pip/_internal/commands/index.py,sha256=RAXxmJwFhVb5S1BYzb5ifX3sn9Na8v2CCVYwSMP8pao,4731
|
||||
pip/_internal/commands/inspect.py,sha256=PGrY9TRTRCM3y5Ml8Bdk8DEOXquWRfscr4DRo1LOTPc,3189
|
||||
pip/_internal/commands/install.py,sha256=r3yHQUxvxt7gD5j9n6zRDslAvtx9CT_whLuQJcktp6M,29390
|
||||
pip/_internal/commands/list.py,sha256=oiIzSjLP6__d7dIS3q0Xb5ywsaOThBWRqMyjjKzkPdM,12769
|
||||
pip/_internal/commands/search.py,sha256=fWkUQVx_gm8ebbFAlCgqtxKXT9rNahpJ-BI__3HNZpg,5626
|
||||
pip/_internal/commands/show.py,sha256=0YBhCga3PAd81vT3l7UWflktSpB5-aYqQcJxBVPazVM,7857
|
||||
pip/_internal/commands/uninstall.py,sha256=7pOR7enK76gimyxQbzxcG1OsyLXL3DvX939xmM8Fvtg,3892
|
||||
pip/_internal/commands/wheel.py,sha256=eJRhr_qoNNxWAkkdJCNiQM7CXd4E1_YyQhsqJnBPGGg,6414
|
||||
pip/_internal/configuration.py,sha256=-KOok6jh3hFzXMPQFPJ1_EFjBpAsge-RSreQuLHLmzo,14005
|
||||
pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858
|
||||
pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/distributions/__pycache__/base.cpython-310.pyc,,
|
||||
pip/_internal/distributions/__pycache__/installed.cpython-310.pyc,,
|
||||
pip/_internal/distributions/__pycache__/sdist.cpython-310.pyc,,
|
||||
pip/_internal/distributions/__pycache__/wheel.cpython-310.pyc,,
|
||||
pip/_internal/distributions/base.py,sha256=QeB9qvKXDIjLdPBDE5fMgpfGqMMCr-govnuoQnGuiF8,1783
|
||||
pip/_internal/distributions/installed.py,sha256=QinHFbWAQ8oE0pbD8MFZWkwlnfU1QYTccA1vnhrlYOU,842
|
||||
pip/_internal/distributions/sdist.py,sha256=PlcP4a6-R6c98XnOM-b6Lkb3rsvh9iG4ok8shaanrzs,6751
|
||||
pip/_internal/distributions/wheel.py,sha256=THBYfnv7VVt8mYhMYUtH13S1E7FDwtDyDfmUcl8ai0E,1317
|
||||
pip/_internal/exceptions.py,sha256=2_byISIv3kSnI_9T-Esfxrt0LnTRgcUHyxu0twsHjQY,26481
|
||||
pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30
|
||||
pip/_internal/index/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/index/__pycache__/collector.cpython-310.pyc,,
|
||||
pip/_internal/index/__pycache__/package_finder.cpython-310.pyc,,
|
||||
pip/_internal/index/__pycache__/sources.cpython-310.pyc,,
|
||||
pip/_internal/index/collector.py,sha256=RdPO0JLAlmyBWPAWYHPyRoGjz3GNAeTngCNkbGey_mE,16265
|
||||
pip/_internal/index/package_finder.py,sha256=mJHAljlHeHuclyuxtjvBZO6DtovKjsZjF_tCh_wux5E,38076
|
||||
pip/_internal/index/sources.py,sha256=lPBLK5Xiy8Q6IQMio26Wl7ocfZOKkgGklIBNyUJ23fI,8632
|
||||
pip/_internal/locations/__init__.py,sha256=UaAxeZ_f93FyouuFf4p7SXYF-4WstXuEvd3LbmPCAno,14925
|
||||
pip/_internal/locations/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/locations/__pycache__/_distutils.cpython-310.pyc,,
|
||||
pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc,,
|
||||
pip/_internal/locations/__pycache__/base.cpython-310.pyc,,
|
||||
pip/_internal/locations/_distutils.py,sha256=x6nyVLj7X11Y4khIdf-mFlxMl2FWadtVEgeb8upc_WI,6013
|
||||
pip/_internal/locations/_sysconfig.py,sha256=IGzds60qsFneRogC-oeBaY7bEh3lPt_v47kMJChQXsU,7724
|
||||
pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556
|
||||
pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340
|
||||
pip/_internal/metadata/__init__.py,sha256=CU8jK1TZso7jOLdr0sX9xDjrcs5iy8d7IRK-hvaIO5Y,4337
|
||||
pip/_internal/metadata/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/metadata/__pycache__/_json.cpython-310.pyc,,
|
||||
pip/_internal/metadata/__pycache__/base.cpython-310.pyc,,
|
||||
pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc,,
|
||||
pip/_internal/metadata/_json.py,sha256=ezrIYazHCINM2QUk1eA9wEAMj3aeGWeDVgGalgUzKpc,2707
|
||||
pip/_internal/metadata/base.py,sha256=ft0K5XNgI4ETqZnRv2-CtvgYiMOMAeGMAzxT-f6VLJA,25298
|
||||
pip/_internal/metadata/importlib/__init__.py,sha256=jUUidoxnHcfITHHaAWG1G2i5fdBYklv_uJcjo2x7VYE,135
|
||||
pip/_internal/metadata/importlib/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/metadata/importlib/__pycache__/_compat.cpython-310.pyc,,
|
||||
pip/_internal/metadata/importlib/__pycache__/_dists.cpython-310.pyc,,
|
||||
pip/_internal/metadata/importlib/__pycache__/_envs.cpython-310.pyc,,
|
||||
pip/_internal/metadata/importlib/_compat.py,sha256=c6av8sP8BBjAZuFSJow1iWfygUXNM3xRTCn5nqw6B9M,2796
|
||||
pip/_internal/metadata/importlib/_dists.py,sha256=ftmYiyfUGUIjnVwt6W-Ijsimy5c28KgmXly5Q5IQ2P4,8279
|
||||
pip/_internal/metadata/importlib/_envs.py,sha256=UUB980XSrDWrMpQ1_G45i0r8Hqlg_tg3IPQ63mEqbNc,7431
|
||||
pip/_internal/metadata/pkg_resources.py,sha256=U07ETAINSGeSRBfWUG93E4tZZbaW_f7PGzEqZN0hulc,10542
|
||||
pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63
|
||||
pip/_internal/models/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/candidate.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/direct_url.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/format_control.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/index.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/installation_report.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/link.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/scheme.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/search_scope.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/selection_prefs.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/target_python.cpython-310.pyc,,
|
||||
pip/_internal/models/__pycache__/wheel.cpython-310.pyc,,
|
||||
pip/_internal/models/candidate.py,sha256=zzgFRuw_kWPjKpGw7LC0ZUMD2CQ2EberUIYs8izjdCA,753
|
||||
pip/_internal/models/direct_url.py,sha256=uBtY2HHd3TO9cKQJWh0ThvE5FRr-MWRYChRU4IG9HZE,6578
|
||||
pip/_internal/models/format_control.py,sha256=wtsQqSK9HaUiNxQEuB-C62eVimw6G4_VQFxV9-_KDBE,2486
|
||||
pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030
|
||||
pip/_internal/models/installation_report.py,sha256=zRVZoaz-2vsrezj_H3hLOhMZCK9c7TbzWgC-jOalD00,2818
|
||||
pip/_internal/models/link.py,sha256=GQ8hq7x-FDFPv25Nbn2veIM-MlBrGZDGLd7aZeF4Xrg,21448
|
||||
pip/_internal/models/scheme.py,sha256=PakmHJM3e8OOWSZFtfz1Az7f1meONJnkGuQxFlt3wBE,575
|
||||
pip/_internal/models/search_scope.py,sha256=67NEnsYY84784S-MM7ekQuo9KXLH-7MzFntXjapvAo0,4531
|
||||
pip/_internal/models/selection_prefs.py,sha256=qaFfDs3ciqoXPg6xx45N1jPLqccLJw4N0s4P0PyHTQ8,2015
|
||||
pip/_internal/models/target_python.py,sha256=2XaH2rZ5ZF-K5wcJbEMGEl7SqrTToDDNkrtQ2v_v_-Q,4271
|
||||
pip/_internal/models/wheel.py,sha256=G7dND_s4ebPkEL7RJ1qCY0QhUUWIIK6AnjWgRATF5no,4539
|
||||
pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50
|
||||
pip/_internal/network/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/network/__pycache__/auth.cpython-310.pyc,,
|
||||
pip/_internal/network/__pycache__/cache.cpython-310.pyc,,
|
||||
pip/_internal/network/__pycache__/download.cpython-310.pyc,,
|
||||
pip/_internal/network/__pycache__/lazy_wheel.cpython-310.pyc,,
|
||||
pip/_internal/network/__pycache__/session.cpython-310.pyc,,
|
||||
pip/_internal/network/__pycache__/utils.cpython-310.pyc,,
|
||||
pip/_internal/network/__pycache__/xmlrpc.cpython-310.pyc,,
|
||||
pip/_internal/network/auth.py,sha256=D4gASjUrqoDFlSt6gQ767KAAjv6PUyJU0puDlhXNVRE,20809
|
||||
pip/_internal/network/cache.py,sha256=0yGMA3Eet59xBSLtbPAenvI53dl29oUOeqZ2c0QL2Ss,4614
|
||||
pip/_internal/network/download.py,sha256=FLOP29dPYECBiAi7eEjvAbNkyzaKNqbyjOT2m8HPW8U,6048
|
||||
pip/_internal/network/lazy_wheel.py,sha256=PBdoMoNQQIA84Fhgne38jWF52W4x_KtsHjxgv4dkRKA,7622
|
||||
pip/_internal/network/session.py,sha256=msM4es16LmmNEYNkrYyg8fTc7gAHbKFltawfKP27LOI,18771
|
||||
pip/_internal/network/utils.py,sha256=Inaxel-NxBu4PQWkjyErdnfewsFCcgHph7dzR1-FboY,4088
|
||||
pip/_internal/network/xmlrpc.py,sha256=sAxzOacJ-N1NXGPvap9jC3zuYWSnnv3GXtgR2-E2APA,1838
|
||||
pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_internal/operations/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/operations/__pycache__/check.cpython-310.pyc,,
|
||||
pip/_internal/operations/__pycache__/freeze.cpython-310.pyc,,
|
||||
pip/_internal/operations/__pycache__/prepare.cpython-310.pyc,,
|
||||
pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_internal/operations/build/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/operations/build/__pycache__/build_tracker.cpython-310.pyc,,
|
||||
pip/_internal/operations/build/__pycache__/metadata.cpython-310.pyc,,
|
||||
pip/_internal/operations/build/__pycache__/metadata_editable.cpython-310.pyc,,
|
||||
pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-310.pyc,,
|
||||
pip/_internal/operations/build/__pycache__/wheel.cpython-310.pyc,,
|
||||
pip/_internal/operations/build/__pycache__/wheel_editable.cpython-310.pyc,,
|
||||
pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-310.pyc,,
|
||||
pip/_internal/operations/build/build_tracker.py,sha256=-ARW_TcjHCOX7D2NUOGntB4Fgc6b4aolsXkAK6BWL7w,4774
|
||||
pip/_internal/operations/build/metadata.py,sha256=9S0CUD8U3QqZeXp-Zyt8HxwU90lE4QrnYDgrqZDzBnc,1422
|
||||
pip/_internal/operations/build/metadata_editable.py,sha256=xlAwcP9q_8_fmv_3I39w9EZ7SQV9hnJZr9VuTsq2Y68,1510
|
||||
pip/_internal/operations/build/metadata_legacy.py,sha256=8i6i1QZX9m_lKPStEFsHKM0MT4a-CD408JOw99daLmo,2190
|
||||
pip/_internal/operations/build/wheel.py,sha256=sT12FBLAxDC6wyrDorh8kvcZ1jG5qInCRWzzP-UkJiQ,1075
|
||||
pip/_internal/operations/build/wheel_editable.py,sha256=yOtoH6zpAkoKYEUtr8FhzrYnkNHQaQBjWQ2HYae1MQg,1417
|
||||
pip/_internal/operations/build/wheel_legacy.py,sha256=K-6kNhmj-1xDF45ny1yheMerF0ui4EoQCLzEoHh6-tc,3045
|
||||
pip/_internal/operations/check.py,sha256=L24vRL8VWbyywdoeAhM89WCd8zLTnjIbULlKelUgIec,5912
|
||||
pip/_internal/operations/freeze.py,sha256=1_M79jAQKnCxWr-KCCmHuVXOVFGaUJHmoWLfFzgh7K4,9843
|
||||
pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51
|
||||
pip/_internal/operations/install/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/operations/install/__pycache__/editable_legacy.cpython-310.pyc,,
|
||||
pip/_internal/operations/install/__pycache__/wheel.cpython-310.pyc,,
|
||||
pip/_internal/operations/install/editable_legacy.py,sha256=PoEsNEPGbIZ2yQphPsmYTKLOCMs4gv5OcCdzW124NcA,1283
|
||||
pip/_internal/operations/install/wheel.py,sha256=X5Iz9yUg5LlK5VNQ9g2ikc6dcRu8EPi_SUi5iuEDRgo,27615
|
||||
pip/_internal/operations/prepare.py,sha256=joWJwPkuqGscQgVNImLK71e9hRapwKvRCM8HclysmvU,28118
|
||||
pip/_internal/pyproject.py,sha256=GLJ6rWRS5_2noKdajohoLyDty57Z7QXhcUAYghmTnWc,7286
|
||||
pip/_internal/req/__init__.py,sha256=HxBFtZy_BbCclLgr26waMtpzYdO5T3vxePvpGAXSt5s,2653
|
||||
pip/_internal/req/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/req/__pycache__/constructors.cpython-310.pyc,,
|
||||
pip/_internal/req/__pycache__/req_file.cpython-310.pyc,,
|
||||
pip/_internal/req/__pycache__/req_install.cpython-310.pyc,,
|
||||
pip/_internal/req/__pycache__/req_set.cpython-310.pyc,,
|
||||
pip/_internal/req/__pycache__/req_uninstall.cpython-310.pyc,,
|
||||
pip/_internal/req/constructors.py,sha256=v1qzCN1mIldwx-nCrPc8JO4lxkm3Fv8M5RWvt8LISjc,18430
|
||||
pip/_internal/req/req_file.py,sha256=eys82McgaICOGic2UZRHjD720piKJPwmeSYdXlWwl6w,20234
|
||||
pip/_internal/req/req_install.py,sha256=BMptxHYg2uG_b-7HFEULPb3nuw0FMAbuea8zTq2rE7w,35786
|
||||
pip/_internal/req/req_set.py,sha256=j3esG0s6SzoVReX9rWn4rpYNtyET_fwxbwJPRimvRxo,2858
|
||||
pip/_internal/req/req_uninstall.py,sha256=qzDIxJo-OETWqGais7tSMCDcWbATYABT-Tid3ityF0s,23853
|
||||
pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_internal/resolution/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/resolution/__pycache__/base.cpython-310.pyc,,
|
||||
pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583
|
||||
pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_internal/resolution/legacy/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/resolution/legacy/__pycache__/resolver.cpython-310.pyc,,
|
||||
pip/_internal/resolution/legacy/resolver.py,sha256=3HZiJBRd1FTN6jQpI4qRO8-TbLYeIbUTS6PFvXnXs2w,24068
|
||||
pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/resolution/resolvelib/__pycache__/base.cpython-310.pyc,,
|
||||
pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-310.pyc,,
|
||||
pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-310.pyc,,
|
||||
pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-310.pyc,,
|
||||
pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-310.pyc,,
|
||||
pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-310.pyc,,
|
||||
pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-310.pyc,,
|
||||
pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-310.pyc,,
|
||||
pip/_internal/resolution/resolvelib/base.py,sha256=DCf669FsqyQY5uqXeePDHQY1e4QO-pBzWH8O0s9-K94,5023
|
||||
pip/_internal/resolution/resolvelib/candidates.py,sha256=5UZ1upNnmqsP-nmEZaDYxaBgCoejw_e2WVGmmAvBxXc,20001
|
||||
pip/_internal/resolution/resolvelib/factory.py,sha256=MJOLSZJY8_28PPdcutoQ6gjJ_1eBDt6Z1edtfTJyR4E,32659
|
||||
pip/_internal/resolution/resolvelib/found_candidates.py,sha256=9hrTyQqFvl9I7Tji79F1AxHv39Qh1rkJ_7deSHSMfQc,6383
|
||||
pip/_internal/resolution/resolvelib/provider.py,sha256=bcsFnYvlmtB80cwVdW1fIwgol8ZNr1f1VHyRTkz47SM,9935
|
||||
pip/_internal/resolution/resolvelib/reporter.py,sha256=00JtoXEkTlw0-rl_sl54d71avwOsJHt9GGHcrj5Sza0,3168
|
||||
pip/_internal/resolution/resolvelib/requirements.py,sha256=7JG4Z72e5Yk4vU0S5ulGvbqTy4FMQGYhY5zQhX9zTtY,8065
|
||||
pip/_internal/resolution/resolvelib/resolver.py,sha256=nLJOsVMEVi2gQUVJoUFKMZAeu2f7GRMjGMvNSWyz0Bc,12592
|
||||
pip/_internal/self_outdated_check.py,sha256=1PFtttvLAeyCVR3tPoBq2sOlPD0IJ-KSqU6bc1HUk9c,8318
|
||||
pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_internal/utils/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/_jaraco_text.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/_log.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/appdirs.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/compat.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/compatibility_tags.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/datetime.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/deprecation.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/direct_url_helpers.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/egg_link.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/entrypoints.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/filesystem.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/filetypes.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/glibc.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/hashes.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/logging.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/misc.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/packaging.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/retry.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/setuptools_build.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/subprocess.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/temp_dir.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/unpacking.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/urls.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/virtualenv.cpython-310.pyc,,
|
||||
pip/_internal/utils/__pycache__/wheel.cpython-310.pyc,,
|
||||
pip/_internal/utils/_jaraco_text.py,sha256=M15uUPIh5NpP1tdUGBxRau6q1ZAEtI8-XyLEETscFfE,3350
|
||||
pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015
|
||||
pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklAo,1665
|
||||
pip/_internal/utils/compat.py,sha256=ckkFveBiYQjRWjkNsajt_oWPS57tJvE8XxoC4OIYgCY,2399
|
||||
pip/_internal/utils/compatibility_tags.py,sha256=OWq5axHpW-MEEPztGdvgADrgJPAcV9a88Rxm4Z8VBs8,6272
|
||||
pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242
|
||||
pip/_internal/utils/deprecation.py,sha256=k7Qg_UBAaaTdyq82YVARA6D7RmcGTXGv7fnfcgigj4Q,3707
|
||||
pip/_internal/utils/direct_url_helpers.py,sha256=r2MRtkVDACv9AGqYODBUC9CjwgtsUU1s68hmgfCJMtA,3196
|
||||
pip/_internal/utils/egg_link.py,sha256=0FePZoUYKv4RGQ2t6x7w5Z427wbA_Uo3WZnAkrgsuqo,2463
|
||||
pip/_internal/utils/entrypoints.py,sha256=YlhLTRl2oHBAuqhc-zmL7USS67TPWVHImjeAQHreZTQ,3064
|
||||
pip/_internal/utils/filesystem.py,sha256=ajvA-q4ocliW9kPp8Yquh-4vssXbu-UKbo5FV9V4X64,4950
|
||||
pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716
|
||||
pip/_internal/utils/glibc.py,sha256=vUkWq_1pJuzcYNcGKLlQmABoUiisK8noYY1yc8Wq4w4,3734
|
||||
pip/_internal/utils/hashes.py,sha256=XGGLL0AG8-RhWnyz87xF6MFZ--BKadHU35D47eApCKI,4972
|
||||
pip/_internal/utils/logging.py,sha256=ONfbrhaD248akkosK79if97n20EABxwjOxp5dE5RCRY,11845
|
||||
pip/_internal/utils/misc.py,sha256=DWnYxBUItjRp7hhxEg4ih6P6YpKrykM86dbi_EcU8SQ,23450
|
||||
pip/_internal/utils/packaging.py,sha256=cm-X_0HVHV_jRwUVZh6AuEWqSitzf8EpaJ7Uv2UGu6A,2142
|
||||
pip/_internal/utils/retry.py,sha256=mhFbykXjhTnZfgzeuy-vl9c8nECnYn_CMtwNJX2tYzQ,1392
|
||||
pip/_internal/utils/setuptools_build.py,sha256=ouXpud-jeS8xPyTPsXJ-m34NPvK5os45otAzdSV_IJE,4435
|
||||
pip/_internal/utils/subprocess.py,sha256=EsvqSRiSMHF98T8Txmu6NLU3U--MpTTQjtNgKP0P--M,8988
|
||||
pip/_internal/utils/temp_dir.py,sha256=5qOXe8M4JeY6vaFQM867d5zkp1bSwMZ-KT5jymmP0Zg,9310
|
||||
pip/_internal/utils/unpacking.py,sha256=_gVdyzTRDMYktpnYljn4OoxrZTtMCf4xknSm4rK0WaA,11967
|
||||
pip/_internal/utils/urls.py,sha256=qceSOZb5lbNDrHNsv7_S4L4Ytszja5NwPKUMnZHbYnM,1599
|
||||
pip/_internal/utils/virtualenv.py,sha256=S6f7csYorRpiD6cvn3jISZYc3I8PJC43H5iMFpRAEDU,3456
|
||||
pip/_internal/utils/wheel.py,sha256=b442jkydFHjXzDy6cMR7MpzWBJ1Q82hR5F33cmcHV3g,4494
|
||||
pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596
|
||||
pip/_internal/vcs/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_internal/vcs/__pycache__/bazaar.cpython-310.pyc,,
|
||||
pip/_internal/vcs/__pycache__/git.cpython-310.pyc,,
|
||||
pip/_internal/vcs/__pycache__/mercurial.cpython-310.pyc,,
|
||||
pip/_internal/vcs/__pycache__/subversion.cpython-310.pyc,,
|
||||
pip/_internal/vcs/__pycache__/versioncontrol.cpython-310.pyc,,
|
||||
pip/_internal/vcs/bazaar.py,sha256=EKStcQaKpNu0NK4p5Q10Oc4xb3DUxFw024XrJy40bFQ,3528
|
||||
pip/_internal/vcs/git.py,sha256=3tpc9LQA_J4IVW5r5NvWaaSeDzcmJOrSFZN0J8vIKfU,18177
|
||||
pip/_internal/vcs/mercurial.py,sha256=oULOhzJ2Uie-06d1omkL-_Gc6meGaUkyogvqG9ZCyPs,5249
|
||||
pip/_internal/vcs/subversion.py,sha256=ddTugHBqHzV3ebKlU5QXHPN4gUqlyXbOx8q8NgXKvs8,11735
|
||||
pip/_internal/vcs/versioncontrol.py,sha256=cvf_-hnTAjQLXJ3d17FMNhQfcO1AcKWUF10tfrYyP-c,22440
|
||||
pip/_internal/wheel_builder.py,sha256=DL3A8LKeRj_ACp11WS5wSgASgPFqeyAeXJKdXfmaWXU,11799
|
||||
pip/_vendor/__init__.py,sha256=JYuAXvClhInxIrA2FTp5p-uuWVL7WV6-vEpTs46-Qh4,4873
|
||||
pip/_vendor/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/__pycache__/typing_extensions.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/__init__.py,sha256=LMC5CBe94ZRL5xhlzwyPDmHXvBD0p7lT4R3Z73D6a_I,677
|
||||
pip/_vendor/cachecontrol/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/__pycache__/adapter.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/__pycache__/cache.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/__pycache__/controller.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/__pycache__/serialize.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/_cmd.py,sha256=iist2EpzJvDVIhMAxXq8iFnTBsiZAd6iplxfmNboNyk,1737
|
||||
pip/_vendor/cachecontrol/adapter.py,sha256=febjY4LV87iiCIK3jcl8iH58iaSA7b9WkovsByIDK0Y,6348
|
||||
pip/_vendor/cachecontrol/cache.py,sha256=OXwv7Fn2AwnKNiahJHnjtvaKLndvVLv_-zO-ltlV9qI,1953
|
||||
pip/_vendor/cachecontrol/caches/__init__.py,sha256=dtrrroK5BnADR1GWjCZ19aZ0tFsMfvFBtLQQU1sp_ag,303
|
||||
pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-310.pyc,,
|
||||
pip/_vendor/cachecontrol/caches/file_cache.py,sha256=b7oMgsRSqPmEsonVJw6uFEYUlFgD6GF8TyacOGG1x3M,5399
|
||||
pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=9rmqwtYu_ljVkW6_oLqbC7EaX_a8YT_yLuna-eS0dgo,1386
|
||||
pip/_vendor/cachecontrol/controller.py,sha256=glbPj2iZlGqdBg8z09D2DtQOzoOGXnWvy7K2LEyBsEQ,18576
|
||||
pip/_vendor/cachecontrol/filewrapper.py,sha256=2ktXNPE0KqnyzF24aOsKCA58HQq1xeC6l2g6_zwjghc,4291
|
||||
pip/_vendor/cachecontrol/heuristics.py,sha256=gqMXU8w0gQuEQiSdu3Yg-0vd9kW7nrWKbLca75rheGE,4881
|
||||
pip/_vendor/cachecontrol/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/cachecontrol/serialize.py,sha256=HQd2IllQ05HzPkVLMXTF2uX5mjEQjDBkxCqUJUODpZk,5163
|
||||
pip/_vendor/cachecontrol/wrapper.py,sha256=hsGc7g8QGQTT-4f8tgz3AM5qwScg6FO0BSdLSRdEvpU,1417
|
||||
pip/_vendor/certifi/__init__.py,sha256=p_GYZrjUwPBUhpLlCZoGb0miKBKSqDAyZC5DvIuqbHQ,94
|
||||
pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255
|
||||
pip/_vendor/certifi/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/certifi/__pycache__/__main__.cpython-310.pyc,,
|
||||
pip/_vendor/certifi/__pycache__/core.cpython-310.pyc,,
|
||||
pip/_vendor/certifi/cacert.pem,sha256=lO3rZukXdPyuk6BWUJFOKQliWaXH6HGh9l1GGrUgG0c,299427
|
||||
pip/_vendor/certifi/core.py,sha256=2SRT5rIcQChFDbe37BQa-kULxAgJ8qN6l1jfqTp4HIs,4486
|
||||
pip/_vendor/certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/distlib/__init__.py,sha256=dcwgYGYGQqAEawBXPDtIx80DO_3cOmFv8HTc8JMzknQ,625
|
||||
pip/_vendor/distlib/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/compat.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/database.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/index.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/locators.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/manifest.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/markers.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/metadata.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/resources.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/scripts.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/util.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/version.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/__pycache__/wheel.cpython-310.pyc,,
|
||||
pip/_vendor/distlib/compat.py,sha256=2jRSjRI4o-vlXeTK2BCGIUhkc6e9ZGhSsacRM5oseTw,41467
|
||||
pip/_vendor/distlib/database.py,sha256=mHy_LxiXIsIVRb-T0-idBrVLw3Ffij5teHCpbjmJ9YU,51160
|
||||
pip/_vendor/distlib/index.py,sha256=lTbw268rRhj8dw1sib3VZ_0EhSGgoJO3FKJzSFMOaeA,20797
|
||||
pip/_vendor/distlib/locators.py,sha256=oBeAZpFuPQSY09MgNnLfQGGAXXvVO96BFpZyKMuK4tM,51026
|
||||
pip/_vendor/distlib/manifest.py,sha256=3qfmAmVwxRqU1o23AlfXrQGZzh6g_GGzTAP_Hb9C5zQ,14168
|
||||
pip/_vendor/distlib/markers.py,sha256=X6sDvkFGcYS8gUW8hfsWuKEKAqhQZAJ7iXOMLxRYjYk,5164
|
||||
pip/_vendor/distlib/metadata.py,sha256=zil3sg2EUfLXVigljY2d_03IJt-JSs7nX-73fECMX2s,38724
|
||||
pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820
|
||||
pip/_vendor/distlib/scripts.py,sha256=BJliaDAZaVB7WAkwokgC3HXwLD2iWiHaVI50H7C6eG8,18608
|
||||
pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792
|
||||
pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784
|
||||
pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032
|
||||
pip/_vendor/distlib/util.py,sha256=vMPGvsS4j9hF6Y9k3Tyom1aaHLb0rFmZAEyzeAdel9w,66682
|
||||
pip/_vendor/distlib/version.py,sha256=s5VIs8wBn0fxzGxWM_aA2ZZyx525HcZbMvcTlTyZ3Rg,23727
|
||||
pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648
|
||||
pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448
|
||||
pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888
|
||||
pip/_vendor/distlib/wheel.py,sha256=DFIVguEQHCdxnSdAO0dfFsgMcvVZitg7bCOuLwZ7A_s,43979
|
||||
pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981
|
||||
pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64
|
||||
pip/_vendor/distro/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/distro/__pycache__/__main__.cpython-310.pyc,,
|
||||
pip/_vendor/distro/__pycache__/distro.cpython-310.pyc,,
|
||||
pip/_vendor/distro/distro.py,sha256=XqbefacAhDT4zr_trnbA15eY8vdK4GTghgmvUGrEM_4,49430
|
||||
pip/_vendor/distro/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/idna/__init__.py,sha256=MPqNDLZbXqGaNdXxAFhiqFPKEQXju2jNQhCey6-5eJM,868
|
||||
pip/_vendor/idna/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/idna/__pycache__/codec.cpython-310.pyc,,
|
||||
pip/_vendor/idna/__pycache__/compat.cpython-310.pyc,,
|
||||
pip/_vendor/idna/__pycache__/core.cpython-310.pyc,,
|
||||
pip/_vendor/idna/__pycache__/idnadata.cpython-310.pyc,,
|
||||
pip/_vendor/idna/__pycache__/intranges.cpython-310.pyc,,
|
||||
pip/_vendor/idna/__pycache__/package_data.cpython-310.pyc,,
|
||||
pip/_vendor/idna/__pycache__/uts46data.cpython-310.pyc,,
|
||||
pip/_vendor/idna/codec.py,sha256=PEew3ItwzjW4hymbasnty2N2OXvNcgHB-JjrBuxHPYY,3422
|
||||
pip/_vendor/idna/compat.py,sha256=RzLy6QQCdl9784aFhb2EX9EKGCJjg0P3PilGdeXXcx8,316
|
||||
pip/_vendor/idna/core.py,sha256=YJYyAMnwiQEPjVC4-Fqu_p4CJ6yKKuDGmppBNQNQpFs,13239
|
||||
pip/_vendor/idna/idnadata.py,sha256=W30GcIGvtOWYwAjZj4ZjuouUutC6ffgNuyjJy7fZ-lo,78306
|
||||
pip/_vendor/idna/intranges.py,sha256=amUtkdhYcQG8Zr-CoMM_kVRacxkivC1WgxN1b63KKdU,1898
|
||||
pip/_vendor/idna/package_data.py,sha256=q59S3OXsc5VI8j6vSD0sGBMyk6zZ4vWFREE88yCJYKs,21
|
||||
pip/_vendor/idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/idna/uts46data.py,sha256=rt90K9J40gUSwppDPCrhjgi5AA6pWM65dEGRSf6rIhM,239289
|
||||
pip/_vendor/msgpack/__init__.py,sha256=reRaiOtEzSjPnr7TpxjgIvbfln5pV66FhricAs2eC-g,1109
|
||||
pip/_vendor/msgpack/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/msgpack/__pycache__/exceptions.cpython-310.pyc,,
|
||||
pip/_vendor/msgpack/__pycache__/ext.cpython-310.pyc,,
|
||||
pip/_vendor/msgpack/__pycache__/fallback.cpython-310.pyc,,
|
||||
pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081
|
||||
pip/_vendor/msgpack/ext.py,sha256=kteJv03n9tYzd5oo3xYopVTo4vRaAxonBQQJhXohZZo,5726
|
||||
pip/_vendor/msgpack/fallback.py,sha256=0g1Pzp0vtmBEmJ5w9F3s_-JMVURP8RS4G1cc5TRaAsI,32390
|
||||
pip/_vendor/packaging/__init__.py,sha256=dk4Ta_vmdVJxYHDcfyhvQNw8V3PgSBomKNXqg-D2JDY,494
|
||||
pip/_vendor/packaging/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/_elffile.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/_manylinux.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/_musllinux.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/_parser.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/_structures.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/_tokenizer.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/markers.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/metadata.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/requirements.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/tags.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/utils.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/__pycache__/version.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/_elffile.py,sha256=cflAQAkE25tzhYmq_aCi72QfbT_tn891tPzfpbeHOwE,3306
|
||||
pip/_vendor/packaging/_manylinux.py,sha256=vl5OCoz4kx80H5rwXKeXWjl9WNISGmr4ZgTpTP9lU9c,9612
|
||||
pip/_vendor/packaging/_musllinux.py,sha256=p9ZqNYiOItGee8KcZFeHF_YcdhVwGHdK6r-8lgixvGQ,2694
|
||||
pip/_vendor/packaging/_parser.py,sha256=s_TvTvDNK0NrM2QB3VKThdWFM4Nc0P6JnkObkl3MjpM,10236
|
||||
pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431
|
||||
pip/_vendor/packaging/_tokenizer.py,sha256=J6v5H7Jzvb-g81xp_2QACKwO7LxHQA6ikryMU7zXwN8,5273
|
||||
pip/_vendor/packaging/licenses/__init__.py,sha256=A116-FU49_Dz4162M4y1uAiZN4Rgdc83FxNd8EjlfqI,5727
|
||||
pip/_vendor/packaging/licenses/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/licenses/__pycache__/_spdx.cpython-310.pyc,,
|
||||
pip/_vendor/packaging/licenses/_spdx.py,sha256=oAm1ztPFwlsmCKe7lAAsv_OIOfS1cWDu9bNBkeu-2ns,48398
|
||||
pip/_vendor/packaging/markers.py,sha256=c89TNzB7ZdGYhkovm6PYmqGyHxXlYVaLW591PHUNKD8,10561
|
||||
pip/_vendor/packaging/metadata.py,sha256=YJibM7GYe4re8-0a3OlXmGS-XDgTEoO4tlBt2q25Bng,34762
|
||||
pip/_vendor/packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/packaging/requirements.py,sha256=gYyRSAdbrIyKDY66ugIDUQjRMvxkH2ALioTmX3tnL6o,2947
|
||||
pip/_vendor/packaging/specifiers.py,sha256=hGU6kuCd77bL-msIL6yLCp6MNT75RSMUKZDuju26c8U,40098
|
||||
pip/_vendor/packaging/tags.py,sha256=CFqrJzAzc2XNGexerH__T-Y5Iwq7WbsYXsiLERLWxY0,21014
|
||||
pip/_vendor/packaging/utils.py,sha256=0F3Hh9OFuRgrhTgGZUl5K22Fv1YP2tZl1z_2gO6kJiA,5050
|
||||
pip/_vendor/packaging/version.py,sha256=oiHqzTUv_p12hpjgsLDVcaF5hT7pDaSOViUNMD4GTW0,16688
|
||||
pip/_vendor/pkg_resources/__init__.py,sha256=jrhDRbOubP74QuPXxd7U7Po42PH2l-LZ2XfcO7llpZ4,124463
|
||||
pip/_vendor/pkg_resources/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/platformdirs/__init__.py,sha256=JueR2cRLkxY7iwik-qNWJCwKOrAlBgVgcZ_IHQzqGLE,22344
|
||||
pip/_vendor/platformdirs/__main__.py,sha256=jBJ8zb7Mpx5ebcqF83xrpO94MaeCpNGHVf9cvDN2JLg,1505
|
||||
pip/_vendor/platformdirs/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/platformdirs/__pycache__/__main__.cpython-310.pyc,,
|
||||
pip/_vendor/platformdirs/__pycache__/android.cpython-310.pyc,,
|
||||
pip/_vendor/platformdirs/__pycache__/api.cpython-310.pyc,,
|
||||
pip/_vendor/platformdirs/__pycache__/macos.cpython-310.pyc,,
|
||||
pip/_vendor/platformdirs/__pycache__/unix.cpython-310.pyc,,
|
||||
pip/_vendor/platformdirs/__pycache__/version.cpython-310.pyc,,
|
||||
pip/_vendor/platformdirs/__pycache__/windows.cpython-310.pyc,,
|
||||
pip/_vendor/platformdirs/android.py,sha256=kV5oL3V3DZ6WZKu9yFiQupv18yp_jlSV2ChH1TmPcds,9007
|
||||
pip/_vendor/platformdirs/api.py,sha256=2dfUDNbEXeDhDKarqtR5NY7oUikUZ4RZhs3ozstmhBQ,9246
|
||||
pip/_vendor/platformdirs/macos.py,sha256=UlbyFZ8Rzu3xndCqQEHrfsYTeHwYdFap1Ioz-yxveT4,6154
|
||||
pip/_vendor/platformdirs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/platformdirs/unix.py,sha256=uRPJWRyQEtv7yOSvU94rUmsblo5XKDLA1SzFg55kbK0,10393
|
||||
pip/_vendor/platformdirs/version.py,sha256=oH4KgTfK4AklbTYVcV_yynvJ9JLI3pyvDVay0hRsLCs,411
|
||||
pip/_vendor/platformdirs/windows.py,sha256=IFpiohUBwxPtCzlyKwNtxyW4Jk8haa6W8o59mfrDXVo,10125
|
||||
pip/_vendor/pygments/__init__.py,sha256=7N1oiaWulw_nCsTY4EEixYLz15pWY5u4uPAFFi-ielU,2983
|
||||
pip/_vendor/pygments/__main__.py,sha256=isIhBxLg65nLlXukG4VkMuPfNdd7gFzTZ_R_z3Q8diY,353
|
||||
pip/_vendor/pygments/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/__main__.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/cmdline.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/console.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/filter.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/formatter.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/lexer.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/modeline.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/plugin.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/regexopt.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/scanner.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/sphinxext.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/style.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/token.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/unistring.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/__pycache__/util.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/cmdline.py,sha256=LIVzmAunlk9sRJJp54O4KRy9GDIN4Wu13v9p9QzfGPM,23656
|
||||
pip/_vendor/pygments/console.py,sha256=yhP9UsLAVmWKVQf2446JJewkA7AiXeeTf4Ieg3Oi2fU,1718
|
||||
pip/_vendor/pygments/filter.py,sha256=_ADNPCskD8_GmodHi6_LoVgPU3Zh336aBCT5cOeTMs0,1910
|
||||
pip/_vendor/pygments/filters/__init__.py,sha256=RdedK2KWKXlKwR7cvkfr3NUj9YiZQgMgilRMFUg2jPA,40392
|
||||
pip/_vendor/pygments/filters/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatter.py,sha256=jDWBTndlBH2Z5IYZFVDnP0qn1CaTQjTWt7iAGtCnJEg,4390
|
||||
pip/_vendor/pygments/formatters/__init__.py,sha256=8No-NUs8rBTSSBJIv4hSEQt2M0cFB4hwAT0snVc2QGE,5385
|
||||
pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/groff.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/html.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/img.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/irc.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/latex.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/other.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/svg.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176
|
||||
pip/_vendor/pygments/formatters/bbcode.py,sha256=3JQLI45tcrQ_kRUMjuab6C7Hb0XUsbVWqqbSn9cMjkI,3320
|
||||
pip/_vendor/pygments/formatters/groff.py,sha256=M39k0PaSSZRnxWjqBSVPkF0mu1-Vr7bm6RsFvs-CNN4,5106
|
||||
pip/_vendor/pygments/formatters/html.py,sha256=SE2jc3YCqbMS3rZW9EAmDlAUhdVxJ52gA4dileEvCGU,35669
|
||||
pip/_vendor/pygments/formatters/img.py,sha256=MwA4xWPLOwh6j7Yc6oHzjuqSPt0M1fh5r-5BTIIUfsU,23287
|
||||
pip/_vendor/pygments/formatters/irc.py,sha256=dp1Z0l_ObJ5NFh9MhqLGg5ptG5hgJqedT2Vkutt9v0M,4981
|
||||
pip/_vendor/pygments/formatters/latex.py,sha256=XMmhOCqUKDBQtG5mGJNAFYxApqaC5puo5cMmPfK3944,19306
|
||||
pip/_vendor/pygments/formatters/other.py,sha256=56PMJOliin-rAUdnRM0i1wsV1GdUPd_dvQq0_UPfF9c,5034
|
||||
pip/_vendor/pygments/formatters/pangomarkup.py,sha256=y16U00aVYYEFpeCfGXlYBSMacG425CbfoG8oKbKegIg,2218
|
||||
pip/_vendor/pygments/formatters/rtf.py,sha256=ZT90dmcKyJboIB0mArhL7IhE467GXRN0G7QAUgG03To,11957
|
||||
pip/_vendor/pygments/formatters/svg.py,sha256=KKsiophPupHuxm0So-MsbQEWOT54IAiSF7hZPmxtKXE,7174
|
||||
pip/_vendor/pygments/formatters/terminal.py,sha256=AojNG4MlKq2L6IsC_VnXHu4AbHCBn9Otog6u45XvxeI,4674
|
||||
pip/_vendor/pygments/formatters/terminal256.py,sha256=kGkNUVo3FpwjytIDS0if79EuUoroAprcWt3igrcIqT0,11753
|
||||
pip/_vendor/pygments/lexer.py,sha256=TYHDt___gNW4axTl2zvPZff-VQi8fPaIh5OKRcVSjUM,35349
|
||||
pip/_vendor/pygments/lexers/__init__.py,sha256=pIlxyQJuu_syh9lE080cq8ceVbEVcKp0osAFU5fawJU,12115
|
||||
pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/lexers/__pycache__/python.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/lexers/_mapping.py,sha256=61-h3zr103m01OS5BUq_AfUiL9YI06Ves9ipQ7k4vr4,76097
|
||||
pip/_vendor/pygments/lexers/python.py,sha256=2J_YJrPTr_A6fJY_qKiKv0GpgPwHMrlMSeo59qN3fe4,53687
|
||||
pip/_vendor/pygments/modeline.py,sha256=gtRYZBS-CKOCDXHhGZqApboHBaZwGH8gznN3O6nuxj4,1005
|
||||
pip/_vendor/pygments/plugin.py,sha256=ioeJ3QeoJ-UQhZpY9JL7vbxsTVuwwM7BCu-Jb8nN0AU,1891
|
||||
pip/_vendor/pygments/regexopt.py,sha256=Hky4EB13rIXEHQUNkwmCrYqtIlnXDehNR3MztafZ43w,3072
|
||||
pip/_vendor/pygments/scanner.py,sha256=NDy3ofK_fHRFK4hIDvxpamG871aewqcsIb6sgTi7Fhk,3092
|
||||
pip/_vendor/pygments/sphinxext.py,sha256=iOptJBcqOGPwMEJ2p70PvwpZPIGdvdZ8dxvq6kzxDgA,7981
|
||||
pip/_vendor/pygments/style.py,sha256=rSCZWFpg1_DwFMXDU0nEVmAcBHpuQGf9RxvOPPQvKLQ,6420
|
||||
pip/_vendor/pygments/styles/__init__.py,sha256=qUk6_1z5KmT8EdJFZYgESmG6P_HJF_2vVrDD7HSCGYY,2042
|
||||
pip/_vendor/pygments/styles/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-310.pyc,,
|
||||
pip/_vendor/pygments/styles/_mapping.py,sha256=6lovFUE29tz6EsV3XYY4hgozJ7q1JL7cfO3UOlgnS8w,3312
|
||||
pip/_vendor/pygments/token.py,sha256=qZwT7LSPy5YBY3JgDjut642CCy7JdQzAfmqD9NmT5j0,6226
|
||||
pip/_vendor/pygments/unistring.py,sha256=p5c1i-HhoIhWemy9CUsaN9o39oomYHNxXll0Xfw6tEA,63208
|
||||
pip/_vendor/pygments/util.py,sha256=2tj2nS1X9_OpcuSjf8dOET2bDVZhs8cEKd_uT6-Fgg8,10031
|
||||
pip/_vendor/pyproject_hooks/__init__.py,sha256=cPB_a9LXz5xvsRbX1o2qyAdjLatZJdQ_Lc5McNX-X7Y,691
|
||||
pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-310.pyc,,
|
||||
pip/_vendor/pyproject_hooks/_impl.py,sha256=jY-raxnmyRyB57ruAitrJRUzEexuAhGTpgMygqx67Z4,14936
|
||||
pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=MJNPpfIxcO-FghxpBbxkG1rFiQf6HOUbV4U5mq0HFns,557
|
||||
pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-310.pyc,,
|
||||
pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=qcXMhmx__MIJq10gGHW3mA4Tl8dy8YzHMccwnNoKlw0,12216
|
||||
pip/_vendor/pyproject_hooks/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/requests/__init__.py,sha256=HlB_HzhrzGtfD_aaYUwUh1zWXLZ75_YCLyit75d0Vz8,5057
|
||||
pip/_vendor/requests/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/__version__.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/_internal_utils.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/adapters.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/api.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/auth.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/certs.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/compat.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/cookies.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/exceptions.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/help.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/hooks.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/models.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/packages.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/sessions.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/status_codes.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/structures.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__pycache__/utils.cpython-310.pyc,,
|
||||
pip/_vendor/requests/__version__.py,sha256=FVfglgZmNQnmYPXpOohDU58F5EUb_-VnSTaAesS187g,435
|
||||
pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495
|
||||
pip/_vendor/requests/adapters.py,sha256=J7VeVxKBvawbtlX2DERVo05J9BXTcWYLMHNd1Baa-bk,27607
|
||||
pip/_vendor/requests/api.py,sha256=_Zb9Oa7tzVIizTKwFrPjDEY9ejtm_OnSRERnADxGsQs,6449
|
||||
pip/_vendor/requests/auth.py,sha256=kF75tqnLctZ9Mf_hm9TZIj4cQWnN5uxRz8oWsx5wmR0,10186
|
||||
pip/_vendor/requests/certs.py,sha256=kHDlkK_beuHXeMPc5jta2wgl8gdKeUWt5f2nTDVrvt8,441
|
||||
pip/_vendor/requests/compat.py,sha256=Mo9f9xZpefod8Zm-n9_StJcVTmwSukXR2p3IQyyVXvU,1485
|
||||
pip/_vendor/requests/cookies.py,sha256=bNi-iqEj4NPZ00-ob-rHvzkvObzN3lEpgw3g6paS3Xw,18590
|
||||
pip/_vendor/requests/exceptions.py,sha256=D1wqzYWne1mS2rU43tP9CeN1G7QAy7eqL9o1god6Ejw,4272
|
||||
pip/_vendor/requests/help.py,sha256=hRKaf9u0G7fdwrqMHtF3oG16RKktRf6KiwtSq2Fo1_0,3813
|
||||
pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733
|
||||
pip/_vendor/requests/models.py,sha256=x4K4CmH-lC0l2Kb-iPfMN4dRXxHEcbOaEWBL_i09AwI,35483
|
||||
pip/_vendor/requests/packages.py,sha256=_ZQDCJTJ8SP3kVWunSqBsRZNPzj2c1WFVqbdr08pz3U,1057
|
||||
pip/_vendor/requests/sessions.py,sha256=ykTI8UWGSltOfH07HKollH7kTBGw4WhiBVaQGmckTw4,30495
|
||||
pip/_vendor/requests/status_codes.py,sha256=iJUAeA25baTdw-6PfD0eF4qhpINDJRJI-yaMqxs4LEI,4322
|
||||
pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912
|
||||
pip/_vendor/requests/utils.py,sha256=L79vnFbzJ3SFLKtJwpoWe41Tozi3RlZv94pY1TFIyow,33631
|
||||
pip/_vendor/resolvelib/__init__.py,sha256=h509TdEcpb5-44JonaU3ex2TM15GVBLjM9CNCPwnTTs,537
|
||||
pip/_vendor/resolvelib/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/resolvelib/__pycache__/providers.cpython-310.pyc,,
|
||||
pip/_vendor/resolvelib/__pycache__/reporters.cpython-310.pyc,,
|
||||
pip/_vendor/resolvelib/__pycache__/resolvers.cpython-310.pyc,,
|
||||
pip/_vendor/resolvelib/__pycache__/structs.cpython-310.pyc,,
|
||||
pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-310.pyc,,
|
||||
pip/_vendor/resolvelib/compat/collections_abc.py,sha256=uy8xUZ-NDEw916tugUXm8HgwCGiMO0f-RcdnpkfXfOs,156
|
||||
pip/_vendor/resolvelib/providers.py,sha256=fuuvVrCetu5gsxPB43ERyjfO8aReS3rFQHpDgiItbs4,5871
|
||||
pip/_vendor/resolvelib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/resolvelib/reporters.py,sha256=TSbRmWzTc26w0ggsV1bxVpeWDB8QNIre6twYl7GIZBE,1601
|
||||
pip/_vendor/resolvelib/resolvers.py,sha256=G8rsLZSq64g5VmIq-lB7UcIJ1gjAxIQJmTF4REZleQ0,20511
|
||||
pip/_vendor/resolvelib/structs.py,sha256=0_1_XO8z_CLhegP3Vpf9VJ3zJcfLm0NOHRM-i0Ykz3o,4963
|
||||
pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090
|
||||
pip/_vendor/rich/__main__.py,sha256=eO7Cq8JnrgG8zVoeImiAs92q3hXNMIfp0w5lMsO7Q2Y,8477
|
||||
pip/_vendor/rich/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/__main__.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_cell_widths.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_emoji_codes.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_emoji_replace.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_export_format.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_extension.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_fileno.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_inspect.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_log_render.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_loop.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_null_file.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_palettes.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_pick.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_ratio.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_spinners.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_stack.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_timer.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_win32_console.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_windows.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_windows_renderer.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/_wrap.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/abc.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/align.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/ansi.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/bar.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/box.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/cells.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/color.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/color_triplet.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/columns.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/console.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/constrain.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/containers.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/control.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/default_styles.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/diagnose.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/emoji.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/errors.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/file_proxy.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/filesize.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/highlighter.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/json.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/jupyter.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/layout.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/live.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/live_render.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/logging.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/markup.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/measure.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/padding.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/pager.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/palette.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/panel.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/pretty.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/progress.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/progress_bar.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/prompt.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/protocol.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/region.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/repr.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/rule.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/scope.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/screen.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/segment.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/spinner.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/status.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/style.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/styled.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/syntax.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/table.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/terminal_theme.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/text.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/theme.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/themes.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/traceback.cpython-310.pyc,,
|
||||
pip/_vendor/rich/__pycache__/tree.cpython-310.pyc,,
|
||||
pip/_vendor/rich/_cell_widths.py,sha256=fbmeyetEdHjzE_Vx2l1uK7tnPOhMs2X1lJfO3vsKDpA,10209
|
||||
pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235
|
||||
pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064
|
||||
pip/_vendor/rich/_export_format.py,sha256=RI08pSrm5tBSzPMvnbTqbD9WIalaOoN5d4M1RTmLq1Y,2128
|
||||
pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265
|
||||
pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799
|
||||
pip/_vendor/rich/_inspect.py,sha256=QM05lEFnFoTaFqpnbx-zBEI6k8oIKrD3cvjEOQNhKig,9655
|
||||
pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225
|
||||
pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236
|
||||
pip/_vendor/rich/_null_file.py,sha256=ADGKp1yt-k70FMKV6tnqCqecB-rSJzp-WQsD7LPL-kg,1394
|
||||
pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063
|
||||
pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423
|
||||
pip/_vendor/rich/_ratio.py,sha256=Zt58apszI6hAAcXPpgdWKpu3c31UBWebOeR4mbyptvU,5471
|
||||
pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919
|
||||
pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351
|
||||
pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417
|
||||
pip/_vendor/rich/_win32_console.py,sha256=BSaDRIMwBLITn_m0mTRLPqME5q-quGdSMuYMpYeYJwc,22755
|
||||
pip/_vendor/rich/_windows.py,sha256=aBwaD_S56SbgopIvayVmpk0Y28uwY2C5Bab1wl3Bp-I,1925
|
||||
pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783
|
||||
pip/_vendor/rich/_wrap.py,sha256=FlSsom5EX0LVkA3KWy34yHnCfLtqX-ZIepXKh-70rpc,3404
|
||||
pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890
|
||||
pip/_vendor/rich/align.py,sha256=Rh-3adnDaN1Ao07EjR2PhgE62PGLPgO8SMwJBku1urQ,10469
|
||||
pip/_vendor/rich/ansi.py,sha256=Avs1LHbSdcyOvDOdpELZUoULcBiYewY76eNBp6uFBhs,6921
|
||||
pip/_vendor/rich/bar.py,sha256=ldbVHOzKJOnflVNuv1xS7g6dLX2E3wMnXkdPbpzJTcs,3263
|
||||
pip/_vendor/rich/box.py,sha256=nr5fYIUghB_iUCEq6y0Z3LlCT8gFPDrzN9u2kn7tJl4,10831
|
||||
pip/_vendor/rich/cells.py,sha256=KrQkj5-LghCCpJLSNQIyAZjndc4bnEqOEmi5YuZ9UCY,5130
|
||||
pip/_vendor/rich/color.py,sha256=3HSULVDj7qQkXUdFWv78JOiSZzfy5y1nkcYhna296V0,18211
|
||||
pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054
|
||||
pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131
|
||||
pip/_vendor/rich/console.py,sha256=nKjrEx_7xy8KGmDVT-BgNII0R5hm1cexhAHDwdwNVqg,100156
|
||||
pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288
|
||||
pip/_vendor/rich/containers.py,sha256=c_56TxcedGYqDepHBMTuZdUIijitAQgnox-Qde0Z1qo,5502
|
||||
pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630
|
||||
pip/_vendor/rich/default_styles.py,sha256=dZxgaSD9VUy7SXQShO33aLYiAWspCr2sCQZFX_JK1j4,8159
|
||||
pip/_vendor/rich/diagnose.py,sha256=an6uouwhKPAlvQhYpNNpGq9EJysfMIOvvCbO3oSoR24,972
|
||||
pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501
|
||||
pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642
|
||||
pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683
|
||||
pip/_vendor/rich/filesize.py,sha256=_iz9lIpRgvW7MNSeCZnLg-HwzbP4GETg543WqD8SFs0,2484
|
||||
pip/_vendor/rich/highlighter.py,sha256=G_sn-8DKjM1sEjLG_oc4ovkWmiUpWvj8bXi0yed2LnY,9586
|
||||
pip/_vendor/rich/json.py,sha256=vVEoKdawoJRjAFayPwXkMBPLy7RSTs-f44wSQDR2nJ0,5031
|
||||
pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252
|
||||
pip/_vendor/rich/layout.py,sha256=ajkSFAtEVv9EFTcFs-w4uZfft7nEXhNzL7ZVdgrT5rI,14004
|
||||
pip/_vendor/rich/live.py,sha256=DhzAPEnjTxQuq9_0Y2xh2MUwQcP_aGPkenLfKETslwM,14270
|
||||
pip/_vendor/rich/live_render.py,sha256=zJtB471jGziBtEwxc54x12wEQtH4BuQr1SA8v9kU82w,3666
|
||||
pip/_vendor/rich/logging.py,sha256=ZgpKMMBY_BuMAI_BYzo-UtXak6t5oH9VK8m9Q2Lm0f4,12458
|
||||
pip/_vendor/rich/markup.py,sha256=3euGKP5s41NCQwaSjTnJxus5iZMHjxpIM0W6fCxra38,8451
|
||||
pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305
|
||||
pip/_vendor/rich/padding.py,sha256=KVEI3tOwo9sgK1YNSuH__M1_jUWmLZwRVV_KmOtVzyM,4908
|
||||
pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828
|
||||
pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396
|
||||
pip/_vendor/rich/panel.py,sha256=fFRHcviXvWhk3V3zx5Zwmsb_RL9KJ3esD-sU0NYEVyw,11235
|
||||
pip/_vendor/rich/pretty.py,sha256=gy3S72u4FRg2ytoo7N1ZDWDIvB4unbzd5iUGdgm-8fc,36391
|
||||
pip/_vendor/rich/progress.py,sha256=MtmCjTk5zYU_XtRHxRHTAEHG6hF9PeF7EMWbEPleIC0,60357
|
||||
pip/_vendor/rich/progress_bar.py,sha256=mZTPpJUwcfcdgQCTTz3kyY-fc79ddLwtx6Ghhxfo064,8162
|
||||
pip/_vendor/rich/prompt.py,sha256=l0RhQU-0UVTV9e08xW1BbIj0Jq2IXyChX4lC0lFNzt4,12447
|
||||
pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391
|
||||
pip/_vendor/rich/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166
|
||||
pip/_vendor/rich/repr.py,sha256=5MZJZmONgC6kud-QW-_m1okXwL2aR6u6y-pUcUCJz28,4431
|
||||
pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602
|
||||
pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843
|
||||
pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591
|
||||
pip/_vendor/rich/segment.py,sha256=otnKeKGEV-WRlQVosfJVeFDcDxAKHpvJ_hLzSu5lumM,24743
|
||||
pip/_vendor/rich/spinner.py,sha256=PT5qgXPG3ZpqRj7n3EZQ6NW56mx3ldZqZCU7gEMyZk4,4364
|
||||
pip/_vendor/rich/status.py,sha256=kkPph3YeAZBo-X-4wPp8gTqZyU466NLwZBA4PZTTewo,4424
|
||||
pip/_vendor/rich/style.py,sha256=aSoUNbVgfP1PAnduAqgbbl4AMQy668qs2S1FEwr3Oqs,27067
|
||||
pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258
|
||||
pip/_vendor/rich/syntax.py,sha256=qqAnEUZ4K57Po81_5RBxnsuU4KRzSdvDPAhKw8ma_3E,35763
|
||||
pip/_vendor/rich/table.py,sha256=yXYUr0YsPpG466N50HCAw2bpb5ZUuuzdc-G66Zk-oTc,40103
|
||||
pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370
|
||||
pip/_vendor/rich/text.py,sha256=AO7JPCz6-gaN1thVLXMBntEmDPVYFgFNG1oM61_sanU,47552
|
||||
pip/_vendor/rich/theme.py,sha256=oNyhXhGagtDlbDye3tVu3esWOWk0vNkuxFw-_unlaK0,3771
|
||||
pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102
|
||||
pip/_vendor/rich/traceback.py,sha256=z8UoN7NbTQKW6YDDUVwOh7F8snZf6gYnUWtOrKsLE1w,31797
|
||||
pip/_vendor/rich/tree.py,sha256=yWnQ6rAvRGJ3qZGqBrxS2SW2TKBTNrP0SdY8QxOFPuw,9451
|
||||
pip/_vendor/tomli/__init__.py,sha256=PhNw_eyLgdn7McJ6nrAN8yIm3dXC75vr1sVGVVwDSpA,314
|
||||
pip/_vendor/tomli/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/tomli/__pycache__/_parser.cpython-310.pyc,,
|
||||
pip/_vendor/tomli/__pycache__/_re.cpython-310.pyc,,
|
||||
pip/_vendor/tomli/__pycache__/_types.cpython-310.pyc,,
|
||||
pip/_vendor/tomli/_parser.py,sha256=9w8LG0jB7fwmZZWB0vVXbeejDHcl4ANIJxB2scEnDlA,25591
|
||||
pip/_vendor/tomli/_re.py,sha256=sh4sBDRgO94KJZwNIrgdcyV_qQast50YvzOAUGpRDKA,3171
|
||||
pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254
|
||||
pip/_vendor/tomli/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
|
||||
pip/_vendor/truststore/__init__.py,sha256=WIDeyzWm7EVX44g354M25vpRXbeY1lsPH6EmUJUcq4o,1264
|
||||
pip/_vendor/truststore/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/truststore/__pycache__/_api.cpython-310.pyc,,
|
||||
pip/_vendor/truststore/__pycache__/_macos.cpython-310.pyc,,
|
||||
pip/_vendor/truststore/__pycache__/_openssl.cpython-310.pyc,,
|
||||
pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-310.pyc,,
|
||||
pip/_vendor/truststore/__pycache__/_windows.cpython-310.pyc,,
|
||||
pip/_vendor/truststore/_api.py,sha256=GeXRNTlxPZ3kif4kNoh6JY0oE4QRzTGcgXr6l_X_Gk0,10555
|
||||
pip/_vendor/truststore/_macos.py,sha256=nZlLkOmszUE0g6ryRwBVGY5COzPyudcsiJtDWarM5LQ,20503
|
||||
pip/_vendor/truststore/_openssl.py,sha256=LLUZ7ZGaio-i5dpKKjKCSeSufmn6T8pi9lDcFnvSyq0,2324
|
||||
pip/_vendor/truststore/_ssl_constants.py,sha256=NUD4fVKdSD02ri7-db0tnO0VqLP9aHuzmStcW7tAl08,1130
|
||||
pip/_vendor/truststore/_windows.py,sha256=rAHyKYD8M7t-bXfG8VgOVa3TpfhVhbt4rZQlO45YuP8,17993
|
||||
pip/_vendor/truststore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/typing_extensions.py,sha256=78hFl0HpDY-ylHUVCnWdU5nTHxUP2-S-3wEZk6CQmLk,134499
|
||||
pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333
|
||||
pip/_vendor/urllib3/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/_collections.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/_version.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/connection.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/connectionpool.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/exceptions.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/fields.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/filepost.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/poolmanager.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/request.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/__pycache__/response.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/_collections.py,sha256=pyASJJhW7wdOpqJj9QJA8FyGRfr8E8uUUhqUvhF0728,11372
|
||||
pip/_vendor/urllib3/_version.py,sha256=t9wGB6ooOTXXgiY66K1m6BZS1CJyXHAU8EoWDTe6Shk,64
|
||||
pip/_vendor/urllib3/connection.py,sha256=ttIA909BrbTUzwkqEe_TzZVh4JOOj7g61Ysei2mrwGg,20314
|
||||
pip/_vendor/urllib3/connectionpool.py,sha256=e2eiAwNbFNCKxj4bwDKNK-w7HIdSz3OmMxU_TIt-evQ,40408
|
||||
pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957
|
||||
pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632
|
||||
pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922
|
||||
pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036
|
||||
pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528
|
||||
pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081
|
||||
pip/_vendor/urllib3/contrib/securetransport.py,sha256=Fef1IIUUFHqpevzXiDPbIGkDKchY2FVKeVeLGR1Qq3g,34446
|
||||
pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097
|
||||
pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217
|
||||
pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579
|
||||
pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440
|
||||
pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/packages/__pycache__/six.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417
|
||||
pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343
|
||||
pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665
|
||||
pip/_vendor/urllib3/poolmanager.py,sha256=aWyhXRtNO4JUnCSVVqKTKQd8EXTvUm1VN9pgs2bcONo,19990
|
||||
pip/_vendor/urllib3/request.py,sha256=YTWFNr7QIwh7E1W9dde9LM77v2VWTJ5V78XuTTw7D1A,6691
|
||||
pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641
|
||||
pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155
|
||||
pip/_vendor/urllib3/util/__pycache__/__init__.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/connection.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/proxy.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/queue.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/request.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/response.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/retry.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/timeout.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/url.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/__pycache__/wait.cpython-310.pyc,,
|
||||
pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901
|
||||
pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605
|
||||
pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498
|
||||
pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997
|
||||
pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510
|
||||
pip/_vendor/urllib3/util/retry.py,sha256=6ENvOZ8PBDzh8kgixpql9lIrb2dxH-k7ZmBanJF2Ng4,22050
|
||||
pip/_vendor/urllib3/util/ssl_.py,sha256=QDuuTxPSCj1rYtZ4xpD7Ux-r20TD50aHyqKyhQ7Bq4A,17460
|
||||
pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758
|
||||
pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895
|
||||
pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168
|
||||
pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296
|
||||
pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403
|
||||
pip/_vendor/vendor.txt,sha256=EW-E3cE5XEAtVFzGInikArOMDxGP0DLUWzXpY4RZfFY,333
|
||||
pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286
|
||||
@@ -1,5 +1,5 @@
|
||||
Wheel-Version: 1.0
|
||||
Generator: bdist_wheel (0.37.1)
|
||||
Generator: setuptools (75.8.0)
|
||||
Root-Is-Purelib: true
|
||||
Tag: py3-none-any
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
[console_scripts]
|
||||
pip = pip._internal.cli.main:main
|
||||
pip3 = pip._internal.cli.main:main
|
||||
pip3.8 = pip._internal.cli.main:main
|
||||
@@ -0,0 +1 @@
|
||||
pip
|
||||
@@ -1,6 +1,6 @@
|
||||
from typing import List, Optional
|
||||
|
||||
__version__ = "22.2.1"
|
||||
__version__ = "25.0.1"
|
||||
|
||||
|
||||
def main(args: Optional[List[str]] = None) -> int:
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import os
|
||||
import sys
|
||||
import warnings
|
||||
|
||||
# Remove '' and current working directory from the first entry
|
||||
# of sys.path, if present to avoid using current directory
|
||||
@@ -20,12 +19,6 @@ if __package__ == "":
|
||||
sys.path.insert(0, path)
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Work around the error reported in #9540, pending a proper fix.
|
||||
# Note: It is essential the warning filter is set *before* importing
|
||||
# pip, as the deprecation happens at import time, not runtime.
|
||||
warnings.filterwarnings(
|
||||
"ignore", category=DeprecationWarning, module=".*packaging\\.version"
|
||||
)
|
||||
from pip._internal.cli.main import main as _main
|
||||
|
||||
sys.exit(_main())
|
||||
@@ -4,24 +4,38 @@ This file is named as it is, to ensure that this module can't be imported via
|
||||
an import statement.
|
||||
"""
|
||||
|
||||
import runpy
|
||||
# /!\ This version compatibility check section must be Python 2 compatible. /!\
|
||||
|
||||
import sys
|
||||
import types
|
||||
from importlib.machinery import ModuleSpec, PathFinder
|
||||
from os.path import dirname
|
||||
from typing import Optional, Sequence, Union
|
||||
|
||||
# Copied from pyproject.toml
|
||||
PYTHON_REQUIRES = (3, 8)
|
||||
|
||||
|
||||
def version_str(version): # type: ignore
|
||||
return ".".join(str(v) for v in version)
|
||||
|
||||
|
||||
if sys.version_info[:2] < PYTHON_REQUIRES:
|
||||
raise SystemExit(
|
||||
"This version of pip does not support python {} (requires >={}).".format(
|
||||
version_str(sys.version_info[:2]), version_str(PYTHON_REQUIRES)
|
||||
)
|
||||
)
|
||||
|
||||
# From here on, we can use Python 3 features, but the syntax must remain
|
||||
# Python 2 compatible.
|
||||
|
||||
import runpy # noqa: E402
|
||||
from importlib.machinery import PathFinder # noqa: E402
|
||||
from os.path import dirname # noqa: E402
|
||||
|
||||
PIP_SOURCES_ROOT = dirname(dirname(__file__))
|
||||
|
||||
|
||||
class PipImportRedirectingFinder:
|
||||
@classmethod
|
||||
def find_spec(
|
||||
self,
|
||||
fullname: str,
|
||||
path: Optional[Sequence[Union[bytes, str]]] = None,
|
||||
target: Optional[types.ModuleType] = None,
|
||||
) -> Optional[ModuleSpec]:
|
||||
def find_spec(self, fullname, path=None, target=None): # type: ignore
|
||||
if fullname != "pip":
|
||||
return None
|
||||
|
||||
@@ -30,7 +44,6 @@ class PipImportRedirectingFinder:
|
||||
return spec
|
||||
|
||||
|
||||
# TODO https://github.com/pypa/pip/issues/11294
|
||||
sys.meta_path.insert(0, PipImportRedirectingFinder())
|
||||
|
||||
assert __name__ == "__main__", "Cannot run __pip-runner__.py as a non-main module"
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
from typing import List, Optional
|
||||
|
||||
import pip._internal.utils.inject_securetransport # noqa
|
||||
from pip._internal.utils import _log
|
||||
|
||||
# init_logging() must be called before any call to logging.getLogger()
|
||||
@@ -8,7 +7,7 @@ from pip._internal.utils import _log
|
||||
_log.init_logging()
|
||||
|
||||
|
||||
def main(args: (Optional[List[str]]) = None) -> int:
|
||||
def main(args: Optional[List[str]] = None) -> int:
|
||||
"""This is preserved for old console scripts that may still be referencing
|
||||
it.
|
||||
|
||||
|
||||