reproto 0.1.2__py3-none-any.whl → 0.1.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- .git/COMMIT_EDITMSG +1 -30
- .git/index +0 -0
- .git/logs/HEAD +4 -0
- .git/logs/refs/heads/iyue +4 -0
- .git/logs/refs/remotes/gitlab/iyue +4 -0
- .git/logs/refs/remotes/origin/iyue +4 -0
- .git/objects/00/81a7e1ec3251cc192ed2b73d5be897593fb872 +0 -0
- .git/objects/00/885cebf557ff261574deb93cb96449d06db01c +0 -0
- .git/objects/02/33f5b60263e5dc6d041c0b223a0724eb650faa +0 -0
- .git/objects/07/557fbd1d149ce51af8e98e8ca8590757a89dfa +0 -0
- .git/objects/08/760c38a9f9a4b5d4de0a1df0d197b27c1592d6 +0 -0
- .git/objects/12/f9cc4ad0b4f0af4f7bae379f281b2cebe7cc7f +0 -0
- .git/objects/22/316ec4a32601c236f997552e9600b7b40e3162 +0 -0
- .git/objects/24/d78e796570a8572a03bc1dd26608a7cfb506f8 +2 -0
- .git/objects/2a/fe93d8bcbeab9e136d8b6766604c32b3610314 +0 -0
- .git/objects/2d/8a0da260a710010ae62be134ac1cea6ceecfd1 +0 -0
- .git/objects/2d/e8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8 +0 -0
- .git/objects/30/9347e5681d80bd3c7949882e27090dd9070d16 +0 -0
- .git/objects/33/633c9df669ff8cf38638717937a54990814268 +0 -0
- .git/objects/39/993e3600bf4ab82aa361b738ee97a108787450 +0 -0
- .git/objects/3b/ab663710fd6b43d9372313fced9043c4cb07dd +0 -0
- .git/objects/3e/b3f1273caf6814dfa69325ccbd9fd1340cf20a +0 -0
- .git/objects/3f/ac4973433ec0116d2348fe7a748a0002702efb +0 -0
- .git/objects/40/c6c8816b3ebd8cac4fa36f20454c84aa5929d1 +0 -0
- .git/objects/45/fbc774dedb61c7c205ea732f59a8dca8d13555 +3 -0
- .git/objects/5d/3e5b3d75b03eba63deda0dcac7ca304d41e4da +0 -0
- .git/objects/60/5cb6fd6a9f8894ad4d43a9b8e4785c1b3b0e17 +1 -0
- .git/objects/60/f61a0ea50091eac8d344c86597375cbdfc2785 +0 -0
- .git/objects/63/ddda2a403efaab3f4c6597b3a73a7b1147adb5 +0 -0
- .git/objects/66/6c5c5fc30435228116fa08c9d821bebaaa8926 +0 -0
- .git/objects/7c/ef0adfb28fd774bc78061c6f088e1ef9b050f6 +0 -0
- .git/objects/7d/dc129188a10c68ab756ef2cacb292c76920403 +0 -0
- .git/objects/80/17038e0f7818a44a742f77c86f4f88ed768fcd +0 -0
- .git/objects/87/c7db6c91c17a2df84b56d30bd24a0f6b9dbdd9 +0 -0
- .git/objects/90/6b05fdb9211a7d32515bb2da31e58e4ca89916 +0 -0
- .git/objects/92/984cf67b2c25d435468a8218daa26ba0466054 +0 -0
- .git/objects/93/140b54b1fb9116ee214afee8abf2c72a232487 +0 -0
- .git/objects/93/68f2c32f83054ab072b7c9686d8baa0bad7f12 +4 -0
- .git/objects/9a/5ad062be9f6e001f4237a598a08981aba731e6 +0 -0
- .git/objects/a1/655e0cb323c300562f97dcc67d5a446908c8ec +0 -0
- .git/objects/a5/38cc82cef7c49500d3522220f0f60a9ebc1ae6 +0 -0
- .git/objects/a9/41063a7ce89c353fa24378ec7c3f12f08f9df8 +0 -0
- .git/objects/ac/5c983d949d8c928bb022badf801e45e75e785e +0 -0
- .git/objects/b0/82ca2c1b5a03edff25da3c2b2b573d049877e9 +0 -0
- .git/objects/b2/a941b669991d7e0f9bdc35f1014897a933f4e2 +1 -0
- .git/objects/bc/e98bdb71c8681acb460195fdcbbe5d36290976 +0 -0
- .git/objects/c1/87d5e047eca86cfd8d444be2987aaa3f62c4d6 +0 -0
- .git/objects/c4/c2da96b0bb8db2acb0e6615cf340c7e51af26b +0 -0
- .git/objects/c5/13a96e7584636b20b12280c029750d5bc3da1e +0 -0
- .git/objects/c7/c34283697bd3cce07db53953eda25ee7cc371e +0 -0
- .git/objects/c9/d60d922a04b87587cd67b0abf9fe5a7b7b76cd +0 -0
- .git/objects/d2/69b1676dbf32f76a7c405d0b4ea6a70ac3a626 +0 -0
- .git/objects/d3/5a918b1d9125ad35d60e08b181323df3246f1a +0 -0
- .git/objects/d8/eaf86669fbfd10497570c1784db1ed2696b588 +0 -0
- .git/objects/d9/90e6d553577d37ebce8b28b3015ecbde038b42 +0 -0
- .git/objects/da/13cc15bcd8ee39c81f36dee7f179a569ecab0b +0 -0
- .git/objects/e4/4c1d8a90207ac082d8ab7ff0db66708e2ebc31 +0 -0
- .git/objects/e6/5ff9bea681f0b8f409ec27761935883c1f0cc9 +0 -0
- .git/objects/f8/ed595d25bd9d500e765a792c513878f7ddb1f7 +0 -0
- .git/refs/heads/iyue +1 -1
- .git/refs/remotes/gitlab/iyue +1 -1
- .git/refs/remotes/origin/iyue +1 -1
- README.md +104 -190
- core/__init__.py +23 -0
- core/info_decoder.py +13 -4
- core/reconstructor.py +25 -16
- generation/__init__.py +17 -0
- generation/proto_generator.py +11 -5
- main.py +59 -56
- models/__init__.py +31 -24
- parsing/__init__.py +22 -0
- parsing/enum_parser.py +10 -2
- parsing/java_parser.py +7 -1
- pyproject.toml +2 -1
- reproto-0.1.4.dist-info/METADATA +210 -0
- {reproto-0.1.2.dist-info → reproto-0.1.4.dist-info}/RECORD +85 -31
- requirements.txt +3 -1
- utils/__init__.py +55 -0
- utils/builtin_proto.py +8 -1
- utils/file_cache.py +8 -1
- utils/report_utils.py +71 -0
- utils/type_index.py +8 -1
- utils/version_checker.py +311 -0
- core/bytecode_parser.py +0 -274
- reproto-0.1.2.dist-info/METADATA +0 -295
- {reproto-0.1.2.dist-info → reproto-0.1.4.dist-info}/WHEEL +0 -0
- {reproto-0.1.2.dist-info → reproto-0.1.4.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,210 @@
|
|
1
|
+
Metadata-Version: 2.3
|
2
|
+
Name: reproto
|
3
|
+
Version: 0.1.4
|
4
|
+
Summary: 一个强大的逆向工程工具, 能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构.
|
5
|
+
License: Proprietary
|
6
|
+
Keywords: protobuf,reverse-engineering,android,jadx,proto
|
7
|
+
Author: iyue
|
8
|
+
Author-email: ys1231@126.com
|
9
|
+
Requires-Python: >=3.12,<4.0
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
11
|
+
Classifier: Intended Audience :: Developers
|
12
|
+
Classifier: License :: Other/Proprietary License
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
14
|
+
Classifier: Programming Language :: Python :: 3.12
|
15
|
+
Classifier: Programming Language :: Python :: 3.13
|
16
|
+
Classifier: Topic :: Software Development :: Code Generators
|
17
|
+
Classifier: Topic :: Software Development :: Disassemblers
|
18
|
+
Requires-Dist: loguru (>=0.7.3)
|
19
|
+
Requires-Dist: packaging (>=25.0,<26.0)
|
20
|
+
Project-URL: Homepage, https://github.com/ys1231/reproto
|
21
|
+
Project-URL: Repository, https://github.com/ys1231/reproto.git
|
22
|
+
Description-Content-Type: text/markdown
|
23
|
+
|
24
|
+
# Protobuf Reconstructor
|
25
|
+
|
26
|
+
🔧 **从JADX反编译的Java源码自动重构Protobuf .proto文件**
|
27
|
+
|
28
|
+
一个强大的逆向工程工具,能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构。
|
29
|
+
|
30
|
+
## ✨ 特性
|
31
|
+
|
32
|
+
- 🎯 **精准解析**: 基于Google Protobuf Lite字节码的逆向工程
|
33
|
+
- 🔄 **递归依赖**: 自动发现和处理所有依赖的消息和枚举类型
|
34
|
+
- 📦 **完整支持**: 支持oneof、repeated、map、枚举等所有Protobuf特性
|
35
|
+
- 🌐 **通用性**: 适用于任何Android应用,无需硬编码映射
|
36
|
+
- 🧠 **智能推断**: 从Java源码直接读取类型信息,确保高准确性
|
37
|
+
- 📝 **标准输出**: 严格遵循Google Proto Style Guide
|
38
|
+
|
39
|
+
## 🛠️ 安装
|
40
|
+
|
41
|
+
### 方式一:拉取代码
|
42
|
+
```bash
|
43
|
+
# 克隆项目
|
44
|
+
git clone <repository_url>
|
45
|
+
cd reproto
|
46
|
+
|
47
|
+
# 安装依赖
|
48
|
+
pip install -r requirements.txt
|
49
|
+
```
|
50
|
+
|
51
|
+
### 方式二:pip安装
|
52
|
+
```bash
|
53
|
+
# 从本地构建安装
|
54
|
+
pip install .
|
55
|
+
|
56
|
+
# 在线安装
|
57
|
+
pip install reproto
|
58
|
+
```
|
59
|
+
|
60
|
+
## 📖 使用
|
61
|
+
|
62
|
+
### 命令行使用
|
63
|
+
```bash
|
64
|
+
# 基本用法 python main.py or 命令 reproto
|
65
|
+
reproto <java_sources_dir> <root_class> <output_dir> [--verbose]
|
66
|
+
|
67
|
+
# 示例:重构普通类
|
68
|
+
reproto ./out_jadx/sources com.example.messaging.v1.models.MessageData ./protos_generated
|
69
|
+
|
70
|
+
# 示例:重构内部类(注意:包含$的类名需要用单引号包裹)
|
71
|
+
reproto ./out_jadx/sources 'com.example.account.v1.Models$Onboarded' ./output
|
72
|
+
|
73
|
+
# 详细输出
|
74
|
+
reproto ./out_jadx/sources com.example.Model ./output --verbose
|
75
|
+
```
|
76
|
+
|
77
|
+
### 代码使用
|
78
|
+
```python
|
79
|
+
# 作为包使用
|
80
|
+
from core import ProtoReconstructor
|
81
|
+
from utils.logger import setup_logger
|
82
|
+
from pathlib import Path
|
83
|
+
|
84
|
+
# 初始化
|
85
|
+
setup_logger("./logs")
|
86
|
+
sources_dir = Path("./out_jadx/sources")
|
87
|
+
output_dir = Path("./protos_generated")
|
88
|
+
|
89
|
+
# 创建重构器并执行
|
90
|
+
reconstructor = ProtoReconstructor(sources_dir, output_dir)
|
91
|
+
results = reconstructor.reconstruct_from_root("com.example.Model")
|
92
|
+
|
93
|
+
# 查看结果
|
94
|
+
for class_name, definition in results.items():
|
95
|
+
print(f"生成: {class_name} -> {definition.proto_filename}")
|
96
|
+
```
|
97
|
+
|
98
|
+
### 参数说明
|
99
|
+
- `java_sources_dir`: JADX反编译的Java源码目录路径
|
100
|
+
- `root_class`: 要重构的根类完整类名
|
101
|
+
- `output_dir`: 生成的proto文件输出目录路径
|
102
|
+
- `--verbose`: 显示详细处理信息
|
103
|
+
|
104
|
+
## ⚠️ 注意事项
|
105
|
+
|
106
|
+
### 重要提醒
|
107
|
+
- **内部类命名**: 包含`$`符号的类名(如内部类)必须用**单引号包裹**
|
108
|
+
```bash
|
109
|
+
# ✅ 正确
|
110
|
+
reproto ./sources 'com.example.Outer$Inner' ./output
|
111
|
+
|
112
|
+
# ❌ 错误
|
113
|
+
reproto ./sources com.example.Outer$Inner ./output
|
114
|
+
```
|
115
|
+
|
116
|
+
### 使用建议
|
117
|
+
1. **JADX反编译**: 先使用JADX反编译APK文件
|
118
|
+
```bash
|
119
|
+
jadx -d out_jadx app.apk
|
120
|
+
```
|
121
|
+
|
122
|
+
2. **类名查找**: 在JADX GUI中找到目标Protobuf类的完整类名
|
123
|
+
|
124
|
+
3. **输出目录**: 确保输出目录有写入权限
|
125
|
+
|
126
|
+
4. **日志查看**: 使用`--verbose`参数查看详细处理过程
|
127
|
+
|
128
|
+
## 📊 输出示例
|
129
|
+
|
130
|
+
### 输入:Java源码
|
131
|
+
```java
|
132
|
+
public final class SearchResult extends GeneratedMessageLite {
|
133
|
+
private MapFieldLite<String, Contact> contacts_;
|
134
|
+
private Internal.ProtobufList<String> phoneNumbers_;
|
135
|
+
|
136
|
+
public static final int CONTACTS_FIELD_NUMBER = 1;
|
137
|
+
public static final int PHONE_NUMBERS_FIELD_NUMBER = 2;
|
138
|
+
}
|
139
|
+
```
|
140
|
+
|
141
|
+
### 输出:Proto文件
|
142
|
+
```protobuf
|
143
|
+
syntax = "proto3";
|
144
|
+
|
145
|
+
package com.example.search.v1.models;
|
146
|
+
|
147
|
+
option java_package = "com.example.search.v1.models";
|
148
|
+
option java_multiple_files = true;
|
149
|
+
|
150
|
+
message SearchResult {
|
151
|
+
map<string, Contact> contacts = 1;
|
152
|
+
repeated string phone_numbers = 2;
|
153
|
+
}
|
154
|
+
```
|
155
|
+
|
156
|
+
## 🛠️ 支持的特性
|
157
|
+
|
158
|
+
### Protobuf类型支持
|
159
|
+
- ✅ 基础类型:`string`, `int32`, `int64`, `bool`, `float`, `double`
|
160
|
+
- ✅ 消息类型:嵌套消息和引用消息
|
161
|
+
- ✅ 枚举类型:完整的枚举值解析
|
162
|
+
- ✅ 重复字段:`repeated` 类型
|
163
|
+
- ✅ 映射字段:`map<key, value>` 类型
|
164
|
+
- ✅ Oneof字段:互斥字段组
|
165
|
+
- ✅ Google Well-Known Types
|
166
|
+
|
167
|
+
### 特殊Java类型
|
168
|
+
- `MapFieldLite<K, V>` → `map<K, V>`
|
169
|
+
- `Internal.ProtobufList<T>` → `repeated T`
|
170
|
+
- `Internal.IntList` → `repeated enum` (枚举列表)
|
171
|
+
|
172
|
+
## 📁 项目结构
|
173
|
+
|
174
|
+
```
|
175
|
+
reproto/
|
176
|
+
├── main.py # 主程序入口
|
177
|
+
├── core/ # 核心组件
|
178
|
+
│ ├── reconstructor.py # 主协调器
|
179
|
+
│ └── info_decoder.py # 字节码解码器
|
180
|
+
├── parsing/ # 解析模块
|
181
|
+
│ ├── java_parser.py # Java文件解析器
|
182
|
+
│ └── enum_parser.py # 枚举解析器
|
183
|
+
├── generation/ # 生成模块
|
184
|
+
│ └── proto_generator.py # Proto文件生成器
|
185
|
+
├── models/ # 数据模型
|
186
|
+
│ └── message_definition.py # 消息和枚举定义
|
187
|
+
├── utils/ # 工具函数
|
188
|
+
│ ├── logger.py # 日志系统
|
189
|
+
│ ├── file_cache.py # 文件缓存系统
|
190
|
+
│ ├── type_utils.py # 类型处理工具
|
191
|
+
│ └── report_utils.py # 结果统计工具
|
192
|
+
└── include/ # Google Protobuf标准文件
|
193
|
+
└── google/protobuf/ # Well-Known Types
|
194
|
+
```
|
195
|
+
|
196
|
+
## 🔧 开发
|
197
|
+
|
198
|
+
```bash
|
199
|
+
# 使用Poetry管理依赖
|
200
|
+
poetry install
|
201
|
+
poetry shell
|
202
|
+
|
203
|
+
# 运行测试
|
204
|
+
reproto ../out_jadx/sources com.example.TestClass ../test_output --verbose
|
205
|
+
```
|
206
|
+
|
207
|
+
---
|
208
|
+
|
209
|
+
**🚀 立即开始重构你的Protobuf文件!**
|
210
|
+
|
@@ -1,4 +1,4 @@
|
|
1
|
-
.git/COMMIT_EDITMSG,sha256=
|
1
|
+
.git/COMMIT_EDITMSG,sha256=wCgfHzkY9fUofZeu8jlYfbP-HbC3oGukMStB0V5cK6A,36
|
2
2
|
.git/FETCH_HEAD,sha256=1W_vttZCTHf9DXnCOhWjilD3kVx9WT2Xu85YBetV3ok,191
|
3
3
|
.git/HEAD,sha256=ly8yuQLWQE8njkYAapHLPJ1xVg6_fMgQjCoHqKvFIdw,21
|
4
4
|
.git/config,sha256=9ZAySfDWBdI-K9eOXyrEQOhiX68AiaP0Z4CLzH07H10,399
|
@@ -17,18 +17,24 @@
|
|
17
17
|
.git/hooks/push-to-checkout.sample,sha256=pT0HQXmLKHxt16-mSu5HPzBeZdP0lGO7nXQI7DsSv18,2783
|
18
18
|
.git/hooks/sendemail-validate.sample,sha256=ROv8kj3FRmvACWAvDs8Ge5xlRZq_6IaN3Em3jmztepI,2308
|
19
19
|
.git/hooks/update.sample,sha256=jV8vqD4QPPCLV-qmdSHfkZT0XL28s32lKtWGCXoU0QY,3650
|
20
|
-
.git/index,sha256=
|
20
|
+
.git/index,sha256=S46Qz5JK2xQ0R0ZrtoDcknobMIA09k7V7jW1eWmpSLg,4139
|
21
21
|
.git/info/exclude,sha256=ZnH-g7egfIky7okWTR8nk7IxgFjri5jcXAbuClo7DsE,240
|
22
|
-
.git/logs/HEAD,sha256
|
23
|
-
.git/logs/refs/heads/iyue,sha256
|
24
|
-
.git/logs/refs/remotes/gitlab/iyue,sha256=
|
22
|
+
.git/logs/HEAD,sha256=ShXoDgUWGsr0BPUm81Uouu_5ALGmN02XxzUf3jvSnLU,3402
|
23
|
+
.git/logs/refs/heads/iyue,sha256=ShXoDgUWGsr0BPUm81Uouu_5ALGmN02XxzUf3jvSnLU,3402
|
24
|
+
.git/logs/refs/remotes/gitlab/iyue,sha256=eLuTgGW3hvFMkBfE_puyd-tyfv9f9kT1mY5V73UrSGU,2448
|
25
25
|
.git/logs/refs/remotes/origin/HEAD,sha256=4vCPTgC0N80jhmkFXNUlYvHtGllYJkQTGZEn6LlqZgs,163
|
26
|
-
.git/logs/refs/remotes/origin/iyue,sha256=
|
26
|
+
.git/logs/refs/remotes/origin/iyue,sha256=iPHY1VFHyGvSPN64fqG9pSZG6n6R2JBkUiJL3S3CITQ,2448
|
27
|
+
.git/objects/00/81a7e1ec3251cc192ed2b73d5be897593fb872,sha256=qvjEp_xD7FT8C2qIxFzoHETfgdG_Ilj-ZKMURK0woik,2268
|
28
|
+
.git/objects/00/885cebf557ff261574deb93cb96449d06db01c,sha256=AFzclJZweg-CmVNt99YI3Ho9dqghj1vsZrPI4Jy9mkI,288
|
29
|
+
.git/objects/02/33f5b60263e5dc6d041c0b223a0724eb650faa,sha256=M92vMZ87NltwEsn7mZuk87PtBP687n4-ET0qrPtk7Tg,507
|
27
30
|
.git/objects/03/3fab23ccc74b707a31f6f37dc5df42c100aac0,sha256=QeXQ9x_0kJVZzjaA6G8MSPxwkIdZxg3bQpOt3gPmUio,3536
|
31
|
+
.git/objects/07/557fbd1d149ce51af8e98e8ca8590757a89dfa,sha256=JWG_MmB15Ez0qpSsbn7QUORFRbzUVxt7KpR7tlikJsQ,2257
|
28
32
|
.git/objects/07/b71df33935c14ddf99e3480c04eca4685028bc,sha256=jk2YdZfFLF0_L6dtC5g3NXzhkuPzW8x5n5F2pD-Ih4s,1032
|
33
|
+
.git/objects/08/760c38a9f9a4b5d4de0a1df0d197b27c1592d6,sha256=DJ3Kc3LZiZssb0pkrP5g0WeztOvZa8jm0Bk7NVmEbJg,752
|
29
34
|
.git/objects/09/a92517fe9eeb33d2fd7c979e01d163665f7abc,sha256=wyFL5jJ16f0xCpL1MB5EiJvs2opieE0hMEmyDpUV3ps,9356
|
30
35
|
.git/objects/0b/e20ea749c6ae1075ae98f9426e00b0a4a235af,sha256=oRIrMdIqLj8tPUctDVp0A3INeadtii7UAn40HVOJQDY,19177
|
31
36
|
.git/objects/0c/7b11b535a18f311aedadbe91e14fc9fe6b50d9,sha256=1nmf96foQAXQrObKn9gOPugLMlpj7soMif1MBARmKd8,427
|
37
|
+
.git/objects/12/f9cc4ad0b4f0af4f7bae379f281b2cebe7cc7f,sha256=eA2WMZnt5zYXRw6O8u_slLMZxbwvOoOR9EAX8I2iDM0,168
|
32
38
|
.git/objects/13/5f50fea51c72f977f48d06a7584aba0f61e260,sha256=ecYtHQ_j-MSBN5YdAbHdDdfuJB4WJudHggEe9zUA0FY,1239
|
33
39
|
.git/objects/14/d323d58fb90c209a730c17e23fd82a6c735fc1,sha256=rTCuhPM5LYusLIMDv7CLC557SlRFvvbBzgr4jwrjMVg,426
|
34
40
|
.git/objects/15/eb3f02479e633439ec83c143e703f8448043a1,sha256=duJXtvq_NNhYKG7WdejXgoMlyHIaCUG5jv9SJpU_orc,14711
|
@@ -39,28 +45,41 @@
|
|
39
45
|
.git/objects/1e/46816d16e7c9db7575f1964403c3daa105be5c,sha256=Wqo7uWsh11BefjHvh2CEqowaA6zmNR-TcvNJv6WYjr4,459
|
40
46
|
.git/objects/20/cf56ec106bcd66420dd000279f983571b918b6,sha256=0dwZwG7CpR7yYYNvgYDxHLPj2P7eRLK7fTW_En419pk,166
|
41
47
|
.git/objects/21/55b64d52922c88527c102d62f23e5c2abbae79,sha256=6LLW2HrSfqqVwvO59yc-EcUp6MHw6zfHwu8TB775dII,13853
|
48
|
+
.git/objects/22/316ec4a32601c236f997552e9600b7b40e3162,sha256=YNjEPm2QQ9kRVdHdMyVyXMniijMSWKEg6iSnyeP1bnU,3409
|
42
49
|
.git/objects/23/bfbca38e177bcbb423dd782c35b19d127a5ab0,sha256=hYW2b3t3bVGNh4pqyyA7DMlyF4LfNZco5NwedWMwwuI,3700
|
50
|
+
.git/objects/24/d78e796570a8572a03bc1dd26608a7cfb506f8,sha256=V9cd-XeITtK7Mq7ecpJpWGpi23_5Ny-qnsY4jRHWdDQ,606
|
43
51
|
.git/objects/26/1f67f3b731b32f6d77de9dd7be2d61e2a14ace,sha256=mcasCBpCulVy2N-X_d2hg8567PdhZRof4ea5nYoelJM,96
|
44
52
|
.git/objects/27/24208ca2442e8ab9b453d0eb230fa41243b270,sha256=3nPNI4PWt3CdzVHzOVuTD522nSv9SS1T2U1kPBBt40I,50
|
45
53
|
.git/objects/29/4708b82b343e04e7a6685f5cd1287f3d17f7a9,sha256=YE3F4zucGeMHEw7bTEvQc0uJEUUCfEgw-mZTWupuNhA,96
|
54
|
+
.git/objects/2a/fe93d8bcbeab9e136d8b6766604c32b3610314,sha256=rG2er-EGko6WdUiYq106KxXwc-kQDXj8FAqt931D3nw,459
|
46
55
|
.git/objects/2b/64656ce2df6259c822733b03f26eb828fe9269,sha256=62hS2mVKecw3uXd8yGs7djzHNeouyhbP6KhR1gGYosg,166
|
47
56
|
.git/objects/2c/fcddd7eebeb4eee0562dc384a79366bc7b04bb,sha256=FHxE2giqoo-1IB9Q8i_XQUypGvQbRlRnTK0sbsNDcJE,96
|
48
57
|
.git/objects/2d/2b812ca27c477f9e1b2c2706a5eb795ffcf8eb,sha256=hATm5xxgdr9nhfzRX98_KBaPYdY9BbWNuTmJO7__Oxk,5518
|
58
|
+
.git/objects/2d/8a0da260a710010ae62be134ac1cea6ceecfd1,sha256=4F5UqKkv_Lg1gt2nwo6_WklFZxldCeEGbmwpSOSVvrs,122
|
49
59
|
.git/objects/2d/a515dbb88d31400d5b84d41caf270e9309232d,sha256=cP9jUGnu5pVr9ks-YJZSEjsgb7GKD2XEr8XvQosqs2s,122
|
60
|
+
.git/objects/2d/e8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8,sha256=TB1KNq7_JLKvNuYVyzJDi0sD8jvM3mmFqy4exWpiQxs,780
|
50
61
|
.git/objects/2e/2c1c42f5ac5d665cc672d3792078b756d9ab0e,sha256=5LG3jHGORJeswNw0lz5dc6QSsxztyMstbRDADhZDnZY,166
|
62
|
+
.git/objects/30/9347e5681d80bd3c7949882e27090dd9070d16,sha256=8MrOQUbawLupyywR0LMr9ldryJuFnShbWE11kaI9Qsw,97
|
51
63
|
.git/objects/33/181441ab38eded005db356da89b54c7d29f452,sha256=iIM6a2aGs_TGZjxHKnkYYyZj_hA77nAF7r2lMOtN1VA,2021
|
52
64
|
.git/objects/33/52dfa8f5d9eb46cc98ea7ccecf02e4d9df95f7,sha256=KNAvQNdSalt8CxCZVVb8e6KBC4zqVtusT5MriFLPbIQ,4409
|
65
|
+
.git/objects/33/633c9df669ff8cf38638717937a54990814268,sha256=T-g8iQIgxPSszRTJtvY9SLL6b6PPTLFwI99ZRIxuODY,252
|
53
66
|
.git/objects/34/192f0df5f5b694c881d086019eda349608d222,sha256=zcWIY4oDFz6n17MRjbwFrN1o-HEY0--gqK96dohmZfE,4901
|
54
67
|
.git/objects/35/8bace20b731ff1bbb256d2a0158dfc84720978,sha256=hEPGT0bRzT1GlXErWRWJ7ogflTWj3SutlHRKCBH1TII,426
|
55
68
|
.git/objects/38/907894973091f8e9b224a13fe596e1cb309cf5,sha256=XBdeTonV9fezxtk3kzI6DmEPb3WftSPaIWT30MKKw1E,802
|
69
|
+
.git/objects/39/993e3600bf4ab82aa361b738ee97a108787450,sha256=-hGYJt8FRCO90QesR_7HwxAo5gqkNWXOyOlKyVuctxc,17191
|
70
|
+
.git/objects/3b/ab663710fd6b43d9372313fced9043c4cb07dd,sha256=C2MsAjEcFMNDimrinw_yA4EvTmYGRkHkoTHOCv4dhf8,5608
|
56
71
|
.git/objects/3c/6f0120229cc2cd8123efbeb7f186eb0a485f29,sha256=iyh7Xt-m7vou3slm58k8xSl3Cn2yYXTuv5WziSWHrW0,802
|
57
72
|
.git/objects/3c/c3ca375694d43e35cdc88d4a5d067e510df427,sha256=A79FHqMtws8sYqMG9CmHWbEPaxF8htYc_E2wVuMi2u4,6570
|
58
73
|
.git/objects/3d/3cc6aab4eefed46c77dda27503bebcce88962c,sha256=6NOdtY3stGMa7_trzPhvb2T21Ng0WqFIJhkPhsW-ACU,420
|
74
|
+
.git/objects/3e/b3f1273caf6814dfa69325ccbd9fd1340cf20a,sha256=kBQ8krCCjNFnKOXS4OPkX60C7wQdUWtNJB1zs-LrPVc,2656
|
59
75
|
.git/objects/3e/d953d5ed2c66722045f5e39d068696a0853b4f,sha256=GelU4l-EVo8Y5rXSksIEnewIasEr9N54pTJcgrY3VVk,166
|
76
|
+
.git/objects/3f/ac4973433ec0116d2348fe7a748a0002702efb,sha256=xKKUEGEH8hWB4mhKhvJkSC23j4xwJJcr4Vo99kNPquQ,155
|
60
77
|
.git/objects/3f/b8830f516342a0ae1cb7c34b65016827cb9570,sha256=j36c6Wtp0Lp9HVP1xvV-2c25opLFzd3kzuxRHirgb9Y,803
|
61
78
|
.git/objects/40/84f4567d983a977c49598b7d886e46b13ff50b,sha256=R3w6EvxpJRcVuJvbCslrGDK07kcOjECGGosj5tO-JBo,426
|
79
|
+
.git/objects/40/c6c8816b3ebd8cac4fa36f20454c84aa5929d1,sha256=pcWmJXs3mDGeHCLW7AA0PkCRA_bcOIuhjD9e4fYzmVk,322
|
62
80
|
.git/objects/41/f40c22247de377be99e30784229f3f128508a2,sha256=3k-QVtbIvbMHt2cHrPJ0oh4TckwD6Pux6_v5J-EJhvY,2189
|
63
81
|
.git/objects/44/4af3a0d68ba81976f67c7b638c9b0db4640709,sha256=s__MvPzT4Ndsip8kgkfMh-Y0oZ28tv2kVqaz_ExQKvU,166
|
82
|
+
.git/objects/45/fbc774dedb61c7c205ea732f59a8dca8d13555,sha256=4AN9Jlc9SttC8DK9ADUjw9wTEYnASrz4HubQCpVgXVc,417
|
64
83
|
.git/objects/48/369b05749e384be9be58e5f943f3a0040d0f37,sha256=KP9dXx-XniZuIEXESlrL_MWWi55zGiFr7xtmp3oD67o,8551
|
65
84
|
.git/objects/48/cb11e75518a53be14146018214110986fade67,sha256=08B_QIXJL2_dGh_r-GmudDgLAmT-Bia0eRYyIbOKvFw,2562
|
66
85
|
.git/objects/4b/43f5f577e1cdc35f8e06d178d8f5c892034061,sha256=eawBjiWutNeKjIzvNonVMMKUVsz_-jn3Uew_NsKQJ-I,1150
|
@@ -75,11 +94,16 @@
|
|
75
94
|
.git/objects/5a/11f9d70791e06a0570e01d3dcbbae39cde55db,sha256=wjd8hb5D03icknLFsPqMas6xAFfG30_Wg-PJJH03ezg,13722
|
76
95
|
.git/objects/5b/d4d87753b79e9157817f0c2e6964a731052854,sha256=PK8JbTxqE1VLYE1hCBt6rPI6nSmJKnVnVYbpo42DftU,57
|
77
96
|
.git/objects/5c/715dcb05e32db7a7a3b030f07524bdd8a56849,sha256=wLXhy_1PP8n3Gd6NsvY1eFlK1pjkIjW35im_BD-0yMU,426
|
97
|
+
.git/objects/5d/3e5b3d75b03eba63deda0dcac7ca304d41e4da,sha256=ijAKnBWyR_h8s3B-C_j314y0zFiT_fdiQrGr3HiDVIQ,2352
|
78
98
|
.git/objects/5d/e2e9d536c2c0b78e8f9b3b61daa531a55332dc,sha256=Wiyz9xFF5A95FEnxZULmV9TSJf0-erTb_qIhLFIvmag,6558
|
79
99
|
.git/objects/5e/9daac72a48ce60688ab2eeddcc3d9152329e20,sha256=7sVW8qTIBHufxZ3WCnNwmX33RpciuLTPritqr84UmKk,426
|
100
|
+
.git/objects/60/5cb6fd6a9f8894ad4d43a9b8e4785c1b3b0e17,sha256=zmGY1G58wmmZq2KD_Bu3Sy4-9iKKFiYMK52xOHbYfA0,343
|
101
|
+
.git/objects/60/f61a0ea50091eac8d344c86597375cbdfc2785,sha256=q08wTKfTUrWaDDDEIiQMxG0rfLK5LyogjwXQTQ88QQI,1986
|
102
|
+
.git/objects/63/ddda2a403efaab3f4c6597b3a73a7b1147adb5,sha256=r4ZyBKnna37wrE8JwnYWK84WB1OVsnXGU3N8vGnP5mg,18987
|
80
103
|
.git/objects/65/0189fe083bd711e45d463b229a72be619abad2,sha256=A_rjGnyEfF5LPXsd1JWYWya49pffPhLzU4Gkg7p9Fcs,506
|
81
104
|
.git/objects/65/a4f0ada7519f8b1e6a7c7e287541b8effde9fd,sha256=jSGkVjAMcm2nrF6w_0U7lmzoBgwIJaf4P8POOlABxEQ,188
|
82
105
|
.git/objects/66/663db35bfec8ef5f1a5b1c840fde1bb62a0eb8,sha256=5xcSNodjk8EYRqTQHZIX7-0mG35aBsCzOkiqK2sIzRc,252
|
106
|
+
.git/objects/66/6c5c5fc30435228116fa08c9d821bebaaa8926,sha256=dym8X8VQl5GHh61t4umiy4z0oA_ATiKybPr4jIRjJk4,1165
|
83
107
|
.git/objects/66/7291e131d4769e7d028346a0cc7a0c05d500e5,sha256=3D6kzCQW7DkYuwARYA74Tlfzeaiaob9ux4YE6hYohas,4026
|
84
108
|
.git/objects/67/f27f77274917580e687fd00ca18da0660215c1,sha256=dxM9_T9v3VBrSXF3dbH6zsmbGQJn43-_DnHiDYs8108,15542
|
85
109
|
.git/objects/67/f54a4a3ede6749acc7c718ad97a86634215b5e,sha256=n0_tiP-u_DP9uhXCryaz98mNJYcUX8RYiS48FvxIxCA,744
|
@@ -88,50 +112,78 @@
|
|
88
112
|
.git/objects/76/311aa8e59d780763e0d66787067cc5d9613a67,sha256=J9Xy8ESXbWUbC_4sA0KumGVKm09tzlqA8C5oJ63a_b4,2167
|
89
113
|
.git/objects/78/3e7e252c20e73e33615c703174766036546ff6,sha256=cQ-PXyvzEYjb2Lr24anO9aGui5IxBxZCYXL6zZRc0xc,810
|
90
114
|
.git/objects/7c/00eec7ae9ef5f94fc337e5c8f9793a2a48810d,sha256=Ju-Yuy5EARcIThU4vkHrZuHQWu3MjXSZYGtBDTWR18c,96
|
115
|
+
.git/objects/7c/ef0adfb28fd774bc78061c6f088e1ef9b050f6,sha256=d9SniNMBerFoLZP7nlahqG6nPtrR6YVMjSSiJm5RRXs,2887
|
116
|
+
.git/objects/7d/dc129188a10c68ab756ef2cacb292c76920403,sha256=7jgXb9blUSWiQVPh8rpVxhpRQg9RyQS3zUSC1n7oGbY,17336
|
91
117
|
.git/objects/7e/5935774ee7a85f2523427c9100f9c578ac172f,sha256=ywEI3w5JgIOgFDJ6cxc6NJnLfEr2Cjynke78KmwJhSE,165
|
118
|
+
.git/objects/80/17038e0f7818a44a742f77c86f4f88ed768fcd,sha256=ZCTiAwFMKB3R7tU1zMGM-WZNU3Fy_DeAM2r-ukPIwdQ,284
|
119
|
+
.git/objects/87/c7db6c91c17a2df84b56d30bd24a0f6b9dbdd9,sha256=073he9D2S-4EPQh6cBs0Xm2dEOxPTwZrGstzcSkJGCE,3897
|
92
120
|
.git/objects/8a/0ed0ed8886fbc823e8d2258fa6d18699e94e25,sha256=VpidpA9wUduTJVrffzMKo4KL6HAhkBBxZEaNdGX9Ejw,122
|
93
121
|
.git/objects/8c/809c42c7ae13007fd885ee7bcffae7acf2c520,sha256=HYoU3_cZUGur3rWrgRvzHRAv0JfrXgc34R8UeGbC5Bc,14180
|
94
122
|
.git/objects/8d/44142ae2d6dbb59d4ebed8587bccd051e5766b,sha256=l1G5ZzQBQW8Lxd3WvGLRcY6quM6dBL4zdNT5ovjv3Dc,802
|
95
123
|
.git/objects/8d/4a5767bef0c342f1660526f9671c0944922c40,sha256=kP0nfEnyNmuEJ4wLQabhPPx60OIa5Dxqn7R9Ni89CqY,1900
|
96
124
|
.git/objects/8d/d857b3d0ab3f5cd2e9173d532ef86e30df8eda,sha256=dTFdFA8EPaLpDuJ4X-hfXjbwiAfKBY-EvFJ77H2mRxY,18883
|
125
|
+
.git/objects/90/6b05fdb9211a7d32515bb2da31e58e4ca89916,sha256=s9CyHii7wMQLwnQhCfvRoe2aKSoezlKhOyWfrfP8uPo,821
|
126
|
+
.git/objects/92/984cf67b2c25d435468a8218daa26ba0466054,sha256=EyDEXseNoUivqR25-icLPWkaKt2pimwOucf7u4TyAIw,130
|
97
127
|
.git/objects/92/c6018b4fb8e3b6c2f3f3054a56f2bfaca27470,sha256=Oox2busLjPpkXw6To9NfgDMXHuknlICbhyhyTWUT1lU,96
|
128
|
+
.git/objects/93/140b54b1fb9116ee214afee8abf2c72a232487,sha256=7VYYZiscg3mWnC4xmuQViLHakgctCXCTAonqA_76BAw,283
|
129
|
+
.git/objects/93/68f2c32f83054ab072b7c9686d8baa0bad7f12,sha256=GEtc_eOpbXXtFY1zj1dOlStEULevK-Lxr8O7PhjbvOg,431
|
98
130
|
.git/objects/94/ce01b61b90d1fb21d2d339fbeb22e821b6f413,sha256=oSSA97T7TGnstzHDjUrdwzwZO4d1qIUyjo6lz_EbNbM,122
|
99
131
|
.git/objects/95/295a15779ebefd563ec777c3d3cced7e8d0209,sha256=IIN8_K0K-3LAkUI4Ra3DS8yUsfpsqteSDGhgvRpSfZ4,426
|
100
132
|
.git/objects/97/56fe0931216a7c40cbf250e1ab8a6dfd589f13,sha256=Su7Q-bXO0K9QKEGC249NVuUS62xmQs5TgWfEmdbauaI,97
|
101
133
|
.git/objects/97/71dd4958faa94d3db229c129f6af35b508905a,sha256=Tc_ZkUqvJ4rk0QG5Bvwkp4DkMM9DlsmjdMIyDaO1S2k,756
|
134
|
+
.git/objects/9a/5ad062be9f6e001f4237a598a08981aba731e6,sha256=K1HnCs6nMYhqr8xsnBRqv6rRibDz4wPp8CoMT00hGOc,381
|
102
135
|
.git/objects/9a/e313cdf64cd82416c1238eb493e6396f799f12,sha256=9bPRhebwMVqtGqJUxfVq-TEUxceuOdSvicWe1H8F7Ks,876
|
103
136
|
.git/objects/9e/23448ac58f907d9d123c32bdccedbb3d6741b5,sha256=iqH9u5FAMzeSJ8QgFQnE1D2jPxIWx7b66Vd0RrqetvI,96
|
104
137
|
.git/objects/9e/9978522bc8ca79133d7c11ef8ca3fe3c7eed0a,sha256=FkHx7Pp6DCZ5e4bRo2RjRU875YBgl9tEw7Z_9Rii8cE,13109
|
105
138
|
.git/objects/9f/b57064e0c53ed80af8507acaab718a1e80184e,sha256=DGx0Ie-bppvghrmiV5w7mn24c6YlvHvYLIQsm-_jzsQ,635
|
106
139
|
.git/objects/a0/d192999af7e2cbfa6a9ccd04d720a04e5a06d5,sha256=Zd6l-w5TxqsdgCZqkDz_pr9BWPJGb5bmbDrFlMl2Qx8,882
|
107
140
|
.git/objects/a0/d630c3f6024b196d4ee933ab13a32905efdaaa,sha256=nNyB1T2FVU2vm3f-aAjEl-vBLbxYsKHibRIPhqCX9jQ,426
|
141
|
+
.git/objects/a1/655e0cb323c300562f97dcc67d5a446908c8ec,sha256=_b3Xk8IbERvYune9G8gOgOxFqc2o33xxzzAB_bZNIWM,806
|
108
142
|
.git/objects/a3/cedc28e563a1845a7860161b39b0fe58d5f0d3,sha256=Vee0H8dhSj4ERNDSAnRU6vebs0tbY1-lgYr1Nz5X7bc,122
|
143
|
+
.git/objects/a5/38cc82cef7c49500d3522220f0f60a9ebc1ae6,sha256=hgFU3fWeozpZCBrngHHTeUYH3C6lqKBSSz15-OuI_jM,9716
|
109
144
|
.git/objects/a5/b7e4e1b63bfb65288f6553687aaabcfb4d51b1,sha256=9tl9xb48EdvQk9GIg6mEzXSwqUgD6yEVZx-sVxaQVKw,1064
|
145
|
+
.git/objects/a9/41063a7ce89c353fa24378ec7c3f12f08f9df8,sha256=j-hYLtVwUhhYEY4BLe7J6m51GlpKdbZWUgKJwsEUt1M,389
|
110
146
|
.git/objects/a9/cc7923c34a4c97c5711d6309672f41d46c612a,sha256=NvxVg0v7oBl27tQ8feThD45Gw97gZ6ZbbqVUZbp3CYQ,1041
|
147
|
+
.git/objects/ac/5c983d949d8c928bb022badf801e45e75e785e,sha256=eji1dZ5VSnUSuD_KuyL2kD5ZqVTmxl6QzKh37HhFhPI,1068
|
111
148
|
.git/objects/ae/046e08176523e8a98dc7294436319f724db13c,sha256=9hdXV7BKRhfFTOz3FSuoYwGrcjvk2uTPo3CD1czuKcU,803
|
112
149
|
.git/objects/af/c9cc15629847447063e86a82b8b56abb4fc08f,sha256=dzjzk6kncEmUtMbBEhkOuThFWDb4-2AyaFmKHpGU_RI,3155
|
113
150
|
.git/objects/b0/7a43f0462bf25a8b1f4c0ca60c1b533dae1dde,sha256=JWzlC7nXy3RXBUxEcge1_ciMw6q3C5phffVck9MVlJk,404
|
151
|
+
.git/objects/b0/82ca2c1b5a03edff25da3c2b2b573d049877e9,sha256=Tn8y8C287Wd8ZZsQ4FgduAQMlD-ANm8l0i6XeA0J9mc,476
|
114
152
|
.git/objects/b1/db1c131cf32916028342c0037ce8eb57a8eb26,sha256=bgcHj-13lalI3KZLo4PS1xneLz-E1oSxp1qIfCiqSH0,17243
|
115
153
|
.git/objects/b2/8334b94392b8af397a05ed702690fa6c9ab1ca,sha256=QnXhDj4XDoGwytea6h_RgeaoWX3jXffxX6S7DcMzRZo,3461
|
154
|
+
.git/objects/b2/a941b669991d7e0f9bdc35f1014897a933f4e2,sha256=ZDcO2IZt7d6zBfixJDRRlhI6ICjNWKeziD4dZsDj2rs,168
|
116
155
|
.git/objects/b3/28dc445ee33220db9359370fc0089a77174101,sha256=cipG_34_tKM5VPfYW2wRCmBYOqlmTBIUjakeph9sfl4,3652
|
117
156
|
.git/objects/b3/d2b3037bede44e7e4d18dc99419f8c712c9c62,sha256=OIWo7wvTTKYZkYkxcZrOtnvfqgGlPezaE6sglITaF_Y,1156
|
118
157
|
.git/objects/b8/7c89dcfce9e244ff5ef6a4bd394de12e8c8092,sha256=kE2ed_VMlop9lFeD9xXhrmql0ybRkMT6SbgWSP-0f7I,1249
|
158
|
+
.git/objects/bc/e98bdb71c8681acb460195fdcbbe5d36290976,sha256=o-hyZsAo9YH-jq5u10qF9Ub07ttduIWahRk7XC15Huo,96
|
159
|
+
.git/objects/c1/87d5e047eca86cfd8d444be2987aaa3f62c4d6,sha256=NL3ke3EzpuAgSXzGAaSX6IyTxnnTtbx-_4PRxUYVnRM,122
|
119
160
|
.git/objects/c3/93db4841dbbb8acf54e9af12b6705c9f5ecde9,sha256=g36XyKIObniMsMBcIzsoG7f82SzOgn_Bdx-V9Rezjbg,3864
|
120
161
|
.git/objects/c3/c8594874dd9ff9c21662fd06cac9b5baadbba0,sha256=5YUWDZ-BMZvyOJksaoiKeZC0N-eRcOJemLb_jNUHcC4,14309
|
162
|
+
.git/objects/c4/c2da96b0bb8db2acb0e6615cf340c7e51af26b,sha256=CiygqPJlDIOMLlTCLtqGjX1-0nLuibvSqApdkzgx_Dk,130
|
163
|
+
.git/objects/c5/13a96e7584636b20b12280c029750d5bc3da1e,sha256=VLZ8PjQLeTsUdf5hJgRYEVffMMDcVPaND5S6p_G0QQ4,507
|
164
|
+
.git/objects/c7/c34283697bd3cce07db53953eda25ee7cc371e,sha256=Dml4LNMu14Kq4DUCqcD7PhPdwxCnnVe77BqS9bZYJr8,170
|
121
165
|
.git/objects/c8/2a656fe6b5d479b327cdf5fe3bf60db987a2a2,sha256=YNf8mWKTqJHeBDQCTfOU8b0ZDDSfbAb1fBGGDsySrHk,426
|
122
166
|
.git/objects/c8/cb3bb9552dcf6a368a1418996c4b925db2d8ab,sha256=3AlcdjxamfHKOBmAuectuKNLwOYa1BovnOmVElfwPb4,13097
|
123
167
|
.git/objects/c9/a6ca8f8efee4a5632e9a655ced29f1b708f35e,sha256=IOmxZbePi1cWHt2HzdDNtWy0SYR2XvigDkGK2fyNbWU,4957
|
124
168
|
.git/objects/c9/cdef9ab627b874ffe6455a47583a75bf16496d,sha256=7y908SUa7dmWJyNXDKS_tOdrcfmI6OjZc7zvtL38M5Y,428
|
169
|
+
.git/objects/c9/d60d922a04b87587cd67b0abf9fe5a7b7b76cd,sha256=__y7gpz4_Vp-4bf0WIBORv-fmu9OFyi42u7lE5mbpbU,2868
|
125
170
|
.git/objects/cd/2d6c229438c6b1c694b9392a85888d89ef49c1,sha256=IW9iGk3Eb-i_Ht64HQcltVp27ziQHz5IP6k5p57YFtY,122
|
126
171
|
.git/objects/d0/9c84ad2142a187bf26a1714b7041b62e404c8f,sha256=twhhaZbfU_mgu5LIlt9ZeGjp_PT_gri_9H231H5nrNc,2172
|
172
|
+
.git/objects/d2/69b1676dbf32f76a7c405d0b4ea6a70ac3a626,sha256=m7rrmOVyAvhOIaRUmhbOzSTY5WKs47KUo7wFsM4XR90,2368
|
173
|
+
.git/objects/d3/5a918b1d9125ad35d60e08b181323df3246f1a,sha256=XiS705YKH6IJsELw5ZgbSeLdKH2qw96denj85BNEJJY,284
|
174
|
+
.git/objects/d8/eaf86669fbfd10497570c1784db1ed2696b588,sha256=YLEdJmuYNQDi1sYzQr0H1gFdExgTKIsY_Ugosmnzf3Q,314
|
127
175
|
.git/objects/d9/3bd435c8c7ad4efb83dff04d5450fabb9e3faf,sha256=Dfce7XnTEPSLCJamlY36SeWUBiScdITejT2zhr9xwbg,2816
|
128
176
|
.git/objects/d9/6d7456245232b3e159dcf691f11e51224c557a,sha256=3w45hxiT2rn6ljSdgo36fHMMWZt30r5C1FPvbnjq9tc,597
|
177
|
+
.git/objects/d9/90e6d553577d37ebce8b28b3015ecbde038b42,sha256=KAWFa4xuE56xukGPMlcOjxQ6xh1FlSrTYvgGyMypTX0,96
|
178
|
+
.git/objects/da/13cc15bcd8ee39c81f36dee7f179a569ecab0b,sha256=j1qdeViwHsSkT6l8xwFVDZ82wa2y638a6LsvVrUQnho,2154
|
129
179
|
.git/objects/db/beedb30613f79ae3ff67df1428cf8ade223711,sha256=tTGayiwSvdy-uBiXQKRhNnToZ_dc1BmeXZ2mltuRfxY,3812
|
130
180
|
.git/objects/df/f8f64cee2b97df7d86f73207c5e690f98f0208,sha256=eRT2hUSKxaIPfQVnE9NaRGxbAvBVCSreSOGzVGtd7As,213
|
131
181
|
.git/objects/e2/b7433fbfbfac5bc800a962be2f4adbed145b42,sha256=eqX17kz7wSegBgSYS8q4oMPsZVvNWoDbpCRw7oI5PmE,15527
|
132
182
|
.git/objects/e3/27755808d88c7ae5c06c229cf18bd0519646df,sha256=GQJi0cnGbjOZLiK8-PyTZlVupBaT6g-ar2N-RJp0NN4,9619
|
133
183
|
.git/objects/e4/1e5aa2bc3074c2014d01ab1f603f69c327a83f,sha256=5daI7Vb9ehvOwoqgaBAKilm6Z6YdA4Rk4MFjJChbWpA,379
|
184
|
+
.git/objects/e4/4c1d8a90207ac082d8ab7ff0db66708e2ebc31,sha256=YJmX3vsaaoauuSFWAJqD3wriTdWueanhd_r5zroQqY8,232
|
134
185
|
.git/objects/e5/83e7c40be934d16a1fa2e973487b395d930f42,sha256=BLXKgjdPyjn2Y-x-OQfbdg5JXCq3Nrnvwh5PfGMpmxQ,1848
|
186
|
+
.git/objects/e6/5ff9bea681f0b8f409ec27761935883c1f0cc9,sha256=7ffpb5T9vtoe8pe6pXi4mytBTBsoyIxQfkAwwZNdeGA,458
|
135
187
|
.git/objects/e8/1433b6ad92206cdadbee1f474b4f99383314cb,sha256=mRMdmx6wCs6b-63QL72Iutm2AUVCOIYs7J5XbAsLluc,426
|
136
188
|
.git/objects/e8/2f42ea26b8bf4f0bc92c0648ac8f190f14226d,sha256=xtbEwloZnqXdNdViAevzyprosfPQ1P--xAu6URGlaYI,155
|
137
189
|
.git/objects/e9/a15996cb55ac72aeb6611d26e8d22246589943,sha256=sTn6X3xMp3_WYpj1CmP2hDqviX86aJHTCzzi_ZTpBKw,4643
|
@@ -144,6 +196,7 @@
|
|
144
196
|
.git/objects/f5/18c69a6e1bf3052b79da01502b2837ea58f0f4,sha256=r98SFbCvw7yeAYTjzkw-2VMhOVbpm79FLZQiC5A1-pw,123
|
145
197
|
.git/objects/f5/1be495b96272fa2e47f30071aed35ac1f0dd2c,sha256=xjweeKCHsLUlfdROM1YxycVfwVexy-_1VhEA8Ki4Rfc,5050
|
146
198
|
.git/objects/f7/25a430eb3364460ba854dbc8809edc21dc6c70,sha256=LdyMmAWGLWbn5G5fC7eAPi4NFOboKcJ6iJJdxENSUCk,2505
|
199
|
+
.git/objects/f8/ed595d25bd9d500e765a792c513878f7ddb1f7,sha256=yI_zqHGWaq_FUbEiqDWJcqrceTz2TNfSGcOjk7UeZ3c,97
|
147
200
|
.git/objects/fa/fc981b0d80d8d0323c04365785f66996ed5211,sha256=t9N37kVA7j_i4nz0dDMHOQpvziBu5MUpDlG06Hdj77c,4395
|
148
201
|
.git/objects/fc/e15b9dbffd9f37b1f2d46944ee2d0394df6565,sha256=81qdzKkVZ5C_1oej2Mm0q2RLifilVFolIs95mrUfpg4,163
|
149
202
|
.git/objects/fd/0bc07dc3c95e6168ab6d367d9eca139ac1e539,sha256=29lnkRe3MYSLwu997QipK5TLUYzZuOKhQmO3usm17H0,3002
|
@@ -152,20 +205,19 @@
|
|
152
205
|
.git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.pack,sha256=R4oMXhr-NcPAUBXStCbAaUvGUDW_SBECmPIbiB9Gy48,42003
|
153
206
|
.git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.rev,sha256=22_3sqyTNB5IbwAK5oCqNz0UxDDqoZ5jcF7p_44Lalo,244
|
154
207
|
.git/packed-refs,sha256=4H0m4wd6q98wZkBk7WfvVeTBuuxQdTE65XxsswYP-oQ,112
|
155
|
-
.git/refs/heads/iyue,sha256=
|
156
|
-
.git/refs/remotes/gitlab/iyue,sha256=
|
208
|
+
.git/refs/heads/iyue,sha256=XJe2ri3kBN17pZVvE6EJEbuay3Va7K726PguqvKtfc0,41
|
209
|
+
.git/refs/remotes/gitlab/iyue,sha256=XJe2ri3kBN17pZVvE6EJEbuay3Va7K726PguqvKtfc0,41
|
157
210
|
.git/refs/remotes/origin/HEAD,sha256=G8pFPTbCqnJ2IkCzz9J-STqOXWU6TrlXfpt1wx5bUWE,30
|
158
|
-
.git/refs/remotes/origin/iyue,sha256=
|
211
|
+
.git/refs/remotes/origin/iyue,sha256=XJe2ri3kBN17pZVvE6EJEbuay3Va7K726PguqvKtfc0,41
|
159
212
|
.gitignore,sha256=HHs2RDf54i9UJ3Z-pqWWCy8wyQLN7FCvz8Zm-RGN65s,2091
|
160
213
|
.python-version,sha256=NxOs_9lT1XG8y-FjlRru-YinX5RcBJt_ulPwgDESZ_o,7
|
161
214
|
ARCHITECTURE.md,sha256=HiUhP4wGzy4lD01MpHjOgAhuAUwpNsEac3tZaE65kos,12047
|
162
|
-
README.md,sha256=
|
163
|
-
core/__init__.py,sha256=
|
164
|
-
core/
|
165
|
-
core/
|
166
|
-
|
167
|
-
generation/
|
168
|
-
generation/proto_generator.py,sha256=DPPng-Nna3sW5d200D-P7vbOE8vx7X3R6cBwhq7cjqY,21958
|
215
|
+
README.md,sha256=CNBsu4ulQZ5JiU2aqlU3FsLof6DmpKfMtbhhjdGfp60,5399
|
216
|
+
core/__init__.py,sha256=PetkS7P_cuz8h9SSQmEJEQKUaaWf6geQnLKRq9uQzjY,688
|
217
|
+
core/info_decoder.py,sha256=WgvTTiVr2_bTtH7ip0Pf0C5OKNn-qeSELYOT10r04Aw,73764
|
218
|
+
core/reconstructor.py,sha256=LdSH6Z90xR3XdfOP27t-JMbbKU1RKKKwgL6K3WboMm4,62820
|
219
|
+
generation/__init__.py,sha256=fqZNYz3HzZb0TeF9KMiQ-Q0BdWuzKkSJ8hEXF4kzHuQ,427
|
220
|
+
generation/proto_generator.py,sha256=QTh2-b4rbY3sQZQFBAunL3rCiumvxzOHEvQ4tCEqSkM,22254
|
169
221
|
include/google/protobuf/any.proto,sha256=vPXebORjsaOP92t3lVqn5YC07BKvNKknsdRcnvsPr2Y,6154
|
170
222
|
include/google/protobuf/api.proto,sha256=naqFihxSn0f51O0bwt8Nq2FUrUL5nPA1Gz2p1Nr_jrA,7729
|
171
223
|
include/google/protobuf/compiler/plugin.proto,sha256=fjnlljCh8BGNcVv9D-NIHBYN4hRP9ZUsXj7SCizk-oI,8556
|
@@ -181,22 +233,24 @@ include/google/protobuf/struct.proto,sha256=G_B7qLmiTjoDkN3aw60NtBxjKH0lJ4iwI5gi
|
|
181
233
|
include/google/protobuf/timestamp.proto,sha256=FAUsYELB3S0LUCRfKBLqq26vgtsLbozkg-rlJ_c7bug,6449
|
182
234
|
include/google/protobuf/type.proto,sha256=4jDg5K64fJXp8casv8DHE9s_iAlPFJsVRxelHQIPdQs,6367
|
183
235
|
include/google/protobuf/wrappers.proto,sha256=aHjcdTTPmAXu5WNFzcOLXpyjneziRnEMZjxwB6Z_70k,5392
|
184
|
-
main.py,sha256=
|
185
|
-
models/__init__.py,sha256=
|
236
|
+
main.py,sha256=4OP5n4Hl7rVfZ2sAixerKvASJfauWzImUkxhm8W35Vk,6204
|
237
|
+
models/__init__.py,sha256=KVthXPEPwpKg45LaaX5EIHu6UMY8eLXMnx4rfJB84Xs,825
|
186
238
|
models/message_definition.py,sha256=AszUZnNPSBn9SMXne5ORDBiGZz1W2pcYmU8ftGC3Mks,4873
|
187
|
-
parsing/__init__.py,sha256=
|
188
|
-
parsing/enum_parser.py,sha256=
|
189
|
-
parsing/java_parser.py,sha256=
|
190
|
-
pyproject.toml,sha256=
|
191
|
-
requirements.txt,sha256
|
192
|
-
utils/__init__.py,sha256=
|
193
|
-
utils/builtin_proto.py,sha256=
|
194
|
-
utils/file_cache.py,sha256=
|
239
|
+
parsing/__init__.py,sha256=WBrRACzmxAN4_k7uUo3KSeywvlTJYp5iVSOnU2gNoF8,596
|
240
|
+
parsing/enum_parser.py,sha256=Yf59cDLTwIbPRQsuj0tgYUmmtpjY02llmSZ3XlsCqUk,6492
|
241
|
+
parsing/java_parser.py,sha256=PZ5gs2aJqcX8sRlC29QIOsrbI-OCRtaHsxkMyvYnkCA,33774
|
242
|
+
pyproject.toml,sha256=BsSlxTI53hy5pLze0sHDK3ajhUbb0Smia9UBAPYj_ms,1398
|
243
|
+
requirements.txt,sha256=-RokGvMGfwO1GtN-7eNyyfPFdQzD2gQzvb4sKFRqBlM,154
|
244
|
+
utils/__init__.py,sha256=wYvkPeNr30up14CBLK3UxMaGlvgYTjK-npgR2SMXgtU,1960
|
245
|
+
utils/builtin_proto.py,sha256=PiRdcJGKr02d8NbbedS14mjl6khtTbUzmlpso4q-NHA,9339
|
246
|
+
utils/file_cache.py,sha256=m6-fAQsSBVn8-BodjPsmA2C_OqWjnt6mjUyGhT1pFno,5433
|
195
247
|
utils/file_utils.py,sha256=N1Ei7hmyeOkIyZJFEXyNbtTrfeVF2hP-U8evXAVW2MA,4085
|
196
248
|
utils/logger.py,sha256=473DfzFVXzdGpiRTJGY6bBd-V5G80_P07gQqcvDChpQ,2447
|
197
|
-
utils/
|
249
|
+
utils/report_utils.py,sha256=ftXU27nscrKUPMVWRnjLwckrt4NVBkKAc4zGmgNHwbc,2873
|
250
|
+
utils/type_index.py,sha256=ni9hhR321unTQ9kfgsTum59VEh9nJMlUG0ca3V4rSHk,12354
|
198
251
|
utils/type_utils.py,sha256=H32JSIvq1TmZkAZZesEs4VQVc1VXQuJlSLTINTBVkK4,15947
|
199
|
-
|
200
|
-
reproto-0.1.
|
201
|
-
reproto-0.1.
|
202
|
-
reproto-0.1.
|
252
|
+
utils/version_checker.py,sha256=sgC4-DqRXPgdCov-fi60BIPo-5KY3MpvfHYyjQ-Ixbw,10560
|
253
|
+
reproto-0.1.4.dist-info/METADATA,sha256=LtxHIh5cKAWDYJWt4R-71pbFQEjTAqov97tPWmj4V2U,6388
|
254
|
+
reproto-0.1.4.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
255
|
+
reproto-0.1.4.dist-info/entry_points.txt,sha256=6Oro9lK_2DXDgHiB3andNuIE78wxfooqacqp8yY1C-g,37
|
256
|
+
reproto-0.1.4.dist-info/RECORD,,
|
requirements.txt
CHANGED
utils/__init__.py
CHANGED
@@ -1,3 +1,58 @@
|
|
1
|
+
"""
|
2
|
+
工具模块
|
3
|
+
|
4
|
+
包含各种辅助工具和实用程序:
|
5
|
+
- 日志系统:统一的日志管理
|
6
|
+
- 文件缓存:优化文件I/O性能
|
7
|
+
- 类型工具:类型转换和命名规范处理
|
8
|
+
- 内置Proto:Google Protobuf标准类型支持
|
9
|
+
- 报告工具:重构结果统计和展示
|
10
|
+
- 版本检测:通用版本更新检测系统
|
11
|
+
"""
|
12
|
+
|
13
|
+
# 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
|
14
|
+
try:
|
15
|
+
# 相对导入(包环境)
|
16
|
+
from .logger import setup_logger, get_logger
|
17
|
+
from .file_cache import get_file_cache
|
18
|
+
from .type_utils import type_mapper, naming_converter, field_name_processor
|
19
|
+
from .builtin_proto import get_builtin_manager
|
20
|
+
from .type_index import get_type_index
|
21
|
+
from .report_utils import print_results_summary
|
22
|
+
from .version_checker import (
|
23
|
+
VersionChecker, create_version_checker, check_pypi_version,
|
24
|
+
check_reproto_version, check_version_on_startup, get_package_version
|
25
|
+
)
|
26
|
+
except ImportError:
|
27
|
+
# 绝对导入(开发环境)
|
28
|
+
from utils.logger import setup_logger, get_logger
|
29
|
+
from utils.file_cache import get_file_cache
|
30
|
+
from utils.type_utils import type_mapper, naming_converter, field_name_processor
|
31
|
+
from utils.builtin_proto import get_builtin_manager
|
32
|
+
from utils.type_index import get_type_index
|
33
|
+
from utils.report_utils import print_results_summary
|
34
|
+
from utils.version_checker import (
|
35
|
+
VersionChecker, create_version_checker, check_pypi_version,
|
36
|
+
check_reproto_version, check_version_on_startup, get_package_version
|
37
|
+
)
|
38
|
+
|
39
|
+
__all__ = [
|
40
|
+
'setup_logger',
|
41
|
+
'get_logger',
|
42
|
+
'get_file_cache',
|
43
|
+
'type_mapper',
|
44
|
+
'naming_converter',
|
45
|
+
'field_name_processor',
|
46
|
+
'get_builtin_manager',
|
47
|
+
'get_type_index',
|
48
|
+
'print_results_summary',
|
49
|
+
'VersionChecker',
|
50
|
+
'create_version_checker',
|
51
|
+
'check_pypi_version',
|
52
|
+
'check_reproto_version',
|
53
|
+
'check_version_on_startup',
|
54
|
+
'get_package_version'
|
55
|
+
]
|
1
56
|
|
2
57
|
|
3
58
|
|
utils/builtin_proto.py
CHANGED
@@ -7,7 +7,14 @@ import os
|
|
7
7
|
import shutil
|
8
8
|
from pathlib import Path
|
9
9
|
from typing import Dict, Set, Optional
|
10
|
-
|
10
|
+
|
11
|
+
# 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
|
12
|
+
try:
|
13
|
+
# 相对导入(包环境)
|
14
|
+
from .logger import logger
|
15
|
+
except ImportError:
|
16
|
+
# 绝对导入(开发环境)
|
17
|
+
from utils.logger import logger
|
11
18
|
|
12
19
|
|
13
20
|
def find_include_directory() -> Optional[Path]:
|
utils/file_cache.py
CHANGED
@@ -10,7 +10,14 @@ Author: AI Assistant
|
|
10
10
|
from pathlib import Path
|
11
11
|
from typing import Optional, Dict
|
12
12
|
import threading
|
13
|
-
|
13
|
+
|
14
|
+
# 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
|
15
|
+
try:
|
16
|
+
# 相对导入(包环境)
|
17
|
+
from .logger import get_logger
|
18
|
+
except ImportError:
|
19
|
+
# 绝对导入(开发环境)
|
20
|
+
from utils.logger import get_logger
|
14
21
|
|
15
22
|
|
16
23
|
class FileContentCache:
|
utils/report_utils.py
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
"""
|
2
|
+
结果报告工具模块
|
3
|
+
|
4
|
+
提供重构结果的统计、报告和展示功能
|
5
|
+
"""
|
6
|
+
|
7
|
+
import sys
|
8
|
+
from typing import Dict, Any, TYPE_CHECKING
|
9
|
+
|
10
|
+
# 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
|
11
|
+
if TYPE_CHECKING:
|
12
|
+
try:
|
13
|
+
# 相对导入(包环境)
|
14
|
+
from ..core.reconstructor import ProtoReconstructor
|
15
|
+
except ImportError:
|
16
|
+
# 绝对导入(开发环境)
|
17
|
+
from core.reconstructor import ProtoReconstructor
|
18
|
+
|
19
|
+
|
20
|
+
def print_results_summary(reconstructor: 'ProtoReconstructor', results: Dict[str, Any], logger, verbose: bool) -> None:
|
21
|
+
"""
|
22
|
+
打印重构结果的详细统计信息
|
23
|
+
|
24
|
+
Args:
|
25
|
+
reconstructor: 重构器实例
|
26
|
+
results: 重构结果字典
|
27
|
+
logger: 日志记录器
|
28
|
+
verbose: 是否显示详细信息
|
29
|
+
"""
|
30
|
+
if not results:
|
31
|
+
logger.error("❌ 没有生成任何proto文件!")
|
32
|
+
logger.error("请检查:")
|
33
|
+
logger.error(" 1. 根类名是否正确")
|
34
|
+
logger.error(" 2. Java源码目录是否包含对应的文件")
|
35
|
+
logger.error(" 3. 类是否为protobuf消息类")
|
36
|
+
|
37
|
+
# 显示详细的失败信息
|
38
|
+
if hasattr(reconstructor, 'failed_classes') and reconstructor.failed_classes:
|
39
|
+
logger.error("失败的类:")
|
40
|
+
for failed_class, reason in reconstructor.failed_classes.items():
|
41
|
+
logger.error(f" • {failed_class}: {reason}")
|
42
|
+
|
43
|
+
sys.exit(1)
|
44
|
+
|
45
|
+
# 统计成功和失败的数量
|
46
|
+
success_count = len(results)
|
47
|
+
failed_count = len(reconstructor.failed_classes) if hasattr(reconstructor, 'failed_classes') else 0
|
48
|
+
total_attempted = success_count + failed_count
|
49
|
+
|
50
|
+
logger.success("✅ 重构完成!")
|
51
|
+
logger.info(f"📊 处理统计: 共尝试处理 {total_attempted} 个类型")
|
52
|
+
|
53
|
+
# 统计消息和枚举数量
|
54
|
+
message_count = sum(1 for r in results.values() if hasattr(r, 'fields'))
|
55
|
+
enum_count = sum(1 for r in results.values() if hasattr(r, 'values'))
|
56
|
+
|
57
|
+
logger.info(f" - ✅ 成功: {success_count} 个 (消息: {message_count}, 枚举: {enum_count})")
|
58
|
+
|
59
|
+
# 显示失败的类
|
60
|
+
if hasattr(reconstructor, 'failed_classes') and reconstructor.failed_classes:
|
61
|
+
logger.warning(f" - ❌ 失败: {failed_count} 个")
|
62
|
+
for failed_class, reason in reconstructor.failed_classes.items():
|
63
|
+
logger.warning(f" • {failed_class}: {reason}")
|
64
|
+
|
65
|
+
# 显示跳过的类
|
66
|
+
if hasattr(reconstructor, 'skipped_classes') and reconstructor.skipped_classes:
|
67
|
+
skipped_count = len(reconstructor.skipped_classes)
|
68
|
+
logger.info(f" - ⏭️ 跳过: {skipped_count} 个 (基础类型或已处理)")
|
69
|
+
if verbose:
|
70
|
+
for skipped_class, reason in reconstructor.skipped_classes.items():
|
71
|
+
logger.info(f" • {skipped_class}: {reason}")
|