diff --git a/.gitignore b/.gitignore
index d40ae39..16474dd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,6 +31,8 @@ MANIFEST
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
+!md2gost.spec
+!md2gost.fast.spec
# Installer logs
pip-log.txt
@@ -130,6 +132,7 @@ venv.bak/
# md2gost diagram PNG cache
.md2gost-cache/
+md2gost/vendor/*.jar
# LaTeX build artefacts
*_latex/
@@ -172,3 +175,9 @@ cython_debug/
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
.idea/
+
+# md2gost runtime (created next to app / cwd on first run)
+md2gost.schemes.json
+md2gost.include-cache.json
+include-cache/
+.md2gost-cache/
diff --git a/ReadMe.docx b/ReadMe.docx
new file mode 100644
index 0000000..0bc0b6e
Binary files /dev/null and b/ReadMe.docx differ
diff --git a/_bpmn_preview.png b/_bpmn_preview.png
new file mode 100644
index 0000000..05cf39e
Binary files /dev/null and b/_bpmn_preview.png differ
diff --git a/_bpmn_sprites.puml b/_bpmn_sprites.puml
new file mode 100644
index 0000000..541241d
--- /dev/null
+++ b/_bpmn_sprites.puml
@@ -0,0 +1,3468 @@
+' auto-generated geometric sprites (BPMN 2.0 notation)
+sprite $evStart [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000012345432100000000000000000000
+0000000000000000259BCCCCCCCB95200000000000000000
+0000000000000027CC95322122359CC72000000000000000
+00000000000016CB520000000000025BC610000000000000
+000000000003AC6100000000000000016CA3000000000000
+00000000004BA300000000000000000003AB400000000000
+0000000004B8100000000000000000000018B40000000000
+000000003B810000000000000000000000018B3000000000
+00000001AA100000000000000000000000001AA100000000
+00000006C30000000000000000000000000003C600000000
+0000002C6000000000000000000000000000006C20000000
+0000007B1000000000000000000000000000001B70000000
+000002C500000000000000000000000000000005C2000000
+000005C200000000000000000000000000000002C5000000
+000009900000000000000000000000000000000099000000
+00001B50000000000000000000000000000000005B100000
+00002C30000000000000000000000000000000003C200000
+00003C20000000000000000000000000000000002C300000
+00004C20000000000000000000000000000000002C400000
+00005C10000000000000000000000000000000001C500000
+00004C20000000000000000000000000000000002C400000
+00003C20000000000000000000000000000000002C300000
+00002C30000000000000000000000000000000003C200000
+00001B50000000000000000000000000000000005B100000
+000009900000000000000000000000000000000099000000
+000005C200000000000000000000000000000002C5000000
+000002C500000000000000000000000000000005C2000000
+0000007B1000000000000000000000000000001B70000000
+0000002C6000000000000000000000000000006C20000000
+00000006C30000000000000000000000000003C600000000
+00000001AA100000000000000000000000001AA100000000
+000000003B810000000000000000000000018B3000000000
+0000000004B8100000000000000000000018B40000000000
+00000000004BA300000000000000000003AB400000000000
+000000000003AC6100000000000000016CA3000000000000
+00000000000016CB520000000000025BC610000000000000
+0000000000000027CC95322122359CC72000000000000000
+0000000000000000259BCCCCCCCB95200000000000000000
+000000000000000000012345432100000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evStartMsg [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000012345432100000000000000000000
+0000000000000000259BCCCCCCCB95200000000000000000
+0000000000000027CC95322122359CC72000000000000000
+00000000000016CB520000000000025BC610000000000000
+000000000003AC6100000000000000016CA3000000000000
+00000000004BA300000000000000000003AB400000000000
+0000000004B8100000000000000000000018B40000000000
+000000003B810000000000000000000000018B3000000000
+00000001AA100000000000000000000000001AA100000000
+00000006C30000000000000000000000000003C600000000
+0000002C6000000000000000000000000000006C20000000
+0000007B1000000000000000000000000000001B70000000
+000002C500000000000000000000000000000005C2000000
+000005C200000008888888888888888800000002C5000000
+000009900000008FFFFFFFFFFFFFFFFF8000000099000000
+00001B500000008FDA88888888888ADF800000005B100000
+00002C300000008F854000000000458F800000003C200000
+00003C200000008F815510000015518F800000002C300000
+00004C200000008F800451000154008F800000002C400000
+00005C100000008F800036202630008F800000001C500000
+00004C200000008F800002646200008F800000002C400000
+00003C200000008F800000252000008F800000002C300000
+00002C300000008F800000000000008F800000003C200000
+00001B500000008FB8888888888888BF800000005B100000
+000009900000008FFFFFFFFFFFFFFFFF8000000099000000
+000005C200000008888888888888888800000002C5000000
+000002C500000000000000000000000000000005C2000000
+0000007B1000000000000000000000000000001B70000000
+0000002C6000000000000000000000000000006C20000000
+00000006C30000000000000000000000000003C600000000
+00000001AA100000000000000000000000001AA100000000
+000000003B810000000000000000000000018B3000000000
+0000000004B8100000000000000000000018B40000000000
+00000000004BA300000000000000000003AB400000000000
+000000000003AC6100000000000000016CA3000000000000
+00000000000016CB520000000000025BC610000000000000
+0000000000000027CC95322122359CC72000000000000000
+0000000000000000259BCCCCCCCB95200000000000000000
+000000000000000000012345432100000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evStartTimer [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000012345432100000000000000000000
+0000000000000000259BCCCCCCCB95200000000000000000
+0000000000000027CC95322122359CC72000000000000000
+00000000000016CB520000000000025BC610000000000000
+000000000003AC6100000000000000016CA3000000000000
+00000000004BA300000000000000000003AB400000000000
+0000000004B8100000000000000000000018B40000000000
+000000003B810000000000000000000000018B3000000000
+00000001AA100000000000000000000000001AA100000000
+00000006C30000000000000000000000000003C600000000
+0000002C6000000000000000000000000000006C20000000
+0000007B1000000000000133310000000000001B70000000
+000002C50000000000039BBBBB93000000000005C2000000
+000005C200000000006C8312138C600000000002C5000000
+000009900000000006B400151004B6000000000099000000
+00001B50000000003C40001510004C30000000005B100000
+00002C30000000009800001510000890000000003C200000
+00003C2000000001B3000015100003B1000000002C300000
+00004C2000000003B1000015111001B3000000002C400000
+00005C1000000003B0000015555300B3000000001C500000
+00004C2000000003B1000001111001B3000000002C400000
+00003C2000000001B3000000000003B1000000002C300000
+00002C30000000009800000000000890000000003C200000
+00001B50000000003C40000000004C30000000005B100000
+000009900000000006B400000004B6000000000099000000
+000005C200000000006C8310138C600000000002C5000000
+000002C50000000000039BBBBB93000000000005C2000000
+0000007B1000000000000133310000000000001B70000000
+0000002C6000000000000000000000000000006C20000000
+00000006C30000000000000000000000000003C600000000
+00000001AA100000000000000000000000001AA100000000
+000000003B810000000000000000000000018B3000000000
+0000000004B8100000000000000000000018B40000000000
+00000000004BA300000000000000000003AB400000000000
+000000000003AC6100000000000000016CA3000000000000
+00000000000016CB520000000000025BC610000000000000
+0000000000000027CC95322122359CC72000000000000000
+0000000000000000259BCCCCCCCB95200000000000000000
+000000000000000000012345432100000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evStartSignal [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000012345432100000000000000000000
+0000000000000000259BCCCCCCCB95200000000000000000
+0000000000000027CC95322122359CC72000000000000000
+00000000000016CB520000000000025BC610000000000000
+000000000003AC6100000000000000016CA3000000000000
+00000000004BA300000000000000000003AB400000000000
+0000000004B8100000000000000000000018B40000000000
+000000003B810000000000000000000000018B3000000000
+00000001AA100000000000000000000000001AA100000000
+00000006C30000000000000000000000000003C600000000
+0000002C6000000000000000000000000000006C20000000
+0000007B1000000000000003000000000000001B70000000
+000002C500000000000000373000000000000005C2000000
+000005C200000000000001646100000000000002C5000000
+000009900000000000000351530000000000000099000000
+00001B50000000000000162026100000000000005B100000
+00002C30000000000000450005400000000000003C200000
+00003C20000000000001620002610000000000002C300000
+00004C20000000000004500000540000000000002C400000
+00005C10000000000026200000262000000000001C500000
+00004C20000000000054000000045000000000002C400000
+00003C20000000000261000000016200000000002C300000
+00002C30000000000540000000004500000000003C200000
+00001B50000000002610000000001620000000005B100000
+000009900000000054111111111114500000000099000000
+000005C200000002666666666666666200000002C5000000
+000002C500000000111111111111111000000005C2000000
+0000007B1000000000000000000000000000001B70000000
+0000002C6000000000000000000000000000006C20000000
+00000006C30000000000000000000000000003C600000000
+00000001AA100000000000000000000000001AA100000000
+000000003B810000000000000000000000018B3000000000
+0000000004B8100000000000000000000018B40000000000
+00000000004BA300000000000000000003AB400000000000
+000000000003AC6100000000000000016CA3000000000000
+00000000000016CB520000000000025BC610000000000000
+0000000000000027CC95322122359CC72000000000000000
+0000000000000000259BCCCCCCCB95200000000000000000
+000000000000000000012345432100000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evStartCond [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000012345432100000000000000000000
+0000000000000000259BCCCCCCCB95200000000000000000
+0000000000000027CC95322122359CC72000000000000000
+00000000000016CB520000000000025BC610000000000000
+000000000003AC6100000000000000016CA3000000000000
+00000000004BA300000000000000000003AB400000000000
+0000000004B8100000000000000000000018B40000000000
+000000003B810000000000000000000000018B3000000000
+00000001AA100000000000000000000000001AA100000000
+00000006C30000000000000000000000000003C600000000
+0000002C6000000004888888888884000000006C20000000
+0000007B100000004BFFFFFFFFFFFB400000001B70000000
+000002C5000000008FB888888888BF8000000005C2000000
+000005C2000000008F80000000008F8000000002C5000000
+00000990000000008F80000000008F800000000099000000
+00001B50000000008F80000000008F80000000005B100000
+00002C30000000008F82555555528F80000000003C200000
+00003C20000000008F80000000008F80000000002C300000
+00004C20000000008F80000000008F80000000002C400000
+00005C10000000008F82555555528F80000000001C500000
+00004C20000000008F80000000008F80000000002C400000
+00003C20000000008F80000000008F80000000002C300000
+00002C30000000008F82555555528F80000000003C200000
+00001B50000000008F80000000008F80000000005B100000
+00000990000000008F80000000008F800000000099000000
+000005C2000000008F80000000008F8000000002C5000000
+000002C5000000008FB888888888BF8000000005C2000000
+0000007B100000004BFFFFFFFFFFFB400000001B70000000
+0000002C6000000004888888888884000000006C20000000
+00000006C30000000000000000000000000003C600000000
+00000001AA100000000000000000000000001AA100000000
+000000003B810000000000000000000000018B3000000000
+0000000004B8100000000000000000000018B40000000000
+00000000004BA300000000000000000003AB400000000000
+000000000003AC6100000000000000016CA3000000000000
+00000000000016CB520000000000025BC610000000000000
+0000000000000027CC95322122359CC72000000000000000
+0000000000000000259BCCCCCCCB95200000000000000000
+000000000000000000012345432100000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evStartError [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000012345432100000000000000000000
+0000000000000000259BCCCCCCCB95200000000000000000
+0000000000000027CC95322122359CC72000000000000000
+00000000000016CB520000000000025BC610000000000000
+000000000003AC6100000000000000016CA3000000000000
+00000000004BA300000000000000000003AB400000000000
+0000000004B8100000000000000000000018B40000000000
+000000003B810000000000000000000000018B3000000000
+00000001AA100000000000000000000000001AA100000000
+00000006C30000000000000000000000000003C600000000
+0000002C6000000000000000100000000000006C20000000
+0000007B1000000000000001510000000000001B70000000
+000002C500000000000000045000000000000005C2000000
+000005C200000000000000162000000000000002C5000000
+000009900000000000000045000000000000000099000000
+00001B50000000000000016300000000000000005B100000
+00002C30000000000000036100000000000000003C200000
+00003C20000000000000164111100000000000002C300000
+00004C20000000000000366666610000000000002C400000
+00005C10000000000000621114400000000000001C500000
+00004C20000000000002644426200000000000002C400000
+00003C20000000000002444555000000000000002C300000
+00002C30000000000000000662000000000000003C200000
+00001B50000000000000001660000000000000005B100000
+000009900000000000000027300000000000000099000000
+000005C200000000000000461000000000000002C5000000
+000002C500000000000000640000000000000005C2000000
+0000007B1000000000000151000000000000001B70000000
+0000002C6000000000000010000000000000006C20000000
+00000006C30000000000000000000000000003C600000000
+00000001AA100000000000000000000000001AA100000000
+000000003B810000000000000000000000018B3000000000
+0000000004B8100000000000000000000018B40000000000
+00000000004BA300000000000000000003AB400000000000
+000000000003AC6100000000000000016CA3000000000000
+00000000000016CB520000000000025BC610000000000000
+0000000000000027CC95322122359CC72000000000000000
+0000000000000000259BCCCCCCCB95200000000000000000
+000000000000000000012345432100000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evStartEsc [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000012345432100000000000000000000
+0000000000000000259BCCCCCCCB95200000000000000000
+0000000000000027CC95322122359CC72000000000000000
+00000000000016CB520000000000025BC610000000000000
+000000000003AC6100000000000000016CA3000000000000
+00000000004BA300000000000000000003AB400000000000
+0000000004B8100000000000000000000018B40000000000
+000000003B810000000000000000000000018B3000000000
+00000001AA100000000000000000000000001AA100000000
+00000006C30000000000000000000000000003C600000000
+0000002C6000000000000000000000000000006C20000000
+0000007B1000000000000000000000000000001B70000000
+000002C500000000000000000000000000000005C2000000
+000005C200000000000000000000000000000002C5000000
+000009900000000000000000000000000000000099000000
+00001B50000000000000000000000000000000005B100000
+00002C30000000000000000100000000000000003C200000
+00003C20000000000000002620000000000000002C300000
+00004C20000000000000026662000000000000002C400000
+00005C10000000000000263636200000000000001C500000
+00004C20000000000002621612620000000000002C400000
+00003C20000000000026201610262000000000002C300000
+00002C30000000000263112621136200000000003C200000
+00001B50000000001666666666666610000000005B100000
+000009900000000001111126211111000000000099000000
+000005C200000000000000161000000000000002C5000000
+000002C500000000000000151000000000000005C2000000
+0000007B1000000000000001000000000000001B70000000
+0000002C6000000000000000000000000000006C20000000
+00000006C30000000000000000000000000003C600000000
+00000001AA100000000000000000000000001AA100000000
+000000003B810000000000000000000000018B3000000000
+0000000004B8100000000000000000000018B40000000000
+00000000004BA300000000000000000003AB400000000000
+000000000003AC6100000000000000016CA3000000000000
+00000000000016CB520000000000025BC610000000000000
+0000000000000027CC95322122359CC72000000000000000
+0000000000000000259BCCCCCCCB95200000000000000000
+000000000000000000012345432100000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evStartMulti [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000012345432100000000000000000000
+0000000000000000259BCCCCCCCB95200000000000000000
+0000000000000027CC95322122359CC72000000000000000
+00000000000016CB520000000000025BC610000000000000
+000000000003AC6100000000000000016CA3000000000000
+00000000004BA300000000000000000003AB400000000000
+0000000004B8100000000000000000000018B40000000000
+000000003B810000000000000000000000018B3000000000
+00000001AA100000000000000000000000001AA100000000
+00000006C30000000000000000000000000003C600000000
+0000002C6000000000000000000000000000006C20000000
+0000007B1000000000000013100000000000001B70000000
+000002C500000000000001565100000000000005C2000000
+000005C200000000000036313630000000000002C5000000
+000009900000000000146200026410000000000099000000
+00001B50000000000255100000155200000000005B100000
+00002C30000000003630000000003630000000003C200000
+00003C20000000016200000000000261000000002C300000
+00004C20000000005300000000000350000000002C400000
+00005C10000000002500000000000520000000001C500000
+00004C20000000001610000000001610000000002C400000
+00003C20000000000530000000003500000000002C300000
+00002C30000000000350000000005300000000003C200000
+00001B50000000000161000000016100000000005B100000
+000009900000000000531111111350000000000099000000
+000005C200000000003666666666300000000002C5000000
+000002C500000000000111111111000000000005C2000000
+0000007B1000000000000000000000000000001B70000000
+0000002C6000000000000000000000000000006C20000000
+00000006C30000000000000000000000000003C600000000
+00000001AA100000000000000000000000001AA100000000
+000000003B810000000000000000000000018B3000000000
+0000000004B8100000000000000000000018B40000000000
+00000000004BA300000000000000000003AB400000000000
+000000000003AC6100000000000000016CA3000000000000
+00000000000016CB520000000000025BC610000000000000
+0000000000000027CC95322122359CC72000000000000000
+0000000000000000259BCCCCCCCB95200000000000000000
+000000000000000000012345432100000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evStartPar [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000012345432100000000000000000000
+0000000000000000259BCCCCCCCB95200000000000000000
+0000000000000027CC95322122359CC72000000000000000
+00000000000016CB520000000000025BC610000000000000
+000000000003AC6100000000000000016CA3000000000000
+00000000004BA300000000000000000003AB400000000000
+0000000004B8100000000000000000000018B40000000000
+000000003B810000000000000000000000018B3000000000
+00000001AA100000000000000000000000001AA100000000
+00000006C30000000000000000000000000003C600000000
+0000002C6000000000000000000000000000006C20000000
+0000007B1000000000001356531000000000001B70000000
+000002C5000000000015BBA9ABB5100000000005C2000000
+000005C200000000019B5101015B910000000002C5000000
+000009900000000019A200151002A9100000000099000000
+00001B50000000005B20001610002B50000000005B100000
+00002C3000000001B5000016100005B1000000003C200000
+00003C2000000003B1000016100001B3000000002C300000
+00004C2000000005A0111126211110A5000000002C400000
+00005C10000000069156666666665196000000001C500000
+00004C2000000005A0111126211110A5000000002C400000
+00003C2000000003B1000016100001B3000000002C300000
+00002C3000000001B5000016100005B1000000003C200000
+00001B50000000005B20001610002B50000000005B100000
+000009900000000019A200151002A9100000000099000000
+000005C200000000019B5101015B910000000002C5000000
+000002C5000000000015BBA9ABB5100000000005C2000000
+0000007B1000000000001356531000000000001B70000000
+0000002C6000000000000000000000000000006C20000000
+00000006C30000000000000000000000000003C600000000
+00000001AA100000000000000000000000001AA100000000
+000000003B810000000000000000000000018B3000000000
+0000000004B8100000000000000000000018B40000000000
+00000000004BA300000000000000000003AB400000000000
+000000000003AC6100000000000000016CA3000000000000
+00000000000016CB520000000000025BC610000000000000
+0000000000000027CC95322122359CC72000000000000000
+0000000000000000259BCCCCCCCB95200000000000000000
+000000000000000000012345432100000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evStartNI [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000002345432000000000000000000000
+000000000000000000116CCCCC6110000000000000000000
+000000000000000111101221221011110000000000000000
+000000000000164100000000000000014610000000000000
+000000000003AC4000000000000000004CA3000000000000
+00000000004BA300000000000000000003AB400000000000
+0000000004B8100000000000000000000018B40000000000
+000000000881000000000000000000000001880000000000
+000000001110000000000000000000000000111000000000
+000000011000000000000000000000000000001100000000
+000000010000000000000000000000000000000100000000
+000000110000000000000000000000000000000110000000
+000000100000000000000000000000000000000010000000
+000005910000000000000000000000000000000195000000
+000009900000000000000000000000000000000099000000
+00001B50000000000000000000000000000000005B100000
+00002C30000000000000000000000000000000003C200000
+00003C20000000000000000000000000000000002C300000
+00004C20000000000000000000000000000000002C400000
+000026100000000000000000000000000000000016200000
+000001000000000000000000000000000000000001000000
+000001000000000000000000000000000000000001000000
+000001000000000000000000000000000000000001000000
+000001000000000000000000000000000000000001000000
+000001100000000000000000000000000000000011000000
+000000310000000000000000000000000000000130000000
+000002C500000000000000000000000000000005C2000000
+0000007B1000000000000000000000000000001B70000000
+0000002C6000000000000000000000000000006C20000000
+00000006C30000000000000000000000000003C600000000
+00000001AA000000000000000000000000000AA100000000
+000000003410000000000000000000000000143000000000
+000000000011000000000000000000000001100000000000
+000000000001100000000000000000000011000000000000
+000000000000112100000000000000012110000000000000
+000000000000018B520000000000025B8100000000000000
+0000000000000027CC95200000259CC72000000000000000
+0000000000000000259B6111116B95200000000000000000
+000000000000000000010000000100000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evStartMsgNI [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000002345432000000000000000000000
+000000000000000000116CCCCC6110000000000000000000
+000000000000000111101221221011110000000000000000
+000000000000164100000000000000014610000000000000
+000000000003AC4000000000000000004CA3000000000000
+00000000004BA300000000000000000003AB400000000000
+0000000004B8100000000000000000000018B40000000000
+000000000881000000000000000000000001880000000000
+000000001110000000000000000000000000111000000000
+000000011000000000000000000000000000001100000000
+000000010000000000000000000000000000000100000000
+000000110000000000000000000000000000000110000000
+000000100000000000000000000000000000000010000000
+000005910000000888888888888888880000000195000000
+000009900000008FFFFFFFFFFFFFFFFF8000000099000000
+00001B500000008FDA88888888888ADF800000005B100000
+00002C300000008F854000000000458F800000003C200000
+00003C200000008F815510000015518F800000002C300000
+00004C200000008F800451000154008F800000002C400000
+000026100000008F800036202630008F8000000016200000
+000001000000008F800002646200008F8000000001000000
+000001000000008F800000252000008F8000000001000000
+000001000000008F800000000000008F8000000001000000
+000001000000008FB8888888888888BF8000000001000000
+000001100000008FFFFFFFFFFFFFFFFF8000000011000000
+000000310000000888888888888888880000000130000000
+000002C500000000000000000000000000000005C2000000
+0000007B1000000000000000000000000000001B70000000
+0000002C6000000000000000000000000000006C20000000
+00000006C30000000000000000000000000003C600000000
+00000001AA000000000000000000000000000AA100000000
+000000003410000000000000000000000000143000000000
+000000000011000000000000000000000001100000000000
+000000000001100000000000000000000011000000000000
+000000000000112100000000000000012110000000000000
+000000000000018B520000000000025B8100000000000000
+0000000000000027CC95200000259CC72000000000000000
+0000000000000000259B6111116B95200000000000000000
+000000000000000000010000000100000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evStartTimerNI [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000002345432000000000000000000000
+000000000000000000116CCCCC6110000000000000000000
+000000000000000111101221221011110000000000000000
+000000000000164100000000000000014610000000000000
+000000000003AC4000000000000000004CA3000000000000
+00000000004BA300000000000000000003AB400000000000
+0000000004B8100000000000000000000018B40000000000
+000000000881000000000000000000000001880000000000
+000000001110000000000000000000000000111000000000
+000000011000000000000000000000000000001100000000
+000000010000000000000000000000000000000100000000
+000000110000000000000133310000000000000110000000
+000000100000000000039BBBBB9300000000000010000000
+0000059100000000006C8312138C60000000000195000000
+000009900000000006B400151004B6000000000099000000
+00001B50000000003C40001510004C30000000005B100000
+00002C30000000009800001510000890000000003C200000
+00003C2000000001B3000015100003B1000000002C300000
+00004C2000000003B1000015111001B3000000002C400000
+0000261000000003B0000015555300B30000000016200000
+0000010000000003B1000001111001B30000000001000000
+0000010000000001B3000000000003B10000000001000000
+000001000000000098000000000008900000000001000000
+00000100000000003C40000000004C300000000001000000
+000001100000000006B400000004B6000000000011000000
+0000003100000000006C8310138C60000000000130000000
+000002C50000000000039BBBBB93000000000005C2000000
+0000007B1000000000000133310000000000001B70000000
+0000002C6000000000000000000000000000006C20000000
+00000006C30000000000000000000000000003C600000000
+00000001AA000000000000000000000000000AA100000000
+000000003410000000000000000000000000143000000000
+000000000011000000000000000000000001100000000000
+000000000001100000000000000000000011000000000000
+000000000000112100000000000000012110000000000000
+000000000000018B520000000000025B8100000000000000
+0000000000000027CC95200000259CC72000000000000000
+0000000000000000259B6111116B95200000000000000000
+000000000000000000010000000100000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evStartSignalNI [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000002345432000000000000000000000
+000000000000000000116CCCCC6110000000000000000000
+000000000000000111101221221011110000000000000000
+000000000000164100000000000000014610000000000000
+000000000003AC4000000000000000004CA3000000000000
+00000000004BA300000000000000000003AB400000000000
+0000000004B8100000000000000000000018B40000000000
+000000000881000000000000000000000001880000000000
+000000001110000000000000000000000000111000000000
+000000011000000000000000000000000000001100000000
+000000010000000000000000000000000000000100000000
+000000110000000000000003000000000000000110000000
+000000100000000000000037300000000000000010000000
+000005910000000000000164610000000000000195000000
+000009900000000000000351530000000000000099000000
+00001B50000000000000162026100000000000005B100000
+00002C30000000000000450005400000000000003C200000
+00003C20000000000001620002610000000000002C300000
+00004C20000000000004500000540000000000002C400000
+000026100000000000262000002620000000000016200000
+000001000000000000540000000450000000000001000000
+000001000000000002610000000162000000000001000000
+000001000000000005400000000045000000000001000000
+000001000000000026100000000016200000000001000000
+000001100000000054111111111114500000000011000000
+000000310000000266666666666666620000000130000000
+000002C500000000111111111111111000000005C2000000
+0000007B1000000000000000000000000000001B70000000
+0000002C6000000000000000000000000000006C20000000
+00000006C30000000000000000000000000003C600000000
+00000001AA000000000000000000000000000AA100000000
+000000003410000000000000000000000000143000000000
+000000000011000000000000000000000001100000000000
+000000000001100000000000000000000011000000000000
+000000000000112100000000000000012110000000000000
+000000000000018B520000000000025B8100000000000000
+0000000000000027CC95200000259CC72000000000000000
+0000000000000000259B6111116B95200000000000000000
+000000000000000000010000000100000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evInter [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000000000000000002B500890000000
+000003C202B5000000000000000000000005B202C3000000
+000007A006B1000000000000000000000001B600A7000000
+00000B501B500000000000000000000000005B105B000000
+00002C303C200000000000000000000000002C303C200000
+00003B105B000000000000000000000000000B501B300000
+00005B00780000000000000000000000000008700B500000
+00006A00970000000000000000000000000007900A600000
+000069009600000000000000000000000000069009600000
+00006A00970000000000000000000000000007900A600000
+00005B00780000000000000000000000000008700B500000
+00003B105B000000000000000000000000000B501B300000
+00002C303C200000000000000000000000002C303C200000
+00000B501B500000000000000000000000005B105B000000
+000007A006B1000000000000000000000001B600A7000000
+000003C202B5000000000000000000000005B202C3000000
+00000098005B20000000000000000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evCatchMsg [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000000000000000002B500890000000
+000003C202B5000000000000000000000005B202C3000000
+000007A006B1000888888888888888880001B600A7000000
+00000B501B50008FFFFFFFFFFFFFFFFF80005B105B000000
+00002C303C20008FDA88888888888ADF80002C303C200000
+00003B105B00008F854000000000458F80000B501B300000
+00005B007800008F815510000015518F800008700B500000
+00006A009700008F800451000154008F800007900A600000
+000069009600008F800036202630008F8000069009600000
+00006A009700008F800002646200008F800007900A600000
+00005B007800008F800000252000008F800008700B500000
+00003B105B00008F800000000000008F80000B501B300000
+00002C303C20008FB8888888888888BF80002C303C200000
+00000B501B50008FFFFFFFFFFFFFFFFF80005B105B000000
+000007A006B1000888888888888888880001B600A7000000
+000003C202B5000000000000000000000005B202C3000000
+00000098005B20000000000000000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evCatchTimer [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000013331000000002B500890000000
+000003C202B5000000039BBBBB9300000005B202C3000000
+000007A006B10000006C8312138C60000001B600A7000000
+00000B501B50000006B400151004B60000005B105B000000
+00002C303C2000003C40001510004C3000002C303C200000
+00003B105B000000980000151000089000000B501B300000
+00005B0078000001B3000015100003B1000008700B500000
+00006A0097000003B1000015111001B3000007900A600000
+0000690096000003B0000015555300B30000069009600000
+00006A0097000003B1000001111001B3000007900A600000
+00005B0078000001B3000000000003B1000008700B500000
+00003B105B000000980000000000089000000B501B300000
+00002C303C2000003C40000000004C3000002C303C200000
+00000B501B50000006B400000004B60000005B105B000000
+000007A006B10000006C8310138C60000001B600A7000000
+000003C202B5000000039BBBBB9300000005B202C3000000
+00000098005B20000000013331000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evCatchSignal [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000000300000000002B500890000000
+000003C202B5000000000037300000000005B202C3000000
+000007A006B1000000000164610000000001B600A7000000
+00000B501B500000000003515300000000005B105B000000
+00002C303C200000000016202610000000002C303C200000
+00003B105B000000000045000540000000000B501B300000
+00005B00780000000001620002610000000008700B500000
+00006A00970000000004500000540000000007900A600000
+000069009600000000262000002620000000069009600000
+00006A00970000000054000000045000000007900A600000
+00005B00780000000261000000016200000008700B500000
+00003B105B000000054000000000450000000B501B300000
+00002C303C200000261000000000162000002C303C200000
+00000B501B500000541111111111145000005B105B000000
+000007A006B1000266666666666666620001B600A7000000
+000003C202B5000011111111111111100005B202C3000000
+00000098005B20000000000000000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evCatchError [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000100000000199103C30000000
+00000098005B20000000000151000000002B500890000000
+000003C202B5000000000004500000000005B202C3000000
+000007A006B1000000000016200000000001B600A7000000
+00000B501B500000000000450000000000005B105B000000
+00002C303C200000000001630000000000002C303C200000
+00003B105B000000000003610000000000000B501B300000
+00005B00780000000000164111100000000008700B500000
+00006A00970000000000366666610000000007900A600000
+000069009600000000006211144000000000069009600000
+00006A00970000000002644426200000000007900A600000
+00005B00780000000002444555000000000008700B500000
+00003B105B000000000000066200000000000B501B300000
+00002C303C200000000000166000000000002C303C200000
+00000B501B500000000000273000000000005B105B000000
+000007A006B1000000000046100000000001B600A7000000
+000003C202B5000000000064000000000005B202C3000000
+00000098005B20000000015100000000002B500890000000
+0000003C3019910000000010000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evCatchEsc [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000000000000000002B500890000000
+000003C202B5000000000000000000000005B202C3000000
+000007A006B1000000000000000000000001B600A7000000
+00000B501B500000000000000000000000005B105B000000
+00002C303C200000000000000000000000002C303C200000
+00003B105B000000000000010000000000000B501B300000
+00005B00780000000000002620000000000008700B500000
+00006A00970000000000026662000000000007900A600000
+000069009600000000002636362000000000069009600000
+00006A00970000000002621612620000000007900A600000
+00005B00780000000026201610262000000008700B500000
+00003B105B000000026311262113620000000B501B300000
+00002C303C200000166666666666661000002C303C200000
+00000B501B500000011111262111110000005B105B000000
+000007A006B1000000000016100000000001B600A7000000
+000003C202B5000000000015100000000005B202C3000000
+00000098005B20000000000100000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evCatchCond [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910004888888888884000199103C30000000
+00000098005B20004BFFFFFFFFFFFB40002B500890000000
+000003C202B500008FB888888888BF800005B202C3000000
+000007A006B100008F80000000008F800001B600A7000000
+00000B501B5000008F80000000008F8000005B105B000000
+00002C303C2000008F80000000008F8000002C303C200000
+00003B105B0000008F82555555528F8000000B501B300000
+00005B00780000008F80000000008F80000008700B500000
+00006A00970000008F80000000008F80000007900A600000
+00006900960000008F82555555528F800000069009600000
+00006A00970000008F80000000008F80000007900A600000
+00005B00780000008F80000000008F80000008700B500000
+00003B105B0000008F82555555528F8000000B501B300000
+00002C303C2000008F80000000008F8000002C303C200000
+00000B501B5000008F80000000008F8000005B105B000000
+000007A006B100008F80000000008F800001B600A7000000
+000003C202B500008FB888888888BF800005B202C3000000
+00000098005B20004BFFFFFFFFFFFB40002B500890000000
+0000003C3019910004888888888884000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evCatchLink [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000000000000000002B500890000000
+000003C202B5000000000000000000000005B202C3000000
+000007A006B1000000000000000000000001B600A7000000
+00000B501B500000000000001000000000005B105B000000
+00002C303C200000000000016200000000002C303C200000
+00003B105B000000000000002620000000000B501B300000
+00005B00780000000000000002620000000008700B500000
+00006A00970000011111111111362000000007900A600000
+000069009600001566666666666661000000069009600000
+00006A00970000011111111111362000000007900A600000
+00005B00780000000000000002620000000008700B500000
+00003B105B000000000000002620000000000B501B300000
+00002C303C200000000000016200000000002C303C200000
+00000B501B500000000000001000000000005B105B000000
+000007A006B1000000000000000000000001B600A7000000
+000003C202B5000000000000000000000005B202C3000000
+00000098005B20000000000000000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evCatchComp [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000000000000000002B500890000000
+000003C202B5000100000001000000000005B202C3000000
+000007A006B1000541000026200000000001B600A7000000
+00000B501B500005551000266300000000005B105B000000
+00002C303C200005346200252640000000002C303C200000
+00003B105B000005203630250155100000000B501B300000
+00005B00780000052002543500145200000008700B500000
+00006A00970000052000155500003630000007900A600000
+000069009600000520000155000003610000069009600000
+00006A00970000052000155500003630000007900A600000
+00005B00780000052002543500145200000008700B500000
+00003B105B000005203630250155100000000B501B300000
+00002C303C200005346200252640000000002C303C200000
+00000B501B500005551000266300000000005B105B000000
+000007A006B1000541000026200000000001B600A7000000
+000003C202B5000100000001000000000005B202C3000000
+00000098005B20000000000000000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evCatchCancel [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000000000000000002B500890000000
+000003C202B5000001000000000001000005B202C3000000
+000007A006B1000016300000000036100001B600A7000000
+00000B501B500000036300000003630000005B105B000000
+00002C303C200000003630000036300000002C303C200000
+00003B105B000000000363000363000000000B501B300000
+00005B00780000000000363036300000000008700B500000
+00006A00970000000000036463000000000007900A600000
+000069009600000000000048400000000000069009600000
+00006A00970000000000036463000000000007900A600000
+00005B00780000000000363036300000000008700B500000
+00003B105B000000000363000363000000000B501B300000
+00002C303C200000003630000036300000002C303C200000
+00000B501B500000036300000003630000005B105B000000
+000007A006B1000016300000000036100001B600A7000000
+000003C202B5000001000000000001000005B202C3000000
+00000098005B20000000000000000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evCatchMulti [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000001310000000002B500890000000
+000003C202B5000000000156510000000005B202C3000000
+000007A006B1000000003631363000000001B600A7000000
+00000B501B500000001462000264100000005B105B000000
+00002C303C200000025510000015520000002C303C200000
+00003B105B000000363000000000363000000B501B300000
+00005B00780000016200000000000261000008700B500000
+00006A00970000005300000000000350000007900A600000
+000069009600000025000000000005200000069009600000
+00006A00970000001610000000001610000007900A600000
+00005B00780000000530000000003500000008700B500000
+00003B105B000000035000000000530000000B501B300000
+00002C303C200000016100000001610000002C303C200000
+00000B501B500000005311111113500000005B105B000000
+000007A006B1000000366666666630000001B600A7000000
+000003C202B5000000011111111100000005B202C3000000
+00000098005B20000000000000000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evCatchPar [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000135653100000002B500890000000
+000003C202B500000015BBA9ABB510000005B202C3000000
+000007A006B10000019B5101015B91000001B600A7000000
+00000B501B50000019A200151002A91000005B105B000000
+00002C303C2000005B20001610002B5000002C303C200000
+00003B105B000001B5000016100005B100000B501B300000
+00005B0078000003B1000016100001B3000008700B500000
+00006A0097000005A0111126211110A5000007900A600000
+000069009600000691566666666651960000069009600000
+00006A0097000005A0111126211110A5000007900A600000
+00005B0078000003B1000016100001B3000008700B500000
+00003B105B000001B5000016100005B100000B501B300000
+00002C303C2000005B20001610002B5000002C303C200000
+00000B501B50000019A200151002A91000005B105B000000
+000007A006B10000019B5101015B91000001B600A7000000
+000003C202B500000015BBA9ABB510000005B202C3000000
+00000098005B20000000135653100000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evThrowMsg [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000000000000000002B500890000000
+000003C202B5000000000000000000000005B202C3000000
+000007A006B1000888888888888888880001B600A7000000
+00000B501B50008FFFFFFFFFFFFFFFFF80005B105B000000
+00002C303C20008FFFFFFFFFFFFFFFFF80002C303C200000
+00003B105B00008FFFFFFFFFFFFFFFFF80000B501B300000
+00005B007800008FFFFFFFFFFFFFFFFF800008700B500000
+00006A009700008FFFFFFFFFFFFFFFFF800007900A600000
+000069009600008FFFFFFFFFFFFFFFFF8000069009600000
+00006A009700008FFFFFFFFFFFFFFFFF800007900A600000
+00005B007800008FFFFFFFFFFFFFFFFF800008700B500000
+00003B105B00008FFFFFFFFFFFFFFFFF80000B501B300000
+00002C303C20008FFFFFFFFFFFFFFFFF80002C303C200000
+00000B501B50008FFFFFFFFFFFFFFFFF80005B105B000000
+000007A006B1000888888888888888880001B600A7000000
+000003C202B5000000000000000000000005B202C3000000
+00000098005B20000000000000000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evThrowSignal [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000000300000000002B500890000000
+000003C202B500000000003F300000000005B202C3000000
+000007A006B10000000001AFA10000000001B600A7000000
+00000B501B500000000006FFF600000000005B105B000000
+00002C303C20000000001CFFFC10000000002C303C200000
+00003B105B00000000006FFFFF60000000000B501B300000
+00005B00780000000001CFFFFFC10000000008700B500000
+00006A00970000000006FFFFFFF60000000007900A600000
+0000690096000000002DFFFFFFFD20000000069009600000
+00006A0097000000007FFFFFFFFF7000000007900A600000
+00005B007800000002DFFFFFFFFFD200000008700B500000
+00003B105B00000009FFFFFFFFFFF90000000B501B300000
+00002C303C2000002FFFFFFFFFFFFF2000002C303C200000
+00000B501B5000009FFFFFFFFFFFFF9000005B105B000000
+000007A006B10002FFFFFFFFFFFFFFF20001B600A7000000
+000003C202B5000011111111111111100005B202C3000000
+00000098005B20000000000000000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evThrowEsc [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000000000000000002B500890000000
+000003C202B5000000000000000000000005B202C3000000
+000007A006B1000000000000000000000001B600A7000000
+00000B501B500000000000000000000000005B105B000000
+00002C303C200000000000000000000000002C303C200000
+00003B105B000000000000010000000000000B501B300000
+00005B00780000000000002620000000000008700B500000
+00006A00970000000000026662000000000007900A600000
+000069009600000000002636362000000000069009600000
+00006A00970000000002621612620000000007900A600000
+00005B00780000000026201610262000000008700B500000
+00003B105B000000026311262113620000000B501B300000
+00002C303C200000166666666666661000002C303C200000
+00000B501B500000011111262111110000005B105B000000
+000007A006B1000000000016100000000001B600A7000000
+000003C202B5000000000015100000000005B202C3000000
+00000098005B20000000000100000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evThrowLink [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000000000000000002B500890000000
+000003C202B5000000000000000000000005B202C3000000
+000007A006B1000000000000000000000001B600A7000000
+00000B501B500000000000001000000000005B105B000000
+00002C303C200000000000016200000000002C303C200000
+00003B105B000000000000002620000000000B501B300000
+00005B00780000000000000002620000000008700B500000
+00006A00970000011111111111362000000007900A600000
+000069009600001566666666666661000000069009600000
+00006A00970000011111111111362000000007900A600000
+00005B00780000000000000002620000000008700B500000
+00003B105B000000000000002620000000000B501B300000
+00002C303C200000000000016200000000002C303C200000
+00000B501B500000000000001000000000005B105B000000
+000007A006B1000000000000000000000001B600A7000000
+000003C202B5000000000000000000000005B202C3000000
+00000098005B20000000000000000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evThrowComp [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000000000000000002B500890000000
+000003C202B5000100000001000000000005B202C3000000
+000007A006B1000541000026200000000001B600A7000000
+00000B501B500005551000266300000000005B105B000000
+00002C303C200005346200252640000000002C303C200000
+00003B105B000005203630250155100000000B501B300000
+00005B00780000052002543500145200000008700B500000
+00006A00970000052000155500003630000007900A600000
+000069009600000520000155000003610000069009600000
+00006A00970000052000155500003630000007900A600000
+00005B00780000052002543500145200000008700B500000
+00003B105B000005203630250155100000000B501B300000
+00002C303C200005346200252640000000002C303C200000
+00000B501B500005551000266300000000005B105B000000
+000007A006B1000541000026200000000001B600A7000000
+000003C202B5000100000001000000000005B202C3000000
+00000098005B20000000000000000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evThrowMulti [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000001310000000002B500890000000
+000003C202B5000000000156510000000005B202C3000000
+000007A006B1000000003631363000000001B600A7000000
+00000B501B500000001462000264100000005B105B000000
+00002C303C200000025510000015520000002C303C200000
+00003B105B000000363000000000363000000B501B300000
+00005B00780000016200000000000261000008700B500000
+00006A00970000005300000000000350000007900A600000
+000069009600000025000000000005200000069009600000
+00006A00970000001610000000001610000007900A600000
+00005B00780000000530000000003500000008700B500000
+00003B105B000000035000000000530000000B501B300000
+00002C303C200000016100000001610000002C303C200000
+00000B501B500000005311111113500000005B105B000000
+000007A006B1000000366666666630000001B600A7000000
+000003C202B5000000011111111100000005B202C3000000
+00000098005B20000000000000000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evEnd [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000001111111000000000000000000000
+000000000000000001345677765431000000000000000000
+0000000000000013579ABCCDCCBA97531000000000000000
+0000000000000358ACEEDCCBCCDEECA85300000000000000
+00000000000148BDECA876666678ACEDB841000000000000
+0000000000269CEB974321111123479BEC96200000000000
+00000000026ADD9641000000000001469DDA620000000000
+0000000026AEC841000000000000000148CEA62000000000
+000000016AEB73000000000000000000037BEA6100000000
+000000049DC7300000000000000000000037CD9400000000
+00000038CD830000000000000000000000038DC830000000
+0000015BE94000000000000000000000000049EB51000000
+0000038DB61000000000000000000000000016BD83000000
+000005AE9400000000000000000000000000049EA5000000
+000017CC7100000000000000000000000000017CC7100000
+000039EA4000000000000000000000000000004AE9300000
+00004AE830000000000000000000000000000038EA400000
+00015BD720000000000000000000000000000027DB510000
+00016CC610000000000000000000000000000016CC610000
+00017CC610000000000000000000000000000016CC710000
+00017DB610000000000000000000000000000016BD710000
+00017CC610000000000000000000000000000016CC710000
+00016CC610000000000000000000000000000016CC610000
+00015BD720000000000000000000000000000027DB510000
+00004AE830000000000000000000000000000038EA400000
+000039EA4000000000000000000000000000004AE9300000
+000017CC7100000000000000000000000000017CC7100000
+000005AE9400000000000000000000000000049EA5000000
+0000038DB61000000000000000000000000016BD83000000
+0000015BE94000000000000000000000000049EB51000000
+00000038CD830000000000000000000000038DC830000000
+000000049DC7300000000000000000000037CD9400000000
+000000016AEB73000000000000000000037BEA6100000000
+0000000026AEC841000000000000000148CEA62000000000
+00000000026ADD9641000000000001469DDA620000000000
+0000000000269CEB974321111123479BEC96200000000000
+00000000000148BDECA876666678ACEDB841000000000000
+0000000000000358ACEEDCCBCCDEECA85300000000000000
+0000000000000013579ABCCDCCBA97531000000000000000
+000000000000000001345677765431000000000000000000
+000000000000000000001111111000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evEndMsg [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000001111111000000000000000000000
+000000000000000001345677765431000000000000000000
+0000000000000013579ABCCDCCBA97531000000000000000
+0000000000000358ACEEDCCBCCDEECA85300000000000000
+00000000000148BDECA876666678ACEDB841000000000000
+0000000000269CEB974321111123479BEC96200000000000
+00000000026ADD9641000000000001469DDA620000000000
+0000000026AEC841000000000000000148CEA62000000000
+000000016AEB73000000000000000000037BEA6100000000
+000000049DC7300000000000000000000037CD9400000000
+00000038CD830000000000000000000000038DC830000000
+0000015BE94000000000000000000000000049EB51000000
+0000038DB61000000000000000000000000016BD83000000
+000005AE9400000000000000000000000000049EA5000000
+000017CC7100000888888888888888880000017CC7100000
+000039EA4000008FFFFFFFFFFFFFFFFF8000004AE9300000
+00004AE83000008FFFFFFFFFFFFFFFFF80000038EA400000
+00015BD72000008FFFFFFFFFFFFFFFFF80000027DB510000
+00016CC61000008FFFFFFFFFFFFFFFFF80000016CC610000
+00017CC61000008FFFFFFFFFFFFFFFFF80000016CC710000
+00017DB61000008FFFFFFFFFFFFFFFFF80000016BD710000
+00017CC61000008FFFFFFFFFFFFFFFFF80000016CC710000
+00016CC61000008FFFFFFFFFFFFFFFFF80000016CC610000
+00015BD72000008FFFFFFFFFFFFFFFFF80000027DB510000
+00004AE83000008FFFFFFFFFFFFFFFFF80000038EA400000
+000039EA4000008FFFFFFFFFFFFFFFFF8000004AE9300000
+000017CC7100000888888888888888880000017CC7100000
+000005AE9400000000000000000000000000049EA5000000
+0000038DB61000000000000000000000000016BD83000000
+0000015BE94000000000000000000000000049EB51000000
+00000038CD830000000000000000000000038DC830000000
+000000049DC7300000000000000000000037CD9400000000
+000000016AEB73000000000000000000037BEA6100000000
+0000000026AEC841000000000000000148CEA62000000000
+00000000026ADD9641000000000001469DDA620000000000
+0000000000269CEB974321111123479BEC96200000000000
+00000000000148BDECA876666678ACEDB841000000000000
+0000000000000358ACEEDCCBCCDEECA85300000000000000
+0000000000000013579ABCCDCCBA97531000000000000000
+000000000000000001345677765431000000000000000000
+000000000000000000001111111000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evEndError [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000001111111000000000000000000000
+000000000000000001345677765431000000000000000000
+0000000000000013579ABCCDCCBA97531000000000000000
+0000000000000358ACEEDCCBCCDEECA85300000000000000
+00000000000148BDECA876666678ACEDB841000000000000
+0000000000269CEB974321111123479BEC96200000000000
+00000000026ADD9641000000000001469DDA620000000000
+0000000026AEC841000000000000000148CEA62000000000
+000000016AEB73000000000000000000037BEA6100000000
+000000049DC7300000000000000000000037CD9400000000
+00000038CD830000000000000000000000038DC830000000
+0000015BE94000000000000010000000000049EB51000000
+0000038DB61000000000000151000000000016BD83000000
+000005AE9400000000000004500000000000049EA5000000
+000017CC7100000000000016200000000000017CC7100000
+000039EA4000000000000045000000000000004AE9300000
+00004AE830000000000001630000000000000038EA400000
+00015BD720000000000003610000000000000027DB510000
+00016CC610000000000016411110000000000016CC610000
+00017CC610000000000036666661000000000016CC710000
+00017DB610000000000062111440000000000016BD710000
+00017CC610000000000264442620000000000016CC710000
+00016CC610000000000244455500000000000016CC610000
+00015BD720000000000000066200000000000027DB510000
+00004AE830000000000000166000000000000038EA400000
+000039EA4000000000000027300000000000004AE9300000
+000017CC7100000000000046100000000000017CC7100000
+000005AE9400000000000064000000000000049EA5000000
+0000038DB61000000000015100000000000016BD83000000
+0000015BE94000000000001000000000000049EB51000000
+00000038CD830000000000000000000000038DC830000000
+000000049DC7300000000000000000000037CD9400000000
+000000016AEB73000000000000000000037BEA6100000000
+0000000026AEC841000000000000000148CEA62000000000
+00000000026ADD9641000000000001469DDA620000000000
+0000000000269CEB974321111123479BEC96200000000000
+00000000000148BDECA876666678ACEDB841000000000000
+0000000000000358ACEEDCCBCCDEECA85300000000000000
+0000000000000013579ABCCDCCBA97531000000000000000
+000000000000000001345677765431000000000000000000
+000000000000000000001111111000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evEndEsc [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000001111111000000000000000000000
+000000000000000001345677765431000000000000000000
+0000000000000013579ABCCDCCBA97531000000000000000
+0000000000000358ACEEDCCBCCDEECA85300000000000000
+00000000000148BDECA876666678ACEDB841000000000000
+0000000000269CEB974321111123479BEC96200000000000
+00000000026ADD9641000000000001469DDA620000000000
+0000000026AEC841000000000000000148CEA62000000000
+000000016AEB73000000000000000000037BEA6100000000
+000000049DC7300000000000000000000037CD9400000000
+00000038CD830000000000000000000000038DC830000000
+0000015BE94000000000000000000000000049EB51000000
+0000038DB61000000000000000000000000016BD83000000
+000005AE9400000000000000000000000000049EA5000000
+000017CC7100000000000000000000000000017CC7100000
+000039EA4000000000000000000000000000004AE9300000
+00004AE830000000000000000000000000000038EA400000
+00015BD720000000000000010000000000000027DB510000
+00016CC610000000000000262000000000000016CC610000
+00017CC610000000000002666200000000000016CC710000
+00017DB610000000000026363620000000000016BD710000
+00017CC610000000000262161262000000000016CC710000
+00016CC610000000002620161026200000000016CC610000
+00015BD720000000026311262113620000000027DB510000
+00004AE830000000166666666666661000000038EA400000
+000039EA4000000001111126211111000000004AE9300000
+000017CC7100000000000016100000000000017CC7100000
+000005AE9400000000000015100000000000049EA5000000
+0000038DB61000000000000100000000000016BD83000000
+0000015BE94000000000000000000000000049EB51000000
+00000038CD830000000000000000000000038DC830000000
+000000049DC7300000000000000000000037CD9400000000
+000000016AEB73000000000000000000037BEA6100000000
+0000000026AEC841000000000000000148CEA62000000000
+00000000026ADD9641000000000001469DDA620000000000
+0000000000269CEB974321111123479BEC96200000000000
+00000000000148BDECA876666678ACEDB841000000000000
+0000000000000358ACEEDCCBCCDEECA85300000000000000
+0000000000000013579ABCCDCCBA97531000000000000000
+000000000000000001345677765431000000000000000000
+000000000000000000001111111000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evEndCancel [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000001111111000000000000000000000
+000000000000000001345677765431000000000000000000
+0000000000000013579ABCCDCCBA97531000000000000000
+0000000000000358ACEEDCCBCCDEECA85300000000000000
+00000000000148BDECA876666678ACEDB841000000000000
+0000000000269CEB974321111123479BEC96200000000000
+00000000026ADD9641000000000001469DDA620000000000
+0000000026AEC841000000000000000148CEA62000000000
+000000016AEB73000000000000000000037BEA6100000000
+000000049DC7300000000000000000000037CD9400000000
+00000038CD830000000000000000000000038DC830000000
+0000015BE94000000000000000000000000049EB51000000
+0000038DB61000000000000000000000000016BD83000000
+000005AE9400000001000000000001000000049EA5000000
+000017CC7100000016300000000036100000017CC7100000
+000039EA4000000003630000000363000000004AE9300000
+00004AE830000000003630000036300000000038EA400000
+00015BD720000000000363000363000000000027DB510000
+00016CC610000000000036303630000000000016CC610000
+00017CC610000000000003646300000000000016CC710000
+00017DB610000000000000484000000000000016BD710000
+00017CC610000000000003646300000000000016CC710000
+00016CC610000000000036303630000000000016CC610000
+00015BD720000000000363000363000000000027DB510000
+00004AE830000000003630000036300000000038EA400000
+000039EA4000000003630000000363000000004AE9300000
+000017CC7100000016300000000036100000017CC7100000
+000005AE9400000001000000000001000000049EA5000000
+0000038DB61000000000000000000000000016BD83000000
+0000015BE94000000000000000000000000049EB51000000
+00000038CD830000000000000000000000038DC830000000
+000000049DC7300000000000000000000037CD9400000000
+000000016AEB73000000000000000000037BEA6100000000
+0000000026AEC841000000000000000148CEA62000000000
+00000000026ADD9641000000000001469DDA620000000000
+0000000000269CEB974321111123479BEC96200000000000
+00000000000148BDECA876666678ACEDB841000000000000
+0000000000000358ACEEDCCBCCDEECA85300000000000000
+0000000000000013579ABCCDCCBA97531000000000000000
+000000000000000001345677765431000000000000000000
+000000000000000000001111111000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evEndComp [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000001111111000000000000000000000
+000000000000000001345677765431000000000000000000
+0000000000000013579ABCCDCCBA97531000000000000000
+0000000000000358ACEEDCCBCCDEECA85300000000000000
+00000000000148BDECA876666678ACEDB841000000000000
+0000000000269CEB974321111123479BEC96200000000000
+00000000026ADD9641000000000001469DDA620000000000
+0000000026AEC841000000000000000148CEA62000000000
+000000016AEB73000000000000000000037BEA6100000000
+000000049DC7300000000000000000000037CD9400000000
+00000038CD830000000000000000000000038DC830000000
+0000015BE94000000000000000000000000049EB51000000
+0000038DB61000000000000000000000000016BD83000000
+000005AE9400000100000001000000000000049EA5000000
+000017CC7100000541000026200000000000017CC7100000
+000039EA4000000555100026630000000000004AE9300000
+00004AE830000005346200252640000000000038EA400000
+00015BD720000005203630250155100000000027DB510000
+00016CC610000005200254350014520000000016CC610000
+00017CC610000005200015550000363000000016CC710000
+00017DB610000005200001550000036100000016BD710000
+00017CC610000005200015550000363000000016CC710000
+00016CC610000005200254350014520000000016CC610000
+00015BD720000005203630250155100000000027DB510000
+00004AE830000005346200252640000000000038EA400000
+000039EA4000000555100026630000000000004AE9300000
+000017CC7100000541000026200000000000017CC7100000
+000005AE9400000100000001000000000000049EA5000000
+0000038DB61000000000000000000000000016BD83000000
+0000015BE94000000000000000000000000049EB51000000
+00000038CD830000000000000000000000038DC830000000
+000000049DC7300000000000000000000037CD9400000000
+000000016AEB73000000000000000000037BEA6100000000
+0000000026AEC841000000000000000148CEA62000000000
+00000000026ADD9641000000000001469DDA620000000000
+0000000000269CEB974321111123479BEC96200000000000
+00000000000148BDECA876666678ACEDB841000000000000
+0000000000000358ACEEDCCBCCDEECA85300000000000000
+0000000000000013579ABCCDCCBA97531000000000000000
+000000000000000001345677765431000000000000000000
+000000000000000000001111111000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evEndSignal [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000001111111000000000000000000000
+000000000000000001345677765431000000000000000000
+0000000000000013579ABCCDCCBA97531000000000000000
+0000000000000358ACEEDCCBCCDEECA85300000000000000
+00000000000148BDECA876666678ACEDB841000000000000
+0000000000269CEB974321111123479BEC96200000000000
+00000000026ADD9641000000000001469DDA620000000000
+0000000026AEC841000000000000000148CEA62000000000
+000000016AEB73000000000000000000037BEA6100000000
+000000049DC7300000000000000000000037CD9400000000
+00000038CD830000000000000000000000038DC830000000
+0000015BE94000000000000000000000000049EB51000000
+0000038DB61000000000000300000000000016BD83000000
+000005AE940000000000003F300000000000049EA5000000
+000017CC71000000000001AFA10000000000017CC7100000
+000039EA40000000000006FFF60000000000004AE9300000
+00004AE83000000000001CFFFC10000000000038EA400000
+00015BD72000000000006FFFFF60000000000027DB510000
+00016CC6100000000001CFFFFFC1000000000016CC610000
+00017CC6100000000006FFFFFFF6000000000016CC710000
+00017DB610000000002DFFFFFFFD200000000016BD710000
+00017CC610000000007FFFFFFFFF700000000016CC710000
+00016CC61000000002DFFFFFFFFFD20000000016CC610000
+00015BD72000000009FFFFFFFFFFF90000000027DB510000
+00004AE8300000002FFFFFFFFFFFFF2000000038EA400000
+000039EA400000009FFFFFFFFFFFFF900000004AE9300000
+000017CC71000002FFFFFFFFFFFFFFF20000017CC7100000
+000005AE9400000011111111111111100000049EA5000000
+0000038DB61000000000000000000000000016BD83000000
+0000015BE94000000000000000000000000049EB51000000
+00000038CD830000000000000000000000038DC830000000
+000000049DC7300000000000000000000037CD9400000000
+000000016AEB73000000000000000000037BEA6100000000
+0000000026AEC841000000000000000148CEA62000000000
+00000000026ADD9641000000000001469DDA620000000000
+0000000000269CEB974321111123479BEC96200000000000
+00000000000148BDECA876666678ACEDB841000000000000
+0000000000000358ACEEDCCBCCDEECA85300000000000000
+0000000000000013579ABCCDCCBA97531000000000000000
+000000000000000001345677765431000000000000000000
+000000000000000000001111111000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evEndMulti [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000001111111000000000000000000000
+000000000000000001345677765431000000000000000000
+0000000000000013579ABCCDCCBA97531000000000000000
+0000000000000358ACEEDCCBCCDEECA85300000000000000
+00000000000148BDECA876666678ACEDB841000000000000
+0000000000269CEB974321111123479BEC96200000000000
+00000000026ADD9641000000000001469DDA620000000000
+0000000026AEC841000000000000000148CEA62000000000
+000000016AEB73000000000000000000037BEA6100000000
+000000049DC7300000000000000000000037CD9400000000
+00000038CD830000000000000000000000038DC830000000
+0000015BE94000000000000000000000000049EB51000000
+0000038DB61000000000001310000000000016BD83000000
+000005AE9400000000000156510000000000049EA5000000
+000017CC7100000000003631363000000000017CC7100000
+000039EA4000000000146200026410000000004AE9300000
+00004AE830000000025510000015520000000038EA400000
+00015BD720000000363000000000363000000027DB510000
+00016CC610000001620000000000026100000016CC610000
+00017CC610000000530000000000035000000016CC710000
+00017DB610000000250000000000052000000016BD710000
+00017CC610000000161000000000161000000016CC710000
+00016CC610000000053000000000350000000016CC610000
+00015BD720000000035000000000530000000027DB510000
+00004AE830000000016100000001610000000038EA400000
+000039EA4000000000531111111350000000004AE9300000
+000017CC7100000000366666666630000000017CC7100000
+000005AE9400000000011111111100000000049EA5000000
+0000038DB61000000000000000000000000016BD83000000
+0000015BE94000000000000000000000000049EB51000000
+00000038CD830000000000000000000000038DC830000000
+000000049DC7300000000000000000000037CD9400000000
+000000016AEB73000000000000000000037BEA6100000000
+0000000026AEC841000000000000000148CEA62000000000
+00000000026ADD9641000000000001469DDA620000000000
+0000000000269CEB974321111123479BEC96200000000000
+00000000000148BDECA876666678ACEDB841000000000000
+0000000000000358ACEEDCCBCCDEECA85300000000000000
+0000000000000013579ABCCDCCBA97531000000000000000
+000000000000000001345677765431000000000000000000
+000000000000000000001111111000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evTerminate [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000001111111000000000000000000000
+000000000000000001345677765431000000000000000000
+0000000000000013579ABCCDCCBA97531000000000000000
+0000000000000358ACEEDCCBCCDEECA85300000000000000
+00000000000148BDECA876666678ACEDB841000000000000
+0000000000269CEB974321111123479BEC96200000000000
+00000000026ADD9641000000000001469DDA620000000000
+0000000026AEC841000000000000000148CEA62000000000
+000000016AEB73000000000000000000037BEA6100000000
+000000049DC7300000000000000000000037CD9400000000
+00000038CD830000000000000000000000038DC830000000
+0000015BE94000000000000000000000000049EB51000000
+0000038DB61000000000000100000000000016BD83000000
+000005AE940000000000379A973000000000049EA5000000
+000017CC710000000027CFFFFFC720000000017CC7100000
+000039EA40000000029EFFFFFFFE92000000004AE9300000
+00004AE83000000007EFFFFFFFFFE70000000038EA400000
+00015BD7200000003CFFFFFFFFFFFC3000000027DB510000
+00016CC6100000007FFFFFFFFFFFFF7000000016CC610000
+00017CC6100000009FFFFFFFFFFFFF9000000016CC710000
+00017DB610000001AFFFFFFFFFFFFFA100000016BD710000
+00017CC6100000009FFFFFFFFFFFFF9000000016CC710000
+00016CC6100000007FFFFFFFFFFFFF7000000016CC610000
+00015BD7200000003CFFFFFFFFFFFC3000000027DB510000
+00004AE83000000007EFFFFFFFFFE70000000038EA400000
+000039EA40000000029EFFFFFFFE92000000004AE9300000
+000017CC710000000027CFFFFFC720000000017CC7100000
+000005AE940000000000379A973000000000049EA5000000
+0000038DB61000000000000100000000000016BD83000000
+0000015BE94000000000000000000000000049EB51000000
+00000038CD830000000000000000000000038DC830000000
+000000049DC7300000000000000000000037CD9400000000
+000000016AEB73000000000000000000037BEA6100000000
+0000000026AEC841000000000000000148CEA62000000000
+00000000026ADD9641000000000001469DDA620000000000
+0000000000269CEB974321111123479BEC96200000000000
+00000000000148BDECA876666678ACEDB841000000000000
+0000000000000358ACEEDCCBCCDEECA85300000000000000
+0000000000000013579ABCCDCCBA97531000000000000000
+000000000000000001345677765431000000000000000000
+000000000000000000001111111000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evBoundMsg [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000000000000000002B500890000000
+000003C202B5000000000000000000000005B202C3000000
+000007A006B1000888888888888888880001B600A7000000
+00000B501B50008FFFFFFFFFFFFFFFFF80005B105B000000
+00002C303C20008FDA88888888888ADF80002C303C200000
+00003B105B00008F854000000000458F80000B501B300000
+00005B007800008F815510000015518F800008700B500000
+00006A009700008F800451000154008F800007900A600000
+000069009600008F800036202630008F8000069009600000
+00006A009700008F800002646200008F800007900A600000
+00005B007800008F800000252000008F800008700B500000
+00003B105B00008F800000000000008F80000B501B300000
+00002C303C20008FB8888888888888BF80002C303C200000
+00000B501B50008FFFFFFFFFFFFFFFFF80005B105B000000
+000007A006B1000888888888888888880001B600A7000000
+000003C202B5000000000000000000000005B202C3000000
+00000098005B20000000000000000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evBoundTimer [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000013331000000002B500890000000
+000003C202B5000000039BBBBB9300000005B202C3000000
+000007A006B10000006C8312138C60000001B600A7000000
+00000B501B50000006B400151004B60000005B105B000000
+00002C303C2000003C40001510004C3000002C303C200000
+00003B105B000000980000151000089000000B501B300000
+00005B0078000001B3000015100003B1000008700B500000
+00006A0097000003B1000015111001B3000007900A600000
+0000690096000003B0000015555300B30000069009600000
+00006A0097000003B1000001111001B3000007900A600000
+00005B0078000001B3000000000003B1000008700B500000
+00003B105B000000980000000000089000000B501B300000
+00002C303C2000003C40000000004C3000002C303C200000
+00000B501B50000006B400000004B60000005B105B000000
+000007A006B10000006C8310138C60000001B600A7000000
+000003C202B5000000039BBBBB9300000005B202C3000000
+00000098005B20000000013331000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evBoundError [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000100000000199103C30000000
+00000098005B20000000000151000000002B500890000000
+000003C202B5000000000004500000000005B202C3000000
+000007A006B1000000000016200000000001B600A7000000
+00000B501B500000000000450000000000005B105B000000
+00002C303C200000000001630000000000002C303C200000
+00003B105B000000000003610000000000000B501B300000
+00005B00780000000000164111100000000008700B500000
+00006A00970000000000366666610000000007900A600000
+000069009600000000006211144000000000069009600000
+00006A00970000000002644426200000000007900A600000
+00005B00780000000002444555000000000008700B500000
+00003B105B000000000000066200000000000B501B300000
+00002C303C200000000000166000000000002C303C200000
+00000B501B500000000000273000000000005B105B000000
+000007A006B1000000000046100000000001B600A7000000
+000003C202B5000000000064000000000005B202C3000000
+00000098005B20000000015100000000002B500890000000
+0000003C3019910000000010000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evBoundEsc [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000000000000000002B500890000000
+000003C202B5000000000000000000000005B202C3000000
+000007A006B1000000000000000000000001B600A7000000
+00000B501B500000000000000000000000005B105B000000
+00002C303C200000000000000000000000002C303C200000
+00003B105B000000000000010000000000000B501B300000
+00005B00780000000000002620000000000008700B500000
+00006A00970000000000026662000000000007900A600000
+000069009600000000002636362000000000069009600000
+00006A00970000000002621612620000000007900A600000
+00005B00780000000026201610262000000008700B500000
+00003B105B000000026311262113620000000B501B300000
+00002C303C200000166666666666661000002C303C200000
+00000B501B500000011111262111110000005B105B000000
+000007A006B1000000000016100000000001B600A7000000
+000003C202B5000000000015100000000005B202C3000000
+00000098005B20000000000100000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evBoundSignal [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000000300000000002B500890000000
+000003C202B5000000000037300000000005B202C3000000
+000007A006B1000000000164610000000001B600A7000000
+00000B501B500000000003515300000000005B105B000000
+00002C303C200000000016202610000000002C303C200000
+00003B105B000000000045000540000000000B501B300000
+00005B00780000000001620002610000000008700B500000
+00006A00970000000004500000540000000007900A600000
+000069009600000000262000002620000000069009600000
+00006A00970000000054000000045000000007900A600000
+00005B00780000000261000000016200000008700B500000
+00003B105B000000054000000000450000000B501B300000
+00002C303C200000261000000000162000002C303C200000
+00000B501B500000541111111111145000005B105B000000
+000007A006B1000266666666666666620001B600A7000000
+000003C202B5000011111111111111100005B202C3000000
+00000098005B20000000000000000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evBoundCancel [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000000000000000002B500890000000
+000003C202B5000001000000000001000005B202C3000000
+000007A006B1000016300000000036100001B600A7000000
+00000B501B500000036300000003630000005B105B000000
+00002C303C200000003630000036300000002C303C200000
+00003B105B000000000363000363000000000B501B300000
+00005B00780000000000363036300000000008700B500000
+00006A00970000000000036463000000000007900A600000
+000069009600000000000048400000000000069009600000
+00006A00970000000000036463000000000007900A600000
+00005B00780000000000363036300000000008700B500000
+00003B105B000000000363000363000000000B501B300000
+00002C303C200000003630000036300000002C303C200000
+00000B501B500000036300000003630000005B105B000000
+000007A006B1000016300000000036100001B600A7000000
+000003C202B5000001000000000001000005B202C3000000
+00000098005B20000000000000000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evBoundComp [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910000000000000000000199103C30000000
+00000098005B20000000000000000000002B500890000000
+000003C202B5000100000001000000000005B202C3000000
+000007A006B1000541000026200000000001B600A7000000
+00000B501B500005551000266300000000005B105B000000
+00002C303C200005346200252640000000002C303C200000
+00003B105B000005203630250155100000000B501B300000
+00005B00780000052002543500145200000008700B500000
+00006A00970000052000155500003630000007900A600000
+000069009600000520000155000003610000069009600000
+00006A00970000052000155500003630000007900A600000
+00005B00780000052002543500145200000008700B500000
+00003B105B000005203630250155100000000B501B300000
+00002C303C200005346200252640000000002C303C200000
+00000B501B500005551000266300000000005B105B000000
+000007A006B1000541000026200000000001B600A7000000
+000003C202B5000100000001000000000005B202C3000000
+00000098005B20000000000000000000002B500890000000
+0000003C3019910000000000000000000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evBoundCond [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+0000000000000039CA53100000135AC93000000000000000
+00000000000028C82000000000000028C820000000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000005C710026BCB87678BCB620017C500000000000
+0000000005C50015BB52000000025BB51005C50000000000
+000000004C50029B510000000000015B92005C4000000000
+00000002B7002B9200000000000000029B2007B200000000
+00000008A102B810000000000000000018B201A800000000
+0000003C3019910004888888888884000199103C30000000
+00000098005B20004BFFFFFFFFFFFB40002B500890000000
+000003C202B500008FB888888888BF800005B202C3000000
+000007A006B100008F80000000008F800001B600A7000000
+00000B501B5000008F80000000008F8000005B105B000000
+00002C303C2000008F80000000008F8000002C303C200000
+00003B105B0000008F82555555528F8000000B501B300000
+00005B00780000008F80000000008F80000008700B500000
+00006A00970000008F80000000008F80000007900A600000
+00006900960000008F82555555528F800000069009600000
+00006A00970000008F80000000008F80000007900A600000
+00005B00780000008F80000000008F80000008700B500000
+00003B105B0000008F82555555528F8000000B501B300000
+00002C303C2000008F80000000008F8000002C303C200000
+00000B501B5000008F80000000008F8000005B105B000000
+000007A006B100008F80000000008F800001B600A7000000
+000003C202B500008FB888888888BF800005B202C3000000
+00000098005B20004BFFFFFFFFFFFB40002B500890000000
+0000003C3019910004888888888884000199103C30000000
+00000008A102B810000000000000000018B201A800000000
+00000002B7002B9200000000000000029B2007B200000000
+000000004C50029B510000000000015B92005C4000000000
+0000000005C50015BB52000000025BB51005C50000000000
+00000000005C710026BCB87678BCB620017C500000000000
+000000000004BA3000135799975310003AB4000000000000
+00000000000028C82000000000000028C820000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BCBBA9ABBCB7300000000000000000
+000000000000000000023566653200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evBoundMsgNI [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000003566653000000000000000000000
+000000000000000001116BA9AB6111000000000000000000
+000000000000000111000000000001110000000000000000
+000000000000284100000000000000014820000000000000
+000000000004BA2000000799970000002AB4000000000000
+00000000005C71000011187678111000017C500000000000
+0000000005C5001511000000000001151005C50000000000
+000000000950029B300000000000003B9200590000000000
+0000000011002B9200000000000000029B20011000000000
+000000011000B810000000000000000018B0001100000000
+000000010001310000000000000000000131000100000000
+000000110001000000000000000000000001000110000000
+000000100010000000000000000000000000100010000000
+000007800010000888888888888888880000100087000000
+00000B501620008FFFFFFFFFFFFFFFFF800026105B000000
+00002C303C20008FDA88888888888ADF80002C303C200000
+00003B105B00008F854000000000458F80000B501B300000
+00005B007800008F815510000015518F800008700B500000
+00006A009700008F800451000154008F800007900A600000
+000035005300008F800036202630008F8000035005300000
+000001001100008F800002646200008F8000011001000000
+000001001100008F800000252000008F8000011001000000
+000001000100008F800000000000008F8000010001000000
+000001000100008FB8888888888888BF8000010001000000
+000001000540008FFFFFFFFFFFFFFFFF8000450001000000
+0000013006B1000888888888888888880001B60031000000
+000003C202B5000000000000000000000005B202C3000000
+00000098005B20000000000000000000002B500890000000
+0000003C3019700000000000000000000079103C30000000
+00000008A10111000000000000000000011101A800000000
+00000002B70001100000000000000000110007B200000000
+000000004400001121000000000001211000044000000000
+0000000000100000BB52000000025BB00000100000000000
+000000000001100026BCB11111BCB6200011000000000000
+000000000000111000135111115310001110000000000000
+000000000000019820000000000000289100000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BC6111116CB7300000000000000000
+000000000000000000020001000200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evBoundTimerNI [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000003566653000000000000000000000
+000000000000000001116BA9AB6111000000000000000000
+000000000000000111000000000001110000000000000000
+000000000000284100000000000000014820000000000000
+000000000004BA2000000799970000002AB4000000000000
+00000000005C71000011187678111000017C500000000000
+0000000005C5001511000000000001151005C50000000000
+000000000950029B300000000000003B9200590000000000
+0000000011002B9200000000000000029B20011000000000
+000000011000B810000000000000000018B0001100000000
+000000010001310000000000000000000131000100000000
+000000110001000000000133310000000001000110000000
+000000100010000000039BBBBB9300000000100010000000
+0000078000100000006C8312138C60000000100087000000
+00000B501620000006B400151004B600000026105B000000
+00002C303C2000003C40001510004C3000002C303C200000
+00003B105B000000980000151000089000000B501B300000
+00005B0078000001B3000015100003B1000008700B500000
+00006A0097000003B1000015111001B3000007900A600000
+0000350053000003B0000015555300B30000035005300000
+0000010011000003B1000001111001B30000011001000000
+0000010011000001B3000000000003B10000011001000000
+000001000100000098000000000008900000010001000000
+00000100010000003C40000000004C300000010001000000
+000001000540000006B400000004B6000000450001000000
+0000013006B10000006C8310138C60000001B60031000000
+000003C202B5000000039BBBBB9300000005B202C3000000
+00000098005B20000000013331000000002B500890000000
+0000003C3019700000000000000000000079103C30000000
+00000008A10111000000000000000000011101A800000000
+00000002B70001100000000000000000110007B200000000
+000000004400001121000000000001211000044000000000
+0000000000100000BB52000000025BB00000100000000000
+000000000001100026BCB11111BCB6200011000000000000
+000000000000111000135111115310001110000000000000
+000000000000019820000000000000289100000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BC6111116CB7300000000000000000
+000000000000000000020001000200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evBoundEscNI [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000003566653000000000000000000000
+000000000000000001116BA9AB6111000000000000000000
+000000000000000111000000000001110000000000000000
+000000000000284100000000000000014820000000000000
+000000000004BA2000000799970000002AB4000000000000
+00000000005C71000011187678111000017C500000000000
+0000000005C5001511000000000001151005C50000000000
+000000000950029B300000000000003B9200590000000000
+0000000011002B9200000000000000029B20011000000000
+000000011000B810000000000000000018B0001100000000
+000000010001310000000000000000000131000100000000
+000000110001000000000000000000000001000110000000
+000000100010000000000000000000000000100010000000
+000007800010000000000000000000000000100087000000
+00000B50162000000000000000000000000026105B000000
+00002C303C200000000000000000000000002C303C200000
+00003B105B000000000000010000000000000B501B300000
+00005B00780000000000002620000000000008700B500000
+00006A00970000000000026662000000000007900A600000
+000035005300000000002636362000000000035005300000
+000001001100000000026216126200000000011001000000
+000001001100000000262016102620000000011001000000
+000001000100000002631126211362000000010001000000
+000001000100000016666666666666100000010001000000
+000001000540000001111126211111000000450001000000
+0000013006B1000000000016100000000001B60031000000
+000003C202B5000000000015100000000005B202C3000000
+00000098005B20000000000100000000002B500890000000
+0000003C3019700000000000000000000079103C30000000
+00000008A10111000000000000000000011101A800000000
+00000002B70001100000000000000000110007B200000000
+000000004400001121000000000001211000044000000000
+0000000000100000BB52000000025BB00000100000000000
+000000000001100026BCB11111BCB6200011000000000000
+000000000000111000135111115310001110000000000000
+000000000000019820000000000000289100000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BC6111116CB7300000000000000000
+000000000000000000020001000200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evBoundSignalNI [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000003566653000000000000000000000
+000000000000000001116BA9AB6111000000000000000000
+000000000000000111000000000001110000000000000000
+000000000000284100000000000000014820000000000000
+000000000004BA2000000799970000002AB4000000000000
+00000000005C71000011187678111000017C500000000000
+0000000005C5001511000000000001151005C50000000000
+000000000950029B300000000000003B9200590000000000
+0000000011002B9200000000000000029B20011000000000
+000000011000B810000000000000000018B0001100000000
+000000010001310000000000000000000131000100000000
+000000110001000000000003000000000001000110000000
+000000100010000000000037300000000000100010000000
+000007800010000000000164610000000000100087000000
+00000B50162000000000035153000000000026105B000000
+00002C303C200000000016202610000000002C303C200000
+00003B105B000000000045000540000000000B501B300000
+00005B00780000000001620002610000000008700B500000
+00006A00970000000004500000540000000007900A600000
+000035005300000000262000002620000000035005300000
+000001001100000000540000000450000000011001000000
+000001001100000002610000000162000000011001000000
+000001000100000005400000000045000000010001000000
+000001000100000026100000000016200000010001000000
+000001000540000054111111111114500000450001000000
+0000013006B1000266666666666666620001B60031000000
+000003C202B5000011111111111111100005B202C3000000
+00000098005B20000000000000000000002B500890000000
+0000003C3019700000000000000000000079103C30000000
+00000008A10111000000000000000000011101A800000000
+00000002B70001100000000000000000110007B200000000
+000000004400001121000000000001211000044000000000
+0000000000100000BB52000000025BB00000100000000000
+000000000001100026BCB11111BCB6200011000000000000
+000000000000111000135111115310001110000000000000
+000000000000019820000000000000289100000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BC6111116CB7300000000000000000
+000000000000000000020001000200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $evBoundCondNI [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000003566653000000000000000000000
+000000000000000001116BA9AB6111000000000000000000
+000000000000000111000000000001110000000000000000
+000000000000284100000000000000014820000000000000
+000000000004BA2000000799970000002AB4000000000000
+00000000005C71000011187678111000017C500000000000
+0000000005C5001511000000000001151005C50000000000
+000000000950029B300000000000003B9200590000000000
+0000000011002B9200000000000000029B20011000000000
+000000011000B810000000000000000018B0001100000000
+000000010001310004888888888884000131000100000000
+00000011000100004BFFFFFFFFFFFB400001000110000000
+00000010001000008FB888888888BF800000100010000000
+00000780001000008F80000000008F800000100087000000
+00000B50162000008F80000000008F80000026105B000000
+00002C303C2000008F80000000008F8000002C303C200000
+00003B105B0000008F82555555528F8000000B501B300000
+00005B00780000008F80000000008F80000008700B500000
+00006A00970000008F80000000008F80000007900A600000
+00003500530000008F82555555528F800000035005300000
+00000100110000008F80000000008F800000011001000000
+00000100110000008F80000000008F800000011001000000
+00000100010000008F82555555528F800000010001000000
+00000100010000008F80000000008F800000010001000000
+00000100054000008F80000000008F800000450001000000
+0000013006B100008F80000000008F800001B60031000000
+000003C202B500008FB888888888BF800005B202C3000000
+00000098005B20004BFFFFFFFFFFFB40002B500890000000
+0000003C3019700004888888888884000079103C30000000
+00000008A10111000000000000000000011101A800000000
+00000002B70001100000000000000000110007B200000000
+000000004400001121000000000001211000044000000000
+0000000000100000BB52000000025BB00000100000000000
+000000000001100026BCB11111BCB6200011000000000000
+000000000000111000135111115310001110000000000000
+000000000000019820000000000000289100000000000000
+0000000000000039CA53100000135AC93000000000000000
+000000000000000037BC6111116CB7300000000000000000
+000000000000000000020001000200000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $gwXor [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000001000000000000000000000000
+00000000000000000000004C400000000000000000000000
+0000000000000000000004C6C40000000000000000000000
+000000000000000000004C404C4000000000000000000000
+00000000000000000004C40004C400000000000000000000
+0000000000000000004C4000004C40000000000000000000
+000000000000000004C400000004C4000000000000000000
+00000000000000004C40000000004C400000000000000000
+0000000000000004C4000000000004C40000000000000000
+000000000000004C400000000000004C4000000000000000
+00000000000004C40000000000000004C400000000000000
+0000000000004C4000000000000000004C40000000000000
+000000000004C400000000000000000004C4000000000000
+00000000004C40010000000000000001004C400000000000
+0000000004C4001630000000000000361004C40000000000
+000000004C400003630000000000036300004C4000000000
+00000004C40000003630000000003630000004C400000000
+0000004C4000000003630000000363000000004C40000000
+000004C400000000003630000036300000000004C4000000
+00004C40000000000003630003630000000000004C400000
+0004C4000000000000003631363000000000000004C40000
+004C400000000000000003646300000000000000004C4000
+01C60000000000000000014841000000000000000006C100
+004C400000000000000003646300000000000000004C4000
+0004C4000000000000003631363000000000000004C40000
+00004C40000000000003630003630000000000004C400000
+000004C400000000003630000036300000000004C4000000
+0000004C4000000003630000000363000000004C40000000
+00000004C40000003630000000003630000004C400000000
+000000004C400003630000000000036300004C4000000000
+0000000004C4001630000000000000361004C40000000000
+00000000004C40010000000000000001004C400000000000
+000000000004C400000000000000000004C4000000000000
+0000000000004C4000000000000000004C40000000000000
+00000000000004C40000000000000004C400000000000000
+000000000000004C400000000000004C4000000000000000
+0000000000000004C4000000000004C40000000000000000
+00000000000000004C40000000004C400000000000000000
+000000000000000004C400000004C4000000000000000000
+0000000000000000004C4000004C40000000000000000000
+00000000000000000004C40004C400000000000000000000
+000000000000000000004C404C4000000000000000000000
+0000000000000000000004C6C40000000000000000000000
+00000000000000000000004C400000000000000000000000
+000000000000000000000001000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $gwAnd [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000001000000000000000000000000
+00000000000000000000004C400000000000000000000000
+0000000000000000000004C6C40000000000000000000000
+000000000000000000004C404C4000000000000000000000
+00000000000000000004C40004C400000000000000000000
+0000000000000000004C4000004C40000000000000000000
+000000000000000004C400000004C4000000000000000000
+00000000000000004C40000000004C400000000000000000
+0000000000000004C4000000000004C40000000000000000
+000000000000004C400000000000004C4000000000000000
+00000000000004C40000000000000004C400000000000000
+0000000000004C4000000000000000004C40000000000000
+000000000004C400000000020000000004C4000000000000
+00000000004C40000000002620000000004C400000000000
+0000000004C4000000000026200000000004C40000000000
+000000004C400000000000262000000000004C4000000000
+00000004C40000000000002620000000000004C400000000
+0000004C4000000000000026200000000000004C40000000
+000004C400000000000000262000000000000004C4000000
+00004C40000000000000002620000000000000004C400000
+0004C4000000000000000026200000000000000004C40000
+004C400000000022222222262222222220000000004C4000
+01C60000000002666666666666666666620000000006C100
+004C400000000022222222262222222220000000004C4000
+0004C4000000000000000026200000000000000004C40000
+00004C40000000000000002620000000000000004C400000
+000004C400000000000000262000000000000004C4000000
+0000004C4000000000000026200000000000004C40000000
+00000004C40000000000002620000000000004C400000000
+000000004C400000000000262000000000004C4000000000
+0000000004C4000000000026200000000004C40000000000
+00000000004C40000000002620000000004C400000000000
+000000000004C400000000020000000004C4000000000000
+0000000000004C4000000000000000004C40000000000000
+00000000000004C40000000000000004C400000000000000
+000000000000004C400000000000004C4000000000000000
+0000000000000004C4000000000004C40000000000000000
+00000000000000004C40000000004C400000000000000000
+000000000000000004C400000004C4000000000000000000
+0000000000000000004C4000004C40000000000000000000
+00000000000000000004C40004C400000000000000000000
+000000000000000000004C404C4000000000000000000000
+0000000000000000000004C6C40000000000000000000000
+00000000000000000000004C400000000000000000000000
+000000000000000000000001000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $gwOr [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000001000000000000000000000000
+00000000000000000000004C400000000000000000000000
+0000000000000000000004C6C40000000000000000000000
+000000000000000000004C404C4000000000000000000000
+00000000000000000004C40004C400000000000000000000
+0000000000000000004C4000004C40000000000000000000
+000000000000000004C400000004C4000000000000000000
+00000000000000004C40000000004C400000000000000000
+0000000000000004C4000000000004C40000000000000000
+000000000000004C400000000000004C4000000000000000
+00000000000004C40000000000000004C400000000000000
+0000000000004C4000000000000000004C40000000000000
+000000000004C400000000000000000004C4000000000000
+00000000004C40000000000000000000004C400000000000
+0000000004C4000000000123210000000004C40000000000
+000000004C40000000027BCCCB72000000004C4000000000
+00000004C4000000004BB63336BB4000000004C400000000
+0000004C4000000004C710000017C4000000004C40000000
+000004C4000000002B71000000017B2000000004C4000000
+00004C40000000007B10000000001B70000000004C400000
+0004C40000000001B6000000000006B10000000004C40000
+004C400000000002C3000000000003C200000000004C4000
+01C6000000000003C3000000000003C3000000000006C100
+004C400000000002C3000000000003C200000000004C4000
+0004C40000000001B6000000000006B10000000004C40000
+00004C40000000007B10000000001B70000000004C400000
+000004C4000000002B71000000017B2000000004C4000000
+0000004C4000000004C710000017C4000000004C40000000
+00000004C4000000004BB63336BB4000000004C400000000
+000000004C40000000027BCCCB72000000004C4000000000
+0000000004C4000000000123210000000004C40000000000
+00000000004C40000000000000000000004C400000000000
+000000000004C400000000000000000004C4000000000000
+0000000000004C4000000000000000004C40000000000000
+00000000000004C40000000000000004C400000000000000
+000000000000004C400000000000004C4000000000000000
+0000000000000004C4000000000004C40000000000000000
+00000000000000004C40000000004C400000000000000000
+000000000000000004C400000004C4000000000000000000
+0000000000000000004C4000004C40000000000000000000
+00000000000000000004C40004C400000000000000000000
+000000000000000000004C404C4000000000000000000000
+0000000000000000000004C6C40000000000000000000000
+00000000000000000000004C400000000000000000000000
+000000000000000000000001000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $gwComplex [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000001000000000000000000000000
+00000000000000000000004C400000000000000000000000
+0000000000000000000004C6C40000000000000000000000
+000000000000000000004C404C4000000000000000000000
+00000000000000000004C40004C400000000000000000000
+0000000000000000004C4000004C40000000000000000000
+000000000000000004C400000004C4000000000000000000
+00000000000000004C40000000004C400000000000000000
+0000000000000004C4000000000004C40000000000000000
+000000000000004C400000000000004C4000000000000000
+00000000000004C40000000000000004C400000000000000
+0000000000004C4000000000000000004C40000000000000
+000000000004C400000000000000000004C4000000000000
+00000000004C40000000000000000000004C400000000000
+0000000004C4000000000001000000000004C40000000000
+000000004C400000000000151000000000004C4000000000
+00000004C40000000010001610001000000004C400000000
+0000004C4000000001520016100251000000004C40000000
+000004C400000000002620161026200000000004C4000000
+00004C40000000000002621612620000000000004C400000
+0004C4000000000000002636362000000000000004C40000
+004C400000000000111113666311111000000000004C4000
+01C60000000000015666666866666651000000000006C100
+004C400000000000111113666311111000000000004C4000
+0004C4000000000000002636362000000000000004C40000
+00004C40000000000002621612620000000000004C400000
+000004C400000000002620161026200000000004C4000000
+0000004C4000000001520016100251000000004C40000000
+00000004C40000000010001610001000000004C400000000
+000000004C400000000000151000000000004C4000000000
+0000000004C4000000000001000000000004C40000000000
+00000000004C40000000000000000000004C400000000000
+000000000004C400000000000000000004C4000000000000
+0000000000004C4000000000000000004C40000000000000
+00000000000004C40000000000000004C400000000000000
+000000000000004C400000000000004C4000000000000000
+0000000000000004C4000000000004C40000000000000000
+00000000000000004C40000000004C400000000000000000
+000000000000000004C400000004C4000000000000000000
+0000000000000000004C4000004C40000000000000000000
+00000000000000000004C40004C400000000000000000000
+000000000000000000004C404C4000000000000000000000
+0000000000000000000004C6C40000000000000000000000
+00000000000000000000004C400000000000000000000000
+000000000000000000000001000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $gwEvent [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000001000000000000000000000000
+00000000000000000000004C400000000000000000000000
+0000000000000000000004C6C40000000000000000000000
+000000000000000000004C404C4000000000000000000000
+00000000000000000004C40004C400000000000000000000
+0000000000000000004C4000004C40000000000000000000
+000000000000000004C400000004C4000000000000000000
+00000000000000004C40000000004C400000000000000000
+0000000000000004C4000000000004C40000000000000000
+000000000000004C400000000000004C4000000000000000
+00000000000004C40000000000000004C400000000000000
+0000000000004C4000002467642000004C40000000000000
+000000000004C400014ABA878ABA410004C4000000000000
+00000000004C40002AB510000015BA20004C400000000000
+0000000004C40003B7100013100017B30004C40000000000
+000000004C40002B600001565100006B20004C4000000000
+00000004C40001A70000363136300007A10004C400000000
+0000004C400004B10014620002641001B400004C40000000
+000004C400000A5002551000001552005A000004C4000000
+00004C4000002B1036300000000036301B2000004C400000
+0004C40000004A0162000000000002610A40000004C40000
+004C400000006800530000000000035008600000004C4000
+01C60000000077002500000000000520077000000006C100
+004C400000006800161000000000161008600000004C4000
+0004C40000004A0005300000000035000A40000004C40000
+00004C4000002B1003500000000053001B2000004C400000
+000004C400000A5001610000000161005A000004C4000000
+0000004C400004B10053111111135001B400004C40000000
+00000004C40001A70036666666663007A10004C400000000
+000000004C40002B600111111111006B20004C4000000000
+0000000004C40003B7100000000017B30004C40000000000
+00000000004C40002AB510000015BA20004C400000000000
+000000000004C400014ABA878ABA410004C4000000000000
+0000000000004C4000002467642000004C40000000000000
+00000000000004C40000000000000004C400000000000000
+000000000000004C400000000000004C4000000000000000
+0000000000000004C4000000000004C40000000000000000
+00000000000000004C40000000004C400000000000000000
+000000000000000004C400000004C4000000000000000000
+0000000000000000004C4000004C40000000000000000000
+00000000000000000004C40004C400000000000000000000
+000000000000000000004C404C4000000000000000000000
+0000000000000000000004C6C40000000000000000000000
+00000000000000000000004C400000000000000000000000
+000000000000000000000001000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $gwParEvent [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000001000000000000000000000000
+00000000000000000000004C400000000000000000000000
+0000000000000000000004C6C40000000000000000000000
+000000000000000000004C404C4000000000000000000000
+00000000000000000004C40004C400000000000000000000
+0000000000000000004C4000004C40000000000000000000
+000000000000000004C400000004C4000000000000000000
+00000000000000004C40000000004C400000000000000000
+0000000000000004C4000000000004C40000000000000000
+000000000000004C400000000000004C4000000000000000
+00000000000004C40000000000000004C400000000000000
+0000000000004C4000000000000000004C40000000000000
+000000000004C400000000000000000004C4000000000000
+00000000004C40000000000000000000004C400000000000
+0000000004C4000000001356531000000004C40000000000
+000000004C4000000015BBA9ABB5100000004C4000000000
+00000004C4000000019B5101015B9100000004C400000000
+0000004C4000000019A200151002A9100000004C40000000
+000004C4000000005B20001610002B5000000004C4000000
+00004C4000000001B5000016100005B1000000004C400000
+0004C40000000003B1000016100001B30000000004C40000
+004C400000000005A0111126211110A500000000004C4000
+01C60000000000069156666666665196000000000006C100
+004C400000000005A0111126211110A500000000004C4000
+0004C40000000003B1000016100001B30000000004C40000
+00004C4000000001B5000016100005B1000000004C400000
+000004C4000000005B20001610002B5000000004C4000000
+0000004C4000000019A200151002A9100000004C40000000
+00000004C4000000019B5101015B9100000004C400000000
+000000004C4000000015BBA9ABB5100000004C4000000000
+0000000004C4000000001356531000000004C40000000000
+00000000004C40000000000000000000004C400000000000
+000000000004C400000000000000000004C4000000000000
+0000000000004C4000000000000000004C40000000000000
+00000000000004C40000000000000004C400000000000000
+000000000000004C400000000000004C4000000000000000
+0000000000000004C4000000000004C40000000000000000
+00000000000000004C40000000004C400000000000000000
+000000000000000004C400000004C4000000000000000000
+0000000000000000004C4000004C40000000000000000000
+00000000000000000004C40004C400000000000000000000
+000000000000000000004C404C4000000000000000000000
+0000000000000000000004C6C40000000000000000000000
+00000000000000000000004C400000000000000000000000
+000000000000000000000001000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $icUser [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000034300000000000000000000000
+0000000000000000000019CEC91000000000000000000000
+000000000000000000008DFFFD8000000000000000000000
+00000000000000000001BFFFFFB100000000000000000000
+00000000000000000002CFFFFFC200000000000000000000
+00000000000000000001BEFFFEB100000000000000000000
+000000000000000000005DEFED5000000000000000000000
+0000000000000000000004ABA40000000000000000000000
+000000000000000000030000000300000000000000000000
+000000000000000000260000000620000000000000000000
+000000000000000000440000000440000000000000000000
+000000000000000001610000000161000000000000000000
+000000000000000002500000000052000000000000000000
+000000000000000005311111111135000000000000000000
+000000000000000016666666666666100000000000000000
+000000000000000001111111111111000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $icService [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000003000000000000000000000000
+000000000000000000000016100000000000000000000000
+000000000000000001200016100021000000000000000000
+000000000000000002620147410262000000000000000000
+000000000000000000265BCCCB5620000000000000000000
+00000000000000000005C73537C500000000000000000000
+0000000000000000001B7400047B10000000000000000000
+0000000000000000114C3000003C41100000000000000000
+0000000000000003667C5000005C76630000000000000000
+0000000000000000114C3000003C41100000000000000000
+0000000000000000001B7400047B10000000000000000000
+00000000000000000005C73537C500000000000000000000
+000000000000000000265BCCCB5620000000000000000000
+000000000000000002620147410262000000000000000000
+000000000000000001200016100021000000000000000000
+000000000000000000000016100000000000000000000000
+000000000000000000000003000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $icScript [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000004888888888884000000000000000000
+00000000000000004BFFFFFFFFFFFB400000000000000000
+00000000000000008FB888888888BF800000000000000000
+00000000000000008F80000000008F800000000000000000
+00000000000000008F80000000008F800000000000000000
+00000000000000008F80000000008F800000000000000000
+00000000000000008F82555555528F800000000000000000
+00000000000000008F80000000008F800000000000000000
+00000000000000008F80000000008F800000000000000000
+00000000000000008F82555555528F800000000000000000
+00000000000000008F80000000008F800000000000000000
+00000000000000008F80000000008F800000000000000000
+00000000000000008F82555555528F800000000000000000
+00000000000000008F80000000008F800000000000000000
+00000000000000008F80000000008F800000000000000000
+00000000000000008F80000000008F800000000000000000
+00000000000000008FB888888888BF800000000000000000
+00000000000000004BFFFFFFFFFFFB400000000000000000
+000000000000000004888888888884000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $icManual [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000010000000000000000000000000
+000000000000000000000151003000000000000000000000
+000000000000000000100160016100000000000000000000
+000000000000000001510260026000100000000000000000
+000000000000000003500350035001510000000000000000
+000000000000000005300440044002600000000000000000
+000000000000000016100530053003500000000000000000
+000000000000000035000620052005300000000000000000
+000000000000000053112621262116200000000000000000
+000000000000000166666666666666610000000000000000
+000000000000000011111111111111100000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $icRule [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000011111111111111100000000000000000
+000000000000000156666666666666510000000000000000
+000000000000000161111116111111610000000000000000
+000000000000000161000016100001610000000000000000
+000000000000000161000016100001610000000000000000
+000000000000000161000016100001610000000000000000
+000000000000000161111116111111610000000000000000
+000000000000000166666666666666610000000000000000
+000000000000000161111116111111610000000000000000
+000000000000000161000016100001610000000000000000
+000000000000000161000016100001610000000000000000
+000000000000000161000016100001610000000000000000
+000000000000000161111116111111610000000000000000
+000000000000000156666666666666510000000000000000
+000000000000000011111111111111100000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $icPlusbox [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000048888888888888400000000000000000
+0000000000000004BFFFFFFFFFFFFFB40000000000000000
+0000000000000008FB88888888888BF80000000000000000
+0000000000000008F8000003000008F80000000000000000
+0000000000000008F8000016100008F80000000000000000
+0000000000000008F8000016100008F80000000000000000
+0000000000000008F8000016100008F80000000000000000
+0000000000000008F8011126211108F80000000000000000
+0000000000000008F8366666666638F80000000000000000
+0000000000000008F8011126211108F80000000000000000
+0000000000000008F8000016100008F80000000000000000
+0000000000000008F8000016100008F80000000000000000
+0000000000000008F8000016100008F80000000000000000
+0000000000000008F8000003000008F80000000000000000
+0000000000000008FB88888888888BF80000000000000000
+0000000000000004BFFFFFFFFFFFFFB40000000000000000
+000000000000000048888888888888400000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $icMsg [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000888888888888888880000000000000000
+000000000000008FFFFFFFFFFFFFFFFF8000000000000000
+000000000000008FDA88888888888ADF8000000000000000
+000000000000008F854000000000458F8000000000000000
+000000000000008F815510000015518F8000000000000000
+000000000000008F800451000154008F8000000000000000
+000000000000008F800036202630008F8000000000000000
+000000000000008F800002646200008F8000000000000000
+000000000000008F800000252000008F8000000000000000
+000000000000008F800000000000008F8000000000000000
+000000000000008FB8888888888888BF8000000000000000
+000000000000008FFFFFFFFFFFFFFFFF8000000000000000
+000000000000000888888888888888880000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $icMsgf [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000888888888888888880000000000000000
+000000000000008FFFFFFFFFFFFFFFFF8000000000000000
+000000000000008FFFFFFFFFFFFFFFFF8000000000000000
+000000000000008FFFFFFFFFFFFFFFFF8000000000000000
+000000000000008FFFFFFFFFFFFFFFFF8000000000000000
+000000000000008FFFFFFFFFFFFFFFFF8000000000000000
+000000000000008FFFFFFFFFFFFFFFFF8000000000000000
+000000000000008FFFFFFFFFFFFFFFFF8000000000000000
+000000000000008FFFFFFFFFFFFFFFFF8000000000000000
+000000000000008FFFFFFFFFFFFFFFFF8000000000000000
+000000000000008FFFFFFFFFFFFFFFFF8000000000000000
+000000000000008FFFFFFFFFFFFFFFFF8000000000000000
+000000000000000888888888888888880000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
+
+sprite $icLoop [48x48/16] {
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000002578752000000000000000000000
+00000000000000000039CB989BC930000000000000000000
+000000000000000005C931000139C5000000000000000000
+00000000000000005D61000000016D500000000000000000
+0000000000000003C6000000000006C30000000000000000
+000000000000000991000000000001990000000000000000
+000000000000002C300000000000003C2000000000000000
+000000000000005B100000000000001B5000000000000000
+000000000000007900000000000000097000000000000000
+000000000000008800000000000000088000000000000000
+000000000000007900000000000000097000000000000000
+000000000000005B100000000000011B5000000000000000
+000000000000002C300000000000265C2000000000000000
+000000000000000991000000000264A90000000000000000
+0000000000000003C6000000002636C62000000000000000
+00000000000000005D61000002636D526200000000000000
+000000000000000005C931001659C5002610000000000000
+00000000000000000039CB989BC930000100000000000000
+000000000000000000002578752000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+}
diff --git a/build-exe-fast.bat b/build-exe-fast.bat
new file mode 100644
index 0000000..0b26dd0
--- /dev/null
+++ b/build-exe-fast.bat
@@ -0,0 +1,85 @@
+@echo off
+setlocal EnableExtensions
+chcp 65001 >nul
+cd /d "%~dp0"
+
+set "DO_PAUSE=1"
+set "PYI_CLEAN="
+for %%A in (%*) do (
+ if /i "%%~A"=="nopause" set "DO_PAUSE=0"
+ if /i "%%~A"=="clean" set "PYI_CLEAN=--clean"
+)
+
+echo === md2gost: быстрая сборка exe (onefile, шрифты + plantuml.jar) ===
+echo Каталог: %CD%
+echo Spec: md2gost.fast.spec
+echo Кэш: build-fast\ (без --clean, пока не передадите clean)
+echo.
+
+where python >nul 2>&1
+if errorlevel 1 (
+ echo Python не найден в PATH. Установите Python 3.10+ и отметьте "Add python.exe to PATH".
+ goto :fail
+)
+
+python -c "import sys; raise SystemExit(0 if sys.version_info >= (3, 10) else 1)"
+if errorlevel 1 (
+ echo Нужен Python 3.10 или новее.
+ python --version
+ goto :fail
+)
+
+echo [1/4] Зависимости ...
+python -c "import PyInstaller, matplotlib, docx, marko, lxml, pygments, PIL, freetype, latex2mathml, requests, docxcompose" 1>nul 2>nul
+if errorlevel 1 (
+ echo Ставлю проект + PyInstaller + matplotlib ...
+ python -m pip install -q -e . "pyinstaller>=6.0" "matplotlib>=3.7"
+ if errorlevel 1 (
+ echo Не удалось поставить зависимости.
+ goto :fail
+ )
+) else (
+ echo Уже стоят, pip пропускаю.
+)
+
+if not exist "md2gost\Template.docx" (
+ echo Нет md2gost\Template.docx — сборка бессмысленна.
+ goto :fail
+)
+
+echo [2/4] PlantUML jar (обязателен, вшивается в exe) ...
+python scripts\fetch_plantuml.py
+if not exist "md2gost\vendor\plantuml.jar" (
+ echo Нет md2gost\vendor\plantuml.jar — portable exe без jar не собираем.
+ goto :fail
+)
+
+echo [3/4] PyInstaller onefile, кэш build-fast ...
+python -m PyInstaller --noconfirm %PYI_CLEAN% --workpath build-fast --distpath dist md2gost.fast.spec
+if errorlevel 1 (
+ echo PyInstaller завершился с ошибкой.
+ goto :fail
+)
+
+if not exist "dist\md2gost.exe" (
+ echo dist\md2gost.exe не появился.
+ goto :fail
+)
+
+echo.
+echo [4/4] Готово:
+echo %CD%\dist\md2gost.exe
+echo.
+echo Двойной клик — GUI. Из консоли: md2gost.exe report.md -o report.docx
+echo Повторно без clean — быстрее за счёт кэша Analysis.
+echo Полный пересбор: build-exe-fast.bat clean
+echo.
+
+if "%DO_PAUSE%"=="1" pause
+exit /b 0
+
+:fail
+echo.
+echo Сборка не удалась.
+if "%DO_PAUSE%"=="1" pause
+exit /b 1
diff --git a/build-exe.bat b/build-exe.bat
new file mode 100644
index 0000000..8fc11cf
--- /dev/null
+++ b/build-exe.bat
@@ -0,0 +1,68 @@
+@echo off
+setlocal EnableExtensions
+chcp 65001 >nul
+cd /d "%~dp0"
+
+echo === md2gost: сборка exe ===
+echo Каталог: %CD%
+echo.
+
+where python >nul 2>&1
+if errorlevel 1 (
+ echo Python не найден в PATH. Установите Python 3.10+ и отметьте "Add python.exe to PATH".
+ goto :fail
+)
+
+python -c "import sys; raise SystemExit(0 if sys.version_info >= (3, 10) else 1)"
+if errorlevel 1 (
+ echo Нужен Python 3.10 или новее.
+ python --version
+ goto :fail
+)
+
+echo [1/4] Зависимости проекта + PyInstaller + matplotlib ...
+python -m pip install -q -e . "pyinstaller>=6.0" "matplotlib>=3.7"
+if errorlevel 1 (
+ echo Не удалось поставить зависимости.
+ goto :fail
+)
+
+if not exist "md2gost\Template.docx" (
+ echo Нет md2gost\Template.docx — сборка бессмысленна.
+ goto :fail
+)
+
+echo [2/4] PlantUML jar (вшивается в exe, если скачается^) ...
+python scripts\fetch_plantuml.py
+if not exist "md2gost\vendor\plantuml.jar" (
+ echo Предупреждение: plantuml.jar нет — в exe диаграммы пойдут через kroki.io.
+)
+
+echo [3/4] PyInstaller (один файл, без консоли; CLI подцепит консоль сам^) ...
+python -m PyInstaller --noconfirm --clean md2gost.spec
+if errorlevel 1 (
+ echo PyInstaller завершился с ошибкой.
+ goto :fail
+)
+
+if not exist "dist\md2gost.exe" (
+ echo dist\md2gost.exe не появился.
+ goto :fail
+)
+
+echo.
+echo [4/4] Готово:
+echo %CD%\dist\md2gost.exe
+echo.
+echo Двойной клик — GUI. Из консоли: md2gost.exe report.md -o report.docx
+echo.
+
+if /i "%~1"=="nopause" goto :eof
+pause
+exit /b 0
+
+:fail
+echo.
+echo Сборка не удалась.
+if /i not "%~1"=="nopause" pause
+exit /b 1
diff --git a/build-fast/md2gost.fast/PYZ-00.pyz b/build-fast/md2gost.fast/PYZ-00.pyz
new file mode 100644
index 0000000..dc72f82
Binary files /dev/null and b/build-fast/md2gost.fast/PYZ-00.pyz differ
diff --git a/build-fast/md2gost.fast/base_library.zip b/build-fast/md2gost.fast/base_library.zip
new file mode 100644
index 0000000..66b48d6
Binary files /dev/null and b/build-fast/md2gost.fast/base_library.zip differ
diff --git a/build-fast/md2gost.fast/md2gost.pkg b/build-fast/md2gost.fast/md2gost.pkg
new file mode 100644
index 0000000..efb989f
Binary files /dev/null and b/build-fast/md2gost.fast/md2gost.pkg differ
diff --git a/build-fast/md2gost.fast/warn-md2gost.fast.txt b/build-fast/md2gost.fast/warn-md2gost.fast.txt
new file mode 100644
index 0000000..8b3e5f6
--- /dev/null
+++ b/build-fast/md2gost.fast/warn-md2gost.fast.txt
@@ -0,0 +1,221 @@
+
+This file lists modules PyInstaller was not able to find. This does not
+necessarily mean this module is required for running your program. Python and
+Python 3rd-party packages include a lot of conditional or optional modules. For
+example the module 'ntpath' only exists on Windows, whereas the module
+'posixpath' only exists on Posix systems.
+
+Types if import:
+* top-level: imported at the top-level - look at these first
+* conditional: imported within an if-statement
+* delayed: imported within a function
+* optional: imported within a try-except-statement
+
+IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
+ tracking down the missing module yourself. Thanks!
+
+missing module named 'org.python' - imported by copy (optional), xml.sax (delayed, conditional)
+missing module named grp - imported by shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional), backports.tarfile (optional), distutils.archive_util (optional), setuptools._distutils.archive_util (optional)
+missing module named pwd - imported by posixpath (delayed, conditional), shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional), getpass (delayed), distutils.util (delayed, conditional, optional), netrc (delayed, conditional), backports.tarfile (optional), distutils.archive_util (optional), http.server (delayed, optional), webbrowser (delayed), psutil (optional), setuptools._distutils.util (delayed, conditional, optional), setuptools._distutils.archive_util (optional)
+missing module named urllib.urlopen - imported by urllib (delayed, optional), lxml.html (delayed, optional)
+missing module named urllib.urlencode - imported by urllib (delayed, optional), lxml.html (delayed, optional)
+missing module named pep517 - imported by importlib.metadata (delayed)
+missing module named posix - imported by shutil (conditional), importlib._bootstrap_external (conditional), os (conditional, optional)
+missing module named resource - imported by posix (top-level)
+missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
+excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level)
+missing module named org - imported by pickle (optional)
+missing module named pyimod02_importers - imported by C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgutil.py (delayed), C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgres.py (delayed)
+missing module named _posixsubprocess - imported by subprocess (optional), multiprocessing.util (delayed)
+missing module named fcntl - imported by subprocess (optional), psutil._compat (delayed, optional), xmlrpc.server (optional)
+missing module named _manylinux - imported by packaging._manylinux (delayed, optional), setuptools._vendor.packaging._manylinux (delayed, optional)
+missing module named _posixshmem - imported by multiprocessing.resource_tracker (conditional), multiprocessing.shared_memory (conditional)
+missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
+missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
+missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level)
+missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
+missing module named termios - imported by getpass (optional), tty (top-level), psutil._compat (delayed, optional)
+missing module named _scproxy - imported by urllib.request (conditional)
+missing module named 'java.lang' - imported by platform (delayed, optional), xml.sax._exceptions (conditional)
+missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
+missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
+missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
+missing module named annotationlib - imported by typing_extensions (conditional)
+missing module named '_typeshed.importlib' - imported by pkg_resources (conditional)
+missing module named _typeshed - imported by pkg_resources (conditional), setuptools.glob (conditional), wheel.wheelfile (conditional), setuptools.compat.py311 (conditional), requests.cookies (conditional), setuptools._distutils.dist (conditional)
+missing module named jnius - imported by platformdirs.android (delayed, conditional, optional)
+missing module named android - imported by platformdirs.android (delayed, conditional, optional)
+missing module named 'distutils._modified' - imported by setuptools._distutils.file_util (delayed)
+missing module named 'distutils._log' - imported by setuptools._distutils.command.bdist_dumb (top-level), setuptools._distutils.command.bdist_rpm (top-level), setuptools._distutils.command.build_clib (top-level), setuptools._distutils.command.build_ext (top-level), setuptools._distutils.command.build_py (top-level), setuptools._distutils.command.build_scripts (top-level), setuptools._distutils.command.clean (top-level), setuptools._distutils.command.config (top-level), setuptools._distutils.command.install (top-level), setuptools._distutils.command.install_scripts (top-level), setuptools._distutils.command.sdist (top-level)
+missing module named usercustomize - imported by site (delayed, optional)
+missing module named sitecustomize - imported by site (delayed, optional)
+missing module named startup - imported by pyreadline3.keysyms.common (conditional), pyreadline3.keysyms.keysyms (conditional)
+missing module named sets - imported by pyreadline3.keysyms.common (optional), pytz.tzinfo (optional)
+missing module named System - imported by pyreadline3.clipboard.ironpython_clipboard (top-level), pyreadline3.keysyms.ironpython_keysyms (top-level), pyreadline3.console.ironpython_console (top-level), pyreadline3.rlmain (conditional)
+missing module named console - imported by pyreadline3.console.ansi (conditional)
+missing module named collections.Callable - imported by collections (optional), cffi.api (optional), socks (optional), bs4.element (optional), bs4.builder._lxml (optional)
+missing module named _dummy_thread - imported by cffi.lock (conditional, optional), numpy.core.arrayprint (optional)
+missing module named dummy_thread - imported by cffi.lock (conditional, optional)
+missing module named thread - imported by cffi.lock (conditional, optional), cffi.cparser (conditional, optional)
+missing module named cStringIO - imported by cffi.ffiplatform (optional)
+missing module named cPickle - imported by pycparser.ply.yacc (delayed, optional)
+missing module named cffi._pycparser - imported by cffi (optional), cffi.cparser (optional)
+missing module named IronPythonConsole - imported by pyreadline3.console.ironpython_console (top-level)
+missing module named tomllib - imported by setuptools.compat.py310 (conditional)
+missing module named 'typing.io' - imported by importlib.resources (top-level)
+missing module named vms_lib - imported by platform (delayed, optional)
+missing module named java - imported by platform (delayed)
+missing module named _winreg - imported by platform (delayed, optional), pygments.formatters.img (optional)
+missing module named pickle5 - imported by numpy.compat.py3k (optional)
+missing module named numpy.eye - imported by numpy (delayed), numpy.core.numeric (delayed)
+missing module named numpy.core.integer - imported by numpy.core (top-level), numpy.fft.helper (top-level)
+missing module named numpy.core.conjugate - imported by numpy.core (top-level), numpy.fft._pocketfft (top-level)
+missing module named numpy.core.ufunc - imported by numpy.core (top-level), numpy.lib.utils (top-level)
+missing module named numpy.core.ones - imported by numpy.core (top-level), numpy.lib.polynomial (top-level)
+missing module named numpy.core.hstack - imported by numpy.core (top-level), numpy.lib.polynomial (top-level)
+missing module named numpy.core.atleast_1d - imported by numpy.core (top-level), numpy.lib.polynomial (top-level)
+missing module named numpy.core.atleast_3d - imported by numpy.core (top-level), numpy.lib.shape_base (top-level)
+missing module named numpy.core.vstack - imported by numpy.core (top-level), numpy.lib.shape_base (top-level)
+missing module named numpy.core.linspace - imported by numpy.core (top-level), numpy.lib.index_tricks (top-level)
+missing module named numpy.core.transpose - imported by numpy.core (top-level), numpy.lib.function_base (top-level)
+missing module named numpy.core.result_type - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
+missing module named numpy.core.float_ - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
+missing module named numpy.core.number - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
+missing module named numpy.core.max - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
+missing module named numpy.core.bool_ - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
+missing module named numpy.core.inf - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
+missing module named numpy.core.array2string - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
+missing module named numpy.core.signbit - imported by numpy.core (delayed), numpy.testing._private.utils (delayed)
+missing module named numpy.core.isscalar - imported by numpy.core (delayed), numpy.testing._private.utils (delayed), numpy.lib.polynomial (top-level)
+missing module named numpy.core.isnat - imported by numpy.core (top-level), numpy.testing._private.utils (top-level)
+missing module named numpy.core.ndarray - imported by numpy.core (top-level), numpy.testing._private.utils (top-level), numpy.lib.utils (top-level)
+missing module named numpy.core.array_repr - imported by numpy.core (top-level), numpy.testing._private.utils (top-level)
+missing module named numpy.core.arange - imported by numpy.core (top-level), numpy.testing._private.utils (top-level), numpy.fft.helper (top-level)
+missing module named numpy.core.float32 - imported by numpy.core (top-level), numpy.testing._private.utils (top-level)
+missing module named numpy.core.iinfo - imported by numpy.core (top-level), numpy.lib.twodim_base (top-level)
+missing module named numpy.core.reciprocal - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.sort - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.argsort - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.sign - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.isnan - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (delayed)
+missing module named numpy.core.count_nonzero - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.divide - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.swapaxes - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.fft._pocketfft (top-level)
+missing module named numpy.core.matmul - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.object_ - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (delayed)
+missing module named numpy.core.asanyarray - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.intp - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (top-level)
+missing module named numpy.core.atleast_2d - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.prod - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.amax - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.amin - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.moveaxis - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.geterrobj - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.errstate - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (delayed)
+missing module named numpy.core.finfo - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.lib.polynomial (top-level)
+missing module named numpy.core.isfinite - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.sum - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.sqrt - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.fft._pocketfft (top-level)
+missing module named numpy.core.multiply - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.add - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.dot - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.lib.polynomial (top-level)
+missing module named numpy.core.Inf - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.all - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (delayed)
+missing module named numpy.core.newaxis - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.complexfloating - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.inexact - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.cdouble - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.csingle - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.double - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.single - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.intc - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.empty_like - imported by numpy.core (top-level), numpy.linalg.linalg (top-level)
+missing module named numpy.core.empty - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (top-level), numpy.fft.helper (top-level)
+missing module named numpy.core.zeros - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.fft._pocketfft (top-level)
+missing module named numpy.core.asarray - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.lib.utils (top-level), numpy.fft._pocketfft (top-level), numpy.fft.helper (top-level)
+missing module named numpy.core.array - imported by numpy.core (top-level), numpy.linalg.linalg (top-level), numpy.testing._private.utils (top-level), numpy.lib.polynomial (top-level)
+missing module named numpy.array - imported by numpy (top-level), numpy.ma.core (top-level), numpy.ma.extras (top-level), numpy.ma.mrecords (top-level)
+missing module named numpy.dtype - imported by numpy (top-level), numpy._typing._array_like (top-level), numpy.array_api._typing (top-level), numpy.ma.mrecords (top-level), numpy.ctypeslib (top-level)
+missing module named numpy.bool_ - imported by numpy (top-level), numpy._typing._array_like (top-level), numpy.ma.core (top-level), numpy.ma.mrecords (top-level)
+missing module named numpy.recarray - imported by numpy (top-level), numpy.lib.recfunctions (top-level), numpy.ma.mrecords (top-level)
+missing module named numpy.ndarray - imported by numpy (top-level), numpy._typing._array_like (top-level), numpy.ma.core (top-level), numpy.ma.extras (top-level), numpy.lib.recfunctions (top-level), numpy.ma.mrecords (top-level), numpy.ctypeslib (top-level)
+missing module named pyodide_js - imported by threadpoolctl (delayed, optional)
+missing module named numpy._typing._ufunc - imported by numpy._typing (conditional)
+missing module named numpy.bytes_ - imported by numpy (top-level), numpy._typing._array_like (top-level)
+missing module named numpy.str_ - imported by numpy (top-level), numpy._typing._array_like (top-level)
+missing module named numpy.void - imported by numpy (top-level), numpy._typing._array_like (top-level)
+missing module named numpy.object_ - imported by numpy (top-level), numpy._typing._array_like (top-level)
+missing module named numpy.datetime64 - imported by numpy (top-level), numpy._typing._array_like (top-level)
+missing module named numpy.timedelta64 - imported by numpy (top-level), numpy._typing._array_like (top-level)
+missing module named numpy.number - imported by numpy (top-level), numpy._typing._array_like (top-level)
+missing module named numpy.complexfloating - imported by numpy (top-level), numpy._typing._array_like (top-level)
+missing module named numpy.floating - imported by numpy (top-level), numpy._typing._array_like (top-level)
+missing module named numpy.integer - imported by numpy (top-level), numpy._typing._array_like (top-level), numpy.ctypeslib (top-level)
+missing module named numpy.unsignedinteger - imported by numpy (top-level), numpy._typing._array_like (top-level)
+missing module named numpy.generic - imported by numpy (top-level), numpy._typing._array_like (top-level)
+missing module named numpy.histogramdd - imported by numpy (delayed), numpy.lib.twodim_base (delayed)
+missing module named numpy.lib.imag - imported by numpy.lib (delayed), numpy.testing._private.utils (delayed)
+missing module named numpy.lib.real - imported by numpy.lib (delayed), numpy.testing._private.utils (delayed)
+missing module named numpy.lib.iscomplexobj - imported by numpy.lib (delayed), numpy.testing._private.utils (delayed)
+missing module named numpy.ufunc - imported by numpy (top-level), numpy._typing (top-level), numpy.testing.overrides (top-level)
+missing module named dummy_threading - imported by psutil._compat (optional)
+missing module named numpy.isinf - imported by numpy (top-level), numpy.testing._private.utils (top-level)
+missing module named numpy.isnan - imported by numpy (top-level), numpy.testing._private.utils (top-level)
+missing module named numpy.isfinite - imported by numpy (top-level), numpy.testing._private.utils (top-level)
+missing module named numpy.float64 - imported by numpy (top-level), numpy.array_api._typing (top-level)
+missing module named numpy.float32 - imported by numpy (top-level), numpy.array_api._typing (top-level)
+missing module named numpy.uint64 - imported by numpy (top-level), numpy.array_api._typing (top-level)
+missing module named numpy.uint32 - imported by numpy (top-level), numpy.array_api._typing (top-level)
+missing module named numpy.uint16 - imported by numpy (top-level), numpy.array_api._typing (top-level)
+missing module named numpy.uint8 - imported by numpy (top-level), numpy.array_api._typing (top-level)
+missing module named numpy.int64 - imported by numpy (top-level), numpy.array_api._typing (top-level)
+missing module named numpy.int32 - imported by numpy (top-level), numpy.array_api._typing (top-level)
+missing module named numpy.int16 - imported by numpy (top-level), numpy.array_api._typing (top-level)
+missing module named numpy.int8 - imported by numpy (top-level), numpy.array_api._typing (top-level)
+missing module named numpy.expand_dims - imported by numpy (top-level), numpy.ma.core (top-level)
+missing module named numpy.iscomplexobj - imported by numpy (top-level), numpy.ma.core (top-level)
+missing module named numpy.amin - imported by numpy (top-level), numpy.ma.core (top-level)
+missing module named numpy.amax - imported by numpy (top-level), numpy.ma.core (top-level)
+missing module named six.moves.range - imported by six.moves (top-level), dateutil.rrule (top-level)
+runtime module named six.moves - imported by dateutil.tz.tz (top-level), dateutil.tz._factories (top-level), dateutil.tz.win (top-level), dateutil.rrule (top-level)
+missing module named StringIO - imported by docx.compat (conditional), six (conditional), urllib3.packages.six (conditional)
+missing module named dateutil.tz.tzfile - imported by dateutil.tz (top-level), dateutil.zoneinfo (top-level)
+excluded module named matplotlib.backends.backend_webagg - imported by matplotlib.backends (delayed, conditional), matplotlib.figure (delayed, conditional)
+missing module named railroad - imported by pyparsing.diagram (top-level)
+missing module named pyparsing.Word - imported by pyparsing (delayed), pyparsing.unicode (delayed)
+missing module named matplotlib.axes.Axes - imported by matplotlib.axes (delayed), matplotlib.legend (delayed), matplotlib.projections.geo (top-level), matplotlib.projections.polar (top-level), mpl_toolkits.mplot3d.axes3d (top-level), matplotlib.figure (top-level), matplotlib.pyplot (top-level)
+missing module named numpy._distributor_init_local - imported by numpy (optional), numpy._distributor_init (optional)
+missing module named gi - imported by matplotlib.cbook (delayed, conditional)
+missing module named setuptools_scm - imported by matplotlib (delayed, conditional)
+missing module named simplejson - imported by requests.compat (conditional, optional)
+missing module named brotlicffi - imported by urllib3.util.request (optional), urllib3.response (optional)
+missing module named Queue - imported by urllib3.util.queue (conditional)
+missing module named 'urllib3.packages.six.moves.urllib.parse' - imported by urllib3.request (top-level), urllib3.poolmanager (top-level)
+runtime module named urllib3.packages.six.moves - imported by http.client (top-level), urllib3.util.response (top-level), urllib3.connectionpool (top-level), urllib3.packages.six.moves.urllib (top-level), urllib3.util.queue (top-level)
+missing module named collections.MutableMapping - imported by collections (optional), urllib3._collections (optional)
+missing module named collections.Mapping - imported by collections (optional), urllib3._collections (optional), pytz.lazy (optional)
+missing module named win_inet_pton - imported by socks (conditional, optional)
+missing module named cryptography.x509.UnsupportedExtension - imported by cryptography.x509 (optional), urllib3.contrib.pyopenssl (optional)
+missing module named chardet - imported by requests (optional), pygments.lexer (delayed, conditional, optional), bs4.dammit (optional)
+missing module named urllib3_secure_extra - imported by urllib3 (optional)
+missing module named objprint - imported by marko.element (delayed, optional)
+missing module named collections.Sequence - imported by collections (conditional), docx.compat (conditional)
+missing module named UserDict - imported by pytz.lazy (optional)
+missing module named pygments.lexers.PrologLexer - imported by pygments.lexers (top-level), pygments.lexers.cplint (top-level)
+missing module named ctags - imported by pygments.formatters.html (optional)
+missing module named olefile - imported by PIL.FpxImagePlugin (top-level), PIL.MicImagePlugin (top-level)
+excluded module named PIL.ImageQt - imported by PIL (delayed), PIL.Image (delayed)
+missing module named xmlrpclib - imported by defusedxml.xmlrpc (conditional)
+missing module named htmlentitydefs - imported by lxml.html.soupparser (optional)
+missing module named BeautifulSoup - imported by lxml.html.soupparser (optional)
+missing module named cchardet - imported by bs4.dammit (optional)
+missing module named bs4.builder.HTMLParserTreeBuilder - imported by bs4.builder (top-level), bs4 (top-level)
+missing module named 'html5lib.treebuilders' - imported by bs4.builder._html5lib (optional), lxml.html._html5builder (top-level), lxml.html.html5parser (top-level)
+missing module named 'html5lib.constants' - imported by bs4.builder._html5lib (top-level)
+missing module named html5lib - imported by bs4.builder._html5lib (top-level), lxml.html.html5parser (top-level)
+missing module named urlparse - imported by lxml.ElementInclude (optional), lxml.html.html5parser (optional)
+missing module named urllib2 - imported by lxml.ElementInclude (optional), lxml.html.html5parser (optional)
+missing module named lxml_html_clean - imported by lxml.html.clean (optional)
+missing module named cssselect - imported by lxml.cssselect (optional)
+missing module named 'win32com.gen_py' - imported by win32com (conditional, optional)
+missing module named tkinterdnd2 - imported by md2gost.dnd (delayed, optional), md2gost.gui (delayed, optional)
diff --git a/build-fast/md2gost.fast/xref-md2gost.fast.html b/build-fast/md2gost.fast/xref-md2gost.fast.html
new file mode 100644
index 0000000..070803b
--- /dev/null
+++ b/build-fast/md2gost.fast/xref-md2gost.fast.html
@@ -0,0 +1,57478 @@
+
+
+
+
+ modulegraph cross reference for md2gost_exe.py, pyi_rth__tkinter.py, pyi_rth_cryptography_openssl.py, pyi_rth_inspect.py, pyi_rth_mplbackend.py, pyi_rth_mplconfig.py, pyi_rth_multiprocessing.py, pyi_rth_pkgres.py, pyi_rth_pkgutil.py, pyi_rth_pythoncom.py, pyi_rth_pywintypes.py, pyi_rth_setuptools.py
+
+
+
+ modulegraph cross reference for md2gost_exe.py, pyi_rth__tkinter.py, pyi_rth_cryptography_openssl.py, pyi_rth_inspect.py, pyi_rth_mplbackend.py, pyi_rth_mplconfig.py, pyi_rth_multiprocessing.py, pyi_rth_pkgres.py, pyi_rth_pkgutil.py, pyi_rth_pythoncom.py, pyi_rth_pywintypes.py, pyi_rth_setuptools.py
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
PIL._imaging C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\PIL\_imaging.cp310-win_amd64.pyd
+
+
+
+
+
+
+
PIL._imagingcms C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\PIL\_imagingcms.cp310-win_amd64.pyd
+
+
+
+
+
+
+
PIL._imagingft C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\PIL\_imagingft.cp310-win_amd64.pyd
+
+
+
+
+
+
+
PIL._imagingmath C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\PIL\_imagingmath.cp310-win_amd64.pyd
+
+
+
+
+
+
+
PIL._imagingtk C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\PIL\_imagingtk.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
PIL._webp C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\PIL\_webp.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
Queue
+
MissingModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
_abc (builtin module)
+
+
+
+
+
+
+
+
_ast (builtin module)
+
+
+
+
+
+
_asyncio C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\DLLs\_asyncio.pyd
+
+
+
+
+
+
_bisect (builtin module)
+
+
+
+
+
+
_blake2 (builtin module)
+
+
+
+
+
+
+
+
_brotli C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\_brotli.cp310-win_amd64.pyd
+
+
+
+
+
+
_bz2 C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\DLLs\_bz2.pyd
+
+
+
+
+
+
_cffi_backend C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\_cffi_backend.cp310-win_amd64.pyd
+
+
+
+
+
+
_codecs (builtin module)
+
+
+
+
+
+
_codecs_cn (builtin module)
+
+
+
+
+
+
_codecs_hk (builtin module)
+
+
+
+
+
+
_codecs_iso2022 (builtin module)
+
+
+
+
+
+
_codecs_jp (builtin module)
+
+
+
+
+
+
_codecs_kr (builtin module)
+
+
+
+
+
+
_codecs_tw (builtin module)
+
+
+
+
+
+
_collections (builtin module)
+
+
+
+
+
+
+
+
+
+
+
+
_contextvars (builtin module)
+
+
+
+
+
+
_csv (builtin module)
+
+
+
+
+
+
_ctypes C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\DLLs\_ctypes.pyd
+
+
+
+
+
+
_datetime (builtin module)
+
+
+
+
+
+
+
_decimal C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\DLLs\_decimal.pyd
+
+
+
+
+
+
+
+
+
+
+
+
_elementtree C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\DLLs\_elementtree.pyd
+
+
+
+
+
+
+
+
+
+
+
_functools (builtin module)
+
+
+
+
+
+
_hashlib C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\DLLs\_hashlib.pyd
+
+
+
+
+
+
_heapq (builtin module)
+imported by:
+
heapq
+
+
+
+
+
+
+
+
_imp (builtin module)
+
+
+
+
+
+
_io (builtin module)
+
+
+
+
+
+
_json (builtin module)
+
+
+
+
+
+
+
_locale (builtin module)
+
+
+
+
+
+
_lzma C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\DLLs\_lzma.pyd
+
+
+
+
+
+
+
+
+
+
_md5 (builtin module)
+
+
+
+
+
+
_multibytecodec (builtin module)
+
+
+
+
+
+
_multiprocessing C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\DLLs\_multiprocessing.pyd
+
+
+
+
+
+
_opcode (builtin module)
+
+
+
+
+
+
_operator (builtin module)
+
+
+
+
+
+
+
+
_overlapped C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\DLLs\_overlapped.pyd
+
+
+
+
+
+
_pickle (builtin module)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
_queue C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\DLLs\_queue.pyd
+imported by:
+
queue
+
+
+
+
+
+
+
+
_random (builtin module)
+
+
+
+
+
+
+
+
_sha1 (builtin module)
+
+
+
+
+
+
_sha256 (builtin module)
+
+
+
+
+
+
_sha3 (builtin module)
+
+
+
+
+
+
_sha512 (builtin module)
+
+
+
+
+
+
_signal (builtin module)
+
+
+
+
+
+
+
+
_socket C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\DLLs\_socket.pyd
+
+
+
+
+
+
_sre (builtin module)
+
+
+
+
+
+
+
_ssl C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\DLLs\_ssl.pyd
+
+
+
+
+
+
+
_stat (builtin module)
+
+
+
+
+
+
_statistics (builtin module)
+
+
+
+
+
+
_string (builtin module)
+
+
+
+
+
+
+
+
_struct (builtin module)
+
+
+
+
+
+
_thread (builtin module)
+
+
+
+
+
+
+
+
_tkinter C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\DLLs\_tkinter.pyd
+
+
+
+
+
+
_tracemalloc (builtin module)
+
+
+
+
+
+
+
+
_uuid C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\DLLs\_uuid.pyd
+
+
+
+
+
+
_warnings (builtin module)
+
+
+
+
+
+
_weakref (builtin module)
+
+
+
+
+
+
+
+
_win32sysloader C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\win32\_win32sysloader.pyd
+
+
+
+
+
+
_winapi (builtin module)
+
+
+
+
+
+
+
+
_zoneinfo C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\DLLs\_zoneinfo.pyd
+
+
+
+
+
+
abc
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
array (builtin module)
+
+
+
+
+
+
ast
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
atexit (builtin module)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
base64
+
SourceModule
+
+
+
+
+
+
+
+
+
bcrypt._bcrypt C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\bcrypt\_bcrypt.pyd
+
+
+
+
+
+
+
bdb
+
SourceModule
+
+
+
+
+
+
+
binascii (builtin module)
+
+
+
+
+
+
bisect
+
SourceModule
+
+
+
+
+
+
+
brotli
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
builtins (builtin module)
+
+
+
+
+
+
bz2
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
cgi
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
charset_normalizer.md C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\charset_normalizer\md.cp310-win_amd64.pyd
+
+
+
+
+
+
+
charset_normalizer.md__mypyc C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\charset_normalizer\md__mypyc.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
clr
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
cmd
+
SourceModule
+
+
+
+
+
+
+
code
+
SourceModule
+
+
+
+
+
+
+
codecs
+
SourceModule
+
+
+
+
+
+
+
codeop
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
contourpy._contourpy C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\contourpy\_contourpy.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
copy
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
cryptography.hazmat.bindings._rust C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\cryptography\hazmat\bindings\_rust.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
csv
+
SourceModule
+
+
+
+
+
+
+
ctags
+
MissingModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
dis
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
enum
+
SourceModule
+
+
+
+
+
+
+
errno (builtin module)
+
+
+
+
+
+
fcntl
+
MissingModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ftplib
+
SourceModule
+
+
+
+
+
+
+
+
+
gc (builtin module)
+
+
+
+
+
+
+
+
+
getopt
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
gi
+
MissingModule
+
+
+
+
+
+
glob
+
SourceModule
+
+
+
+
+
+
+
grp
+
MissingModule
+
+
+
+
+
+
gzip
+
SourceModule
+
+
+
+
+
+
+
+
+
heapq
+
SourceModule
+
+
+
+
+
+
+
hmac
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
imp
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
io
+
SourceModule
+
+
+
+
+
+
+
+
+
itertools (builtin module)
+
+
+
+
+
+
jaraco
+
NamespacePackage
+
+
+
+
+
+
+
+
+
+
+
+
java
+
MissingModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
jnius
+
MissingModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
kiwisolver._cext C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\kiwisolver\_cext.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
locale
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
lxml._elementpath C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\lxml\_elementpath.cp310-win_amd64.pyd
+
+
+
+
+
+
+
lxml.builder C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\lxml\builder.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
lxml.etree C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\lxml\etree.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
lxml.html.diff C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\lxml\html\diff.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
lxml.objectify C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\lxml\objectify.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
lxml.sax C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\lxml\sax.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
lzma
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
markupsafe._speedups C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\markupsafe\_speedups.cp310-win_amd64.pyd
+
+
+
+
+
+
+
marshal (builtin module)
+
+
+
+
+
+
math (builtin module)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
matplotlib._c_internal_utils C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\matplotlib\_c_internal_utils.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
matplotlib._image C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\matplotlib\_image.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
matplotlib._path C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\matplotlib\_path.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
matplotlib._qhull C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\matplotlib\_qhull.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
matplotlib._tri C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\matplotlib\_tri.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
matplotlib.backends._backend_agg C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\matplotlib\backends\_backend_agg.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
matplotlib.ft2font C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\matplotlib\ft2font.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
mmap (builtin module)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
msvcrt (builtin module)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
netrc
+
SourceModule
+
+
+
+
+
+
+
nt (builtin module)
+
+
+
+
+
+
ntpath
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
numpy.core._multiarray_tests C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\core\_multiarray_tests.cp310-win_amd64.pyd
+
+imported by:
+
numpy
+
+
+
+
+
+
+
+
numpy.core._multiarray_umath C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\core\_multiarray_umath.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
numpy.fft._pocketfft_internal C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\fft\_pocketfft_internal.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
numpy.linalg._umath_linalg C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\linalg\_umath_linalg.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
numpy.random._bounded_integers C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\random\_bounded_integers.cp310-win_amd64.pyd
+
+
+
+
+
+
+
numpy.random._common C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\random\_common.cp310-win_amd64.pyd
+
+
+
+
+
+
+
numpy.random._generator C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\random\_generator.cp310-win_amd64.pyd
+
+
+
+
+
+
+
numpy.random._mt19937 C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\random\_mt19937.cp310-win_amd64.pyd
+
+
+
+
+
+
+
numpy.random._pcg64 C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\random\_pcg64.cp310-win_amd64.pyd
+
+
+
+
+
+
+
numpy.random._philox C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\random\_philox.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
numpy.random._sfc64 C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\random\_sfc64.cp310-win_amd64.pyd
+
+
+
+
+
+
+
numpy.random.bit_generator C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\random\bit_generator.cp310-win_amd64.pyd
+
+
+
+
+
+
+
numpy.random.mtrand C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\random\mtrand.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
opcode
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
org
+
MissingModule
+
+
+
+
+
+
os
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
pdb
+
SourceModule
+
+
+
+
+
+
+
+
+
pickle
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
posix
+
MissingModule
+
+
+
+
+
+
+
+
+
pprint
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
psutil._psutil_windows C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\psutil\_psutil_windows.pyd
+
+
+
+
+
+
+
+
+
pwd
+
MissingModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
pydoc
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
pyexpat C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\DLLs\pyexpat.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
queue
+
SourceModule
+
+
+
+
+
+
+
quopri
+
SourceModule
+
+
+
+
+
+
+
+
+
random
+
SourceModule
+
+
+
+
+
+
+
re
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
runpy
+
SourceModule
+
+
+
+
+
+
+
+
+
select C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\DLLs\select.pyd
+
+
+
+
+
+
+
+
sets
+
MissingModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
shlex
+
SourceModule
+
+
+
+
+
+
+
shutil
+
SourceModule
+
+
+
+
+
+
+
signal
+
SourceModule
+
+
+
+
+
+
+
+
+
site
+
SourceModule
+
+
+
+
+
+
+
+
+
six
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
socket
+
SourceModule
+
+
+
+
+
+
+
+
+
socks
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ssl
+
SourceModule
+
+
+
+
+
+
+
+
+
stat
+
SourceModule
+
+
+
+
+
+
+
+
+
string
+
SourceModule
+
+
+
+
+
+
+
+
+
struct
+
SourceModule
+
+
+
+
+
+
+
+
+
sys (builtin module)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
time (builtin module)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
token
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
tty
+
SourceModule
+
+imported by:
+
pydoc
+
+
+
+
+
+
+
+
types
+
SourceModule
+
+
+
+
+
+
+
typing
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
unicodedata C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\DLLs\unicodedata.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
uu
+
SourceModule
+
+
+
+
+
+
+
uuid
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
win32api C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\win32\win32api.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
win32evtlog C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\win32\win32evtlog.pyd
+
+
+
+
+
+
+
+
win32pdh C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\win32\win32pdh.pyd
+
+
+
+
+
+
win32trace C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\win32\win32trace.pyd
+
+
+
+
+
+
+
+
win32ui C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\Pythonwin\win32ui.pyd
+
+
+
+
+
+
+
+
+
+
winreg (builtin module)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
yaml._yaml C:\Users\hlebushek\AppData\Local\Programs\Python\Python310\lib\site-packages\yaml\_yaml.cp310-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
zlib (builtin module)
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/md2gost.fast.spec b/md2gost.fast.spec
new file mode 100644
index 0000000..bb63df0
--- /dev/null
+++ b/md2gost.fast.spec
@@ -0,0 +1,162 @@
+# -*- mode: python ; coding: utf-8 -*-
+"""Faster onefile freeze: same portable exe (fonts + plantuml.jar + onefile).
+
+Keeps matplotlib (system font lookup) and bundles plantuml.jar.
+Speeds Analysis by pinning the Agg backend, skipping duplicate pygments
+collection (the stock hook already pulls all lexers), and not probing Qt/Gtk.
+"""
+import os
+from pathlib import Path
+
+from PyInstaller.utils.hooks import (
+ collect_data_files,
+ collect_dynamic_libs,
+ collect_submodules,
+)
+
+# Isolated matplotlib hook subprocesses inherit this and skip GUI backend probes.
+os.environ["MPLBACKEND"] = "Agg"
+
+ROOT = Path(SPECPATH).resolve()
+
+datas = [
+ (str(ROOT / "md2gost" / "Template.docx"), "md2gost"),
+ (str(ROOT / "md2gost" / "mml2omml"), "md2gost"),
+ (str(ROOT / "md2gost" / "diagrams"), "md2gost/diagrams"),
+ (str(ROOT / "prompts"), "prompts"),
+]
+_plantuml = ROOT / "md2gost" / "vendor" / "plantuml.jar"
+if not _plantuml.is_file():
+ raise SystemExit(
+ "md2gost.fast.spec: нет md2gost/vendor/plantuml.jar — "
+ "сначала scripts/fetch_plantuml.py (jar обязателен в portable exe)"
+ )
+datas.append((str(_plantuml), "md2gost/vendor"))
+
+binaries = []
+hiddenimports = collect_submodules("md2gost")
+
+datas += collect_data_files("certifi")
+datas += collect_data_files("lxml")
+datas += collect_data_files("latex2mathml")
+datas += collect_data_files("docx")
+# Explicit mpl-data so DejaVu + matplotlib font cache files are always in the exe.
+# hook-matplotlib.py also collects this; PyInstaller dedupes by dest path.
+datas += collect_data_files("matplotlib", includes=["mpl-data/**"])
+
+for pkg in ("lxml", "freetype"):
+ try:
+ binaries += collect_dynamic_libs(pkg)
+ except Exception:
+ pass
+
+hiddenimports += [
+ "lxml",
+ "lxml.etree",
+ "lxml._elementpath",
+ "PIL",
+ "PIL.Image",
+ "PIL.PngImagePlugin",
+ "pygments",
+ "pygments.lexers",
+ "pygments.formatters",
+ "freetype",
+ "docx",
+ "docxcompose",
+ "docxcompose.composer",
+ "marko",
+ "marko.ext.gfm",
+ "latex2mathml",
+ "latex2mathml.converter",
+ "requests",
+ "certifi",
+ "matplotlib",
+ "matplotlib.font_manager",
+ "matplotlib.ft2font",
+ "tkinter",
+ "tkinter.filedialog",
+ "tkinter.messagebox",
+ "tkinter.ttk",
+]
+# Do NOT collect_submodules("pygments.lexers") here — hook-pygments.py already
+# collects all lexers/formatters/styles once during Analysis.
+try:
+ hiddenimports += collect_submodules("tkinterdnd2")
+except Exception:
+ pass
+
+excludes = [
+ "pytest",
+ "PyQt5",
+ "PyQt6",
+ "PySide2",
+ "PySide6",
+ "IPython",
+ "jupyter",
+ "notebook",
+ "zmq",
+ "scipy",
+ "pandas",
+ "tornado",
+ "numpy.tests",
+ "matplotlib.tests",
+ "matplotlib.testing",
+ "matplotlib.backends.qt_compat",
+ "matplotlib.backends.backend_qtagg",
+ "matplotlib.backends.backend_qtcairo",
+ "matplotlib.backends.backend_qt5agg",
+ "matplotlib.backends.backend_qt5cairo",
+ "matplotlib.backends.backend_qt5",
+ "matplotlib.backends.backend_qt",
+ "matplotlib.backends.backend_gtk3",
+ "matplotlib.backends.backend_gtk3agg",
+ "matplotlib.backends.backend_gtk3cairo",
+ "matplotlib.backends.backend_gtk4",
+ "matplotlib.backends.backend_gtk4agg",
+ "matplotlib.backends.backend_gtk4cairo",
+ "matplotlib.backends.backend_macosx",
+ "matplotlib.backends.backend_tkagg",
+ "matplotlib.backends.backend_tkcairo",
+ "matplotlib.backends.backend_wx",
+ "matplotlib.backends.backend_wxagg",
+ "matplotlib.backends.backend_wxcairo",
+ "matplotlib.backends.backend_nbagg",
+ "matplotlib.backends.backend_webagg",
+ "PIL.ImageQt",
+]
+
+a = Analysis(
+ [str(ROOT / "scripts" / "md2gost_exe.py")],
+ pathex=[str(ROOT)],
+ binaries=binaries,
+ datas=datas,
+ hiddenimports=hiddenimports,
+ hookspath=[],
+ hooksconfig={
+ "matplotlib": {"backends": "Agg"},
+ },
+ runtime_hooks=[str(ROOT / "scripts" / "pyi_rth_mplbackend.py")],
+ excludes=excludes,
+ noarchive=False,
+)
+
+pyz = PYZ(a.pure)
+
+exe = EXE(
+ pyz,
+ a.scripts,
+ a.binaries,
+ a.datas,
+ [],
+ name="md2gost",
+ debug=False,
+ bootloader_ignore_signals=False,
+ strip=False,
+ upx=False,
+ console=False,
+ disable_windowed_traceback=False,
+ argv_emulation=False,
+ target_arch=None,
+ codesign_identity=None,
+ entitlements_file=None,
+)
diff --git a/md2gost.spec b/md2gost.spec
new file mode 100644
index 0000000..a0f0d27
--- /dev/null
+++ b/md2gost.spec
@@ -0,0 +1,123 @@
+# -*- mode: python ; coding: utf-8 -*-
+from pathlib import Path
+
+from PyInstaller.utils.hooks import (
+ collect_data_files,
+ collect_dynamic_libs,
+ collect_submodules,
+)
+
+ROOT = Path(SPECPATH).resolve()
+
+datas = [
+ (str(ROOT / "md2gost" / "Template.docx"), "md2gost"),
+ (str(ROOT / "md2gost" / "mml2omml"), "md2gost"),
+ (str(ROOT / "md2gost" / "diagrams"), "md2gost/diagrams"),
+ (str(ROOT / "prompts"), "prompts"),
+]
+_plantuml = ROOT / "md2gost" / "vendor" / "plantuml.jar"
+if _plantuml.is_file():
+ datas.append((str(_plantuml), "md2gost/vendor"))
+binaries = []
+hiddenimports = collect_submodules("md2gost")
+
+datas += collect_data_files("certifi")
+datas += collect_data_files("lxml")
+datas += collect_data_files("latex2mathml")
+datas += collect_data_files("docx")
+datas += collect_data_files("matplotlib", includes=["mpl-data/**"])
+
+for pkg in ("lxml", "freetype"):
+ try:
+ binaries += collect_dynamic_libs(pkg)
+ except Exception:
+ pass
+
+hiddenimports += [
+ "lxml",
+ "lxml.etree",
+ "lxml._elementpath",
+ "PIL",
+ "PIL.Image",
+ "PIL.PngImagePlugin",
+ "pygments",
+ "pygments.lexers",
+ "pygments.formatters",
+ "freetype",
+ "docx",
+ "docxcompose",
+ "docxcompose.composer",
+ "marko",
+ "marko.ext.gfm",
+ "latex2mathml",
+ "latex2mathml.converter",
+ "requests",
+ "certifi",
+ "matplotlib",
+ "matplotlib.font_manager",
+ "matplotlib.ft2font",
+ "tkinter",
+ "tkinter.filedialog",
+ "tkinter.messagebox",
+ "tkinter.ttk",
+]
+hiddenimports += collect_submodules("pygments.lexers")
+hiddenimports += collect_submodules("marko")
+try:
+ hiddenimports += collect_submodules("tkinterdnd2")
+except Exception:
+ pass
+
+excludes = [
+ "pytest",
+ "PyQt5",
+ "PyQt6",
+ "PySide2",
+ "PySide6",
+ "IPython",
+ "jupyter",
+ "notebook",
+ "zmq",
+ "matplotlib.backends.qt_compat",
+ "matplotlib.backends.backend_qtagg",
+ "matplotlib.backends.backend_qt5agg",
+ "matplotlib.backends.backend_qt5",
+ "matplotlib.backends.backend_qt",
+ "matplotlib.backends.backend_gtk3",
+ "matplotlib.backends.backend_gtk4",
+ "matplotlib.backends.backend_macosx",
+]
+
+a = Analysis(
+ [str(ROOT / "scripts" / "md2gost_exe.py")],
+ pathex=[str(ROOT)],
+ binaries=binaries,
+ datas=datas,
+ hiddenimports=hiddenimports,
+ hookspath=[],
+ hooksconfig={},
+ runtime_hooks=[],
+ excludes=excludes,
+ noarchive=False,
+)
+
+pyz = PYZ(a.pure)
+
+exe = EXE(
+ pyz,
+ a.scripts,
+ a.binaries,
+ a.datas,
+ [],
+ name="md2gost",
+ debug=False,
+ bootloader_ignore_signals=False,
+ strip=False,
+ upx=False,
+ console=False,
+ disable_windowed_traceback=False,
+ argv_emulation=False,
+ target_arch=None,
+ codesign_identity=None,
+ entitlements_file=None,
+)
diff --git a/md2gost/README.docx b/md2gost/README.docx
new file mode 100644
index 0000000..31b298a
Binary files /dev/null and b/md2gost/README.docx differ
diff --git a/md2gost/README.md b/md2gost/README.md
index e68d764..0a65e18 100644
--- a/md2gost/README.md
+++ b/md2gost/README.md
@@ -10,6 +10,32 @@ poetry install
pip install -e .
```
+## GUI
+
+Без файла или с `--gui` открывается окно: перетащите `.md`, выберите параметры, нажмите «Конвертировать». CLI при этом тот же (`python -m md2gost файл.md …`).
+
+```bash
+python -m md2gost
+python -m md2gost --gui
+python -m md2gost --gui report.md --type PIS_custom
+md2gost-gui
+```
+
+На Windows файл можно бросить из Проводника в верхнюю область окна. Клик по области — выбор через диалог. Все флаги CLI есть в форме (тип, нумерация, TOC, тире, `---` → разрыв страницы, титул/задание, диаграммы, проверка ТЗ).
+
+Вкладки **Инструкция** и **Промпт для ИИ** — справка и копирование системного промпта (МИРЭА / ПИС) в буфер.
+
+### Сборка exe (Windows)
+
+Двойной клик по `build-exe.bat` в корне репозитория (нужен Python 3.10+ в PATH). Результат: `dist\md2gost.exe`.
+
+```bat
+build-exe.bat
+build-exe.bat nopause
+```
+
+Двойной клик по exe — GUI. CLI: `md2gost.exe report.md -o report.docx --type coursework`.
+
## CLI
```bash
@@ -31,7 +57,7 @@ python -m md2gost report.md -o report.docx --type PIS_custom --check
# Титул: «Отчёт по практическим работам …» — отдельный DOCX:
python -m md2gost report.md -o report.docx --type PIS_custom --title title.docx
# Курсовая АПИД (источники 7–20, проверка пунктов 2.1–2.4):
-python -m md2gost report.md -o report.docx --type APID_coursework --check --no-emdash-to-hyphen --title title.docx --assignment assignment.docx
+python -m md2gost report.md -o report.docx --type APID_coursework --check --title title.docx --assignment assignment.docx
```
Пример: [`examples/pis_custom.md`](../examples/pis_custom.md).
@@ -57,8 +83,12 @@ python -m md2gost report.md -o report.docx --toc manual
### Тире (`--emdash-to-hyphen` / `--no-emdash-to-hyphen`)
-По умолчанию типографское «—» заменяется на «-» (в тексте и подписях).
-Оставить длинное тире по ГОСТ: `--no-emdash-to-hyphen`.
+По умолчанию типографское «—» **сохраняется** (как в методичке: тире с пробелами, дефис в диапазонах).
+Заменить «—» на «-»: `--emdash-to-hyphen`.
+
+### Разрыв страницы (`---` / `--hr-pagebreak`)
+
+Строка `---` (также `***`, `___`) на отдельной строке по умолчанию **игнорируется**. Разрыв страницы: `--hr-pagebreak` или галочка в GUI.
## Синтаксис (кратко)
@@ -70,9 +100,10 @@ python -m md2gost report.md -o report.docx --toc manual
| Таблица | `%id Подпись` перед таблицей + `@Таблица:id` |
| Склеивание ячеек | `^` — rowspan (ячейка сверху), `>` — colspan (ячейка слева) |
| Листинг | `%id Подпись` перед code fence |
-| Диаграмма UML/BPMN/C4 | `%id Подпись` + ````uml` / ````bpmn` / ````c4` → PNG (Рисунок); `+listing` — ещё и Листинг |
+| Диаграмма UML / Mermaid / схемы | `%id Подпись` + ````uml` / ````uml-c4` / ````bpmn` / ````mermaid` → Рисунок; `+listing` — ещё и Листинг. Схемы в `md2gost.schemes.json`. IDEF0 нет |
| Формула | `%eq1` + `$$…$$` + `@Формула:eq1` (номер только при ссылке) |
| Источник | `[1]` в тексте; `[1]: …` в списке |
+| Разрыв страницы | `---` на отдельной строке + `--hr-pagebreak` (по умолчанию `---` игнорируется) |
### Таблицы со склеиванием
@@ -98,22 +129,44 @@ python -m md2gost report.md -o report.docx --toc manual
Разные шапки «первый раз / продолжение» есть в LaTeX (`longtable`), не в Office.
Наша оценка высоты строк ≠ вёрстка Word → если резать таблицу в скрипте, получается
-mid-page «Продолжение…» (как было на 2.4). Поэтому по умолчанию таблицу **не режем**.
+mid-page «Продолжение…» (как было на 2.4). По умолчанию режим **`word`**: после save
+Word COM режет по реальной пагинации. Без Word — укажите `off` или поставьте Word + pywin32.
| Режим | Поведение |
|--------|-----------|
-| **`off`** / **`soft`** (по умолчанию) | Одна таблица Word; перенос строк делает Word. Без автоподписи. Первая строка — повторяющаяся шапка (`tblHeader`). «Продолжение…» — вручную в markdown, если нужно |
+| **`word`** (по умолчанию) | Как `off` при рендере; после save Word COM: `Split` + «Продолжение Таблицы N». Нужны Windows, Word, pywin32. Шапка на продолжении не повторяется (вкл: `--table-repeat-header`) |
+| **`off`** / **`soft`** | Одна таблица Word; перенос строк делает Word. Без автоподписи. Первая строка — повторяющаяся шапка (`tblHeader`). «Продолжение…» — вручную в markdown, если нужно |
| **`legacy`** | Режем по нашей оценке высоты + «Продолжение…» с `page_break_before` (могут быть дыры) |
| **`caption`** | Режем по оценке + явный PageBreak + «Продолжение…» (то же ограничение точности) |
```bash
+python -m md2gost report.md -o report.docx --table-continuation word
python -m md2gost report.md -o report.docx --table-continuation off
python -m md2gost report.md -o report.docx --table-continuation caption
```
+### Продолжение листинга (`--listing-continuation`)
+
+Те же режимы, что у таблиц. По умолчанию **`word`**.
+
+| Режим | Поведение |
+|--------|-----------|
+| **`word`** (по умолчанию) | После save Word COM + «Продолжение Листинга N» (Windows + Word + pywin32) |
+| **`off`** / **`soft`** | Один блок кода; пагинацию делает Word. «Продолжение…» — вручную в markdown, если нужно |
+| **`legacy`** | Режем по оценке высоты + «Продолжение Листинга N» с `page_break_before` |
+| **`caption`** | Режем по оценке + явный PageBreak + «Продолжение Листинга N» |
+
+```bash
+python -m md2gost report.md -o report.docx --listing-continuation word
+python -m md2gost report.md -o report.docx --listing-continuation off
+python -m md2gost report.md -o report.docx --listing-continuation caption
+```
+
### Диаграммы
-```markdown
+В отчёте пишите так (пример в 4 обратных кавычках, чтобы вложенный ` ```uml ` не ломал разметку):
+
+````markdown
%usecase1 Диаграмма прецедентов +listing
```uml
@@ -122,19 +175,86 @@ actor Student
Student --> (Login)
@enduml
```
+````
+
+Широкая схема на альбомной странице — флаг `+landscape` в той же строке `%`:
+
+%arch1 Архитектура +landscape
+
+```uml-c4
+Person(user, "Студент")
+System(app, "Портал")
```
-Рендер (по приоритету):
+````markdown
+%arch1 Архитектура +landscape
-1. `PLANTUML_JAR` / `--plantuml-jar` + Java → `plantuml.jar`
-2. `KROKI_URL` / `--kroki-url` (по умолчанию `http://localhost:8000`)
-3. remote `https://kroki.io` при `--diagram-fallback remote` (по умолчанию; предупреждение в лог)
+```uml-c4
+Person(user, "Студент")
+System(app, "Портал")
+```
+````
-Кэш PNG: `{каталог_md}/.md2gost-cache/`.
+Схемы (`c4`, `usecase`, свои): при первом запуске рядом с приложением создаётся `md2gost.schemes.json`. В markdown — оградка `uml-` или короткое ``:
+````markdown
+%arch C4
+
+```uml-c4
+Person(user, "Студент")
+System(app, "Портал")
+Rel(user, app, "логин")
+```
+````
+
+URL в `includes` схемы скачиваются в кэш (`md2gost.include-cache.json` + папка `include-cache/`). CLI: `--schemes path.json`. **BPMN 2.0** — оградка ````bpmn` / ````uml-bpmn` (макросы `Start`, `UserTask`, `XOR`, `Flow`, `Pool`…; библиотека `diagrams/BPMN.puml`). **Mermaid** — ````mermaid` / ````mmd` через тот же Kroki (свой `--kroki-url` или kroki.io); jar не используется. **IDEF0** конвертер не рисует — вставляйте готовый PNG.
+
+```bpmn
+StartMessage(s, "заявка")
+UserTask(t, "Проверить")
+XOR(gw, "ок?")
+End(e_ok)
+End(e_no)
+Flow(s, t)
+Flow(t, gw)
+CondFlow(gw, e_ok, "да")
+DefaultFlow(gw, e_no)
+```
+````markdown
+%bpmn1 Процесс заявки
+
+```bpmn
+StartMessage(s, "заявка")
+UserTask(t, "Проверить")
+XOR(gw, "ок?")
+End(e_ok)
+End(e_no)
+Flow(s, t)
+Flow(t, gw)
+CondFlow(gw, e_ok, "да")
+DefaultFlow(gw, e_no)
+```
+````
+
+Обычному пользователю jar/Kroki указывать не нужно. Порядок для UML:
+
+1. Вшитый / скачанный `plantuml.jar` + Java (exe кладёт jar внутрь; иначе качаем в `%LOCALAPPDATA%\md2gost\`)
+2. Локальный Kroki (`KROKI_URL` / `--kroki-url`, по умолчанию `http://localhost:8000`)
+3. Интернет `https://kroki.io` при `--diagram-fallback remote` (по умолчанию)
+
+Mermaid всегда идёт через Kroki (шаги 2–3).
+
+Формат в Word: `--diagram-format png` (по умолчанию; PlantUML рендерится с `--diagram-scale`, по умолчанию 2 — только качество, размер на странице как при 1) или `svg` — вектор через `svgBlip` + PNG-запасной (Word 2016+; LibreOffice покажет растр).
+
+Широкие схемы/таблицы: в подписи флаг `+landscape` — отдельная альбомная A4-страница, затем снова книжная.
+
+Свой jar — только если нужен другой файл: `--plantuml-jar` или поле на вкладке «Диаграммы».
+
+Кэш: `{каталог_md}/.md2gost-cache/` (`*.png`, при svg ещё `*.svg`).
```bash
-python -m md2gost report.md -o report.docx --plantuml-jar C:\tools\plantuml.jar
+python scripts/fetch_plantuml.py
python -m md2gost report.md -o report.docx --diagram-fallback local
+python -m md2gost report.md -o report.docx --diagram-format svg
```
Подробности и ИИ-промпт: [`prompts/`](../prompts/).
@@ -144,3 +264,5 @@ PDF через LaTeX (XeLaTeX, шаблон МИРЭА): [`md2latex/README.md`](
## Проверки
`--check` печатает замечания по структуре, «рис.», ссылкам во введении, числу/возрасту источников, приложениям и т.д. `--strict` завершает процесс с кодом 1 при ошибках.
+
+`--check-pages` — пост-проверка полупустых страниц **через Microsoft Word** (Windows + Word + `pip install pywin32`). Все находки помечены как эвристика и **могут быть ложными**; не влияют на `--strict`. Можно вызвать для готового файла: `python -m md2gost report.docx --check-pages`. Макрос Word: [`scripts/check_page_fill.bas`](../scripts/check_page_fill.bas).
diff --git a/md2gost/__init__.py b/md2gost/__init__.py
index a7f8ba6..527c287 100644
--- a/md2gost/__init__.py
+++ b/md2gost/__init__.py
@@ -1,8 +1,17 @@
"""md2gost — Markdown → DOCX (MIREA TZ / GOST)."""
import os
+import sys
def package_dir() -> str:
"""Directory of the md2gost package (Template.docx, mml2omml, etc.)."""
+ if getattr(sys, "frozen", False):
+ meipass = getattr(sys, "_MEIPASS", None)
+ if meipass:
+ bundled = os.path.join(meipass, "md2gost")
+ if os.path.isfile(os.path.join(bundled, "Template.docx")):
+ return bundled
+ if os.path.isfile(os.path.join(meipass, "Template.docx")):
+ return meipass
return os.path.dirname(os.path.abspath(__file__))
diff --git a/md2gost/__main__.py b/md2gost/__main__.py
index 7db591b..bb1d358 100644
--- a/md2gost/__main__.py
+++ b/md2gost/__main__.py
@@ -1,41 +1,44 @@
#!/usr/bin/env python
from argparse import ArgumentParser, BooleanOptionalAction
-import os
-import os.path
import sys
-from getpass import getuser
-from docx import Document
-
-from .converter import Converter
+from .pipeline import ConvertRequest, convert, should_launch_gui
from .profiles import (
+ DEFAULT_HEADING_NUMBERING,
+ DEFAULT_TABLE_CONTINUATION,
+ DEFAULT_LISTING_CONTINUATION,
+ DEFAULT_TOC_MODE,
DOC_TYPES,
HEADING_NUMBERING_MODES,
- DEFAULT_HEADING_NUMBERING,
- TOC_MODES,
- DEFAULT_TOC_MODE,
TABLE_CONTINUATION_MODES,
- DEFAULT_TABLE_CONTINUATION,
- get_profile,
+ LISTING_CONTINUATION_MODES,
+ TOC_MODES,
)
-from .checker import check_markdown, format_report
-def main():
+def build_parser() -> ArgumentParser:
parser = ArgumentParser(
prog="md2gost",
description=(
"Генерация DOCX-отчётов из Markdown по ТЗ МИРЭА / ГОСТ. "
"Типы: coursework/practice/vkr, APID_coursework, PIS_custom. "
+ "Без файла или с --gui открывается окно. "
"FODT: python -m md2fodt …"
),
)
- parser.add_argument("filename", help="Путь до исходного markdown файла")
+ parser.add_argument(
+ "filename", nargs="?",
+ help="Путь до .md (или .docx с --check-pages). Без файла открывается GUI",
+ )
+ parser.add_argument(
+ "--gui", action="store_true",
+ help="Открыть графический интерфейс (можно сразу передать .md)",
+ )
parser.add_argument("-o", "--output", help="Путь до сгенерированного .docx")
parser.add_argument("-t", "--template", help="Путь до шаблона .docx")
parser.add_argument(
- "--type", dest="doc_type", choices=DOC_TYPES, default="coursework",
- help="Тип: coursework | practice | vkr | PIS_custom | APID_coursework",
+ "--type", dest="doc_type", choices=DOC_TYPES, default="practice",
+ help="Тип: practice | coursework | vkr | PIS_custom | APID_coursework (по умолчанию practice)",
)
parser.add_argument(
"--heading-numbering",
@@ -64,19 +67,53 @@ def main():
default=DEFAULT_TABLE_CONTINUATION,
help=(
"Таблицы длиннее страницы: "
- "off/soft — одна таблица, пагинация Word, без авто«Продолжение» (по умолчанию); "
+ "word — после сохранения Word COM режет по реальной пагинации + «Продолжение…» "
+ "(по умолчанию; нужны Windows, Word, pywin32); "
+ "off/soft — одна таблица, пагинация Word, без авто«Продолжение»; "
"legacy/caption — режем по оценке высоты и вставляем «Продолжение…» "
"(оценка ≠ Word, возможны артефакты). "
f"По умолчанию: {DEFAULT_TABLE_CONTINUATION}."
),
)
+ parser.add_argument(
+ "--listing-continuation",
+ choices=LISTING_CONTINUATION_MODES,
+ default=DEFAULT_LISTING_CONTINUATION,
+ help=(
+ "Листинги длиннее страницы: "
+ "word — после сохранения Word COM + «Продолжение Листинга…» "
+ "(по умолчанию; нужны Windows, Word, pywin32); "
+ "off/soft — один блок, пагинация Word, без авто«Продолжение»; "
+ "legacy/caption — режем по оценке высоты и вставляем «Продолжение Листинга…» "
+ "(оценка ≠ Word, возможны артефакты). "
+ f"По умолчанию: {DEFAULT_LISTING_CONTINUATION}."
+ ),
+ )
+ parser.add_argument(
+ "--table-repeat-header",
+ action=BooleanOptionalAction,
+ default=False,
+ help=(
+ "При --table-continuation word: повторять шапку таблицы на каждом фрагменте "
+ "после разрыва. По умолчанию выкл."
+ ),
+ )
parser.add_argument(
"--emdash-to-hyphen",
action=BooleanOptionalAction,
- default=True,
+ default=False,
help=(
"Автозамена типографского тире «—» на дефис «-» в тексте и подписях. "
- "Включено по умолчанию; отключить: --no-emdash-to-hyphen."
+ "По умолчанию выключено (тире «—» по методичке); включить: --emdash-to-hyphen."
+ ),
+ )
+ parser.add_argument(
+ "--hr-pagebreak",
+ action=BooleanOptionalAction,
+ default=False,
+ help=(
+ "Строка «---» / «***» / «___» — разрыв страницы Word. "
+ "По умолчанию такие строки игнорируются; включить: --hr-pagebreak."
),
)
parser.add_argument("--title", help="DOCX титульного листа (вставляется перед телом)")
@@ -85,6 +122,15 @@ def main():
action="store_true")
parser.add_argument("--check-only", help="Только проверка, без генерации документа",
action="store_true")
+ parser.add_argument(
+ "--check-pages",
+ help=(
+ "После конвертации (или для готового .docx) проверить полупустые страницы "
+ "через Microsoft Word. Эвристика — возможны ложные срабатывания. "
+ "Нужны Windows, Word и pywin32."
+ ),
+ action="store_true",
+ )
parser.add_argument("--strict", help="Код выхода 1 при ошибках проверки",
action="store_true")
parser.add_argument("--syntax-highlighting", help="Подсветка синтаксиса в листингах",
@@ -103,108 +149,104 @@ def main():
default="remote",
help="Если локальный рендер UML недоступен: remote (kroki.io), local (ошибка), off",
)
+ parser.add_argument(
+ "--diagram-format",
+ choices=["png", "svg"],
+ default="png",
+ help="Формат схем в Word: png (по умолчанию) или svg (вектор + PNG-запасной, Word 2016+)",
+ )
+ parser.add_argument(
+ "--diagram-scale",
+ type=float,
+ default=2.0,
+ help="Масштаб рендера PlantUML PNG (качество); размер на странице как при 1. По умолчанию 2",
+ )
+ parser.add_argument(
+ "--schemes",
+ dest="schemes_path",
+ help="Путь к md2gost.schemes.json (иначе рядом с приложением / с .md)",
+ )
parser.add_argument("--debug", help="Добавляет отладочные данные в документ",
action="store_true")
+ return parser
- args = parser.parse_args()
- filename, output, template, debug = \
- args.filename, args.output, args.template, args.debug
- if args.syntax_highlighting:
- os.environ["SYNTAX_HIGHLIGHTING"] = "1"
- from .diagram_renderer import configure_diagrams
- configure_diagrams(
- plantuml_jar=args.plantuml_jar,
- kroki_url=args.kroki_url,
- fallback=args.diagram_fallback,
- )
-
- if not filename.endswith(".md"):
- print("Error: filename must have md format")
- exit(1)
-
- os.environ["WORKING_DIR"] = os.path.dirname(os.path.abspath(filename)) or "."
-
- with open(filename, encoding="utf-8") as f:
- md_text = f.read()
-
- if args.check or args.check_only:
- issues = check_markdown(md_text, args.doc_type)
- print(format_report(issues))
- errors = [i for i in issues if i.severity == "error"]
- if args.strict and errors:
- sys.exit(1)
- if args.check_only:
- sys.exit(0 if not errors else (1 if args.strict else 0))
-
- if not output:
- output = os.path.basename(filename).replace(".md", ".docx")
- elif not output.endswith(".docx"):
- print("Error: output file must have docx format")
- exit(1)
-
- if not template:
- from . import package_dir
- template = os.path.join(package_dir(), "Template.docx")
-
- converter = Converter(
- filename, output, template, debug,
+def request_from_args(args) -> ConvertRequest:
+ return ConvertRequest(
+ filename=args.filename or "",
+ output=args.output,
+ template=args.template,
doc_type=args.doc_type,
heading_numbering=args.heading_numbering,
- emdash_to_hyphen=args.emdash_to_hyphen,
toc_mode=args.toc,
table_continuation=args.table_continuation,
+ listing_continuation=args.listing_continuation,
+ table_repeat_header=bool(getattr(args, "table_repeat_header", False)),
+ emdash_to_hyphen=args.emdash_to_hyphen,
+ hr_pagebreak=args.hr_pagebreak,
+ title=args.title,
+ assignment=args.assignment,
+ check=args.check,
+ check_only=args.check_only,
+ check_pages=bool(getattr(args, "check_pages", False)),
+ strict=args.strict,
+ syntax_highlighting=bool(args.syntax_highlighting),
+ plantuml_jar=args.plantuml_jar,
+ kroki_url=args.kroki_url,
+ diagram_fallback=args.diagram_fallback,
+ diagram_format=args.diagram_format,
+ diagram_scale=float(args.diagram_scale),
+ schemes_path=args.schemes_path,
+ debug=args.debug,
+ open_when_done=bool(args.debug),
)
- converter.convert()
- document = converter.document
- # Front matter is appended *into* a shell that already has coursework styles.
- # Never use title.docx as compose base: python-docx default template has
- # Calibri + accent-blue headings and would override ГОСТ стили.
- if args.title or args.assignment:
+def _argv_needs_console(argv: list[str]) -> bool:
+ """Frozen windowed exe: attach a console for CLI / --help, not for GUI."""
+ args = argv[1:]
+ if not args:
+ return False
+ if "-h" in args or "--help" in args:
+ return True
+ if "--gui" in args:
+ return False
+ return any(not a.startswith("-") for a in args)
+
+
+def _enable_windows_console() -> None:
+ if sys.platform != "win32" or not getattr(sys, "frozen", False):
+ return
+ try:
+ import ctypes
+ kernel32 = ctypes.windll.kernel32
+ if not kernel32.AttachConsole(0xFFFFFFFF):
+ if not kernel32.GetConsoleWindow():
+ kernel32.AllocConsole()
+ sys.stdout = open("CONOUT$", "w", encoding="utf-8", errors="replace")
+ sys.stderr = open("CONOUT$", "w", encoding="utf-8", errors="replace")
try:
- from docxcompose.composer import Composer
- except ImportError:
- print("Error: docxcompose required for --title/--assignment")
- sys.exit(3)
- from .styles import apply_document_styles
+ sys.stdin = open("CONIN$", "r", encoding="utf-8", errors="replace")
+ except OSError:
+ pass
+ except Exception:
+ pass
- shell = Document(template)
- apply_document_styles(shell, get_profile(args.doc_type).style_preset)
- body = shell.element.body
- for child in list(body):
- if not child.tag.endswith("}sectPr"):
- body.remove(child)
- composer = Composer(shell)
- if args.title:
- composer.append(Document(args.title))
- shell.add_page_break()
- if args.assignment:
- composer.append(Document(args.assignment))
- shell.add_page_break()
- composer.append(document)
- document = composer.doc
- apply_document_styles(document, get_profile(args.doc_type).style_preset)
+def main():
+ if _argv_needs_console(sys.argv):
+ _enable_windows_console()
+ parser = build_parser()
+ args = parser.parse_args()
+ req = request_from_args(args)
- document.core_properties.author = getuser()
- document.core_properties.comments = \
- "Создано при помощи md2gost (ТЗ МИРЭА)"
+ if should_launch_gui(args.filename, args.gui):
+ from .gui import run_gui
+ run_gui(req)
+ return
- document.save(output)
- print(f"Generated document: {os.path.abspath(output)}")
-
- if debug:
- import platform
- if platform.system() == 'Darwin':
- import subprocess
- subprocess.call(('open', output))
- elif platform.system() == 'Windows':
- os.startfile(output)
- else:
- import subprocess
- subprocess.call(('xdg-open', output))
+ result = convert(req)
+ sys.exit(result.exit_code)
if __name__ == "__main__":
diff --git a/md2gost/checker/__init__.py b/md2gost/checker/__init__.py
index e1b80b3..ce2ea11 100644
--- a/md2gost/checker/__init__.py
+++ b/md2gost/checker/__init__.py
@@ -258,12 +258,36 @@ def check_bibliography(text: str, profile: DocProfile) -> list[Issue]:
n = len(entries)
if profile.sectional_biblio:
- # Count per ## section roughly
- if n < profile.min_sources:
+ # Count per ## section inside bibliography
+ sections: list[tuple[str, int]] = []
+ current_title: str | None = None
+ current_count = 0
+ for line in block.splitlines():
+ hm = re.match(r"^#{2,6}\s+(\*?)(.+)$", line)
+ if hm:
+ if current_title is not None:
+ sections.append((current_title, current_count))
+ current_title = hm.group(2).strip()
+ current_count = 0
+ continue
+ if BIBLIO_LINE_RE.match(line.strip()):
+ current_count += 1
+ if current_title is not None:
+ sections.append((current_title, current_count))
+
+ if sections:
+ for title, cnt in sections:
+ if cnt < profile.min_sources:
+ issues.append(Issue(
+ "biblio.count", "warning",
+ f"ВКР: в разделе списка «{title}» желательно ≥{profile.min_sources} "
+ f"источников (сейчас {cnt})",
+ ))
+ elif n < profile.min_sources:
issues.append(Issue(
"biblio.count", "warning",
- f"ВКР: в каждом разделе списка желательно ≥{profile.min_sources} источников "
- f"(сейчас всего {n})",
+ f"ВКР: список должен делиться на разделы; в каждом ≥{profile.min_sources} "
+ f"источников (сейчас всего {n}, разделов нет)",
))
else:
if n < profile.min_sources:
@@ -288,13 +312,10 @@ def check_bibliography(text: str, profile: DocProfile) -> list[Issue]:
))
# Citation order vs first appearance
- # Exclude intro/conclusion from citation scan for order
body_for_cites = text
cites = find_citations(body_for_cites)
- # Filter cites that appear only in intro/conclusion — still listed
keys = [e[0] for e in entries]
if cites and keys:
- # First N unique cites should match order of keys for simple lists
if not profile.sectional_biblio:
expected = cites[:len(keys)]
if keys != expected and set(keys) == set(expected):
@@ -313,16 +334,15 @@ def check_bibliography(text: str, profile: DocProfile) -> list[Issue]:
def check_object_refs(text: str) -> list[Issue]:
issues = []
- # Captions / images
labels = set(re.findall(r"^%(\w+)", text, re.M))
- # image titles with %id
labels.update(re.findall(r'!\[[^\]]*\]\([^)]*%(\w+)', text))
refs = set(re.findall(r"@[\wА-Яа-я]+:(\w+)", text))
for lab in labels:
- # At least one @?:lab or word reference — soft check
- if lab not in refs and f"@{lab}" not in text:
- # only warn if label looks intentional
- pass
+ if lab not in refs:
+ issues.append(Issue(
+ "ref.unused", "warning",
+ f"Метка «{lab}» объявлена, но в тексте нет ссылки @…:{lab}",
+ ))
for ref in refs:
if ref not in labels:
issues.append(Issue(
@@ -342,6 +362,66 @@ def check_appendices(text: str) -> list[Issue]:
f"Буква «{letter}» не используется для обозначения приложений",
_line_of(text, m.start()),
))
+
+ # Multiple lettered appendices should have a list after # *ПРИЛОЖЕНИЯ
+ apps = list(re.finditer(
+ r"^#{1,6}\s+\*?Приложение\s+[А-ЯA-ZЁ]\b",
+ text, re.M | re.I,
+ ))
+ # Filter out the section header «ПРИЛОЖЕНИЯ» / bare «ПРИЛОЖЕНИЕ»
+ lettered = []
+ for m in apps:
+ line = m.group(0)
+ if re.search(r"(?i)приложение\s+[А-ЯA-ZЁ]", line):
+ lettered.append(m)
+ if len(lettered) >= 2:
+ sec = re.search(
+ r"^#\s*\*?\s*ПРИЛОЖЕНИЯ?\s*$",
+ text, re.M | re.I,
+ )
+ if sec:
+ between = text[sec.end(): lettered[0].start()]
+ # Expect a plain-text list (not only blank / headings)
+ has_list = bool(re.search(r"(?im)^\s*[-–—*]|\bприложение\s+[А-ЯA-ZЁ]\b", between))
+ has_prose = bool(re.search(r"[А-Яа-яA-Za-z]{3,}", between))
+ if not (has_list or has_prose):
+ issues.append(Issue(
+ "appendix.toc", "warning",
+ "При нескольких приложениях после «ПРИЛОЖЕНИЯ» нужен перечень "
+ "(основной текст) с номерами и названиями",
+ _line_of(text, sec.start()),
+ ))
+ return issues
+
+
+def check_continuation_hints(
+ text: str,
+ *,
+ table_continuation: str = "off",
+ listing_continuation: str = "off",
+) -> list[Issue]:
+ """Warn that Word cannot auto-insert «Продолжение…» when mode is off/soft."""
+ issues: list[Issue] = []
+ soft = {"off", "soft"}
+ if table_continuation in soft and _TABLE_BLOCK_RE.search(text):
+ issues.append(Issue(
+ "table.continuation", "warning",
+ "Word сам не вставит «Продолжение Таблицы N» при переносе. "
+ "Варианты: --table-continuation word (точный разрыв через Word COM) "
+ "или caption (оценка высоты ≠ вёрстка Word, возможны артефакты).",
+ ))
+ # Long fenced code blocks (likely listings)
+ long_listing = False
+ for m in re.finditer(r"^```[^\n]*\n([\s\S]*?)^```", text, re.M):
+ if m.group(1).count("\n") >= 40:
+ long_listing = True
+ break
+ if listing_continuation in soft and long_listing:
+ issues.append(Issue(
+ "listing.continuation", "warning",
+ "Длинный листинг: Word сам не вставит «Продолжение Листинга N». "
+ "Варианты: --listing-continuation word или caption.",
+ ))
return issues
@@ -404,7 +484,13 @@ def check_table_merge(text: str) -> list[Issue]:
return issues
-def check_markdown(text: str, doc_type: str = "coursework") -> list[Issue]:
+def check_markdown(
+ text: str,
+ doc_type: str = "coursework",
+ *,
+ table_continuation: str = "off",
+ listing_continuation: str = "off",
+) -> list[Issue]:
profile = get_profile(doc_type)
issues: list[Issue] = []
issues.extend(check_structure(text, profile))
@@ -417,6 +503,11 @@ def check_markdown(text: str, doc_type: str = "coursework") -> list[Issue]:
issues.extend(check_object_refs(text))
issues.extend(check_appendices(text))
issues.extend(check_table_merge(text))
+ issues.extend(check_continuation_hints(
+ text,
+ table_continuation=table_continuation,
+ listing_continuation=listing_continuation,
+ ))
return issues
diff --git a/md2gost/converter.py b/md2gost/converter.py
index 17053ba..548eec1 100644
--- a/md2gost/converter.py
+++ b/md2gost/converter.py
@@ -15,7 +15,9 @@ from .profiles import (
DEFAULT_TOC_MODE,
TOC_MODES,
DEFAULT_TABLE_CONTINUATION,
+ DEFAULT_LISTING_CONTINUATION,
TABLE_CONTINUATION_MODES,
+ LISTING_CONTINUATION_MODES,
)
from .label_pass import (
assign_numbers,
@@ -26,6 +28,8 @@ from .label_pass import (
from .renderable.heading import Heading
from .renderable.toc import ToC
from .renderable.table import Table
+from .renderable.listing import Listing
+from .renderable.diagram import DiagramFigure
class Converter:
@@ -33,11 +37,13 @@ class Converter:
def __init__(self, input_path: str, output_path: str,
template_path: str = None, debug: bool = False,
- doc_type: str = "coursework",
+ doc_type: str = "practice",
heading_numbering: str = DEFAULT_HEADING_NUMBERING,
emdash_to_hyphen: bool = False,
toc_mode: str = DEFAULT_TOC_MODE,
- table_continuation: str = DEFAULT_TABLE_CONTINUATION):
+ table_continuation: str = DEFAULT_TABLE_CONTINUATION,
+ listing_continuation: str = DEFAULT_LISTING_CONTINUATION,
+ hr_pagebreak: bool = False):
if heading_numbering not in HEADING_NUMBERING_MODES:
raise ValueError(
f"heading_numbering must be one of {HEADING_NUMBERING_MODES}, "
@@ -52,12 +58,19 @@ class Converter:
f"table_continuation must be one of {TABLE_CONTINUATION_MODES}, "
f"got {table_continuation!r}"
)
+ if listing_continuation not in LISTING_CONTINUATION_MODES:
+ raise ValueError(
+ f"listing_continuation must be one of {LISTING_CONTINUATION_MODES}, "
+ f"got {listing_continuation!r}"
+ )
self._output_path = output_path
self._doc_type = doc_type
self._heading_numbering = heading_numbering
self._emdash_to_hyphen = emdash_to_hyphen
self._toc_mode = toc_mode
self._table_continuation = table_continuation
+ self._listing_continuation = listing_continuation
+ self._hr_pagebreak = hr_pagebreak
self._profile = get_profile(doc_type)
self._document: Document = docx.Document(template_path)
self._document._body.clear_content()
@@ -67,7 +80,7 @@ class Converter:
raw = f.read()
self._raw_markdown = raw
self._preprocessed = preprocess_markdown(raw, emdash_to_hyphen=emdash_to_hyphen)
- self.parser = Parser(self._document, self._preprocessed)
+ self.parser = Parser(self._document, self._preprocessed, hr_pagebreak=hr_pagebreak)
def convert(self):
renderables = list(self.parser.parse())
@@ -85,6 +98,10 @@ class Converter:
r.set_toc_mode(self._toc_mode)
elif isinstance(r, Table):
r.set_continuation_mode(self._table_continuation)
+ elif isinstance(r, Listing):
+ r.set_continuation_mode(self._listing_continuation)
+ elif isinstance(r, DiagramFigure) and r.listing:
+ r.listing.set_continuation_mode(self._listing_continuation)
formula_refs = find_formula_refs(self._raw_markdown)
registry = assign_numbers(
diff --git a/md2gost/diagram_includes.py b/md2gost/diagram_includes.py
new file mode 100644
index 0000000..7f44609
--- /dev/null
+++ b/md2gost/diagram_includes.py
@@ -0,0 +1,261 @@
+"""HTTP(S) include cache: index URL → local file, never overwrite existing cache files."""
+
+from __future__ import annotations
+
+import hashlib
+import json
+import logging
+import re
+import sys
+from pathlib import Path
+from urllib.parse import urlparse, urljoin
+
+import requests
+
+_log = logging.getLogger(__name__)
+
+INCLUDE_CACHE_INDEX = "md2gost.include-cache.json"
+INCLUDE_CACHE_DIR = "include-cache"
+MAX_INCLUDE_DEPTH = 8
+
+_HTTP_RE = re.compile(r"^https?://", re.I)
+_INCLUDE_LINE_RE = re.compile(
+ r"^[ \t]*!(?:includeurl|include)[ \t]+(?P[\"']?)(?P[[^\s\"']+)(?P=q)",
+ re.I | re.M,
+)
+
+
+def app_dir() -> Path:
+ """Directory next to the running application (exe or cwd for python -m)."""
+ if getattr(sys, "frozen", False):
+ return Path(sys.executable).resolve().parent
+ return Path.cwd()
+
+
+def include_cache_index_path(base: Path | None = None) -> Path:
+ return (base or app_dir()) / INCLUDE_CACHE_INDEX
+
+
+def include_cache_files_dir(base: Path | None = None) -> Path:
+ return (base or app_dir()) / INCLUDE_CACHE_DIR
+
+
+def is_http_url(value: str) -> bool:
+ return bool(_HTTP_RE.match((value or "").strip()))
+
+
+def _load_index(path: Path) -> dict[str, str]:
+ if not path.is_file():
+ return {}
+ try:
+ data = json.loads(path.read_text(encoding="utf-8"))
+ except (OSError, json.JSONDecodeError) as exc:
+ _log.warning("Не удалось прочитать индекс кэша includes: %s", exc)
+ return {}
+ if not isinstance(data, dict):
+ return {}
+ out: dict[str, str] = {}
+ for key, val in data.items():
+ if isinstance(key, str) and isinstance(val, str) and is_http_url(key):
+ out[key] = val
+ return out
+
+
+def _save_index(path: Path, index: dict[str, str]) -> None:
+ path.parent.mkdir(parents=True, exist_ok=True)
+ path.write_text(
+ json.dumps(index, ensure_ascii=False, indent=2) + "\n",
+ encoding="utf-8",
+ )
+
+
+def _unique_cache_path(url: str, files_dir: Path) -> Path:
+ """New file path for URL; never reuse/overwrite an existing cache file."""
+ files_dir.mkdir(parents=True, exist_ok=True)
+ parsed = urlparse(url)
+ base = Path(parsed.path).name or "include.puml"
+ if not base.lower().endswith((".puml", ".iuml", ".pu", ".txt")):
+ base = base + ".puml" if "." not in base else base
+ digest = hashlib.sha256(url.encode("utf-8")).hexdigest()[:10]
+ stem = Path(base).stem
+ suffix = Path(base).suffix or ".puml"
+ # sanitize stem
+ safe = re.sub(r"[^a-zA-Z0-9._-]+", "_", stem)[:40] or "include"
+ candidate = files_dir / f"{safe}_{digest}{suffix}"
+ if not candidate.exists():
+ return candidate
+ n = 1
+ while True:
+ alt = files_dir / f"{safe}_{digest}_{n}{suffix}"
+ if not alt.exists():
+ return alt
+ n += 1
+
+
+def _download(url: str, dest: Path) -> None:
+ dest.parent.mkdir(parents=True, exist_ok=True)
+ tmp = dest.with_suffix(dest.suffix + ".part")
+ try:
+ resp = requests.get(url, timeout=60)
+ resp.raise_for_status()
+ tmp.write_bytes(resp.content)
+ tmp.replace(dest)
+ except Exception:
+ tmp.unlink(missing_ok=True)
+ raise
+
+
+def resolve_url(
+ url: str,
+ *,
+ base: Path | None = None,
+ depth: int = 0,
+) -> Path:
+ """
+ Return local path for URL. Uses index if present and file exists;
+ otherwise downloads to a *new* file and records the mapping.
+ Never overwrites an existing cache file for a different URL.
+ """
+ url = url.strip()
+ if not is_http_url(url):
+ raise ValueError(f"Не URL: {url}")
+ if depth > MAX_INCLUDE_DEPTH:
+ raise RuntimeError(f"Слишком глубокая цепочка includes ({MAX_INCLUDE_DEPTH}): {url}")
+
+ root = base or app_dir()
+ index_path = include_cache_index_path(root)
+ files_dir = include_cache_files_dir(root)
+ index = _load_index(index_path)
+
+ cached = index.get(url)
+ if cached:
+ path = Path(cached)
+ if path.is_file():
+ _rewrite_nested_includes(path, parent_url=url, base=root, depth=depth)
+ return path
+ _log.warning("Файл кэша пропал (%s), скачаю заново: %s", path, url)
+
+ dest = _unique_cache_path(url, files_dir)
+ try:
+ _download(url, dest)
+ except Exception as exc:
+ raise RuntimeError(
+ f"Не удалось скачать include {url}: {exc}. "
+ "Нет сети и нет кэша — положите файл вручную или проверьте URL."
+ ) from exc
+
+ index[url] = str(dest.resolve())
+ _save_index(index_path, index)
+ _log.info("Include cached: %s → %s", url, dest)
+ _rewrite_nested_includes(dest, parent_url=url, base=root, depth=depth)
+ return dest
+
+
+def _absolute_include_url(ref: str, parent_url: str | None) -> str | None:
+ """Turn include ref into absolute http(s) URL, or None if local/stdlib."""
+ ref = ref.strip()
+ if is_http_url(ref):
+ return ref
+ if ref.startswith("<") and ref.endswith(">"):
+ return None # PlantUML stdlib
+ if parent_url and not Path(ref).is_absolute():
+ # relative to parent URL directory
+ return urljoin(parent_url, ref)
+ return None
+
+
+def _rewrite_nested_includes(
+ path: Path, *, parent_url: str, base: Path, depth: int,
+) -> None:
+ """Rewrite http(s) / relative !include inside a cached .puml to local paths."""
+ try:
+ text = path.read_text(encoding="utf-8")
+ except OSError:
+ return
+
+ changed = False
+
+ def repl(match: re.Match[str]) -> str:
+ nonlocal changed
+ ref = match.group("ref")
+ abs_url = _absolute_include_url(ref, parent_url)
+ if not abs_url:
+ return match.group(0)
+ local = resolve_url(abs_url, base=base, depth=depth + 1)
+ changed = True
+ local_s = str(local.resolve()).replace("\\", "/")
+ return f"!include {local_s}"
+
+ new_text = _INCLUDE_LINE_RE.sub(repl, text)
+ if changed and new_text != text:
+ path.write_text(new_text, encoding="utf-8")
+
+
+def resolve_include_ref(
+ ref: str,
+ *,
+ base: Path | None = None,
+ schemes_dir: Path | None = None,
+) -> str:
+ """
+ Resolve include entry to a local path string suitable for !include.
+ Local paths are resolved relative to schemes_dir / diagrams / cwd.
+ """
+ ref = (ref or "").strip()
+ if not ref:
+ raise ValueError("Пустой include")
+ if is_http_url(ref):
+ return str(resolve_url(ref, base=base).resolve()).replace("\\", "/")
+
+ path = Path(ref)
+ if path.is_file():
+ return str(path.resolve()).replace("\\", "/")
+ candidates: list[Path] = []
+ if schemes_dir:
+ candidates.append(schemes_dir / ref)
+ from . import package_dir
+ candidates.append(Path(package_dir()) / "diagrams" / ref)
+ candidates.append(Path.cwd() / ref)
+ for cand in candidates:
+ if cand.is_file():
+ return str(cand.resolve()).replace("\\", "/")
+ raise FileNotFoundError(f"Include не найден: {ref}")
+
+
+def rewrite_http_includes_in_source(source: str, *, base: Path | None = None) -> str:
+ """Replace http(s) !include / !includeurl in prepared source with cached local paths."""
+
+ def repl(match: re.Match[str]) -> str:
+ ref = match.group("ref")
+ if not is_http_url(ref):
+ return match.group(0)
+ local = str(resolve_url(ref, base=base).resolve()).replace("\\", "/")
+ return f"!include {local}"
+
+ return _INCLUDE_LINE_RE.sub(repl, source)
+
+
+def reset_include_cache(base: Path | None = None) -> int:
+ """
+ Delete index and only files listed in it. Returns number of files removed.
+ Other files in include-cache/ are left untouched.
+ """
+ root = base or app_dir()
+ index_path = include_cache_index_path(root)
+ index = _load_index(index_path)
+ removed = 0
+ for _url, path_s in list(index.items()):
+ path = Path(path_s)
+ try:
+ if path.is_file():
+ path.unlink()
+ removed += 1
+ except OSError as exc:
+ _log.warning("Не удалось удалить %s: %s", path, exc)
+ if index_path.is_file():
+ index_path.unlink(missing_ok=True)
+ return removed
+
+
+def cache_entry_count(base: Path | None = None) -> int:
+ return len(_load_index(include_cache_index_path(base or app_dir())))
diff --git a/md2gost/diagram_renderer.py b/md2gost/diagram_renderer.py
index 6c82140..1d9f811 100644
--- a/md2gost/diagram_renderer.py
+++ b/md2gost/diagram_renderer.py
@@ -1,12 +1,14 @@
-"""Render UML/BPMN/C4 fenced blocks to PNG (PlantUML jar / Kroki local / remote)."""
+"""Render UML / Mermaid / scheme fenced blocks to PNG (+ optional SVG)."""
from __future__ import annotations
import hashlib
import logging
import os
+import re
import shutil
import subprocess
+import sys
import tempfile
from dataclasses import dataclass
from pathlib import Path
@@ -15,13 +17,45 @@ from typing import Literal
import requests
from . import package_dir
+from .diagram_schemes import (
+ configure_schemes,
+ ensure_user_schemes,
+ is_diagram_lang,
+ prepare_with_schemes,
+)
-DIAGRAM_LANGS = frozenset({"uml", "plantuml", "bpmn", "c4"})
+# Back-compat: static set used by older tests; runtime uses is_diagram_lang().
+DIAGRAM_LANGS = frozenset(
+ {
+ "uml",
+ "plantuml",
+ "c4",
+ "c4context",
+ "c4component",
+ "usecase",
+ "bpmn",
+ "mermaid",
+ "mmd",
+ }
+)
FallbackMode = Literal["local", "remote", "off"]
+DiagramFormat = Literal["png", "svg"]
DEFAULT_KROKI_URL = "http://localhost:8000"
REMOTE_KROKI_URL = "https://kroki.io"
+# Sharper raster when Word shrinks the figure to page width (display size stays ×1).
+DEFAULT_DIAGRAM_SCALE = 2.0
+# Avoid PlantUML clipping large scaled diagrams (default limit is 4096).
+PLANTUML_LIMIT_SIZE = "8192"
+
+# Pinned official jar (GPL). Bundled at exe build; otherwise downloaded once to user cache.
+PLANTUML_VERSION = "1.2025.4"
+PLANTUML_JAR_URL = (
+ f"https://github.com/plantuml/plantuml/releases/download/"
+ f"v{PLANTUML_VERSION}/plantuml-{PLANTUML_VERSION}.jar"
+)
+
_log = logging.getLogger(__name__)
@@ -31,6 +65,17 @@ class DiagramConfig:
kroki_url: str | None = None
fallback: FallbackMode = "remote"
cache_dir: str | None = None
+ schemes_path: str | None = None
+ diagram_format: DiagramFormat = "png"
+ diagram_scale: float = DEFAULT_DIAGRAM_SCALE
+
+
+@dataclass
+class DiagramRenderResult:
+ png_path: str
+ svg_path: str | None = None
+ # PlantUML render scale; Image divides display size by this to keep ×1 layout.
+ pixel_scale: float = 1.0
_CONFIG = DiagramConfig()
@@ -41,13 +86,26 @@ def configure_diagrams(
kroki_url: str | None = None,
fallback: FallbackMode = "remote",
cache_dir: str | None = None,
+ schemes_path: str | None = None,
+ md_dir: str | None = None,
+ diagram_format: DiagramFormat = "png",
+ diagram_scale: float | None = None,
) -> None:
global _CONFIG
+ ensure_user_schemes()
+ configure_schemes(schemes_path=schemes_path, md_dir=md_dir)
+ fmt: DiagramFormat = "svg" if diagram_format == "svg" else "png"
+ scale = DEFAULT_DIAGRAM_SCALE if diagram_scale is None else float(diagram_scale)
+ if scale < 1:
+ scale = 1.0
_CONFIG = DiagramConfig(
- plantuml_jar=plantuml_jar or os.environ.get("PLANTUML_JAR"),
+ plantuml_jar=resolve_plantuml_jar(plantuml_jar or None, download=False),
kroki_url=kroki_url or os.environ.get("KROKI_URL"),
fallback=fallback,
cache_dir=cache_dir,
+ schemes_path=schemes_path,
+ diagram_format=fmt,
+ diagram_scale=scale,
)
@@ -57,65 +115,175 @@ def diagrams_dir() -> Path:
def prepare_source(lang: str, source: str) -> tuple[str, str]:
"""Return (prepared_source, kroki_diagram_type)."""
- lang = (lang or "uml").lower().strip()
- text = source.strip()
-
- if lang == "bpmn":
- if "@startbpmn" not in text.lower() and "\n"
- )
- body = text
- if body.lower().startswith("@startuml"):
- lines = body.splitlines()
- text = lines[0] + "\n" + includes + "\n".join(lines[1:])
- else:
- text = f"@startuml\n{includes}{body}\n@enduml"
- elif not text.lower().startswith("@start"):
- text = f"@startuml\n{text}\n@enduml"
- return text, "plantuml"
-
- # uml / plantuml
- if not text.lower().startswith("@start"):
- text = f"@startuml\n{text}\n@enduml"
- return text, "plantuml"
+ return prepare_with_schemes(lang, source)
-def _cache_path(source: str, cache_dir: str | None = None) -> Path:
+def _cache_root(cache_dir: str | None = None) -> Path:
root = cache_dir or _CONFIG.cache_dir
if not root:
wd = os.environ.get("WORKING_DIR", ".")
root = os.path.join(wd, ".md2gost-cache")
- Path(root).mkdir(parents=True, exist_ok=True)
- digest = hashlib.sha256(source.encode("utf-8")).hexdigest()[:24]
- return Path(root) / f"{digest}.png"
+ path = Path(root)
+ path.mkdir(parents=True, exist_ok=True)
+ return path
+
+
+def _cache_digest(source: str) -> str:
+ return hashlib.sha256(source.encode("utf-8")).hexdigest()[:24]
+
+
+def _cache_paths(source: str, cache_dir: str | None = None) -> tuple[Path, Path]:
+ root = _cache_root(cache_dir)
+ digest = _cache_digest(source)
+ return root / f"{digest}.png", root / f"{digest}.svg"
def _java_available() -> bool:
return shutil.which("java") is not None
-def _render_plantuml_jar(source: str, out_png: Path, jar: str) -> bool:
+def vendor_plantuml_path() -> Path:
+ return Path(package_dir()) / "vendor" / "plantuml.jar"
+
+
+def cached_plantuml_path() -> Path:
+ if os.name == "nt":
+ root = Path(os.environ.get("LOCALAPPDATA") or Path.home()) / "md2gost"
+ else:
+ root = Path.home() / ".md2gost"
+ return root / "plantuml.jar"
+
+
+def iter_plantuml_candidates(explicit: str | None = None) -> list[Path]:
+ paths: list[Path] = []
+ if explicit:
+ paths.append(Path(explicit))
+ env = os.environ.get("PLANTUML_JAR")
+ if env:
+ paths.append(Path(env))
+ paths.append(vendor_plantuml_path())
+ if getattr(sys, "frozen", False):
+ mei = getattr(sys, "_MEIPASS", None)
+ if mei:
+ paths.append(Path(mei) / "md2gost" / "vendor" / "plantuml.jar")
+ paths.append(Path(mei) / "vendor" / "plantuml.jar")
+ paths.append(Path(sys.executable).resolve().parent / "plantuml.jar")
+ paths.append(cached_plantuml_path())
+ seen: set[str] = set()
+ out: list[Path] = []
+ for path in paths:
+ key = str(path)
+ if key in seen:
+ continue
+ seen.add(key)
+ out.append(path)
+ return out
+
+
+def resolve_plantuml_jar(explicit: str | None = None, *, download: bool = False) -> str | None:
+ """Find a plantuml.jar: explicit path, env, bundled vendor, user cache; optionally download."""
+ for path in iter_plantuml_candidates(explicit):
+ if path.is_file() and path.stat().st_size > 1000:
+ return str(path)
+ if download:
+ dest = cached_plantuml_path()
+ if fetch_plantuml_jar(dest):
+ return str(dest)
+ return None
+
+
+def fetch_plantuml_jar(dest: Path, url: str = PLANTUML_JAR_URL) -> bool:
+ """Download official plantuml.jar to dest. Returns True on success."""
+ dest.parent.mkdir(parents=True, exist_ok=True)
+ tmp = dest.with_suffix(".jar.part")
+ try:
+ resp = requests.get(url, timeout=120, stream=True)
+ resp.raise_for_status()
+ size = 0
+ with open(tmp, "wb") as fh:
+ for chunk in resp.iter_content(chunk_size=65536):
+ if chunk:
+ fh.write(chunk)
+ size += len(chunk)
+ if size < 1000:
+ tmp.unlink(missing_ok=True)
+ return False
+ tmp.replace(dest)
+ _log.info("PlantUML jar: %s", dest)
+ return True
+ except Exception as exc:
+ _log.warning("Не удалось скачать plantuml.jar: %s", exc)
+ tmp.unlink(missing_ok=True)
+ return False
+
+
+def diagram_engine_status(explicit_jar: str | None = None) -> str:
+ """Human-readable status for the GUI."""
+ java = shutil.which("java")
+ jar = resolve_plantuml_jar(explicit_jar, download=False)
+ if java:
+ java_line = f"Java: есть ({java})"
+ else:
+ java_line = (
+ "Java: не найдена. Локальный PlantUML не запустится — "
+ "картинки пойдут через интернет (kroki.io)."
+ )
+ if jar:
+ jar_line = f"PlantUML: {jar}"
+ else:
+ jar_line = (
+ "PlantUML: файла нет. Нажмите «Скачать PlantUML» (нужна Java) "
+ "или оставьте как есть — картинки нарисует интернет (kroki.io)."
+ )
+ return java_line + "\n" + jar_line
+
+
+def _ensure_plantuml_png_scale(source: str, scale: float = DEFAULT_DIAGRAM_SCALE) -> str:
+ """Inject `scale N` into PlantUML source unless the author already set scale/dpi."""
+ if scale <= 1:
+ return source
+ if re.search(r"(?im)^\s*scale\b", source):
+ return source
+ if re.search(r"(?im)^\s*skinparam\s+dpi\b", source):
+ return source
+ lines = source.splitlines()
+ if not lines:
+ return source
+ insert_at = 0
+ if lines[0].strip().lower().startswith("@start"):
+ insert_at = 1
+ scale_line = f"scale {scale:g}"
+ lines.insert(insert_at, scale_line)
+ return "\n".join(lines) + ("\n" if source.endswith("\n") else "")
+
+
+def _is_png(data: bytes) -> bool:
+ return data.startswith(b"\x89PNG")
+
+
+def _is_svg(data: bytes) -> bool:
+ head = data.lstrip()[:200].lower()
+ return head.startswith(b"]