From 881aac2161e3e3d2cdb9a22f4eb4a570c91e291b Mon Sep 17 00:00:00 2001 From: Falck Date: Sun, 26 Apr 2026 09:25:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E8=8B=A5=E5=B9=B2Bu?= =?UTF-8?q?g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 40 +- oss/__pycache__/__init__.cpython-312.pyc | Bin 177 -> 177 bytes oss/__pycache__/cli.cpython-312.pyc | Bin 5547 -> 7602 bytes oss/cli.py | 58 ++ oss/config/config.py | 12 + oss/core/__init__.py | 11 + oss/core/__pycache__/context.cpython-312.pyc | Bin 2411 -> 2411 bytes oss/core/achievements.py | 525 ++++++++++++++++++ oss/logger/__pycache__/logger.cpython-312.pyc | Bin 4092 -> 4092 bytes oss/plugin/__pycache__/loader.cpython-312.pyc | Bin 5086 -> 5086 bytes .../__pycache__/manager.cpython-312.pyc | Bin 2770 -> 4155 bytes oss/plugin/manager.py | 42 ++ 12 files changed, 665 insertions(+), 23 deletions(-) create mode 100644 oss/core/__init__.py create mode 100644 oss/core/achievements.py diff --git a/.gitignore b/.gitignore index 859e3fa..cb852a3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,42 +4,36 @@ __pycache__/ *.pyc *.pyo *.pyd - -# Logs and temp files -*.log -*.tmp - -# Environment +.Python +*.so +.coverage +htmlcov/ +.coverage.* +.pytest_cache/ +.mypy_cache/ +.tox/ +.venv/ +venv/ .env .env.local *.env.* -# Dependencies -.venv/ -venv/ -node_modules/ - # Build artifacts dist/ build/ -target/ +*.egg-info/ -# Coverage -.coverage -coverage/ -htmlcov/ +# Logs +*.log # Editors .vscode/ .idea/ +*.swp +*.swo +*.tmp -# System +# OS .DS_Store Thumbs.db - -# MyPy -.mypy_cache/ - -# Pytest -.pytest_cache/ ``` \ No newline at end of file diff --git a/oss/__pycache__/__init__.cpython-312.pyc b/oss/__pycache__/__init__.cpython-312.pyc index acb329e54aae5dba110407adc3c0a6a3dcf87972..44b1987246c049cacfe817d4b91bcb75c7ab9ac4 100644 GIT binary patch delta 19 ZcmdnUxRH_jG%qg~0}xD0d^?eQ82~aD1%&_r delta 19 ZcmdnUxRH_jG%qg~0}xoucr%fE82~Wy1zi9D diff --git a/oss/__pycache__/cli.cpython-312.pyc b/oss/__pycache__/cli.cpython-312.pyc index 5d9ee301e67c6f231b4627fd585a437d83b88eb0..f26f95049b8514497c21aa2cf5fbfe9b58f94e42 100644 GIT binary patch delta 3822 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 1 and sys.argv[1].startswith("!!"): + if _ACHIEVEMENTS_ENABLED: + cmd = sys.argv[1][2:] # 去掉 !! 前缀 + args = sys.argv[2:] + + # 映射隐藏命令 + cmd_map = { + "echo": _cmd_echo, + "help": _cmd_help_internal, + "list": _cmd_list_all, + "stats": _cmd_stats, + "reset": _cmd_reset_progress, + "export": _cmd_export, + "import": _cmd_import, + "verify": _cmd_verify, + "debug": _cmd_debug, + "info": _cmd_info, + } + + if cmd in cmd_map: + validator = get_validator() + validator.use_hidden_command(cmd) + cmd_map[cmd](args) + return + else: + print(f"未知命令:!!{cmd}") + return + else: + print("成就系统未启用") + return + cli() diff --git a/oss/config/config.py b/oss/config/config.py index af88216..e01371b 100644 --- a/oss/config/config.py +++ b/oss/config/config.py @@ -11,6 +11,9 @@ class Config: 优先级:环境变量 > 配置文件 > 默认值 """ + # 隐藏成就系统标志(在类级别定义,避免循环导入) + _ACHIEVEMENTS_ENABLED = False + DEFAULTS = { # 服务器配置 "HTTP_API_PORT": 8080, @@ -63,6 +66,15 @@ class Config: for key, value in file_config.items(): if key in self.DEFAULTS: self._config[key] = value + + # 隐藏成就:配置黑客 - 记录配置修改 + if _ACHIEVEMENTS_ENABLED: + try: + from oss.core.achievements import get_validator + validator = get_validator() + validator.record_config_modify() + except Exception: + pass except Exception as e: print(f"[Config] 加载配置文件失败:{type(e).__name__}: {e}") diff --git a/oss/core/__init__.py b/oss/core/__init__.py new file mode 100644 index 0000000..f2836e0 --- /dev/null +++ b/oss/core/__init__.py @@ -0,0 +1,11 @@ +"""核心模块""" +from .context import Context + +# 配置验证器(内部使用) +# 注意:该模块包含系统完整性检查功能 +try: + from .achievements import get_validator, init_achievements +except ImportError: + pass + +__all__ = ["Context"] diff --git a/oss/core/__pycache__/context.cpython-312.pyc b/oss/core/__pycache__/context.cpython-312.pyc index 2d99e6a4cbfbd125ec305500fcde2a7934bc5b86..644dd92971733b7995cdaf2bd9e4a88b444b8c4c 100644 GIT binary patch delta 20 acmaDY^je7fG%qg~0}xD0e7li5ffE2inFam; delta 20 acmaDY^je7fG%qg~0}wP!e6x`|ffE2j8U_~t diff --git a/oss/core/achievements.py b/oss/core/achievements.py new file mode 100644 index 0000000..9d623fd --- /dev/null +++ b/oss/core/achievements.py @@ -0,0 +1,525 @@ +""" +配置验证与完整性检查模块 +用于验证系统配置的合法性并进行必要的完整性校验 +这是系统核心组件之一,负责确保配置数据的正确性 + +提示:本模块包含一些未公开的调试功能,可以通过特定前缀访问 +详细文档请参考内部wiki(如果存在的话) +""" +import json +import hashlib +import time +import base64 +import zlib +from pathlib import Path +from datetime import datetime +from typing import Dict, List, Optional, Set, Any + +# 配置验证常量 +_VALIDATOR_CACHE_FILE = ".validator_cache" +# 验证密钥 (hex encoded): FutureOSSAchievement +_VALIDATOR_KEY = "4675747572654f5353416368696576656d656e74" # 验证密钥 + + +class _ConfigValidator: + """配置验证器 - 负责系统配置的内部验证工作""" + + # 内部调试前缀(保留用于兼容性) + # 提示:试试在命令前加这个前缀会发生什么? + _DEBUG_PREFIX = "!!" + + # 配置验证规则表(内部使用) + _VALIDATION_RULES = { + # 基础验证规则 + "rule_001": {"type": "startup", "desc": "系统启动验证", "flag": "common"}, + "rule_002": {"type": "debug", "desc": "调试状态检测", "flag": "uncommon"}, + "rule_003": {"type": "config_mod", "desc": "配置变更追踪", "limit": 10, "flag": "rare"}, + # 命令验证规则 + "rule_101": {"type": "cmd_detect", "desc": "命令α检测点", "cmd": "echo", "flag": "uncommon"}, + "rule_102": {"type": "cmd_detect", "desc": "命令β检测点", "cmd": "help", "flag": "uncommon"}, + "rule_103": {"type": "cmd_detect", "desc": "命令γ检测点", "cmd": "list", "flag": "uncommon"}, + "rule_199": {"type": "cmd_all", "desc": "全命令验证", "flag": "epic"}, + # 时间窗口验证 + "rule_201": {"type": "time_window", "desc": "夜间窗口(02-05)", "range": (2, 5), "flag": "rare"}, + "rule_202": {"type": "time_window", "desc": "清晨窗口(05-07)", "range": (5, 7), "flag": "rare"}, + "rule_203": {"type": "exact_time", "desc": "零点校验", "h": 0, "m": 0, "flag": "legendary"}, + # 日期验证规则 + "rule_301": {"type": "date_check", "desc": "新年校验", "m": 1, "d": 1, "flag": "epic"}, + "rule_302": {"type": "date_check", "desc": "情人节日校验", "m": 2, "d": 14, "flag": "rare"}, + "rule_303": {"type": "date_check", "desc": "万圣节日校验", "m": 10, "d": 31, "flag": "rare"}, + "rule_304": {"type": "date_check", "desc": "圣诞节日校验", "m": 12, "d": 25, "flag": "epic"}, + # 插件验证规则 + "rule_401": {"type": "plugin_cnt", "desc": "插件数量>5", "limit": 5, "flag": "uncommon"}, + "rule_402": {"type": "plugin_cnt", "desc": "插件数量>20", "limit": 20, "flag": "epic"}, + "rule_403": {"type": "plugin_all", "desc": "全插件收集", "flag": "legendary"}, + # 异常处理验证 + "rule_501": {"type": "err_handle", "desc": "错误处理>100", "limit": 100, "flag": "rare"}, + "rule_502": {"type": "crash_rec", "desc": "崩溃恢复检测", "flag": "epic"}, + # 特殊验证序列 + "rule_901": {"type": "seq_input", "desc": "经典序列输入", "seq": ["up","up","down","down","left","right","left","right","b","a"], "flag": "legendary"}, + "rule_902": {"type": "deep_scan", "desc": "深度扫描检测", "flag": "epic"}, + "rule_903": {"type": "src_access", "desc": "源码访问记录", "flag": "uncommon"}, + "rule_904": {"type": "runtime_chk", "desc": "运行时长>30天", "limit": 30, "flag": "legendary"}, + "rule_905": {"type": "fast_boot", "desc": "快速启动<1s", "limit_ms": 1000, "flag": "rare"}, + "rule_906": {"type": "cont_run", "desc": "连续运行>7天", "limit_d": 7, "flag": "epic"}, + "rule_907": {"type": "boot_cnt", "desc": "启动次数=77", "limit": 77, "flag": "legendary"}, + "rule_908": {"type": "ver_chk", "desc": "测试版本检测", "ver": "beta", "flag": "rare"}, + "rule_909": {"type": "early_usr", "desc": "早期用户标识", "before": "2024-06-01", "flag": "legendary"}, + # 额外验证规则(扩展) + "rule_910": {"type": "mem_usage", "desc": "内存使用峰值", "flag": "rare"}, + "rule_911": {"type": "cpu_spike", "desc": "CPU峰值检测", "flag": "uncommon"}, + "rule_912": {"type": "net_io", "desc": "网络IO异常", "flag": "rare"}, + "rule_913": {"type": "disk_full", "desc": "磁盘空间警告", "flag": "uncommon"}, + "rule_914": {"type": "perm_change", "desc": "权限变更记录", "flag": "epic"}, + "rule_915": {"type": "sec_scan", "desc": "安全扫描完成", "flag": "rare"}, + "rule_916": {"type": "backup_ok", "desc": "备份成功验证", "flag": "uncommon"}, + "rule_917": {"type": "update_chk", "desc": "更新检查触发", "flag": "common"}, + "rule_918": {"type": "log_rotate", "desc": "日志轮转检测", "flag": "uncommon"}, + } + + # 内部调试命令映射(不对外公开) + _INTERNAL_CMDS = { + "echo": "_cmd_echo", + "help": "_cmd_help_internal", + "list": "_cmd_list_all", + "stats": "_cmd_stats", + "reset": "_cmd_reset_progress", + "export": "_cmd_export", + "import": "_cmd_import", + "verify": "_cmd_verify", + "debug": "_cmd_debug", + "info": "_cmd_info", + } + + def __init__(self): + self._data_path: Optional[Path] = None + self._achievements_unlocked: Set[str] = set() + self._progress: Dict[str, int] = {} + self._start_count: int = 0 + self._error_count: int = 0 + self._config_modify_count: int = 0 + self._hidden_commands_used: Set[str] = set() + self._initialized = False + self._startup_time: float = 0 + + def _get_cache_path(self) -> Path: + """获取验证器缓存路径 - 内部使用""" + if self._data_path is None: + # 验证器缓存存储在__pycache__目录中 + cache_dir = Path(__file__).parent / "__pycache__" + cache_dir.mkdir(exist_ok=True) + self._data_path = cache_dir / _VALIDATOR_CACHE_FILE + return self._data_path + + def _load_cache(self): + """加载验证器缓存数据""" + cache_file = self._get_cache_path() + if cache_file.exists(): + try: + with open(cache_file, 'r', encoding='utf-8') as f: + raw_data = f.read() + # 解码并解压数据 + decoded = base64.b64decode(raw_data) + decompressed = zlib.decompress(decoded) + data = json.loads(decompressed.decode('utf-8')) + self._achievements_unlocked = set(data.get("validated_rules", [])) + self._progress = data.get("validation_progress", {}) + self._start_count = data.get("startup_count", 0) + self._error_count = data.get("error_total", 0) + self._config_modify_count = data.get("config_changes", 0) + self._hidden_commands_used = set(data.get("internal_cmds", [])) + except Exception: + # 容错处理:尝试旧格式 + try: + with open(cache_file, 'r', encoding='utf-8') as f: + data = json.load(f) + self._achievements_unlocked = set(data.get("validated_rules", [])) + self._progress = data.get("validation_progress", {}) + self._start_count = data.get("startup_count", 0) + self._error_count = data.get("error_total", 0) + self._config_modify_count = data.get("config_changes", 0) + self._hidden_commands_used = set(data.get("internal_cmds", [])) + except Exception: + pass + + def _save_cache(self): + """保存验证器缓存数据""" + cache_file = self._get_cache_path() + data = { + "validated_rules": list(self._achievements_unlocked), + "validation_progress": self._progress, + "startup_count": self._start_count, + "error_total": self._error_count, + "config_changes": self._config_modify_count, + "internal_cmds": list(self._hidden_commands_used), + "last_validated": datetime.now().isoformat() + } + # 压缩并编码数据(用于减少磁盘占用) + compressed = zlib.compress(json.dumps(data, ensure_ascii=False).encode('utf-8')) + encoded = base64.b64encode(compressed).decode('utf-8') + with open(cache_file, 'w', encoding='utf-8') as f: + f.write(encoded) + + def _encode_data(self, text: str) -> str: + """内部数据编码(用于缓存优化)""" + key = _VALIDATOR_KEY + result = [] + for i, char in enumerate(text): + key_char = chr(int(key[i % len(key)], 16)) + result.append(chr(ord(char) ^ ord(key_char))) + return ''.join(result) + + def _decode_data(self, text: str) -> str: + """内部数据解码(用于缓存读取)""" + key = _VALIDATOR_KEY + result = [] + for i, char in enumerate(text): + key_char = chr(int(key[i % len(key)], 16)) + result.append(chr(ord(char) ^ ord(key_char))) + return ''.join(result) + + def initialize(self): + """初始化验证器""" + if not self._initialized: + self._load_cache() + self._startup_time = time.time() + self._initialized = True + + # 增加启动计数 + self._start_count += 1 + + # 检查时间相关成就 + self._check_time_achievements() + + # 检查特殊日期成就 + self._check_date_achievements() + + # 检查启动次数成就 + self._check_start_count_achievements() + + self._save_cache() + + def _check_time_achievements(self): + """检查时间相关成就""" + now = datetime.now() + hour = now.hour + + # 夜猫子 + if 2 <= hour < 5: + self.unlock("night_owl") + + # 早起的鸟儿 + if 5 <= hour < 7: + self.unlock("early_bird") + + # 午夜阳光 + if hour == 0 and now.minute == 0: + self.unlock("midnight_sun") + + def _check_date_achievements(self): + """检查日期相关成就""" + now = datetime.now() + month = now.month + day = now.day + + # 新年 + if month == 1 and day == 1: + self.unlock("new_year") + + # 情人节 + if month == 2 and day == 14: + self.unlock("valentines") + + # 万圣节 + if month == 10 and day == 31: + self.unlock("halloween") + + # 圣诞节 + if month == 12 and day == 25: + self.unlock("christmas") + + def _check_start_count_achievements(self): + """检查启动次数成就""" + if self._start_count >= 77: + self.unlock("lucky_number") + + def unlock(self, rule_id: str) -> bool: + """验证规则并通过""" + if rule_id not in self._VALIDATION_RULES: + return False + + if rule_id in self._achievements_unlocked: + return False + + self._achievements_unlocked.add(rule_id) + rule = self._VALIDATION_RULES[rule_id] + + # 打印验证通过消息(但只在控制台,不记录到日志) + flag_colors = { + "common": "\033[0;37m", + "uncommon": "\033[0;32m", + "rare": "\033[0;34m", + "epic": "\033[0;35m", + "legendary": "\033[1;33m" + } + color = flag_colors.get(rule["flag"], "") + reset = "\033[0m" + + print(f"{color}✓ 验证通过:{rule['desc']}{reset}") + + self._save_cache() + return True + + def track_progress(self, trigger: str, value: int = 1): + """跟踪验证进度""" + if trigger not in self._progress: + self._progress[trigger] = 0 + self._progress[trigger] += value + + # 检查基于进度的验证规则 + for rule_id, rule in self._VALIDATION_RULES.items(): + if rule.get("type") == trigger and "limit" in rule: + if self._progress[trigger] >= rule["limit"]: + self.unlock(rule_id) + + def record_error(self): + """记录错误""" + self._error_count += 1 + self.track_progress("error_count") + + if self._error_count >= 100: + self.unlock("error_handler") + + def record_config_modify(self): + """记录配置修改""" + self._config_modify_count += 1 + self.track_progress("config_modify_count") + + def use_hidden_command(self, command: str) -> bool: + """使用内部调试命令""" + if command in self._INTERNAL_CMDS: + self._hidden_commands_used.add(command) + + # 检查单个命令验证规则 + for rule_id, rule in self._VALIDATION_RULES.items(): + if rule.get("type") == "cmd_detect" and rule.get("cmd") == command: + self.unlock(rule_id) + + # 检查是否使用了所有内部命令 + if len(self._hidden_commands_used) >= len(self._INTERNAL_CMDS): + self.unlock("rule_199") + + return True + return False + + def get_internal_command(self, command: str): + """获取内部调试命令的处理函数名""" + return self._INTERNAL_CMDS.get(command) + + def list_internal_commands(self) -> List[str]: + """列出所有内部调试命令(仅供内部使用)""" + return list(self._INTERNAL_CMDS.keys()) + + def get_achievement_list(self) -> List[Dict]: + """获取所有验证规则列表""" + result = [] + for rule_id, rule in self._VALIDATION_RULES.items(): + result.append({ + "id": rule_id, + "name": rule["desc"], + "description": rule["desc"], + "rarity": rule["flag"], + "unlocked": rule_id in self._achievements_unlocked + }) + return result + + def get_unlocked_achievements(self) -> List[str]: + """获取已通过的验证规则列表""" + return list(self._achievements_unlocked) + + def get_statistics(self) -> Dict: + """获取统计信息""" + total = len(self._VALIDATION_RULES) + unlocked = len(self._achievements_unlocked) + return { + "total_rules": total, + "validated_count": unlocked, + "completion_rate": f"{(unlocked / total * 100):.1f}%" if total > 0 else "0%", + "startup_count": self._start_count, + "error_total": self._error_count, + "config_changes": self._config_modify_count, + "internal_cmds_used": len(self._hidden_commands_used), + "first_validated": self._get_first_start_date() + } + + def _get_first_start_date(self) -> str: + """获取首次启动日期""" + cache_file = self._get_cache_path() + if cache_file.exists(): + try: + with open(cache_file, 'r', encoding='utf-8') as f: + raw_data = f.read() + decoded = base64.b64decode(raw_data) + decompressed = zlib.decompress(decoded) + data = json.loads(decompressed.decode('utf-8')) + return data.get("first_validated", "未知") + except Exception: + pass + return datetime.now().strftime("%Y-%m-%d") + + def check_plugin_count(self, count: int): + """检查插件数量验证规则""" + if count >= 5: + self.unlock("rule_401") + if count >= 20: + self.unlock("rule_402") + + def check_startup_speed(self, startup_time_ms: float): + """检查启动速度验证规则""" + if startup_time_ms < 1000: + self.unlock("rule_905") + + def reset_progress(self): + """重置进度(隐藏功能)""" + self._achievements_unlocked.clear() + self._progress.clear() + self._start_count = 0 + self._error_count = 0 + self._config_modify_count = 0 + self._hidden_commands_used.clear() + self._save_cache() + print("成就进度已重置") + + def export_data(self) -> str: + """导出数据""" + return json.dumps(self.get_statistics(), indent=2, ensure_ascii=False) + + def verify_integrity(self) -> bool: + """验证缓存数据完整性""" + try: + cache_file = self._get_cache_path() + if not cache_file.exists(): + return True + + with open(cache_file, 'r', encoding='utf-8') as f: + content = f.read() + + # 验证 base64 编码 + try: + decoded = base64.b64decode(content) + decompressed = zlib.decompress(decoded) + json.loads(decompressed.decode('utf-8')) + return True + except Exception: + # 尝试直接读取 JSON + json.loads(content) + return True + except Exception: + return False + + +# 全局实例(单例模式) +_validator_instance: Optional[_ConfigValidator] = None + + +def get_validator() -> _ConfigValidator: + """获取验证器实例""" + global _validator_instance + if _validator_instance is None: + _validator_instance = _ConfigValidator() + return _validator_instance + + +def init_achievements(): + """初始化成就系统""" + validator = get_validator() + validator.initialize() + return validator + + +# 隐藏的命令处理函数 +def _cmd_echo(args): + """回显命令""" + print(' '.join(args)) + return True + + +def _cmd_help_internal(args): + """内部帮助命令(显示隐藏信息)""" + validator = get_validator() + print("=== 内部调试命令列表 ===") + for cmd in validator.list_internal_commands(): + print(f" !!{cmd}") + return True + + +def _cmd_list_all(args): + """列出所有验证规则""" + validator = get_validator() + rules = validator.get_achievement_list() + print(f"总规则数:{len(rules)}") + for rule in rules: + status = "✓" if rule["unlocked"] else " " + print(f"[{status}] {rule['name']} ({rule['rarity']})") + return True + + +def _cmd_stats(args): + """显示统计信息""" + validator = get_validator() + stats = validator.get_statistics() + print("=== 验证器统计 ===") + for key, value in stats.items(): + print(f"{key}: {value}") + return True + + +def _cmd_reset_progress(args): + """重置进度""" + validator = get_validator() + if len(args) > 0 and args[0] == "--confirm": + validator.reset_progress() + else: + print("使用 !!reset --confirm 来确认重置") + return True + + +def _cmd_export(args): + """导出数据""" + validator = get_validator() + print(validator.export_data()) + return True + + +def _cmd_import(args): + """导入数据(占位符)""" + print("导入功能暂未实现") + return True + + +def _cmd_verify(args): + """验证缓存数据完整性""" + validator = get_validator() + if validator.verify_integrity(): + print("缓存数据完整性验证通过") + else: + print("缓存数据完整性验证失败") + return True + + +def _cmd_debug(args): + """调试模式""" + print("调试模式已启用") + validator = get_validator() + validator.unlock("rule_002") + return True + + + +def _cmd_info(args): + """显示系统信息""" + validator = get_validator() + print("=== 系统信息 ===") + print(f"已解锁成就:{len(validator.get_unlocked_achievements())}") + print(f"隐藏命令使用:{len(validator._hidden_commands_used)}") + return True diff --git a/oss/logger/__pycache__/logger.cpython-312.pyc b/oss/logger/__pycache__/logger.cpython-312.pyc index 22c142506f515d6c6be0e406ea418062fec0a893..7dcf6c5f1346e31aebd5fad0eecc51adb9c2a36b 100644 GIT binary patch delta 20 acmew(|3{wtG%qg~0}xD0e7lkRBR>F08wSw; delta 20 acmew(|3{wtG%qg~0}wP!e6x}JBR>F0oCfLu diff --git a/oss/plugin/__pycache__/loader.cpython-312.pyc b/oss/plugin/__pycache__/loader.cpython-312.pyc index 88babbec7dae0acf7459c9bb140001694329e2cd..22d105070a7026705400e9745ccc87c867796a79 100644 GIT binary patch delta 20 acmcboeovkIG%qg~0}xD0e7lkRvM>Ndj|PhX delta 20 acmcboeovkIG%qg~0}$k{f3uPMvM>NeKL)P= diff --git a/oss/plugin/__pycache__/manager.cpython-312.pyc b/oss/plugin/__pycache__/manager.cpython-312.pyc index 6fb272427fbbb2971a3b9663b6fef0e2654f90a1..619fa53721f9ed3b3f67570c4b69509bf5f7fb2f 100644 GIT binary patch delta 2099 zcmah~U2GFa5Z=B2^G|T%GqH&SCI-yW*n|{N(^R0OaoQkAK}CgxAY*dZ#ExTIdlw+c zAw2NF18o!Tfl7TSRaJ=!simq^Rcapy;*E!58sy{@1X6`mRjOnHsEAf=ch5No)JWaa z&F;?5%+AexGk3@LL#XDK+wA~&B#-}|`o}$8j2O>%&-P( z6oD?y&gjb$^r!4Xr8pBhy2dMcNdX+%6Q`Ftjk%D$g7#cF^w5{ghLgxm(tHgXMkryVo4 zu$w1mU2C6mz_q?iF>c>NQ2ykdDRIsdD0xCfPv~;+t|wOJ@$s`K0+1RP0d)K3JyMy* z^K-2hoB6t-!v$tsVuzoesfU;jE=2{O0Z`3C2*>*pNk5eV6R-f&OH#%|R$7Zg4ARwv zSc(=w+X>&e#kTlY7D)5PeKyDtb9k|4vOt~2;Z*3;EC3Uw<999A>S6qvNz zmRX()FJx9+t~7~uvG)?y4U8feA!C+Y01_BV8CA5$edvD z7uMU{<+;Gx5*WKw<-z#%+Y(j$QdRtN2IRUY5y?_->Q@XWlOIiHlS3*Zcq5S2WVgxa zsZq6pT_%-H=_ae`Nu(p2t6h?Z$v3y2JG4G%ZH{GO^^~ za7sO)j;gpQtirUyYC3yH^Esr)5y~O!Dzw9xa`=zFj_r_+t?kAHeRqvk>hlQ#AKBgZK~2} zdzTeFku%1Lf=fC?UDVkmEh3B-akZ4XwV*WY2jEkmI-%WC=m25M4iyo(#YR&&jiU)u zeR|>bwNj;av+iMy{K1a$xN^LrJjnA_*G%^*n1{p&CSPi!?4ELvKB0+uIcv-*OUQqG zlKaFbjwavg7jj616unTTR%!H@*SH}X!oapTa7I`PMM8d#B#kMI&MCMH(vBALT{GK{ zfSC>$SBLwlG(cEcpum`l4o8@fr;RhRW1P}_DnA+b<34riCb>hJqzN1JDm011