feat(rvw): Complete V2.0 Week 3 - Statistical validation extension and UX improvements

Week 3 Development Summary:

- Implement negative sign normalization (6 Unicode variants)

- Enhance T-test validation with smart sample size extraction

- Enhance SE triangle and CI-P consistency validation with subrow support

- Add precise sub-cell highlighting for P-values in multi-line cells

- Add frontend issue type Chinese translations (6 new types)

- Add file format tips for PDF/DOC uploads

Technical improvements:

- Add _clean_statistical_text() in extractor.py

- Add _safe_float() wrapper in validator.py

- Add ForensicsReport.tsx component

- Update ISSUE_TYPE_LABELS translations

Documentation:

- Add 2026-02-18 development record

- Update RVW module status (v5.1)

- Update system status (v5.2)

Status: Week 3 complete, ready for Week 4 testing
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-02-18 18:26:16 +08:00
parent 9f256c4a02
commit f9ed0c2528
36 changed files with 2790 additions and 501 deletions

View File

@@ -0,0 +1,201 @@
# **临床统计特殊符号提取白皮书**
**用途:** 指导 Python (python-docx) 在提取 Word 表格时进行字符清洗和标准化。
**核心痛点:** 同一个数学含义,可能由多种不同的编码方式表示。
## **1\. 希腊字母类 (Greek Letters)**
这是最容易出现乱码或识别错误的重灾区。
|
| **符号** | **含义** | **常见 Unicode** | **Word 中的潜在坑 (Legacy Fonts)** | **处理建议** |
| ![][image1] | **卡方检验** | \\u03c7 (χ) \+ \\u00b2 (²) | 1\. 字体设为 "Symbol" 的 'c' 2\. 公式编辑器对象 | **正则匹配**\[\\u03c7\\u03a7\]2? **关键词**chi-square, chi |
| ![][image2] | 显著性水平 | \\u03b1 | 字体设为 "Symbol" 的 'a' | 替换为 alpha |
| ![][image3] | 回归系数/功效 | \\u03b2 | 字体设为 "Symbol" 的 'b' | 替换为 beta |
| ![][image4] | 总体均值 | \\u03bc | 字体设为 "Symbol" 的 'm' | 替换为 u 或 mean |
| ![][image5] | 总体标准差 | \\u03c3 | 字体设为 "Symbol" 的 's' | 替换为 std |
| ![][image6] | 变化量/差值 | \\u0394 (大写) | 字体设为 "Symbol" 的 'D' | 替换为 delta |
| ![][image7] | 相关系数 | \\u03c1 | 字体设为 "Symbol" 的 'r' | 替换为 rho |
**⚠️ 提取陷阱:** 很多老旧的 Word 文档(特别是中文期刊投稿)喜欢用 **Symbol 字体**。在 python-docx 提取 text 时,你可能会读到一个普通的英文字母 c但用户看到的是 ![][image8]。
* **解决方案**:检查 run.font.name。如果字体是 Symbol需要建立映射表c \-\> χ, a \-\> α)。
## **2\. 数学运算符类 (Operators)**
| **符号** | **含义** | **常见 Unicode** | **Word 变体** | **处理建议** |
| ![][image9] | **加减/标准差** | \\u00b1 | \+/-, \+ / \- | 统一标准化为 \\u00b1 |
| ![][image10] | 小于等于 | \\u2264 | \<=, \=\< | 统一为 \<= |
| ![][image11] | 大于等于 | \\u2265 | \>= | 统一为 \>= |
| ![][image12] | 不等于 | \\u2260 | \!=, \<\>, /= | 统一为 \!= |
| ![][image13] | 约等于 | \\u2248 | \~, \= | 统一为 \~= |
| ![][image14] | **负号/减号** | \\u2212 (Minus) | \\u002d (Hyphen), \\u2013 (En Dash) | **极高危!** 必须统一替换为标准连字符 \- (\\u002d),否则 float() 转换会报错 |
| ![][image15] | 乘号/交互项 | \\u00d7 | x, X, \* | 统一为 x |
**⚠️ 提取陷阱:** **“负号”是数据清洗中最大的坑**。Word 会自动把连字符Hyphen转成破折号Dash或数学减号Minus
* python 代码value.replace('\\u2212', '-').replace('\\u2013', '-')
## **3\. 统计学专用标记 (Statistical Notations)**
| **符号** | **含义** | **形式** | **提取难点** |
| ![][image16] | **样本均值** | x 上加横线 | 通常是 **Word 公式对象 (OMML)****域代码 (EQ)**python-docx 的 .text **读不出来横线**,只能读到 x。 |
| ![][image17] | 样本率 | p 上加尖帽 | 同上。 |
| ![][image18] | 决定系数 | R \+ 上标 2 | python-docx 默认读成 R2。**这通常可以接受**。 |
| ![][image19] | 下标 (如 ![][image20]) | 文本 \+ 下标 | python-docx 默认读成 Xsub。需要识别 font.subscript 属性。 |
**⚠️ 提取陷阱:** 对于 ![][image16] 这种带修饰符的字符python-docx 可能只能提取到底座字符 x。
* **策略**:对于数据侦探来说,通常我们关注的是表头里的 Mean 或 Average 关键词,而不是符号。如果表头只有 ![][image16],可能需要结合上下文推断。
## **4\. 拉丁字母的特殊含义 (Latin Context)**
虽然是普通字母,但在统计学上下文中具有特殊含义,通常以**斜体 (Italic)** 出现。
| **符号** | **含义** | **易混淆点** |
| ![][image21] | t 检验统计量 | 容易混淆为时间单位 t (time) 或 吨 (ton) |
| ![][image22] | F 检验统计量 | 女性 (Female) |
| ![][image23] | Z 检验统计量 | \- |
| ![][image24] | P 值 (概率) | 磷 (Phosphorus) |
| ![][image25] | 样本量 | 牛顿 (Newton) |
| ![][image26] | 相关系数 | 半径 (radius) |
| ![][image27] | 回归系数 | \- |
| ![][image28] | 优势比 | 手术室 (Operating Room), 或者 (or) |
| ![][image29] | 风险比 | 心率 (Heart Rate) |
| ![][image30] | 置信区间 | 心脏指数 (Cardiac Index) |
**⚠️ 提取策略:** 不能只看字符,要看**组合**。
* P 单独出现且数值在 0-1 之间 \-\> P 值。
* t 单独出现且数值 \> 0 \-\> t 值。
* CI 后面跟着括号 (1.2-3.4) \-\> 置信区间。
## **5\. Python 字符串清洗工具箱 (Cleaner Utils)**
建议在 DocxTableExtractor 中集成以下清洗函数:
import re
def clean\_statistical\_text(text):
if not text:
return ""
\# 1\. 归一化负号 (CRITICAL)
text \= text.replace('\\u2212', '-').replace('\\u2013', '-').replace('\\u2014', '-')
\# 2\. 归一化卡方 (Chi-square)
\# 处理 Symbol 字体的 'c'2 (需配合 run.font 检查,此处仅处理 Unicode)
text \= text.replace('\\u03c72', 'chi-square')
text \= text.replace('\\u03c7\\u00b2', 'chi-square')
text \= re.sub(r'\[Xxχ\]\\^?2', 'chi-square', text) \# 正则匹配常见变体
\# 3\. 归一化加减号
text \= text.replace('\\u00b1', '+/-')
\# 4\. 归一化比较符
text \= text.replace('≤', '\<=').replace('≥', '\>=')
\# 5\. 去除不可见字符 (Zero-width space 等)
text \= re.sub(r'\[\\u200b\\u200c\\u200d\\ufeff\]', '', text)
return text.strip()
## **6\. 总结**
在 Word 提取中,最大的“鬼怪”不是复杂的 ![][image1],而是:
1. **假的负号**(导致 float() 崩溃)。
2. **Symbol 字体**(导致 ![][image2] 变成 a
3. **多段落换行**(上一节已解决)。
只要处理好这三点99% 的统计表格都能被正确解析。
[image1]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAYCAYAAAD6S912AAABVElEQVR4Xu2Tu0rFQBCGIygICqeKwSL3VCKCBAR9DjsbSwttPKDYaWFnYyt2FoL6CBaWwmlObSW+gLUIR7+R2RAHi2wEKz8YdjLz75+9JEHwTxfSNL0mPjRWbd+LLMuOq6oKJS+KYiCmZVkuWF1nMLgn3lrPkyRJDtuaX6HbXrf1XmA0ZHVPtt6LPM/xS0e23gu9jCv3TL7f7gcse4l44QbPvzVaMGlRxrquZ8jH6Dc19oi6EcrbMLpRoRxwc4MO2Z47K/oPqmsiDMN5O+cL+cZEEMfxsqvp9l7bOh+m9a2P8qCrfrciLzB4FlPSKcaJjFbjBSZb7mxkhbbvTRRFc2p4anu9wGikhr0vogGTW2KDuBNTbn3WajqDwRkG25LzzRW6yl0j64ZMxOzI1MRQbtkP/oI1Jl7YOi/YEVNWe0CekV9azY9guGJrDj3PMX4ntvdnfALEtFcZX4GOowAAAABJRU5ErkJggg==>
[image2]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAZCAYAAAAFbs/PAAAAvUlEQVR4XmNgGAWjgDCQl5dfB8T/gXgWiJaTk1uBrgYOgJJxIEXS0tIyID6QbQXii4qK8kDlJ4iLi3ODFQMlgqGKhZHMAIn/BuITUPYvmDgj1BmnEUohACQGkpOVldVRUFBogAlGQ93rgqocLHcAatgnuCBQ50KQINx9SACmQVFR0QxZsBUkiKQODoDiSzHkZGRkOEGCQFoFWRxo8ymg+BaoBkagk/OQJSWgboXh7SBFIDkg+zVUrAeuYaQBAHSNOPrqSBJoAAAAAElFTkSuQmCC>
[image3]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAYCAYAAADOMhxqAAABD0lEQVR4Xu2QPYrCUBSFI6PgoIVNjJCYl5BCrANWU86AC7BxI4L7cANWNrZiYyG6ATsrl2BpI/hzzuMF8+4kVlPOgUuS7557ct9znH+9lCRJVyl1QG08z2vIvqUoinaosfn8wNDD9/3AMmWCcRrH8SDPMLBFLfNMKwiCTzYlBzsjaC45GzOkewJXuRLO1BZcD1z45L5hGI6Q2gI74X0ivRSTVvhDj4mm7qibNGoh5Qv1LTkGjqiF5GwssUJdch42W9VSIXQ03xf1uP9GQsqcZWVB7q4K7h/8hwOu6zatBhN4G2ma1jKG3TsmvZ/3agFeaebTmFhrtCrSy6T6rx3fifsX3X+pVMn9lwrmoWR/qifuh0EraUB3jQAAAABJRU5ErkJggg==>
[image4]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAXCAYAAAA/ZK6/AAAA0klEQVR4XmNgGAUjEMjLy09TUFAwQBYTFxfnBopLIouBAVAhB1DiPxB7IosD+b+BeCuyGEyiFaQBWUxGRkYaJCYnJ6eELA4GQInnIIwmVoVuCBxAnTMJTewJEL9FFgMDkJUgDYqKivrI4siGAOnDyBJg90tLS8sgiQXDDAHSikBDy5E1gNwPMu00iA8MsQogexZIDKjQFYhvAYUZkTWAFLcCFSoAJUOMjY1ZoVKMQKEAIM0MVwxzP9agwwZg7kcXxwnkIUGHEv54AShJMCB7iAAAALSHNqYCnl/cAAAAAElFTkSuQmCC>
[image5]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAXCAYAAAA/ZK6/AAAAlklEQVR4XmNgGAUjFMjKykrJycmFoGMpKSkRFIXy8vKaQPwfD+6FK1ZQUDgFFPiKpB9kQDRIIbIYGCgqKoqDJIBO0UEWB4oFYdUAFJyETQIothWbOEjiABB/wiIOcvcUdHGQ+xuAEm+RxYChUgYU+4sshgJAkkBFMUAmI5CeDuR/BLHR1aEAoEJtoG0BxsbGrOhyww0AAPUbLAw2jOhAAAAAAElFTkSuQmCC>
[image6]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAXCAYAAAAC9s/ZAAAA2klEQVR4XmNgGAW0BfLy8v/l5OS00cWJAkDNOSADgPg1uhxRAKr5H4iWkZFRQZfHCxQUFDKAuAGII6AGPUFXgxeANCGzoVgRWQ1OALW1GcYHBmIM1IDbyOpwAqjtjOhiIKyoqCiOLI4BgIqCgDZOwCIOi5Hr6HIoAKjgHwOa7TAAc4WysrIYuhwYAG12BSqYgi4OA0D5cpABwDA6hS4HBkDJn0CKBV0cGcBcoaSkxI8uYQnEy1EEsQBQ2oAacgBFAmQ7zHRiMTB1coI1A6NGH12SSLwexRUjGAAAzuRaDctwFcUAAAAASUVORK5CYII=>
[image7]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAYCAYAAADDLGwtAAAAv0lEQVR4XmNgGAVDCMjJyYUA8SMFBYVGdDkwMDY2ZpWXl/8PVOQK4gMVVgL5P9HVMUAVxcD46urqvCAxRUVFfbgioO4GkCBcgAGsUROq2RdZ8B8QH0AoA4tVoZgoLi7ODRKQlZX1Q1P4HMUWkAKQgKioKA9MTEZGhhMkBsTFcIUgK6Em2iKJvQe6+xBcEVQQpBOk+BiU/R+oyB9FEcg6qGko7sMAQEWe6O7DCoCKtoIUootjAKCiJ0A8BV2cbAAA6UU1lUA45VQAAAAASUVORK5CYII=>
[image8]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAYCAYAAADOMhxqAAAA6UlEQVR4XmNgGAUjCMjJyWkB8SMFBYWJ6HIwIC8vLwlmKCkp8QMVrjI2NmYFCv4H4p9oahkUFRXlgQbeQhdnAGpsAGmSlZXVgYmBDASKvUdWhwxYoLacAHGgtv5GV4QCgAoegDQBmYxA+h+IRleDAoCKoqG2/AfZgC6PAcTFxbmhGlrR5bACoMLTUA04PQoHQEWrgdgKiNeANAFDjQNdDRwAFfQAFSSA2MAwV4LakoOmDAJAEkDFlWhiIA2gUEIFwFg0A0rMQhcHGpAB0gS0rQzIVgCy54AlgBr00NTCAdQ/F4DqG9HliAYAE5c3TLQwFisAAAAASUVORK5CYII=>
[image9]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAXCAYAAADUUxW8AAAASUlEQVR4XmNgGAWDACgqKorLycmVo4sTBeTl5SVHNWMB4uLi3ECF/0nBCgoK8ejmoAB5YmzGBYazZmDIcaCHJiEMNDQM3ZyRAgBYPjDZl5qDigAAAABJRU5ErkJggg==>
[image10]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAXCAYAAADUUxW8AAAApUlEQVR4XmNgGAWDGKirq/OiixEE8vLyTkD8X05OLhddDicAakgCaVJQUPBHl8MJgBpqoJrM0eVwAqCz5oM0AbEiuhwuwAhUfByIf0lLSwujS+IFMH+BAgVdjmgA9F8E1J8R6HJEA1AgQaMlH12OaAAKNKh3pqLLEQ1UVFT4gAZ8A+J16HJEAxkZGU6gAVfRxQcIiIqK8gCdI0kMVlZWFqOeZnIBAHeIKM/15BGyAAAAAElFTkSuQmCC>
[image11]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAXCAYAAADUUxW8AAAAuElEQVR4XmNgGAV0BlJSUlzoYkQDRUVFdXl5+f9A3I0uRzSQlpYWBhrwC4i3A7mM6PJEAXFxcW6gAR+B+DyQy4wuTxQwNjZmBRrwEIhfycjIcKLLEwsYgQYcB7kG5Cp0SYJARUWFD6j5GxBvQ5fDCYCKFUExIScnNx9dDicARp8eNPpq0OVwAgUFBX+oTXHocjgBUEMS1CYndDm8AGjLAlAqQxcf5EBUVJQH6FdJYrCysrIY9TSTCwAyxylNVwCyZAAAAABJRU5ErkJggg==>
[image12]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAXCAYAAADUUxW8AAAAwElEQVR4Xu2TLQ7CQBSESwICjUDsPxa5GknCETgCN+AaaIJB4TBcgBNU4TgECUkFwTBFEDKhdAyOLxnzZee9Npstij+/I4RwZScRY5wjM/YS2HpnJ4GNC+/9lL0Ett7YSWDj0jk3YS+BrRW7dzo4sG5IiezZG2MsD2HqoReWEvjXFTJmzzR9dvXBPYOhIx7yAgc2SGKv0EXxzFICxV1Kaci+lZxzD+UTewkUD7jDAftWrLV9lI/sJfBytvUA9t94AERtLzqe3MJWAAAAAElFTkSuQmCC>
[image13]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAXCAYAAADUUxW8AAAAyElEQVR4XmNgGAWjgBSgqKhoJisrq4Mujg6kpKRE4BygBhN5efn/QPwOiv/LycmVIamHAwUFBQ6gfDRcAMh5jyQPE5sGMkRaWloGTfyukpISP5gjKirKA7TZFFkBDMjIyHACFf+CugqMgWr90NVRBoCmHoeZDvTXKXR5ZACUT4dzgBquA3EykmQC1JBIuCIoAAakKzxGoKGXg6YGDEAuABkC1BAD9L8qkL1fHjlwQZqB8SuPpAcFgAINqHkHUNNrIC5Glx8FJAAAcQAtugT4oBQAAAAASUVORK5CYII=>
[image14]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAXCAYAAADUUxW8AAAAJUlEQVR4XmNgGAWjYBRgB6Kiojzy8vKSxGBlZWUx6mkeBcMeAAA77grNb59DWgAAAABJRU5ErkJggg==>
[image15]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAXCAYAAADUUxW8AAAAYElEQVR4XmNgGAWjgFggJyenJC4uzo0ujgzk5eWz0MXgACj5V0lJiR9dHASAcl9xycEAIzYDQBplZGSEkMVwARQDSNEIA2ADyNEIAmRrJtvZ5AcYNo0wgDeqKE4kIwQAALb2HpmNGUynAAAAAElFTkSuQmCC>
[image16]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAXCAYAAADduLXGAAAAwUlEQVR4XmNgGAWUAgUFBQc5ObkQbBgozUK+YlIBI9CUBfLy8idkZGQ4QQJA9lQQH8hkhqtSUlLiByp8BGMDFfwH4q8gTUB6NhA/hysGScA5ED5IcauoqCgPlH0dLgnyHJJCTZACaWlpGbgCXACocBJIMbo4VgBU+BaIn6CLgwHUEyB3TQJyGWHuhckDnRgB5FuCOcBQ8AUpANFAHANVHA2SMzY2ZgWy38M0ggDItF9QRd1Am4Sg7P9AU08hKxyKAAAX4zkcMt6ZpQAAAABJRU5ErkJggg==>
[image17]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAWCAYAAAD5Jg1dAAAA8klEQVR4XuVROwrCQBRMQEGxEEGM5P+xsV7sxAtIbmCvtSew8BiClzJlGlsLK0vRmbC7bDaNvQND9s2bt2/IOs4/QAjRt7UOkiR5gB/P80Z2TwOGJ7gNw3BIc57nY9vTrINhYUhuHMelUf+INE3nmLxnWbZhXRRFhLU1eNYmrApgPIEDZmJG1cOwoIZjj8UVnERRtKLo+/5UGVEvqXFAac2AnNbAln3HCOEFVoaPWqVXS7gUeIPho5GZb1pQofFdKw1DB2qtp1T5wDcbqHes+TraRMh8tRwq8R9nLYNEkw882o0WmEuuCexeC/I2xYvdV/gC3FlC59JuS4oAAAAASUVORK5CYII=>
[image18]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAYCAYAAAARfGZ1AAABZklEQVR4Xu1TsUrEQBCNoIWoZYhFkk1SGK5SCFj4B4dgIRYnWFgINn6F32BlY+FPWFikt7W0UcRCK0EsDg59T2d1bi7KRe28B0N23pu8nd1MgmCCv0Ycx7POuQHiBXENasrW/BgwvPLrNE1PkD9o/Vdgx1mW9WTdYW5rPgDxEB3cyDEZd5Lfeg5m2/Y9IkmSjW/NPbyR5bHRDnk+rQZ+kOf5quWHEIbhvJjXVnNydPf+8TR/jhOtaK4RKOyKQbdBO5DOzxR3DONFrvHc/6xuALugQRRFcw3a29hVVTXDHGa7yPew2RbDnmgE0vXQfeMuI3B9xGOgZtnXqvjanN1KUZ9TIpPyRK4oiiVb3wp+nJy5b+RH5PlHar4VYFDTxN43P5Rsuqb5VhCDkfkGd0Eed79stbFQluWCmNdW85vyw1ptLMhY0WTTat6cDUj+bGsagcJT/7IOSNOqZl34S8Q9oqMsJvgveAWoLXtEEfJkvQAAAABJRU5ErkJggg==>
[image19]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAYCAYAAAB9ejRwAAAB6ElEQVR4Xu1VPUsDQRC9oIKiYCHhilyySbBULA4LxdJCBLEVbOwEsTKo2Ig/wEoEQQRLEaytLPwHWiiCICQSAglosLAKfryXzCabVQvJmVjcg+Fm583Ovd2d23OcECFC/AMkk8n5RCLxqJT6MCynefjPFndtzv9TxOPxEXlp3oyn0+lBxN7gdpnxtkHvBoVIKILxO59mXluBo9wRYfscc4dc1+2389oKiOrVuwUrx2Ixz87pCCDmTkTN2lzHADEXIiprcx0BhOzietjQR+h5Xp+d0wIiaI8l1rWJHyETDsVvaviggAVPoeatHf8WSJzksemx2fBmXqtAvTPUXrbjX4AjGsYK7u24ajT8hM0RcqmW5LjPGcNzFS89RexA0njP1RcGvwK7gWX4F9HxJoDY5iR8+kM2h+IzIqpgcwTiT3xiUaPwi05NAEVx3iU51PdV47i6RWD1IoafS6VSY8JVAw/ywrrpZOHLNg87qReo5RQlXnKa5+b5y6IPUcf6uBAbV0Y/wa+An9bjIMD/YISXK4q/wI40QaGG/4rdcMXfg60JVd21QL9uFsQOLIi/qKTvotHoAHeAvu/7PVogdmSTgvCc4xhzt5R86YEBBVdgBbF1i+Plm4cdqVpTZ51GH7EtrmAZc06I3+AT7/CY0r/wI/8AAAAASUVORK5CYII=>
[image20]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAYCAYAAAACqyaBAAABdElEQVR4Xu2UvUrEQBSFN6gg+IdoCCQmk4RASotoZ6eNjYUICj6Aj2DjE1iJrZWFiA9gYSfa+AI+g6VYWCnGc+UOTK6z2SyONu4Hw84992ROspNJrzdixL9EKXWBUXcZ8lpntAWkabqL3qvUnRCG4SKH38oe4fv+NHr3UncCnuyAwuM43jJkj0JpkiTJPDznRs8dCH6kcB1GIGwPoWtcjqGe1D2nyP0uimKW63HD5h5jv+X4kF7n2PY7iqIlaNemj/UF6C9SN8E6q8YDnMl+A8X7XZbljKFtYr83hO8Y2rpqOXJ5ns+hf6Rr8uKaE9PTQN+l1G1goaotPMuyZVqLboJqzE/7+gedb8mgcAmti/Eg9S+w2CGHb8uejWHC+cNUV1U10WhgkRsOleOyYRQMEw7f27fgn9A1HJ4n/Hg8d/NZtoXTEYX2rGsc3Tv4dvRQHd+nVsT21PS+kI7wFdTvQRBM8c1Zfb8GQval9ld4+KuvpNiPT1p0hAlGoqcTAAAAAElFTkSuQmCC>
[image21]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAYCAYAAAA20uedAAAAkElEQVR4XmNgGJ5AXl7+LRCfQBcHAUagxH8gLkKXYJCTkzMGSSoqKoojCzoDcQhQYh9IEsQGYbCkgoJCAFTyDxA/BLFBYnDdDFD7gILpyIJgALNPSkpKBF0OJDkfJIkuDgZAia9AfBVdHATQ/cciDwsIUVFRHqgXjEF8IH3L2NiYFaYTbicIi4uLc8MlBhsAAJtgJhSnxjfGAAAAAElFTkSuQmCC>
[image22]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAYCAYAAAAlBadpAAAAxElEQVR4XmNgGAUDBOTl5ZcC8X9iMLpeOMCnQEFBIRwo9xVdHAykpKREoJoPoMuBgKioKA9Q7jC6OBgATU4HaZaVlfVDEmYEaQIx5OTkBIFqFiLJIQBQ41WQZphiEAAqjgBqsoFymYF8DpgcCkD3r4qKCh+Uz4KkDBMg+Rcd/0NXiwGw+VdaWloGKLYVWR1WIA/1r7q6Oi+SmCfQvy7I6rACmDPRxQkCQvGLFwCdVg7VHIQuhxMANe2EORcNL0dXOwooBACXVke8Lnk3PAAAAABJRU5ErkJggg==>
[image23]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAXCAYAAADUUxW8AAAAyklEQVR4XmNgGAUDCOTl5U8D8X8o/iInJ/cIhpHEDdH1gQFIUkFBoRGL+B6oxmB0OTAASmgCNR5CFweKNUANrUSXgwOggjVKSkr8aGLBUBv3IItjABkZGSFkvqKiohlII9C/t5DFCQKQQVAb36PL4QUgv0H92IAuhxfg8iPQC+JAsSnIYigAnx+BYvOBcoro4mAACmWojV/R5YCABSSHLggGxsbGrFCNIAWMaNLMQPFfQLwVTRwCYBqB+BmWpAjGsrKyOuj6RgGJAAC82ER8WRO91wAAAABJRU5ErkJggg==>
[image24]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAYCAYAAAAlBadpAAAAwUlEQVR4XmNgGAUDBOTl5Zvk5OQeAen/UPwMxIeK/YKKPUXXhwJgmtHFZWRkOKFyt9HlwEBUVJQHquAAuhwI4DIYDIASniBJWVlZP3Q5oPMFCWneA5IEuQCLXDNITkFBIQNdDgxwmQwU04TKLUaXAwNxcXFumGYs+Ju0tLQwuh44APkTpBDorHR0OYIAqPEASLOUlJQIuhxBAHMiujhBoK6uzgvVfBpdjiAA+jOBZP8CNcxBClE4VlJS4kdXOwooBACwSUl+C0KXaQAAAABJRU5ErkJggg==>
[image25]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAYCAYAAACWTY9zAAAB5klEQVR4Xu1VPUsDQRA9MYKiIIpHIOSyuesCgsiBRdDOQhv/gH9Ba1stLLUIloJ2gqSwCVhYWAoWNoKViDaCQQQxjWL0TZy9TJaNJuKRIHkw7O6bz+zMbRynhx566GIopbYzmcwd1g8S7I+lPpvNDoJ/0HrIC2xWpU2sQMKqTo5jn0VfQEGhyccKJBxD4hJuZ52LWzFtwN07loJjBZIuo7hZbBNcWNViUzG52IGk51gSvD+j4jzPm9R6FB1A9iKHNoAubFBMbPvpjH0eco14+85PHYDhm9j7fGtXgtv8zXzBZ833/Rn4FyFPkDLFJx0KPlSWzkTg+SpKDucKFRcEwSifab7aBvxeeT2V8QhUNHF1awOqPl8R8GsWyAlywDbPUt8q4JfnlWKdGLpasZJrgBLzZfAUjN61AOuuqW8VruuOcKxFyTNXklwDVJM+g99h5xvMyZSpbxX4iJYoTjKZHNYczjmOnZO2EVKp1ESzqtPp9BA7N79up5akIJOaUJaW0b+L5mhscJ6XenK64M/WCugvIY8mr6EHWH3zxrG+4ceTveaUeBEo4BE7ROJY3hT19XRsmbxGGIYD0L+zvxUcf1pyaO+czkudkbo/BRKUTa7j4FmsPStdBRR1Sy01+Y4DNzZucv8On3wvkQo23MoxAAAAAElFTkSuQmCC>
[image26]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAZCAYAAADjRwSLAAAAi0lEQVR4XmNgGAWDFcjLy/8G4htycnK3gLQ3EH8D4gNAvAesQFlZWQwoOV1WVtYUKPgfpEFFRYVPQUGhA8j+BzNlK1CAA0hHgxTJyMioSElJcUE1vIUp8obSh+E6cQGozq3o4nAgKirKA1IEdJsLuhwcAB3tB1IEchu6HBwAFewhxj2fQMGALj7kAQCeXiVXaN2b2wAAAABJRU5ErkJggg==>
[image27]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAACA0lEQVR4Xu2VvUsDQRDFIygoCiIYY0KSzQcKqdNaiFjYayfYKv4DVoIIFrapA2JnEWwkYGFhby1YaBEJFkIIFhZqNL53mTuWyV24SFII+cFwyXu7s3N7s3eRyIgRIwZDLpdbNsY8ICrFYnFC+w4wj9Pp9DOubYkX/het7uqxWGxaz+0H5HhCrPF3MpmcYs5oNDqjx3nIwl9adycjfrQXFtzcWTabNbaGfDXEia158O5l0Yr2iHhtrYchn88vYG5Z67xBFHqgdQcY61wQ1xXtWTv0ob0wIOc1c9gaemmWObXuAbMqOzDu4zXpMYn2woC5DV6x+BKK22LfSM5NPdaD24doIeJW7LMQxKUeHxYUMIf5pUwmsyq5GFyrqcd6YPCkDLyyionzjnD9RDxi2JieFwbM3UYUfPQm1j3SukOv/gHjUuy7NsKAeXdaI9BvETWtO5ge/UOkoD+dMCP9ozGd91tgQXymQe8Yd4f6Lkj6p+u4E8lZ0rr9/qlqj0C/Eb/rREA7TKVSea27oEd2Eec++p7cYPcT4UI02Ue2Lo3+Jt6O7RFoRSk0cOfg3ZvOznsHAv8LnIP8i9ZQxyi7CQPiG5NOIz1OF8a8IlpB3yN4DesJOOG3YwPFBDzqRCIxb/x6ZNhg0brWCPvH+Lx/hgr66EJ/wV1MwPtnqAQVQ7BDG1r7V/wC9ySnHtFM7nIAAAAASUVORK5CYII=>
[image28]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAYCAYAAADtaU2/AAABw0lEQVR4Xu2UP0vDUBTFXwdB8d8gJUJCmoRCR4dMBcHVj+Dgp1BQcHLxCxTBxVVEcHbq5Oji6mBBRdxEECtUqHpOemNfbpJOiksOPNqc3733vXfzXoypVOk/5Pv+ZqPRuOEIgmBd818XJrnCZB/4DcSqifeF32UrNBG8aSzygTmMwRjyWTw+c9yyjs5N5DjOrAQda0alk5uSAmB75JgwVqgmdQfKNyaO4ymBXc1SoWAkhXc1o8DuyhYG/5OsXq/PadAvS0rFJFncvWaUsFftm/GOs/XRwg0Bp+PYvFqt1rzE9TULw9ARlntN8LbJ0KkdDQYETM4AJSSuSvHcjuFtSY0Vy64h54g+Nrdm+aMTKcXYholCzLnEdgpYjyw9zdaJvtCxidIDg/GsmVa6wCiKFktY5v16njcj/qHtJ3Jd1xOYa58t8DbjeKU0wwSu1Ch6v/SftG/f3Yk7Bh8yzhScel4vMn1/rW72bP9HAC9lRSmwLjm7oxkF9liUD+9AJi7+NqDgUlkAvGsydkYzUXpH3zWA1xF2wmd/9O1vZ4Kk5Uk75US+8T/veCZQ1Gw2F6RoZiB+3wrjopKa8M8wLi1WqdLf6Bvl9K3mDKixXwAAAABJRU5ErkJggg==>
[image29]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACEAAAAYCAYAAAB0kZQKAAABsElEQVR4Xu1VsUoDQRS0iJWKiIaThGSTFAZBSHEQ8A9MYyF2dtZWdnbiJ1jnCyxEW0kRSKet/oCFnU0QCwV1JsyFdy+XmMLC4gaW42Zm597uvmwWFnLkyDEHQggX1Wr1Gc9vjTe+QypEUbQk7SPR9X5sMxqNxlZWhuOu7ZxMJGbPE+C7KiD2mgU8A/qKxeKy5cvl8jr5Wq12b/kUEL6mIvpeI8C/TivQ4peFTNVGgHhEQ6VS2fcaoYCh5y14dPL1vFav1yNpX14bA+IDTX4bCQS0FND1mgX0jnwdr+EY7qghq+21MTSZZ37oBwJuFdDy8yzg6dHHHUm4OI4X2Qfk8dy0/hRMPzz6AjjAf1L38zzMQpJfxYs+fua9Ewh/0A88RvlS/YDMHRWyZ/kJBPVDs9lcydC2FT6zH7gA+VL9UCqVNlTEleUnoMmZ2w3+ktoc/dCnzzd20C7PXERSKcbAawT44bQCLaYtJGiXMU69NgbEE5kOvMbOlvbuNYvkNgwZCwH3ZPN5LLjiV0ciuvdGYmpAKpiLJTUQcG7yeX+0vUdjN/Hwg+L439P3GTly/Dv8APAywR01SopIAAAAAElFTkSuQmCC>
[image30]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAYCAYAAAAPtVbGAAABWklEQVR4Xu2TPUoEQRCFe0FBMVNhcGaYHzAxbhAEQ8ELGHgDT+AJvIGYG5l4BT2BGGpmoghG60YauIi+N1SvvW/HxYmdD5pl6qvuru7adq6nRymKYq8sy2v8PmEchDhiO0mSrMS5namq6gYLfWFcZVm2ZrF9fH/Wdb1Np3MQu8V4tnkcrywOamEqkdVZwhs+B1PSNSfz5u/VBcyPNd7gvV+0hJG6GObgVEcaJ3Bb9CjmXF0Dq2dCnufL6mKYk6bpusYJ3Klt4tXxvg+twkt1CvM0FoAbmp+5asqxnSJT1wWuwRvReNzsXyv8C+W8fuAvmtsmQ3VdKOf1A2LDNnlUp7RehcEi7TZm+wEGtsmLihj0axM5JxoP2BrvGp8AecckvhV1Bgtpf2Dupx8YF+omRA/xw8lxcYJV26D1Ggj8GeejH7vqFFb7YJvF41gTA3Cjlny+tyXN7fmHfANv5XKpcwl5NgAAAABJRU5ErkJggg==>